試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

NVIDIA製GPUでMPEG1/2ビデオの再生を軽くする(MPlayer)

mplayer-1.0_rc1_p20070824から、VIDEO_CARDSに「nvidia」が指定できるようになり、「xv」「xvmc」のUSEフラグとともに指定する*1ことで、XvMC(X-Video Motion Compensation)により、GPUMPEG-1もしくはMPEG-2のビデオのデコードに使用できるようになり、MPEG1/2ビデオの再生が軽くなる。

[引用]ファイル名: /usr/portage/media-video/mplayer/mplayer-1.0_rc1_p20070824.ebuild より

	if use xv; then
		if use xvmc; then
			myconf="${myconf} --enable-xvmc"
			if use video_cards_nvidia; then
				myconf="${myconf} --with-xvmclib=XvMCNVIDIA"
			elif use video_cards_i810; then
				myconf="${myconf} --with-xvmclib=I810XvMC"
			else
				myconf="${myconf} --with-xvmclib=XvMCW"
			fi
		else
			myconf="${myconf} --disable-xvmc"
		fi
	else
		myconf="${myconf} --disable-xv --disable-xvmc"
	fi

とあるので、ebuildファイルとしては、「xv」と「xvmc」のUSEフラグとVIDEO_CARDS=nvidiaがあれば有効にしてくれるようになっている。しかし、出力ドライバには表示されず、

$ mplayer -vo help
(中略)
有効な映像出力ドライバ:
        xv      X11/Xv
        x11     X11 ( XImage/Shm )
        xover   General X11 driver for overlay capable video output drivers
        gl      X11 (OpenGL)
        gl2     X11 (OpenGL) - multiple textures version
        dga     DGA ( Direct Graphic Access V2.0 )
        null    Null video output
        mpegpes Mpeg-PES file
        yuv4mpeg        yuv4mpeg output for mjpegtools
        png     PNG file

lddしても、ライブラリ(libXvMCNVIDIA.so)にはリンクしていなかった。
適当なディレクトリにソースを展開してconfigureしてみても

Checking for XvMC ... no 

となってしまった(ビルドログを見てもnoになっていた)。configure.log(config.logではない)を見ると

x86_64-pc-linux-gnu-gcc -Wall -Wno-switch -Wpointer-arith -Wredundant-decls -O4 -march=k8 -mtune=k8 -pipe -ffast-math -fomit-frame-pointer  -I/usr/X11R6/include     -lncurses   -lXext -lX11 -lpthread -lXv  -o /tmp/mplayer-conf-16963-8577 /tmp/mplayer-conf-26951-8577.c -lXvMC -lXvMCNVIDIA
/tmp/mplayer-conf-26951-8577.c:3:36: error: X11/extensions/XvMClib.h: No such file or directory
/tmp/mplayer-conf-26951-8577.c: In function 'main':
/tmp/mplayer-conf-26951-8577.c:5: warning: implicit declaration of function 'XvMCQueryExtension'
/tmp/mplayer-conf-26951-8577.c:6: warning: implicit declaration of function 'XvMCCreateContext'

XvMC関係のライブラリのヘッダファイルが無いとのこと。.soファイルは入っているのに、ヘッダだけ用意されていないのだろうかと思い、調べたのだが、NVIDIAドライバのパッケージにはないようだ。あるのはOpenGL関係のヘッダファイルだけ。

$ qlist nvidia-drivers | grep include
/usr/lib64/opengl/nvidia/include/glxext.h
/usr/lib64/opengl/nvidia/include/glx.h
/usr/lib64/opengl/nvidia/include/glext.h
/usr/lib64/opengl/nvidia/include/gl.h
/usr/lib32/opengl/nvidia/include/glxext.h
/usr/lib32/opengl/nvidia/include/glx.h
/usr/lib32/opengl/nvidia/include/glext.h
/usr/lib32/opengl/nvidia/include/gl.h

念のため、配布されている.runファイルを-xで直接開けてみたが、やはりGLのものしかなかった。

システムには、まだ「libXvMC」のパッケージが入っていなかったため、これを入れてみたところ

$ sudo emerge -av libXvMC

無事に検出されて

Checking for XvMC ... yes (using XvMCNVIDIA)

使用できるようになった。

有効な映像出力ドライバ:
        xv      X11/Xv
        x11     X11 ( XImage/Shm )
        xover   General X11 driver for overlay capable video output drivers
        gl      X11 (OpenGL)
        gl2     X11 (OpenGL) - multiple textures version
        dga     DGA ( Direct Graphic Access V2.0 )
        null    Null video output
        xvmc    XVideo Motion Compensation
        mpegpes Mpeg-PES file
        yuv4mpeg        yuv4mpeg output for mjpegtools
        png     PNG file

使用するには

$ mplayer -vo xvmc -vc ffmpeg12mc [MPEG1/2のファイル]

とする。
-vo xvと比べて軽くなっているのが実感できた。しかし、MPEG1/2限定なのがつらいところ。また、Compiz Fusionを使用しているときに、ちらつきが起きたりゴミが出たりするのも気になった。ウィンドウマネージャを事前に別のものに切り替えて回避するのが現実的?
http://nouveau.freedesktop.org/wiki/XvMC
には、GPUの支援によるビデオデコードに関するその他の方式についても、概要が書かれているので、参考になるかもしれない。

環境の関連項目

*1:XvMCは、Xv(X video extension)の拡張