[FFmpeg-devel] ff_idct_xvid_sse2-cannot-be-inline.patch

Måns Rullgård mans
Tue Mar 9 03:22:10 CET 2010


Alexander Strange <astrange at ithinksw.com> writes:

> On Mar 8, 2010, at 8:41 PM, Pavel Pavlov wrote:
>
>>>>> On Mon, Mar 08, 2010 at 06:43:11PM -0500, Pavel Pavlov wrote:
>>>>>>>> The function ff_idct_xvid_sse2 simply cannot be static because
>>>>>>>> it's
>>>>>>> referenced inside dsputil_mmx.c:
>>>>>>>>  c->idct    = ff_idct_xvid_sse2;
>>>>>>>> I have no idea how gcc could compile/link this kind of code.
>>>>>>>> There should have been a link error at least
>>>>>>>> <ff_idct_xvid_sse2-cannot-be-inline.patch>
>>>>>>> 
>>>>>>> It's C99 inline. C99 doesn't make inline functions static if
>>>>>>> there's a prototype, and there is one.
>>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> I don't know why I wrote static, if it's actually inline :)
>>>>>> Anyways, I'm getting a link error and I have to remove inline
>>>>>> to fix it.
>>>>> 
>>>>> the function in question must be marked inline due to speed reasons
>>>>> 
>>>> 
>>>> In this case I think there should be
>>>> static av_inline_always void ff_idct_xvid_sse2_static(short *block){
>>>> ...
>>>> }
>>>> 
>>>> void ff_idct_xvid_sse2(short *block){
>>>>   ff_idct_xvid_sse2_static(block);
>>>> }
>>>> 
>>>> And the other two places should call ff_idct_xvid_sse2_static instead
>>> 
>>> Yes, something like that is the correct solution.  A non-static inline
>>> function should not produce an external definition.  That's what the
>>> spec says.
>>> 
>> 
>> See attached patch.
>> 
>> <ff_idct_xvid_sse2-cannot-be-inline2.patch>
>
> What happens if you add 'extern' to ff_idct_xvid_sse2 in
> libavcodec/x86/idct_xvid.h?

GCC does not adhere to C99 with non-static inline functions.  It's
better to avoid messing with that can of worms.

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



More information about the ffmpeg-devel mailing list