Commit d268b79e authored by Janne Grunau's avatar Janne Grunau

aac_latm: reconfigure decoder on audio specific config changes

parent fd095539
...@@ -2319,8 +2319,9 @@ static inline uint32_t latm_get_value(GetBitContext *b) ...@@ -2319,8 +2319,9 @@ static inline uint32_t latm_get_value(GetBitContext *b)
static int latm_decode_audio_specific_config(struct LATMContext *latmctx, static int latm_decode_audio_specific_config(struct LATMContext *latmctx,
GetBitContext *gb, int asclen) GetBitContext *gb, int asclen)
{ {
AVCodecContext *avctx = latmctx->aac_ctx.avctx; AACContext *ac = &latmctx->aac_ctx;
MPEG4AudioConfig m4ac; AVCodecContext *avctx = ac->avctx;
MPEG4AudioConfig m4ac = {0};
int config_start_bit = get_bits_count(gb); int config_start_bit = get_bits_count(gb);
int sync_extension = 0; int sync_extension = 0;
int bits_consumed, esize; int bits_consumed, esize;
...@@ -2335,18 +2336,23 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx, ...@@ -2335,18 +2336,23 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx,
av_log_missing_feature(latmctx->aac_ctx.avctx, "audio specific " av_log_missing_feature(latmctx->aac_ctx.avctx, "audio specific "
"config not byte aligned.\n", 1); "config not byte aligned.\n", 1);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} else { }
bits_consumed = bits_consumed = decode_audio_specific_config(NULL, avctx, &m4ac,
decode_audio_specific_config(NULL, avctx, &m4ac,
gb->buffer + (config_start_bit / 8), gb->buffer + (config_start_bit / 8),
asclen, sync_extension); asclen, sync_extension);
if (bits_consumed < 0) if (bits_consumed < 0)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
if (ac->m4ac.sample_rate != m4ac.sample_rate ||
ac->m4ac.chan_config != m4ac.chan_config) {
av_log(avctx, AV_LOG_INFO, "audio config changed\n");
latmctx->initialized = 0;
esize = (bits_consumed+7) / 8; esize = (bits_consumed+7) / 8;
if (avctx->extradata_size <= esize) { if (avctx->extradata_size < esize) {
av_free(avctx->extradata); av_free(avctx->extradata);
avctx->extradata = av_malloc(esize + FF_INPUT_BUFFER_PADDING_SIZE); avctx->extradata = av_malloc(esize + FF_INPUT_BUFFER_PADDING_SIZE);
if (!avctx->extradata) if (!avctx->extradata)
...@@ -2356,9 +2362,8 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx, ...@@ -2356,9 +2362,8 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx,
avctx->extradata_size = esize; avctx->extradata_size = esize;
memcpy(avctx->extradata, gb->buffer + (config_start_bit/8), esize); memcpy(avctx->extradata, gb->buffer + (config_start_bit/8), esize);
memset(avctx->extradata+esize, 0, FF_INPUT_BUFFER_PADDING_SIZE); memset(avctx->extradata+esize, 0, FF_INPUT_BUFFER_PADDING_SIZE);
skip_bits_long(gb, bits_consumed);
} }
skip_bits_long(gb, bits_consumed);
return bits_consumed; return bits_consumed;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment