次の方法で共有


メディア タイプの調整

フィルタ グラフ マネージャは IPin::Connect メソッドを呼び出すときに、次のオプションでメディア タイプを指定する。

  • 完全なメディア タイプ : メディア タイプが詳細に指定されている場合、ピンはそのタイプでの接続を試みる。接続できない場合、接続は失敗する。
  • 不完全なメディア タイプ : メジャー タイプ、サブタイプ、フォーマット タイプが GUID_NULL なら、メディア タイプは "不完全" である。値 GUID_NULL は、任意の値を受け入れ可能であることを示す "ワイルドカード" として機能する。ピンはその不完全なタイプに一致するタイプを調整する。
  • メディア タイプなし : フィルタ グラフ マネージャが NULL ポインタを渡す場合、ピンは両方のピンで受け入れ可能な任意のメディア タイプを使える。

ピンが実際に接続すると、接続は常に完全なメディア タイプを持つ。フィルタ グラフ マネージャがメディア タイプを指定する目的は、起こりうる接続タイプを限定することである。

調整プロセス中に、出力ピンは入力ピンの IPin::ReceiveConnection メソッドを呼び出すことで、メディア タイプを提示する。入力ピンは、提示されたタイプの受け入れまたは拒否を選択できる。入力ピンがタイプを受け入れるまでこのプロセスが繰り返される。出力ピンがあらゆるタイプを提示し尽くして、すべて拒否された場合、接続は失敗する。

提示するメディア タイプを出力ピンがどのように選択するかは、実装により異なる。DirectShow 基底クラスでは、出力ピンが入力ピンに対して IPin::EnumMediaTypes を呼び出す。このメソッドは、入力ピンの優先メディア タイプを列挙する列挙子を返す。これに失敗すると、出力ピンは出力ピン側の優先タイプを列挙する。

メディア タイプの操作

AM_MEDIA_TYPE パラメータを受け取る関数では、pbFormatメンバの参照を解除する前に、常にcbFormatformattype の値を確認すること。次のコードは正しくない。

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 を例示できる。
}