IMFVideoDisplayControl
COM公式ドキュメント
Enhanced Video Renderer (EVR) がビデオを表示する方法を制御します。
メソッド 16
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ビデオレンダラーによる引き伸ばしが行われる前の、ビデオのサイズとアスペクト比を取得します。
| pszVideo | SIZE* | inout | ネイティブのビデオ矩形のサイズを受け取ります。このパラメーターは NULL にできます。 |
| pszARVideo | SIZE* | inout | ビデオのアスペクト比を受け取ります。このパラメーターは NULL にできます。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 少なくとも一方のパラメーターは非 NULL でなければなりません。 | |
| ビデオレンダラーはシャットダウンされています。 |
解説(Remarks)
いずれのビデオストリームにもメディアタイプが設定されていない場合、メソッドは成功しますが、すべてのパラメーターはゼロに設定されます。
pszVideo または pszARVideo を NULL に設定できますが、両方を同時に設定することはできません。
パフォーマンスや画質を著しく低下させることなく Enhanced Video Renderer (EVR) が表示できるサイズの範囲を取得します。
| pszMin | SIZE* | inout | 最小の理想サイズを受け取ります。このパラメーターは NULL にできます。 |
| pszMax | SIZE* | inout | 最大の理想サイズを受け取ります。このパラメーターは NULL にできます。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 少なくとも一方のパラメーターは非 NULL でなければなりません。 | |
| ビデオレンダラーはシャットダウンされています。 |
解説(Remarks)
pszMin または pszMax を NULL に設定できますが、両方を同時に設定することはできません。
ビデオのソース矩形と表示先矩形を設定します。
| pnrcSource | MFVideoNormalizedRect* | in | ソース矩形を指定する MFVideoNormalizedRect 構造体へのポインター。このパラメーターは NULL にできます。NULL の場合、ソース矩形は変更されません。 |
| prcDest | RECT* | in | 表示先矩形を指定します。このパラメーターは NULL にできます。NULL の場合、表示先矩形は変更されません。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 少なくとも一方のパラメーターは非 NULL でなければなりません。 | |
| ビデオレンダラーはシャットダウンされています。 |
解説(Remarks)
ソース矩形は、ビデオのどの部分を表示するかを定義します。これは正規化座標で指定します。詳細については MFVideoNormalizedRect 構造体を参照してください。ビデオ画像全体を表示するには、ソース矩形を {0, 0, 1, 1} に設定します。既定のソース矩形は {0, 0, 1, 1} です。
表示先矩形は、クリッピングウィンドウ内でビデオが表示される矩形を定義します。これはウィンドウのクライアント領域を基準としたピクセル単位で指定します。ウィンドウ全体を埋めるには、表示先矩形を {0, 0, width, height} に設定します。ここで width と height はウィンドウのクライアント領域の寸法です。既定の表示先矩形は {0, 0, 0, 0} です。
これらの矩形のうち一方だけを更新するには、もう一方のパラメーターを NULL に設定します。pnrcSource または prcDest を NULL に設定できますが、両方を同時に設定することはできません。
表示先矩形 (prcDest) を設定する前に、IMFVideoDisplayControl::SetVideoWindow を呼び出してビデオウィンドウを設定する必要があります。(Media Foundation バージョンの EVR では、MFCreateVideoRendererActivate 関数でビデオウィンドウを指定することもできます。) ビデオウィンドウが指定されていない場合、SetVideoPosition は E_POINTER を返します。
ビデオのソース矩形と表示先矩形を取得します。
| pnrcSource | MFVideoNormalizedRect* | out | ソース矩形を受け取る MFVideoNormalizedRect 構造体へのポインター。 |
| prcDest | RECT* | out | 現在の表示先矩形を受け取ります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 1 つ以上の必須パラメーターが NULL です。 | |
| ビデオレンダラーはシャットダウンされています。 |
Enhanced Video Renderer (EVR) がソースビデオのアスペクト比をどのように扱うかを指定します。
| dwAspectRatioMode | DWORD | in | MFVideoAspectRatioMode 列挙型の 1 つ以上のフラグのビットごとの OR。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効なフラグです。 | |
| ビデオレンダラーはシャットダウンされています。 |
Enhanced Video Renderer (EVR) がソースビデオのアスペクト比をどのように扱うかを照会します。
| pdwAspectRatioMode | DWORD* | out | MFVideoAspectRatioMode 列挙型の 1 つ以上のフラグのビットごとの OR を受け取ります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ビデオレンダラーはシャットダウンされています。 |
ビデオのクリッピングウィンドウを設定します。
| hwndVideo | HWND | in | Enhanced Video Renderer (EVR) がビデオを描画するウィンドウのハンドル。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| hwndVideo が有効なウィンドウを指定していません。 | |
| DWM のサムネイルが有効化/無効化されませんでした。 |
解説(Remarks)
アプリケーションが有効なウィンドウハンドルを指定してこのメソッドを呼び出さない限り、EVR はビデオを表示しません。
保護されたコンテンツの場合、このメソッドはそのウィンドウに対する Desktop Window Manager (DWM) のサムネイルプレビューを無効化することがあります。サムネイルプレビューを無効化できない場合、メソッドは S_FALSE を返します。
ビデオのクリッピングウィンドウを取得します。
| phwndVideo | HWND* | out | Enhanced Video Renderer (EVR) がビデオを描画するウィンドウのハンドルを受け取ります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ビデオレンダラーはシャットダウンされています。 |
解説(Remarks)
既定のクリッピングウィンドウはありません。アプリケーションがクリッピングウィンドウを設定する必要があります。
現在のビデオフレームを再描画します。アプリケーションが WM_PAINT メッセージを受け取るたびに、このメソッドを呼び出してください。
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| EVR は現時点でフレームを再描画できません。このエラーは、EVR が全画面モードとウィンドウモードを切り替えている間に発生することがあります。呼び出し元はこのエラーを安全に無視できます。 | |
| ビデオレンダラーはシャットダウンされています。 |
ビデオレンダラーが現在表示している画像のコピーを取得します。
| pBih | BITMAPINFOHEADER* | inout | ビットマップの記述を受け取る BITMAPINFOHEADER 構造体へのポインター。メソッドを呼び出す前に、構造体の biSize メンバーを sizeof(BITMAPINFOHEADER) に設定してください。 |
| pDib | BYTE** | out | パックされた Windows デバイス非依存ビットマップ (DIB) を含むバッファーへのポインターを受け取ります。呼び出し元は CoTaskMemFree を呼び出してビットマップのメモリを解放する必要があります。 |
| pcbDib | DWORD* | out | pDib で返されるバッファーのサイズをバイト単位で受け取ります。 |
| pTimeStamp | LONGLONG* | inout | キャプチャされた画像のタイムスタンプを受け取ります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| コンテンツは保護されており、ライセンスは画像のキャプチャを許可していません。 | |
| ビデオレンダラーはシャットダウンされています。 |
解説(Remarks)
このメソッドはいつでも呼び出せます。ただし、このメソッドを頻繁に呼び出しすぎると、ビデオ再生のパフォーマンスが低下します。
このメソッドは、サブストリーム、アルファブレンドされたビットマップ、アスペクト比補正、背景色などをすべて含む、最終的に合成された画像のコピーを取得します。
ウィンドウモードでは、ビットマップは IMFVideoDisplayControl::SetVideoPosition で指定された表示先矩形のサイズになります。全画面モードでは、ビットマップはディスプレイのサイズになります。
ビデオの境界色を設定します。
| Clr | COLORREF | in | 境界色を COLORREF 値として指定します。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ビデオレンダラーはシャットダウンされています。 |
解説(Remarks)
既定では、ビデオウィンドウが 2 つのモニターにまたがる場合、Enhanced Video Renderer (EVR) はビデオを一方のモニターにクリップし、ウィンドウの残りの部分に境界色を描画します。(クリッピングの動作を変更するには、IMFVideoDisplayControl::SetRenderingPrefs を呼び出します。)
境界色はレターボックスには使用されません。レターボックスの色を変更するには、IMFVideoProcessor::SetBackgroundColor を呼び出します。
ビデオの境界色を取得します。
| pClr | COLORREF* | out | 境界色を COLORREF 値として受け取ります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ビデオレンダラーはシャットダウンされています。 |
解説(Remarks)
境界色は、Enhanced Video Renderer (EVR) がビデオを描画しない領域に使用されます。
境界色はレターボックスには使用されません。レターボックスの色を取得するには、IMFVideoProcessor::GetBackgroundColor を呼び出します。
ビデオレンダリングに関するさまざまな設定を指定します。
| dwRenderFlags | DWORD | in | MFVideoRenderPrefs 列挙型の 0 個以上のフラグのビットごとの OR。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効なフラグです。 | |
| ビデオレンダラーはシャットダウンされています。 |
ビデオレンダリングに関するさまざまな設定を取得します。
| pdwRenderFlags | DWORD* | out | MFVideoRenderPrefs 列挙型の 0 個以上のフラグのビットごとの OR を受け取ります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ビデオレンダラーはシャットダウンされています。 |
全画面レンダリングモードを設定または解除します。
| fFullscreen | BOOL | in | TRUE の場合、Enhanced Video Renderer (EVR) は全画面モードを使用します。FALSE の場合、EVR はアプリケーションが提供するクリッピングウィンドウにビデオを描画します。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ビデオレンダラーはシャットダウンされています。 |
解説(Remarks)
既定の EVR プレゼンターは、Direct3D の排他モードを使用して全画面モードを実装します。
このメソッドを使用して全画面モードに切り替える場合は、アプリケーションウィンドウを最前面ウィンドウに設定し、ウィンドウのサイズをモニター全体を覆うように変更してください。これにより、アプリケーションウィンドウがすべてのマウスクリックメッセージを受け取ることが保証されます。また、キーボードフォーカスをアプリケーションウィンドウに設定してください。全画面モードを解除する際は、ウィンドウの元のサイズと位置を復元してください。
既定では、全画面モードでもカーソルは表示されたままです。カーソルを非表示にするには、ShowCursor を呼び出します。
全画面モードへの移行および全画面モードからの移行は非同期に行われます。現在のモードを取得するには、IMFVideoDisplayControl::GetFullscreen を呼び出します。
Enhanced Video Renderer (EVR) が現在全画面モードであるかどうかを照会します。
| pfFullscreen | BOOL* | out | ブール値を受け取ります。TRUE の場合、EVR は全画面モードです。FALSE の場合、EVR はアプリケーションが提供するクリッピングウィンドウ内にビデオを表示します。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| EVR は現在、全画面モードとウィンドウモードを切り替えています。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFVideoDisplayControl "{A490B1E4-AB84-4D31-A1B2-181E03B1077A}" #usecom global IMFVideoDisplayControl IID_IMFVideoDisplayControl "{}" #comfunc global IMFVideoDisplayControl_GetNativeVideoSize 3 var,var #comfunc global IMFVideoDisplayControl_GetIdealVideoSize 4 var,var #comfunc global IMFVideoDisplayControl_SetVideoPosition 5 var,var #comfunc global IMFVideoDisplayControl_GetVideoPosition 6 var,var #comfunc global IMFVideoDisplayControl_SetAspectRatioMode 7 int #comfunc global IMFVideoDisplayControl_GetAspectRatioMode 8 var #comfunc global IMFVideoDisplayControl_SetVideoWindow 9 sptr #comfunc global IMFVideoDisplayControl_GetVideoWindow 10 sptr #comfunc global IMFVideoDisplayControl_RepaintVideo 11 #comfunc global IMFVideoDisplayControl_GetCurrentImage 12 var,var,var,var #comfunc global IMFVideoDisplayControl_SetBorderColor 13 int #comfunc global IMFVideoDisplayControl_GetBorderColor 14 var #comfunc global IMFVideoDisplayControl_SetRenderingPrefs 15 int #comfunc global IMFVideoDisplayControl_GetRenderingPrefs 16 var #comfunc global IMFVideoDisplayControl_SetFullscreen 17 int #comfunc global IMFVideoDisplayControl_GetFullscreen 18 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMFVideoDisplayControl "{A490B1E4-AB84-4D31-A1B2-181E03B1077A}" #usecom global IMFVideoDisplayControl IID_IMFVideoDisplayControl "{}" #comfunc global IMFVideoDisplayControl_GetNativeVideoSize 3 sptr,sptr #comfunc global IMFVideoDisplayControl_GetIdealVideoSize 4 sptr,sptr #comfunc global IMFVideoDisplayControl_SetVideoPosition 5 sptr,sptr #comfunc global IMFVideoDisplayControl_GetVideoPosition 6 sptr,sptr #comfunc global IMFVideoDisplayControl_SetAspectRatioMode 7 int #comfunc global IMFVideoDisplayControl_GetAspectRatioMode 8 sptr #comfunc global IMFVideoDisplayControl_SetVideoWindow 9 sptr #comfunc global IMFVideoDisplayControl_GetVideoWindow 10 sptr #comfunc global IMFVideoDisplayControl_RepaintVideo 11 #comfunc global IMFVideoDisplayControl_GetCurrentImage 12 sptr,sptr,sptr,sptr #comfunc global IMFVideoDisplayControl_SetBorderColor 13 int #comfunc global IMFVideoDisplayControl_GetBorderColor 14 sptr #comfunc global IMFVideoDisplayControl_SetRenderingPrefs 15 int #comfunc global IMFVideoDisplayControl_GetRenderingPrefs 16 sptr #comfunc global IMFVideoDisplayControl_SetFullscreen 17 int #comfunc global IMFVideoDisplayControl_GetFullscreen 18 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。