次の方法で共有


CDrawImage クラス

CDrawImage クラスは、ビデオ レンダラ フィルタの描画を管理するヘルパー クラスである。すべての描画操作を GDI を使って実行する。このクラスは DirectDraw によるレンダリングをサポートしない。CDrawImage クラスでは、ビデオ ウィンドウを管理するオーナー フィルタも CBaseWindow クラスを使っている必要がある。CDrawImage コンストラクタは、CBaseWindow オブジェクトへのポインタを受け取る。

次の図は、カスタム ビデオ レンダラ フィルタにおけるこのクラスの望ましい使用方法を示している。

CDrawImage を使ったカスタム ビデオ レンダラ フィルタ

このクラスの使用方法は次のとおり。

アロケータ

上の図に示したフィルタは、カスタム アロケータ クラスである CImageAllocator を使っている。このアロケータは、GDI 関数 CreateDIBSection を使って共有メモリに DIB を作成する。このアロケータで作成したサンプルは CImageSample オブジェクトである。

フィルタが接続のためのアロケータを所有している場合、メディア サンプルは確実に CImageSample オブジェクトである。その場合、CDrawImage オブジェクトは BitBlt または StretchBlt を使って描画を最適化できる。それ以外の場合は、低速の SetDIBitsToDevice または StretchDIBits 関数を使わなければならない。高速オプションは CDrawImage::FastRender メソッドで実装し、低速オプションは CDrawImage::SlowRender メソッドで実装する。名前は Slow だが、SlowRender でも (新しいハードウェアでは特に) 大きなパフォーマンスへの影響はない。

パレット

描画に FastRender メソッドを使い、イメージがパレット化されている場合、フィルタは次のようにパレットを管理する必要がある。

  • CImageSample クラスには、DIBDATA 構造体に格納されたパレットのバージョンを示す数値が含まれている。この値は、アロケータがサンプルを作成するときに初期化される。
  • CDrawImage クラスにも、作成時に初期化されるパレットのバージョン数値が含まれる。
  • メディア タイプがパレット化された新しいフォーマットに変わるたびに、CDrawImage::IncrementPaletteVersion を呼び出す。このメソッドは CDrawImage オブジェクトのパレット バージョン数をインクリメントする。フィルタが CImagePalette クラスを使ってパレット情報を管理する場合は、メディア タイプが変化するたびに CImagePalette::PreparePalette を呼び出すだけでよい。PreparePalette メソッドは必要な場合に限ってパレットのバージョンをインクリメントする。
  • FastRender メソッドは CDrawImage のパレットのバージョンをサンプルのパレットのバージョンと比較する。サンプルのバージョンの数値が CDrawImage のバージョンの数値より遅れている場合、FastRender メソッドは CDrawImage::UpdateColourTable を呼び出す。UpdateColourTable メソッドは、GDI 関数 SetDIBColorTable を使って、デバイス コンテキストにカラー テーブルを設定する。さらに、サンプルのパレットのバージョンを最新バージョン数に更新する。
  • ピンが再接続した場合、フィルタは CDrawImage::ResetPaletteVersion を呼び出してパレットのバージョンをリセットする。ピンの再接続時、アロケータはすべてのサンプルを再割り当てする。

要件

ヘッダー : Winutil.h で宣言し、Streams.h をインクルードする。

ライブラリ : Strmbase.lib (リテール ビルド) または Strmbasd.lib (デバッグ ビルド)。

プロテクト メンバ変数 説明
m_bStretch 転送先ウィンドウに合わせてビデオ イメージを伸縮する必要があるかどうかを示す。
m_bUsingImageAllocator ピン接続のアロケータが CImageAllocator オブジェクトであるかどうかを示す。
m_EndSample 最新サンプルの停止タイムを指定する。
m_hdc 所有者ウィンドウのデバイス コンテキストのハンドル。
m_MemoryDC 所有者ウィンドウのメモリ デバイス コンテキストのハンドル。
m_PaletteVersion パレットの変化を追跡するために使う。
m_pBaseWindow 所有する CBaseWindow オブジェクトへのポインタ。
m_pMediaType 現在のメディア タイプへのポインタ。
m_SourceRect 描画の転送元矩形を指定する。
m_StartSample 最新サンプルの開始タイムを指定する。
m_TargetRect 描画の転送先矩形を指定する。
プロテクト メソッド  
DisplaySampleTimes ビデオ イメージの上にメディア サンプルのタイム スタンプを描画する。
FastRender BitBlt または StretchBlt 関数を使ってビデオ イメージを描画する。
SetStretchMode ビデオ イメージを伸縮する必要があるかどうかを計算する。
SlowRender SetDIBitsToDevice または StretchDIBits 関数を使ってビデオ イメージを描画する。
UpdateColourTable 新しいパレットでカラー テーブルを更新する。
パブリック メソッド  
CDrawImage コンストラクタ メソッド。
DrawImage ビデオ ウィンドウ上にビデオ フレームを描画する。
DrawVideoImageHere メディア サンプルから指定したデバイス コンテキストにイメージを描画する。
GetPaletteVersion パレットのバージョンを取得する。
GetSourceRect 現在の転送元矩形を取得する。
GetTargetRect 現在の転送先矩形を取得する。
IncrementPaletteVersion パレットのバージョンをインクリメントする。
NotifyAllocator 接続のアロケータが CImageAllocator オブジェクトであるかどうかを CDrawImage オブジェクトに通知する。
NotifyEndDraw サポートされていない。
NotifyMediaType 現在のメディア タイプをオブジェクトに通知する。
NotifyStartDraw サポートされていない。
ResetPaletteVersion パレットのバージョンをリセットする。
ScaleSourceRect ネイティブ ビデオ サイズとメディア タイプ フォーマットに相違がある場合は、指定した転送元矩形をスケーリングする。仮想。
SetDrawContext 描画に使われるデバイス コンテキストを設定する。
SetSourceRect 転送元矩形を設定する。
SetTargetRect 転送先矩形を設定する。
UsingImageAllocator 現在のアロケータが CImageAllocator オブジェクトであるかどうかを示す。