modified: _posts/2015-07-29-ios-concurrency-programming-operation-queues.md
[GalaxyBlog.git] / _posts / 2015-04-21-ffmpeg-versus-libav.md
blob67e306201baaffb8313993ada9b29e12f5262ff3
1 ---
2 layout: post
3 date: 'Tue 2015-04-21 15:05:43 +0800'
4 slug: "ffmpeg-versus-libav"
5 title: "FFmpeg versus Libav"
6 description: ""
7 category: 
8 tags: ZT, Programming
9 ---
10 {% include JB/setup %}
12 # FFmpeg versus Libav
13 Nikoli edited this page on Mar 22 ยท 23 revisions
15 https://github.com/mpv-player/mpv/wiki/FFmpeg-versus-Libav/42a2bd9c16b04a7aeaa6090b2def10b0df948b31
17 ---
19 Relation to mpv
20 ===============
22 FFmpeg and Libav are libraries for multimedia decoding (and more). Both
23 libraries expose almost the same API and features.
25 Note that both libraries actually come as a set of libraries, and both projects use the same library names. The libraries are named libavcodec, libavformat, libavutil, and more. There is a FFmpeg libavcodec and a Libav libavcodec.
27 Many things in mpv, including video decoding, are done via FFmpeg or Libav.
28 It's a major mpv dependency, and differences between FFmpeg and Libav can have
29 a major impact on its behavior: the number of files it can decode, whether it
30 decodes correctly, what video and audio filters are provided, network behavior,
31 and more.
33 FFmpeg and Libav history
34 ========================
36 In 2011, parts of the FFmpeg developers were unhappy about the FFmpeg
37 leadership, and decided to take over. This didn't quite work out. Apparently
38 Fabrice Bellard, original FFmpeg developer and owner of the ffmpeg.org
39 domain name, decided not to hand over the domain name to the _new_
40 maintainers. So they followed Plan B, and forked FFmpeg, resulting in Libav.
41 Since then, Libav did its own development, and completely ignored whatever
42 FFmpeg did. FFmpeg, on the other hand, started to merge literally everything
43 Libav did.
45 The reason for the fork is most likely that the developers hate each other.
46 While this formulation seems somewhat sloppy, it is most likely the truth. To
47 this date, the ``#libav-devel`` IRC channel still has Michael Niedermayer (the
48 FFmpeg maintainer since 2004 according to Wikipedia) on their ban list (similar
49 misbehavior is exhibited by some FFmpeg developers). There is little to no
50 cooperation between the two projects.
52 More about FFmpeg's history and the fork incident can be found on Wikipedia.
54 Situation today
55 ===============
57 FFmpeg has more features and slightly more active development than Libav,
58 going by mailing list and commit volume. In particular, FFmpeg's features are
59 a superset of Libav's features. This is because FFmpeg merges Libav's git
60 master on a daily basis. Libav on the other hand seems to prefer to ignore
61 FFmpeg development (with occasional cherry-picking of bug fixes and features).
63 Some Linux distributions, especially those that had Libav developers as FFmpeg
64 package maintainers, replaced FFmpeg with Libav, while other
65 distributions stick with FFmpeg. Application developers typically have to
66 make sure their code works with both libraries. This can be trivial to hard,
67 depending on the details. One larger problem is that the difference between
68 the libraries makes it hard to keep up a consistent level of the user experience,
69 since either library might silently or blatantly be not up to the task. It
70 also encourages library users to implement some features themselves, rather
71 than dealing with the library differences, or the question to which project
72 to contribute.
74 FFmpeg and Libav developers also seem to have the tendency to ignore the
75 damage their rivalry is causing. Apparently fighting out these issues on
76 the users' backs is better than reconciling. This means everyone using
77 these libraries either has to suffer from the differences, or reimplement
78 functionality that is not the same between FFmpeg and Libav. mpv does not
79 follow the latter approach to avoid bloat, thus the choice between FFmpeg
80 or Libav matters.
82 Is FFmpeg or Libav preferred for use with mpv?
83 ==============================================
85 Although mpv attempts to work well with both FFmpeg and Libav,  FFmpeg is
86 preferred in general. This is simply because FFmpeg merges from Libav, and
87 seems to have more features and fewer bugs than Libav. Although we don't
88 agree with everything FFmpeg does, and we like some of Libav's general
89 goals and development directions, FFmpeg is just better from a practical
90 point of view.
92 It shouldn't be forgotten that Libav is doing significant and important
93 development, but since everything they do ends up in FFmpeg anyway, there
94 is barely any reason to prefer Libav over FFmpeg from the user point of view.
95 It's also possible that FFmpeg agrees faster to accept gross hacks to paint over
96 bugs and issues than Libav, however, in the user's perception FFmpeg
97 will perform better because of that.
99 Comparison between FFmpeg and Libav
100 ===================================
102 This is pretty superficial, and should give only a general impression over
103 differences. Also, this might be biased by the personal views of the
104 author of this text.
106 FFmpeg advantages / Libav disadvantages
107 ---------------------------------------
108 - merges everything from Libav, so almost all Libav features and bug fixes are
109   part of FFmpeg
110 - seems to be more popular (more patches, more activity on the mailing lists
111   and the bug tracker)
112 - FFmpeg definitely has more features and more complete implementations of at
113   least some file formats
114 - Libav has very long release cycles, which force us to be backwards compatible
115   with very old code. Libav also likes to miss Debian/Ubuntu deadlines.
116 - Sometimes FFmpeg adds APIs we want to use, and Libav doesn't have them. This
117   causes us pain, and the blame goes to Libav for not providing them.
118 - Really messy backporting of major FFmpeg features. (E.g. see VP9
119   decoder: after it was developed and merged in FFmpeg, Libav picked
120   up the VP9 patches, made their own changes, both functional and
121   cosmetic, squashed it into one commit. The original authors of the
122   decoder had to figure out what was changed and possibly improved,
123   and what was purely cosmetic.)
124   (See also HEVC incident.)
126 FFmpeg disadvantages / Libav advantages
127 ---------------------------------------
128 - the insane amount and volume of merging from a codebase that has been
129   diverging for several years most likely has some negative effects on
130   FFmpeg
131 - FFmpeg is relatively paranoid about being compatible to Libav, which adds
132   bloat, and also allows Libav to dictate the API, somewhat stifling FFmpeg
133   development and adding stupid artifacts to the FFmpeg ABI
134 - Libav is going somewhat clean directions in API development (although
135   everything from this ends up in FFmpeg anyway)
136 - FFmpeg seems to have an "anything goes" attitude, and merges/accepts just
137   about anything, sometimes only for the purpose to have it before Libav. (E.g. see
138   HEVC decoder: developed mainly on the Libav side, though separate from the
139   Libav repository, it was hastily merged by FFmpeg shortly before Libav was
140   done with the merge that was prepared for months.)
141   (See also VP9 incident.)
142 - FFmpeg never cleans up anything. The shit keeps piling up.
143 - Libav does major work cleaning up the API and internals.
145 Disadvantages of using Libav with mpv
146 =====================================
148 Libav lacks some features, and this list is supposed to give an overview which
149 missing features have a larger impact on the features mpv appears to provide.
150 Note that some of these features were removed from mpv's core and replaced with
151 FFmpeg functionality. (In some cases, it turned out only later that Libav
152 didn't provide the required functionality.)
154 - external vobsubs (.sub/.idx files) can be read only if built with FFmpeg
155   (http://bugzilla.libav.org/show_bug.cgi?id=419)
156 - Libav misses support for a big number of various text subtitle formats
157   (http://bugzilla.libav.org/show_bug.cgi?id=419)
158   (mpv still has legacy parsers from mplayer, though)
159 - we plan to replace most video/audio filters with FFmpeg's, but Libav lacks
160   some of them: vf_noise, vf_phase, vf_stereo3d, vf_pullup
161   (some more MPlayer filters have been removed from mpv, but are available
162   in ffmpeg's libavfilter)
163 - Libav PGS subtitle decoder doesn't handle multiple subtitle rects
164   (http://bugzilla.libav.org/show_bug.cgi?id=418)
165 - Libav http implementation doesn't return the content type, which makes opening
166   web radio streams slow (plus mp3 streams might fail entirely to open)
167   (fixed in Libav 10?)
169 This list is not complete. In some cases we might not be aware of differences
170 in functionality and performance until we encounter it. Most mpv developers
171 exclusively use FFmpeg, which makes spotting such issues harder.
173 External Reading
174 ================
176 Wikipedia: http://en.wikipedia.org/wiki/FFmpeg#History