Win32 API 日本語リファレンス
ホームMedia.DirectShow › IVMRSurfaceAllocator

IVMRSurfaceAllocator

COM
IID31ce832e-4484-458b-8cca-f4d7e3db0b52継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IVMRSurfaceAllocator インターフェイスは、Video Mixing Renderer Filter 7(VMR-7)の既定のアロケーター/プレゼンターによって実装されます。

メソッド 4

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT AllocateSurface(UINT_PTR dwUserID, VMRALLOCATIONINFO* lpAllocInfo, DWORD* lpdwActualBuffers, IDirectDrawSurface7** lplpSurface)

AllocateSurface メソッドは、DirectDraw サーフェスを割り当てます。

dwUserIDUINT_PTRinこの VMR インスタンスを一意に識別する、アプリケーション定義の DWORD_PTR クッキーです。1 つのアロケーター/プレゼンターのインスタンスを複数の VMR インスタンスで使用するシナリオで利用します。
lpAllocInfoVMRALLOCATIONINFO*inVMRALLOCATIONINFO 構造体を指定します。「解説」を参照してください。
lpdwActualBuffersDWORD*inout[out] 入力時は、要求するバッファーの数を指定するために使用します。出力時には、実際に作成されたバッファーの数を受け取ります。
lplpSurfaceIDirectDrawSurface7**outDirect3D サーフェスを受け取るポインターのアドレスです。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合はエラーコードを返します。

戻り値 説明
E_POINTER
いずれかのポインターが無効です。
E_INVALIDARG
dwFlags で、AMAP_3D_TARGETAMAP_FORCE_SYSMEM または AMAP_ALLOW_SYSMEM と組み合わされていました。
E_FAIL
lpAllocInfo->lpHdr で指定された BITMAPINFOHEADER 構造体の 1 つ以上のメンバーが正しくありません。

解説(Remarks)

AllocateSurface を明示的に呼び出す前に、クライアントアプリケーションは IVMRSurfaceAllocator::FreeSurface を呼び出して、DirectDraw デコードサーフェスのフロントバッファーが NULL であることを確認する必要があります。アプリケーションが AllocateSurface を呼び出した時点でそれが NULL でない場合、quartz.dll のデバッグ版はアサーションを発生させます。

このメソッドをカスタムのアロケーター/プレゼンターで実装する場合は、lpAllocInfo->lpHdr->biBitCount の値を調べる必要があります。biBitCount が 0 の場合は、現在のディスプレイのピクセル深度を設定する必要があります。biBitCount を 0 のままにすると、サーフェスの割り当てが失敗し、新しい(既定の)VMR が作成されます。

vtbl 4 HRESULT FreeSurface(UINT_PTR dwID)

FreeSurface メソッドは、割り当てられた DirectDraw サーフェスを解放します。

dwIDUINT_PTRinこの VMR インスタンスを一意に識別する、アプリケーション定義の DWORD_PTR クッキーです。1 つのアロケーター/プレゼンターのインスタンスを複数の VMR インスタンスで使用するシナリオで利用します。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合はエラーコードを返します。

vtbl 5 HRESULT PrepareSurface(UINT_PTR dwUserID, IDirectDrawSurface7* lpSurface, DWORD dwSurfaceFlags)

PrepareSurface メソッドは、次のビデオフレームをデコードして格納できるように DirectDraw サーフェスを準備します。

dwUserIDUINT_PTRinこの VMR インスタンスを一意に識別する、アプリケーション定義の DWORD_PTR クッキーです。1 つのアロケーター/プレゼンターのインスタンスを複数の VMR インスタンスで使用するシナリオで利用します。
lpSurfaceIDirectDrawSurface7*inDirectDraw サーフェスを指定します。
dwSurfaceFlagsDWORDinサーフェスフラグを格納する DWORD です。「解説」を参照してください。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合はエラーコードを返します。

解説(Remarks)

VMR が現在ここでチェックする唯一のフラグは AM_GBF_NOTASYNCPOINT(0x00000002)です。これは、このバッファーを同期ポイント(キーフレーム)で埋めないことを示します。

vtbl 6 HRESULT AdviseNotify(IVMRSurfaceAllocatorNotify* lpIVMRSurfAllocNotify)

AdviseNotify メソッドは、通知コールバック用の VMR-7 フィルターのインターフェイスをアロケーター/プレゼンターに提供します。

lpIVMRSurfAllocNotifyIVMRSurfaceAllocatorNotify*inアロケーター/プレゼンターが VMR に通知を返すために使用する IVMRSurfaceAllocatorNotify インターフェイスポインターを指定します。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合はエラーコードを返します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 指定が可能。