From: Michael Niedermayer <[email protected]> This fixes changing channels. It possibly might cause regressions but i cant avoid this without having a test case that needs the locking code.
Signed-off-by: Michael Niedermayer <[email protected]> --- libavcodec/aacdec.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c index a3a6b42..0be45b7 100644 --- a/libavcodec/aacdec.c +++ b/libavcodec/aacdec.c @@ -2077,7 +2077,7 @@ static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb) size = avpriv_aac_parse_header(gb, &hdr_info); if (size > 0) { - if (ac->output_configured != OC_LOCKED && hdr_info.chan_config) { + if (hdr_info.chan_config) { enum ChannelPosition new_che_pos[4][MAX_ELEM_ID]; memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0])); ac->m4ac.chan_config = hdr_info.chan_config; -- 1.7.0.2.msysgit.0 >From 5ac19e941ed9174ee0b931501377fc1e20bdad08 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer <[email protected]> Date: Fri, 23 Sep 2011 22:30:27 +0200 Subject: [PATCH 2/7] aacsbr: Add an assert checking for an inconsistency This inconsistency was noticed during debug. I dont know if this can happen normally, but if sit can, it would be quite bad. Signed-off-by: Michael Niedermayer <[email protected]> --- libavcodec/aacsbr.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/libavcodec/aacsbr.c b/libavcodec/aacsbr.c index 81b0b4c..2910395 100644 --- a/libavcodec/aacsbr.c +++ b/libavcodec/aacsbr.c @@ -33,6 +33,7 @@ #include "fft.h" #include "aacps.h" #include "libavutil/libm.h" +#include "libavutil/avassert.h" #include <stdint.h> #include <float.h> @@ -1456,6 +1457,7 @@ static void sbr_mapping(AACContext *ac, SpectralBandReplication *sbr, uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow; int k; + av_assert0(sbr->kx[1] <= table[0]); for (i = 0; i < ilim; i++) for (m = table[i]; m < table[i + 1]; m++) sbr->e_origmapped[e][m - sbr->kx[1]] = ch_data->env_facs[e+1][i]; -- 1.7.0.2.msysgit.0 >From d429e4e8d5be640df559458a276ede09fd7de81f Mon Sep 17 00:00:00 2001 From: Michael Niedermayer <[email protected]> Date: Fri, 23 Sep 2011 22:31:57 +0200 Subject: [PATCH 3/7] aacsbr: prevent multiple ff_aac_sbr_ctx_init() Signed-off-by: Michael Niedermayer <[email protected]> --- libavcodec/aacsbr.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/libavcodec/aacsbr.c b/libavcodec/aacsbr.c index 2910395..60fa701 100644 --- a/libavcodec/aacsbr.c +++ b/libavcodec/aacsbr.c @@ -130,6 +130,8 @@ av_cold void ff_aac_sbr_init(void) av_cold void ff_aac_sbr_ctx_init(AACContext *ac, SpectralBandReplication *sbr) { float mdct_scale; + if(sbr->mdct.mdct_bits) + return; sbr->kx[0] = sbr->kx[1] = 32; //Typo in spec, kx' inits to 32 sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1; sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); -- 1.7.0.2.msysgit.0 >From 1f8eb2de1571be8187f7360c45aec0da6242142e Mon Sep 17 00:00:00 2001 From: Michael Niedermayer <[email protected]> Date: Fri, 23 Sep 2011 22:34:26 +0200 Subject: [PATCH 4/7] aacdec: Make aac-latm closer to the spec Make it not read random data leading to random false configurations. Signed-off-by: Michael Niedermayer <[email protected]> --- libavcodec/aacdec.c | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c index 0be45b7..8338e25 100644 --- a/libavcodec/aacdec.c +++ b/libavcodec/aacdec.c @@ -458,7 +458,7 @@ static int decode_ga_specific_config(AACContext *ac, AVCodecContext *avctx, static int decode_audio_specific_config(AACContext *ac, AVCodecContext *avctx, MPEG4AudioConfig *m4ac, - const uint8_t *data, int data_size) + const uint8_t *data, int data_size, int asclen) { GetBitContext gb; int i; @@ -470,7 +470,7 @@ static int decode_audio_specific_config(AACContext *ac, init_get_bits(&gb, data, data_size * 8); - if ((i = avpriv_mpeg4audio_get_config(m4ac, data, data_size)) < 0) + if ((i = avpriv_mpeg4audio_get_config(m4ac, data, asclen/8)) < 0) return -1; if (m4ac->sampling_index > 12) { av_log(avctx, AV_LOG_ERROR, "invalid sampling rate index %d\n", m4ac->sampling_index); @@ -570,7 +570,7 @@ static av_cold int aac_decode_init(AVCodecContext *avctx) if (avctx->extradata_size > 0) { if (decode_audio_specific_config(ac, ac->avctx, &ac->m4ac, avctx->extradata, - avctx->extradata_size) < 0) + avctx->extradata_size, 8*avctx->extradata_size) < 0) return -1; } else { int sr, i; @@ -2307,7 +2307,7 @@ static inline uint32_t latm_get_value(GetBitContext *b) } static int latm_decode_audio_specific_config(struct LATMContext *latmctx, - GetBitContext *gb) + GetBitContext *gb, int asclen) { AVCodecContext *avctx = latmctx->aac_ctx.avctx; MPEG4AudioConfig m4ac; @@ -2322,7 +2322,7 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx, bits_consumed = decode_audio_specific_config(NULL, avctx, &m4ac, gb->buffer + (config_start_bit / 8), - get_bits_left(gb) / 8); + get_bits_left(gb) / 8, asclen); if (bits_consumed < 0) return AVERROR_INVALIDDATA; @@ -2380,11 +2380,11 @@ static int read_stream_mux_config(struct LATMContext *latmctx, // for all but first stream: use_same_config = get_bits(gb, 1); if (!audio_mux_version) { - if ((ret = latm_decode_audio_specific_config(latmctx, gb)) < 0) + if ((ret = latm_decode_audio_specific_config(latmctx, gb, 0)) < 0) return ret; } else { int ascLen = latm_get_value(gb); - if ((ret = latm_decode_audio_specific_config(latmctx, gb)) < 0) + if ((ret = latm_decode_audio_specific_config(latmctx, gb, ascLen)) < 0) return ret; ascLen -= ret; skip_bits_long(gb, ascLen); -- 1.7.0.2.msysgit.0 >From bd021c274a3ac1c415f224231de7d1d62336f6a0 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer <[email protected]> Date: Fri, 23 Sep 2011 22:41:10 +0200 Subject: [PATCH 5/7] aacdec: fix channel reconfigs on LATM Fixes FFmpeg ticket 200. Signed-off-by: Michael Niedermayer <[email protected]> --- libavcodec/aacdec.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c index 8338e25..41d1aaa 100644 --- a/libavcodec/aacdec.c +++ b/libavcodec/aacdec.c @@ -2311,6 +2311,7 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx, { AVCodecContext *avctx = latmctx->aac_ctx.avctx; MPEG4AudioConfig m4ac; + AACContext *ac= &latmctx->aac_ctx; int config_start_bit = get_bits_count(gb); int bits_consumed, esize; @@ -2320,12 +2321,13 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx, return AVERROR_INVALIDDATA; } else { bits_consumed = - decode_audio_specific_config(NULL, avctx, &m4ac, + decode_audio_specific_config(ac, avctx, &m4ac, gb->buffer + (config_start_bit / 8), get_bits_left(gb) / 8, asclen); if (bits_consumed < 0) return AVERROR_INVALIDDATA; + ac->m4ac= m4ac; esize = (bits_consumed+7) / 8; -- 1.7.0.2.msysgit.0 >From a7f4fa723b1101c0c5146043f8aac0b27ab10f22 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer <[email protected]> Date: Thu, 20 Oct 2011 13:54:54 +0200 Subject: [PATCH 6/7] aacdec: support chan config =1 stereo files Signed-off-by: Michael Niedermayer <[email protected]> --- libavcodec/aacdec.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c index 41d1aaa..7dfa070 100644 --- a/libavcodec/aacdec.c +++ b/libavcodec/aacdec.c @@ -2135,6 +2135,15 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data, elem_id = get_bits(gb, 4); if (elem_type < TYPE_DSE) { + if (!ac->tags_mapped && elem_type == TYPE_CPE && ac->m4ac.chan_config==1) { + enum ChannelPosition new_che_pos[4][MAX_ELEM_ID]= {0}; + ac->m4ac.chan_config=2; + + if (set_default_channel_config(ac->avctx, new_che_pos, 2)<0) + return -1; + if (output_configure(ac, ac->che_pos, new_che_pos, 2, OC_TRIAL_FRAME)<0) + return -1; + } if (!(che=get_che(ac, elem_type, elem_id))) { av_log(ac->avctx, AV_LOG_ERROR, "channel element %d.%d is not allocated\n", elem_type, elem_id); -- 1.7.0.2.msysgit.0 >From a07baa99b7dbc361796000238b3e88864049c464 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer <[email protected]> Date: Thu, 20 Oct 2011 21:57:52 +0200 Subject: [PATCH 7/7] aacdec: only overwrite configuration if theres a actual change Fixes FFmpeg ticket 574. Signed-off-by: Michael Niedermayer <[email protected]> --- libavcodec/aacdec.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c index 7dfa070..1dc19d5 100644 --- a/libavcodec/aacdec.c +++ b/libavcodec/aacdec.c @@ -2319,8 +2319,8 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx, GetBitContext *gb, int asclen) { AVCodecContext *avctx = latmctx->aac_ctx.avctx; - MPEG4AudioConfig m4ac; AACContext *ac= &latmctx->aac_ctx; + MPEG4AudioConfig m4ac=ac->m4ac; int config_start_bit = get_bits_count(gb); int bits_consumed, esize; @@ -2336,7 +2336,8 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx, if (bits_consumed < 0) return AVERROR_INVALIDDATA; - ac->m4ac= m4ac; + if(ac->m4ac.sample_rate != m4ac.sample_rate || m4ac.chan_config != ac->m4ac.chan_config) + ac->m4ac= m4ac; esize = (bits_consumed+7) / 8; -- 1.7.0.2.msysgit.0 _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
