2009年12月16日 (水)

VMR9とNV12で嵌る(その7)

えーと、ずいぶん久しぶりの更新だ。出張で家を空けてたので、更新できなかったというのが言い訳。

で、本来はDXVA解説(その7)のはずなんだけど、以前の更新で書いたVMR9(GTX285)が行うNV12からRGB32へのアップサンプリングの画像が間違っていたので、それのお詫びと訂正。

何が間違っていたかというと、Y成分の計算で、B(青色)成分で計算するべき所を、G(緑色)成分で計算していた。つまり、Y成分を、RGBからじゃなくて、RGGから計算していたわけだ。

ごめんなさい。酔っ払いのやったことなので許してください。

お詫び終了。いや、ポストを書いている時に、「青だけ、数値、低いなぁ」とか「でも、赤や緑は、それなりの数値だし、BT.601で正しいはずだよなぁ」とか思いながら書いていたんだけど、そこで、きちんと確認しないあたりが、駄目プログラマだなぁと反省。

という訳で、訂正なんだけれども、正しい画像を作る時に、ついでに、RGB32からNV12へのダウンサンプリングを幾つか試してみたので、それらも併せて更新する事にする。

» 続きを読む

2009年11月14日 (土)

DXVA解説(その6)

そういうわけで、DXVAについての更新を再開するのだが、今回の更新は、ほとんどDirectShowの話になってしまう。DXVA1のデインタレース機能の話しをするためには、避けては通れないためだ。

最初に、「デインタレースとは何か」を書いてから、DirectShowで、インタレースなサーフェスをVMR9に渡す、お作法を書くことにしよう。

で、デインタレースの話なのだが、その前に、フレーム(Frame)とフィールド(Field)の話をしないと、インタレースが説明できないので、そこから始める事にする。

» 続きを読む

2009年11月10日 (火)

VMR9とNV12で嵌る(その6)

前回の更新で、VMR9が行う、NV12フォーマットからRGB32フォーマットへの、アップサンプリングの内容が分からないと書いた。実は、更新の直ぐ後に、調べ出したのだが、ちょっと調べただけで、やる気が無くなってしまい、放置したままになっている。

一応、調べた事だけは書いておこう。

» 続きを読む

2009年10月25日 (日)

VMR9とNV12で嵌る(その5)

最近、忙しくて、ここを放置していたのだが、さすがに間が空きすぎなので、更新。

以前、嵌っていると言っていた、NV12サーフェスをVMR9で表示すると色がおかしい件は、やっぱり、ブログ主の頭の悪さが問題だった。普段から、適当にコードを書いているから、ちゃんと理解していない事を、間違っていても、全然、気が付く事ができない。

原因は、すごく単純で、NV12サーフェスに書き込む際に、ダウンサンプリングを行っていないことだった。これは、かなり、恥ずかしいレベルのミスだ。該当箇所のコードを書いている時に、頭をよぎっていたにも関わらず、ちょっと動かしてみて、上手く動いたように見えたので、すっかり忘れてしまっていた。ストレートに言うと、酔っ払いすぎだった。その上、次の日からは、「ここは、動いたから、問題なし」と思い込んで、色々な設定の組み合わせを、調べ始めてしまい、自ら、穴に嵌っていただけだった。うーん、典型的な駄目パターンだ。

という訳で、このブログに書いてある事は、あまり信用しないほうが良い。真剣にそう思う。

これで、更新が終わってしまうと、かなり悲しいので、ダウンサンプリングについて、書いておこう。

» 続きを読む

2009年10月 2日 (金)

VMR9とNV12で嵌る(その4)

表題の件は、あまり、進展が無いが、生存報告の意味で更新。

前回の更新での纏めのうち、1番目の「メディアタイプのなかで、VIDEOINFOHEADER2を使用すると、VMR9に直接接続できない」件は、解決した。

原因はVIDEOINFOHEADER2ストラクチャ内のdwPictAspectRatioXと、dwPictAspectRatioYを、設定していないためだった。アスペクトレシオが分からないと、接続できないわけだ。(この件で、ピクセルレシオも考慮しないといけない事に気づいたが、やる気にならない。)

どうせ、プログレッシブで駄目なんだから、インタレースにしたら、もっと酷くなるだろうと、予想しつつも、インタレースなデータを出力するようにしてみたが、予想通りだった。

何の役にも立たないが、インタレースの結果を、一応書いておこう。

» 続きを読む

2009年9月19日 (土)

VMR9とNV12で嵌る(その3)

かなり間が空いてしまったが、前回の書き込みについて、「何が言いたいのか、よく分からない」と言うメールを受け取ったので、纏めを少し書いておこうと思う。

そもそもの発端は、DXVA1のデインタレース機能の評価を行おうと思って、以下のようなDirectShowフィルタ(以下、ソースフィルタ)を用意すれば良いと考えたことだった。

  1. VMR9に直接接続する。
  2. VMR9に、NV12サーフェス(バッファ)を用意させる。(アロケータはVMR9の物を使う。)
  3. NV12サーフェスに、インタレースの画像データを書き込んで、VMR9に表示させる。
  4. ソースフィルタ側で、FPSやフィールドの設定を行えるようにする。

このようなソースフィルタが用意できれば、DXVA1で定義された複数のデインタレースモードで、どのような補間が行われて、出力画像の何が違うのか、確認できるだろうという考えだ。

そういう訳で、「そんなに難しくないのではないか」という甘い考えで、ソースフィルタを書くことにしたのだが、以下のような問題点で行き詰ってしまった。(DXVAでの問題ではなく、DirectShowとVMR9での問題だ。)

  1. インタレースの画像データを入力する事をVMR9に知らせるため、メディアタイプの中で指定するストラクチャを、VIDEOINFOHEADER2にする必要があるのだが、こうすると、VMR9と直接接続できない。
  2. 上記の問題を置いておいて、プログレッシブならば、VMR9と直接接続できる事が分かったので、とりあえず動かしてみたら、VMR9の「NV12からRGB32」への補間がおかしい。

本来は、まず、1番の問題を何とかしなくてはいけないのだが、2番の問題が解決できないのであれば、やっても無駄だと思ってしまい、やる気にならない。

以上が、前回までの纏めだ。

これで終わってしまうと、あまりにも内容が無いので、「NV12とは何か」と「何故NV12のデータは、ディスプレイに表示される時に、補間が必要なのか」を書いておこう。

» 続きを読む

2009年9月 6日 (日)

VMR9とNV12で嵌る(その2)

前回の続き。

この後、どうしようかなと考えながら、「白い」ボールを眺めていたら、ちょっと変なことに気がついた。RGB32フォーマットのものを動かしてみる。比較してみると、NV12フォーマットのボールは、あまり「白くない」ことが分かった。

最初は、YUVの計算式を間違えたかと思ったが、直ぐに思い当たる事があった。色空間変換(Color Space Convert)だ。

» 続きを読む

VMR9とNV12で嵌る(その1)

今回の更新は、DXVA解説ではない。本当は、DXVA1のデインタレースサンプルプログラムを書いて、解説をしたかったのだが、それ以前のVMR9の箇所で、躓いてしまっている。

今回の話は、環境に依存するかもしれないので、最初に書いておく。

Windows7 x64 RC + GTX285(GeForce 190.62) + VS2008 Standard SP1 + Windows SDK for Windows7 RTM

最初の発想は、こうだった。

DXVA1で、VMR9のデインタレースのモードを調べるプログラムを、適当に書く。問題なく動作した。結果を見ると、ブログ主の環境では、BOBを含めて4つのモードがあると分かった。

4つもモードがあるなら、それぞれのモードの動作結果を、比較できるようなサンプルプログラムを作れば、解説もやりやすい。

» 続きを読む

2009年9月 1日 (火)

DXVA解説(その5)

うーん、書きたい事を、だらだらと書いていると、全然終わらないな。
さくさく行こうと思う。DXVA1_Checkプログラムの解説の続き。

注意

ここに書いてある解説は、このブログ主の主観的な意見であり、他の誰かに検証されたものではありません。そのため、嘘、間違いが含まれる可能性があります。

» 続きを読む

DXVA解説(その4)

それでは、前回の続き。DXVA1_Checkプログラムの解説を行う。

注意

ここに書いてある解説は、このブログ主の主観的な意見であり、他の誰かに検証されたものではありません。そのため、嘘、間違いが含まれる可能性があります。

まずは、DirectShowフィルタの部分から。Filter.hFilter.cppを見て欲しい。

DirectShowを知っている人なら、「ちょっと待て」と言いたくなるだろう。内容としては、ほとんど、スカスカで、DirectShowフィルタとしての機能は、何も無い。

あくまでも、DXVA1の機能を利用するためのフィルタなので、VMRのインプットピンとコネクトできれば何でも良い。そのため、手を抜けるだけ、抜いてある。

» 続きを読む

«DXVA解説(その3)