Commit 20ea8bf9 authored by Alex Converse's avatar Alex Converse

aac_latm: Copy whole AudioSpecificConfig when it is sized.

This preserves sync extensions.
parent 3f1a38c9
...@@ -289,17 +289,19 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx, ...@@ -289,17 +289,19 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx,
int sync_extension = 0; int sync_extension = 0;
int bits_consumed, esize, i; int bits_consumed, esize, i;
if (asclen) { if (asclen > 0) {
sync_extension = 1; sync_extension = 1;
asclen = FFMIN(asclen, get_bits_left(gb)); asclen = FFMIN(asclen, get_bits_left(gb));
} else init_get_bits(&gbc, gb->buffer, config_start_bit + asclen);
asclen = get_bits_left(gb); skip_bits_long(&gbc, config_start_bit);
} else if (asclen == 0) {
if (asclen <= 0) gbc = *gb;
} else {
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
}
init_get_bits(&gbc, gb->buffer, config_start_bit + asclen); if (get_bits_left(gb) <= 0)
skip_bits_long(&gbc, config_start_bit); return AVERROR_INVALIDDATA;
bits_consumed = decode_audio_specific_config_gb(NULL, avctx, &m4ac, bits_consumed = decode_audio_specific_config_gb(NULL, avctx, &m4ac,
&gbc, config_start_bit, &gbc, config_start_bit,
...@@ -309,6 +311,9 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx, ...@@ -309,6 +311,9 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx,
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
bits_consumed -= config_start_bit; bits_consumed -= config_start_bit;
if (asclen == 0)
asclen = bits_consumed;
if (!latmctx->initialized || if (!latmctx->initialized ||
ac->oc[1].m4ac.sample_rate != m4ac.sample_rate || ac->oc[1].m4ac.sample_rate != m4ac.sample_rate ||
ac->oc[1].m4ac.chan_config != m4ac.chan_config) { ac->oc[1].m4ac.chan_config != m4ac.chan_config) {
...@@ -320,7 +325,7 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx, ...@@ -320,7 +325,7 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx,
} }
latmctx->initialized = 0; latmctx->initialized = 0;
esize = (bits_consumed+7) / 8; esize = (asclen + 7) / 8;
if (avctx->extradata_size < esize) { if (avctx->extradata_size < esize) {
av_free(avctx->extradata); av_free(avctx->extradata);
...@@ -336,9 +341,9 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx, ...@@ -336,9 +341,9 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx,
} }
memset(avctx->extradata+esize, 0, AV_INPUT_BUFFER_PADDING_SIZE); 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, static int read_stream_mux_config(struct LATMContext *latmctx,
...@@ -379,8 +384,6 @@ static int read_stream_mux_config(struct LATMContext *latmctx, ...@@ -379,8 +384,6 @@ static int read_stream_mux_config(struct LATMContext *latmctx,
int ascLen = latm_get_value(gb); int ascLen = latm_get_value(gb);
if ((ret = latm_decode_audio_specific_config(latmctx, gb, ascLen)) < 0) if ((ret = latm_decode_audio_specific_config(latmctx, gb, ascLen)) < 0)
return ret; return ret;
ascLen -= ret;
skip_bits_long(gb, ascLen);
} }
latmctx->frame_length_type = get_bits(gb, 3); latmctx->frame_length_type = get_bits(gb, 3);
......
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