Самостоятельная сборка VLC 2.0.1 под Linux

Медиакомбайн VLC вызывает у меня исключительно теплые чувства. Отличная поддержка видео- и аудиоформатов без установки кодеков, широкие возможности и высокое качество работы сделали эту программу неотъемлемым атрибутом  компьютеров, за которыми я провожу свое время.

Я стараюсь использовать актуальные версии этого приложения, и вчера я решил обновить VLC в своём Debian Squeeze. Выкачав последние исходники, я обнаружил, что не могу их скомпилировать.

Вообще, сборка последних версий VLC в таком "старье", как замшелое окружение стабильных версий Debian  - занятие, требующее дополнительных телодвижений. Как минимум, придется обновить пакет libavcodec52 для получения совместимой версии кодировщика ffmpeg. Можно делать это вручную, можно подключить репозиторий Debian Multimedia и обновить пакет оттуда. Я лично подключил репозиторий.

Располагая свежим ffmpeg, я выкачал исходники VLC 2.0.1, но при компиляции получил странным образом выглядящую ошибку:

switcher.c: In function 'VideoGetBuffer':

switcher.c:847:34: error: 'FF_I_TYPE' undeclared (first use in this function)

switcher.c:847:34: note: each undeclared identifier is reported only once for each function it appears in

switcher.c:856:34: error: 'FF_P_TYPE' undeclared (first use in this function)

switcher.c:935:10: error: 'FF_B_TYPE' undeclared (first use in this function)

 

Пройдясь по спискам рассылки VLC, я обнаружил источник проблемы.

Появляется вышеуказанная ошибка при компиляции исходников с опцией --enable-switcher . В заголовочном файле исходников ffmpeg-0.10.2 (/usr/include/libavcodec/avcodec.h) присутствует  вот такое определение:

[code]

#if FF_API_OLD_FF_PICT_TYPES

/* DEPRECATED, directly use the AV_PICTURE_TYPE_* enum values */

#define FF_I_TYPE AV_PICTURE_TYPE_I ///< Intra

#define FF_P_TYPE AV_PICTURE_TYPE_P ///< Predicted

#define FF_B_TYPE AV_PICTURE_TYPE_B ///< Bi-dir predicted

#define FF_S_TYPE AV_PICTURE_TYPE_S ///< S(GMC)-VOP MPEG4

#define FF_SI_TYPE AV_PICTURE_TYPE_SI ///< Switching Intra

#define FF_SP_TYPE AV_PICTURE_TYPE_SP ///< Switching Predicted

#define FF_BI_TYPE AV_PICTURE_TYPE_BI

#endif

[/code]

Т.е. использование констант FF_*_TYPE является устаревшим для свежих версий ffmpeg. Что есть свежие версии? Ответ на вопрос дает файл /usr/include/libavcodec/version.h:

[code]#define FF_API_OLD_FF_PICT_TYPES (LIBAVCODEC_VERSION_MAJOR < 54)[/code] Т.е. для версий ниже 54ой следует использовать старые константы.

Казалось бы, должно работать. Авторы исходников позаботились об совместимости со старыми версиями библиотек. Но авторы VLC, по-видимому, не учли этот момент, и в исходниках самого VLC в файле /modules/codec/avcodec.h, который как раз и включен в злосчастный switcher.c, мы находим определение:

[code]#if LIBAVCODEC_VERSION_MAJOR < 54

# define AV_PICTURE_TYPE_B FF_B_TYPE

# define AV_PICTURE_TYPE_I FF_I_TYPE

# define AV_PICTURE_TYPE_P FF_P_TYPE[/code]

Собранные вместе, эти файлы создают зацикленные друг на друга директивы (AV_PICTURE_TYPE_I -> FF_I_TYPE -> AV_PICTURE_TYPE_I), что сводит с ума компилятор GCC, и он попросту игнорирует определение всех этих констант.

Ричард Гренвиль, выполнивший этот анализ кода, просто заменил все константы FF_*_TYPE на AV_PICTURE_TYPE_* в файле /modules/stream_out/switcher.c. Я сделал то же самое, и VLC 2.0.1 был успешно собран и установлен.

 

Подведем итоги

Чтобы заполучить VLC 2.0.1 на Debian 6 Squeeze (или другом любом дистрибутиве с libavcodec версии меньше 54), нужно:

  1. Заменить все константы FF_*_TYPE на AV_PICTURE_TYPE_* в файле /modules/stream_out/switcher.c
  2. Подключить репозиторий Debian-Multimedia и выполнить apt-get install libavcodec52
  3. Выполнить команды компиляции, которые указаны в руководстве по самостоятельной сборке плеера:
    [code]apt-get dep-build vlc
    ./bootstrap
    ./configure  --prefix=/usr --enable-xvideo --enable-sdl --enable-wma-fixed --enable-shine --enable-omxil --enable-iomx --enable-crystalhd --enable-mad --enable-avcodec --enable-libva --enable-dxva2 --enable-switcher --enable-avformat --enable-swscale --enable-twolame --enable-real --enable-a52 --enable-dca --enable-flac --enable-libmpeg2 --enable-vorbis --enable-tremor --enable-speex --enable-theora --enable-dirac --enable-x264 --enable-png --enable-libass --enable-kate --with-x --enable-fontconfig --enable-freetype --enable-pulse --enable-alsa --enable-oss --enable-portaudio --enable-jack --enable-skins2 --enable-libtar --enable-qt4 --enable-xosd
    make
    checkinstall --nodoc --fstran=no[/code]

Кстати, мою готовую сборку для Debian x64 вы можете заполучить здесь. Приятной компиляции!

💡Узнавайте о новых статьях быстрее. Подпишитесь на наши каналы в Telegram и Twitter.

Судя по тому, что вы читаете этот текст, вы дочитали эту статью до конца. Если она вам понравилась, поделитесь, пожалуйста, с помощью кнопок ниже. Спасибо за вашу поддержку!

Автор: Сергей Ткаченко

Сергей Ткаченко создал этот сайт в далёком 2009 году, и с тех пор продолжает над ним работать, публикуя новые материалы о Windows и её приложениях практически каждый день.

Самостоятельная сборка VLC 2.0.1 под Linux: 4 комментария

  1. вот так вот пишет мне на 2.6.32-5-686 debian 6

    ~/vlc-2.0.1# apt-get build-dep vlc
    Чтение списков пакетов... Готово
    Построение дерева зависимостей
    Чтение информации о состоянии... Готово
    Пакеты, имеющие неудовлетворённые зависимости:
    libnotify-dev : Зависит: libgtk2.0-dev (>= 2.18) но он не будет установлен
    librsvg2-dev : Зависит: libgtk2.0-dev (>= 2.16.0-1) но он не будет установлен
    Зависит: libcairo2-dev (>= 1.2.0) но он не будет установлен
    xulrunner-dev : Зависит: libnss3-dev но он не будет установлен
    E: Зависимости для сборки vlc не могут быть удовлетворены.

    что с этим делать не знаю , подскажите плиззз

  2. http://packages.debian.org/squeeze/libgtk2.0-dev, текущая версия 2.20.1-2.

    По каким-то причинам пакетный менеджер у вас этот пакет не находит
    Ваш /etc/apt/sources.list покажите, плиз?

Обсуждение закрыто.

css.php