IMemInputPin
COM公式ドキュメント
IMemInputPin インターフェイスは、メディアデータを入力ピンに配信します。
メソッド 6
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetAllocator メソッドは、このピンが提案するメモリアロケーターを取得します。アロケーターが選択された後は、このメソッドは選択されたアロケーターへのポインターを返します。
| ppAllocator | IMemAllocator** | out | アロケーターの IMemAllocator インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。 |
戻り値
HRESULT 値を返します。取り得る値には、次の表に示すものが含まれます。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| 利用可能なアロケーターがありません。 |
解説(Remarks)
出力ピンが入力ピンに接続する際、メモリアロケーターを決定するために入力ピンと交渉を行います。出力ピンは、入力ピンが提案するアロケーターを取得するためにこのメソッドを呼び出します。そして、選択したアロケーターを指定するために IMemInputPin::NotifyAllocator メソッドを呼び出します。
このメソッドが成功すると、IMemAllocator インターフェイスには未解放の参照カウントが残ります。使い終わったら必ず解放してください。
NotifyAllocator メソッドは、接続に使用するアロケーターを指定します。
| pAllocator | IMemAllocator* | in | アロケーターの IMemAllocator インターフェイスへのポインター。 |
| bReadOnly | BOOL | in | このアロケーターから得られるサンプルが読み取り専用かどうかを指定するフラグ。TRUE の場合、サンプルは読み取り専用です。 |
戻り値
成功した場合は S_OK を返し、失敗した場合はエラーの原因を示す HRESULT 値を返します。
解説(Remarks)
ピンの接続時に、出力ピンはアロケーターを選択し、このメソッドを呼び出して入力ピンに通知します。出力ピンは、入力ピンが IMemInputPin::GetAllocator メソッドで提案したアロケーターを使用する場合もあれば、独自のアロケーターを提供する場合もあります。
bReadOnly パラメーターが TRUE の場合、アロケーター内のすべてのサンプルは読み取り専用です。フィルターがデータを変更するには、それらをコピーする必要があります。
GetAllocatorRequirements メソッドは、入力ピンが要求するアロケーターのプロパティを取得します。
| pProps | ALLOCATOR_PROPERTIES* | out | 要求内容が書き込まれる ALLOCATOR_PROPERTIES 構造体へのポインター。 |
戻り値
解説(Remarks)
出力ピンがメモリアロケーターを初期化する際、入力ピンにバッファーの要件があるかどうかを判断するためにこのメソッドを呼び出すことができます。入力ピンはこのメソッドを実装する必要はありません。フィルターに固有のアライメントやプレフィックスの要件がある場合は、このメソッドを実装するべきです。
Receive メソッドは、ストリーム内の次のメディアサンプルを受け取ります。
| pSample | IMediaSample* | in | サンプルの IMediaSample インターフェイスへのポインター。 |
戻り値
HRESULT 値を返します。取り得る値には、次の表に示すものが含まれます。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| サンプルが拒否されました。 | |
| NULL ポインター引数。 | |
| 無効なメディアタイプです。 | |
| 実行時エラーが発生しました。 | |
| ピンが停止しています。 |
解説(Remarks)
このメソッドは同期的であり、ブロックする可能性があります。ピンは次のいずれかを行います。
- サンプルを拒否する。
- すぐに戻り、ワーカースレッドでサンプルを処理する。
- 戻る前にサンプルを処理する。
ピンがサンプルの処理にワーカースレッドを使用する場合、そのサンプルに対する参照カウントを保持します。いずれの場合も、出力ピンはこのサンプルを直接再利用することはできません。新しいサンプルを取得するには、IMemAllocator::GetBuffer メソッドを呼び出す必要があります。
このメソッドが S_FALSE またはエラーコードを返した場合、上流のフィルターは、グラフが停止するかフラッシュ操作が完了するまでサンプルの送信を停止するべきです。S_FALSE が返される代表的な理由には、次のものがあります。
- 下流のピンがフラッシュ中である。すなわち、BeginFlush 呼び出しを受け取り、まだ EndFlush 呼び出しを受け取っていない。
- 下流のフィルターがストリームの終端を検出した。(End-of-Stream Notifications を参照してください。)
ReceiveMultiple メソッドは、ストリーム内の複数のサンプルを受け取ります。
| pSamples | IMediaSample** | in | サイズ nSamples の IMediaSample インターフェイスポインターの配列のアドレス。 |
| nSamples | INT | in | 処理するサンプルの数。 |
| nSamplesProcessed | INT* | out | 処理されたサンプルの数を受け取る変数へのポインター。 |
戻り値
HRESULT 値を返します。取り得る値には、次の表に示すものが含まれます。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| ピンは現在フラッシュ中であり、サンプルが拒否されました。 | |
| NULL ポインター引数。 | |
| 無効なメディアタイプです。 | |
| 実行時エラーが発生しました。 | |
| ピンが停止しています。 |
解説(Remarks)
このメソッドは IMemInputPin::Receive メソッドと同様に動作しますが、サンプルの配列を受け取ります。
ReceiveCanBlock メソッドは、IMemInputPin::Receive メソッドの呼び出しがブロックする可能性があるかどうかを判断します。
戻り値
HRESULT 値を返します。取り得る値には、次の表に示すものが含まれます。
| 戻り値 | 説明 |
|---|---|
| ピンは Receive の呼び出しでブロックしません | |
| ピンは Receive の呼び出しでブロックする可能性があります。 |
解説(Remarks)
このメソッドが S_FALSE を返した場合、Receive メソッドの呼び出しはブロックしないことが保証されます。そうでない場合は、ブロックする可能性があります。上流のフィルターは、このメソッドを使用してスレッド戦略を決定できます。Receive の呼び出しがブロックし得る場合、上流のフィルターはデータをバッファリングするワーカースレッドを使用することを選択するかもしれません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMemInputPin "{56A8689D-0AD4-11CE-B03A-0020AF0BA770}" #usecom global IMemInputPin IID_IMemInputPin "{}" #comfunc global IMemInputPin_GetAllocator 3 sptr #comfunc global IMemInputPin_NotifyAllocator 4 sptr,int #comfunc global IMemInputPin_GetAllocatorRequirements 5 var #comfunc global IMemInputPin_Receive 6 sptr #comfunc global IMemInputPin_ReceiveMultiple 7 sptr,int,var #comfunc global IMemInputPin_ReceiveCanBlock 8 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMemInputPin "{56A8689D-0AD4-11CE-B03A-0020AF0BA770}" #usecom global IMemInputPin IID_IMemInputPin "{}" #comfunc global IMemInputPin_GetAllocator 3 sptr #comfunc global IMemInputPin_NotifyAllocator 4 sptr,int #comfunc global IMemInputPin_GetAllocatorRequirements 5 sptr #comfunc global IMemInputPin_Receive 6 sptr #comfunc global IMemInputPin_ReceiveMultiple 7 sptr,int,sptr #comfunc global IMemInputPin_ReceiveCanBlock 8 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。