[FFmpeg-devel] [PATCH] AAC decoder

Robert Swain robert.swain
Sun Jun 1 22:28:27 CEST 2008


2008/4/2 Michael Niedermayer <michaelni at gmx.at>:
> On Tue, Apr 01, 2008 at 04:56:48PM +0200, Andreas ?man wrote:
>> +    }
>> +
>> +    dsputil_init(&ac->dsp, avccontext);
>> +
>> +    /* Initialize RNG dither */
>> +    av_init_random(0x1f2e3d4c, &ac->random_state);
>> +
>> +    // -1024 - compensate wrong IMDCT method
>> +    // 32768 - values in AAC build for ready float->int 16 bit audio, using
>> +    // BIAS method instead needs values -1<x<1
>> +    for (i = 0; i < 256; i++)
>> +        ac->intensity_tab[i] = pow(0.5, (i - 100) / 4.);
>> +    for (i = 0; i < sizeof(ac->ivquant_tab)/sizeof(ac->ivquant_tab[0]); i++)
>> +        ac->ivquant_tab[i] = pow(i, 4./3);
>> +
>> +    if(ac->dsp.float_to_int16 == ff_float_to_int16_c) {
>> +        ac->add_bias = 385.0f;
>> +        ac->sf_scale = 1. / (-1024. * 32768.);
>> +    } else {
>> +        ac->add_bias = 0.0f;
>> +        ac->sf_scale = 1. / -1024.;
>> +    }
>> +    for (i = 0; i < 256; i++)
>> +        ac->pow2sf_tab[i] = pow(2, (i - 100)/4.) * ac->sf_scale;
>> +
>> +    if(init_vlc(&ac->mainvlc, 7, sizeof(code)/sizeof(code[0]),
>> +            bits, sizeof(bits[0]), sizeof(bits[0]),
>> +            code, sizeof(code[0]), sizeof(code[0]),
>> +            0) < 0)
>> +        return -1;
>> +
>> +#ifdef AAC_SSR
>> +    if (ac->audioObjectType == AOT_AAC_SSR) {
>> +        ff_mdct_init(&ac->mdct, 9, 1);
>> +        ff_mdct_init(&ac->mdct_small, 6, 1);
>> +        // windows init
>> +        ff_kbd_window_init(ac->kbd_long_1024, 4.0, 256);
>> +        ff_kbd_window_init(ac->kbd_short_128, 6.0, 32);
>> +        sine_window_init(ac->sine_long_1024, 512);
>> +        sine_window_init(ac->sine_short_128, 64);
>> +        ssr_context_init(&ac->ssrctx);
>> +    } else {
>> +#endif /* AAC_SSR */
>> +        ff_mdct_init(&ac->mdct, 11, 1);
>> +        ff_mdct_init(&ac->mdct_small, 8, 1);
>> +        // windows init
>> +        ff_kbd_window_init(ac->kbd_long_1024, 4.0, 1024);
>> +        ff_kbd_window_init(ac->kbd_short_128, 6.0, 128);
>> +        sine_window_init(ac->sine_long_1024, 2048);
>> +        sine_window_init(ac->sine_short_128, 256);
>
> There are 4 different sine windows, why are they duplicated in each context?
> They should be in static arrays generated at runtime or static const tables
> hardcoded depening on ENABLE_HARDCODED_TABLES. This applies likely to other
> tables as well.

One could do the same for the tables of Kaiser-Bessel Derived window
coefficients as well. I have done this for the 'main' AAC (i.e. not
the SSR case) but I'm not sure whether to put the effort into doing
the same for SSR and handling the different arrays if we are going to
rip out the SSR and LTP code anyway. What are your demands? :)

Rob



More information about the ffmpeg-devel mailing list