IVMRDeinterlaceControl9
COM公式ドキュメント
IVMRDeinterlaceControl9 インターフェイスは、Video Mixing Renderer Filter 9 (VMR-9) を使用したハードウェアアクセラレーションによるデインターレース処理をサポートします。
解説(Remarks)
デインターレースモードは GUID によって識別されます。グラフィックスデバイスドライバーは、サポートするモードの GUID 配列を返します。この配列は、品質の高い順から低い順へと並べられています。GUID の一覧を取得するには、GetNumberOfDeinterlaceModes メソッドを呼び出します。特定のモードに関する詳細情報を取得するには、この GUID を GetDeinterlaceModeCaps メソッドに渡します。特定のモードを使用するように VMR を構成するには、SetDeinterlaceMode メソッドを呼び出します。
利用可能なデインターレースモードを判別するには、次の手順を実行します。
- VMR-9 を作成し、ミキシングモードに設定します。
- VMR-9 に対して IVMRDeinterlaceControl9 インターフェイスをクエリします。
- インターレースビデオの形式を記述する VMRVideoDesc 構造体を設定します。
- IVMRDeinterlaceControl9::GetNumberOfDeinterlaceModes を呼び出して、利用可能なデインターレースモードの数を取得します。
- 返された各モードについて、IVMRDeinterlaceControl::GetDeinterlaceModeCaps を呼び出して、そのモードに関する情報を取得します。
メソッド 7
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetNumberOfDeinterlaceModes メソッドは、指定されたビデオ形式に対して VMR が利用できるデインターレースモードを取得します。
| lpVideoDescription | VMR9VideoDesc* | in | ビデオを記述する VMR9VideoDesc 構造体へのポインター。 |
| lpdwNumDeinterlaceModes | DWORD* | inout | DWORD 値へのポインター。入力時、この値は lpDeinterlaceModes で指定された配列のサイズを指定します。出力時には、メソッドが配列にコピーした GUID の数を受け取ります。 |
| lpDeinterlaceModes | GUID* | out | 呼び出し側が割り当てた配列のアドレス。メソッドはこの配列に GUID 値を格納します。必要な配列のサイズを判別するには、このパラメーターを NULL に設定し、lpdwNumDeinterlaceModes で返される値を確認します。 |
戻り値
HRESULT 値を返します。想定される値は次のとおりです。
| 戻り値 | 説明 |
|---|---|
| NULL ポインター引数です。 | |
| 成功しました。 | |
| VMR がミキサーモードではありません。 | |
| ビデオカードがハードウェアデインターレースをサポートしていません。 |
解説(Remarks)
このメソッドは GUID の配列を返します。各 GUID は、グラフィックスデバイスドライバーによってハードウェアでサポートされるデインターレースモードを表します。配列は品質順に並べられており、最初のエントリが最高品質、2 番目のエントリが次に高い品質、というように続きます。
すべてのドライバーは、次のモードをサポートする必要があります。
| GUID | 説明 |
|---|---|
| DXVA_DeinterlaceBobDevice | Bob モード |
ドライバーは追加のモードをサポートでき、それらを識別するために独自の GUID を定義する必要があります。返された各モードについて、IVMRDeinterlaceControl9::GetDeinterlaceModeCaps メソッドを呼び出して、そのモードに関する情報を取得します。
GetDeinterlaceModeCaps メソッドは、グラフィックスデバイスドライバーがサポートするデインターレースモードの機能を取得します。
| lpDeinterlaceMode | GUID* | in | デインターレースモードを識別する GUID へのポインター。IVMRDeinterlaceControl9::GetNumberOfDeinterlaceModes メソッドを呼び出して、ドライバーがサポートする GUID の一覧を取得します。 |
| lpVideoDescription | VMR9VideoDesc* | in | デインターレース対象のビデオを記述する VMR9VideoDesc 構造体へのポインター。 メソッドを呼び出す前に、構造体の dwSize メンバーを設定してください。 |
| lpDeinterlaceCaps | VMR9DeinterlaceCaps* | out | VMR9DeinterlaceCaps 構造体へのポインター。メソッドを呼び出す前に、構造体の dwSize メンバーを設定してください。メソッドは、指定されたデインターレースモードに関する情報でこの構造体を埋めます。 |
戻り値
HRESULT 値を返します。想定される値は次のとおりです。
| 戻り値 | 説明 |
|---|---|
| NULL ポインター引数です。 | |
| 成功しました。 | |
| 引数が無効です。 | |
| ビデオカードがハードウェアデインターレースをサポートしていません。 | |
| ビデオカードがハードウェアデインターレースをサポートしていません。 | |
| VMR がミキサーモードではありません。 |
解説(Remarks)
VMR9VideoDesc 構造体および VMR9DeinterlaceCaps 構造体の dwSize メンバーを設定しない場合、このメソッドは E_INVALIDARG を返します。
GetDeinterlaceMode メソッドは、指定されたビデオストリームのデインターレースモードを取得します。
| dwStreamID | DWORD | in | 確認するビデオストリームのインデックス。 |
| lpDeinterlaceMode | GUID* | out | GUID を受け取る変数へのポインター。この GUID は、現在使用中のデインターレースモードを識別します。デインターレースモードが設定されていない場合、またはストリーム ID に対応するピンがインターレースストリームに接続されていない場合、値は GUID_NULL になります。 |
戻り値
HRESULT 値を返します。想定される値は次のとおりです。
| 戻り値 | 説明 |
|---|---|
| ストリーム番号が無効です。 | |
| NULL ポインター引数です。 | |
| デインターレースモードが設定されていません。 | |
| 成功しました。 | |
| VMR がミキサーモードではありません。 |
解説(Remarks)
VMR が要求されたモードを使用できない場合があります。その場合、IVMRDeinterlaceControl9::SetDeinterlacePrefs メソッドで指定されているとおり、別のデインターレースモードにフォールバックします。
SetDeinterlaceMode メソッドは、指定されたビデオストリームのデインターレースモードを設定します。
| dwStreamID | DWORD | in | 設定するビデオストリームのインデックス。すべてのストリームを設定するには、値 0xFFFFFFFF を使用します。 |
| lpDeinterlaceMode | GUID* | in | デインターレースモードを指定する GUID へのポインター。デインターレースを無効にするには、値 GUID_NULL を使用します。 |
戻り値
HRESULT 値を返します。想定される値は次のとおりです。
| 戻り値 | 説明 |
|---|---|
| ストリーム番号が無効です。 | |
| NULL ポインター引数です。 | |
| 成功しました。 | |
| VMR がミキサーモードではありません。 |
解説(Remarks)
アプリケーションがモードを指定しない場合、VMR は既定でドライバーが報告した最初のモードを使用します。いずれの場合も、VMR が優先モードを使用できないときは、IVMRDeinterlaceControl9::SetDeinterlacePrefs メソッドで指定されているとおり、別のモードにフォールバックします。
SetDeinterlaceMode メソッドは、VMR に対して新たに行われる接続に対してのみ有効です。一部のデインターレースモードでは、追加の参照サンプルが利用可能である必要があります。正確な数はモードによって異なります。VMR はこれらの追加サンプル用にサーフェスを割り当てます。クライアントは、サーフェスが割り当てられる前にデインターレースモードを設定する必要があります。サーフェスの割り当ては、次のいずれかの後に発生します。
- ピン接続(動的な再接続を含む)
- 動的な形式変更(上流のフィルターが IPin::ReceiveConnection を呼び出して新しい形式を指定する場合)
- 解像度の変更
- モニターの変更
GetDeinterlacePrefs メソッドは、優先するデインターレースモードを使用できない場合に VMR がデインターレースモードをどのように選択するかをクエリします。
| lpdwDeinterlacePrefs | DWORD* | out | VMR9DeinterlacePrefs 列挙型のメンバーを受け取る変数へのポインター。 |
戻り値
HRESULT 値を返します。想定される値は次のとおりです。
| 戻り値 | 説明 |
|---|---|
| NULL ポインター引数です。 | |
| 成功しました。 | |
| VMR がミキサーモードではありません。 |
解説(Remarks)
既定では、優先するデインターレースモードはドライバーが報告した最初のモードです。アプリケーションは、IVMRDeinterlaceControl9::SetDeinterlaceMode メソッドを呼び出して優先モードを設定できます。VMR が優先モードを使用できない場合、dwDeinterlacePrefs パラメーターで指定されたとおりに別のモードへフォールバックします。
SetDeinterlacePrefs メソッドは、優先するデインターレースモードを使用できない場合に VMR がデインターレースモードをどのように選択するかを指定します。
| dwDeinterlacePrefs | DWORD | in | VMR9DeinterlacePrefs 列挙型のメンバーを指定します。 |
戻り値
HRESULT 値を返します。想定される値は次のとおりです。
| 戻り値 | 説明 |
|---|---|
| 引数が無効です。 | |
| 成功しました。 | |
| VMR がミキサーモードではありません。 |
解説(Remarks)
既定では、優先するデインターレースモードはドライバーが報告した最初のモードです。アプリケーションは、IVMRDeinterlaceControl9::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_IVMRDeinterlaceControl9 "{A215FB8D-13C2-4F7F-993C-003D6271A459}" #usecom global IVMRDeinterlaceControl9 IID_IVMRDeinterlaceControl9 "{}" #comfunc global IVMRDeinterlaceControl9_GetNumberOfDeinterlaceModes 3 var,var,var #comfunc global IVMRDeinterlaceControl9_GetDeinterlaceModeCaps 4 var,var,var #comfunc global IVMRDeinterlaceControl9_GetDeinterlaceMode 5 int,var #comfunc global IVMRDeinterlaceControl9_SetDeinterlaceMode 6 int,var #comfunc global IVMRDeinterlaceControl9_GetDeinterlacePrefs 7 var #comfunc global IVMRDeinterlaceControl9_SetDeinterlacePrefs 8 int #comfunc global IVMRDeinterlaceControl9_GetActualDeinterlaceMode 9 int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IVMRDeinterlaceControl9 "{A215FB8D-13C2-4F7F-993C-003D6271A459}" #usecom global IVMRDeinterlaceControl9 IID_IVMRDeinterlaceControl9 "{}" #comfunc global IVMRDeinterlaceControl9_GetNumberOfDeinterlaceModes 3 sptr,sptr,sptr #comfunc global IVMRDeinterlaceControl9_GetDeinterlaceModeCaps 4 sptr,sptr,sptr #comfunc global IVMRDeinterlaceControl9_GetDeinterlaceMode 5 int,sptr #comfunc global IVMRDeinterlaceControl9_SetDeinterlaceMode 6 int,sptr #comfunc global IVMRDeinterlaceControl9_GetDeinterlacePrefs 7 sptr #comfunc global IVMRDeinterlaceControl9_SetDeinterlacePrefs 8 int #comfunc global IVMRDeinterlaceControl9_GetActualDeinterlaceMode 9 int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。