Как известно, полтора года назад часть разработчиков проекта FFmpeg предприняла попытку передела власти с целью избавления от тотального контроля со стороны основного разработчика Майкла Нидермайера (Michael Niedermayer), а также для изменения методов разработки и переопределения целей. Чуть позже по разным причинам эта команда создала форк FFmpeg под названием Libav и начала реализовывать свои планы в виде отдельного проекта. Спустя полтора года один из разработчиков, Клемент Бош (Clément Bœsch), поддерживающий нейтральную позицию, и сотрудничающий с обоими проектами, попытался привлечь внимание сообщества к проблема во взаимоотношении между FFmepg и Libav.
В то время как после произошедшего форка у Libav остались серверы, система отслеживания ошибок, списки рассылки и другие ресурсы, проект FFmpeg воссоздавал себя с нуля, чему значительно помогло сообщество разработчиков VideoLAN (в частности, исходный код FFmpeg расположен на git.videolan.org)). Майкл Нидермайер также ввёл в обиход постоянное слияние изменений, создаваемых для Libav с кодом FFmpeg (каждые 1-2 дня). Основным итогом стало то, что форк стимулировал дух конкуренции, и FFmpeg стал, по мнению Боша, как проект, гораздо более цельным и поздоровевшим. Также, по мнению Боша, стиль поведения лидера FFmpeg, Майкла Нидермайера, полностью изменился в лучшую сторону. Это, несомненно, один из безусловно позитивных результатов этой "войны".
В остальном, наблюдается ряд существенных проблем, не только мешающих развитию обоих проектов, но и способных негативно сказаться на пользователях. По наблюдениям Боша, с самого начала разработки Libav полностью игнорирует FFmpeg. Это касается не только новых возможностей, но и об исправлении ошибок и устранении регрессивных изменений. При этом игнорируются сотни патчей с исправлениями. Время от времени из FFmpeg заимствуется некоторый код, но он фиксируется своеобразным способом, с полностью изменённым указанием на авторство. Некоторые примеры, собранные Бошем: ffmpeg:781fb46c5 и libav:12d42cd7a8, ffmpeg:a9011623e и libav:0426c69310, ffmpeg:788a60d9d и libav:e58b75f7ff, ffmpeg:e3c267053 и libav:15358ade15.
Работа, ведущаяся в FFmpeg, совершенно не признаётся, переписывается абсолютно всё. Некоторые примеры:
- Формат вывода ffprobe. В прошлом году Бош и разработчик Стефано Сабатини (Stefano Sabatini) разработали простую систему записи с выводом в формате JSON вместо INI/XML, идущего по умолчанию в ffprobe. Одновременно это улучшение было предложено и для Libav. Но предложение просто взять коммиты из FFmpeg было проигнорировано. Бош и Стефано затем добавили возможность вывода в XML, CSV, TXT и в некоторых других форматах, большинство которых настраиваются с помощью опций. Они имели успех, и соответственно пользователи захотели получить такую же функциональность в Libav. Здравым решением было бы просто взять готовое решение, но вместо этого ребята из Libav решили переписать всё с нуля, с аргументами "мне это не нравится". В процессе был поломан вывод по умолчанию, и соответственно связанные с ним скрипты пользователей, а также не были сохранены имена опций, используемые в FFmpeg, чтобы пользователи смогли легко переключаться между инструментами.
- libswresample и libavresample: в конце 2011 года, Майкл Нидермайер написал аудио-библиотеку для ресемплинга и преобразования форматов, которую он назвал libswresample. Позже несколько разработчиков FFmpeg поучаствовали в её развитии, и затем она была интегрирована в проект (инструментарий, фильтры) и очень сильно улучшила общую поддержку аудио в FFmpeg. Как обычно, разработчики Libav полностью игнорировали libswresample в течение года, а затем наняли платного разработчика (на деньги фонда FFmtech) чтобы с нуля написать библиотеку с теми же самыми функциями, а затем попытались как-то это оправдать. Всё это крайне расстроило пользователей. Поскольку FFmpeg повёрнута лицом к пользователям, то мы, говорит Бош, теперь предоставляем и дублирующий libavresample API.
- Аудио-фильтры. В течение этого года в FFmpeg было интегрировано большое количество фильтров,особенно аудио-фильтров. Проект Libav проявил в итоге интерес к libavfilter, и после пары попыток написать всё с нуля, было решено вместо этого просто улучшить API. Это совершенно ясно означало, что FFmpeg был проигнорирована, а также то, что API был несколько раз сломан. Признавая, что Libav привнесла и несколько действительно полезных вещей, Бош порицает в этом случае очевидный синдром NIH (Not invented here).
Основной проблемой остаётся то, что внешние проекты, желающие поддерживать, как FFmpeg так и Libav, разработчики Libav просто бойкотируют. Похоже, что это исключительные последствия гордыни, а не чего-либо ещё, говорит Бош. Они просто не хотят признавать существование FFmpeg и хотят его исчезновения. Если разработчик хочет, чтобы какой-то код появился в Libav, его необходимо предоставить им напрямую: учитывая ежедневные слияния кода с FFmpeg и то, что большинство разработчиков не будут делать одну и ту же работу дважды, проект Libav может позволить себе игнорировать вообще всё и всё равно иметь какое-то количество входящего кода.
Почему же тогда Libav получила такое широкое распространение? Основные причины следующие: Политика пакетов. Сборщик пакетов для Debian/Ubuntu встал на сторону Libav в этом конфликте, и соответственно, в составе дистрибутива идут пакеты с Libav. Но пакет называется ffmpeg и при этом распространяется и явная ложь, утверждающая о том, что ffmpeg является устаревшим продуктом:
ffmpeg version 0.8.3-6:0.8.3-4, Copyright (c) 2000-2012 the Libav developers built on Jun 26 2012 09:26:41 with gcc 4.7.1THIS PROGRAM IS DEPRECATED
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Похоже, что это "исправлено" в Ubuntu, но на момент написания статьи присутствовало в Debian. Эта пропаганда очень сильно ударяет по проекту FFmpeg в целом.
Форк - это неплохая в целом вещь, но только при условии, что разработчики Libav признают себя форком. Но Libav представляет себя как замену FFmpeg, или же просто переименованием, а не форком. В целом, этот настрой можно охарактеризовать такими тезисами, заявленными разработчиками Libav: Libav -- это апстрим, всю работу делает Libav, Libav поддерживает большинство, а FFmpeg - это отсталый форк, в котором не ведётся никакой важной работы. (При том, что в списке рассылки разработчиков FFmpeg фиксируется более 1000 сообщений ежемесячно). Всё это, взятое вместе, заставляет пользователей поверить, что FFmpeg -- вовсе не такой важный проект, по сравнению с Libav.
Что дальше? Ясно, что объединить проекты в ближайшем будущем не удастся. Команда FFmpeg приняла решения, которые никогда не примут в Libav (например, обёртка для фильтров MPlayer в FFmpeg). С другой стороны, говорит Бош, оба проекта наверняка могут продолжать синхронизироваться (если Libav когда-нибудь "проснётся"), сохраняя различные способы разработки и даже разные цели: FFmpeg может попробовать предоставлять поддержку ещё большему количеству сумасшедших экзотических форматов, а Libav могла бы решить перестать поддерживать некоторые форматы, поскольку это большая нагрузка по поддержке. Признать эти различия с обеих сторон было бы хорошим делом ("мы поддерживаем всё" против "у нас только действительно нужное"), в отличие от высокомерного поведения по отношению к своим пользователям, которое мы наблюдаем сегодня, говорит Бош.