X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Faac_ac3_parser.c;h=87911619eb3cef00be07123f0e30645a3aea8c0e;hb=4311ff776b4f887ceb526a9b611f627bbb527c80;hp=64ee767b14c89109a3ff06b3ed259cb82d95678e;hpb=e4d5a18558cd5b8d8bd034f57dd26fa58914e75f;p=ffmpeg diff --git a/libavcodec/aac_ac3_parser.c b/libavcodec/aac_ac3_parser.c index 64ee767b14c..87911619eb3 100644 --- a/libavcodec/aac_ac3_parser.c +++ b/libavcodec/aac_ac3_parser.c @@ -1,7 +1,7 @@ /* - * Common AAC and AC3 parser - * Copyright (c) 2003 Fabrice Bellard. - * Copyright (c) 2003 Michael Niedermayer. + * Common AAC and AC-3 parser + * Copyright (c) 2003 Fabrice Bellard + * Copyright (c) 2003 Michael Niedermayer * * This file is part of FFmpeg. * @@ -49,10 +49,13 @@ get_next: if(len<=0){ i=END_NOT_FOUND; }else{ + s->state=0; i-= s->header_size -1; s->remaining_size = len; - if(!new_frame_start) + if(!new_frame_start || pc->index+i<=0){ + s->remaining_size += i; goto get_next; + } } } } @@ -67,20 +70,33 @@ get_next: *poutbuf = buf; *poutbuf_size = buf_size; - /* update codec info */ - avctx->sample_rate = s->sample_rate; - /* allow downmixing to stereo (or mono for AC3) */ - if(avctx->request_channels > 0 && - avctx->request_channels < s->channels && - (avctx->request_channels <= 2 || - (avctx->request_channels == 1 && - avctx->codec_id == CODEC_ID_AC3))) { - avctx->channels = avctx->request_channels; - } else { - avctx->channels = s->channels; - } - avctx->bit_rate = s->bit_rate; - avctx->frame_size = s->samples; + /* update codec info */ + if(s->codec_id) + avctx->codec_id = s->codec_id; + + /* Due to backwards compatible HE-AAC the sample rate, channel count, + and total number of samples found in an AAC ADTS header are not + reliable. Bit rate is still accurate because the total frame duration in + seconds is still correct (as is the number of bits in the frame). */ + if (avctx->codec_id != CODEC_ID_AAC) { + avctx->sample_rate = s->sample_rate; + + /* allow downmixing to stereo (or mono for AC-3) */ + if(avctx->request_channels > 0 && + avctx->request_channels < s->channels && + (avctx->request_channels <= 2 || + (avctx->request_channels == 1 && + (avctx->codec_id == CODEC_ID_AC3 || + avctx->codec_id == CODEC_ID_EAC3)))) { + avctx->channels = avctx->request_channels; + } else { + avctx->channels = s->channels; + avctx->channel_layout = s->channel_layout; + } + avctx->frame_size = s->samples; + } + + avctx->bit_rate = s->bit_rate; return i; }