次の方法で共有


CTransInPlaceFilter クラス

CTransInPlaceFilter クラスの階層

CTransInPlaceFilter クラスは、データをバッファ間でコピーせずに入力データを修正する、インプレイス変換フィルタ用に設計されている。このクラスを使うには、CTransInPlaceFilter から新しいクラスを派生し、以下のメソッドを実装すること。

このフィルタは入力ピンに CTransInPlaceInputPin クラスを使い、出力ピンに CTransInPlaceOutputPin クラスを使う。通常、これらのピン クラスをオーバーライドする必要はない。フィルタは CTransInPlaceFilter::GetPin メソッド内で両方のピンを作成する。ピン クラスをオーバーライドする場合は、GetPin をオーバーライドしてカスタム ピンを作成しなければならない。

このクラスは、入力タイプが常に出力タイプと一致するように設計されている。フィルタは、可能な限り両方のピン接続に 1 つのアロケータを使う。

優先されるメディア タイプ

出力ピンが既に接続されている場合は、入力ピンがダウンストリーム フィルタの優先タイプを提供する。(実際、単にダウンストリーム フィルタの列挙子オブジェクトを返す。) それ以外の場合は、優先タイプを持たない。出力ピンは、逆のケースで同じ動作をする。入力ピンが既に接続されている場合は、出力ピンがアップストリーム フィルタの優先タイプを提供する。それ以外の場合は、優先タイプを持たない。

ピン接続

1 つのピンが接続している場合、通常は、両方のピンが同じメディア タイプと同じアロケータを使うよう、フィルタが他のピンも再接続する。(ピンの再接続のメカニズムについては、「ピンの再接続」を参照すること。) 入力ピンが最初に接続する場合と、出力ピンが最初に接続する場合と、2 種類のシナリオが考えられる。

入力ピンが最初に接続するとする。次のステップが発生する。

  1. 入力ピンがフィルタの CheckInputType メソッドを呼び出し、メディア タイプを確認する。
  2. アップストリーム フィルタがアロケータを選択する。この時点で、入力ピンにはアロケータ条件はなく、どのアロケータでも接続に使える。アップストリーム フィルタがアロケータを要求すると、ピンが新しいアロケータを作成する。後で述べるような理由により、このアロケータは最終的な接続では使われない。これは、接続処理のこの段階を完了させるためだけに提供される。

後で出力ピンが接続されると、次のことが実行される。

  1. 出力ピンがフィルタの CheckInputType メソッドを呼び出し、メディア タイプを確認する。また、アップストリーム フィルタで IPin::QueryAccept を呼び出す。これにより、入力ピンがメディア タイプを一致するように変更できる。
  2. 出力ピンがアロケータを選択する。ダウンストリーム フィルタにアロケータを要求するが、アップストリーム接続のアロケータ プロパティを使う。
  3. フィルタは、出力ピンのメディア タイプを使って、入力ピンを再接続する。
  4. 今度は入力ピンの GetAllocator メソッドがダウンストリーム アロケータを返し、GetAllocatorRequirements がダウンストリーム フィルタのアロケータ条件を返す。入力ピンは、アップストリーム フィルタが選択したアロケータが何であっても受け入れる。
  5. フィルタは、ダウンストリーム接続に同じアロケータを使う。

ここで、出力ピンが最初に接続されるもう一方のシナリオについて考える。

  1. 出力ピンがフィルタの CheckInputType メソッドを呼び出し、メディア タイプを確認する。
  2. アロケータを選択する。このとき、ダウンストリーム フィルタのアロケータの使用を優先する。

その後、入力ピンが接続されると、次のことが実行される。

  1. 入力ピンは、フィルタで CheckInputType を、ダウンストリーム フィルタで QueryAccept を呼び出してメディア タイプをチェックする。
  2. 入力タイプが出力タイプに一致しない場合は、フィルタは出力ピンを再接続する。
  3. アップストリーム フィルタがアロケータを選択する。入力ピンの GetAllocator メソッドがダウンストリーム アロケータを返す。入力ピンは、アップストリーム フィルタが選択したアロケータが何であっても受け入れる。
  4. フィルタは、ダウンストリーム接続に同じアロケータを使う。オリジナルのダウンストリーム アロケータをオーバーライドする場合もある。

ダウンストリーム アロケータは書き込み可能でなければならないため、関与するアロケータの 1 つでも読み取り専用の場合は、このイベントのシーケンスはやや異なる。この場合、フィルタは、個別の 2 つのアロケータを使う。

要件

ヘッダー : Transip.h 内で宣言し、Streams.h をインクルードする。

ライブラリ : Strmbase.lib (リテール ビルド) または Strmbasd.lib (デバッグ ビルド) を使う。

プロテクト メソッド  
Copy メディア サンプルをコピーする。
InputPin フィルタの入力ピンへのポインタを取得する。
OutputPin フィルタの出力ピンへのポインタを取得する。
TypesMatch 入力メディア タイプが出力メディア タイプと一致するかどうかを調べる。
UsingDifferentAllocators 入力ピンと出力ピンが異なるアロケータを使っているかどうかを調べる。
パブリック メソッド  
CTransInPlaceFilter コンストラクタ メソッド。
GetPin ピンを取得する。
GetMediaType 出力ピン用の優先メディア タイプを取得する。
DecideBufferSize 出力ピンのバッファ要求を設定する。
CheckTransform 入力メディア タイプが出力メディア タイプと互換性があるかどうかをチェックする。
CompleteConnect ピン接続を完了する。
Receive メディア サンプルを受け取り、それを処理し、ダウンストリーム フィルタに出力する。
純粋仮想メソッド  
Transform サンプルをインプレイスで変換する。