Microsoft DirectX 8.0 |
出力ピンを実装する抽象基底クラス。
宣言 : Amfilter.h
このクラスは CBasePin から派生する。以下の面で CBasePin とは異なる。
ピンが接続するとき、入力ピンからのメモリ アロケータを要求する。それが失敗すると、新しいアロケータ オブジェクトを作成する。出力ピンはアロケータ プロパティを設定する責任がある。純粋仮想メソッド DecideBufferSize を通してこれを行う。派生クラスではこのメソッドをオーバーライドする。入力ピンがバッファ要求を持つとき、その要求は DecideBufferSize メソッドに渡される。
空白のメディア サンプルを取得するには GetDeliveryBuffer を呼び出すこと。サンプル ダウンストリームを出力するには Deliver を呼び出すこと。
Protected メンバ変数 | |
---|---|
m_pAllocator | メモリ アロケータへのポインタ。 |
m_pInputPin | このピンに接続する入力ピンへのポインタ。 |
Public メソッド | |
CBaseOutputPin | コンストラクタ メソッド。 |
CompleteConnect | 入力ピンへの接続を完了する。仮想。 |
DecideAllocator | メモリ アロケータを選択する。仮想。 |
GetDeliveryBuffer | 空白バッファを持つメディア サンプルを取得。仮想。 |
Deliver | メディア サンプルを接続した入力ピンに出力する。仮想。 |
InitAllocator | メモリ アロケータを作成。仮想。 |
CheckConnect | ピン接続が適切かどうか確認する。 |
BreakConnect | 接続からピンを解放する。 |
Active | フィルタが現在アクティブであることをピンに通知する。 |
Inactive | フィルタがもうアクティブではないことをピンに通知する。 |
DeliverEndOfStream | エンドオブストリーム通知を接続する入力ピンに出力する。仮想。 |
DeliverBeginFlush | 接続する入力ピンにフラッシュ処理の開始を要求する。仮想。 |
DeliverEndFlush | 接続した入力ピンにフラッシュ処理の終了を要求する。仮想。 |
DeliverNewSegment | 新セグメント通知を接続する入力ピンに出力する。 仮想。 |
Pure Virtual メソッド | |
DecideBufferSize | バッファ要求を設定する。 |
IPin メソッド | |
BeginFlush | フラッシュ処理を開始する。 |
EndFlush | フラッシュ処理を終了する。 |
EndOfStream | 以降のデータはないことをピンに伝える。 |
メモリ アロケータへのポインタ。
構文
IMemAllocator *m_pAllocator;
このピンに接続する入力ピンへのポインタ。
構文
IMemInputPin *m_pInputPin;
フィルタが現在アクティブであることをピンに通知する。
構文
HRESULT Active(void);
戻り値
HRESULT 値を返す。次の表は、可能な値を示している。
S_OK 成功。 VFW_E_NO_ALLOCATOR 利用可能なメモリ アロケータがない。
注意
このメソッドは CBasePin::Active メソッドをオーバーライドする。アロケータの IMemAllocator::Commit メソッドを呼び出して、バッファにメモリを割り当てる。
このメソッドをオーバーライドするなら、そのオーバーライドする メソッドから基底クラス メソッドを呼び出すこと。
フラッシュ処理を開始する。IPin::BeginFlush メソッドの実装。
構文
HRESULT BeginFlush(void);
戻り値
E_UNEXPECTED を返す。
注意
このメソッドは入力ピンでのみ呼び出されるべきなので、CBaseOutputPin を実装すると E_UNEXPECTED を返す。
接続からピンを解放する。
構文
HRESULT BreakConnect(void);
戻り値
成功なら S_OK を返す、失敗ならエラーの原因を示す HRESULT 値を返す。
注意
このメソッドはCBasePin::BreakConnect メソッドをオーバーライドする。アロケータをデコミットにし、IMemAllocator と IPin インターフェイスを解放する。
このメソッドをオーバーライドするなら、そのオーバーライドする メソッドから基本メソッドを呼び出すこと。そうしないとメモリ リークの可能性がある。
コンストラクタ メソッド。
構文
CBaseOutputPin( TCHAR *pObjectName, CBaseFilter *pFilter, CCritSec *pLock, HRESULT *phr, LPCWSTR pName );
パラメータ
- pObjectName
- オブジェクトのデバッグ名が入る文字列。詳細については、「CbaseObject」を参照すること。
- pFilter
- このピンを作成したフィルタへのポインタ。
- pLock
- CCritSec ロックへのポインタ、状態移行を継続するために使用。これはフィルタ ロック CBaseFilter.m_pLock と同様のクリティカル セクションになり得る。
- phr
- メソッドの成功・失敗を示す HRESULT 値を取得する変数へのポインタ。
- pName
- (ピン ID としても使われる)ピン名が入る Unicode 文字列。
注意
すべてのパラメータは直接 CBasePin コンストラクタに送られる。
ピン接続が適切かどうか確認する。
構文
HRESULT CheckConnect( IPin *pPin );
パラメータ
- pPin
- 入力ピンの IPin インターフェイスへのポインタ。
戻り値
次の HRESULT 値の 1 つを返す。
S_OK 成功。 E_NOINTERFACE 入力ピンは IMemInputPinをサポートしていない。 VFW_E_INVALID_DIRECTION ピンの向きに互換性がない。
注意
このメソッドは基底クラス CBasePin::CheckConnect メソッドを呼び出し、次に IMemInputPin インターフェイスに入力ピンを問い合わせる。
入力ピンへの接続を完了する。
構文
virtual HRESULT CompleteConnect( IPin *pReceivePin );
パラメータ
- pReceivePin
- 入力ピンへのポインタ。
戻り値
成功なら S_OK を返す、失敗ならエラーの原因を示す HRESULT 値を返す。
注意
このメソッドは CBasePin::CompleteConnect メソッドをオーバーライドする。この接続に使用するメモリ アロケータを選択する DecideAllocator メソッドを呼び出す。
メモリ アロケータを選択する。
構文
virtual HRESULT DecideAllocator( IMemInputPin *pPin, IMemAllocator **pAlloc );
パラメータ
- pPin
- 入力ピンの IMemInputPin インターフェイスへのポインタ。
- pAlloc
- アロケータの IMemAllocator インターフェイスへのポインタを取得する変数のアドレス。
戻り値
成功なら S_OK を返す、失敗ならエラーの原因を示す HRESULT 値を返す。
注意
このメソッドはピン接続プロセスの最後に呼び出される。次のステップで実行する :
- もしあれば、IMemInputPin::GetAllocatorRequirements メソッドを呼び出し、入力ピンのバッファ要求を取得する。
- IMemInputPin::GetAllocator メソッドを呼び出して、入力ピンからアロケータを要求する。その入力ピンがアロケータを提供しなければ、出力ピンは InitAllocator クラス メソッドを呼び出してアロケータを作成する。
- DecideBufferSize クラス メソッドを呼び出して、アロケータ プロパティを設定する。これは純粋仮想メソッドである、派生クラスはこれを実装しなければならない。
- IMemInputPin::NotifyAllocator メソッドを呼び出し、アロケータの使用を入力ピンに通知する。
バッファ要求を設定する。
構文
virtual HRESULT DecideBufferSize( IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest ) PURE;
パラメータ
- pAlloc
- アロケータの IMemAllocator インターフェイスへのポインタ。
- ppropInputRequest
- 入力ピンのバッファ要求を含む ALLOCATOR_PROPERTIES 構造体へのポインタ。入力ピンが何の要求も指定しないなら、呼び出し元はこの構造体のメンバをゼロにするべである。
戻り値
成功なら S_OK を返す、失敗ならエラーの原因を示す HRESULT 値を返す。
注意
このメソッドを派生クラスでオーバーライドすること。バッファ要求を付けて IMemAllocator::SetProperties メソッドを呼び出す。通常派生クラスは入力バッファの要求を尊重するが、必ずしもそれをする必要はない。
メディア サンプルを接続した入力ピンに出力する。
構文
virtual HRESULT Deliver( IMediaSample *pSample );
パラメータ
- pSample
- サンプルの IMediaSample インターフェイスへのポインタ。
戻り値
HRESULT 値を返す。次の表は、可能な値を示している。
S_OK 成功。 VFW_E_NOT_CONNECTED ピンが接続されていない。
注意
このメソッドは入力ピンの IMemInputPin::Receive メソッドを呼び出す。IMemInputPin::ReceiveCanBlock メソッドが S_OK を返すなら、Receive はブロックする可能性がある。
このメソッドを呼び出した後で、サンプルを解放すること。入力ピンはサンプルの参照カウントを持ったままなので、サンプルを再使用してはならない。必ず GetDeliveryBuffer メソッドを呼び出して、新しいサンプルを取得する。
このメソッドを呼び出す前にフィルタのクリティカル セクションをホールドすること。そうしないと、そのピンはメソッド 呼び出し中に非接続になる可能性がある。フィルタがワーカー スレッドを使ってサンプルを出力するなら、フィルタがサンプルを出力可能になったとき、クリティカル セクションをホールドする。そうでなければ、フィルタの IMemInputPin::Receive メソッドでクリティカル セクションをホールドする、そこでフィルタはサンプルを処理する。
ワーカー スレッドはデッドロックの可能性を作成し得る。スレッドがクリティカル セクションをホールドするとき、フィルタの状態移行を待つかもしれない。同時に、状態移行はスレッドが完了するのを待っているかもしれない。これを避けるために、状態移行コードはスレッドを終わらせるイベントを通知し、次にスレッドがその通知を完了するまで待つこと。
接続する入力ピンにフラッシュ処理の開始を要求する。
構文
virtual HRESULT DeliverBeginFlush(void);
戻り値
HRESULT 値を返す。次の表は、可能な値を示している。
S_OK 成功。 VFW_E_NOT_CONNECTED ピンが接続されていない。
注意
このメソッドは入力ピンの IPin::BeginFlush メソッドを呼び出す。
接続した入力ピンにフラッシュ処理の終了を要求する。
構文
virtual HRESULT DeliverEndFlush(void);
戻り値
HRESULT 値を返す。次の表は、可能な値を示している。
S_OK 成功。 VFW_E_NOT_CONNECTED ピンが接続されていない。
注意
このメソッドは入力ピンの IPin::EndFlush メソッドを呼び出す。
エンドオブストリーム通知を接続する入力ピンに出力する。
構文
virtual HRESULT DeliverEndOfStream(void);
戻り値
HRESULT 値を返す。次の表は、可能な値を示している。
S_OK 成功。 VFW_E_NOT_CONNECTED ピンが接続されていない。
注意
このメソッドは入力ピンの IPin::EndOfStream メソッドを呼び出す。
新セグメント通知を接続する入力ピンに出力する。
構文
virtual HRESULT DeliverNewSegment( REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate );
パラメータ
- tStart
- セグメントの開始メディア位置、100ナノ秒単位。
- tStop
- セグメントの終了メディア位置、100ナノ秒単位。
- dRate
- このセグメントが処理される割合、オリジナルのレートのパーセンテージ。
戻り値
HRESULT 値を返す。次の表は、可能な値を示している。
S_OK 成功。 VFW_E_NOT_CONNECTED ピンが接続されていない。
注意
このメソッドは入力ピンの IPin::NewSegment メソッドを呼び出す。
フラッシュ処理を終了する。IPin::EndFlush メソッドの実装。
構文
HRESULT EndFlush(void);
戻り値
E_UNEXPECTED を返す。
注意
このメソッドは入力ピンでのみ呼び出されるべきなので、CBaseOutputPin を実装すると E_UNEXPECTED を返す。
以降のデータはないことをピンに伝える。 IPin::EndOfStream メソッドの実行。
構文
HRESULT EndOfStream(void);
戻り値
E_UNEXPECTED を返す。
注意
このメソッドは入力ピンでのみ呼び出されるべきなので、CBaseOutputPin を実装すると E_UNEXPECTED を返す。
空白バッファを持つメディア サンプルを取得。
構文
virtual HRESULT GetDeliveryBuffer( IMediaSample **ppSample, REFERENCE_TIME *pStartTime, REFERENCE_TIME *pEndTime, DWORD dwFlags );
パラメータ
- ppSample
- バッファの IMediaSample インターフェイスのポインタを取得する変数のアドレス。
- pStartTime
- サンプルの開始タイムへのポインタ、あるいは NULL 。
- pEndTime
- サンプルの終了タイムへのポインタ、あるいは NULL 。
- dwFlags
- IMemAllocator::GetBuffer インターフェイスによってサポートされる、フラグのビットごとの組み合わせ。
戻り値
HRESULT 値を返す。次の表は、可能な値を示している。
S_OK 成功。 E_NOINTERFACE 有効なメモリ アロケータがない。
注意
このメソッドは、アロケータの IMemAllocator::GetBuffer メソッドを呼び出し、このメソッドにパラメータを渡す。
フィルタがもうアクティブではないことをピンに通知する。
構文
HRESULT Inactive(void);
戻り値
HRESULT 値を返す。次の表は、可能な値を示している。
S_OK 成功。 VFW_E_NO_ALLOCATOR 有効なメモリ アロケータがない。
注意
このメソッドは CBasePin::Inactive メソッドをオーバーライドする。IMemAllocator::Decommit メソッドを呼び出して、メモリ アロケータをデコミットにする。
このメソッドをオーバーライドするなら、そのオーバーライドするメソッドから基底クラス メソッドを呼び出すこと。
メモリ アロケータを作成。
構文
virtual HRESULT InitAllocator( IMemAllocator **ppAlloc );
パラメータ
- ppAlloc
- アロケータの IMemAllocator インターフェイスへのポインタを取得する変数のアドレス。
戻り値
成功なら S_OK を返す、失敗なら CoCreateInstance 関数からのエラーコードを返す。
注意
入力ピンがメモリ アロケータを提供しないなら、DecideAllocator メソッドはこのメソッドを呼び出し、アロケータを作成する。