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

Reintroducing FFmpeg to Debian

Hi all,

some of you may have noticed a weird ffmpeg package in the NEW queue[1].
Let me explain:

In 2011 Libav[2] was forked from FFmpeg[3]. It was a time of great
uncertainty, the fork happened with much drama that didn't help making a
technical cut, and at that peculiar time Debian switched to Libav.

Since then the two projects evolved differently, and we have now a
clearer view.

Some short answers to questions you might have now:

 * Why is FFmpeg needed in Debian?
    - It has features our users are asking for (mostly support for more
      codecs, formats and filters)[4-6].
    - Some applications break when built against Libav on Debian,
      because they are developed using FFmpeg[7-10].
    - There are issues[11-12] in Libav's command line tools, that can't
      be reproduced with FFmpeg's tools.
    - It has a big and active user and developer community. Those of
      them who want to use Debian currently need to install FFmpeg from
      third parties or compile their own version from source.

 * Do you intend to replace Libav by FFmpeg in Debian?
   No, there is no need to replace anything as long as it is maintained.
   Currently the main goal is to give multimedia maintainers a choice
   between the two sets of libraries to link against, and our users the
   choice to use the 'ffmpeg' utility. That is possible, because the
   packages are co-installable. (Only the *-dev packages conflict.)

 * But I thought they were forks, why don't you just create conflicting
    - Because it can't really work! If we do that, packages built with
      FFmpeg won't be installable next to packages built with Libav
      unless we have full binary compatibility.
    - Binary compatibility can only be achieved with some tradeoffs:
      a) Not all soversions of the libraries match, so we would have
         to patch that away.
      b) FFmpeg would have to be compiled with the configure option
         --enable-incompatible-libav-abi, resulting in less tested
         code paths.
      c) FFmpeg and Libav would need to be updated at the same time.
      d) The biggest problem is that this would allow applications only
         to use the minimal set of the ABI supported by both.

 * I do not believe you, explain that voodoo to me: How is it that it
   won't break all of Debian and make kittens cry?
   (aka: How is FFmpeg packaged for Debian?)
    - We built the packages in a way that avoids filename conflicts.
      The sonames of the FFmpeg libraries are suffixed with '-ffmpeg',
      e.g. libavcodec-ffmpeg.so.55 instead of libavcodec.so.55.
      This also means that only if a package uses pkg-config to detect
      the correct linker flags, you can simply install e.g. the
      libavcodec-ffmpeg-dev package and it will work transparently.
      (About half the packages build with no further change, see
       stats below.)
    - From a user point of view, the tools have different names anyway,
      e.g. ffmpeg and avconv, except for qt-faststart, which is
      therefore packaged in a separate binary package that diverts
      the Libav version to qt-faststart.libav.
      Yes, you can have /usr/bin/ffmpeg and /usr/bin/avconv at the same
      time without conflicts.
    - The development packages have to conflict, because they provide
      header files (and pkg-config files) with identical names in
      identical locations.
    - To avoid potential problems when a program is linked against
      FFmpeg libraries and other libraries, which in turn are linked
      against Libav, the symbol versions are changed to e.g.
      LIBAVCODEC_FFMPEG_55 instead of LIBAVCODEC_55.

 * Ok, let's say I'm a multimedia maintainer and want to try out
   building my package against your ffmpeg, what should I do?
    - If your package uses pkg-config, which is commonly the case, all
      you have to do is to replace all lib{av,swscale,postproc}*-dev
      build-dependencies by lib{av,swscale,postproc}*-ffmpeg-dev.
      You can keep the Libav build-dependencies as alternatives.
    - In the (odd) case your upstream doesn't use pkg-config
      (52 packages), it's probably a good idea to start using it, so
      that the program can be easily built with both.
      The patches are usually quite simple as you can see in this

--- squeezelite-1.6.orig/Makefile
+++ squeezelite-1.6/Makefile
@@ -26,7 +26,7 @@ LINK_ALSA        = -lasound
 LINK_PORTAUDIO   = -lportaudio

 LINKALL          = -lFLAC -lmad -lvorbisfile -lfaad -lmpg123
-LINKALL_FF       = -lavcodec -lavformat -lavutil
+LINKALL_FF = $(shell pkg-config --libs libavcodec libavformat libavutil)

 DEPS             = squeezelite.h slimproto.h

      Patches for packages using Autoconf or Cmake are similarly
    - Sometimes other minor adjustments are needed. (13 packages)
    - There are only 2 packages (opencv and ffms2) that would trigger a
      needed transition, but that would be quite manageable as only 4
      packages (3 on opencv and 1 on ffms2) depend on both libav*-dev
      and the transition-needed library (libopencv-highgui-dev and
      Note that the dependencies of libopencv-highgui-dev on
      libavcodec-dev, libavformat-dev and libswcale-dev seem
      to be unnecessary[13].

 * Does it make sense for me to switch my package?
   The rule of thumb is, if your upstream uses FFmpeg for development
   you probably want to switch to using it, too.

Of the 108 current reverse-build-dependencies of src:libav,
50 only need build-dependency adjustments,
50 can be patched to work with FFmpeg already,
5 can only be patched once FFmpeg is through NEW,
2 FTBFS since a long time and are not in testing [14-15] and
1 currently FTBFS for unrelated reasons [16].

Attached results.txt contains a per package list.

Any maintainer interested in switching should get in touch, and we'll
gladly help preparing the transition. When we're done dealing with those
early birds we intend to file wishlist bugs with patches on other
packages to help maintainers transition if they want to. (We already
have patches for the affected packages.)

The FFmpeg version currently in NEW has been there for more than
2 months and is thus outdated. If you want to test the current
packages, you can build them from the repository on Alioth [17]
(e.g. using git-buildpackage).

Furthermore, we'd like to move the FFmpeg packaging under the umbrella
of the pkg-multimedia team, because this would facilitate future FFmpeg

Best regards,
Andreas (on behalf of the FFmpeg team)

1: https://ftp-master.debian.org/new/ffmpeg_7:2.2.1-1.html
2: https://libav.org/
3: https://ffmpeg.org/
4: http://lucy.pkh.me/diff/
5: https://bugs.debian.org/707476
6: https://bugs.debian.org/694616
7: https://bugs.debian.org/732159
8: https://bugs.debian.org/741170
9: https://bugs.debian.org/742896
10: https://bugs.debian.org/745060
11: https://bugs.debian.org/692876
12: https://bugs.debian.org/753923
13: https://bugs.debian.org/745934
14: https://bugs.debian.org/723099
15: https://bugs.debian.org/720796
16: https://bugs.debian.org/747536
17: https://anonscm.debian.org/gitweb/?p=collab-maint/ffmpeg.git;a=summary
108 Packages in sid

1. Package: taoframework
1. result: FAILS                                          // RC (not in testing); #723099: patch disabling FFmpeg plugin
2. Package: acoustid-fingerprinter
2. result: OK                                             // PATCH pkg-config; PATCH CodecID
3. Package: alsa-plugins
3. result: OK
4. Package: amarok
4. result: FAILS                                          // FTBFS: B-D conflict: #747536, pending; PATCH_pkg-config
5. Package: amide
5. result: OK                                             // PATCH pkg-config
6. Package: aubio
6. result: OK
7. Package: audacious-plugins
7. result: OK
8. Package: audacity
8. result: OK
9. Package: avbin
9. result: OK                                             // PATCH pkg-config
10. Package: avifile
10. result: OK                                            // PATCH pkg-config
11. Package: bino
11. result: OK
12. Package: blender
12. result: OK                                            // PATCH pkg-config
13. Package: cantata
13. result: OK                                            // PATCH pkg-config
14. Package: chromaprint
14. result: OK                                            // PATCH pkg-config
15. Package: cmus
15. result: OK
16. Package: dff
16. result: OK                                            // PATCH pkg-config
17. Package: dvbcut
17. result: OK                                            // PATCH pkg-config
18. Package: dvswitch
18. result: OK                                            // PATCH CodecID -*- FTBFS Libav 10 (#747868): removed avcodec_encode_video, patch
19. Package: ffdiaporama
19. result: OK                                            // PATCH pkg-config; PATCH remove incompatible-libav-ABI -*- breaks compilation with Libav 10
20. Package: ffmpeg2theora
20. result: OK
21. Package: ffmpegthumbnailer
21. result: OK
22. Package: ffmpegthumbs
22. result: OK                                            // PATCH pkg-config
23. Package: ffms2        [STAGE1]
23. result: OK
24. Package: forked-daapd
24. result: OK                                            // PATCH pkg-config
25. Package: freecad                                      // BUILD-DEPENDENCY: libopencv-highgui-dev
25. result: OK
26. Package: freerdp
26. result: OK                                            // PATCH pkg-config
27. Package: fuse-emulator-utils
27. result: OK                                            // PATCH pkg-config
28. Package: gegl
28. result: OK
29. Package: gimp-gap
29. result: OK                                            // spurious build-dependencies #748857
30. Package: gmerlin-avdecoder
30. result: OK
31. Package: gmerlin-encoders
31. result: OK
32. Package: gmic
32. result: OK                                            // spurious build-dependencies #755815; BUILD_DEPENDENCY: libopencv-highgui-dev
33. Package: gnash
33. result: OK
34. Package: goldendict
34. result: OK
35. Package: gpac
35. result: OK                                            // PATCH pkg-config
36. Package: gst-libav1.0
36. result: OK
37. Package: gstreamer0.10-ffmpeg
37. result: FAILS                                         // RC (not in testing) FTBFS libav9: #720796
38. Package: guvcview
38. result: OK
39. Package: handbrake
39. result: OK                                            // PATCH pkg-config
40. Package: harvid
40. result: OK
41. Package: hedgewars
41. result: OK                                            // PATCH pkg-config
42. Package: idjc
42. result: OK                                            // PATCH pkg-config
43. Package: jitsi
43. result: OK                                            // PATCH pkg-config
44. Package: jugglemaster
44. result: OK                                            // PATCH pkg-config
45. Package: k3b
45. result: OK                                            // PATCH pkg-config; PATCH CodecID, reenable plugin (#739312) -*- removed av_close_input_file / avcodec_decode_audio3
46. Package: kdenlive
46. result: OK                                            // spurious build-dependencies #748277
47. Package: kfilemetadata
47. result: OK                                            // PATCH pkg-config
48. Package: kid3
48. result: OK                                            // PATCH pkg-config
49. Package: kino
49. result: OK
50. Package: kradio4
50. result: OK
51. Package: lebiniou
51. result: OK
52. Package: libam7xxx
52. result: OK                                            // PATCH pkg-config
53. Package: libavg
53. result: OK
54. Package: libextractor
54. result: OK                                            // PATCH pkg-config; PATCH missing BDs for FFmpeg plugin (#755810)
55. Package: libgroove
55. result: OK                                            // PATCH pkg-config
56. Package: libomxil-bellagio
56. result: OK                                            // spurious build-dependencies #748156
57. Package: libphash                                     // BUILD-DEPENDENCY: libopencv-highgui-dev
57. result: OK                                            // PATCH pkg-config
58. Package: libpostproc
58. result: OK
59. Package: libquicktime
59. result: OK
60. Package: libvdpau-va-gl
60. result: OK
61. Package: lightspark
61. result: OK
62. Package: linphone
62. result: OK                                            // PATCH pkg-config
63. Package: lives
63. result: OK                                            // PATCH pkg-config
64. Package: lynkeos.app
64. result: OK                                            // PATCH pkg-config
65. Package: mediatomb
65. result: OK                                            // PATCH pkg-config
66. Package: minidlna
66. result: OK                                            // PATCH pkg-config
67. Package: miro
67. result: OK                                            // PATCH pkg-config; PATCH CodecID (#748861)
68. Package: mlt
68. result: OK                                            // PATCH pkg-config
69. Package: moc
69. result: OK
70. Package: motion
70. result: OK                                            // PATCH pkg-config
71. Package: mpd
71. result: OK
72. Package: mplayer2
72. result: OK                                            // PATCH FF_INPUT_BUFFER_PADDING_SIZE
73. Package: mpv
73. result: OK
74. Package: nepomuk-core
74. result: OK                                            // PATCH pkg-config
75. Package: netgen
75. result: OK                                            // PATCH pkg-config; PATCH CodecID, reenable plugin (#751344) -*- FTBFS Libav 10: removed avcodec_encode_video
76. Package: opal
76. result: OK
77. Package: opencv        [STAGE1]
77. result: OK
78. Package: openscenegraph
78. result: OK                                            // PATCH pkg-config
79. Package: ovito
79. result: OK                                            // PATCH pkg-config
80. Package: paraview
80. result: OK                                            // PATCH pkg-config
81. Package: performous
81. result: OK                                            // PATCH pkg-config
82. Package: qmmp
82. result: OK
83. Package: qutecom
83. result: OK                                            // PATCH pkg-config
84. Package: renpy
84. result: OK                                            // PATCH pkg-config; PATCH remove deprecated macros
85. Package: shotdetect
85. result: OK                                            // PATCH pkg-config
86. Package: silan
86. result: OK
87. Package: spek
87. result: OK
88. Package: squeezelite
88. result: OK                                            // PATCH pkg-config
89. Package: strigi
89. result: OK                                            // PATCH pkg-config
90. Package: survex
90. result: OK                                            // PATCH pkg-config
91. Package: transcode
91. result: OK
92. Package: tupi
92. result: OK                                            // PATCH pkg-config
93. Package: vdr-plugin-xineliboutput
93. result: OK
94. Package: vice
94. result: OK
95. Package: visp                                         // BUILD-DEPENDENCY: libopencv-highgui-dev
95. result: OK
96. Package: vlc
96. result: OK
97. Package: vtk
97. result: OK                                            // PATCH pkg-config
98. Package: vtk6
98. result: OK                                            // PATCH pkg-config
99. Package: wxsvg
99. result: OK
100. Package: x264                                        // BUILD-DEPENDENCY: libffms2-dev
100. result: OK
101. Package: xbmc
101. result: OK                                           // PATCH remove --enable-libav -*- Libav incompatible
102. Package: xbmc-pvr-addons
102. result: OK                                           // spurious build-dependencies #755818
103. Package: xine-lib-1.2
103. result: OK
104. Package: xjadeo
104. result: OK
105. Package: xmms2
105. result: OK
106. Package: xpra
106. result: OK
107. Package: yorick-av
107. result: OK                                           // PATCH pkg-config
108. Package: zoneminder
108. result: OK                                           // PATCH pkg-config; PATCH libgcrypt (#745819)

    building:                                 41
    spurious dependency:                       5
    build-dependency update:                   4
    pkg-config patch:                         44
    pkg-config + other patch:                  8
    other patch:                               3
    FTBFS:                                     1
    RC buggy:                                  2

Reply to: