Microsoft DirectX 8.0 |
Microsoft® DirectX® 8.0 SDK には、DMO 作成のための基底クラス テンプレート IMediaObjectImpl が含まれている。DMO が IUnknown インターフェイスと IMediaObject インターフェイスを完全にサポートしていれば、DMO 作成時にこのクラス テンプレートを使用する必要はない。ただし、Microsoft 提供のクラス テンプレートは、入力パラメータの確認などの "定番" 処理の多くを行うようになっている。テンプレートを使用すれば、その DMO 固有の機能のみに専念できる。さらに、テンプレートは堅牢な実装を作成する助けにもなる。
ここでは、以下のトピックについて説明する。
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 はストリームを動的に作成または破棄できないため、ストリーム数は定数である。
テンプレートは、以下の IMediaObject メソッドの部分的な実装を提供する。IMediaObject のメソッドは内部的に対応するメソッドを呼び出すので、それらの内部メソッドを派生クラス側で提供する必要がある。内部メソッド名には、Internal- というプレフィックスが付く。内部メソッドでは、インターフェイス メソッドと同じパラメータが使用される。
IMediaObject メソッド | 派生クラスのメソッド |
---|---|
AllocateStreamingResources | InternalAllocateStreamingResources |
Discontinuity | InternalDiscontinuity |
Flush | InternalFlush |
FreeStreamingResources | InternalFreeStreamingResources |
GetInputMaxLatency | InternalGetInputMaxLatency |
GetInputSizeInfo | InternalGetInputSizeInfo |
GetInputStreamInfo | InternalGetInputStreamInfo |
GetInputType | InternalGetInputType |
GetOutputSizeInfo | InternalGetOutputSizeInfo |
GetOutputStreamInfo | InternalGetOutputStreamInfo |
GetOutputType | InternalGetOutputType |
ProcessInput | InternalProcessInput |
ProcessOutput | InternalProcessOutput |
SetInputMaxLatency | InternalSetInputMaxLatency |
IMediaObject の残りのメソッドでは、インターフェイス メソッドと内部メソッドが 1 対 1 に対応していない。次の一覧は、テンプレートで完全に実装されるメソッドと、派生クラス提供のヘルパー メソッドを呼び出すメソッドをまとめたものである。
IMediaObject メソッド | IMediaObjectImpl での実装 |
---|---|
GetInputCurrentType | 完全に実装される。 |
GetOutputCurrentType | 完全に実装される。 |
GetStreamCount | 完全に実装される。 |
GetInputStatus | InternalAcceptingInput を呼び出す。 |
Lock | DMOLock として実装される。Lock または Unlock を呼び出す。 |
SetInputType | InternalCheckInputType を呼び出す。 |
SetOutputType | InternalCheckOutputType を呼び出す。 |
詳細については、「IMediaObjectImpl」を参照すること。