IMFVideoMixerBitmap
COM公式ドキュメント
静止ビットマップ画像を、Enhanced Video Renderer (EVR) が表示するビデオにアルファブレンドします。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
Enhanced Video Renderer (EVR) がビデオにアルファブレンドするためのビットマップ画像を設定します。
| pBmpParms | MFVideoAlphaBitmap* | in | ビットマップ、ソース矩形および転送先矩形、カラーキー、その他の情報を格納した MFVideoAlphaBitmap 構造体へのポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドが成功しました。 | |
| pBmpParms 構造体で定義されたブレンドパラメーターが無効です。 |
解説(Remarks)
アプリケーションは、画像を GDI ビットマップまたは Direct3D サーフェスとして指定できます。EVR ミキサーはその画像を次のビデオフレームおよびそれ以降のすべてのフレームにブレンドし、画像が変更または削除されるまで続けます。画像にはピクセルごとの埋め込みアルファ情報を含めることができ、これにより透過領域を定義できます。透過領域はカラーキー値を使って指定することもできます。
Direct3D サーフェスを使用する場合、サーフェスフォーマットは 32 ビット RGB(D3DFMT_X8R8G8B8 または D3DFMT_A8R8G8B8 のいずれか)である必要があり、サーフェスは D3DPOOL_SYSTEMMEM メモリプールから割り当てる必要があります。
ビデオレンダラーへ画像を渡す頻度に定義された上限はありません。ただし、1 秒間に複数回画像を変更すると、ビデオのパフォーマンスと滑らかさに影響する可能性があります。
例
次の例は、アルファブレンド用に GDI ビットマップを設定します。この例では、転送先矩形とアルファ値に事前定義された設定を使用しています。
HRESULT EVRPlayer::SetBitmapImage(BOOL bEnable, HBITMAP hBitmap)
{
const float fBitmapAlpha = 0.5f;
HRESULT hr = S_OK;
// To enable the bitmap, you must supply a valid bitmap handle.
if (bEnable && (hBitmap == NULL))
{
return E_INVALIDARG;
}
// Make sure we have an IMFVideoMixerBitmap pointer.
if (m_pMixerBitmap == NULL)
{
return E_FAIL;
}
if (bEnable)
{
// Place the bitmap in the lower-right quadrant of the video.
MFVideoNormalizedRect nrcDest = { 0.5f, 0.5f, 1.0f, 1.0f };
// Get the device context for the video window.
HDC hdc = GetDC(m_hwndVideo);
// Create a compatible DC and select the bitmap into the DC>
HDC hdcBmp = CreateCompatibleDC(hdc);
HBITMAP hOld = (HBITMAP)SelectObject(hdcBmp, hBitmap);
// Fill in the blending parameters.
MFVideoAlphaBitmap bmpInfo;
ZeroMemory(&bmpInfo, sizeof(bmpInfo));
bmpInfo.GetBitmapFromDC = TRUE; // Use a bitmap DC (not a Direct3D surface).
bmpInfo.bitmap.hdc = hdcBmp;
bmpInfo.params.dwFlags =
MFVideoAlphaBitmap_Alpha | MFVideoAlphaBitmap_DestRect;
bmpInfo.params.fAlpha = fBitmapAlpha;
bmpInfo.params.nrcDest = nrcDest;
// Get the bitmap dimensions.
BITMAP bm;
GetObject(hBitmap, sizeof(BITMAP), &bm);
// Set the source rectangle equal to the entire bitmap.
SetRect(&bmpInfo.params.rcSrc, 0, 0, bm.bmWidth, bm.bmHeight);
// Set the bitmap.
hr = m_pMixerBitmap->SetAlphaBitmap(&bmpInfo);
SelectObject(hdcBmp, hOld);
DeleteDC(hdcBmp);
ReleaseDC(m_hwndVideo, hdc);
}
else
{
hr = m_pMixerBitmap->ClearAlphaBitmap();
}
return hr;
}
現在のビットマップを削除し、それに関連付けられているリソースを解放します。
戻り値
このメソッドは HRESULT を返します。指定できる値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドが成功しました。 | |
| 現在ビットマップが設定されていません。 |
ソース矩形と転送先矩形、カラーキー、その他の情報を含む、現在のアルファブレンド設定を更新します。ブレンドパラメーターの一部またはすべてを更新できます。
| pBmpParms | MFVideoAlphaBitmapParams* | in | ブレンドパラメーターを格納した MFVideoAlphaBitmapParams 構造体へのポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドが成功しました。 | |
| pBmpParms 構造体で定義されたブレンドパラメーターが無効です。 | |
| 現在ビットマップが設定されていません。ビットマップを設定するには IMFVideoMixerBitmap::SetAlphaBitmap を呼び出す必要があります。 |
解説(Remarks)
変更を反映させるには、ビデオが再生中である必要があります。
Enhanced Video Renderer (EVR) がビットマップをビデオにアルファブレンドするために使用している現在の設定を取得します。
| pBmpParms | MFVideoAlphaBitmapParams* | out | 現在のブレンドパラメーターを受け取る MFVideoAlphaBitmapParams 構造体へのポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドが成功しました。 | |
| 現在ビットマップが設定されていません。ビットマップを設定するには IMFVideoMixerBitmap::SetAlphaBitmap を呼び出す必要があります。 |
解説(Remarks)
このメソッドは、アプリケーションが指定したものだけでなく、すべてのブレンドパラメーターの現在の値を返します。構造体の dwFlags メンバーは無視してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFVideoMixerBitmap "{814C7B20-0FDB-4EEC-AF8F-F957C8F69EDC}" #usecom global IMFVideoMixerBitmap IID_IMFVideoMixerBitmap "{}" #comfunc global IMFVideoMixerBitmap_SetAlphaBitmap 3 var #comfunc global IMFVideoMixerBitmap_ClearAlphaBitmap 4 #comfunc global IMFVideoMixerBitmap_UpdateAlphaBitmapParameters 5 var #comfunc global IMFVideoMixerBitmap_GetAlphaBitmapParameters 6 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IMFVideoMixerBitmap "{814C7B20-0FDB-4EEC-AF8F-F957C8F69EDC}" #usecom global IMFVideoMixerBitmap IID_IMFVideoMixerBitmap "{}" #comfunc global IMFVideoMixerBitmap_SetAlphaBitmap 3 sptr #comfunc global IMFVideoMixerBitmap_ClearAlphaBitmap 4 #comfunc global IMFVideoMixerBitmap_UpdateAlphaBitmapParameters 5 sptr #comfunc global IMFVideoMixerBitmap_GetAlphaBitmapParameters 6 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。