CBasePin 接続プロセス

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

このセクションでは、 CBasePin クラスがピン接続プロセスを実装する方法について説明します。

フィルター グラフ マネージャーは、すべてのピン接続を開始します。 出力ピンの IPin::Connect メソッドを呼び出し、入力ピンを指定します。 出力ピンは、入力ピンの IPin::ReceiveConnection メソッドを呼び出して接続を完了します。 入力ピンは、接続を受け入れるか拒否できます。

フィルター グラフ マネージャーでは、接続のメディアの種類を指定することもできます。 その場合、ピンはその種類に接続しようとします。 そうでない場合、ピンは型をネゴシエートする必要があります。 フィルター グラフ マネージャーでは、主な種類、サブタイプ、または書式の種類にGUID_NULL値を持つ 部分 メディアの種類を指定することもできます。 その場合、ピンはメディアタイプの指定された部分と一致しようとします。値GUID_NULLワイルドカードとして機能します。

CBasePin::Connect メソッドは、まず、ピンが接続を受け入れられることを確認します。 たとえば、ピンがまだ接続されていないことを確認します。 接続プロセスの残りの部分を CBasePin::AgreeMediaType メソッドに委任します。 以下のすべてが AgreeMediaType によって実行されます。

メディアの種類が完全に指定されている場合、ピンは CBasePin::AttemptConnection メソッドを呼び出して接続を試行します。 それ以外の場合は、メディアの種類を次の順序で試行します。

  1. 入力ピンの推奨される種類。
  2. 出力ピンの推奨される種類。

この順序を逆にするには、 CBasePin::m_bTryMyTypesFirst フラグを TRUE に設定 します

いずれの場合も、ピンは IPin::EnumMediaTypes を呼び出してメディアの種類を列挙します。 このメソッドは列挙子オブジェクトを取得します。このオブジェクトは CBasePin::TryMediaTypes メソッドに渡されます。 TryMediaTypes メソッドは、各メディアの種類をループ処理し、各種類の AttemptConnection を呼び出します。

AttemptConnection メソッド内で、出力ピンは次のメソッドを呼び出します。

  • CBasePin::CheckConnect をそれ自体で呼び出して、入力ピンが適切かどうかをチェックします。
  • CBasePin::CheckMediaType をそれ自体で呼び出して、メディアの種類を検証します。
  • 入力ピンで IPin::ReceiveConnection を呼び出します。 入力ピンは、このメソッドを使用して、接続を受け入れる必要があるかどうかを判断します。
  • CBasePin::CompleteConnect 自体を呼び出して接続を完了します。

次のことを考慮してください。

  • CheckConnect は仮想メソッドです。 基本クラスでは、このメソッドはピンの方向に互換性があるかどうかを確認します。 出力ピンは入力ピンに接続する必要があります。その逆も同様です。 通常、派生ピン クラスは、他のチェックを実行するためにこのメソッドをオーバーライドします。 たとえば、接続に必要なインターフェイスに対してもう一方のピンに対してクエリを実行する場合があります。 派生クラスが CheckConnect をオーバーライドする場合は、 CBasePin メソッドも呼び出す必要があります。
  • CheckMediaType は、派生クラスが実装する必要がある純粋な仮想メソッドです。
  • CompleteConnect は、基底クラスで何も行わない仮想メソッドです。 派生クラスは、このメソッドをオーバーライドして、接続を完了するために必要な追加の作業 (メモリ アロケーターの決定など) を実行できます。

これらの手順のいずれかが失敗した場合、出力ピンは CBasePin::BreakConnect メソッドを呼び出して 、CheckConnect によって実行されたすべての手順を元に戻します。

入力ピンの ReceiveConnection メソッドは、入力ピンの CheckConnect、CheckMediaTypeCompleteConnect メソッドを呼び出します。 これらのいずれかが失敗した場合、接続の試行も失敗します。

次の図は、 CBasePin の接続プロセスを示しています。

cbasepin 接続プロセス

CBasePin