[FFmpeg-devel] Indeo3 replacement, part 2

Måns Rullgård mans
Fri Oct 2 12:49:52 CEST 2009


Michael Niedermayer <michaelni at gmx.at> writes:

> On Fri, Oct 02, 2009 at 12:56:38AM +0200, Maxim wrote:
>> M?ns Rullg?rd schrieb:
>> > Maxim <max_pole at gmx.de> writes:
>> >
>> >   
>> >> Reimar D?ffinger schrieb:
>> >>     
>> >>> On Tue, Sep 22, 2009 at 12:09:23AM +0200, Maxim wrote:
>> >>>   
>> >>> [...]
>> >>>       
>> >>>> /**
>> >>>>  *  Average 4/8 pixels at once without rounding using softSIMD
>> >>>>  */
>> >>>> #define AVG_32(dst, src, ref)   AV_WN32((dst), ((AV_RN32(src) + AV_RN32(ref)) >> 1) & 0x7F7F7F7F)
>> >>>> #define AVG_64(dst, src, ref)   AV_WN64((dst), ((AV_RN64(src) + AV_RN64(ref)) >> 1) & 0x7F7F7F7F7F7F7F7F)
>> >>>>     
>> >>>>         
>> >>> Are all of src, dst, ref unaligned in general? If not, you should be
>> >>> using casts instead of AV_RN*
>> >>>   
>> >>>       
>> >> Could someone skilled in the art explain me the difference between a
>> >> cast and an AV_RNxx?
>> >> I don't see any because the AV_RNxx macros use casts as well...
>> >>     
>> >
>> > AV_RN* support unaligned reads, simple casts do not.
>> >
>> >   
>> >> The code above looks more readable for me when using those macros than
>> >> smth like this:
>> >>
>> >> #define AVG_64(dst, src, ref) \
>> >>         *((uint64_t *)(dst)) = ((*((uint64_t *)(src)) + *((uint64_t
>> >> *)(ref))) >> 1) & 0x7F7F7F7F7F7F7F7F
>> >>     
>> >
>> > That will not work if any of the pointers are unaligned.
>> >
>> >   
>> 
>> Thanks! All my pointers are always aligned at least on the int32_t
>> boundary. Should I rework my code to use casts all the way (remove all
>> AV_RNxx macros respectively)?
>
> if alignment is sufficient then a cast is better, int64_t needs 8 byte
> alignment though ...

Two aligned 32-bit accesses are generally at least as fast as one
unaligned 64-bit access.

-- 
M?ns Rullg?rd
mans at mansr.com



More information about the ffmpeg-devel mailing list