メディア タイプの調整
フィルタ グラフ マネージャは IPin::Connect メソッドを呼び出すときに、次のオプションでメディア タイプを指定する。
- 完全なメディア タイプ : メディア タイプが詳細に指定されている場合、ピンはそのタイプでの接続を試みる。接続できない場合、接続は失敗する。
- 不完全なメディア タイプ : メジャー タイプ、サブタイプ、フォーマット タイプが GUID_NULL なら、メディア タイプは "不完全" である。値 GUID_NULL は、任意の値を受け入れ可能であることを示す "ワイルドカード" として機能する。ピンはその不完全なタイプに一致するタイプを調整する。
- メディア タイプなし : フィルタ グラフ マネージャが NULL ポインタを渡す場合、ピンは両方のピンで受け入れ可能な任意のメディア タイプを使える。
ピンが実際に接続すると、接続は常に完全なメディア タイプを持つ。フィルタ グラフ マネージャがメディア タイプを指定する目的は、起こりうる接続タイプを限定することである。
調整プロセス中に、出力ピンは入力ピンの IPin::ReceiveConnection メソッドを呼び出すことで、メディア タイプを提示する。入力ピンは、提示されたタイプの受け入れまたは拒否を選択できる。入力ピンがタイプを受け入れるまでこのプロセスが繰り返される。出力ピンがあらゆるタイプを提示し尽くして、すべて拒否された場合、接続は失敗する。
提示するメディア タイプを出力ピンがどのように選択するかは、実装により異なる。DirectShow 基底クラスでは、出力ピンが入力ピンに対して IPin::EnumMediaTypes を呼び出す。このメソッドは、入力ピンの優先メディア タイプを列挙する列挙子を返す。これに失敗すると、出力ピンは出力ピン側の優先タイプを列挙する。
メディア タイプの操作
AM_MEDIA_TYPE パラメータを受け取る関数では、pbFormatメンバの参照を解除する前に、常にcbFormat と formattype の値を確認すること。次のコードは正しくない。
if (pmt->formattype == FORMAT_VideoInfo)
{
VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
// 間違い!
}
次のコードは正しい。
if ((pmt->formattype == FORMAT_VideoInfo) &&
(pmt->cbFormat > sizeof(VIDEOINFOHEADER) &&
(pbFormat != NULL))
{
VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
// pVIH を例示できる。
}