[FFmpeg-devel] [PATCH] restoring binary compatibility with ffmpeg 0.5

Måns Rullgård mans
Sun Jun 6 20:01:44 CEST 2010

Reinhard Tartler <siretart at tauware.de> writes:

> On So, Jun 06, 2010 at 17:59:48 (CEST), M?ns Rullg?rd wrote:
>> Reinhard Tartler <siretart at tauware.de> writes:
>>> Hi,
>>> I'm sorry for not noticing earlier, but during upgrade tests, I noticed
>>> that there are some functions that went missing in libavformat.so.52
>>> since ffmpeg 0.5. In total, they are:
>>> void ff_av_destruct_packet_nofree(AVPacket *pkt);
>>> void ff_av_destruct_packet(AVPacket *pkt);
>>> int ff_av_new_packet(AVPacket *pkt, int size);
>>> int ff_av_dup_packet(AVPacket *pkt);
>>> void ff_av_free_packet(AVPacket *pkt);
>>> void ff_av_init_packet(AVPacket *pkt);
>>> They all were moved quite some time ago from libavformat to libavcodec.
>>> The API has not been broken, as avcodec is a dependency for avformat.
>>> Still, this is a serious problem if we want to retain binary
>>> compatibility. As a testcase, I'm using the ubuntu ffplay binary (ffmpeg
>>> 0.5) with a LD_LIBRARY_PATH, in which ffmpeg 0.6 libraries have been
>>> installed to playback a VP8 file in a WEBM container. Using this setup,
>>> ffplay aborts with:
>>> ffplay: relocation error: ffplay: symbol av_init_packet, version LIBAVFORMAT_52 not defined in file libavformat.so.52 with link time reference
>>> The message is exactly right; the mentioned symbols have been removed
>>> from libavformat.so.52.
>>> The safest fix in this situation would be of course to bump major.
>> I think that is the proper thing to do.  We already have over 30
>> changes queued up for the next lavf major bump.  Piling on hacks will
>> merely delay the inevitable and has no long-term benefit.
> Well, by not bumping SONAME existing binaries and applications would
> benefit. I've descriped the ffplay binary from ffmpeg 0.5 as example
> application that now can playback VP8/WEBM while it hasn't been
> available at that time. But anyway, bumping SONAME would work for me as
> well.

And when we eventually do bump the major version, compatibility will
be lost again.  What's the big deal?

If you get rid of the __asm__ hackery, I do not, however, object to
having these wrappers in lavf for a while.

>>> +__asm__(".symver ff_av_destruct_packet_nofree,av_destruct_packet_nofree at LIBAVFORMAT_52");
>> This will break with non-gcc compilers and/or non-gnu assemblers, both
>> of which we support.
> I don't think so. I've changed the configure script so that this part
> gets only compiled if the toolchain actually supports versioning
> scripts. On non-gnu assemblers/compilers, this part doesn't get compiled
> at all.

You are mistaken.  The configure test checks whether the _linker_
supports version scripts.  The code above relies on the _compiler_
supporting this particular inline asm syntax, which some supported
compilers do not, and on the _assembler_ supporting the .symver
directive, which again some supported assemblers do not.

Can this be done in the version script instead?

M?ns Rullg?rd
mans at mansr.com

More information about the ffmpeg-devel mailing list