Microsoft DirectX 8.0 |
メディア データを入力ピンに出力する。入力ピンが IMemAllocator インターフェイスを使ってバッファを割り当てる場合、入力ピンはこのインターフェイスを公開する。出力ピンが入力ピンに接続すると、出力ピンはこのインターフェイスを使ってアロケータ要求をネゴシエーションし、入力ピンにサンプルを出力する。
通常、アプリケーションはこのインターフェイスを使用する。
フィルタ開発者へ : CBaseInputPin クラスはこのインターフェイスを実装する。
Vtable 順のメソッド
IUnknown メソッド 説明 QueryInterface サポートされているインターフェイスへのポインタ。 AddRef 参照カウントをインクリメントする。 Release 参照カウントをデクリメントする。 IMemInputPin メソッド 説明 GetAllocator このピンが提案したメモリ アロケータを取得する。 NotifyAllocator 接続用のアロケータを指定する。 GetAllocatorRequirements 入力ピンが要求したアロケータ プロパティを取得する。 Receive ストリーム内の次のメディア サンプルを取得する。 ReceiveMultiple ストリーム内の複数のサンプルを取得する。 ReceiveCanBlock Receive メソッドへの呼び出しがブロックになるかどうかを確認する。
このピンが提案したメモリ アロケータを取得する。
構文
HRESULT GetAllocator( IMemAllocator **ppAllocator );
パラメータ
- ppAllocator
- [out] アロケータの IMemAllocator インターフェイスへのポインタを受け取る変数のアドレス。
戻り値
HRESULT 値を返す。以下の表に示されるいずれかの値。
S_OK 成功。 VFW_E_NO_ALLOCATOR 利用可能なアロケータがない。 注意
出力ピンは入力ピンと接続するとき、入力ピンにメモリ アロケータを決めるようネゴシエーションする。出力ピンはこのメソッドを呼び出して入力ピンの提案したアロケータを取得する。それは NotifyAllocator メソッドを呼び出しどのアロケータがそれを選択したのかを指定する。
このメソッドが成功すると、IMemAllocator インターフェイスには参照カウントが残る。使用後、解放時に注意。
IMemInputPin::GetAllocatorRequirements
入力ピンが要求したアロケータ プロパティを取得する。
構文
HRESULT GetAllocatorRequirements( ALLOCATOR_PROPERTIES *pProps );パラメータ
- pProps
- [in] 要求を書き込む ALLOCATOR_PROPERTIES 構造体へのポインタ。
戻り値
HRESULT 値を返す。以下の表に示されるいずれかの値。
S_OK 成功。 E_NOTIMPL 実装されていない。 E_POINTER NULL ポインタ引数。 注意
出力ピンはメモリ アロケータを初期化するとき、このメソッドを呼び出して入力ピンがバッファ要求を持っているかどうかを確認する。入力ピンのこのメソッドの実装は必須ではない。フィルタが指定したアラインメントやプレフィックスの要求を持っていないなら、このメソッドを実装すべきだ。
IMemInputPin::NotifyAllocator
接続用のアロケータを指定する。
構文
HRESULT NotifyAllocator( IMemAllocator *pAllocator, BOOL bReadOnly );
パラメータ
- pAllocator
- [in] アロケータの IMemAllocator インターフェイスへのポインタ。
- bReadOnly
- [out] このアロケータからのサンプルが読み込み専用かどうかを指定するフラグ。TRUE ならサンプルは読み込み専用。
戻り値
成功なら S_OK を返す、あるいはエラーの原因を示す HRESULT 値を返す。
注意
ピン接続中に、出力ピンはアロケータを選び、このメソッドを呼び出して入力ピンに通知する。出力ピンは IMemInputPin::GetAllocator で入力ピンが提案したアロケータを使う場合もあるが、それ自身のアロケータを提供する場合もある。
bReadOnly パラメータが TRUE なら、アロケータ内のすべてのサンプルは読み込み専用である。フィルタがデータを修正するにはそれらをコピーしなければならない。
IMemInputPin::Receive
ストリーム内の次のメディア サンプルを取得する。
構文
HRESULT Receive( IMediaSample *pSample );
パラメータ
- pSample
- [in] サンプルの IMediaSample インターフェイスへのポインタ。
戻り値
HRESULT 値を返す。以下の表に示されるいずれかの値。
S_OK 成功。 S_FALSE ピンは現在フラッシュしている、サンプルは拒否された。 E_POINTER NULL ポインタ引数。 VFW_E_INVALIDMEDIATYPE 不適切なメディア タイプ VFW_E_RUNTIME_ERROR ランタイム エラーが起きた。 VFW_E_WRONG_STATE ピンは停止している。 注意
このメソッドは同期しており、ブロックの可能性がある。ピンは以下の 1 つを行う :
- サンプルを拒否する。
- すぐに戻り、ワーカー スレッドでサンプルを処理する。
- 戻る前にサンプルを処理する。
最後のケースでは、メソッドは無限にブロックする可能性がある。これが起こりそうなら、ReceiveCanBlock メソッドは S_OK を返す。
ピンがワーカー スレッドを使ってサンプルを処理するなら、それはサンプルの参照カウントを保持する。どのケースでも出力ピンはこのサンプルを直接再使用することはできない。IMemAllocator::GetBuffer メソッドを呼び出して新しいサンプルを取得しなければならない。
IMemInputPin::ReceiveCanBlock
Receive メソッドへの呼び出しがブロックになるかどうかを確認する。
構文
HRESULT ReceiveCanBlock(void);
戻り値
HRESULT 値を返す。以下の表に示されるいずれかの値。
S_FALSE Receive を呼び出してもピンはブロックにならない。 S_OK Receive を呼び出すとピンはブロックになる可能性がある。 注意
このメソッドが S_FALSE を返すなら、Receive メソッドの呼び出しはブロックしないことが保証される。そうでなければ、ブロックになる場合がある。アップストリーム フィルタはこのメソッドを使ってそのスレッド方針を決定することができる。Receive の呼び出しがブロックになり得るのなら、アップストリーム フィルタは、データをバッファリングするワーカー スレッドの使用を決めることもできる。
IMemInputPin::ReceiveMultiple
ストリーム内の複数のサンプルを取得する。
構文
HRESULT ReceiveMultiple( IMediaSample **pSamples, long nSamples, long *nSamplesProcessed );パラメータ
- pSamples
- [in] nSamples サイズの IMediaSample ポインタの配列のアドレス。
- nSamples
- [in] 処理するサンプルの数。
- nSamplesProcessed
- [out] 処理されたサンプルの数を受け取る変数へのポインタ。
戻り値
HRESULT 値を返す。以下の表に示されるいずれかの値。
S_OK 成功。 S_FALSE ピンは現在フラッシュしている、サンプルは拒否された。 E_POINTER NULL ポインタ引数。 VFW_E_INVALIDMEDIATYPE 不適切なメディア タイプ。 VFW_E_RUNTIME_ERROR ランタイムエラーが起こった。 VFW_E_WRONG_STATE ピンは停止している。 注意
このメソッドは Receive メソッドと同じように動作するが、サンプルの配列を取得する。