[FFmpeg-devel] [PATCH] AAC Decoder round 4

Robert Swain robert.swain
Tue Aug 5 17:32:23 CEST 2008


2008/7/27 Michael Niedermayer <michaelni at gmx.at>:
> On Fri, Jul 18, 2008 at 03:13:38PM +0100, Robert Swain wrote:
>> + * @param   sf                  array of scalefactors or intensity stereo positions used for a window group's scalefactor band
>> + * @return  Returns error status. 0 - OK, !0 - error
>> + */
>> +static int decode_scalefactors(AACContext * ac, GetBitContext * gb, float mix_gain, unsigned int global_gain,
>> +        IndividualChannelStream * ics, const enum BandType band_type[][64], const int band_type_run_end[][64], float sf[][64]) {
>> +    const int sf_offset = ac->sf_offset + (ics->window_sequence == EIGHT_SHORT_SEQUENCE ? 12 : 0);
>> +    int g, i;
>> +    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[g][i];
>> +            if (band_type[g][i] == ZERO_BT) {
>> +                for(; i < run_end; i++)
>> +                    sf[g][i] = 0.;
>> +            }else if((band_type[g][i] == INTENSITY_BT) || (band_type[g][i] == INTENSITY_BT2)) {
>> +                ics->intensity_present = 1;
>
>> +                for(; i < run_end; i++) {
>> +                    offset[2] += get_vlc2(gb, mainvlc.table, 7, 3) - 60;
>> +                    if(offset[2] > 255) {
>> +                        av_log(ac->avccontext, AV_LOG_ERROR,
>> +                            "%s (%d) out of range.\n", sf_str[2], offset[2]);
>> +                        return -1;
>> +                    }
>> +                    sf[g][i] =  pow2sf_tab[-offset[2] + 300];
>> +                    sf[g][i] *= mix_gain;
>> +                }
>
> you are checking for a max of 255 here, cant this also overflow on the
> negative side? offset is not unsigned so <0 is not naturally caught

I found text in the spec that states the scalefactors (at least in the
normal scalefactor and noise cases) should be [0, 255]. global_gain is
8 bits unsigned read from the bitstream so the initial values of
offset[] could be < 0.

As it is, declaring offset[] as unsigned won't work. However, I think
I could make offset[] int16_t and do if(offset[] & 0xFF00) unless you
have a better suggestion. I thought that would be a fast check. I
could just do if(offset[] < 0 || offset[] > 255) if you would prefer.

Regards,
Rob




More information about the ffmpeg-devel mailing list