手順 3. メディアの種類のネゴシエーションをサポートする
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
これは、 変換フィルターの作成に関するチュートリアルの手順 3 です。
2 つのピンを接続する場合は、接続のメディアの種類に同意する必要があります。 メディアの種類は、データの形式を表します。 メディアの種類がない場合、フィルターは 1 種類のデータを配信し、別のフィルターが別のデータとして扱うようにする必要があります。
メディアの種類をネゴシエートするための基本的なメカニズムは、 IPin::ReceiveConnection メソッドです。 出力ピンは、提案されたメディアの種類を持つ入力ピンでこのメソッドを呼び出します。 入力ピンは接続を受け入れるか、または拒否します。 接続が拒否された場合、出力ピンは別のメディアタイプを試すことができます。 適切な種類が見つからない場合、接続は失敗します。 必要に応じて、入力ピンは IPin::EnumMediaTypes メソッドを使用して、希望する型のリストをアドバタイズできます。 出力ピンは、メディアタイプを提案するときにこのリストを使用できますが、必要はありません。
CTransformFilter クラスは、次のように、このプロセスの一般的なフレームワークを実装します。
- 入力ピンには、推奨されるメディアの種類はありません。 メディアの種類を提案するには、アップストリーム フィルターに完全に依存します。 ビデオ データの場合、メディアの種類には画像サイズとフレーム レートが含まれているため、これは理にかなっています。 通常、その情報はアップストリーム ソース フィルターまたはパーサー フィルターによって提供される必要があります。 オーディオ データの場合は、使用可能な形式のセットが小さいため、入力ピンで推奨される種類を提供するのが実用的な場合があります。 その場合は、入力ピンの CBasePin::GetMediaType をオーバーライドします。
- アップストリーム フィルターがメディアの種類を提案すると、入力ピンは CTransformFilter::CheckInputType メソッドを呼び出します。このメソッドは型を受け入れるか拒否します。
- 入力ピンが最初に接続されていない限り、出力ピンは接続されません。 この動作は、変換フィルターの一般的な動作です。 ほとんどの場合、フィルターは出力の種類を設定する前に入力の種類を決定する必要があります。
- 出力ピンが接続されると、ダウンストリーム フィルターに提案するメディアの種類の一覧が表示されます。 CTransformFilter::GetMediaType メソッドを呼び出して、このリストを生成します。 出力ピンは、ダウンストリーム フィルターが提案するメディアの種類も試します。
- 特定の出力の種類が入力型と互換性があるかどうかをチェックするために、出力ピンは CTransformFilter::CheckTransform メソッドを呼び出します。
前述の 3 つの CTransformFilter メソッドは純粋な仮想メソッドであるため、派生クラスで実装する必要があります。 これらのメソッドはいずれも COM インターフェイスに属しません。これらは単に基底クラスによって提供される実装の一部です。
次のセクションでは、各メソッドについて詳しく説明します。
関連トピック