X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Faacdec.c;h=726ea03dc42c8475d9eea36526f3ddaecee0fcc6;hb=b921b3b42b61a3dff19157bf3eec1f6f38a2cae7;hp=ee9b4eb45f44b429fceb7fa5c8e37f2a8f16870c;hpb=07502e473f0c28fdb781954d5ca1aca5f039179a;p=ffmpeg diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c index ee9b4eb45f4..726ea03dc42 100644 --- a/libavcodec/aacdec.c +++ b/libavcodec/aacdec.c @@ -42,7 +42,7 @@ #include "internal.h" #include "get_bits.h" #include "fft.h" -#include "imdct15.h" +#include "mdct15.h" #include "lpc.h" #include "kbdwin.h" #include "sinewin.h" @@ -284,29 +284,35 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx, AACContext *ac = &latmctx->aac_ctx; AVCodecContext *avctx = ac->avctx; MPEG4AudioConfig m4ac = { 0 }; + GetBitContext gbc; int config_start_bit = get_bits_count(gb); int sync_extension = 0; - int bits_consumed, esize; + int bits_consumed, esize, i; - if (asclen) { + if (asclen > 0) { sync_extension = 1; asclen = FFMIN(asclen, get_bits_left(gb)); - } else - asclen = get_bits_left(gb); - - if (config_start_bit % 8) { - avpriv_request_sample(latmctx->aac_ctx.avctx, - "Non-byte-aligned audio-specific config"); - return AVERROR_PATCHWELCOME; + init_get_bits(&gbc, gb->buffer, config_start_bit + asclen); + skip_bits_long(&gbc, config_start_bit); + } else if (asclen == 0) { + gbc = *gb; + } else { + return AVERROR_INVALIDDATA; } - if (asclen <= 0) + + if (get_bits_left(gb) <= 0) return AVERROR_INVALIDDATA; - bits_consumed = decode_audio_specific_config(NULL, avctx, &m4ac, - gb->buffer + (config_start_bit / 8), - asclen, sync_extension); - if (bits_consumed < 0) + bits_consumed = decode_audio_specific_config_gb(NULL, avctx, &m4ac, + &gbc, config_start_bit, + sync_extension); + + if (bits_consumed < config_start_bit) return AVERROR_INVALIDDATA; + bits_consumed -= config_start_bit; + + if (asclen == 0) + asclen = bits_consumed; if (!latmctx->initialized || ac->oc[1].m4ac.sample_rate != m4ac.sample_rate || @@ -319,7 +325,7 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx, } latmctx->initialized = 0; - esize = (bits_consumed+7) / 8; + esize = (asclen + 7) / 8; if (avctx->extradata_size < esize) { av_free(avctx->extradata); @@ -329,12 +335,15 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx, } avctx->extradata_size = esize; - memcpy(avctx->extradata, gb->buffer + (config_start_bit/8), esize); + gbc = *gb; + for (i = 0; i < esize; i++) { + avctx->extradata[i] = get_bits(&gbc, 8); + } memset(avctx->extradata+esize, 0, AV_INPUT_BUFFER_PADDING_SIZE); } - skip_bits_long(gb, bits_consumed); + skip_bits_long(gb, asclen); - return bits_consumed; + return 0; } static int read_stream_mux_config(struct LATMContext *latmctx, @@ -375,8 +384,6 @@ static int read_stream_mux_config(struct LATMContext *latmctx, int ascLen = latm_get_value(gb); if ((ret = latm_decode_audio_specific_config(latmctx, gb, ascLen)) < 0) return ret; - ascLen -= ret; - skip_bits_long(gb, ascLen); } latmctx->frame_length_type = get_bits(gb, 3);