mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +02:00
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:
parent
1902a60dda
commit
343c03c61c
@ -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;
|
||||
}
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user