avformat/utils: Redesign scoring in av_find_default_stream_index()

This avoids empty streams from being selected if a equivalent non empty one is available
The new system is also clearer and more systematic
This may need finetuning, which should be easy to do ...

Fixes Ticket2687

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2015-07-01 22:35:07 +02:00
parent 52c5521877
commit 838c5f3df7
1 changed files with 10 additions and 10 deletions

View File

@ -1585,26 +1585,26 @@ int av_find_default_stream_index(AVFormatContext *s)
int i; int i;
AVStream *st; AVStream *st;
int best_stream = 0; int best_stream = 0;
int best_score = -1; int best_score = INT_MIN;
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; 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)) { if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
if (!st->codec->width && !st->codec->height && !st->codec_info_nb_frames) score -= 400;
if (st->codec->width && st->codec->height)
score += 50;
score+= 25; score+= 25;
else
score += 100;
} }
if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
if (!st->codec->sample_rate && !st->codec_info_nb_frames) if (st->codec->sample_rate)
score += 12;
else
score += 50; score += 50;
} }
if (st->codec_info_nb_frames)
score += 12;
if (st->discard != AVDISCARD_ALL) if (st->discard != AVDISCARD_ALL)
score += 200; score += 200;