IVMRMixerBitmap9
COM公式ドキュメント
IVMRMixerBitmap9 インターフェイスは、Video Mixing Renderer Filter 9 (VMR-9) を使用する際に、ビットマップまたは Direct3D サーフェスの静止画像をビデオ ストリームに合成することをアプリケーションに可能にします。画像は任意の頻度で VMR に渡せますが、画像を毎秒何度も変更すると、レンダリングされるビデオのパフォーマンスや滑らかさに影響する場合があります。新しい画像は、VMR がレンダリングする次のフレームおよびそれ以降のすべてのビデオ フレームに合成されます。内部的には、VMR は合成処理を実行するためにミキサー コンポーネントを使用します。VMR-9 では、アプリケーションが独自のレンダリングを行う「レンダーレス」モードを除き、ミキサーは既定で常に存在します。画像にはピクセルごとのアルファ情報を埋め込むことができ、これにより画像に透明な領域を含めることができます。透明な領域はカラー キー値によって指定することもできます。画像の変更は、フィルター グラフの実行中にのみ画面に反映されます。
解説(Remarks)
Vmr9.h の前に DShow.h と D3d9.h をインクルードしてください。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
SetAlphaBitmap メソッドは、新しいビットマップ画像、ビットマップのソースの位置、そしてそれを描画先の四角形上でどのように、どこに描画するかを指定します。
| pBmpParms | VMR9AlphaBitmap* | in | ビットマップに関する情報を格納した VMR9AlphaBitmap 構造体へのポインター。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれます。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pBmpParms が NULL です。 | |
| 引数が無効です。「解説」を参照してください。 | |
| ビットマップ用の描画先 DC または DIBSection を作成できませんでした。 | |
| ビットマップ サーフェスへの BitBlt が失敗しました。 |
解説(Remarks)
ビットマップを削除するには、VMR9AlphaBitmap 構造体で VMR9AlphaBitmap_Disable フラグを設定し、SetAlphaBitmap を再度呼び出してください。
アプリケーションは、ビットマップを Direct3D サーフェスとしても GDI ビットマップとしても提供できます。Direct3D サーフェスを使用するには、VMR9AlphaBitmap 構造体の pDDS メンバーを設定します。GDI ビットマップを使用するには、構造体の hdc メンバーを設定します。
ビットマップは VMR のミキサー コンポーネントによってビデオ フレームに合成されます。ミキサーはフレームごとに 1 回ビットマップを描画します。フィルター グラフが一時停止または停止している間にビットマップを変更した場合、ミキサーはグラフが再開するまで新しいビットマップを使用しません。この制限は IMediaControl::StopWhenReady を呼び出すことで回避できますが、より良い解決策はビットマップを描画するカスタム アロケーター プレゼンターを記述することです。詳細については、Supplying a Custom Allocator-Presenter for VMR-9 を参照してください。
このメソッドが E_INVALIDARG を返す場合、考えられる原因には次のものがあります。
- Direct3D サーフェスが D3DPOOL_SYSTEMMEM プールから割り当てられていない。
- サーフェス形式が無効。Direct3D サーフェスを使用する場合、サーフェス形式は D3DFMT_X8R8G8B8 または D3DFMT_A8R8G8B8 でなければなりません。サーフェス形式が D3DFMT_A8R8G8B8 の場合、VMR9AlphaBitmap_SrcColorKey フラグは使用できません。
- ソースの四角形 (rSrc) が Direct3D サーフェスの境界を超えている。
- ソースの四角形が空である。
- ソースの四角形が Direct3D デバイスの最大テクスチャ幅または最大テクスチャ高さを超えている。最大テクスチャ サイズを調べるには、IDirect3DDevice9::GetDeviceCaps を呼び出します。
- dwFilterMode メンバーに無効なフラグの組み合わせが含まれている。
UpdateAlphaBitmapParameters メソッドは、ビットマップの位置、サイズ、および合成値を変更します。
| pBmpParms | VMR9AlphaBitmap* | in | VMR9AlphaBitmap 構造体へのポインター。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれます。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 |
解説(Remarks)
変更を反映するには、フィルター グラフが実行中である必要があります。このメソッドはビットマップ画像を変更しません。描画先もカラー キーも設定されていない VMR9AlphaBitmap 構造体を指定した場合、ビットマップは表示されません。この動作は下位互換性のために実装されています。
Vmr9.h の前に DShow.h と D3d9.h をインクルードしてください。
GetAlphaBitmapParameters メソッドは、現在の画像とそれに関連する合成パラメーターのコピーを取得します。
| pBmpParms | VMR9AlphaBitmap* | out | ビットマップ、合成値に関する情報、およびそれを合成する位置を受け取る VMR9AlphaBitmap 構造体へのポインター。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれます。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pBmpParms が無効です。 | |
| ミキサーが読み込まれていません。 |
解説(Remarks)
Vmr9.h の前に DShow.h と D3d9.h をインクルードしてください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IVMRMixerBitmap9 "{CED175E5-1935-4820-81BD-FF6AD00C9108}" #usecom global IVMRMixerBitmap9 IID_IVMRMixerBitmap9 "{}" #comfunc global IVMRMixerBitmap9_SetAlphaBitmap 3 var #comfunc global IVMRMixerBitmap9_UpdateAlphaBitmapParameters 4 var #comfunc global IVMRMixerBitmap9_GetAlphaBitmapParameters 5 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IVMRMixerBitmap9 "{CED175E5-1935-4820-81BD-FF6AD00C9108}" #usecom global IVMRMixerBitmap9 IID_IVMRMixerBitmap9 "{}" #comfunc global IVMRMixerBitmap9_SetAlphaBitmap 3 sptr #comfunc global IVMRMixerBitmap9_UpdateAlphaBitmapParameters 4 sptr #comfunc global IVMRMixerBitmap9_GetAlphaBitmapParameters 5 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。