From 7cb24ecd4c41d3e31dd5d5f56e0f5bfa081ac5a7 Mon Sep 17 00:00:00 2001 From: Alexander Kojevnikov Date: Tue, 26 Feb 2013 21:47:11 -0800 Subject: mp3dec: Fix VBR bit rate parsing When parsing the Xing/Info tag, don't set the bit rate if it's an Info tag. When parsing the stream, don't override the bit rate if it's already set, otherwise calculate the mean bit rate from parsed frames. This way, the bit rate will be set correctly both for CBR and VBR streams. Signed-off-by: Alexander Kojevnikov Signed-off-by: Michael Niedermayer (cherry picked from commit 29d8cd265a536063420afe78375b2176a9e1abc5) Conflicts: tests/ref/lavf-fate/mp3 Signed-off-by: Michael Niedermayer --- libavcodec/mpegaudio_parser.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/mpegaudio_parser.c b/libavcodec/mpegaudio_parser.c index 6ceca83e04..83dbca0e04 100644 --- a/libavcodec/mpegaudio_parser.c +++ b/libavcodec/mpegaudio_parser.c @@ -29,6 +29,7 @@ typedef struct MpegAudioParseContext { int frame_size; uint32_t header; int header_count; + int no_bitrate; } MpegAudioParseContext; #define MPA_HEADER_SIZE 4 @@ -73,15 +74,18 @@ static int mpegaudio_parse(AVCodecParserContext *s1, if((state&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header) s->header_count= -3; s->header= state; - s->header_count++; s->frame_size = ret-4; - if (s->header_count > 1) { + if (s->header_count > 0) { avctx->sample_rate= sr; avctx->channels = channels; s1->duration = frame_size; - avctx->bit_rate = bit_rate; + if (s->no_bitrate || !avctx->bit_rate) { + s->no_bitrate = 1; + avctx->bit_rate += (bit_rate - avctx->bit_rate) / s->header_count; + } } + s->header_count++; break; } } -- cgit v1.2.3