aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2012-11-18 13:19:14 +0100
committerMichael Niedermayer <michaelni@gmx.at>2012-11-18 13:57:08 +0100
commit4bee03034bf4f244055e69f602358fcf7bc9946d (patch)
tree8eeb07bbdf9d5626f0aeda41b9300cb677ff781e
parent05001dd7ca398f495f35e1b4ef7282d2b1dfdaf0 (diff)
downloadffmpeg-4bee03034bf4f244055e69f602358fcf7bc9946d.tar.gz
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 <cus@passwd.hu> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavformat/utils.c13
1 files 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) {