On Tue, Sep 22, 2015 at 4:50 AM, Rodger Combs <rodger.co...@gmail.com> wrote: > --- > libavcodec/aac_ac3_parser.c | 65 > ++++++++++++++++++++++++++++++++++++++++++--- > tests/ref/fate/adts-demux | 2 +- > 2 files changed, 63 insertions(+), 4 deletions(-) > > diff --git a/libavcodec/aac_ac3_parser.c b/libavcodec/aac_ac3_parser.c > index dfa951e..a7e9278 100644 > --- a/libavcodec/aac_ac3_parser.c > +++ b/libavcodec/aac_ac3_parser.c > @@ -24,6 +24,10 @@ > #include "libavutil/common.h" > #include "parser.h" > #include "aac_ac3_parser.h" > +#include "aacadtsdec.h" > +#include "put_bits.h" > +#include "get_bits.h" > +#include "mpeg4audio.h" > > int ff_aac_ac3_parse(AVCodecParserContext *s1, > AVCodecContext *avctx, > @@ -69,9 +73,6 @@ get_next: > return buf_size; > } > > - *poutbuf = buf; > - *poutbuf_size = buf_size; > - > /* update codec info */ > if(s->codec_id) > avctx->codec_id = s->codec_id; > @@ -98,7 +99,65 @@ get_next: > } > s1->duration = s->samples; > avctx->audio_service_type = s->service_type; > + } else if (AV_RB16(buf) & 0xfff0 == 0xfff0) { > + GetBitContext gb; > + AACADTSHeaderInfo hdr; > + int pce_size = 0; > + uint8_t pce_data[MAX_PCE_SIZE]; > + init_get_bits(&gb, buf, AAC_ADTS_HEADER_SIZE * 8); > + if (avpriv_aac_parse_header(&gb, &hdr) < 0) { > + av_log(avctx, AV_LOG_ERROR, "Error parsing ADTS frame > header!\n"); > + goto skip_adts; > + } > + if (!hdr.crc_absent && hdr.num_aac_frames > 1) { > + avpriv_report_missing_feature(avctx, "Multiple RDBs per frame > with CRC"); > + goto skip_adts; > + } > + > + buf += AAC_ADTS_HEADER_SIZE + 2 * !hdr.crc_absent; > + buf_size -= AAC_ADTS_HEADER_SIZE + 2 * !hdr.crc_absent; > + > + if (!avctx->extradata) { > + PutBitContext pb; > + if (!hdr.chan_config) { > + init_get_bits(&gb, buf, buf_size * 8); > + if (get_bits(&gb, 3) != 5) { > + avpriv_report_missing_feature(avctx, > + "PCE-based channel > configuration " > + "without PCE as first > syntax " > + "element"); > + goto skip_adts; > + } > + init_put_bits(&pb, pce_data, MAX_PCE_SIZE); > + pce_size = avpriv_copy_pce_data(&pb, &gb) / 8; > + flush_put_bits(&pb); > + buf_size -= get_bits_count(&gb) / 8; > + buf += get_bits_count(&gb) / 8; > + } > + av_free(avctx->extradata); > + avctx->extradata_size = 2 + pce_size; > + avctx->extradata = av_mallocz(avctx->extradata_size + > AV_INPUT_BUFFER_PADDING_SIZE); > + if (!avctx->extradata) { > + avctx->extradata_size = 0; > + goto skip_adts; > + } > + > + init_put_bits(&pb, avctx->extradata, avctx->extradata_size); > + put_bits(&pb, 5, hdr.object_type); > + put_bits(&pb, 4, hdr.sampling_index); > + put_bits(&pb, 4, hdr.chan_config); > + put_bits(&pb, 1, 0); //frame length - 1024 samples > + put_bits(&pb, 1, 0); //does not depend on core coder > + put_bits(&pb, 1, 0); //is not extension > + flush_put_bits(&pb); > + if (pce_size) > + memcpy(avctx->extradata + 2, pce_data, pce_size); > + } > } > +skip_adts: > + > + *poutbuf = buf; > + *poutbuf_size = buf_size; > > avctx->bit_rate = s->bit_rate; >
This is not acceptable. ADTS has a bunch of advantages, for example, you can change the stream properties on the fly in a broadcast, which this would break entirely. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel