[FFmpeg-devel] Moving if(constant expression) to preprocessor?

Axel Holzinger aholzinger
Sat Sep 18 18:41:26 CEST 2010


M?ns Rullg?rd wrote:
> "Axel Holzinger" <aholzinger at gmx.de> writes:
> 
> > Hi M?ns and all,
> >
> > M?ns Rullg?rd wrote:
> >> "Axel Holzinger" <aholzinger at gmx.de> writes:
> >> 
> >> > Hi all,
> >> >
> >> > if compiling FFmpeg code with zero optimisations (even 
> >> > without dead code elimination) there are linker errors
> >> > (undefined references to
> >
> >> > functions or structs) that come from constructs like i.e.
> >> > the following in libavcodec/allcodecs.c:
> >> >
> >> > if(CONFIG_##X##_HWACCEL) av_register_hwaccel(&x##_hwaccel); }
> >> >
> >> > The runtime (lower case) "if" leads to an undefined reference, 
> >> > because it is evaluated at runtime and not at compile time.
> >> >
> >> > If dead code eliminitation optimisation is on, this isn't an
> >> > issue, but with optimisations completely off it is.
> >> 
> >> Don't do that then.
> >
> > Hehe, if we all would be so shy, we would still live in caves, 
> > wouldn't we :-)
> 
> This is the first time I have seen FFmpeg referred to as shy.

For everything there's a first time.

> >> > Is there interest in doing this in a way where already the 
> >> > preprocessor is solving this (instead of the optimiser)?
> >> 
> >> No.
> >
> > Ah.
> >
> >> > Then I would try and find a solution based on preprocessor
magic.
> >> 
> >> That is not easily possible.
> >
> > Says who ;-)
> 
> Says I.

And that has to suffice?

> > You could leave this up to me or others.
> >
> > It is possible to write a macro that does the trick and in 
> > the end the above line would for example look like this:
> >
> > AV_COND_IF(CONFIG_##X##_HWACCEL, 
> (av_register_hwaccel(&x##_hwaccel)),)
> 
> How would AV_COND_IF be defined?

Do you know boost?

They have a really nice preprocessor library. I got inspired by their
BOOST_PP_IF macro.

It's more generic as it would be needed here. So reduced to what's
needed it could look like this (compiler specific #fdefs removed for
clarity):

# define ICL_PP_IF(cond, t, f) ICL_PP_IF_I(cond, t, f)
# define ICL_PP_IF_I(cond, t, f) ICL_PP_IIF(ICL_PP_BOOL(cond), t, f)

#else

#define AV_COND_IF(bit, t, f) AV_COND_IF_OO((bit, t, f))
#define AV_COND_IF_OO(par) AV_COND_IF_I ## par
#define AV_COND_IF_I(bit, t, f) AV_COND_IF_I(AV_COND_IIF_ ## bit(t,
f))
#define AV_COND_IF_I(id) id
#define AV_COND_IF_0(t, f) f
#define AV_COND_IF_1(t, f) t

Isn't that sexy?

> > Wouldn't that still be fine? And it could be done with a 
> > few lines of generic macro defintions that could go to some
> > generic header.
> >
> > What would be the disadvantage?
> 
> It wouldn't work.

Come on, don't be shy :-)

Cheers
Axel




More information about the ffmpeg-devel mailing list