ATI ekran kartları için donanım hızlandırmasıyla video (Catalyst + XvBA + libva + ffmpeg + Mplayer)

Standard

nVidia kullanıcılarının vdpau sayesinde uzun süredir sahip olduğu GPU destekli video oynatımı özelliğini nihayet ATI XvBA (X-Video Bitstream Acceleration) sayesinde çalıştırabildim. Özellikle yüksek çözünürlüklü (HD) video oynatmada sıkıntı yaşıyorsanız video decoding yükünü işlemciden alıp ekran kartına vermek çok işinize yarayacaktır.

Aşağıdaki anlatım Arch Linux altında bunun nasıl yapılacağını anlatıyor, ancak diğer dağıtımlara da kolaylıkla uyarlanabilir.

Not: Bu yöntem için ben X.Org 1.7.6 ve Catalyst 10.4 beta kullandım. Catalyst sürücüsünü (en güncel sürüm 10.2) depolarında bulunduran dağıtımlar X.Org 1.6 kullanıyor zira catalyst 1.7’yi desteklemiyor. 2 gün önce ATI’nin Ubuntu’ya “el altından verdiği” 10.4 sürümü 1.7 destekliyor ve ben de bu sürücüyü kullanıyorum. Bu yöntem daha eski sürücülerde çalışıyor mu bilmiyorum.

1) Öncelikle “libva” paketini kurmamız gerekiyor. Paketin eski sürümü AUR’da var ama bu sürüm bende hata verdiği için PKGBUILD’i değiştirerek güncel sürümü kurdum. Güncel PKGBUILD’i paketin sayfasındaki yorumlara yazdım. Adımlar şöyle:

Buradan tarball’u indirip, PKGBUILD’i güncelleyip komut satırında

makepkg

ile paketi inşa ediyoruz. Ondan sonra

pacman -U libva-sds-0.31.0_1_11-2-i686.pkg.tar.gz

ile paketi kuruyoruz.

2) ATI’nin XvBA backend’i için VA-API sürücüsünü kuruyoruz.

Buradan tarball’u indirip, açıp, komut satırında

makepkg

komutu ile inşa ettikten sonra

pacman -U xvba-video-0.6.10-1-i686.pkg.tar.gz

ile paketi kuruyoruz.

3) FFMPEG’in en son sürümüne ihtiyacımız olduğundan, ffmpeg-svn’i kuruyoruz. Bunun için buradan tarball’u indirip, önceki adımdaki gibi paketi oluşturup kuruyoruz. (Not: ffmpeg oldukça büyük bir paket, derlemesi uzun sürebilir.)

4) Son olarak Mplayer’ın VA-API desteği ile derlenmesi gerekiyor. Bunun için buradan mplayer-vaapi paketini indiriyor, aynı yöntemle kuruyoruz.

5) İhtiyacımız olan tüm paketler kurulmuş durumda. Öncelikle herşey yolunda mı diye test edelim. Komut satırında

vainfo

komutunu veriyoruz. Çıktısı ekran kartına göre değişiklik gösterse de benim kartım (HD4330) için şu şekilde:

libva: libva version 0.31.0-sds6
Xlib:  extension "XFree86-DRI" missing on display ":0.0".
libva: va_getDriverName() returns 0
libva: Trying to open /usr/lib/va/drivers/fglrx_drv_video.so
libva: va_openDriver() returns 0
vainfo: VA API version: 0.31
vainfo: Driver version: Splitted-Desktop Systems XvBA backend for VA API - 0.6.10
vainfo: Supported profile and entrypoints
 VAProfileMPEG2Simple            :    VAEntrypointIDCT
 VAProfileMPEG2Main              :    VAEntrypointIDCT
 VAProfileH264High               :    VAEntrypointVLD
 VAProfileVC1Advanced            :    VAEntrypointVLD

6) “libva”in eski sürümüyle uyumluluk için bazı symlink’leri oluşturmamız gerekiyor:

sudo ln -s /usr/lib/libva-x11-0.31.0.6.so.1 /usr/lib/libva-x11-0.31.0.5.so.1
sudo ln -s /usr/lib/libva-glx-0.31.0.6.so.1 /usr/lib/libva-glx-0.31.0.5.so.1
sudo ln -s /usr/lib/libva-0.31.0.6.so.1 /usr/lib/libva-0.31.0.5.so.1

7) Şimdi gerçek bir video ile test edelim. Komut satırında

mplayer -vo vaapi:gl -va vaapi [dosya adı].avi

ile bir video başlatmayı deneyin. Benim test ettiğim video için komut satırındaki çıktı şöyle:

$ mplayer -vo vaapi:gl -va vaapi Flashforward.S01E11-E12.HDTV.XviD-2HD.avi
MPlayer SVN-r30589-4.4.3 (C) 2000-2010 MPlayer Team
144 audio & 329 video codecs
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing Flashforward.S01E11-E12.HDTV.XviD-2HD.avi.
AVI file format detected.
[aviheader] Video stream found, -vid 0
[aviheader] Audio stream found, -aid 1
VIDEO:  [XVID]  624x352  12bpp  23.976 fps  1027.5 kbps (125.4 kbyte/s)
Clip info:
 Software: MEncoder dev-SVN-r26940
[vo_vaapi] Using OpenGL rendering
libva: libva version 0.31.0-sds6
Xlib:  extension "XFree86-DRI" missing on display ":0.0".
libva: va_getDriverName() returns 0
libva: Trying to open /usr/lib/va/drivers/fglrx_drv_video.so
libva: va_openDriver() returns 0
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
[VD_FFMPEG] VA API accelerated codec.
Unsupported PixelFormat 61
[VD_FFMPEG] Trying pixfmt=1.
Movie-Aspect is undefined - no prescaling applied.
VO: [vaapi] 624x352 => 624x352 MPEG-4 VA API Acceleration
[vo_vaapi] Using 1:1 VA surface mapping
FATAL: Cannot initialize video driver.
Unsupported PixelFormat 61
[VD_FFMPEG] Trying pixfmt=0.
Unsupported PixelFormat 61
Could not find matching colorspace - retrying with -vf scale...
Opening video filter: [scale]
The selected video_out device is incompatible with this codec.
Try appending the scale filter to your filter list,
e.g. -vf spp,scale instead of -vf spp.
[VD_FFMPEG] Trying pixfmt=2.
Could not find matching colorspace - retrying with -vf scale...
Opening video filter: [scale]
The selected video_out device is incompatible with this codec.
Try appending the scale filter to your filter list,
e.g. -vf spp,scale instead of -vf spp.
[VD_FFMPEG] Trying pixfmt=3.
Movie-Aspect is undefined - no prescaling applied.
VO: [vaapi] 624x352 => 624x352 Planar YV12
Selected video codec: [ffodivx] vfm: ffmpeg (FFmpeg MPEG-4)
==========================================================================
==========================================================================
Opening audio decoder: [mp3lib] MPEG layer-2, layer-3
AUDIO: 48000 Hz, 2 ch, s16le, 128.0 kbit/8.33% (ratio: 16000->192000)
Selected audio codec: [mp3] afm: mp3lib (mp3lib MPEG layer-2, layer-3)
==========================================================================
[AO OSS] audio_setup: Can't open audio device /dev/dsp: Device or resource busy
AO: [alsa] 48000Hz 2ch s16le (2 bytes per sample)
Starting playback...
Movie-Aspect is 1.77:1 - prescaling to correct movie aspect.
VO: [vaapi] 624x352 => 624x352 Planar YV12
No bind found for key 'c'.                         %  6%  0.7% 0 0
A:   5.0 V:   5.0 A-V: -0.001 ct: -0.039 122/122  7%  9%  0.6% 0 0
Exiting... (Quit)

8 ) Video izlerken GPU’nun ne kadar kullanıldığını görmek isterseniz komut satırında

aticonfig --adapter=0 --od-getclocks

komutunu verip “GPU Load” kısmına bakabilirsiniz. Bahsettiğim video bende şöyle bir sonuç veriyor:

Adapter 0 - ATI Mobility Radeon HD 4300 Series
                            Core (MHz)    Memory (MHz)
           Current Clocks :    450           600
             Current Peak :    450           600
  Configurable Peak Range : [450-450]     [600-600]
                 GPU load :    39%

Gördüğünüz üzere artık video decoding için işlemci değil ekran kartı kullanılıyor. Artık siz de GPU ile hızlandırılmış video’nun keyfini çıkarabilirsiniz 🙂

Ekran görüntüsü:

Hardware Accelerated Video with ATI