Message ID | 20210716171854.5409-1-nachiket.programmer@gmail.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel,1/4] libavcodec/adts_header: add frame_length field and avpriv function to parse AAC ADTS header | expand |
Context | Check | Description |
---|---|---|
andriy/x86_make | success | Make finished |
andriy/x86_make_fate | success | Make fate finished |
andriy/PPC64_make | success | Make finished |
andriy/PPC64_make_fate | success | Make fate finished |
> 2021年7月17日 上午1:18,Nachiket Tarate <nachiket.programmer@gmail.com> 写道: > > These will be used by HLS demuxer in case of sample decryption. > > Signed-off-by: Nachiket Tarate <nachiket.programmer@gmail.com> > --- > libavcodec/adts_header.c | 1 + > libavcodec/adts_header.h | 14 ++++++++++++++ > libavcodec/adts_parser.c | 28 ++++++++++++++++++++++++++++ > 3 files changed, 43 insertions(+) > > diff --git a/libavcodec/adts_header.c b/libavcodec/adts_header.c > index 0889820f8a..e4454529c4 100644 > --- a/libavcodec/adts_header.c > +++ b/libavcodec/adts_header.c > @@ -66,6 +66,7 @@ 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; > } > diff --git a/libavcodec/adts_header.h b/libavcodec/adts_header.h > index f615f6a9f9..9ecd67fb5b 100644 > --- a/libavcodec/adts_header.h > +++ b/libavcodec/adts_header.h > @@ -34,6 +34,7 @@ typedef struct AACADTSHeaderInfo { > uint8_t sampling_index; > uint8_t chan_config; > uint8_t num_aac_frames; > + uint32_t frame_length; > } AACADTSHeaderInfo; > > /** > @@ -47,4 +48,17 @@ typedef struct AACADTSHeaderInfo { > */ > int ff_adts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr); > > +/** > + * Parse the ADTS frame header contained in the buffer, which is > + * the first 54 bits. > + * @param[in] buf Pointer to buffer containing the first 54 bits of the frame. > + * @param[in] size Size of buffer containing the first 54 bits of the frame. > + * @param[out] phdr Pointer to pointer to struct AACADTSHeaderInfo for which > + * memory is allocated and header info is written into it. > + * @return Returns 0 on success, -1 if there is a sync word mismatch, > + * -2 if the version element is invalid, -3 if the sample rate > + * element is invalid, or -4 if the bit rate element is invalid. > + */ > +int avpriv_adts_header_parse(AACADTSHeaderInfo **phdr, const uint8_t *buf, size_t size); > + > #endif /* AVCODEC_ADTS_HEADER_H */ > diff --git a/libavcodec/adts_parser.c b/libavcodec/adts_parser.c > index 5c9f8ff6f2..7df714e227 100644 > --- a/libavcodec/adts_parser.c > +++ b/libavcodec/adts_parser.c > @@ -42,3 +42,31 @@ int av_adts_header_parse(const uint8_t *buf, uint32_t *samples, uint8_t *frames) > return AVERROR(ENOSYS); > #endif > } > + > +int avpriv_adts_header_parse(AACADTSHeaderInfo **phdr, const uint8_t *buf, size_t size) > +{ > +#if CONFIG_ADTS_HEADER > + int ret = 0; > + GetBitContext gb; > + > + if (size < AV_AAC_ADTS_HEADER_SIZE) > + return AVERROR_INVALIDDATA; > + > + if (!*phdr) > + *phdr = av_mallocz(sizeof(AACADTSHeaderInfo)); > + if (!*phdr) > + return AVERROR(ENOMEM); > + > + ret = init_get_bits8(&gb, buf, AV_AAC_ADTS_HEADER_SIZE); > + if (ret < 0) > + return ret; > + > + ret = ff_adts_header_parse(&gb, *phdr); > + if (ret < 0) > + return ret; > + > + return 0; > +#else > + return AVERROR(ENOSYS); > +#endif > +} > -- > 2.17.1 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". > Patchset lgtm Thanks Steven Liu
diff --git a/libavcodec/adts_header.c b/libavcodec/adts_header.c index 0889820f8a..e4454529c4 100644 --- a/libavcodec/adts_header.c +++ b/libavcodec/adts_header.c @@ -66,6 +66,7 @@ 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; } diff --git a/libavcodec/adts_header.h b/libavcodec/adts_header.h index f615f6a9f9..9ecd67fb5b 100644 --- a/libavcodec/adts_header.h +++ b/libavcodec/adts_header.h @@ -34,6 +34,7 @@ typedef struct AACADTSHeaderInfo { uint8_t sampling_index; uint8_t chan_config; uint8_t num_aac_frames; + uint32_t frame_length; } AACADTSHeaderInfo; /** @@ -47,4 +48,17 @@ typedef struct AACADTSHeaderInfo { */ int ff_adts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr); +/** + * Parse the ADTS frame header contained in the buffer, which is + * the first 54 bits. + * @param[in] buf Pointer to buffer containing the first 54 bits of the frame. + * @param[in] size Size of buffer containing the first 54 bits of the frame. + * @param[out] phdr Pointer to pointer to struct AACADTSHeaderInfo for which + * memory is allocated and header info is written into it. + * @return Returns 0 on success, -1 if there is a sync word mismatch, + * -2 if the version element is invalid, -3 if the sample rate + * element is invalid, or -4 if the bit rate element is invalid. + */ +int avpriv_adts_header_parse(AACADTSHeaderInfo **phdr, const uint8_t *buf, size_t size); + #endif /* AVCODEC_ADTS_HEADER_H */ diff --git a/libavcodec/adts_parser.c b/libavcodec/adts_parser.c index 5c9f8ff6f2..7df714e227 100644 --- a/libavcodec/adts_parser.c +++ b/libavcodec/adts_parser.c @@ -42,3 +42,31 @@ int av_adts_header_parse(const uint8_t *buf, uint32_t *samples, uint8_t *frames) return AVERROR(ENOSYS); #endif } + +int avpriv_adts_header_parse(AACADTSHeaderInfo **phdr, const uint8_t *buf, size_t size) +{ +#if CONFIG_ADTS_HEADER + int ret = 0; + GetBitContext gb; + + if (size < AV_AAC_ADTS_HEADER_SIZE) + return AVERROR_INVALIDDATA; + + if (!*phdr) + *phdr = av_mallocz(sizeof(AACADTSHeaderInfo)); + if (!*phdr) + return AVERROR(ENOMEM); + + ret = init_get_bits8(&gb, buf, AV_AAC_ADTS_HEADER_SIZE); + if (ret < 0) + return ret; + + ret = ff_adts_header_parse(&gb, *phdr); + if (ret < 0) + return ret; + + return 0; +#else + return AVERROR(ENOSYS); +#endif +}
These will be used by HLS demuxer in case of sample decryption. Signed-off-by: Nachiket Tarate <nachiket.programmer@gmail.com> --- libavcodec/adts_header.c | 1 + libavcodec/adts_header.h | 14 ++++++++++++++ libavcodec/adts_parser.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+)