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

IMemInputPin

COM
IID56a8689d-0ad4-11ce-b03a-0020af0ba770継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IMemInputPin インターフェイスは、メディアデータを入力ピンに配信します。

メソッド 6

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

vtbl 3 HRESULT GetAllocator(IMemAllocator** ppAllocator)

GetAllocator メソッドは、このピンが提案するメモリアロケーターを取得します。アロケーターが選択された後は、このメソッドは選択されたアロケーターへのポインターを返します。

ppAllocatorIMemAllocator**outアロケーターの IMemAllocator インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。

戻り値

HRESULT 値を返します。取り得る値には、次の表に示すものが含まれます。

戻り値 説明
S_OK
成功しました。
VFW_E_NO_ALLOCATOR
利用可能なアロケーターがありません。

解説(Remarks)

出力ピンが入力ピンに接続する際、メモリアロケーターを決定するために入力ピンと交渉を行います。出力ピンは、入力ピンが提案するアロケーターを取得するためにこのメソッドを呼び出します。そして、選択したアロケーターを指定するために IMemInputPin::NotifyAllocator メソッドを呼び出します。

このメソッドが成功すると、IMemAllocator インターフェイスには未解放の参照カウントが残ります。使い終わったら必ず解放してください。

vtbl 4 HRESULT NotifyAllocator(IMemAllocator* pAllocator, BOOL bReadOnly)

NotifyAllocator メソッドは、接続に使用するアロケーターを指定します。

pAllocatorIMemAllocator*inアロケーターの IMemAllocator インターフェイスへのポインター。
bReadOnlyBOOLinこのアロケーターから得られるサンプルが読み取り専用かどうかを指定するフラグ。TRUE の場合、サンプルは読み取り専用です。

戻り値

成功した場合は S_OK を返し、失敗した場合はエラーの原因を示す HRESULT 値を返します。

解説(Remarks)

ピンの接続時に、出力ピンはアロケーターを選択し、このメソッドを呼び出して入力ピンに通知します。出力ピンは、入力ピンが IMemInputPin::GetAllocator メソッドで提案したアロケーターを使用する場合もあれば、独自のアロケーターを提供する場合もあります。

bReadOnly パラメーターが TRUE の場合、アロケーター内のすべてのサンプルは読み取り専用です。フィルターがデータを変更するには、それらをコピーする必要があります。

vtbl 5 HRESULT GetAllocatorRequirements(ALLOCATOR_PROPERTIES* pProps)

GetAllocatorRequirements メソッドは、入力ピンが要求するアロケーターのプロパティを取得します。

pPropsALLOCATOR_PROPERTIES*out要求内容が書き込まれる ALLOCATOR_PROPERTIES 構造体へのポインター。

戻り値

HRESULT 値を返します。取り得る値には、次の表に示すものが含まれます。

戻り値 説明
S_OK
成功
E_NOTIMPL
実装されていません
E_POINTER
NULL ポインター引数

解説(Remarks)

出力ピンがメモリアロケーターを初期化する際、入力ピンにバッファーの要件があるかどうかを判断するためにこのメソッドを呼び出すことができます。入力ピンはこのメソッドを実装する必要はありません。フィルターに固有のアライメントやプレフィックスの要件がある場合は、このメソッドを実装するべきです。

vtbl 6 HRESULT Receive(IMediaSample* pSample)

Receive メソッドは、ストリーム内の次のメディアサンプルを受け取ります。

pSampleIMediaSample*inサンプルの IMediaSample インターフェイスへのポインター。

戻り値

HRESULT 値を返します。取り得る値には、次の表に示すものが含まれます。

戻り値 説明
S_OK
成功しました。
S_FALSE
サンプルが拒否されました。
E_POINTER
NULL ポインター引数。
VFW_E_INVALIDMEDIATYPE
無効なメディアタイプです。
VFW_E_RUNTIME_ERROR
実行時エラーが発生しました。
VFW_E_WRONG_STATE
ピンが停止しています。

解説(Remarks)

このメソッドは同期的であり、ブロックする可能性があります。ピンは次のいずれかを行います。

最後のケースでは、メソッドが無期限にブロックする可能性があります。この可能性がある場合、IMemInputPin::ReceiveCanBlock メソッドは S_OK を返します。

ピンがサンプルの処理にワーカースレッドを使用する場合、そのサンプルに対する参照カウントを保持します。いずれの場合も、出力ピンはこのサンプルを直接再利用することはできません。新しいサンプルを取得するには、IMemAllocator::GetBuffer メソッドを呼び出す必要があります。

このメソッドが S_FALSE またはエラーコードを返した場合、上流のフィルターは、グラフが停止するかフラッシュ操作が完了するまでサンプルの送信を停止するべきです。S_FALSE が返される代表的な理由には、次のものがあります。

vtbl 7 HRESULT ReceiveMultiple(IMediaSample** pSamples, INT nSamples, INT* nSamplesProcessed)

ReceiveMultiple メソッドは、ストリーム内の複数のサンプルを受け取ります。

pSamplesIMediaSample**inサイズ nSamplesIMediaSample インターフェイスポインターの配列のアドレス。
nSamplesINTin処理するサンプルの数。
nSamplesProcessedINT*out処理されたサンプルの数を受け取る変数へのポインター。

戻り値

HRESULT 値を返します。取り得る値には、次の表に示すものが含まれます。

戻り値 説明
S_OK
成功しました。
S_FALSE
ピンは現在フラッシュ中であり、サンプルが拒否されました。
E_POINTER
NULL ポインター引数。
VFW_E_INVALIDMEDIATYPE
無効なメディアタイプです。
VFW_E_RUNTIME_ERROR
実行時エラーが発生しました。
VFW_E_WRONG_STATE
ピンが停止しています。

解説(Remarks)

このメソッドは IMemInputPin::Receive メソッドと同様に動作しますが、サンプルの配列を受け取ります。

vtbl 8 HRESULT ReceiveCanBlock()

ReceiveCanBlock メソッドは、IMemInputPin::Receive メソッドの呼び出しがブロックする可能性があるかどうかを判断します。

戻り値

HRESULT 値を返します。取り得る値には、次の表に示すものが含まれます。

戻り値 説明
S_FALSE
ピンは Receive の呼び出しでブロックしません
S_OK
ピンは Receive の呼び出しでブロックする可能性があります。

解説(Remarks)

このメソッドが S_FALSE を返した場合、Receive メソッドの呼び出しはブロックしないことが保証されます。そうでない場合は、ブロックする可能性があります。上流のフィルターは、このメソッドを使用してスレッド戦略を決定できます。Receive の呼び出しがブロックし得る場合、上流のフィルターはデータをバッファリングするワーカースレッドを使用することを選択するかもしれません。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_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 指定が可能。