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

Frank Barchard fbarchard
Mon Jun 28 22:52:28 CEST 2010


On Sun, Jun 6, 2010 at 8:03 AM, Reinhard Tartler <siretart at tauware.de>wrote:

> 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 /tmp/elephant-dream.webm
> FFplay version SVN-r0.5.1-4:0.5.1-1ubuntu1, Copyright (c) 2003-2009 Fabrice
> Bellard, et al.
>  configuration: --extra-version=4:0.5.1-1ubuntu1 --prefix=/usr
> --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib
> --enable-libgsm --enable-libschroedinger --enable-libspeex
> --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib
> --disable-stripping --disable-vhook --enable-runtime-cpudetect --enable-gpl
> --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394
> --enable-shared --disable-static
>  libavutil     49.15. 0 / 49.15. 0
>  libavcodec    52.20. 1 / 52.72. 2
>  libavformat   52.31. 0 / 52.64. 2
>  libavdevice   52. 1. 0 / 52. 2. 0
>  libavfilter    0. 4. 0 /  0. 4. 0
>  libswscale     0. 7. 1 /  0.11. 0
>  libpostproc   51. 2. 0 / 51. 2. 0
>  built on Mar  4 2010 12:35:30, gcc: 4.4.3
> 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.
> However, I've spent now some time to restore binary compatibility by
> adding trampoline functions and .symver directives. With the attached
> patch, I get the following:
>
> >> ffplay /tmp/elephant-dream.webm
> FFplay version SVN-r0.5.1-4:0.5.1-1ubuntu1, Copyright (c) 2003-2009 Fabrice
> Bellard, et al.
>  configuration: --extra-version=4:0.5.1-1ubuntu1 --prefix=/usr
> --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib
> --enable-libgsm --enable-libschroedinger --enable-libspeex
> --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib
> --disable-stripping --disable-vhook --enable-runtime-cpudetect --enable-gpl
> --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394
> --enable-shared --disable-static
>  libavutil     49.15. 0 / 49.15. 0
>  libavcodec    52.20. 1 / 52.72. 2
>  libavformat   52.31. 0 / 52.64. 2
>  libavdevice   52. 1. 0 / 52. 2. 0
>  libavfilter    0. 4. 0 /  0. 4. 0
>  libswscale     0. 7. 1 /  0.11. 0
>  libpostproc   51. 2. 0 / 51. 2. 0
>  built on Mar  4 2010 12:35:30, gcc: 4.4.3
> diverting av_*_packet function calls to libavcodec. Recompile to improve
> performance
> [libvpx @ 0x9f60b10]v0.9.0
> [matroska @ 0x9f2fce0]Estimating duration from bitrate, this may be
> inaccurate
> [libvpx @ 0x9f60b10]v0.9.0
>
> and the video plays back just fine.
>
> I'd really like to have this for ffmpeg 0.6. Is the attached patch
> acceptable for trunk?
>
> Index: configure
> ===================================================================
> --- configure   (revision 23498)
> +++ configure   (working copy)
> @@ -1086,6 +1086,7 @@
>     struct_sockaddr_in6
>     struct_sockaddr_sa_len
>     struct_sockaddr_storage
> +    symbol_versioning
>     sys_mman_h
>     sys_resource_h
>     sys_select_h
> @@ -2733,7 +2734,7 @@
>
>  echo "X{};" > $TMPV
>  test_ldflags -Wl,--version-script,$TMPV &&
> -    append SHFLAGS '-Wl,--version-script,\$(SUBDIR)lib\$(NAME).ver'
> +    append SHFLAGS '-Wl,--version-script,\$(SUBDIR)lib\$(NAME).ver' &&
> enable symbol_versioning
>
>  if enabled small; then
>     add_cflags $size_cflags
> Index: libavformat/utils.c
> ===================================================================
> --- libavformat/utils.c (revision 23498)
> +++ libavformat/utils.c (working copy)
> @@ -29,6 +29,9 @@
>  #include <time.h>
>  #include <strings.h>
>  #include <stdarg.h>
> +#if HAVE_SYMBOL_VERSIONING && LIBAVFORMAT_VERSION_MAJOR < 53
> +#include <dlfcn.h>
> +#endif
>  #if CONFIG_NETWORK
>  #include "network.h"
>  #endif
> @@ -41,6 +44,10 @@
>  * various utility functions for use within FFmpeg
>  */
>
> +#if HAVE_SYMBOL_VERSIONING && LIBAVFORMAT_VERSION_MAJOR < 53
> +static void *avformat_handle;
> +#endif
> +
>  unsigned avformat_version(void)
>  {
>     return LIBAVFORMAT_VERSION_INT;
> @@ -282,9 +289,75 @@
>     return NULL;
>  }
>
> -/* memory handling */
> +#if HAVE_SYMBOL_VERSIONING && LIBAVFORMAT_VERSION_MAJOR < 53
> +/* compatibility trampolines for packet functions */
>
> +void ff_av_destruct_packet_nofree(AVPacket *pkt);
> +void ff_av_destruct_packet_nofree(AVPacket *pkt)
> +{
> +    void (*fn)(AVPacket *pkt) = dlsym(avformat_handle,
> "av_destruct_packet_nofree");
> +    if (!fn)
> +        av_log(NULL, AV_LOG_FATAL, "Failed to locate symbol:
> av_destruct_nofree\n");
> +    (*fn)(pkt);
> +}
> +__asm__(".symver
> ff_av_destruct_packet_nofree,av_destruct_packet_nofree at LIBAVFORMAT_52");
>
> +void ff_av_destruct_packet(AVPacket *pkt);
> +void ff_av_destruct_packet(AVPacket *pkt)
> +{
> +    void (*fn)(AVPacket *pkt) = dlsym(avformat_handle,
> "av_destruct_packet");
> +    if (!fn)
> +        av_log(NULL, AV_LOG_FATAL, "Failed to locate symbol:
> av_destruct_packet\n");
> +    (*fn)(pkt);
> +}
> +__asm__(".symver ff_av_destruct_packet,av_destruct_packet at LIBAVFORMAT_52
> ");
> +
> +int ff_av_new_packet(AVPacket *pkt, int size);
> +int ff_av_new_packet(AVPacket *pkt, int size)
> +{
> +    int (*fn)(AVPacket *pkt, int size) = dlsym(avformat_handle,
> "av_new_packet");
> +    if (!fn)
> +        av_log(NULL, AV_LOG_FATAL, "Failed to locate symbol:
> av_new_packet\n");
> +    return (*fn)(pkt, size);
> +}
> +__asm__(".symver ff_av_new_packet,av_new_packet at LIBAVFORMAT_52");
> +
> +int ff_av_dup_packet(AVPacket *pkt);
> +int ff_av_dup_packet(AVPacket *pkt)
> +{
> +    int (*fn)(AVPacket *pkt) = dlsym(avformat_handle, "av_dup_packet");
> +    if (!fn)
> +        av_log(NULL, AV_LOG_FATAL, "Failed to locate symbol:
> av_dup_packet\n");
> +    return (*fn)(pkt);
> +}
> +__asm__(".symver ff_av_dup_packet,av_dup_packet at LIBAVFORMAT_52");
> +
> +void ff_av_free_packet(AVPacket *pkt);
> +void ff_av_free_packet(AVPacket *pkt)
> +{
> +    void (*fn)(AVPacket *pkt) = dlsym(avformat_handle, "av_free_packet");
> +    if (!fn)
> +        av_log(NULL, AV_LOG_FATAL, "Failed to locate symbol:
> av_free_packet\n");
> +    (*fn)(pkt);
> +}
> +__asm__(".symver ff_av_free_packet,av_free_packet at LIBAVFORMAT_52");
> +
> +void ff_av_init_packet(AVPacket *pkt);
> +void ff_av_init_packet(AVPacket *pkt)
> +{
> +    void (*fn)(AVPacket *pkt);
> +    av_log(NULL, AV_LOG_WARNING, "diverting av_*_packet function calls to
> libavcodec. Recompile to improve performance\n");
> +    avformat_handle=dlopen("libavcodec.so.52", RTLD_LAZY);
> +    if(!avformat_handle)
> +        av_log(NULL, AV_LOG_FATAL, "Could not open libavcodec.so.52\n");
> +    fn = dlsym(avformat_handle, "av_init_packet");
> +    if (!fn)
> +        av_log(NULL, AV_LOG_FATAL, "Failed to locate symbol:
> av_init_packet\n");
> +    (*fn)(pkt);
> +}
> +__asm__(".symver ff_av_init_packet,av_init_packet at LIBAVFORMAT_52");
> +#endif
> +
>  int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size)
>  {
>     int ret= av_new_packet(pkt, size);
>

This patch breaks chromium linux builds, which use gyp to build ffmpeg.
Removing them for now.



More information about the ffmpeg-devel mailing list