Share via


CTransInPlaceFilter クラス

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

ctransinplacefilter クラス階層

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

このクラスでは、入力ピンに CTransInPlaceInputPin クラスを使用し、出力ピンに CTransInPlaceOutputPin クラスを使用します。 通常、これらのピン クラスをオーバーライドする必要はありません。 フィルターは 、CTransInPlaceFilter::GetPin メソッドで両方のピンを作成します。 ピン クラスをオーバーライドする場合は、カスタム ピンを作成するために GetPin をオーバーライドする必要があります。

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

優先メディアの種類

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

接続のピン留め

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

入力ピンが最初に接続するとします。 次の手順で行われます。

  1. 入力ピンは、フィルターの CheckInputType メソッドを呼び出して、メディアの種類をチェックします。
  2. アップストリーム フィルターはアロケーターを選択します。 この時点で、入力ピンにはアロケーターの要件がなく、接続のアロケーターを受け入れます。 アップストリーム フィルターがアロケーターを要求すると、ピンによって新しいアロケーターが作成されます。 簡単に説明した理由から、このアロケーターは最終的な接続では使用されません。 これは、接続プロセスのこの段階を完了するのに役立つためだけに提供されます。

後で、出力ピンが接続されると、次のようになります。

  1. 出力ピンは、フィルターの CheckInputType メソッドを呼び出して、メディアの種類をチェックします。 また、アップストリーム フィルターで IPin::QueryAccept も呼び出します。 これにより、入力ピンでメディアの種類を一致するように変更できます。
  2. 出力ピンは、フィルターの CheckInputType メソッドを呼び出して、メディアの種類をチェックします。 また、アップストリーム フィルターで IPin::QueryAccept も呼び出します。 これにより、入力ピンでメディアの種類を一致するように変更できます。
  3. 出力ピンは、フィルターの CheckInputType メソッドを呼び出して、メディアの種類をチェックします。 また、アップストリーム フィルターで IPin::QueryAccept も呼び出します。 これにより、入力ピンでメディアの種類を一致するように変更できます。
  4. 今回、入力ピンの GetAllocator メソッドはダウンストリーム アロケーターを返し、 GetAllocatorRequirements はダウンストリーム フィルターのアロケーター要件を返します。 入力ピンは、アップストリーム フィルターが選択したアロケーターを受け入れます。
  5. 今回、入力ピンの GetAllocator メソッドはダウンストリーム アロケーターを返し、 GetAllocatorRequirements はダウンストリーム フィルターのアロケーター要件を返します。 入力ピンは、アップストリーム フィルターが選択したアロケーターを受け入れます。

次に、出力ピンが最初に接続するピンである、逆のシナリオについて考えてみましょう。

  1. 出力ピンは、フィルターの CheckInputType メソッドを呼び出して、メディアの種類をチェックします。
  2. アロケーターを選択します。ダウンストリーム フィルターのアロケーターを使用することをお勧めします。

次に、入力ピンが接続されると、次のようになります。

  1. 入力ピンは、フィルターで CheckInputType を呼び出し、ダウンストリーム フィルターの出力ピンで QueryAccept を 呼び出すことによって、メディアの種類を確認します。
  2. 入力の種類が出力の種類と一致しない場合、フィルターは出力ピンを再接続します。
  3. アップストリーム フィルターはアロケーターを選択します。 入力ピンの GetAllocator メソッドはダウンストリーム アロケーターを返し、入力ピンはアップストリーム フィルターが選択したアロケーターを受け入れます。
  4. フィルターは、ダウンストリーム接続に同じアロケーターを使用し、元のダウンストリーム アロケーターをオーバーライドする可能性があります。

ダウンストリーム アロケーターは書き込み可能である必要があるため、関連するアロケーターのいずれかが読み取り専用の場合、この一連のイベントは若干変わります。 その場合、フィルターは 2 つの個別のアロケーターを使用する場合があります。

このクラスの使用方法の詳細については、「 変換フィルターの記述」を参照してください。

保護されたメンバー変数 説明
m_bModifiesData フィルターがサンプル データを変更するかどうかを示します。
プロテクト メソッド 説明
コピー メディア サンプルをコピーします。
InputPin フィルターの入力ピンへのポインターを取得します。
OutputPin フィルターの出力ピンへのポインターを取得します。
TypesMatch 入力メディアの種類が出力メディアの種類と一致するかどうかを決定します。
UsingDifferentAllocators 入力ピンと出力ピンが異なるアロケーターを使用しているかどうかを判断します。
パブリック メソッド 説明
CTransInPlaceFilter コンストラクター メソッド。
GetPin ピンを取得します。
GetMediaType 出力ピンの優先メディアの種類を取得します。
DecideBufferSize 出力ピンのバッファー要件を設定します。
CheckTransform 入力メディアの種類が出力メディアの種類と互換性があるかどうかを確認します。
CompleteConnect ピン接続を完了します。
受信 メディア サンプルを受信して処理し、ダウンストリーム フィルターに配信します。
純粋仮想メソッド 説明
Transform サンプルをインプレースで変換します。

要件

要件
ヘッダー
Transip.h (include Streams.h)
ライブラリ
Strmbase.lib (小売ビルド);
Strmbasd.lib (デバッグ ビルド)