IVMRDeinterlaceControl
COM公式ドキュメント
IVMRDeinterlaceControl インターフェイスは、Video Mixing Renderer Filter 7 (VMR-7) を使用した高度なハードウェアアクセラレーションによるデインターレース処理のサポートを提供します。
解説(Remarks)
このインターフェイスは、VMR がミキサーモードの場合にのみ有効です。VMR がミキサーモードでない場合、このインターフェイスのすべてのメソッドは VFW_E_VMR_NOT_IN_MIXER_MODE を返します。
デインターレースモードは GUID によって識別されます。グラフィックスデバイスドライバーは、サポートするモードの GUID の配列を返します。この配列は品質順に、最高品質から最低品質へとソートされています。GUID のリストを取得するには、GetNumberOfDeinterlaceModes メソッドを呼び出します。特定のモードに関する詳細情報を取得するには、その GUID を GetDeinterlaceModeCaps メソッドに渡します。特定のモードを使用するように VMR を構成するには、SetDeinterlaceMode メソッドを呼び出します。
メソッド 7
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetNumberOfDeinterlaceModes メソッドは、指定したビデオ形式に対して VMR が使用できるデインターレースモードを取得します。
| lpVideoDescription | VMRVideoDesc* | in | ビデオを記述する VMRVideoDesc 構造体へのポインター。 |
| lpdwNumDeinterlaceModes | DWORD* | inout | DWORD 値へのポインター。入力時、この値は lpDeinterlaceModes で渡す配列のサイズを指定します。出力時には、メソッドが配列にコピーした GUID の数を受け取ります。 |
| lpDeinterlaceModes | GUID* | out | 呼び出し元が割り当てた配列のアドレス。メソッドはこの配列を GUID 値で埋めます。必要な配列のサイズを判別するには、このパラメーターを NULL に設定し、lpdwNumDeinterlaceModes で返される値を確認します。 |
戻り値
HRESULT 値を返します。指定できる値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| 引数が NULL ポインターです。 | |
| 成功 | |
| VMR がミキサーモードではありません。 | |
| ビデオカードがハードウェアデインターレースをサポートしていません。 |
解説(Remarks)
このメソッドは GUID の配列を返します。各 GUID は、グラフィックスデバイスドライバーによってハードウェアでサポートされるデインターレースモードを表します。配列は品質順にソートされており、最初のエントリが最高品質を、2 番目のエントリが次に高い品質を、というように表します。
すべてのドライバーは、次のモードをサポートすることが必須です。
| GUID | 説明 |
|---|---|
| DXVA_DeinterlaceBobDevice | Bob モード |
ドライバーは追加のモードをサポートでき、それらを識別するために独自の GUID を定義する必要があります。返された各モードについて、そのモードに関する情報を取得するには IVMRDeinterlaceControl::GetDeinterlaceModeCaps メソッドを呼び出します。
GetDeinterlaceModeCaps メソッドは、グラフィックスデバイスドライバーがサポートする特定のデインターレースモードの機能を取得します。
| lpDeinterlaceMode | GUID* | in | デインターレースモードを識別する GUID へのポインター。ドライバーがサポートする GUID のリストを取得するには、GetNumberOfDeinterlaceModes メソッドを呼び出します。 |
| lpVideoDescription | VMRVideoDesc* | in | デインターレース処理するビデオを記述する VMRVideoDesc 構造体へのポインター。メソッドを呼び出す前に、構造体の dwSize メンバーを設定してください。 |
| lpDeinterlaceCaps | VMRDeinterlaceCaps* | inout | VMRDeinterlaceCaps 構造体へのポインター。メソッドを呼び出す前に、構造体の dwSize メンバーを設定してください。メソッドは、指定したデインターレースモードに関する情報でこの構造体を埋めます。 |
戻り値
HRESULT 値を返します。指定できる値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| 引数が NULL ポインターです。 | |
| 成功。 | |
| 引数が無効です。 | |
| ビデオカードがハードウェアデインターレースをサポートしていません。 | |
| ビデオカードがハードウェアデインターレースをサポートしていません。 | |
| VMR がミキサーモードではありません。 |
解説(Remarks)
このメソッドは VMRVideoDesc 構造体と VMRDeinterlaceCaps 構造体を返します。
GetDeinterlaceMode メソッドは、指定したビデオストリームのデインターレースモードを取得します。
| dwStreamID | DWORD | in | 確認するビデオストリームのインデックス。 |
| lpDeinterlaceMode | GUID* | out | GUID を受け取る変数へのポインター。この GUID は現在使用中のデインターレースモードを識別します。デインターレースモードが設定されていない場合、値は GUID_NULL になります。 |
戻り値
HRESULT 値を返します。指定できる値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| ストリーム番号が無効です。 | |
| 引数が NULL ポインターです。 | |
| デインターレースモードが設定されていません。 | |
| 成功。 | |
| VMR がミキサーモードではありません。 |
解説(Remarks)
VMR が要求されたモードを使用できない場合があります。その場合、VMR は IVMRDeinterlaceControl::SetDeinterlacePrefs メソッドで指定された別のデインターレースモードにフォールバックします。
SetDeinterlaceMode メソッドは、指定したビデオストリームのデインターレースモードを設定します。
| dwStreamID | DWORD | in | 設定するビデオストリームのインデックス。すべてのストリームを設定するには、値 0xFFFFFFFF を使用します。 |
| lpDeinterlaceMode | GUID* | in | デインターレースモードを指定する GUID へのポインター。デインターレースをオフにするには、値 GUID_NULL を使用します。 |
戻り値
HRESULT 値を返します。指定できる値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| ストリーム番号が無効です。 | |
| 引数が NULL ポインターです。 | |
| 成功。 | |
| VMR がミキサーモードではありません。 |
解説(Remarks)
アプリケーションがモードを指定しない場合、VMR はドライバーが報告する最初のモードを既定として使用します。いずれの場合も、VMR が優先モードを使用できないときは、IVMRDeinterlaceControl::SetDeinterlacePrefs メソッドで指定された別のモードにフォールバックします。
SetDeinterlaceMode メソッドは、VMR への新しい接続に対してのみ有効です。一部のデインターレースモードでは追加の参照サンプルが必要であり、その正確な数はモードによって異なります。VMR はこれらの追加サンプル用のサーフェスを割り当てます。クライアントは、サーフェスが割り当てられる前にデインターレースモードを設定する必要があります。サーフェスの割り当ては、次のいずれかの後に発生します。
- ピン接続 (動的再接続を含む)
- 動的な形式変更 (アップストリームフィルターが IPin::ReceiveConnection を呼び出して新しい形式を指定する場合)
- 解像度の変更
- モニターの変更
GetDeinterlacePrefs メソッドは、優先デインターレースモードを使用できない場合に VMR がどのようにデインターレースモードを選択するかを照会します。
| lpdwDeinterlacePrefs | DWORD* | out | VMRDeinterlacePrefs 列挙型のメンバーを受け取る変数へのポインター。 |
戻り値
HRESULT 値を返します。指定できる値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| 引数が NULL ポインターです。 | |
| 成功。 | |
| VMR がミキサーモードではありません。 |
解説(Remarks)
既定では、優先デインターレースモードはドライバーが報告する最初のモードです。アプリケーションは、IVMRDeinterlaceControl::SetDeinterlaceMode メソッドを呼び出して優先モードを設定できます。VMR が優先モードを使用できない場合は、dwDeinterlacePrefs パラメーターで指定された別のモードにフォールバックします。
SetDeinterlacePrefs メソッドは、優先デインターレースモードを使用できない場合に VMR がどのようにデインターレースモードを選択するかを指定します。
| dwDeinterlacePrefs | DWORD | in | VMRDeinterlacePrefs 列挙型のメンバー。 |
戻り値
HRESULT 値を返します。指定できる値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| 引数が無効です。 | |
| 成功。 | |
| VMR がミキサーモードではありません。 |
解説(Remarks)
既定では、優先デインターレースモードはドライバーが報告する最初のモードです。アプリケーションは、IVMRDeinterlaceControl::SetDeinterlaceMode メソッドを呼び出して優先モードを設定できます。VMR が優先モードを使用できない場合は、dwDeinterlacePrefs パラメーターで指定された別のモードにフォールバックします。
GetActualDeinterlaceMode メソッドは、指定したストリームに対して VMR が使用しているデインターレースモードを返します。
| dwStreamID | DWORD | in | ビデオストリームのインデックス。 |
| lpDeinterlaceMode | GUID* | out | デインターレースモードを識別する GUID 値を受け取る変数へのポインター。VMR がデインターレースハードウェアを初期化していない場合、または VMR がこのストリームをデインターレースすべきでないと判断した場合、メソッドは GUID_NULL を返します。 |
戻り値
HRESULT 値を返します。指定できる値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| ストリーム番号が無効です。 | |
| 引数が NULL ポインターです。 | |
| 成功。 | |
| VMR がミキサーモードではありません。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IVMRDeinterlaceControl "{BB057577-0DB8-4E6A-87A7-1A8C9A505A0F}" #usecom global IVMRDeinterlaceControl IID_IVMRDeinterlaceControl "{}" #comfunc global IVMRDeinterlaceControl_GetNumberOfDeinterlaceModes 3 var,var,var #comfunc global IVMRDeinterlaceControl_GetDeinterlaceModeCaps 4 var,var,var #comfunc global IVMRDeinterlaceControl_GetDeinterlaceMode 5 int,var #comfunc global IVMRDeinterlaceControl_SetDeinterlaceMode 6 int,var #comfunc global IVMRDeinterlaceControl_GetDeinterlacePrefs 7 var #comfunc global IVMRDeinterlaceControl_SetDeinterlacePrefs 8 int #comfunc global IVMRDeinterlaceControl_GetActualDeinterlaceMode 9 int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IVMRDeinterlaceControl "{BB057577-0DB8-4E6A-87A7-1A8C9A505A0F}" #usecom global IVMRDeinterlaceControl IID_IVMRDeinterlaceControl "{}" #comfunc global IVMRDeinterlaceControl_GetNumberOfDeinterlaceModes 3 sptr,sptr,sptr #comfunc global IVMRDeinterlaceControl_GetDeinterlaceModeCaps 4 sptr,sptr,sptr #comfunc global IVMRDeinterlaceControl_GetDeinterlaceMode 5 int,sptr #comfunc global IVMRDeinterlaceControl_SetDeinterlaceMode 6 int,sptr #comfunc global IVMRDeinterlaceControl_GetDeinterlacePrefs 7 sptr #comfunc global IVMRDeinterlaceControl_SetDeinterlacePrefs 8 int #comfunc global IVMRDeinterlaceControl_GetActualDeinterlaceMode 9 int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。