J-PRO.INFO - divxより実はCPU低負荷

H.264 + UVD(DXVA)

 CPUとGPU(VGA)を変更したことによって気づいたH.264とデコードの関係を少し書いてみた。それだけ。
偏った知識で書いていますので間違っている可能性大です。  更新日:2008/09/18

■環境とか

 なお、書き始める前に環境を書いておきます。
:Pentium D930@3GHz + DDRII 8GB(3.2GB) + AMD HD2600XT
+ Windows XP SP3 32bit + Catalyst v8.9(09/2008) + DirectX v9.0c(08/2008)
(※HD2xxx系はWIN2000サポート外。以前はCatalyst 7.12(omega) + DirectX 9.0c March.2008にて検証
 ※今回は遂にWindows XPにOSを変えてしまいました。デュアルディスプレイの為に・・・

 またちょうど新規インストールした際にCatalyst 8.9が公開されたのでそれにて実証してみました。
なお、UVDに関してはCatalyst 8.8がバグ持ちでHotfix適用が必要となります。でないとUVDが使えません。
Catalyst 8.8利用の方は HD2xxx AGP Hotfix を適用してみてください(Registry Tweaksも忘れずに)

■UVD(Unified Video Decorder)を利用するため

 ドライバを入れただけで利用できない厄介ものがAMD AVIVOテクノロジー。ドライバも月刊Catalystというように、
毎月修正・更新のあるものなので最新の情報と書いても古くなってしまうことをご了承ください。

 ここではとりあえず Catalyst v8.9 をおすすめします。理由はというと上に書きましたが Catalyst v8.8 では
修正を適用しないとUVDが利用出来ない為です。試しにいま使っている限り画面の描画が改善されたりと、
バグ修正もいろいろと行われています。ちなみに HD2900はUVD未サポートなので要注意。

 プレーヤーは MediaPlayerClassic - Homecinema SVN を利用しています。
ffdshowを入れなくても内蔵のffdshowでソフトウェアデコードができることとDXVAの使用・未使用が容易に確認できる為です。
開発中のものなのでバージョンによってかなり安定性が変わってしまうのが残念ですが、それを補える機能の良さがあります。

 下記デコードのテストなどには Cyberlink PowerDVD に付属しているDirectshow Filterである CL264dec.ax
利用しています。SplitterはHalli Media SplitterかMPC内蔵のMP4 Splitterを利用しています。CoreAVCやffdshow内蔵の
デコーダでもよかったのですが、ffdshowに代表されるx264・libavcodecのほうが多機能ですが時々再生できるできないといった
ベースラインを考えた結果、Cyberlink H.264 Decoderを採用しました。明記ない限り v2.2.0.624 を利用しました。

 インストールの時に大事なのはドライバを正常にクリーンインストールすることとRegistry Tweaksを適用することです。
デフォルトの状態で一応UVDが利用可能なのですが、その状況をDXVA Checkerを利用すると以下のように(クリックで拡大)

catalyst-8.9-hd2600-normal.pngcatalyst-8.9-hd2600-tweak.png

 左が適用前で右が適用後です。一部項目が無効かされているのがわかると思います。一部再生できないファイルがあるとはいえ、
下記の仕様に従って作ったファイルすら再生してくれないのは残念です。この設定はレジストリにて変更が可能です。

 AMD HD Registry Tweaks (http://home.comcast.net/~exdeus/ati-hd2x00/) 適用後は再起動が必要です!
  VBSスクリプトで英文表記ですが YES -> NO(HD2400ならYES) -> YESx4 のように答えればokです。

 このような感じで使えるようにして行ったのが以下のサンプル再生です(サンプルにはMGS4 Trailer 2008を使用)

catalyst-8.9-hd2600-normal-ffdshow-pv.png
 実寸フルサイズは3200x1200(サイズ注意:3.8MB:PNG)

catalyst-8.9-hd2600-tweak-dxva-pv.png
 実寸フルサイズは3200x1200(サイズ注意:3.8MB:PNG)

 

■デコード負荷の現実?

 以前の環境(WIN2000)でのCPU負荷テスト(1280x720:60fps@L4.1の場合)

・Cyberlink H.264/AVC Decoder (Disable DXVA)
h264uvd_1.png
動きが激しいところではコマ落ち。

・Cyberlink H.264/AVC Decoder (Enable DXVA)
h264uvd_2.png
どこが再生しているのか?と見えるぐらい低負荷。

 今の環境(WINXP+)でのCPU負荷テスト(1920x1080:30fps@L4.1の場合)

・Cyberlink H.264/AVC Decoder (Disable DXVA)
h264-1920x1080-disable.png
動きが激しいところではコマ落ちている気がする。

・Cyberlink H.264/AVC Decoder (Enable DXVA)
h264-1920x1080-enable.png
無問題に再生。負荷も一定。

 

■DXVAが使えるものとそうでないもの

 近頃はzoomeに加えてニコニコ動画でもH.264に対応したので
触れる機会は多いと思いますが、その中でもサポートが効くものと
そうでないものがあることに気づくはずです。それは海外でも同じで
熱心に議論がされています。ここではフォーラムに掲載されていた
非常に有用な情報について大雑把に日本語翻訳してみようと思います。
http://www.avsforum.com/avs-vb/showthread.php?t=972503


ハードウェア互換性とDXVAの為の x264 エンコードオプション

 このスレッドは投稿されたハードウェアアクセラレーションが上手く機能する
MKVを作成することに関する記事を元に派生したものです。(※ATI HD2xxx、
HD3xxx、nVIDIA GT8xxx 等に搭載されている動画再生補助機能を指します)

 次の設定はPS3のようなプレイヤー(といいつつPS3のみを指すと思います)と
ATI、nVIDIAのVGAボードとCyberlink H.264/AVC Decoder(PowerDVD7)を
用いてかつ、DXVAによるスムーズ再生(※重要)を行えると思われるものです。

 なお、この設定はPower DVD、Zoom Player、Media Player Classic - H.C.
とOverlay Mixier、VMR7、VMR9にて動作することを確認しています。
(SplitterにはHaali Media Splitter、Nero Digital Parserを使用)

□ボトムライン

 HDコンテンツのスムーズ再生の為にはHigh Profile@Level 4.1でエンコードする
必要があります(※H.264はプロフィールがややこしいです。近いものでLevel 4.2が
ありますが、スムーズ再生を行えませんでした。やっぱり4.1が無難のようです)。
エンコード時に"--level 4.1"オプションが互換性のために必須です。ベストなのは
MeGUIのPS3-PDプロフィール(B-pyramid無効)です。

--level 4.1 --ref 3 --mixed-refs --bframes 3 --b-rdo --bime --weightb --direct auto --subme 6 --trellis 1 --analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-bufsize 8192 --vbv-maxrate 25000 --me umh --merange 12 --progress

 (※次はSDコンテンツでLevelの違いだけですので省略。また補足ですが、
 ↑のオプションにはビットレート操作系のオプションがないので注意です。また、
 原文のはVBVバッファの指定がないと怒られますので勝手に追加してあります)

□詳細

 (かなり意訳)実際のところは某Blu-ray・HD DVDの標準規格として
HDコンテンツはHigh@L4.1をSDコンテンツはHigh@L3.1を利用する
と決めて、ハードウェアデコーダーメーカーはそれに準拠するように作ったそうな。

 という結果、以下のような2つの制限ができることになる。

 1.H.264ビデオは@L4.1または@L3.1の制限に準じたものとなり、
the Decoded Picture Buffer (DPB) サイズの制限を受ける(下記表参照)。
これは解像度と参照フレーム数(number of reference frame)に関係する

 2.H.264ビデオをDXVAを用いてスムーズ再生するには
"level_idc"フラグを用いて@L4.1、@L3.1ということを明示しなければならない。
(x264でいう"--level"オプションを用いるということです)

 

□細かな設定

 この設定を見る前にx264を更新しましょう。rev.721によってDPBに関する
重要なバグ修正がされています(具体的には--refが規格より1ずれて判定される)。
なおB-PyramidsはDXVAの動作に支障がでるので使わないでください。
(※Cyberlink H.264/AVCデコーダではカクカクになるなど。x264での修正・更新は
 日々行われているがまだ不安定な要素があるらしく、サンプルを募集しているらしぃ)

解像度:最大参照フレーム数(--ref ?):最大fps

 L4.1
 1920x1088: 4 :30.1
 (1920x1088x30/256)
 1920x0720: 6 :

 L4.1
 1280x720: 09 : 68.3
 1280x648: 10 :
 1280x588: 11 :
 1280x540: 12 :
 1280x498: 13 :
 1280x462: 14 :
 1280x432: 15 :
 1280x405: 16 :
 

 L3.1
 1280x720: 05 : 30.0 ←参考
 0720x576: 11 : 66.7
 0720x480: 13 : 80.0

 L4.1によれば
 最大マクロブロック/秒は
 245760 となっている。
 表の計算は16x16サイズで
 最大にしているっぽい?

 ちなみにHDコンテンツとは  1080p 720p を指すらしく
 576p 480p 又はそれ以下を
 SDコンテンツとみなすらしい。

□MKVコンテナ

 最新版のmkvtoolnixを使いましょう。

以上。


J-PRO.INFO