libavcodec/adts_header: add frame_length field and avpriv function to parse AAC ADTS header

These will be used by HLS demuxer in case of sample decryption.

Signed-off-by: Nachiket Tarate <nachiket.programmer@gmail.com>
Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
This commit is contained in:
Nachiket Tarate 2021-09-22 00:10:58 +05:30 committed by Steven Liu
parent 1902a60dda
commit 343c03c61c
3 changed files with 47 additions and 0 deletions

View File

@ -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;
}

View File

@ -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,18 @@ 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. After using the header
* information, the allocated memory must be freed by using av_free.
* @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 */

View File

@ -42,3 +42,34 @@ 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 (!phdr || !buf || size < AV_AAC_ADTS_HEADER_SIZE)
return AVERROR_INVALIDDATA;
*phdr = av_mallocz(sizeof(AACADTSHeaderInfo));
if (!*phdr)
return AVERROR(ENOMEM);
ret = init_get_bits8(&gb, buf, AV_AAC_ADTS_HEADER_SIZE);
if (ret < 0) {
av_freep(phdr);
return ret;
}
ret = ff_adts_header_parse(&gb, *phdr);
if (ret < 0) {
av_freep(phdr);
return ret;
}
return 0;
#else
return AVERROR(ENOSYS);
#endif
}