[FFmpeg-devel] [PATCH 3/4] lavc/aac_ac3_parser: convert ADTS AAC to ASC format
Hendrik Leppkes
h.leppkes at gmail.com
Tue Sep 22 08:06:05 CEST 2015
On Tue, Sep 22, 2015 at 4:50 AM, Rodger Combs <rodger.combs at 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.
More information about the ffmpeg-devel
mailing list