DVD の描画性能を上げたり、PC からテレビにDVD 映像を送ってテレビでDVD見よ うかと思って、Matrox の G450 を買ってみました。G400 は Matrox 標準の Linux デバイスドライバでテレビ出力をサポートしていたので当然 G450 も OK だろうとタカをくくっていたら、買った後に調べてみてびっくり。G450以降はテ レビ出力をサポートしていないじゃないすか!なんてこった。まあ前に使ってい た Permedia2 チップを使ったビデオカードより描画性能が格段によくなったので良かったのですが、なんか悔しい。
ということでいろいろ探してみたところ世の中にいらっしゃるんですねぇ、自分でTV出力できるようにする人が。試してみました。二つ方法があります。
1. フレームバッファ機能を使う
参考ページ:TV-out on the Matrox G450
2. DirectFB を使う
参考ページ:DIRECTFB MATROX G400/G450/G550 TV-OUT -HOWTO
両方とも 2nd ヘッドに TV出力します。
ここでは 2. を行います。
その理由は 2. は 1. に比べて発色がいい (1.も調節可能) 、動きがスムーズなどの利点がありますが、現在のところ、2nd ヘッドで TV 出力している間は 1st ヘッドが使えません。どうしてもTV出力している間に PC を使いたい人は 1. も試してみるといいでしょう。
以下の手順で行います。
1. kernel ソースのインストール、ソースへのパッチ
2. kernel 設定、再構築、インストール
3. 各種準備
4. DirectFB の make、インストール
5. Mplayer の make、インストール
6. Movie 再生
なお、ここでは rpm ファイルのビルドやインストール方法、kernel configuration の設定方法等基本的なことはわかっているものとして端折ってい るところもあります。また、カーネルやソフトのソースにパッチを充てたり手作業で編集したりしますので、試してみる人は各自の責任で十分注意して行って下さい。
kernel-source-2.4.20-0vl29.1.i386.rpm
kernel-headers-2.4.20-0vl29.1.i386.rpm
kernel-doc-2.4.20-0vl29.1.i386.rpm
これらをインストールします。
次にパッチを入手します。
パッチは DirectFB の tarball の中にあります。ver. 0.9.17 はバグがあるそうで、0.9.18 はインストールしてみたのですがうまく動作しなかったので 0.9.16 でやりました。
http://www.directfb.org/ からダウ
ンロードページを辿って DirectFB-0.9.16.tar.gz を取ってきます。
$ tar zxvf DirectFB-0.9.16.tar.gz
$ cd DirectFB-0.9.16/patches
このディレクトリにある、fusion-full-linux-2.4.20.patch.bz2, matroxfb-32mb.diff.bz2, を使います。
$ sudo cp fusion-full-linux-2.4.20.patch.bz2 /usr/src
$ sudo cp matroxfb-32mb.diff.bz2 /usr/src
$ cd /usr/src
$ sudo bunzip fusion-full-linux-2.4.20.patch.bz2
$ sudo bunzip matroxfb-32mb.diff.bz2
$ cd linux
$ patch -p1 < ../fusion-full-linux-2.4.20.patch
すると以下のように出力メッセージの最後の方で1つパッチに失敗している事が分かります。
patching file include/linux/miscdevice.h
Hunk #1 FAILED at 14.
1 out of 1 hunk FAILED -- saving rejects to file include/linux/miscdevice.h.rej
そこでパッチファイルの最後の方を見ると
+++ linux-2.4.20-fusion/include/linux/miscdevice.h 2002-12-05 18:44:32.000000000 +0100
@@ -14,6 +14,7 @@
#define PC110PAD_MINOR 9
#define ADB_MOUSE_MINOR 10
#define MK712_MINOR 15 /* MK712 touch screen */
+#define FUSION_MINOR 23 /* Fusion Device */
#define WATCHDOG_MINOR 130 /* Watchdog timer */
#define TEMP_MINOR 131 /* Temperature Sensor */
#define RTC_MINOR 135
のようになっていますので、include/linux/miscdevice.h を手動で編集します。
16 行目の後に
#define FUSION_MINOR 23 /* Fusion Device */
と言う行を追加し保存します。
ビデオ RAM が 32MB の G450 を使っている人は matroxfb-32mb.diff も充てま す。(私の持っているのは 16MB なので実際の動作は試せていませんが)
$ cd drivers/video/matrox
$ sudo patch <../../../../matroxfb-32mb.diff
とします。
DIRECTFB MATROX G400/G450/G550 TV-OUT -HOWTO では matroxfb-vsync-c2vline-irq-patch-2.4.19.bz2 も充てるように書かれて いますが、パッチがうまく行かず、上記のような手動パッチも自信の無いレベル であり(複雑)、かつ充てなくても結果として動いたため充てないこととします。
Processor type and features --->
[*] MTRR (Memory Type Range Register) support
Code maturity level options --->
Prompt for development and/or incomplete code/drivers
Character devices --->
Fusion Kernel Device (NEW)
Console drivers --->
Frame-buffer support --->
Support for frame buffer devices (EXPERIMENTAL) (NEW)
Matrox acceleration (EXPERIMENTAL) (NEW)
G100/G200/G400/G450/G550 support (NEW)
File systems --->
Virtual memory file system support (former shm fs)
DIRECTFB MATROX G400/G450/G550 TV-OUT -HOWTO では G450 と G550 は以下を設定するよう書かれていますが、Vine ソースには設定自体が無いので無視します。 G450 では動きます。
This is only for G450/G550:
G450/G550 second head support (mandatory for G550)
また、G400 固有の設定も上記ページにあります。
設定を保存したらカーネル、モジュールを再構築して lilo の設定をしておきます。
$ sudo mknod /dev/fusion c 10 23
tmpfs の設定をします。/etc/fstab に以下の行を追加します。
tmpfs /dev/shm tmpfs defaults
その他、G400 の場合は、i2c デバイスの用意が必要なようです。
ここまで終わったら新しく再構築したカーネルで PC をリブートします。
--prefix=%{_prefix} \
--enable-multi \
次に、BuildRequires の libpng バージョンを Vine の 1.0.12 にあわせて
BuildRequires: libpng-devel >= 1.2.0
と言う行を
BuildRequires: libpng-devel >= 1.0
に書き換えます。
そして、次の行を
%make
%install
rm -rf $RPM_BUILD_ROOT
%makeinstall_std
次の行に置き換えます。
make
%install
rm -rf $RPM_BUILD_ROOT
make DESTDIR=%{?buildroot:%{buildroot}} LIBRARY_PATH=%{?buildroot:%{buildroot}}%{_libdir} install
理由は聞かないで下さい。そのままビルドしたらここら辺でエラー終了したので何かの SPEC ファイルからコピーしてきてビルドしたらうまく行ったのです。
編集したら保存し、 ~/rpm/SPECS/ にコピーします。そして tar ball も ~/rpm/SOURCES/ にコピーします。そしてビルドします。
$ cd ~/rpm/SPECS/
$ rpm -ba directfb.spec
すると ~/rpm/RPMS/i386/ に directfb-doc-0.9.16-1.i386.rpm, libdirectfb-0.9.16-1.i386.rpm, libdirectfb-devel-0.9.16-1.i386.rpm が出来るのでインストールします。
$ sudo rpm -ivh directfb-doc-0.9.16-1.i386.rpm
$ sudo rpm -ivh libdirectfb-0.9.16-1.i386.rpm
$ sudo rpm -ivh libdirectfb-devel-0.9.16-1.i386.rpm
最後に /etc/directfbrc または ~/.directfbrc ファイルを作り次の二行を追加します。
matrox-crtc2
matrox-tv-standard=ntsc
$ rpm -ivh mplayer-0.90-1.src.rpm
とすると ~/rpm/SPECS/mplayer.spec がインストールされます。これをエディタで開き、以下の行をコメントにします。
104 行目:BuildRequires: gcc >= 3.1
106 行目:BuildRequires: gcc3 >= 3.1
130 行目:%{!?_without_ft2:BuildRequires: freetype-devel >= 2.0.9}
187 行目:BuildRequires: freetype-devel >= 2.0.9
284 行目:CFLAGS="-Wall -Wno-unused-variable -Wno-unused-function -Wno-unused-label -Wno-uninitialized -Wno-multichar"
286 行目:CFLAGS="$CFLAGS $RPM_OPT_FLAGS -fomit-frame-pointer -ffast-math -finline-functions -frename-registers"
288 行目:CFLAGS="$CFLAGS -pipe"
290 行目:export CFLAGS
そしてビルドします。
$ rpm -ba mplayer.spec
すると configure の処理の終わったあたりで次のような表示が流れて行くのが見えます。
Install prefix: /usr
Data directory: /usr/share/mplayer
Config direct.: /etc/mplayer
Byte order: Little Endian
Optimizing for: Runtime CPU-Detection enabled
Enabled optional drivers:
Input: streaming tv-v4l edl tv mpdvdkit2 vcd
Codecs: libdv libavcodec real xanim libvorbis
Audio output: oss sdl mpegpes(file)
Video output: xvidix sdl vesa jpeg png mpegpes(file) fbdev svga xmga mga dga xv x11 dfbmga directfb tdfxfb
Disabled optional drivers:
Input: tv-bsdbt848 cdda dvdnav dvdread dvdcss smb
Codecs: qtx opendivx xvid dshow/dmo win32 libmad liblzo gif
Audio output: sgi sun alsa esd arts dxr2 nas win32
Video output: bl zr dxr3 dxr2 directx gif89a aa ggi opengl 3dfx
上記の Enabled optional drives: の Video output: の所に dfbmga が見えま す。これで G450 で DirectFB を使った TV 出力用の設定がされたことになりま す。Disabled optiional drives: の Codecs: で qtx や xvid などがあります が、コーデック類は元々 RedHat 7.3 の RPM ダウンロードページで配布されている mplayer-codecs-*.rpm を使います。がしかし、私の環境では QuickTime は再生できなくなりました。(元々のバイナリでは音声無しでの再生でしたので影響はありませんが) これは目をつぶります。
ビルドが終わると以下のファイルが出来ます。
mplayer-0.90-1.src.rpm
mplayer-0.90-1.i386.rpm
mplayer-gui-0.90-1.i386.rpm
mplayer-common-0.90-1.i386.rpm
mencoder-0.90-1.i386.rpm
mplayer-tools-0.90-1.i386.rpm
mplayer-vidix-0.90-1.i386.rpm
mplayer-vidix-trident-0.90-1.i386.rpm
mplayer-vidix-mach64-0.90-1.i386.rpm
mplayer-vidix-mga-0.90-1.i386.rpm
mplayer-vidix-permedia-0.90-1.i386.rpm
mplayer-vidix-radeon-0.90-1.i386.rpm
mplayer-vidix-rage128-0.90-1.i386.rpm
このうちの mplayer, mplayer-common, mplayer-tools,
mplayer-vidix, mplayer-vidix-mga, をインストールし、また上記ダ
ウンロードページから mplayer-codecs-* (コーデック), mplayer-skin-* (GUI
のスキン), mplayer-font (フォント) をダウンロードしてきてインストールし
ます。
また TV 出力時には関係ありませんがお好みで mplayer-gui、mencoder、
mplayer-skin-* (GUI のスキン) もインストールします。
ただし、次の依存関係があります。
libmp3lame.so.0 は mencoder-0.90-1 に必要とされています
libogg.so.0 は mencoder-0.90-1 に必要とされています
libvorbis.so.0 は mencoder-0.90-1 に必要とされています
SDL >= 1.1.7は mplayer-0.90-1 に必要とされています
libogg.so.0 は mplayer-0.90-1 に必要とされています
libSDL-1.2.so.0 は mplayer-0.90-1 に必要とされています
libvorbis.so.0 は mplayer-0.90-1 に必要とされています
mplayer-skinは mplayer-gui-0.90-1 に必要とされています
libogg.so.0 は mplayer-gui-0.90-1 に必要とされています
libSDL-1.2.so.0 は mplayer-gui-0.90-1 に必要とされています
libvorbis.so.0 は mplayer-gui-0.90-1 に必要とされています
libmp3lame.so.0 は lame-devel に入っています。 Rpmfind.Net の lame
の検索結果の lame-3.92-3.asp.i386.rpm と、lame-devel
の検索結果の lame-devel-3.92-3.asp.i386.rpm がすんなりインストールできまし
た。
libogg.so.0、libvorbis.so.0 は Ogg/Vorbis のダウンロード
ページから libogg、libogg-devel、libvorbis、libvorbis-ogg の RPM を
持ってきて入れましょう。
SDL、libSDL-1.2.so.0 は VinePlus にある SDL
を入れます。
その他、DVD を再生する場合は libdvdread 等をインストールしましょう。DVD メニューを使いたい場合は、libdvdnav をインストールし、上記 Mplayer の configure で --enable-dvdnav を追加すれば OK です。ただし、Mplayer の DVD メニューの使い勝手はあまり良くなく動きも完全ではありません。ちなみに libdvdnav は最新の 0.1.9 では Mplayer のビルドがうまく行かず、0.1.3 まで遡らなければいけませんでした。
PC は LAN につながっていてもう 1台 telnet での操作用の PC があるのが好ましいです。と言うのも先に述べたように、再生中の PC は 1st ヘッドが使えなくなるからで す。Mplayer はコンソール上でキーボード操作できるので画面が見えなくても操作できますが、X Windows でマウスが動いたことによってアクティブウィンドウが変わったりしたら目も当てられません。また TV のある部屋と再生PCのある部屋が別々の場合、LAN でつながったノートPCからリモコン的に操作することも出来て便利です。
再生は次のようにするだけです。test.avi というファイルがあるとします。
$ mplayer -vo dfbmga -fs test.avi
DVD を再生する場合は
$ mplayer -vo dfbmga -fs -dvd 1
再生しているときに p を押すとポーズしたり(再生再開は任意のキー)、矢印キー
で先に飛ばしたり出来ます。詳しくは Mplayer の man ページの最後の方の
KEYBOARD CONTROL を見てみましょう。
下の写真はノートPCから telnet で G450 から TV 出力する再生用 PC を操作してムービー
を再生しているところです。コンソール上で p キーを押しポーズされているのが分かります。(画像をクリックすると拡大します)

なんか、PC の画面や家庭用 DVD プレーヤで再生するのに比べて暗部のグラデーションのディ ザが目立つような気がします。DivX ファイルを再生するときはもっと顕著で、 ディザがブロック状になります (ビットレートにもよるのかも知れませんが) 。