Commit 4e855c11 authored by Michael Niedermayer's avatar Michael Niedermayer

avformat/util: change av_find_default_stream_index() to use a score based system

Disfavor video streams with unknown resolution and no packets
Fixes seeking in audio-only-speex.flv
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent e8c003ed
...@@ -1531,23 +1531,36 @@ static void flush_packet_queue(AVFormatContext *s) ...@@ -1531,23 +1531,36 @@ static void flush_packet_queue(AVFormatContext *s)
int av_find_default_stream_index(AVFormatContext *s) int av_find_default_stream_index(AVFormatContext *s)
{ {
int first_audio_index = -1;
int i; int i;
AVStream *st; AVStream *st;
int best_stream = 0;
int best_score = -1;
if (s->nb_streams <= 0) if (s->nb_streams <= 0)
return -1; return -1;
for (i = 0; i < s->nb_streams; i++) { for (i = 0; i < s->nb_streams; i++) {
int score = 0;
st = s->streams[i]; st = s->streams[i];
if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
!(st->disposition & AV_DISPOSITION_ATTACHED_PIC)) { !(st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
return i; if (!st->codec->width && !st->codec->height && !st->codec_info_nb_frames)
score += 25;
else
score += 100;
}
if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
if (!st->codec->sample_rate && !st->codec_info_nb_frames)
score += 12;
else
score += 50;
}
if (score > best_score) {
best_score = score;
best_stream = i;
} }
if (first_audio_index < 0 &&
st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
first_audio_index = i;
} }
return first_audio_index >= 0 ? first_audio_index : 0; return best_stream;
} }
/** Flush the frame reader. */ /** Flush the frame reader. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment