[FFmpeg-devel] [PATCH] AAC decoder
Robert Swain
robert.swain
Fri May 23 17:06:10 CEST 2008
2008/5/21 Robert Swain <robert.swain at gmail.com>:
> 2008/4/2 Michael Niedermayer <michaelni at gmx.at>:
>> On Tue, Apr 01, 2008 at 04:56:48PM +0200, Andreas ?man wrote:
>>> Andreas ?man wrote:
>
> [...]
>
>>> +/**
>>> + * Decode scale_factor_data
>>> + * reference: Table 4.47
>>> + */
>>> +static int scale_factor_data(AACContext * ac, GetBitContext * gb, float mix_gain, unsigned int global_gain, ics_struct * ics, const int cb[][64], float sf[][64]) {
>>
>> Maybe rename the function to what the comment says
>>
>>
>>> + int g, i;
>>> + unsigned int intensity = 100; // normalization for intensity_tab lookup table
>>> + int noise = global_gain - 90;
>>> + int noise_flag = 1;
>>> + ics->intensity_present = 0;
>>> + for (g = 0; g < ics->num_window_groups; g++) {
>>> + for (i = 0; i < ics->max_sfb; i++) {
>>> + if (cb[g][i] == ZERO_HCB) {
>>> + sf[g][i] = 0.;
>>
>>> + } else if (cb[g][i] == INTENSITY_HCB || cb[g][i] == INTENSITY_HCB2) {
>>> + ics->intensity_present = 1;
>>> + intensity += get_vlc2(gb, ac->mainvlc.table, 7, 3) - 60;
>>> + if(intensity > 255) {
>>> + av_log(ac->avccontext, AV_LOG_ERROR,
>>> + "Intensity (%d) out of range", intensity);
>>> + return -1;
>>> + }
>>> + sf[g][i] = ac->intensity_tab[intensity];
>>> + } else if (cb[g][i] == NOISE_HCB) {
>>> + if (noise_flag) {
>>> + noise_flag = 0;
>>> + noise += get_bits(gb, 9) - 256;
>>> + } else {
>>> + noise += get_vlc2(gb, ac->mainvlc.table, 7, 3) - 60;
>>> + }
>>> + sf[g][i] = pow(2.0, 0.25 * noise) * ac->sf_scale;
>>> + } else {
>>> + global_gain += get_vlc2(gb, ac->mainvlc.table, 7, 3) - 60;
>>> + if(global_gain > 255) {
>>> + av_log(ac->avccontext, AV_LOG_ERROR,
>>> + "Global gain (%d) out of range", global_gain);
>>> + return -1;
>>> + }
>>> + sf[g][i] = ac->pow2sf_tab[global_gain];
>>> + }
>>
>> The identical code is implemented here 3 times, 2 times with seperate
>> LUTs and once by directly calling pow()
>> The differenes look like bugs. like forgetting to check validity or
>> performing the scaling needed for the float2int16 transform.
>>
>> if(cb[g][i] == NOISE_HCB && noise_flag-- > 0)
>> gain[index] += get_bits(gb, 9) - 256;
>> else
>> gain[index] += get_vlc2(gb, ac->mainvlc.table, 7, 3) - 60;
>> if(gain[index] > 255)
>> ...
>> sf[g][i] = ac->pow2sf_tab[gain[index]];
>
> I tried this and audibly it sounds fine on a few files I tested. I
> want to compare the two tables and pow() * ac->sf_scale call before
> submitting a patch though.
The intensity case is different to the noise and global cases. See
attached patch.
Rob
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 20080523-1439-simplify_decode_scale_factor_data.diff
Type: text/x-diff
Size: 2962 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20080523/faaa5546/attachment.diff>
More information about the ffmpeg-devel
mailing list