[Libav-user] Compile with g++

Michael Chisholm chisholm at mitre.org
Wed Oct 9 21:02:37 CEST 2013

On 10/8/2013 7:00 PM, Michael Chisholm wrote:
> On 10/8/2013 6:19 PM, Carl Eugen Hoyos wrote:
>> Michael Chisholm <chisholm at ...> writes:
>>> demuxing.c: In function 'int main(int, char**)':
>>> demuxing.c:261:66: error: invalid conversion from 'void*' to 'uint8_t**
>>> {aka unsigned char**}' [-fpermissive]
>>>            audio_dst_data = av_mallocz(sizeof(uint8_t *) * nb_planes);
>>>                                                                     ^
>> demuxing.c is a C program, if you want to compile it
>> with C++ (why?) you will have to convert it to C++,
>> just as with any other C program.
>> (Nothing about this is FFmpeg specific.)
> Of course I wouldn't normally compile a C application with other than a
> C compiler.  There is overlap between C and C++, and the above was just
> an experiment which basically shows that ffmpeg strays outside the
> overlapping region.  And I know as a C project, you have no obligation
> to make the code "C++-friendly".
>>> Is that the kind of error you are seeing (this is from ffmpeg 2.0.1)?
>>> I am admittedly using an older version of libav (0.8.6)
>> Just to make sure: This is known to broken (and said to
>> be exploitable) so please understand that we cannot
>> support it here.
> Yeah, I wouldn't ask for support for that here.  But if James is willing
> to use it, perhaps that will better fit his need.  Or maybe there is an
> earlier version of ffmpeg which is more C++-friendly.  And of course he
> can always use his API-indirection idea to wrap C++-unfriendly APIs with
> C++-friendly ones.

Having a fresher head today, I realize this still wasn't a good test; 
you really need a C++ app which uses libav APIs to test this, not a C 
app.  Or, you could try to see if you can get the C app working by 
changing only the .c file, not any headers.  That's easier, it means I 
don't have to start a new app from scratch.  So that's what I did, and I 
was able to get demuxing.c to compile with a C++ compiler, without 
modifying headers.

I just did the following:
- added casts to "frame->format" in a few places
- removed use of the "av_ts2timestr" macro, since it expanded to code 
that produced a compile error [1]
- Added extern "C" {...} around the includes
- Added cast to the return value of av_mallocz().

So my point to all this is, the ffmpeg-2.0.1 headers aren't completely 
C++-friendly, but it's not as bad as I thought.  I was able to work 
around the problems easily, with this simple test app.



c:/.../ffmpeg-2.0.1/include/libavutil/timestamp.h:72:94: error:
  taking address of temporary array
  #define av_ts2timestr(ts, tb) 
av_ts_make_time_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts, tb)
demuxing.c:87:20: note: in expansion of macro 'av_ts2timestr'
                     av_ts2timestr(frame->pts, &video_dec_ctx->time_base));

More information about the Libav-user mailing list