デコードについて


動画を作成していてる途中で画質を確認したりするわけで、その作業過程で色が微妙に違って見える。
そう思ったのは、まずDivXでエンコードしたAVI形式の動画をMP4にAvidemuxで変換したときだ。

2008.04.05日以前の動画を観れば一目瞭然、CP/HP/MPバーの色が違うことに気づく。
そのときは、再圧縮したので仕方ない。もうMP4にするのだし・・・くらいで済ませたが、 MP4にしてからふと気になった。

Windows Media Playerで再生した場合と、UploadしてJW FLV Playerで再生した場合とで全体の色調が違う。
前者の場合、全体的に白っぽい感じ(なめらかといえば聞こえはいいのだがぼやけた感じ)で、後者の場合は、クッキリスッキリ。
個人的には後者の方が好みである。 実際の画質はどっちなのか?

動画作成の際、Avisynthで色空間の変換(RGB⇒YUV)を行っている。
これは、x264エンコーダがYUV系のYV12(YUV420、YCrCb:4:2:0)でしか処理できないからである。
ConvertToYV12()がそれである。
※AviSynthでファイルを読込む際に使用するAVISourceやDirectShowSource自体も出力に使用する色空間が指定できるので注意。Info()で現在の状態を確認したほうがよい。
※AVIUtlは内部でYC48となる。

これまでずっとこの形式で使用していた。しかし、調べるとYV12への変換の際、matrixを指定できるそうだ。
デフォルトでは、Rec601でTVスケール(輝度(Y)が16~235、色差(C)が16~240の範囲)となる。
ほかに、Rec709、PC.601、PC.709がある。
PC.XXXはフルスケール(0~255)で変換するようだ。

早速、rec601とpc.601で試してみた。同時に、x264cliのオプションの--fullrangeと--colormatrixを使用してみた。
この2つのオプションは、RGBへ戻す際の情報として再生時(デコード時)に利用することができるが、実際に使えるかは再生環境に左右されるため、意味がないケースもある。

その結果がスクリーンショットのNo1~No4である。 No3とNo4はイレギュラーな設定であるが、再生環境で先ほどのオプションが有効であるかどうかが分かる。


すべてWindows Media Playerで再生した際のキャプチャ画像である。
※キャプチャの際に色空間の変換が行われるかもしれないので、画面で違いが分かりにくくなっているかも。

No1が従来の方法、No.2がConvertToYV12(matrix="PC.601")を指定し、--fullrange on --colormatrix bt470bgを指定したケースで、Windows Media Playerでもクッキリスッキリした画像で、JW FLV Playerで再生した場合と同等になった。
No1~No4で表示に違いがあることから、x264で指定したオプションが有効であると思われる。
先ほどJW FLV Playerといったが、実際はAdobe Flash Playerで再生されている。
このAbode Flash Playerはフルレンジに対応しているらしい。
そうするとWindows Media Playerがフルレンジでないだけの違いなのだろうか。

VistaのWindows Media PlayerにはXPのころのようなデコード設定がない。Playerでは何もしていないようにも思える。

自分のPCで再生時の色空間の変換がどうなっているのか、そしてそれをどこで実行しているのだろうかという疑問がわいた。

PC上で再生する場合はYV12⇒RGBに変換されてディスプレイで表示される。
この色空間の変換をしていると思われるのは以下①~④である。
①プレイヤー
②コーデック(デコーダ)
③ビデオレンダラ
④グラフィックカード
⑤ディスプレイ 

描画に関係しそうなビデオレンダラにフォーカスしてみた。
以下のようにOSのバージョンごとに異なっていることが明らかになった。
笶噌P以前(98/Me/2000)で使用されていた方式
・ビデオレンダラ
DirectDrawを使用し、使用できない場合はGDIを使用。
・オーバーレイ ミキサ
DirectDrawを使用。グラフィックカードの性能やウィンドウ状態により、GDI、DirectDraw、オーバレイに切り替えられる。

Windows XP
・VMR-7
DirectDraw7を常用。XPのデフォルトである。ビデオレンダラ+オーバーレイミキサに変わるもの。
・VMR-9
Direct3D9を使用。高性能であるがゆえにシステム要件が高くXPではデフォルトになっていない。
※Video Mixing Renderer (VMR):XP既定のビデオレンダラ

Windows Vista
・Enhanced Video Renderer(EVR):拡張ビデオレンダラ。VistaではDirectShowフィルタとEVRでビデオを再生する。

XPやVistaには再生支援機能というのがある。これはDXVAが担っている。
XPではVMRからDXVAを、VistaではEVRからDXVAにアクセスするようだ。
DXVAのバージョンがXPとVistaでことなっており、XPはDXVA1.0、VistaはDXVA2.0で機能も大きく異なる。
※DirectX Video Acceleration(DirectX VAまたはDXVA):デジタル ビデオのデコードのアクセラレーションのためのDirectX アプリケーションインターフェース(API)とデバイスドライバインターフェース(DDI)を提供。

いろいろ調査していくと見慣れない単語がどんどんでてきてわけわからない状態になり混乱するばかり。
 
このあたりでまとめると
VistaにはWDDM(Windows Display Driver Model)アーキテクチャが使用されておりXPと大きく異なる点である。
XPでディスプレイドライバが停止するとブルー画面になったりOSが落ちたりしていたが、VistaではWDDMによりドライバのみ再起動して復旧する。
ドライバ導入時にOSの再起動が不要になっているのもこのおかげである。
このWDDMが、描画すべてに関係しているように思う。
描画はWDDMの管理下にあるといえ、DWM(Desktop Windows Manager)にしろAeroにしろGPUアクセラレーションにしろWDDM準拠のドライバでなければ機能しない。

余談であるが、
DWMの動作を確認するには、動きのあるウィンドウを表示した状態でalt+tabあるいはWindowsキー+tabを押してみるとよい。
小さく表示されたウィンドウ内のグラフィックが動いているのがわかる。
これはバッファー(メモリ上)内に各アプリケーションから出力された映像をダイレクトに表示しているDWMの機能といえる。
このDWMによりVistaの物理メモリの要件が高くなったのかもしれない。

以上からEVRとDXVAそしてWDDM準拠のグラフィックドライバが影響していることが推測できる。
試しにビデオレンダラを選択できるMedia Player Classicの中でVistaに対応しているHomecinema(MPC-HC)を使ってみた。

VMR-7とかVMR-9とかEVRとか出力方法を変えてみたが、色調の変化もCPU負荷の変化も一切なかった。
EVRは関係ないようである。

そういえば、これまでWindowsMediaPlayer(WMP)で再生していたときは、Haali Media Splitter、ffdshow video decoder、ffdshow audio decoderの3つがタスクトレイにアイコン表示されていた。Media Player Classicでも同じであった。
しかし、現在このPCはffdshow video decoderを除く2つしか表示されていない。いつからだろう・・・

他のVistaマシンであるHTPC(intel GMA X3500)では、同じ動画を再生するとタスクトレイには3つのアイコンが表示される。
記憶違いではないようだ。

これが意味することは、H264デコードはffdshowを使用していないということで、他でデコード処理しているということである。
思いつくのは、グラフィックカードくらいである。

2009.03.29 修正 
ffdshowを何度も再インストールしていてH264デコードが無効になっていたことが原因で、更にDiVXがH264をサポートするようになっていたため再生ができていました。
再生開始直後に一瞬だけ表示されるDivXのロゴマークで気付きました。
(DivX Plus H.264 DirectShow Filter⇒H.264 Decoder Configで右下のロゴマークを非表示にできます) もちろん、ffdshowでH264デコードをlivavcodecにすればffdshow video decoderが使われます。
DivXをアンインストールし、ffdshowのH264デコードを無効にすると映像の再生ができなくなることからH264デコーダソフトが間違いなく必要なようだ。
しかし、DiVXのデコーダにもNVIDIAコントロールパネルにあるようなDeblockingなどの設定がある。何がどこまでを担っているのかが、分からなくなった。
ただ、CPU負荷はどの場合も以下のような状況なのはかわらないので、計算処理はグラボが使われているのだろう。

その裏づけとなるのが、動画再生時のCPU負荷である。
一般的にMP4はデコード時の負荷が高い。更に、自分がエンコードの際に使用しているオプション設定はデコード負荷が高くなるようなものばかり使用している。
それにもかかわらず、再生時のCPU負荷は4~8%で、まれに2桁にいく程度であった。

そうするとDXVA2.0と、WDDM対応グラフィックドライバーによりハードウェアアクセラレーションされている可能性が非常に高い。
その設定はどこで?

早速、NVIDIAコントロールパネルをみるとPureVideoHDの機能設定がある。 PhysXの項目もあって混乱しそう><
前に、描画をNVIDIAの設定を利用するよう変更した記憶はある。
カラー調整(カラー、ガンマ、詳細)、エッジ強調、ノイズ低減、逆テレシネが項目としてある。このあたりが、ビデオアクセラレーション機能でできることなのだろう。
PureVideoHDの機能としては、グラフィックカードが8000シリーズ以降(G80除く)であれば、H264、VC-1、MPEG2のハードウェアデコードができる。再生支援機能といえばいいか・・・
それは、DVDやBluRay用のPureVideoHD対応Playerでしか機能しないものだと勘違いしていた。

DirectShow対応Playerであればいいようで、もちろんWindows Media PlayerでもOKということだ。
カラー調整の詳細設定タブにダイナミックレンジという項目を見つけた。
デフォルトでは、既定値16-235になっている。どこかでみた数値である。
これをフルレンジ(0-255)にすると・・・ あら、No1の動画もクッキリスッキリになった。
これでAdobe Flash Playerで再生したときと同じである。

使用しているGeForce8800GT(G92)はVP2(第2世代PureVideoHD)を搭載しており、VP1(第1世代PureVideo)と異なるのは復号演算(Bit Stream Processing)と逆変換処理(Inverse Transform)が追加されている点である。(詳しい説明はこちらこちらをどうぞ)
要するにVP2搭載グラフィックカードならば、対応ソフトさえあればH264/AVCの動画再生処理をすべてグラフィックカードで処理できるということらしい。(ソフトはドライバに含まれて無料で供給される。)
ただ、GF8800GTは、VP1モデルとVP2モデルがあるので紛らわしい。自分のPCでは、NVIDIAドライバーを更新した時からハードウェアアクセラレーションが行われ、H264デコード処理はグラフィックカードで行われていたということのようだ。
しかも、このH264デコード処理でx264cliエンコード時に指定したオプションを識別できているようだ。

ATIのほうが早くから再生支援機能を実装しているので、HTPC用のグラフィックカードならATIの方が安価で手に入ると思う。
ただ、ATI All in Wonder 128というTVチューナー内蔵のカードを使っていたころは、ドライバーの供給があいまいな状態が続き、更にこのころのWindowsはグラフィックドライバの影響でいきなりOSが落ちることが多々あった。
この苦い経験から個人的な感情で現在もATIを避けている。

なぞが解けたのはいいのだが、結局どこで設定するのが正しい選択なのだろうか
PCで動画を再生する場合、現状の設定がどうなっているかが重要なのはわかった。しかし、その方法の選択肢がいっぱいあるため、自分の環境にあった正しい選択というのが難しい。
たとえば、意図的にGPUアクセラレーションを無効にしたい場合の方法がわからないし、同じ設定が別の方法でできるケースでどちらが優先されるのかもよくわからない。
情報サイトもXPとVistaの情報が入り乱れているし、Vistaに関してはVista対応ドライバが出る前の情報も多く、誤った認識を持ってしまいがちである。

エンコード後の色調に神経質になり、満足できる結果になるまで何度もフィルター設定を微調整したり、オプションを変えてエンコードをやりなおしても、どう見えるかは再生する環境(設定)次第。

今の段階では、その労力は報われないことがわかっただけでも良しとしておこう。

再生支援機能と高画質化機能がごっちゃになりそうなので、以下に簡単にまとめてみました。

PureVideoHD(第2世代)の機能
(1)再生支援機能(H264/MPEG2/VC-1,WMV9)
①Bitstream Processing(ビットストリーム複合演算)※VC-1 ハフマン複合演算には未対応?
②Inverse Transform(逆変換処理)
③Motion Compensation(動き補正)
④Deblocking(デブロッキング処理)
※以前は、PureVideo Decoderという有償の専用ソフトが必要でしたがいまはドライバに含まれているようです。ただ、以前の環境(ドライバなど)のまま使っている人は当然有償のDecoderもしくISV提供の対応Playerが必要になるでしょう。
※8800シリーズでもG80は、7000シリーズ相当だと思います。BSPエンジンとAES128 エンジンを搭載していません。

PureVideo HDの世代、使用/未使用時の比較


※8200mGPUの場合(ハフマン複合演算に対応)


(2)高画質化機能(イメージ拡張機能)
①デ・インターレーシング
②ノイズリダクション
③エッジの強調
④インバース・テレシネ