diff options
-rw-r--r-- | libavformat/adtsenc.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/libavformat/adtsenc.c b/libavformat/adtsenc.c index ecc8dc4..bab9c14 100644 --- a/libavformat/adtsenc.c +++ b/libavformat/adtsenc.c @@ -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); |