DIB の操作

非圧縮ビデオは、通常、約 30 フレーム/秒というレートで、高速に連続して再生される一連のビットマップである。多くのビデオは圧縮されたフォーマットで DirectShow フィルタ グラフに入力されるので、ビデオ ストリームは一般的に圧縮解除用のデコーダによって処理される。デコーダの多くはデータを YUV フォーマットで出力し、ビデオ ハードウェア用の RGB への最終的な変換をレンダリングの直前まで行わない。デコーダが DirectX ビデオ アクセラレーションを使う場合、ビデオ ハードウェアはイメージをデコードするための追加の処理を実行する。したがって、ビットマップの最終的な圧縮解除は、データがビデオ ハードウェアに到達するまで実行されない場合がある。

しかし、ビデオの解析・処理・編集を実行するには、ビデオをレンダリングしたり、ファイルに書き込む前に、RGB または YUV などのフォーマットに圧縮解除されたビットマップを処理することが必要になる場合がある。この処理は、通常、CTransformFilter 基底クラスに基づく変換フィルタ内の Transform メソッドが行う。このメソッドは、ビデオ データをカプセル化する IMediaSample オブジェクトへのポインタを受け取る。IMediaSample::GetPointer メソッドは、未処理のデータの最初のバイトへのポインタを返す。非圧縮フレームの場合、このデータはフィルタが直接アクセスして変更できるピクセルで構成される。以降のセクションでは、このような方法で DIB データを効率的に操作するための背景情報を示す。

GDI、GDI+、DirectDraw、または Direct3D の関数を使ってビットを変更することもできるが、これらの手法についてはここでは説明しない。

ここでは次の内容について説明する。