Message ID | SG2PR01MB26938B7FA0CA32D2C0DB5411F20D0@SG2PR01MB2693.apcprd01.prod.exchangelabs.com |
---|---|
State | Superseded |
Headers | show |
Series | [FFmpeg-devel] libavcodec/adts_header: add frame_length field and avpriv function to parse AAC ADTS header | expand |
Context | Check | Description |
---|---|---|
andriy/default | pending | |
andriy/make | success | Make finished |
andriy/make_fate | success | Make fate finished |
On 10/6/2020 11:30 AM, Nachiket Tarate wrote: > These will be used by HLS demuxer for SAMPLE-AES decryption. > > Signed-off-by: Nachiket Tarate <nachiket.tarate@outlook.com> > --- > libavcodec/adts_header.c | 18 ++++++++++++++++++ > libavcodec/adts_header.h | 4 ++++ > 2 files changed, 22 insertions(+) > > diff --git a/libavcodec/adts_header.c b/libavcodec/adts_header.c > index 0889820f8a..006455b110 100644 > --- a/libavcodec/adts_header.c > +++ b/libavcodec/adts_header.c > @@ -3,6 +3,7 @@ > * Copyright (c) 2003 Fabrice Bellard > * Copyright (c) 2003 Michael Niedermayer > * Copyright (c) 2009 Alex Converse > + * Copyright (c) 2020 Nachiket Tarate > * > * This file is part of FFmpeg. > * > @@ -66,6 +67,23 @@ int ff_adts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr) > hdr->sample_rate = avpriv_mpeg4audio_sample_rates[sr]; > hdr->samples = (rdb + 1) * 1024; > hdr->bit_rate = size * 8 * hdr->sample_rate / hdr->samples; > + hdr->frame_length = size; > > return size; > } > + > +int avpriv_adts_header_parse (AACADTSHeaderInfo *hdr, const uint8_t *buf, size_t size) You're making sizeof(AACADTSHeaderInfo) part of the ABI this way, which is not desirable. If you look at avpriv_ac3_parse_header(), it takes a pointer to pointer to AC3HeaderInfo, and allocates it if needed. Also, you should instead add this function to adts_parser.c and make it return AVERROR(ENOSYS) when CONFIG_ADTS_HEADER is 0. This is done so the symbol is always present even when the functionality is not. I assume you're adding this function because you need AACADTSHeaderInfo fields that av_adts_header_parse() alone does not provide, like frame_length? > +{ > + int ret = 0; > + GetBitContext gb; > + if (size < AV_AAC_ADTS_HEADER_SIZE) > + return AVERROR_INVALIDDATA; > + ret = init_get_bits8(&gb, buf, AV_AAC_ADTS_HEADER_SIZE); > + if (ret < 0) > + return ret; > + ret = ff_adts_header_parse(&gb, hdr); > + if (ret < 0) > + return ret; > + return 0; > +} > + > diff --git a/libavcodec/adts_header.h b/libavcodec/adts_header.h > index f615f6a9f9..d33bd61818 100644 > --- a/libavcodec/adts_header.h > +++ b/libavcodec/adts_header.h > @@ -2,6 +2,7 @@ > * AAC ADTS header decoding prototypes and structures > * Copyright (c) 2003 Fabrice Bellard > * Copyright (c) 2003 Michael Niedermayer > + * Copyright (c) 2020 Nachiket Tarate > * > * This file is part of FFmpeg. > * > @@ -34,6 +35,7 @@ typedef struct AACADTSHeaderInfo { > uint8_t sampling_index; > uint8_t chan_config; > uint8_t num_aac_frames; > + uint32_t frame_length; > } AACADTSHeaderInfo; > > /** > @@ -47,4 +49,6 @@ typedef struct AACADTSHeaderInfo { > */ > int ff_adts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr); > > +int avpriv_adts_header_parse (AACADTSHeaderInfo *hdr, const uint8_t *buf, size_t size); > + > #endif /* AVCODEC_ADTS_HEADER_H */ >
diff --git a/libavcodec/adts_header.c b/libavcodec/adts_header.c index 0889820f8a..006455b110 100644 --- a/libavcodec/adts_header.c +++ b/libavcodec/adts_header.c @@ -3,6 +3,7 @@ * Copyright (c) 2003 Fabrice Bellard * Copyright (c) 2003 Michael Niedermayer * Copyright (c) 2009 Alex Converse + * Copyright (c) 2020 Nachiket Tarate * * This file is part of FFmpeg. * @@ -66,6 +67,23 @@ int ff_adts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr) hdr->sample_rate = avpriv_mpeg4audio_sample_rates[sr]; hdr->samples = (rdb + 1) * 1024; hdr->bit_rate = size * 8 * hdr->sample_rate / hdr->samples; + hdr->frame_length = size; return size; } + +int avpriv_adts_header_parse (AACADTSHeaderInfo *hdr, const uint8_t *buf, size_t size) +{ + int ret = 0; + GetBitContext gb; + if (size < AV_AAC_ADTS_HEADER_SIZE) + return AVERROR_INVALIDDATA; + ret = init_get_bits8(&gb, buf, AV_AAC_ADTS_HEADER_SIZE); + if (ret < 0) + return ret; + ret = ff_adts_header_parse(&gb, hdr); + if (ret < 0) + return ret; + return 0; +} + diff --git a/libavcodec/adts_header.h b/libavcodec/adts_header.h index f615f6a9f9..d33bd61818 100644 --- a/libavcodec/adts_header.h +++ b/libavcodec/adts_header.h @@ -2,6 +2,7 @@ * AAC ADTS header decoding prototypes and structures * Copyright (c) 2003 Fabrice Bellard * Copyright (c) 2003 Michael Niedermayer + * Copyright (c) 2020 Nachiket Tarate * * This file is part of FFmpeg. * @@ -34,6 +35,7 @@ typedef struct AACADTSHeaderInfo { uint8_t sampling_index; uint8_t chan_config; uint8_t num_aac_frames; + uint32_t frame_length; } AACADTSHeaderInfo; /** @@ -47,4 +49,6 @@ typedef struct AACADTSHeaderInfo { */ int ff_adts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr); +int avpriv_adts_header_parse (AACADTSHeaderInfo *hdr, const uint8_t *buf, size_t size); + #endif /* AVCODEC_ADTS_HEADER_H */
These will be used by HLS demuxer for SAMPLE-AES decryption. Signed-off-by: Nachiket Tarate <nachiket.tarate@outlook.com> --- libavcodec/adts_header.c | 18 ++++++++++++++++++ libavcodec/adts_header.h | 4 ++++ 2 files changed, 22 insertions(+)