IDvdGraphBuilder
COM公式ドキュメント
IDvdGraphBuilder インターフェースは、DVD-Video 再生用のフィルターグラフを構築します。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetFiltergraph メソッドは、DVD-Video グラフビルダーオブジェクトが使用するフィルターグラフの IGraphBuilder インターフェースを取得します。
| ppGB | IGraphBuilder** | out | DVD-Video グラフビルダーオブジェクトが使用している IGraphBuilder インターフェースへのポインターのアドレスです。 |
戻り値
インターフェースの実装に依存する HRESULT 値を返します。現在の DirectShow の実装では、ppGB が無効な場合に E_INVALIDARG を返します。
解説(Remarks)
返される IGraphBuilder インターフェースポインターには、未解放の参照カウントがあります。呼び出し側でインターフェースを解放する必要があります。
GetDvdInterface メソッドは、DVD-Video 再生グラフからインターフェースを取得し、DVD-Video 再生の開発を容易にします。
| riid | GUID* | in | 要求するインターフェースの IID です。 |
| ppvIF | void** | out | インターフェースへのポインターを受け取ります。アプリケーションはこのインターフェースを解放する必要があります。 |
戻り値
HRESULT 値を返します。取り得る値には次のものがあります。
| 戻り値コード | 説明 |
|---|---|
| ppvIF パラメーターが無効です。このパラメーターは NULL であってはなりません。 | |
| 要求されたインターフェースを返せませんでした。 | |
| グラフがまだ構築されていません。「解説」を参照してください。 |
解説(Remarks)
このメソッドを使用すると、DVD 再生用のフィルターグラフを構築する前に、ビデオレンダラーフィルターを選択して構成できます。次のインターフェースが利用可能です。
- Overlay Mixer Filter: IDDrawExclModeVideo。
- Video Mixing Renderer 7 (VMR-7): IVMRFilterConfig、IVMRMixerBitmap、IVMRWindowlessControl、IVMRMonitorConfig。
- Video Mixing Renderer 9 (VMR-9): IVMRFilterConfig9、IVMRMixerBitmap9、IVMRWindowlessControl9、IVMRMonitorConfig9。
- Enhanced Video Renderer (EVR): IEVRFilterConfig および IMFVideoRenderer。Windows Server 2003、Windows XP、Windows 2000: このインターフェースはサポートされていません。
DVD 再生グラフを構築する前に、上記のリストにないインターフェースを要求すると、このメソッドは VFW_E_DVD_GRAPHNOTREADY を返します。DVD グラフを構築するには、IDvdGraphBuilder::RenderDvdVideoVolume を呼び出します。グラフを構築した後は、GetDvdInterface を使用して、さらにいくつかのインターフェースを取得できます。
- DVD 再生を制御するための IDvdControl (非推奨)、IDvdControl2、IDvdInfo (非推奨)、IDvdInfo2。
- ウィンドウモードでのみビデオ設定を制御するための IVideoWindow、IBasicVideo、IBasicVideo2。
- オーディオ設定を制御するための IBasicAudio。
- クローズドキャプション表示を制御するための IAMLine21Decoder。
- プライマリビデオストリームを配信する Overlay Mixer フィルターの最初の入力ピンを構成するための IMixerPinConfig および IMixerPinConfig2。(Overlay Mixer の他のピンに対してこのインターフェースを取得するには、フィルターのピンを列挙して直接クエリしてください。) 新しいアプリケーションでは Overlay Mixer フィルターの使用を避けるべきです。
RenderDvdVideoVolume メソッドは、DVD-Video ボリュームを再生するためのユーザー指定に従って、フィルターグラフの構築を完了します。
| lpcwszPathName | LPWSTR | in | 再生する DVD-Video ボリュームのパスへのポインターです。NULL にすることもできます。 |
| dwFlags | DWORD | in | AM_DVD_GRAPH_FLAGS 列挙体のフラグをビット単位の OR で結合したもので、DVD 再生グラフの構築方法を指定します。 |
| pStatus | AM_DVD_RENDERSTATUS* | out | AM_DVD_RENDERSTATUS 構造体へのポインターです。メソッドが戻ると、この構造体はレンダリングの失敗を示します。 |
戻り値
インターフェースの実装に依存する HRESULT 値を返します。DirectShow の実装の戻り値には次のものがあります。
| 戻り値コード | 説明 |
|---|---|
| dwFlags パラメーターが競合するオプションを指定しています。 | |
| メソッドは部分的に成功しました。どのエラーが発生したかを調べるには、pStatus パラメーターを確認してください。 | |
| メソッドは成功し、すべてのストリームがレンダリングされました。 | |
|
1 つ以上のストリームをレンダリングできませんでした。
dwFlags パラメーターに AM_DVD_HWDEC_ONLY または AM_DVD_SWDEC_ONLY フラグを指定した場合は、AM_DVD_HWDEC_PREFER または AM_DVD_SWDEC_PREFER フラグを指定してメソッドを再度呼び出してみてください。 |
|
| フィルターグラフには既にビデオレンダラーが含まれています。dwFlags パラメーターに AM_DVD_EVR_ONLY フラグを指定したにもかかわらず、グラフに Enhanced Video Renderer (VMR) フィルター以外のビデオレンダラーが既に含まれている場合、メソッドはこのエラーコードを返します。 | |
| グラフの構築中にエラーが発生しました。たとえば、DVD Graph Builder が必要なフィルターを作成できなかった、またはいずれのストリームもレンダリングできなかった場合です。 | |
| フィルターグラフに複数のビデオレンダラーが含まれています。 |
解説(Remarks)
AM_DVD_RENDERSTATUS 構造体は、このメソッドの失敗コードを反映します。このメソッドが S_FALSE を返す理由には次のものがあります。
- グラフは完全に構築されたが、次のいずれかに該当する場合。
- オーバーレイミキシングが機能しない。アプリケーションが AM_DVD_NOVPE フラグを設定しておらず、ビデオストリームを Overlay Mixer に通せなかった場合です。この場合、ビデオがソフトウェアでデコードされていれば、アプリケーションはビデオが表示されないことをユーザーに通知するのに十分な情報を得られます。ハードウェアデコードされたビデオは、ハードウェアビデオデコーダーの NTSC 出力ポートに接続されたテレビでのみ表示されます。
- ビデオデコーダーが line 21 データを生成しない。アプリケーションは、デコーダーの理由によりクローズドキャプションが利用できない旨の警告または通知メッセージを表示できます。
- ボリュームパスが指定されておらず、DVD Navigator が再生する DVD-Video ボリュームを見つけられなかった。再生開始時にドライブに DVD-Video ディスクがない場合、アプリケーションはユーザーにディスクの挿入を求めることができます。
- 一部のストリームがレンダリングされなかった。アプリケーションは、一部のストリームを再生できないことをユーザーに通知できます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDvdGraphBuilder "{FCC152B6-F372-11D0-8E00-00C04FD7C08B}" #usecom global IDvdGraphBuilder IID_IDvdGraphBuilder "{}" #comfunc global IDvdGraphBuilder_GetFiltergraph 3 sptr #comfunc global IDvdGraphBuilder_GetDvdInterface 4 var,sptr #comfunc global IDvdGraphBuilder_RenderDvdVideoVolume 5 wstr,int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDvdGraphBuilder "{FCC152B6-F372-11D0-8E00-00C04FD7C08B}" #usecom global IDvdGraphBuilder IID_IDvdGraphBuilder "{}" #comfunc global IDvdGraphBuilder_GetFiltergraph 3 sptr #comfunc global IDvdGraphBuilder_GetDvdInterface 4 sptr,sptr #comfunc global IDvdGraphBuilder_RenderDvdVideoVolume 5 wstr,int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。