[FFmpeg-devel] [PATCH] Fast half-float to float conversion

Jimmy Christensen jimmy
Wed Jul 1 13:21:57 CEST 2009


On 2009-07-01 13:15, Reimar D?ffinger wrote:
> On Wed, Jul 01, 2009 at 12:52:08PM +0200, Jimmy Christensen wrote:
>> I modified for the purpose I need it for. Converting from half-float to
>> unsigned int.
>>
>> uint16_t av_halflt2uint(uint16_t v){
>>        uint16_t nosign = v+v;
>>        if (v>>15)
>>            return 0; // negatives are not interesting so clamp it to 0
>>        if (nosign>= 0xfc00)
>>            return 65535; // Anything above 1 should be clamped to 65535
>>        if (nosign<  0x0200)
>>            return ldexp((v&0x3ff), 1-25)*65535; // denormal or 0
>>        return ldexp((v&0x3ff) + (1<<10), (v>>10&0x1f)-25)*65535;
>> }
>
> Btw. a probably much faster but +-1 inaccurate version is:
> int exp = v>>  10;
> if ((v&  0x8000) || !exp)
>      return 0;
> if (exp>= 15)
>      return 0xffff;
> v<<= 6;
> return (v+(1<<16))>>  (15-exp);

Thanks. Alot faster than the table based. Gives 66fps.

I really appreciate this. I can live with the inaccuracy since it's 
rounded off to integer anyway.

Will submit the decoder soon.

-- 
Best Regards
Jimmy Christensen
Developer
Ghost A/S



More information about the ffmpeg-devel mailing list