From 4bee03034bf4f244055e69f602358fcf7bc9946d Mon Sep 17 00:00:00 2001 From: Marton Balint Date: Sun, 18 Nov 2012 13:19:14 +0100 Subject: [PATCH] lavf: let av_find_best_stream use bitrate info if available I guess the user expects to see the stream with the highest bitrate, not with the most frames, this is especially useful for multi bitrate streams. This patch changes av_find_best_stream to select the stream based on a number of conditions, the first condition has the highest priority, the last condition has the lowest: 1) Select the stream with the highest FFMIN(5, codec_info_nb_frames) value 2) Select the stream with the highest bitrate 3) Select the stream with the highest codec_info_nb_frames 4) Select the first stream Signed-off-by: Marton Balint Signed-off-by: Michael Niedermayer --- libavformat/utils.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/libavformat/utils.c b/libavformat/utils.c index 4072ac8a8e..af1f323576 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2949,7 +2949,7 @@ int av_find_best_stream(AVFormatContext *ic, int flags) { int i, nb_streams = ic->nb_streams; - int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1; + int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1, best_bitrate = -1, best_multiframe = -1, count, bitrate, multiframe; unsigned *program = NULL; AVCodec *decoder = NULL, *best_decoder = NULL; @@ -2978,9 +2978,16 @@ int av_find_best_stream(AVFormatContext *ic, continue; } } - if (best_count >= st->codec_info_nb_frames) + count = st->codec_info_nb_frames; + bitrate = avctx->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)) continue; - best_count = st->codec_info_nb_frames; + best_count = count; + best_bitrate = bitrate; + best_multiframe = multiframe; ret = real_stream_index; best_decoder = decoder; if (program && i == nb_streams - 1 && ret < 0) { -- 2.11.0