IMemAllocator
COM公式ドキュメント
IMemAllocator インターフェイスは、ピン間でデータを移動するためのメディアサンプルを割り当てます。このインターフェイスは、入力ピンが IMemInputPin インターフェイスを公開している場合に、アロケーターを共有するピンによって使用されます。
メソッド 6
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
SetProperties メソッドは、割り当てるバッファーの数と各バッファーのサイズを指定します。
| pRequest | ALLOCATOR_PROPERTIES* | in | バッファー要件を格納する ALLOCATOR_PROPERTIES 構造体へのポインター。 |
| pActual | ALLOCATOR_PROPERTIES* | out | 実際のバッファープロパティを受け取る ALLOCATOR_PROPERTIES 構造体へのポインター。 |
戻り値
HRESULT 値を返します。取り得る値には、次の表に示すものが含まれます。
| リターンコード | 説明 |
|---|---|
| 成功しました。 | |
| NULL ポインター引数です。 | |
| フィルターがアクティブな間は、割り当てられたメモリを変更できません。 | |
| 無効なアラインメントが指定されました。 | |
| 1 つ以上のバッファーがまだアクティブです。 |
解説(Remarks)
このメソッドはバッファー要件を指定しますが、バッファーの割り当ては行いません。バッファーを割り当てるには、IMemAllocator::Commit メソッドを呼び出してください。
呼び出し元は 2 つの ALLOCATOR_PROPERTIES 構造体を割り当てます。pRequest パラメーターには、バッファーの数や各バッファーのサイズなど、呼び出し元のバッファー要件が格納されます。メソッドが戻ると、pActual パラメーターには、アロケーターによって設定された実際のバッファープロパティが格納されます。
このメソッドが呼び出されるとき、アロケーターはコミットされておらず、未解放のバッファーを持っていてはなりません。
GetProperties メソッドは、アロケーターが作成するバッファーの数とバッファープロパティを取得します。
| pProps | ALLOCATOR_PROPERTIES* | out | アロケータープロパティを受け取る ALLOCATOR_PROPERTIES 構造体へのポインター。 |
戻り値
成功した場合は S_OK を返し、それ以外の場合はエラーの原因を示す HRESULT 値を返します。
解説(Remarks)
このメソッドの呼び出しは、IMemAllocator::Commit メソッドが呼び出されるまで成功しないことがあります。
Commit メソッドは、バッファーメモリを割り当てます。
戻り値
HRESULT 値を返します。取り得る値には、次の表に示すものが含まれます。
| リターンコード | 説明 |
|---|---|
| 成功しました。 | |
| メモリが不足しています。 | |
| バッファー要件が設定されていません。 |
解説(Remarks)
このメソッドを呼び出す前に、IMemAllocator::SetProperties メソッドを呼び出してバッファー要件を指定してください。
IMemAllocator::GetBuffer メソッドを呼び出す前に、このメソッドを呼び出す必要があります。
Decommit メソッドは、バッファーメモリを解放します。
戻り値
成功した場合は S_OK を返し、それ以外の場合はエラーの原因を示す HRESULT 値を返します。
解説(Remarks)
IMemAllocator::GetBuffer メソッドで待機しているスレッドは、エラーとともに戻ります。IMemAllocator::Commit メソッドが呼び出されるまで、以降の GetBuffer の呼び出しは失敗します。
Decommit メソッドの目的は、フィルターがアロケーターからこれ以上サンプルを取得できないようにすることです。既にサンプルの参照カウントを保持しているフィルターは影響を受けません。ただし、フィルターがサンプルを解放して参照カウントがゼロになると、そのサンプルは利用できなくなります。
アロケーターは、参照カウントがゼロのサンプルに属するメモリを解放できます。したがって、Decommit メソッドは、フィルターがメモリにアクセスできなくなるという意味でメモリを「解放」します。メモリが実際にヒープに返されるかどうかは、アロケーターの実装によって異なります。一部のアロケーターは、自身のデストラクターメソッドまで待機します。ただし、アロケーターは自身を削除するときに、割り当て済みのメモリを残してはなりません。そのため、アロケーターのデストラクターは、すべてのサンプルが解放されるまで待機する必要があります。
GetBuffer メソッドは、空のバッファーを含むメディアサンプルを取得します。
| ppBuffer | IMediaSample** | out | バッファーの IMediaSample インターフェイスへのポインターを受け取ります。呼び出し元はインターフェイスを解放する必要があります。 | ||||||||||
| pStartTime | LONGLONG* | inoptional | サンプルの開始時刻へのポインター、または NULL。 | ||||||||||
| pEndTime | LONGLONG* | inoptional | サンプルの終了時刻へのポインター、または NULL。 | ||||||||||
| dwFlags | DWORD | in | 次のフラグの 0 個以上のビットごとの組み合わせ:
|
戻り値
HRESULT 値を返します。取り得る値には、次の表に示すものが含まれます。
| リターンコード | 説明 |
|---|---|
| 成功しました。 | |
| アロケーターがデコミットされています。 | |
| タイムアウトしました。 |
解説(Remarks)
既定では、このメソッドは、空きサンプルが利用可能になるか、アロケーターがデコミットされるまでブロックします。呼び出し元が AM_GBF_NOWAIT フラグを指定し、利用可能なサンプルがない場合、アロケーターは戻り値 VFW_E_TIMEOUT ですぐに戻ることができます。ただし、アロケーターがこのフラグをサポートする必要はありません。
ppBuffer で返されるサンプルには、有効なバッファーポインターがあります。呼び出し元は、タイムスタンプ、メディアタイム、同期ポイントプロパティなど、サンプルのその他のプロパティを設定する責任があります。(詳細については、IMediaSample を参照してください。)
pStartTime および pEndTime パラメーターはサンプルには適用されません。アロケーターは、取得するバッファーを決定するためにこれらの値を使用する場合があります。たとえば、Video Renderer フィルターは、DirectDraw サーフェス間の切り替えを同期するためにこれらの値を使用します。サンプルにタイムスタンプを設定するには、IMediaSample::SetTime メソッドを呼び出してください。
このメソッドを呼び出す前に、IMemAllocator::Commit メソッドを呼び出す必要があります。このメソッドは、IMemAllocator::Decommit メソッドが呼び出された後は失敗します。
ReleaseBuffer メソッドは、メディアサンプルを解放します。
| pBuffer | IMediaSample* | in | メディアサンプルの IMediaSample インターフェイスへのポインター。 |
戻り値
成功した場合は S_OK を返し、それ以外の場合はエラーの原因を示す HRESULT 値を返します。
解説(Remarks)
メディアサンプルの参照カウントがゼロに達すると、そのサンプルは自身を pBuffer パラメーターとしてこのメソッドを呼び出します。このメソッドは、サンプルをアロケーターの利用可能なサンプルのリストに戻して解放します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMemAllocator "{56A8689C-0AD4-11CE-B03A-0020AF0BA770}" #usecom global IMemAllocator IID_IMemAllocator "{}" #comfunc global IMemAllocator_SetProperties 3 var,var #comfunc global IMemAllocator_GetProperties 4 var #comfunc global IMemAllocator_Commit 5 #comfunc global IMemAllocator_Decommit 6 #comfunc global IMemAllocator_GetBuffer 7 sptr,var,var,int #comfunc global IMemAllocator_ReleaseBuffer 8 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMemAllocator "{56A8689C-0AD4-11CE-B03A-0020AF0BA770}" #usecom global IMemAllocator IID_IMemAllocator "{}" #comfunc global IMemAllocator_SetProperties 3 sptr,sptr #comfunc global IMemAllocator_GetProperties 4 sptr #comfunc global IMemAllocator_Commit 5 #comfunc global IMemAllocator_Decommit 6 #comfunc global IMemAllocator_GetBuffer 7 sptr,sptr,sptr,int #comfunc global IMemAllocator_ReleaseBuffer 8 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。