Microsoft DirectX 8.0

DMO 基底クラスの使い方

Microsoft® DirectX® 8.0 SDK には、DMO 作成のための基底クラス テンプレート IMediaObjectImpl が含まれている。DMO が IUnknown インターフェイスと IMediaObject インターフェイスを完全にサポートしていれば、DMO 作成時にこのクラス テンプレートを使用する必要はない。ただし、Microsoft 提供のクラス テンプレートは、入力パラメータの確認などの "定番" 処理の多くを行うようになっている。テンプレートを使用すれば、その DMO 固有の機能のみに専念できる。さらに、テンプレートは堅牢な実装を作成する助けにもなる。

ここでは、以下のトピックについて説明する。

IMediaObjectImpl の概要

IMediaObjectImpl テンプレートは、IMediaObject インターフェイスを継承するクラス テンプレートである。このテンプレートを使って DMO を作成するには、IMediaObjectImpl から派生する新しいクラスを定義する。テンプレートは IMediaObject のメソッドをすべて実装する。多くの場合、テンプレート メソッドは対応する内部メソッドを呼び出し、これらの内部メソッドを派生クラスから提供する。このように、テンプレートはパラメータ チェックなどの汎用機能を提供し、派生クラスは DMO の核になる機能を提供する。

テンプレートは以下の機能を提供する。

IUnknown インターフェイスは、テンプレートから提供されないため、派生クラスで実装すること。IUnknown は、ATL (Active Template Library) を使って実装できるが、ほかの実装を提供してもよい。

また、テンプレートにはロック メカニズムが実装されない。このため、Lock メソッドと Unlock メソッドは派生クラス側で実装する必要がある。ただし、ATL を使ってクラスを作成する場合には、ATL によるこれらのメソッドのデフォルト実装で足りることが多い。

派生クラスの宣言

IMediaObjectImpl テンプレートは、SDK のインクルード ディレクトリにあるヘッダー ファイル Dmoimpl.h で以下のように宣言される。

template <class _DERIVED_, int NUMBEROFINPUTS, int NUMBEROFOUTPUTS>
class IMediaObjectImpl : public IMediaObject

テンプレートには以下の表に示す 3 つのパラメータがある。

_DERIVED_派生クラス型
NUMBEROFINPUTS入力ストリーム数
NUMBEROFOUTPUTS出力ストリーム数

たとえば、入力ストリームと出力ストリームそれぞれ 1 つをサポートする CMyDmoClass という派生クラスを作成するには、次のように宣言する。

class CMyDmoClass :
    public IMediaObjectImpl<CMyDmoClass, 1, 1>  // 入力が 1 つ、出力が 1 つ

DMO はストリームを動的に作成または破棄できないため、ストリーム数は定数である。

DMO メソッドの実装

テンプレートは、以下の IMediaObject メソッドの部分的な実装を提供する。IMediaObject のメソッドは内部的に対応するメソッドを呼び出すので、それらの内部メソッドを派生クラス側で提供する必要がある。内部メソッド名には、Internal- というプレフィックスが付く。内部メソッドでは、インターフェイス メソッドと同じパラメータが使用される。

IMediaObject メソッド派生クラスのメソッド
AllocateStreamingResourcesInternalAllocateStreamingResources
DiscontinuityInternalDiscontinuity
FlushInternalFlush
FreeStreamingResourcesInternalFreeStreamingResources
GetInputMaxLatencyInternalGetInputMaxLatency
GetInputSizeInfoInternalGetInputSizeInfo
GetInputStreamInfoInternalGetInputStreamInfo
GetInputTypeInternalGetInputType
GetOutputSizeInfoInternalGetOutputSizeInfo
GetOutputStreamInfoInternalGetOutputStreamInfo
GetOutputTypeInternalGetOutputType
ProcessInputInternalProcessInput
ProcessOutputInternalProcessOutput
SetInputMaxLatencyInternalSetInputMaxLatency

IMediaObject の残りのメソッドでは、インターフェイス メソッドと内部メソッドが 1 対 1 に対応していない。次の一覧は、テンプレートで完全に実装されるメソッドと、派生クラス提供のヘルパー メソッドを呼び出すメソッドをまとめたものである。

IMediaObject メソッドIMediaObjectImpl での実装
GetInputCurrentType完全に実装される。
GetOutputCurrentType完全に実装される。
GetStreamCount完全に実装される。
GetInputStatusInternalAcceptingInput を呼び出す。
LockDMOLock として実装される。Lock または Unlock を呼び出す。
SetInputTypeInternalCheckInputType を呼び出す。
SetOutputTypeInternalCheckOutputType を呼び出す。

詳細については、「IMediaObjectImpl」を参照すること。