Pull to refresh

ATI+Fedora17 и желание посмотреть фильмы в хорошем качестве с привычной скоростью

Reading time 6 min
Views 16K
Доброго времени суток! Решил поделиться с Вами историей, о совсем не тривиальном, как оказалось, решении проблемы воспроизведения качественного видео потока на Fedora 17 x86-64. До недавнего времени, проводя свободные часы за своим нетбуком (Asus 1215B, E-450, 8Gb RAM, 500Gb SATA), я считал, что меня всё устраивает. Хождение по интернетам, музыка, фильмы (в основном dvdrip'ы), игры (сейчас модно в старый-добрый Half-Life зарубить), всё работало без нареканий, пока мне не захотелось посмотреть фильм с пометкой 1080p. Стоявшая при покупке Windows 7 Home x64, в связке с K-Lite+MPC, без особых проблем справлялась с такими задачами, поэтому я, без задней мысли, дважды ткнул курсором в файл и приготовился к просмотру. Сказать что видео поток тормозил — ни сказать ничего! Небезызвестный параметр «Frames Per Second» превратился в «Seconds Per Frame», а настроение упало ниже плинтуса. И началось курение мануалов!

Первый же поисковой запрос, по аппаратному декодированию видео потока, отправил меня сюда. Всё просто и по пунктам:


Конечно, какие могут быть проблемы, если все пакеты есть в репозитории? Но это для Ubuntu. В репозиториях для Fedora, я нашел только проприетарный драйвер от AMD, он же fglrx. На XvBA не было и намёка.

Очередные поисковые запросы привели меня на страничку, на которой пользователь под ником canyon рассказывает где взять пакеты именно для Fedora17, и как их правильно установить. Он настаивал на установке драйвера fglrx именно с сайта AMD, так как по его опыту, тот, который в репозиториях — «сломан», в следствии чего, аппаратное декодирование не работает. С сайта, так с сайта. Тем более, что версия драйвера выгодно отличалась (13.1 vs 12.10). Загрузка прошла успешно:

$ wget -c http://www2.ati.com/drivers/linux/amd-driver-installer-catalyst-13.1-linux-x86.x86_64.zip
$ unzip amd-driver-installer-catalyst-13.1-linux-x86.x86_64.zip
$ chmod +x amd-driver-installer-catalyst-13.1-linux-x86.x86_64.run

И я приступил к выполнению пунктов мануала. Вся ирония его фразы «Quick How-To», была осознана мной в полной мере. Быстрый how-to, на практике оказался кратким how-to (видимо трудности перевода). Скажу сразу. Перед началом всех действий, в моей ОС, вместе с пакетом «mesa-libGL», стоял еще один пакет — «mesa-libGL-devel», который подтянул за собой многие зависимости (включая *.h файлы), требуемые для сборки XvBA драйвера с поддержкой GLX. И так, всё по порядку. Запуская установшик проприетарного драйвера от AMD:

$ sudo ./amd-driver-installer-catalyst-13.1-linux-x86.x86_64.run

Я получал крах за крахом. Зависимости наше всё! По итогу, лично моей системе, не хватало пакетов «kernel-headers» и «kernel-devel», но даже после их установки «/usr/share/ati/fglrx-install.log» был полон как никогда. Установщик ругался на отсутствие файла «/lib/modules/3.7.6-102.fc17.x86_64/build/include/linux/version.h». Рекурсивный поиск по папкам нашел «version.h» по адресу «/usr/include/linux/version.h». Убедившись, что этот файл принадлежит текущей версии ядра — я скопировал его по требуемому адресу.

$ uname -r
$ rpm -qf /usr/include/linux/version.h 
$ sudo cp /usr/include/linux/version.h /lib/modules/3.7.6-102.fc17.x86_64/build/include/linux/version.h

После этого, драйвер всё-таки установился, но перезапускать систему я не рискнул, так как всё в том же «fglrx-install.log» была запись (выдержка):

/usr/lib/modules/fglrx/build_mod/2.6.x/firegl_public.c
ошибка: "VM_RESERVED" undeclared (first use in this function)
[Error] Kernel Module : Failed to compile kernel module - please consult readme.

Переменная не определена — модуль ядра не собран. Беда! Поиск и ещё раз поиск. Вот оно. Пользователь под ником lx6544 перепостил мануал, в котором эта проблема решалась так:

В фале «/usr/lib/modules/fglrx/build_mod/2.6.x/firegl_public.c», после 100-й строки, добавлялось определение переменной «VM_RESERVED»:

#ifndef VM_RESERVED
#define VM_RESERVED (VM_DONTEXPAND | VM_DONTDUMP)
#endif

Следом, пересобирался и устанавливался модуль ядра:

$ cd /lib/modules/fglrx/build_mod/
$ sudo ./make.sh

$ cd /lib/modules/fglrx/
$ sudo ./make_install.sh

Обе пары команд вернули мне «done» и я выполнил перезагрузку ОС.

$ sudo aticonfig --initial -f
$ reboot

Проприетарный драйвер был установлен. Работал исправно. Далее, по мануалу от пользователя canyon, был rebuild и установка RPM пакета под текущую ОС:

$ sudo yum install rpm-build
$ rpmbuild --rebuild ~/libva-xvba-driver-0.8.0-2.fc17.src.rpm

И тут крах. В окне терминала красовалось «очень» информативное сообщение:

checking for XvBA... no
configure: error: you need XvBA to build this package

Не говорившее мне ничего особенного. В «~/rpmbuild/BUILD/xvba-driver-0.8.0/config.log» уже более конкретно было написано:

configure:13374: gcc -o conftest -O2 -g -I/usr/include  -L/usr/lib64 conftest.c -lrt -lpthread -lm  -lXvBAW -lX11 -lXext -lGL -ldl >&5 
conftest.c:44:21: fatal error: amdxvba.h: No such file or directory 
compilation terminated.

Файл «amdxvba.h»? Я уже читал про него!

$ wget -c http://developer.amd.com/wordpress/media/2012/10/xvba-sdk-0.74-404001.tar.gz
$ tar -xf xvba-sdk-0.74-404001.tar.gz include/amdxvba.h
$ sudo cp include/amdxvba.h /usr/include/

Следом, на всякий случай, я проверил все библиотеки указанные для «gcc» в предыдущей строке лога. Не хватало только двух symlink'ов на «-lXvBAW»

$ sudo ln -s /usr/lib/libXvBAW.so.1 /usr/lib/libXvBAW.so 
$ sudo ln -s /usr/lib64/libXvBAW.so.1 /usr/lib64/libXvBAW.so 

После создания symlink'ов конфигурация прошла успешно:

VA-API version ................... : 0.32.1
GLX support ...................... : yes
Cg compiler ...................... : no
Enable debugging information ..... : yes
Enable XvBA tracer ............... : yes

А вот сборка нет. Компилятор ругался на неизвестный тип переменной (PFNGLMULTITEXCOORD2FPROC), указанной в файле «utils_glx.h». Первая же ссылка в поисковой выдаче прояснила ситуацию. Да, действительно:

В файле «/usr/include/GL/gl.h», переменная «GL_VERSION_1_3», была однозначно определена:

#define GL_VERSION_1_3 1

В следствии чего, в файле «/usr/include/GL/glext.h» (версия 85), определение типа «PFNGLMULTITEXCOORD2FPROC» пропускалось:

#define GL_GLEXT_VERSION = 85
...
#ifndef GL_VERSION_1_3
...
typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);
...
#endif

Хорошо, файл «/usr/include/GL/glext.h» был поправлен:

$ sudo gedit /usr/include/GL/glext.h

#if GL_GLEXT_VERSION >= 85
typedef void (*PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);
#endif

А RPM пакет успешно собран и установлен.

$ rpmbuild --rebuild ~/libva-xvba-driver-0.8.0-2.fc17.src.rpm
$ sudo yum install libva-utils ~/rpmbuild/RPMS/x86_64/libva-xvba-driver-0.8.0-2.fc17.x86_64.rpm

Вызов команды «vainfo» больше не выдавал ошибку, а запуск VLC плеера с параметром «--ffmpeg-hw» убедил меня в том, что аппаратное декодирование заработало:

$ vainfo

libva: va_getDriverName() returns 0
libva: Trying to open /usr/lib64/dri/fglrx_drv_video.so
libva: va_openDriver() returns 0
vainfo: VA-API version: 0.32 (libva 1.0.16)
vainfo: Driver version: Splitted-Desktop Systems XvBA backend for VA-API - 0.8.0
vainfo: Supported profile and entrypoints
      VAProfileH264High               :	VAEntrypointVLD
      VAProfileVC1Advanced            :	VAEntrypointVLD

$ vlc --ffmpeg-hw ~/1080p.mkv 

VLC media player 2.0.5 Twoflower (revision 2.0.5-0-g1661b7d)
...
libva: VA-API version 0.32.1
Xlib:  extension "XFree86-DRI" missing on display ":0".
libva: va_getDriverName() returns 0
libva: Trying to open /usr/lib64/dri/fglrx_drv_video.so
No accelerated IMDCT transform found
libva: va_openDriver() returns 0
xvba_video: XVBA_GetSurface(): status 2
[0x7f5628c1ada8] avcodec decoder: Using VA API version 0.32 for hardware decoding.

Воспроизведение было четкое и плавное. Вот теперь точно — PROFIT!

UPDATE1:
Как, правильно, заметил norguhtar, копировать файл «version.h» не есть хорошо, лучше править исходник. Поэтому, я набросал второй способ установки проприетарного драйвера от AMD:

$ wget -c http://www2.ati.com/drivers/linux/amd-driver-installer-catalyst-13.1-linux-x86.x86_64.zip
$ unzip amd-driver-installer-catalyst-13.1-linux-x86.x86_64.zip
$ chmod +x amd-driver-installer-catalyst-13.1-linux-x86.x86_64.run
$ sudo -s
# ./amd-driver-installer-catalyst-13.1-linux-x86.x86_64.run --force
# cp -a /usr/lib/modules/fglrx /usr/lib/modules/fglrx_backup
# for i in `find /usr/lib/modules/fglrx/ -type f`; do cat $i | sed -e "s/linux\/version\.h/generated\/uapi\/linux\/version\.h/g" > ${i}_tmpext; done
# for i in `find /usr/lib/modules/fglrx -name '*_tmpext'`; do mv -vf $i `echo $i | sed s/\_tmpext//`; done

# gedit /usr/lib/modules/fglrx/build_mod/2.6.x/firegl_public.c

#ifndef VM_RESERVED
#define VM_RESERVED (VM_DONTEXPAND | VM_DONTDUMP)
#endif

# cd /usr/lib/modules/fglrx
# chmod +x make_install.sh build_mod/make.sh
# cd build_mod
# ./make.sh
# cd ..
# ./make_install
# aticonfig --initial -f
# exit
$ reboot

Этот способ оставляет в покое файл «version.h». Вместо него, правятся исходники модуля ядра. Перебираются все файлы в папке с исходником и каждое вхождение «linux/version.h» заменяется на «generated/uapi/linux/version.h». После чего, модуль собирается и устанавливается.

Файлы для загрузки:
libva-xvba-driver-0.8.0-2.fc17.x86_64.rpm
libva-xvba-driver-0.8.0-2.fc17.src.rpm

Список литературы:
Unified Video Decoder
Video Acceleration API
X-Video Bitstream Acceleration
Аппаратное декодирование видео на AMD Radeon в Ubuntu (mplayer)
Воспроизведение HD-video
Tags:
Hubs:
+14
Comments 37
Comments Comments 37

Articles