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ü: