Microsoft DirectX 8.0 |
インプレイス変換フィルタを実装する基底クラス。
宣言 : Transfrm.h
CTransInPlaceFilter クラスはデータ変換を、バッファ間のデータ コピーをせずに、インプレイスで行うフィルタ用に設計されている。
可能な限り、フィルタは 1 つのアロケータを使う。詳細については、CompleteConnect」を参照すること。
このクラスを使うには、CTransInPlaceFilter から新しいクラスを派生し。以下のメソッドを実装すること :
このフィルタは入力ピンに CTransInPlaceInputPin クラスを使い、出力ピンに CTransInPlaceOutputPin クラスを使う。通常、これらのピンクラスをオーバーライドする必要はない。フィルタは両ピンを GetPin メソッドで作成する。ピンクラスをオーバーライドするなら、カスタム ピンを作る GetPin をオーバーライドしなければならない。
Protected メソッド | |
---|---|
Copy | メディア サンプルをコピーする。 |
InputPin | フィルタの入力ピンへのポインタを取得する。 |
OutputPin | フィルタの出力ピンへのポインタを取得する。 |
TypesMatch | 入力メディア タイプが出力メディア タイプと一致するかどうか確認する。 |
UsingDifferentAllocators | 入力ピンと出力ピンが異なるアロケータを使っているかどうかを確認する。 |
Public メソッド | |
CTransInPlaceFilter | コンストラクタ メソッド。 |
GetPin | ピンを取得する。 |
GetMediaType | 出力ピン用の優先メディア タイプを取得する。 |
DecideBufferSize | 出力ピンのバッファ要求を設定する。 |
CheckTransform | 入力メディア タイプが出力メディア タイプと互換性があるかどうかをチェックする。 |
CompleteConnect | ピン接続を完了する。 |
Receive | メディア サンプルを受け取り、それを処理し、ダウンストリーム フィルタに出力する。 |
Pure Virtual メソッド | |
Transform | サンプルをインプレイスで変換する。 |
入力メディア タイプが出力メディア タイプと互換性があるかどうかをチェックする。
構文
HRESULT CheckTransform( const CMediaType *mtIn, const CMediaType *mtOut );
パラメータ
- mtIn
- 入力タイプを指定する CMediaType オブジェクトへのポインタ。
- mtOut
- 出力タイプを指定する CMediaType オブジェクトへのポインタ。
戻り値
S_OK を返す。
注意
このメソッドは CTransformFilter::CheckTransform メソッドをオーバーライドする。CTransInPlace 内のメソッドは、入力タイプと出力タイプが同じであると仮定して、CheckTransform の代わりに、CTransformFilter::CheckInputType メソッドを呼び出す。
ピン接続を完了する。
構文
HRESULT CompleteConnect( PIN_DIRECTION direction, IPin *pReceivePin );
パラメータ
- direction
- フィルタのどのピンが接続を作成しているかを指定する PIN_DIRECTION 列挙型のメンバ。
- pReceivePin
- この接続を試みている別のピンの IPin インターフェイスへのポインタ。
戻り値
HRESULT 値を返す。以下のテーブルに示されるいずれかの値。
S_OK 成功。 VFW_E_NOT_IN_GRAPH フィルタがフィルタ グラフにない。
注意
このメソッドは CTransformFilter::CompleteConnect メソッドをオーバーライドする。
フィルタの振る舞いはピン接続の順番に依存する :
- 入力ピンが最初に接続されると、接続はテンポラリ ロケータを使用する。出力ピンが接続されるとき、フィルタは入力ピンを再接続する。入力ピンの再接続によってアップストリーム フィルタはアロケータと再度ネゴシエーションする。そのときに、入力ピンはデータストリーム フィルタのアロケータを使おうとする。詳細については、「CTransInPlaceInputPin::GetAllocator」を参照すること。
- 出力ピンが最初に接続されると、出力ピンはアロケータを選択しない。入力ピンが接続されるとき、両方の接続に 1 つのアロケータをネゴシエーションする。入力メディア タイプと出力メディア タイプが同じではない場合、フィルタは入力タイプを使って出力ピンと再接続する。
フィルタは CBaseFilter::ReconnectPin メソッドを呼び出すことによって、すべてのピンの再接続を行う。 ReconnectPin メソッドはフィルタ グラフ マネージャの IFilterGraph2::ReconnectEx メソッドを順順に呼び出す。
メディア サンプルをコピーする。
構文
IMediaSample *CTransInPlaceFilter::Copy( IMediaSample *pSource );
パラメータ
- pSource
- サンプルの IMediaSample インターフェイスへのポインタ。
戻り値
新しいサンプルの IMediaSample インターフェイスへのポインタを返す。
注意
このメソッドはダウンストリーム アロケータから空のバッファを取得する。それはサンプル内の実際のデータと共に、pSource からすべてのサンプル プロパティを新しいサンプルにコピーする。フィルタが 2 つのアロケータを使っているなら、このメソッドを呼び出して、バッファ間でデータをコピーする。
コンストラクタ メソッド。
構文
CTransInPlaceFilter( TCHAR *pObjectName, LPUNKNOWN lpUnk, REFCLSID clsid, HRESULT *phr, bool bModifiesData = true );
パラメータ
- pObjectName
- フィルタのデバッグ名が入る文字列。詳細については、「CBaseObject」を参照すること。
- lpUnk
- このオブジェクトの所有者へのポインタ。オブジェクトが集成されているなら、集成オブジェクトの IUnknown へのポインタを渡す。そうでなければ、このパラメータを NULL に設定する。
- clsid
- フィルタのクラス ID。
- phr
- 無視される。
- bModifiesData
- フィルタが入力データを修正するかどうかを指定するブール値。TRUE なら、フィルタはデータを修正する。それ以外なら、フィルタはデータを変更せずダウンストリームに渡す。
出力ピンのバッファ要求を設定する。
構文
HRESULT DecideBufferSize( IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pProperties );
パラメータ
- pAlloc
- 出力ピンが使用する IMemAllocator オブジェクトへのポインタ。
- pProperties
- 要求されたアロケータ プロパティ へのポインタ、それは ALLOCATOR_PROPERTIES に指定されているカウント、サイズ、アラインメントである。
戻り値
HRESULT 値を返す。以下のテーブルに示されるいずれかの値。
S_OK 成功。 E_FAIL 失敗。
注意
このメソッドは CTransformFilter::DecideBufferSize メソッドをオーバーライドする。それは以前のバージョンの CTransInPlaceFilter 暮らすとの互換性のために存在する。現在のバージョンでは、アップストリーム出力ピンはアロケータのダウンストリーム入力ピンと直接ネゴシエーションする。フィルタの出力ピンはこれに関わらない。
出力ピン用の優先メディア タイプを取得する。
構文
HRESULT GetMediaType( int iPosition, CMediaType *pMediaType );
パラメータ
- iPosition
- ゼロから始まるインデックス値。
- pMediaType
- メディア タイプを受け取る CMediaType オブジェクトへのポインタ。
戻り値
E_UNEXPECTED を返す。
注意
このメソッドは CTransformFilter::GetMediaType メソッドをオーバーライドする。CTransInPlaceFilter クラスでは、各ピンは向かいの接続ピンを呼び出し、優先メディア タイプを列挙する。入力ピンはダウンストリーム フィルタの入力ピンを呼び出し、出力ピンはアップストリーム フィルタの出力ピンをアップストリームを呼び出す。それゆえ、フィルタの GetMediaType メソッドは決して呼び出されない。
ピンを取得する。
構文
virtual CBasePin *GetPin( int n );
パラメータ
- n
- 指定したピンの数、ゼロから始まるインデックス。このフィルタでは、ピン 0 は入力ピンで、ピン 1 は出力ピンである。
戻り値
ピンを実装する CBasePin オブジェクトへのポインタを返す、メソッドが失敗すると NULL を返す。
注意
このメソッドは CTransformFilter::GetPin メソッドをオーバーライドする。最初にこのメソッドが呼び出されたとき、両方のピンを作成する。
このメソッドは返ってきたピンの参照カウントをインクリメントしないので、返ったピンは参照カウントを残さない。呼び出し元がそのピンの参照カウントを保持する必要があるなら、そのピンの IUnknown::AddRef メソッドを呼び出すべきである。
フィルタがデフォルトの CTransInPlaceInputPin ピンと CTransInPlaceOutputPin ピンを使うなら、このメソッドをオーバーライドする必要はない。しかし、フィルタがこれらのクラスを拡張したピンを使うなら、このメソッドをオーバーライドしてそのタイプのピンを作成しなければならない。
フィルタの入力ピンへのポインタを取得する。
構文
CTransInPlaceInputPin *InputPin(void);
戻り値
CTransformFilter.m_pInput メンバ変数を返す。
フィルタの出力ピンへのポインタを取得する。
構文
CTransInPlaceOutputPin *OutputPin(void);
戻り値
CTransformFilter.m_pOutput メンバ変数を返す。
メディア サンプルを受け取り、それを処理し、ダウンストリーム フィルタに出力する。
構文
HRESULT Receive( IMediaSample *pSample );
パラメータ
- pSample
- サンプルの IMediaSample インターフェイスへのポインタ。
戻り値
HRESULT 値を返す。以下のテーブルに示されるいずれかの値。
S_OK 成功。 E_UNEXPECTED 予期せぬエラー。
注意
フィルタの入力ピンはサンプルを取得するとき、このメソッドを呼び出す。フィルタは Transform メソッドを呼び出す、派生クラスはそれを実装しなければならない。Transform メソッドはデータを処理する。フィルタが 1 つのアロケータだけを使っているなら、pSample を直接 Tranform メソッドに渡す。それ以外なら、pSample をコピーして、そのコピーを渡す。
Transform メソッドが S_FALSE を返すと、Receive メソッドはサンプルをドロップする。最初にドロップされたサンプルでは、フィルタは EC_QUALITY_CHANGE イベントをフィルタ グラフ マネージャに送る。一方、Transform メソッドが S_OK を返すと、フィルタは出力サンプルを出力する。それを行うため、ダウンストリーム入力ピンの IMemInputPin::Receive メソッドを呼び出す。
サンプルをインプレイスで変換する。
構文
virtual HRESULT Transform( IMediaSample *pSample ) PURE;
パラメータ
- pSample
- サンプルの IMediaSample インターフェイスへのポインタ。
戻り値
HRESULT 値を返す。以下のテーブルに示されるいずれかの値。
S_FALSE このサンプルを出力できない。 S_OK 成功。
注意
派生クラスはこのメソッドを実装しなければならない。サンプル データをインプレイスで変換すること。フィルタが 2 つのアロケータを使っているなら、入力サンプルから新しいサンプルにデータをコピーし、そのコピーをこのメソッドに渡す。
(たとえば、品質管理をサポートするために)フィルタがこのサンプルを出力するべきでないなら、メソッドは S_FALSE を返すべきである。
入力メディア タイプが出力メディア タイプと一致するかどうか確認する。
構文
BOOL TypesMatch(void);
戻り値
入力メディア タイプと出力メディア タイプが同じなら TRUE を返し、それ以外なら FALSE を返す。
入力ピンと出力ピンが異なるアロケータを使っているかどうかを確認する。
構文
BOOL UsingDifferentAllocators(void) const;
戻り値
入力ピンと出力ピンが違うアロケータを使っているなら TRUE を返し、それ以外なら FALSE を返す。