IVMRWindowlessControl
COM公式ドキュメント
IVMRWindowlessControl インターフェースは、Video Mixing Renderer Filter 7 (VMR-7) がコンテナウィンドウ内でビデオストリームをどのようにレンダリングするかを制御します。
メソッド 15
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetNativeVideoSize メソッドは、引き伸ばされていないビデオのサイズとアスペクト比を取得します。
| lpWidth | INT* | out | ネイティブのビデオ矩形の幅を受け取るポインタ。 |
| lpHeight | INT* | out | ネイティブのビデオ矩形の高さを受け取るポインタ。 |
| lpARWidth | INT* | out | ネイティブのビデオ矩形のアスペクト比の幅を受け取るポインタ。 |
| lpARHeight | INT* | out | ネイティブのビデオ矩形のアスペクト比の高さを受け取るポインタ。 |
戻り値
メソッドが成功した場合、S_OK を返します。4 つの入力パラメータがすべて NULL の場合は E_POINTER を返します。
| リターンコード | 説明 |
|---|---|
| VMR がウィンドウレスモードではありません。 |
解説(Remarks)
VMR が上流のフィルターに接続されていない場合、このメソッドは成功しますが、すべてのパラメータはゼロに設定されます。
lpWidth が 640 で lpHeight が 480 の場合、lpARWidth は 4、lpARHeight は 3 になります。
GetMinIdealVideoSize メソッドは、パフォーマンスや画質の大幅な低下を招くことなく VMR が表示できる最小のビデオサイズを取得します。
| lpWidth | INT* | out | 最小の理想的な幅を受け取る LONG 値へのポインタ。 |
| lpHeight | INT* | out | 最小の理想的な高さを受け取る LONG 値へのポインタ。 |
戻り値
メソッドが成功した場合、S_OK を返します。失敗した場合はエラーコードを返します。
| リターンコード | 説明 |
|---|---|
| VMR がウィンドウレスモードではありません。 |
GetMaxIdealVideoSize メソッドは、パフォーマンスや画質の大幅な低下を招くことなく VMR が表示できる最大のビデオサイズを取得します。
| lpWidth | INT* | out | 最大の理想的な幅を受け取るポインタ。 |
| lpHeight | INT* | out | 最大の理想的な高さを受け取るポインタ。 |
戻り値
メソッドが成功した場合、S_OK を返します。失敗した場合はエラーコードを返します。
| リターンコード | 説明 |
|---|---|
| VMR がウィンドウレスモードではありません。 |
SetVideoPosition メソッドは、ビデオのソース矩形と宛先矩形を設定します。
| lpSRCRect | RECT* | in | ソース矩形を指定する RECT 構造体へのポインタ。NULL の場合、ソース矩形は変更されません。既定のソース矩形はビデオ画像全体です。 |
| lpDSTRect | RECT* | in | 宛先矩形を指定する RECT 構造体へのポインタ。NULL の場合、宛先矩形は変更されません。既定の宛先矩形は {0, 0, 0, 0} です。 |
戻り値
メソッドが成功した場合、S_OK を返します。失敗した場合はエラーコードを返します。
| リターンコード | 説明 |
|---|---|
| VMR がウィンドウレスモードではありません。 |
GetVideoPosition メソッドは、ビデオの表示に使用されている現在のソース矩形と宛先矩形を取得します。
| lpSRCRect | RECT* | out | 現在のソース矩形を受け取るポインタ。 |
| lpDSTRect | RECT* | out | 現在の宛先矩形を受け取るポインタ。 |
戻り値
メソッドが成功した場合、S_OK を返します。失敗した場合はエラーコードを返します。
| リターンコード | 説明 |
|---|---|
| VMR がウィンドウレスモードではありません。 |
GetAspectRatioMode メソッドは、VMR がソースビデオのアスペクト比を保持するかどうかを照会します。(IVMRWindowlessControl.GetAspectRatioMode)
| lpAspectRatioMode | DWORD* | out | アスペクト比モードを示す VMR_ASPECT_RATIO_MODE 値を受け取る変数へのポインタ。 |
戻り値
SetAspectRatioMode メソッドは、VMR がソースビデオのアスペクト比を保持するかどうかを指定します。(IVMRWindowlessControl.SetAspectRatioMode)
| AspectRatioMode | DWORD | in | VMR_ASPECT_RATIO_MODE 列挙型のメンバーを指定します。 |
戻り値
HRESULT 値を返します。取り得る値には以下が含まれます。
| リターンコード | 説明 |
|---|---|
| 無効な引数 | |
| 成功 | |
| VMR がウィンドウレスモードではありません。 |
SetVideoClippingWindow メソッドは、ビデオのクリッピング先となるコンテナウィンドウを指定します。
| hwnd | HWND | in | ビデオのクリッピング先となるウィンドウを指定します。 |
戻り値
メソッドが成功した場合、S_OK を返します。失敗した場合はエラーコードを返します。
| リターンコード | 説明 |
|---|---|
| VMR がウィンドウレスモードではありません。 |
RepaintVideo メソッドは、現在のビデオフレームを再描画します。
| hwnd | HWND | in | 再描画を行うウィンドウのハンドルを指定します。 |
| hdc | HDC | in | ウィンドウのデバイスコンテキストへのハンドルを指定します。 |
戻り値
メソッドが成功した場合、S_OK を返します。失敗した場合はエラーコードを返します。
| リターンコード | 説明 |
|---|---|
| VMR がウィンドウレスモードではありません。 |
DisplayModeChanged メソッドは、アプリケーションが WM_DISPLAYCHANGE メッセージを受信したことを VMR に通知します。
戻り値
メソッドが成功した場合、S_OK を返します。失敗した場合はエラーコードを返します。
| リターンコード | 説明 |
|---|---|
| VMR がウィンドウレスモードではありません。 |
解説(Remarks)
アプリケーションは WM_DISPLAYCHANGE ウィンドウメッセージを受信するたびにこのメソッドを呼び出す必要がありますが、これは VMR が現在ウィンドウレスモードにある場合に限られます。
GetCurrentImage メソッドは、VMR によって現在表示されている画像のコピーを取得します。
| lpDib | BYTE** | out | BYTE 配列へのポインタのアドレス。 |
戻り値
メソッドが成功した場合、S_OK を返します。失敗した場合はエラーコードを返します。
| リターンコード | 説明 |
|---|---|
| VMR がウィンドウレスモードではありません。 |
解説(Remarks)
このメソッドは現在表示されている画像を返します。画像はパックされた Windows DIB の形式で返されます。画像は BITMAPINFOHEADER 構造体で始まり、場合によってはパレットエントリやカラーマスクを含み、その後に画像データが続きます。
VMR が画像用のメモリを割り当て、そのポインタを lpDib 変数で返します。呼び出し元は CoTaskMemFree を呼び出してメモリを解放する必要があります。
このメソッドは、フィルターが実行中、停止中、一時停止中のいずれの状態であっても、いつでも呼び出すことができます。ただし、このメソッドを頻繁に呼び出すとビデオ再生のパフォーマンスが低下します。
例
| C++ |
|---|
BYTE *lpDib = NULL;
hr = pWindowlessControl->GetCurrentImage(&lpDib);
if (SUCCEEDED(hr))
{
BITMAPINFOHEADER *pBMIH = (BITMAPINFOHEADER*)lpDib;
/* .... */
CoTaskMemFree(lpDib);
}
|
SetBorderColor メソッドは、VMR が使用する境界色を設定します。
| Clr | COLORREF | in | 境界色を指定します。 |
戻り値
メソッドが成功した場合、S_OK を返します。失敗した場合はエラーコードを返します。
| リターンコード | 説明 |
|---|---|
| VMR がウィンドウレスモードではありません。 |
解説(Remarks)
境界色は、宛先矩形のうちビデオを含まない領域を塗りつぶすために使用される色です。通常、次の 2 つのケースで使用されます。(1) ビデオが 2 つのモニターにまたがる場合、および (2) VMR が指定された宛先矩形に収まるようにビデオをレターボックス表示することでムービーのアスペクト比を維持しようとする場合です。IVMRWindowlessControl::SetAspectRatioMode メソッドを参照してください。
GetBorderColor メソッドは、VMR が使用している現在の境界色を取得します。
| lpClr | COLORREF* | out | 現在の境界色を受け取る COLORREF 変数へのポインタ。 |
戻り値
メソッドが成功した場合、S_OK を返します。失敗した場合はエラーコードを返します。
| リターンコード | 説明 |
|---|---|
| VMR がウィンドウレスモードではありません。 |
SetColorKey メソッドは、VMR が使用するソースカラーキー値を設定します。
| Clr | COLORREF | in | ソースカラーキーを指定します。 |
戻り値
メソッドが成功した場合、S_OK を返します。失敗した場合はエラーコードを返します。
| リターンコード | 説明 |
|---|---|
| VMR がウィンドウレスモードではありません。 |
解説(Remarks)
カラーキーの制御は、VMR がオーバーレイサーフェスを使用している場合にのみ意味を持ちます。
GetColorKey メソッドは、VMR が使用している現在のソースカラーキー値を取得します。
| lpClr | COLORREF* | out | 現在のカラーキー値を受け取る COLORREF 変数へのポインタ。 |
戻り値
メソッドが成功した場合、S_OK を返します。失敗した場合はエラーコードを返します。
| リターンコード | 説明 |
|---|---|
| VMR がウィンドウレスモードではありません。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IVMRWindowlessControl "{0EB1088C-4DCD-46F0-878F-39DAE86A51B7}" #usecom global IVMRWindowlessControl IID_IVMRWindowlessControl "{}" #comfunc global IVMRWindowlessControl_GetNativeVideoSize 3 var,var,var,var #comfunc global IVMRWindowlessControl_GetMinIdealVideoSize 4 var,var #comfunc global IVMRWindowlessControl_GetMaxIdealVideoSize 5 var,var #comfunc global IVMRWindowlessControl_SetVideoPosition 6 var,var #comfunc global IVMRWindowlessControl_GetVideoPosition 7 var,var #comfunc global IVMRWindowlessControl_GetAspectRatioMode 8 var #comfunc global IVMRWindowlessControl_SetAspectRatioMode 9 int #comfunc global IVMRWindowlessControl_SetVideoClippingWindow 10 sptr #comfunc global IVMRWindowlessControl_RepaintVideo 11 sptr,sptr #comfunc global IVMRWindowlessControl_DisplayModeChanged 12 #comfunc global IVMRWindowlessControl_GetCurrentImage 13 var #comfunc global IVMRWindowlessControl_SetBorderColor 14 int #comfunc global IVMRWindowlessControl_GetBorderColor 15 var #comfunc global IVMRWindowlessControl_SetColorKey 16 int #comfunc global IVMRWindowlessControl_GetColorKey 17 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IVMRWindowlessControl "{0EB1088C-4DCD-46F0-878F-39DAE86A51B7}" #usecom global IVMRWindowlessControl IID_IVMRWindowlessControl "{}" #comfunc global IVMRWindowlessControl_GetNativeVideoSize 3 sptr,sptr,sptr,sptr #comfunc global IVMRWindowlessControl_GetMinIdealVideoSize 4 sptr,sptr #comfunc global IVMRWindowlessControl_GetMaxIdealVideoSize 5 sptr,sptr #comfunc global IVMRWindowlessControl_SetVideoPosition 6 sptr,sptr #comfunc global IVMRWindowlessControl_GetVideoPosition 7 sptr,sptr #comfunc global IVMRWindowlessControl_GetAspectRatioMode 8 sptr #comfunc global IVMRWindowlessControl_SetAspectRatioMode 9 int #comfunc global IVMRWindowlessControl_SetVideoClippingWindow 10 sptr #comfunc global IVMRWindowlessControl_RepaintVideo 11 sptr,sptr #comfunc global IVMRWindowlessControl_DisplayModeChanged 12 #comfunc global IVMRWindowlessControl_GetCurrentImage 13 sptr #comfunc global IVMRWindowlessControl_SetBorderColor 14 int #comfunc global IVMRWindowlessControl_GetBorderColor 15 sptr #comfunc global IVMRWindowlessControl_SetColorKey 16 int #comfunc global IVMRWindowlessControl_GetColorKey 17 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。