CTransInPlaceFilter クラス
CTransInPlaceFilter クラスは、データをバッファ間でコピーせずに入力データを修正する、インプレイス変換フィルタ用に設計されている。このクラスを使うには、CTransInPlaceFilter から新しいクラスを派生し、以下のメソッドを実装すること。
このフィルタは入力ピンに CTransInPlaceInputPin クラスを使い、出力ピンに CTransInPlaceOutputPin クラスを使う。通常、これらのピン クラスをオーバーライドする必要はない。フィルタは CTransInPlaceFilter::GetPin メソッド内で両方のピンを作成する。ピン クラスをオーバーライドする場合は、GetPin をオーバーライドしてカスタム ピンを作成しなければならない。
このクラスは、入力タイプが常に出力タイプと一致するように設計されている。フィルタは、可能な限り両方のピン接続に 1 つのアロケータを使う。
優先されるメディア タイプ
出力ピンが既に接続されている場合は、入力ピンがダウンストリーム フィルタの優先タイプを提供する。(実際、単にダウンストリーム フィルタの列挙子オブジェクトを返す。) それ以外の場合は、優先タイプを持たない。出力ピンは、逆のケースで同じ動作をする。入力ピンが既に接続されている場合は、出力ピンがアップストリーム フィルタの優先タイプを提供する。それ以外の場合は、優先タイプを持たない。
ピン接続
1 つのピンが接続している場合、通常は、両方のピンが同じメディア タイプと同じアロケータを使うよう、フィルタが他のピンも再接続する。(ピンの再接続のメカニズムについては、「ピンの再接続」を参照すること。) 入力ピンが最初に接続する場合と、出力ピンが最初に接続する場合と、2 種類のシナリオが考えられる。
入力ピンが最初に接続するとする。次のステップが発生する。
- 入力ピンがフィルタの CheckInputType メソッドを呼び出し、メディア タイプを確認する。
- アップストリーム フィルタがアロケータを選択する。この時点で、入力ピンにはアロケータ条件はなく、どのアロケータでも接続に使える。アップストリーム フィルタがアロケータを要求すると、ピンが新しいアロケータを作成する。後で述べるような理由により、このアロケータは最終的な接続では使われない。これは、接続処理のこの段階を完了させるためだけに提供される。
後で出力ピンが接続されると、次のことが実行される。
- 出力ピンがフィルタの CheckInputType メソッドを呼び出し、メディア タイプを確認する。また、アップストリーム フィルタで IPin::QueryAccept を呼び出す。これにより、入力ピンがメディア タイプを一致するように変更できる。
- 出力ピンがアロケータを選択する。ダウンストリーム フィルタにアロケータを要求するが、アップストリーム接続のアロケータ プロパティを使う。
- フィルタは、出力ピンのメディア タイプを使って、入力ピンを再接続する。
- 今度は入力ピンの GetAllocator メソッドがダウンストリーム アロケータを返し、GetAllocatorRequirements がダウンストリーム フィルタのアロケータ条件を返す。入力ピンは、アップストリーム フィルタが選択したアロケータが何であっても受け入れる。
- フィルタは、ダウンストリーム接続に同じアロケータを使う。
ここで、出力ピンが最初に接続されるもう一方のシナリオについて考える。
- 出力ピンがフィルタの CheckInputType メソッドを呼び出し、メディア タイプを確認する。
- アロケータを選択する。このとき、ダウンストリーム フィルタのアロケータの使用を優先する。
その後、入力ピンが接続されると、次のことが実行される。
- 入力ピンは、フィルタで CheckInputType を、ダウンストリーム フィルタで QueryAccept を呼び出してメディア タイプをチェックする。
- 入力タイプが出力タイプに一致しない場合は、フィルタは出力ピンを再接続する。
- アップストリーム フィルタがアロケータを選択する。入力ピンの GetAllocator メソッドがダウンストリーム アロケータを返す。入力ピンは、アップストリーム フィルタが選択したアロケータが何であっても受け入れる。
- フィルタは、ダウンストリーム接続に同じアロケータを使う。オリジナルのダウンストリーム アロケータをオーバーライドする場合もある。
ダウンストリーム アロケータは書き込み可能でなければならないため、関与するアロケータの 1 つでも読み取り専用の場合は、このイベントのシーケンスはやや異なる。この場合、フィルタは、個別の 2 つのアロケータを使う。
要件
ヘッダー : Transip.h 内で宣言し、Streams.h をインクルードする。
ライブラリ : Strmbase.lib (リテール ビルド) または Strmbasd.lib (デバッグ ビルド) を使う。
プロテクト メソッド | |
Copy | メディア サンプルをコピーする。 |
InputPin | フィルタの入力ピンへのポインタを取得する。 |
OutputPin | フィルタの出力ピンへのポインタを取得する。 |
TypesMatch | 入力メディア タイプが出力メディア タイプと一致するかどうかを調べる。 |
UsingDifferentAllocators | 入力ピンと出力ピンが異なるアロケータを使っているかどうかを調べる。 |
パブリック メソッド | |
CTransInPlaceFilter | コンストラクタ メソッド。 |
GetPin | ピンを取得する。 |
GetMediaType | 出力ピン用の優先メディア タイプを取得する。 |
DecideBufferSize | 出力ピンのバッファ要求を設定する。 |
CheckTransform | 入力メディア タイプが出力メディア タイプと互換性があるかどうかをチェックする。 |
CompleteConnect | ピン接続を完了する。 |
Receive | メディア サンプルを受け取り、それを処理し、ダウンストリーム フィルタに出力する。 |
純粋仮想メソッド | |
Transform | サンプルをインプレイスで変換する。 |