avcodec/mpegaudio_parser: fix off by 1 error in bitrate calculation

Fixes Ticket3918

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit 817663897e)
This commit is contained in:
Michael Niedermayer 2014-11-06 00:04:51 +01:00 committed by Carl Eugen Hoyos
parent 9798dc8061
commit c7b64a904a
1 changed files with 3 additions and 2 deletions

View File

@ -73,20 +73,21 @@ static int mpegaudio_parse(AVCodecParserContext *s1,
if (i > 4) if (i > 4)
s->header_count = -2; s->header_count = -2;
} else { } else {
int header_threshold = avctx->codec_id != AV_CODEC_ID_NONE && avctx->codec_id != codec_id;
if((state&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header) if((state&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header)
s->header_count= -3; s->header_count= -3;
s->header= state; s->header= state;
s->header_count++; s->header_count++;
s->frame_size = ret-4; s->frame_size = ret-4;
if (s->header_count > 0 + (avctx->codec_id != AV_CODEC_ID_NONE && avctx->codec_id != codec_id)) { if (s->header_count > header_threshold) {
avctx->sample_rate= sr; avctx->sample_rate= sr;
avctx->channels = channels; avctx->channels = channels;
s1->duration = frame_size; s1->duration = frame_size;
avctx->codec_id = codec_id; avctx->codec_id = codec_id;
if (s->no_bitrate || !avctx->bit_rate) { if (s->no_bitrate || !avctx->bit_rate) {
s->no_bitrate = 1; s->no_bitrate = 1;
avctx->bit_rate += (bit_rate - avctx->bit_rate) / s->header_count; avctx->bit_rate += (bit_rate - avctx->bit_rate) / (s->header_count - header_threshold);
} }
} }
break; break;