[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Introducing symbol versioning in FFmpeg

The following message is a courtesy copy of an article
that has been posted to gmane.linux.debian.devel.release as well.

Dear Release Team,

I'm in the process of implementing symbol versioning for the FFmpeg
library. This work is done in coordination with upstream, but as FFmpeg
is a rather complex set of libraries, this (probably) needs to be done
in coordination with the Debian Release Team as well.

Short recap: FFmpeg ships the following set of libraries (internal
dependencies in brackets):

 - libavutil:
 - libavcodec:  (libavutil)
 - libavformat: (libavcodec,  libavutil)
 - libavfilter: (libavcodec,  libavutil)
 - libavdevice: (libavformat, libavcodec, libavutil)
 - libpostproc: (libavutil)
 - libswscale:  (libavutil)

We currently FFmpeg version 0.5 in lenny and squeeze. I noticed
difficulties when trying to update the distro packages to a recent svn
checkout, because the SONAME of libavutil has been bumped. In situations
where the application package was not recompiled (yet), this causes
libavutil to be loaded twice, once with the old SONAME and once with the

My understanding of the situation is that symbol versioning is the
recommended answer to this problem. I therefore went ahead and started a
discussion upstream about that [1]. In that discussion, upstream (more
or less) agreed on that plan.

I'm proposing the following changes to the FFmpeg packages in Debian:

 i.   each and every library of FFmpeg applies the following version tag
      to each and every symbol: ${LIBNAME}_${SONAME}

 ii.  upload of FFmpeg 0.5 to unstable with versioned symbols

 iii. binNMU all applications to pick up the new versioned symbols.

 iv.  Upload a newer FFmpeg snapshot to experimental with versioned

I request assistance from the release team for the following questions:

 - does the symbol versioning strategy in step i. make sense?

I believe so, as upstream does care for ABI compatibility inside the
single FFmpeg libraries, but not (yet) about issues caused by transitive
dependencies. E.g., this would mean the symbols of libavutil49 (in
squeeze) would get the tag LIBAVUTIL_49, whereas libavutil in
experimental would get LIBAVUTIL_50.

 - do I need to rename the binary packages and conflict against the old
   packages as outlined in the last parahraph of the library packaging
   guide, section 3.3 [2]?

Upstream has concerns that this is absolutely required due to bugs in the
gnu linker ld, see his posting in [3].

 - When would be a good time to do this change? I imagine that depending
   on the previous answer, this will cause a larger transition for

Moreover, FFmpeg has introduced a policy of naming all publicly exported
functions 'av_*', and all internally exported functions 'ff_*'. However,
there are some additional symbols known that are used by application
packages. These need to be exported additionally of course, but it is
not obvious which of these symbols are actually used. So my last request
for assistance:

 - Currently, FFmpeg exports all sort of internal symbols. With symbol
   versioning, upstream agreed to limit the list of exported symbols.
   I'd like to do so in FFmpeg 0.5 in squeeze as well. Do you agree with

[1] http://thread.gmane.org/gmane.comp.video.ffmpeg.devel/100196
[2] http://www.netfort.gr.jp/~dancer/column/libpkg-guide/libpkg-guide.html#id293373
[3] http://article.gmane.org/gmane.comp.video.ffmpeg.devel/100664
Reinhard Tartler, KeyID 945348A4

Reply to: