|
|
|
@@ -23,6 +23,7 @@ |
|
|
|
#include "libavcodec/get_bits.h" |
|
|
|
#include "libavcodec/put_bits.h" |
|
|
|
#include "libavcodec/avcodec.h" |
|
|
|
#include "libavcodec/mpeg4audio.h" |
|
|
|
#include "avformat.h" |
|
|
|
#include "adts.h" |
|
|
|
|
|
|
|
@@ -30,11 +31,17 @@ int ff_adts_decode_extradata(AVFormatContext *s, ADTSContext *adts, uint8_t *buf |
|
|
|
{ |
|
|
|
GetBitContext gb; |
|
|
|
PutBitContext pb; |
|
|
|
MPEG4AudioConfig m4ac; |
|
|
|
int off; |
|
|
|
|
|
|
|
init_get_bits(&gb, buf, size * 8); |
|
|
|
adts->objecttype = get_bits(&gb, 5) - 1; |
|
|
|
adts->sample_rate_index = get_bits(&gb, 4); |
|
|
|
adts->channel_conf = get_bits(&gb, 4); |
|
|
|
off = ff_mpeg4audio_get_config(&m4ac, buf, size); |
|
|
|
if (off < 0) |
|
|
|
return off; |
|
|
|
skip_bits_long(&gb, off); |
|
|
|
adts->objecttype = m4ac.object_type - 1; |
|
|
|
adts->sample_rate_index = m4ac.sampling_index; |
|
|
|
adts->channel_conf = m4ac.chan_config; |
|
|
|
|
|
|
|
if (adts->objecttype > 3U) { |
|
|
|
av_log(s, AV_LOG_ERROR, "MPEG-4 AOT %d is not allowed in ADTS\n", adts->objecttype+1); |
|
|
|
@@ -52,10 +59,6 @@ int ff_adts_decode_extradata(AVFormatContext *s, ADTSContext *adts, uint8_t *buf |
|
|
|
av_log(s, AV_LOG_ERROR, "Scalable configurations are not allowed in ADTS\n"); |
|
|
|
return -1; |
|
|
|
} |
|
|
|
if (get_bits(&gb, 1)) { |
|
|
|
av_log_missing_feature(s, "Signaled SBR or PS", 0); |
|
|
|
return -1; |
|
|
|
} |
|
|
|
if (!adts->channel_conf) { |
|
|
|
init_put_bits(&pb, adts->pce_data, MAX_PCE_SIZE); |
|
|
|
|
|
|
|
|