QDecoder

概要

DirectShow アーキテクチャー上で、Matroska コンテナの Theora/Vorbis コンテンツ 再生を実現する DirectShow フィルターである。

単体の Theora/Vorbis デコーダーのみを実現する場合は、DMO で実装することができるが、 Matroska のパーサーフィルター機能を包含するため、DirectShow フィルターとして実装する。

用途としては、組み込み専用とし、単体フィルターとしては使用できないものとする。そのため、 環境依存の外部フィルターに影響を受けることはない。また、別アプリケーションにおける障害の 原因となることがない。インストール作業も不要である。

DirectShow アーキテクチャーの思想としては、パーサーとデコーダーは別コンポーネントとなる のが普通であるが、アプリケーションへの組み込みを容易にするため、単一のコンポーネントとする。

DirectShow フィルターの実装では、SDK のサンプルとして提供されるフレームワーク ライブラリ (BaseClasses) を用いるのがほとんどであるが、今回は敢えて ATL のみを 使用して独自に実装する。

実装の詳細

DirectShow フィルターとして要求されるインターフェイスは、以下の通りである。

  • IBaseFilter (IMediaFilter -> IPersist)
  • IMediaSeeking

フィルターのピンには、以下のインターフェイスが必要である。

  • IPin

その他、サポート用のオブジェクトとして、以下のインターフェイスの実装が必要である。

  • IEnumPins
  • IEnumMediaTypes

フィルターは、モノリシック構成とする。入力ピンは持たず、Video と Audio を出力する2つの 出力ピンを固定的に備える。Video, Audio は、デコード済みの非圧縮フォーマットで出力する。 基本的に出力ピンは、レンダラーフィルターに直結されることを想定している。

IMediaSeeking をサポートし、基本的なシーク機能を実装する。

フィルターの実装

ピンの実装

ストリーミングスレッドの実装