IVMRSurfaceAllocator
COM公式ドキュメント
IVMRSurfaceAllocator インターフェイスは、Video Mixing Renderer Filter 7(VMR-7)の既定のアロケーター/プレゼンターによって実装されます。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
AllocateSurface メソッドは、DirectDraw サーフェスを割り当てます。
| dwUserID | UINT_PTR | in | この VMR インスタンスを一意に識別する、アプリケーション定義の DWORD_PTR クッキーです。1 つのアロケーター/プレゼンターのインスタンスを複数の VMR インスタンスで使用するシナリオで利用します。 |
| lpAllocInfo | VMRALLOCATIONINFO* | in | VMRALLOCATIONINFO 構造体を指定します。「解説」を参照してください。 |
| lpdwActualBuffers | DWORD* | inout | [out] 入力時は、要求するバッファーの数を指定するために使用します。出力時には、実際に作成されたバッファーの数を受け取ります。 |
| lplpSurface | IDirectDrawSurface7** | out | Direct3D サーフェスを受け取るポインターのアドレスです。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合はエラーコードを返します。
| 戻り値 | 説明 |
|---|---|
| いずれかのポインターが無効です。 | |
| dwFlags で、AMAP_3D_TARGET が AMAP_FORCE_SYSMEM または AMAP_ALLOW_SYSMEM と組み合わされていました。 | |
| lpAllocInfo->lpHdr で指定された BITMAPINFOHEADER 構造体の 1 つ以上のメンバーが正しくありません。 |
解説(Remarks)
AllocateSurface を明示的に呼び出す前に、クライアントアプリケーションは IVMRSurfaceAllocator::FreeSurface を呼び出して、DirectDraw デコードサーフェスのフロントバッファーが NULL であることを確認する必要があります。アプリケーションが AllocateSurface を呼び出した時点でそれが NULL でない場合、quartz.dll のデバッグ版はアサーションを発生させます。
このメソッドをカスタムのアロケーター/プレゼンターで実装する場合は、lpAllocInfo->lpHdr->biBitCount の値を調べる必要があります。biBitCount が 0 の場合は、現在のディスプレイのピクセル深度を設定する必要があります。biBitCount を 0 のままにすると、サーフェスの割り当てが失敗し、新しい(既定の)VMR が作成されます。
FreeSurface メソッドは、割り当てられた DirectDraw サーフェスを解放します。
| dwID | UINT_PTR | in | この VMR インスタンスを一意に識別する、アプリケーション定義の DWORD_PTR クッキーです。1 つのアロケーター/プレゼンターのインスタンスを複数の VMR インスタンスで使用するシナリオで利用します。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合はエラーコードを返します。
PrepareSurface メソッドは、次のビデオフレームをデコードして格納できるように DirectDraw サーフェスを準備します。
| dwUserID | UINT_PTR | in | この VMR インスタンスを一意に識別する、アプリケーション定義の DWORD_PTR クッキーです。1 つのアロケーター/プレゼンターのインスタンスを複数の VMR インスタンスで使用するシナリオで利用します。 |
| lpSurface | IDirectDrawSurface7* | in | DirectDraw サーフェスを指定します。 |
| dwSurfaceFlags | DWORD | in | サーフェスフラグを格納する DWORD です。「解説」を参照してください。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合はエラーコードを返します。
解説(Remarks)
VMR が現在ここでチェックする唯一のフラグは AM_GBF_NOTASYNCPOINT(0x00000002)です。これは、このバッファーを同期ポイント(キーフレーム)で埋めないことを示します。
AdviseNotify メソッドは、通知コールバック用の VMR-7 フィルターのインターフェイスをアロケーター/プレゼンターに提供します。
| lpIVMRSurfAllocNotify | IVMRSurfaceAllocatorNotify* | in | アロケーター/プレゼンターが VMR に通知を返すために使用する IVMRSurfaceAllocatorNotify インターフェイスポインターを指定します。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合はエラーコードを返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IVMRSurfaceAllocator "{31CE832E-4484-458B-8CCA-F4D7E3DB0B52}" #usecom global IVMRSurfaceAllocator IID_IVMRSurfaceAllocator "{}" #comfunc global IVMRSurfaceAllocator_AllocateSurface 3 sptr,var,var,sptr #comfunc global IVMRSurfaceAllocator_FreeSurface 4 sptr #comfunc global IVMRSurfaceAllocator_PrepareSurface 5 sptr,sptr,int #comfunc global IVMRSurfaceAllocator_AdviseNotify 6 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IVMRSurfaceAllocator "{31CE832E-4484-458B-8CCA-F4D7E3DB0B52}" #usecom global IVMRSurfaceAllocator IID_IVMRSurfaceAllocator "{}" #comfunc global IVMRSurfaceAllocator_AllocateSurface 3 sptr,sptr,sptr,sptr #comfunc global IVMRSurfaceAllocator_FreeSurface 4 sptr #comfunc global IVMRSurfaceAllocator_PrepareSurface 5 sptr,sptr,int #comfunc global IVMRSurfaceAllocator_AdviseNotify 6 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。