Microsoft DirectX 8.0 |
このトピックでは、Microsoft® DirectShow® クラス ライブラリの概要、基底クラスとそれが実装する DirectShow Component Object Model (COM) インターフェイスの関係、およびこれらのインターフェイスとは直接関係のないユーティリティ クラスについて説明する。ここでは、各クラスの低レベルな解説や、フィルタを構築したりフィルタ グラフ マネージャを実行する方法などの特定の手順についての説明は行わない。
DirectShow C++ クラス ライブラリは、自分で作成したフィルタに必要なインターフェイスを実装する場合に役に立つ。ほかのユーティリティ クラスを使用すると クリティカル セクションやスレッド管理などの Microsoft Win32® の機能を組み込むことができる一方で、ほとんどの基底クラスはインターフェイスに直接対応する。
このトピックは、以下のセクションを含んでいる。
DirectShow クラス ライブラリのほとんどの基底クラスは DirectShow COM インターフェイスを実装する。これらのクラスは IUnknown インターフェイスを提供する C++ オブジェクトを生成するので、外部コンポーネントはそのオブジェクトがサポートするインターフェイスにアクセスできる。
このセクションでは、以下の項目について説明する。
CBaseObject クラスは、すべての基底クラスのルートである。このクラスの主な目的は、すべてのアクティブな DirectShow オブジェクトの数を保持することによってデバッグを支援することである。派生クラス内のすべての基底クラス コンストラクタは、デバッギング オブジェクト名を第 1 パラメータとして提供しながら CBaseObject コンストラクタを呼び出す。この基底クラスに送られたデバッギング オブジェクト名は、デバッギング モニタ上で見ることができる。
インターフェイスを実装するすべての DirectShow クラスは、CBaseObject から派生した CUnknown と呼ばれる基底クラスから派生する。CUnknown は INonDelegatingUnknown インターフェイスを実装する。このインターフェイスは IUnknown インターフェイスと同様に、インターフェイスを要求するメソッドやそのインターフェイスへの参照を追加または解放するメソッドを提供する。
IUnknown のサービスを実装するインターフェイスがなぜ 2 つあるのだろうか? その理由は、集成 (aggregation) にある。集成とは、複数のオブジェクトを結合して 1 つの大きなオブジェクトにする COM 用語である。フィルタやピンなどのフィルタ グラフ オブジェクトを集成することはほとんどない。ただし、将来の拡張性を確保したり、フィルタ グラフ マネージャによって集成されるオブジェクトである PID を実装する目的で、その設計を取り入れることは可能である。集成したオブジェクトにおいて、外部オブジェクト (ほかのオブジェクトをその中に含んでいるオブジェクト) は、IUnknown インターフェイスを使用してオブジェクトの外部と通信する。外部オブジェクトの IUnknown インターフェイスは、その内部オブジェクトの IUnknown インターフェイスへの参照を渡す。つまり、アプリケーションが外部オブジェクトの IUnknown インターフェイスを呼び出して、そのいずれかの内部オブジェクトに属するインターフェイスを要求すると、外部オブジェクトは内部オブジェクトの IUnknown インターフェイスを呼び出して、要求されたインターフェイスを取得する。
内部オブジェクトは IUnknown インターフェイスを外部オブジェクトの IUnknown に委任しなければならないので、内部オブジェクトの IUnknown インターフェイスをプライベートに (つまり外部オブジェクトの IUnknown インターフェイスを経由せずに) アクセスしてはならない。内部オブジェクトの IUnknown は、外部オブジェクトを介した通信専用に予約されている。ただし、外部オブジェクトを経由せずにオブジェクトがほかのオブジェクトにプライベートに接続することは可能である。たとえばフィルタのピンは、ほかのオブジェクトのピンのインターフェイスをプライベートに照会しなければならないことがある。
INonDelegatingUnknown インターフェイスは、オブジェクトが集成されているかどうかに関係なく、インターフェイスへの直接的なプライベート アクセスを提供する。直接アクセスは、ピン、アロケータ、フィルタなどの DirectShow オブジェクト間でのほとんどの通信において重要であり、通信を行う場合のデフォルトの方法である。実際、基底クラスは、集成されていないオブジェクト (フィルタ グラフのほとんどすべてのオブジェクト) の IUnknown インターフェイスを実装して非委任インターフェイスを直接呼び出す。
DirectShow クラス ライブラリに含まれるクラスの大半は COM インターフェイスを実装し、次のように分類される。
ここでは、以下の項目について説明する。
DirectShow のストリームのアーキテクチャは、フィルタとピンに基づいている。フィルタは、フィルタ グラフ マネージャおよびフィルタのピンと通信を行う。ピンはフィルタに接続し、データをストリームの下流に転送する。
CBaseFilter は、すべてのフィルタ クラスの基底クラスである。このクラスは、IBaseFilter インターフェイスを実装する。IBaseFilter インターフェイスが指定するメソッドにより、フィルタ グラフ マネージャはピンの作成や列挙、およびフィルタ情報の取得を行い、また、フィルタ グラフに追加されたことをフィルタに通知することができる。また、CBaseFilter は、フィルタがフィルタ グラフ マネージャから実行、ポーズ、および停止コマンドを受け取るための IMediaFilter インターフェイス (IBaseFilter の派生元) も実装する。この基底クラスは、メンバ関数を追加して、ピン カウントの取得、個々のピンへのポインタの取得、およびピン バージョンの取得を行う。
また、CBaseMediaFilter クラスは、IMediaFilter インターフェイスも実装する。ただし IMediaFilter は CBaseFilter によっても実装されるので、このクラスは PID を書く場合を除いてほとんど使用しない。
いくつかのクラスは CBaseFilter から直接派生する。このようなクラスのそれぞれは、特定のタイプのフィルタを実装するための基底クラスを提供する。このようなクラスには以下のクラスがある。
CSource フィルタ クラスは CSourceStream ピン クラスと共に、ソース フィルタの作成を支援する。ほとんどの処理はピン クラスで行われ、CSource はピン作成および削除メンバ関数を追加する。CSourcePosition クラスは、ソース フィルタを実装する。
CTransformFilter クラスは、変換フィルタを実装する。データのコピーを作成したい場合は、CTransformFilter から変換クラスを派生する。CTransformFilter から派生した CTransInPlaceFilter クラスを使用すると、データのコピーを作成せずにその場で変換が可能になる。これらの変換フィルタ クラスは、同じような名前が付けられたピン クラス (たとえば CTransformOutputPin と CTransformInputPin) といっしょに動作する。ピン クラスのほとんどのメンバ関数は、変換フィルタ クラスのメンバ関数を呼び出すために実装されるので、通常はフィルタ クラスから自分のフィルタを派生させた後、変換フィルタを実装するいくつかのメンバ関数をオーバーライドするだけで良い。
CTransformFilter は、CBaseFilter から派生したクラスにいくつかのメンバ関数を追加する。その中には、派生クラスがオーバーライドしなければならない純粋仮想メンバ関数が含まれる。1 つの例として、入力ピンがサンプルを受け取ったときに呼び出さなければならない CTransformFilter::Transform メンバ関数がある。このメンバ関数は、変換機能の核部分を提供する。オーバーライドされるほかのメンバ関数には、派生クラスに固有の実装 (たとえば ピンのメディア タイプのチェックや適切な量のメモリの割り当て) も含まれる。さらに、いくつかの CTransformFilter メンバ関数は、接続またはストリーミングプロセスにおける各種のポイントで呼び出される。派生クラスはこれらをオーバーライドして、インターフェイスへの参照の追加や解放を処理する。
CVideoTransformFilter クラスは CTransformFilter クラスから派生し、ビデオ レンダラが品質コントロール メッセージを送信したときにフレームをドロップすることによってレンダリングされたビデオの品質に作用するフィルタの基底クラスとして使用される。このクラスは、主にビデオ デコンプレッサによって使用される。
CBaseRenderer クラスとその派生クラスである CBaseVideoRenderer は、ビデオ レンダリング フィルタを実装するベース フィルタ クラスである。DirectShow で使用されるビデオ レンダリング フィルタは、CBaseVideoRenderer から派生する。これらのクラスといっしょに動作するが CBaseFilter から派生しないレンダラ クラスもある。このようなクラスには、以下のクラスがある。
次の図は、CBaseFilter または CBasePin から派生しない、レンダラをサポートするすべてのクラスを示している。
ピンの操作はフィルタに比べて手間がかかる。ピンは、フィルタ グラフ マネージャがそれを別のフィルタのピンに接続できるように、メソッドを公開しなければならない。また、ピンは、どのメディア タイプを渡すかについて、そしてメディア サンプルを転送するための共有メモリ アロケータをどのピンが提供するかについて、接続されているピンどうしで調整するためにもメソッドを公開する。出力ピンは、それぞれのメディア サンプルを接続されている入力ピンに渡す役目を持ち、入力ピンは、それを受け取る役目を持つ。ピンは、インターフェイスをサポートして、品質コントロール メッセージおよび位置情報がピンの間でストリームを介して渡されるようにしなければならない。
次の図は、ピン クラスを示している。すべてのピン クラスは、CUnknown から派生した基底クラス CBasePin から派生する。
CBasePin は、IPin インターフェイスを実装する。IPin インターフェイスは、ほかのピンへの接続、接続されているピンで使用するメディア タイプの調整、ピンの内部接続のクエリ、ストリームのアクティビティのピンへの通知を行うためのメソッドを指定する。
IPin メソッドの実装に加え、CBasePin は IQualityControl メソッドを実装して、フィルタ グラフを経由してピンどうしで品質コントロール メッセージを渡せるようにする。品質コントロール メッセージを使用すると、たとえばレンダラなどのフィルタは、サンプル レートを調整するために別のフィルタを要求できる。通常、品質コントロール メッセージは、レンダラからアップストリームのソース フィルタに渡される。ただし、ビデオ キャプチャ フィルタの場合には、ソース フィルタ (たとえば VTR リーダー) は、品質コントロール メッセージをダウンストリームのレンダリング フィルタに渡してレートを調整することができる。
CBasePin クラスは、接続処理、メディア タイプの調整、および接続解除処理を提供するためのオーバーライド可能ないくつかの仮想メンバ関数を提供する。CBasePin から派生する 2 つの基底クラスは、このような操作の多くのデフォルト処理を提供する。
CBaseOutputPin は、CTransformOutputPin および CSourceStream クラスの基底クラスである。同様に、CBaseInputPin は、CTransformInputPin クラスの基底クラスである。これらの派生ベース ピン クラスを理解するうえで、CBaseOutputPin および CBaseInputPin クラスが使用する基本モデルを理解することが大切である。
2 つのピンで使用される接続および転送モデルにおいて、入力ピンはメディア サンプルを受け取ることができるように IMemInputPin インターフェイスをサポートする。CBaseInputPin クラスは、IMemInputPin インターフェイスを実装する。また、2 つのピンの一方は、ピン間で渡されるメディア サンプル オブジェクトを生成する IMemAllocator インターフェイスを含むオブジェクトである、共有メモリ アロケータ オブジェクトを提供しなければならない。CBaseInputPin クラスによって実装される IMemInputPin メソッドは、CMemAllocator クラスによって実装されるこのアロケータ オブジェクトを提供する。接続されている出力ピンは、専用のアロケータを提供することもできる。この場合、出力ピンは、どのアロケータを使用するかを入力ピンに (別の IMemInputPin メソッドを介して) 通知しなければならない。
CBaseOutputPin クラスは追加のメンバ関数を提供して、アロケータのサンプルのサイズおよび数を設定し、アロケータからのメディア サンプルを取得し、そのメディア サンプルを接続されている入力ピンに配送し、エンドオブストリーム メッセージおよびフラッシュの終わりメッセージをダウンストリームに配送する。このクラスはまた、多くの IPin メソッドも実装する。
CPullPin は、パーサー フィルタの入力ピンで使用されるクラスである。次の図に示すように、このクラスは CAMThread クラスから派生する。
パーサー フィルタは、非同期ファイル リーダー フィルタを使用してディスクから情報を取り出したり、URL モニカ フィルタを使用してインターフェイスから情報を取り出す。CPullPin は、アップストリームのソース リーダー フィルタで実装される IAsyncReader インターフェイスといっしょに動作する。CPullPin はスレッドを開始し、アップストリーム フィルタからデータを取り出し、そのデータをダウンストリームに送る。つまり、CPullPin は、サンプルをソースから取り出した後で専用の IMemInputPin::Receive メソッドを単に呼び出すだけで良い (または、同等のルーチンをどこかで実行する)。
列挙子とは、要素のリストをたどる方法を提供するインターフェイスである。列挙子は COM プログラミングにおいて使用され、オブジェクトを列挙する場合に DirectShow モデルは COM モデルの方法に従う。クラス ライブラリでは、IEnumPins インターフェイスを実装する CEnumPins と、IEnumMediaTypes インターフェイスを実装する CEnumMediaTypes の 2 つの列挙子クラスが提供されている。ほかの 2 つの DirectShow 列挙子インターフェイスである IEnumFilters および IEnumRegFilters はフィルタ グラフ マネージャによってのみ実装されるので、基底クラスによって表されない。
CEnumPins クラスは、IBaseFilter::EnumPins メソッドが呼び出されると列挙子を作成する。このメソッドから返される列挙子は、CEnumPins クラスによって実装される IEnumPins インターフェイスへのポインタである。次に CEnumPins メンバ関数を呼び出して、フィルタの各ピンへのポインタを取得できる。この処理は、この列挙子がフィルタで CBaseFilter::GetPin メンバ関数を呼び出すことによって実現される。フィルタは、基底クラスの CBaseFilter::GetPin メンバ関数をオーバーライドして、それが呼び出されるごとにリスト内で次のピンを列挙子に提供しなければならない。
CEnumMediaTypes クラスは、IPin::EnumMediaTypes メソッドが呼び出されると列挙子を作成する。ピンは、それがサポートするメディア タイプのリストを格納する。通常、メディア タイプの調整では、接続されているピンの EnumMediaTypes メソッドを一方のピンが呼び出して列挙子を取得し、それを使用してメディア タイプを選択する。これらの列挙子クラスは、どちらも COM プログラマに馴染みの Next、Skip、Reset、および Clone メソッドをサポートする。メディア タイプ列挙子は、派生ピン クラスによってオーバーライドされなければならない CBasePin::GetMediaType メンバ関数を呼び出し、そのピンで利用可能なメディア タイプのリスト内で次のメディア タイプを返す。
列挙子はスレッドとして動作し、ピン メディア タイプ リストへの同期アクセスを持たなければならない。このため、列挙子を実装するクラスは、クリティカル セクション管理を提供する CCritSec クラスを (複数の継承を介して) 継承する。CCritSec クラスの詳細については、「Win32 クラス」を参照すること。
転送クラスはピン間でメモリを共有し、そのメモリを使用してメディア サンプルを渡す。DirectShow では、ローカル メモリ転送の実装を行うための 4 つのクラスを提供している。
CBaseAllocator は、次の図に示すように、IMemAllocator インターフェイスを実装するためのメンバ関数を提供するクラスである。
入力ピンの IMemAllocator インターフェイスは、 割り当てるバッファの数およびサイズを設定するためのメソッドを指定し、そのメモリの割り当てと解放を行い、IMediaSample インターフェイスを含んでいる 1 つのバッファを返す。入力ピンに接続されている出力ピンは、IMemAllocator メソッドを呼び出す。CBaseAllocator は、Commit および Decommit メソッドから呼び出されるメンバ関数 Alloc および Free を提供する。派生クラスは Alloc および Free メンバ関数をオーバーライドして、メモリの割り当ておよび解放を行う専用のルーチンを提供する。
CBaseAllocator はそれ自体で実装をほとんど行わないので、ほとんどのピンは、CBaseAllocator から派生した CMemAllocator クラスを使用する。CMemAllocator は、CBaseAllocator::Free メンバ関数をオーバーライドして、システム メモリに基づいてメディア サンプルの割り当てを提供する。このクラスは、アロケータが最終的に解放されるときに呼び出される専用のメンバ関数である ReallyFree を提供する。
CMediaSample は、メディア サンプル データを格納するクラスであり、データ型や開始および終了タイム スタンプなどのメディア サンプルのプロパティにアクセスするメンバ関数を提供する。 このクラスは、メソッドの指定を提供する IMediaSample インターフェイスを実装する。CImageSample は CMediaSample から派生し、レンダラのアロケータが使用されるときにビデオ レンダラによって使用される。CImageSample は、CMediaSample インターフェイスのすべてのメソッドを使用するほか、DIBSECTION 情報を設定および取得するための 2 つのメソッドを使用する。これにより、レンダラは、アップストリーム フィルタから受け取った CMediaSample ポインタを容易に CImageSample ポインタにキャストして、ビデオ フレームのビットマップのハンドルを取得することができる。
メディア コントロール インターフェイスは、アプリケーションから Run、Stop、または Pause などのコマンドをフィルタ グラフ マネージャを介して個々のフィルタに渡す。フィルタ側から見て必要なコントロール インターフェイスは、これらのコマンドを受け付けて実装するためのメソッドを公開する IMediaFilter だけである。CBaseFilter クラスはこのインターフェイスを実装する。メディア コントロール メソッドを公開するほかのすべてのインターフェイスは、フィルタ グラフ マネージャによって扱われるので、既に実装されている。CMediaControl クラスが存在し、IMediaControl インターフェイスを実装した場合でも、フィルタ グラフ マネージャがその機能を制御するので、このインターフェイスはあまり使用されない。次の図は、これらのクラスとインターフェイスの関係を示している。
メディア配置インターフェイスは、指定された位置でメディア ストリームを開始したり、指定された期間ストリームを再生したり、またはメディア ストリームのレートを変更する。IMediaPosition インターフェイスは、この機能をサポートする主要なインターフェイスである。CMediaPosition クラスはこのインターフェイスを実装して、CPosPassThru および CSourcePosition の 2 つのクラスの基底クラスとして機能する。
通常、フィルタ グラフ マネージャは、メディア ストリームを配置するときにレンダリング フィルタの IMediaPosition インターフェイスを呼び出す。レンダラは、表示が予測されるサンプル タイムを認め、適切に配置されたソース ストリームを提供可能なアップストリームのシーク可能フィルタ (たとえばソース ファイル フィルタ) にメディア配置データを渡す。この情報をアップストリームに渡すためには、出力ピンは配置情報を受け取ることができなければならない。
CPosPassThru クラスは、フィルタの出力ピンの IMediaPosition インターフェイスおよび IMediaSeeking インターフェイスを実装するが、次のアップストリーム フィルタの出力ピンの対応するインターフェイスを呼び出して配置データを渡す以外の処理はほとんど行わない。IMediaSeeking は、メディア ストリームをタイム以外の単位 (たとえば MPEG フォーマットのフレーム、サンプル、またはインデックス付きフィールド) にシーク可能である点で IMediaPosition とは異なる。ビデオ レンダラに実装される CRendererPosPassThru クラスは、個々のサンプルの開始および終了基準タイムを設定する。したがって、この情報に関していつでもサンプルに対するクエリを行うことができる。これは IMediaSeeking を使ってシークを扱うときに役に立つ、それはメディア タイム をシークし、サンプルの基準タイムを追跡しないからだ。
グラフ内のすべてのフィルタに新しい位置を連続して通知する理由は、メディアの配置に関係のあるフィルタが新しい位置に対して準備できるようにするためである。たとえば特定のストリーム スプリッタは、メイン メディア ストリームを基準としたメディア位置を使用してストリームを分割しているかもしれない。これが、フィルタ グラフ マネージャが単純にソース フィルタの IMediaPosition または IMediaSeeking インターフェイスを直接呼び出さないことの理由である。
CSourcePosition は、ソース フィルタがその IMediaPosition インターフェイスを実装するのを支援するクラスである。
CSourceSeeking クラスは、ソース フィルタがその IMediaSeeking インターフェイスを実装するのを支援する。このクラスにより、メディア ストリーム内の開始位置や停止位置、再生レートを変更する呼び出しをソース フィルタが処理することが可能になる。
CBaseStreamControl クラスは、ソース フィルタがその IAMStreamControl インターフェイスを実装するのを支援する。このクラスは、主にキャプチャ フィルタによって使用される。次の図は、CBaseStreamControl とそれを継承したインターフェイスとの関係を示している。
DirectShow では、フィルタ グラフでクロックを実装するための 2 つのクラスとして CBaseReferenceClock および CSystemClock が提供される。次の図は、これらのクラスとそれが実装するインターフェイスの関係を示している。
CBaseReferenceClock は IReferenceClock を実装する。これにより、要求されたときに正確な基準タイムを返したり、登録されたオブジェクトに特定のタイムや時間間隔をイベント通知およびセマフォを介してアドバイズする能力が提供される。
CSystemClock は、タイム情報とタイミング信号をアプリケーションに提供するシステム クロックを実装する。このクラスは、CBaseReferenceClock 基底クラスを使用して、実際のタイム呼び出しをオーバーライドしながらその機能のほとんどを提供する。
Microsoft® DirectX® SDK には、必須の Win32 関数、マルチメディア データ構造体、およびオブジェクト リストおよびキュー操作の多くを C++ クラスにカプセル化したものを提供するユーティリティ クラスがいくつか含まれている。ここでは、これらのクラスについて簡単に説明する。
DirectShow は、Win32 のスレッド、イベント、およびクリティカル セクションを扱うためのいくつかのクラスを実装している。このようなクラスには、以下のクラスがある。
次の図は、これらのクラスを示している。
CAMEvent は、Win32 イベントを C++ オブジェクトとして扱う。このクラスのメソッドを使用すると、イベントを通知済状態にしたり、未通知状態にリセットできるほか、イベントが通知済になるまで呼び出し元をブロック状態にすることができる。また、イベントをハンドルにキャストして Win32 WaitForMultipleObjects 関数に渡すこともできる。
CCritSec は、Win32 クリティカル セクションを C++ オブジェクトとして扱って、プロセス内同期化を提供する。このクラスのメソッドを使用すると、クリティカル セクションの作成、ロック、およびロック解除を行うことができる。
CAutoLock は、クリティカル セクション (CCritSec オブジェクト) をブロックまたは関数の範囲で保持する。クリティカル セクションは、コンストラクタでロックされ、デストラクタでロック解除される。
CAMThread は、抽象ワーカー スレッド クラスを提供し、作成、同期化、ほかのワーカー スレッドとの通信を可能にする。
CMsgThread は、要求を直接ではなく非同期に送ることが可能なワーカー スレッドのサポートを提供する。CMsg オブジェクトのフォーマットを持つメッセージは、CMsgThread オブジェクトに送ることができる。
CMsg は、CMsgThread オブジェクトに渡されるメッセージを含んだオブジェクトを作成する。
次の図に示すように、DirectShow は、リストおよびキューを扱うための CBaseList、CGenericList、および COutputQueue クラスを実装している。
CBaseList は、CBaseObject から派生したオブジェクトへの型なしポインタのリンク リスト データ構造体を表す。
CGenericList は、CBaseList メンバ関数を呼び出す CBaseList から派生したテンプレート クラスを実装し、テンプレートで指定されたタイプのタイプ チェックを追加する。
COutputQueue は、フィルタの出力ピンからのメディア サンプルをキューに入れる処理をサポートする。出力ピンは、接続されている入力ピンのメソッドを呼び出す代わりに、このクラスのメンバ関数を呼び出してメディア サンプルを受け取る。COutputQueue クラスがメディア サンプルをダウンストリームに渡す処理を受け持つ一方で、出力ピンはブロッキングなしで処理を続行できる 。
次の図に示すように、DirectShow は、CMediaType、CRefTime、および FOURCCMap マルチメディア データ型クラスを実装している。
CMediaType は、メディア タイプ データ構造体および構造体の各メンバへのアクセスを提供するメソッドを含んだ C++ クラス オブジェクトを提供する。
CRefTime は、基準タイムにアクセスするためのメソッドを含む C++ クラス オブジェクト、および 2 つの CRefTime オブジェクトに対してブール テストまたは演算を行うための演算子を提供する。
FOURCCMap は、メディア タイプの識別と登録を行うために使用される古いフォーマットの FOURCC メディア タグと、DirectShow で使用される GUID メディア サブタイプとの間の変換を行う。
DirectShow の COM インターフェイス クラスは、オブジェクト作成とインターフェイス実装の 2 つに分類される。クラス ファクトリ クラスは、オブジェクトの作成用に提供され、それ以外のクラスは、既存の COM インターフェイスを実装するために提供される。
COM ユーティリティ クラスには、以下のクラスがある。
次の図は、COM クラスとそれが実装するインターフェイスの関係を示している。
CClassFactory および CFactoryTemplate は、フィルタ、ピン、およびその他の DirectShow COM オブジェクトの自動インスタンス化を扱うために基底クラスによって実装される。 これらのクラスは、オブジェクトを作成するのに必要な実際の COM 要素をラッピングして、オブジェクトを作成するうえでの基礎部分を提供する。 CPersistStream および CBasePropertyPage は、COM 持続ストレージおよびプロパティ ページ インターフェイスの実装に役に立つ。
Dllentry.cpp にある CClassFactory は CBaseObject を継承したクラスで、COM IClassFactory インターフェイスを実装する。このインターフェイスは、IClassFactory::CreateInstance を呼び出すことによって COM オブジェクトをインスタンス化する CoCreateInstance によって使用される (IClassFactory::CreateInstance は、派生クラスの静的 CreateInstance メンバ関数を呼び出す)。
基底クラスは CFactoryTemplate を使用して、オブジェクトの CLSID を含むテンプレートと、オブジェクト クラスの静的 CreateInstance 関数へのポインタを CClassFactory に提供する。
CPersistStream は COM IPersistStream を実装して、保存されているフィルタ グラフのフィルタ プロパティの格納と取得を行う。これにより、格納されているフィルタ グラフは、定義済みのプロパティ値に設定されたフィルタを持つことができる。このクラスはまた、ストリーム内のデータのバージョン化を扱う特殊なメンバ関数を提供する。
CBasePropertyPage は、フィルタに関連するプロパティ ページのフレームワークを提供する COM IPropertyPage インターフェイスを実装する。
DirectShow は、「デバッギング」リファレンス セクションに説明するように、多くのデバッギング関数およびマクロを提供する。DirectShow には、デバッギング フィルタの開発に便利な 3 つのクラスが用意されている。
次の図は、この 3 つのクラスを示している。
CDispBasic は、m_PString データ メンバを適切な文字列サイズに変換する。
CDisp は、CDispBasic クラスの m_PString データ メンバを、コンストラクタのパラメータとして使用されるオブジェクトに関する適切なデバッギング情報を記述する文字列に設定する、コンストラクタを提供する。たとえば、IPin ポインタを使用して作成された場合、m_PString はピンの名前を返し、CLSID を使用して作成された場合、m_PString はそれを示す文字列を返す。また、このクラスは m_PString の値を返す LPCTSTR キャスト演算子を提供するので、LPCTSTR 値として単にクラスをキャストして、作成時に文字列を返すことができる。
CGuidNameList は、Uuids.h インクルード ファイル内の GUID (グローバル ユニーク識別子) 名の配列を実装する。これにより、たとえばメディア タイプの GUID 名を取得することができる。