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

от автора

Доброго времени суток! Решил поделиться с Вами историей, о совсем не тривиальном, как оказалось, решении проблемы воспроизведения качественного видео потока на Fadora 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» был поправлен, а 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!

Список литературы:
Unified Video Decoder
Video Acceleration API
X-Video Bitstream Acceleration
Воспроизведение HD-video

ссылка на оригинал статьи http://habrahabr.ru/post/169893/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *