Mercurial > libavcodec.hg
diff aac.c @ 7580:c49ab52db74c libavcodec
Synchronise AAC decoder code with that from SoC
author | superdump |
---|---|
date | Fri, 15 Aug 2008 00:19:14 +0000 |
parents | a05954c505ab |
children | 6fdffa4836a7 |
line wrap: on
line diff
--- a/aac.c Fri Aug 15 00:14:07 2008 +0000 +++ b/aac.c Fri Aug 15 00:19:14 2008 +0000 @@ -91,7 +91,6 @@ #include <string.h> #ifndef CONFIG_HARDCODED_TABLES - static float ff_aac_ivquant_tab[IVQUANT_SIZE]; static float ff_aac_pow2sf_tab[316]; #endif /* CONFIG_HARDCODED_TABLES */ @@ -403,8 +402,6 @@ } #ifndef CONFIG_HARDCODED_TABLES - for (i = 1 - IVQUANT_SIZE/2; i < IVQUANT_SIZE/2; i++) - ff_aac_ivquant_tab[i + IVQUANT_SIZE/2 - 1] = cbrt(fabs(i)) * i; for (i = 0; i < 316; i++) ff_aac_pow2sf_tab[i] = pow(2, (i - 200)/4.); #endif /* CONFIG_HARDCODED_TABLES */ @@ -469,19 +466,6 @@ } /** - * inverse quantization - * - * @param a quantized value to be dequantized - * @return Returns dequantized value. - */ -static inline float ivquant(int a) { - if (a + (unsigned int)IVQUANT_SIZE/2 - 1 < (unsigned int)IVQUANT_SIZE - 1) - return ff_aac_ivquant_tab[a + IVQUANT_SIZE/2 - 1]; - else - return cbrtf(fabsf(a)) * a; -} - -/** * Decode band types (section_data payload); reference: table 4.46. * * @param band_type array of the used band type @@ -535,7 +519,6 @@ int offset[3] = { global_gain, global_gain - 90, 100 }; int noise_flag = 1; static const char *sf_str[3] = { "Global gain", "Noise gain", "Intensity stereo position" }; - ics->intensity_present = 0; for (g = 0; g < ics->num_window_groups; g++) { for (i = 0; i < ics->max_sfb;) { int run_end = band_type_run_end[idx]; @@ -543,7 +526,6 @@ for(; i < run_end; i++, idx++) sf[idx] = 0.; }else if((band_type[idx] == INTENSITY_BT) || (band_type[idx] == INTENSITY_BT2)) { - ics->intensity_present = 1; for(; i < run_end; i++, idx++) { offset[2] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60; if(offset[2] > 255U) { @@ -585,13 +567,14 @@ /** * Decode pulse data; reference: table 4.7. */ -static void decode_pulses(Pulse * pulse, GetBitContext * gb) { +static void decode_pulses(Pulse * pulse, GetBitContext * gb, const uint16_t * swb_offset) { int i; pulse->num_pulse = get_bits(gb, 2) + 1; - pulse->start = get_bits(gb, 6); - for (i = 0; i < pulse->num_pulse; i++) { - pulse->offset[i] = get_bits(gb, 5); - pulse->amp [i] = get_bits(gb, 4); + pulse->pos[0] = get_bits(gb, 5) + swb_offset[get_bits(gb, 6)]; + pulse->amp[0] = get_bits(gb, 4); + for (i = 1; i < pulse->num_pulse; i++) { + pulse->pos[i] = get_bits(gb, 5) + pulse->pos[i-1]; + pulse->amp[i] = get_bits(gb, 4); } } @@ -614,22 +597,6 @@ } /** - * Add pulses with particular amplitudes to the quantized spectral data; reference: 4.6.3.3. - * - * @param pulse pointer to pulse data struct - * @param icoef array of quantized spectral data - */ -static void add_pulses(int icoef[1024], const Pulse * pulse, const IndividualChannelStream * ics) { - int i, off = ics->swb_offset[pulse->start]; - for (i = 0; i < pulse->num_pulse; i++) { - int ic; - off += pulse->offset[i]; - ic = (icoef[off] - 1)>>31; - icoef[off] += (pulse->amp[i]^ic) - ic; - } -} - -/** * Decode an individual_channel_stream payload; reference: table 4.44. * * @param common_window Channels have independent [0], or shared [1], Individual Channel Stream information. @@ -638,18 +605,16 @@ * @return Returns error status. 0 - OK, !0 - error */ static int decode_ics(AACContext * ac, SingleChannelElement * sce, GetBitContext * gb, int common_window, int scale_flag) { - int icoeffs[1024]; Pulse pulse; TemporalNoiseShaping * tns = &sce->tns; IndividualChannelStream * ics = &sce->ics; float * out = sce->coeffs; int global_gain, pulse_present = 0; - /* These two assignments are to silence some GCC warnings about the - * variables being used uninitialised when in fact they always are. + /* This assignment is to silence a GCC warning about the variable being used + * uninitialized when in fact it always is. */ pulse.num_pulse = 0; - pulse.start = 0; global_gain = get_bits(gb, 8); @@ -670,7 +635,7 @@ av_log(ac->avccontext, AV_LOG_ERROR, "Pulse tool not allowed in eight short sequence.\n"); return -1; } - decode_pulses(&pulse, gb); + decode_pulses(&pulse, gb, ics->swb_offset); } if ((tns->present = get_bits1(gb)) && decode_tns(ac, tns, gb, ics)) return -1; @@ -680,11 +645,8 @@ } } - if (decode_spectrum(ac, icoeffs, gb, ics, sce->band_type) < 0) + if (decode_spectrum_and_dequant(ac, out, gb, sce->sf, pulse_present, &pulse, ics, sce->band_type) < 0) return -1; - if (pulse_present) - add_pulses(icoeffs, &pulse, ics); - dequant(ac, out, icoeffs, sce->sf, ics, sce->band_type); return 0; } @@ -722,8 +684,7 @@ if (common_window && ms_present) apply_mid_side_stereo(cpe); - if (cpe->ch[1].ics.intensity_present) - apply_intensity_stereo(cpe, ms_present); + apply_intensity_stereo(cpe, ms_present); return 0; } @@ -906,10 +867,10 @@ float * in = sce->coeffs; float * out = sce->ret; float * saved = sce->saved; - const float * lwindow = ics->use_kb_window[0] ? ff_aac_kbd_long_1024 : ff_aac_sine_long_1024; - const float * swindow = ics->use_kb_window[0] ? ff_aac_kbd_short_128 : ff_aac_sine_short_128; - const float * lwindow_prev = ics->use_kb_window[1] ? ff_aac_kbd_long_1024 : ff_aac_sine_long_1024; - const float * swindow_prev = ics->use_kb_window[1] ? ff_aac_kbd_short_128 : ff_aac_sine_short_128; + const float * lwindow = ics->use_kb_window[0] ? ff_aac_kbd_long_1024 : ff_sine_1024; + const float * swindow = ics->use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128; + const float * lwindow_prev = ics->use_kb_window[1] ? ff_aac_kbd_long_1024 : ff_sine_1024; + const float * swindow_prev = ics->use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128; float * buf = ac->buf_mdct; int i; @@ -1093,7 +1054,7 @@ if (!ac->is_saved) { ac->is_saved = 1; *data_size = 0; - return 0; + return buf_size; } data_size_tmp = 1024 * avccontext->channels * sizeof(int16_t);