[FFmpeg-devel] [PATCH]Lagarith decoder.

Loren Merritt lorenm
Sat Oct 24 10:31:47 CEST 2009


On Sat, 24 Oct 2009, Michael Niedermayer wrote:
> On Thu, Oct 15, 2009 at 08:42:54PM -0600, Nathan Caldwell wrote:
>
>> +    if (l->low >= range_scaled * l->prob[255]) {
>> +        val = 255;
>> +        l->range -= range_scaled * l->prob[255];
>> +    } else {
>> +        /* val = 0 is frequent enough to deserve a shortcut */
>> +        if (l->low < range_scaled * l->prob[1]) {
>> +            val = 0;
>
> isnt 0 more common than 255? and should thus be checked before on a
> shorter code path?

Yes.

>> +            shift &= 31;
>> +            low_scaled = (low_scaled << shift) | (low_scaled >> (32 - shift));
>> +            /* low_scaled is now a lower bound of low/range_scaled */
>> +            val = l->range_hash[(uint8_t) low_scaled];
>>
>> +            while (l->low >= range_scaled * l->prob[val + 1])
>> +                val++;
>
> is there some (small) bound on the number of iterations of this?
> if so it could be replaced by a if() or 2 ...

No. Amortized cost is bounded at 1 iteration, but the max for any given 
call can be up to 254. i.e. range_hash can be very wrong, but only for 
low-probability symbols.

--Loren Merritt



More information about the ffmpeg-devel mailing list