From 47c699f7be16f58004061408fc4d0676cef0a3b3 Mon Sep 17 00:00:00 2001 From: Marton Balint Date: Fri, 2 Jun 2017 21:52:13 +0200 Subject: [PATCH] avformat/utils: return impaired streams in av_find_best_stream if only those exist Fixes ticket #6397. Reviewed-by: Michael Niedermayer Signed-off-by: Marton Balint --- libavformat/utils.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/libavformat/utils.c b/libavformat/utils.c index c5f1eac185..a08975ddec 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -4097,7 +4097,9 @@ int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, AVCodec **decoder_ret, int flags) { int i, nb_streams = ic->nb_streams; - int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1, best_bitrate = -1, best_multiframe = -1, count, bitrate, multiframe; + int ret = AVERROR_STREAM_NOT_FOUND; + int best_count = -1, best_bitrate = -1, best_multiframe = -1, best_disposition = -1; + int count, bitrate, multiframe, disposition; unsigned *program = NULL; const AVCodec *decoder = NULL, *best_decoder = NULL; @@ -4116,10 +4118,6 @@ int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, continue; if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb) continue; - if (wanted_stream_nb != real_stream_index && - st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | - AV_DISPOSITION_VISUAL_IMPAIRED)) - continue; if (type == AVMEDIA_TYPE_AUDIO && !(par->channels && par->sample_rate)) continue; if (decoder_ret) { @@ -4130,13 +4128,16 @@ int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, continue; } } + disposition = !(st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | AV_DISPOSITION_VISUAL_IMPAIRED)); count = st->codec_info_nb_frames; bitrate = par->bit_rate; multiframe = FFMIN(5, count); - if ((best_multiframe > multiframe) || - (best_multiframe == multiframe && best_bitrate > bitrate) || - (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count)) + if ((best_disposition > disposition) || + (best_disposition == disposition && best_multiframe > multiframe) || + (best_disposition == disposition && best_multiframe == multiframe && best_bitrate > bitrate) || + (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count)) continue; + best_disposition = disposition; best_count = count; best_bitrate = bitrate; best_multiframe = multiframe;