Date

Media Foundation では、オブジェクトの情報を Attribute (属性) として扱っている。属性は、キーと値のペアで成り立っている。 キーはGUID、値はPROPVARIANTである。 全ての型が対応しているわけではなく、以下のようになっている。

  • VT_UI4
  • VT_UI8
  • VT_R8
  • VT_CLSID
  • VT_LPWSTR
  • VT_VECTOR | VT_UI1
  • VT_UNKNOWN

属性が存在する(設定できる)オブジェクトは IMFAttributes インターフェイスを継承している。アプリケーションは、このインターフェイスを介して、オブジェクトの属性を設定したり問い合わせたりする。

例えば、あるメディアタイプのサブタイプを知りたいとする。メディアタイプのインターフェイスはIMFMediaTypeだがIMFAttributesを継承している。サブメディアタイプのキーはMF_MT_SUBTYPE、値はGUID型である。値は IMFAttributes::GetGUID を呼ぶと GUID 型の変数へ代入できる。

1
2
3
CComPtr<IMFMediaType> mt; // メディアタイプを取得したとする
GUID sub_type;
mt->GetGUID(MF_MT_SUBTYPE, &sub_type);

DirectShow では属性は構造体で扱う。しかし構造体は拡張性・柔軟性に乏しく、実装が複雑になってしまうという難点がある。結果としてバージョンアップ時に○○○2のような名前で定義されている。 Media Foundation の属性はキー/値ペアなので、新たにキーを定義すれば拡張できる。キーはGUIDになっているため、アプリケーションが独自のキーを設定することもできる。

属性は、バイト配列またはIStreamインターフェイスでシリアライズ(永続化)もできるようになっている。


Comments

comments powered by Disqus