Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strange enum name clash

I am compiling a project that uses both ffmpeg and Ogre. Now on Windows, everything works fine.

But when I want to compile a file with the following line of code:

Ogre::PixelFormat format = Ogre::PF_BYTE_RGBA;

The compiler gives the following error:

error: ‘AVPixelFormat’ is not a member of ‘Ogre’

Which is strange in many ways, as I have not only specified the Ogre namespace with ::, but also there is no AVPixelFormat in Ogre. How does gcc confuse "PixelFormat" with "AVPixelFormat"?

And how can I get rid of that?

I'd love to use int here instead of an enum, but another Ogre function requires format to be in Ogre::PixelFormat.

like image 800
TheSHEEEP Avatar asked Jan 14 '23 19:01

TheSHEEEP


2 Answers

Preprocess it first using gcc -E, then grep through the file looking for AVPixelFormat or PixelFormat. I suspect you have a #define or a typedef floating around, you just need to find where this happens, and a precompiled source file is the place this will become apparent.

like image 156
djechlin Avatar answered Jan 25 '23 07:01

djechlin


The problem is in avutil/pixfmt.h:

#define PixelFormat AVPixelFormat

This prevents users from using the word "PixelFormat" anywhere in their own code, even if in namespaces.

This is there as a compatibility hack for older software still using the old identifiers.

The solution is quite simple in case you can edit the code. Just add to the C++ code a

#define FF_API_PIX_FMT 0

before including the ffmpeg headers.

This disables the if in the pixfmt.h header:

#if FF_API_PIX_FMT
#define PixelFormat AVPixelFormat
...

Source: https://trac.ffmpeg.org/ticket/4216

P.S. I know the question is old, but somehow I feel that there is no solution and I needed a solution, so I added it.

like image 27
Ben Avatar answered Jan 25 '23 07:01

Ben