Microsoft DirectX 8.0 |
Microsoft® DirectX® Media Object (DMO) のビデオ最適化をサポートする。
アプリケーションは、このインターフェイスを使って、DMO との間でビデオ出力最適化をネゴシエートできる。DMO は、アプリケーションからのサポートを必要とする最適化を実行できるときに、このインターフェイスを公開する。アプリケーションは、DMO の優先機能を DMO に照会し、その機能を提供することを承諾または拒否することができる。DMO は、アプリケーションが最適化を拒否した場合でも出力を処理する必要がある。
たとえば、ビデオ デコーダは、前の出力フレームにデルタを適用することによって出力フレームを生成することがある。照会を受けると、ビデオ デコーダは、出力バッファを使って前のフレームを供給するようにアプリケーションに要求する。アプリケーションはこの要求を承諾することも拒否することもできる。
ビデオ最適化は、出力ストリームごとに個別にネゴシエートされる。
以下の疑似コードはアプリケーションが DMO とネゴシエートする方法を示している。
IDMOVideoOutputOptimizations *pVidOpt; // DMO に対して IDMOVideoOutputOptimizations を照会する (表示されていない) 。 BOOL bWantsPreviousBuffer = FALSE; DWORD wFlags; pVidOpt->QueryOperationModePreferences(0,&dwFlags); if (dwFlags & DMO_VOSF_NEEDS_PREVIOUS_SAMPLE) { // 要求を承諾する。 pVidOpt->SetOperationMode(0, DMO_VOSF_NEEDS_PREVIOUS_SAMPLE); bWantsPreviousBuffer = TRUE; } // ループ処理 while (there is input) { ProcessInput(0, ...); if (bWantsPreviousBuffer) pDMO->ProcessOutput(0, ...) // 前回と同じバッファを使う。 else pDMO->ProcessOutput(0, ...) // 新しいバッファを使ってもよい。 }
IUnknown メソッド 説明 QueryInterface サポートされているインターフェイスを指すポインタを取得する。 AddRef 参照カウントをインクリメントする。 Release 参照カウントをデクリメントする。 IDMOVideoOutputOptimizations メソッド 説明 QueryOperationModePreferences DMO の優先最適化機能を取得する。 SetOperationMode 現在有効な最適化機能を DMO に通知する。 GetCurrentOperationMode 現在有効な最適化機能を取得する。 GetCurrentSampleRequirements アプリケーションが既に承諾した機能がある場合に、次のサンプルを処理するのに必要な最適化機能を取得する。
DMO の優先最適化機能を取得する。
構文
HRESULT QueryOperationModePreferences( ULONG ulOutputStreamIndex, DWORD *pdwRequestedCapabilities );
パラメータ
- ulOutputStreamIndex
- DMO の出力ストリームのゼロベースのインデックス。
- pdwRequestedCapabilities
- 要求されている DMO の機能を受け取る変数を指すポインタ。返される値は、DMO_VIDEO_OUTPUT_STREAM_FLAGS 列挙の 0 個以上のフラグのビット単位の論理和である。
戻り値
HRESULT 値を返す。以下の値をとる。
S_OK 成功 DMO_E_INVALIDSTREAMINDEX 無効なストリーム インデックス E_POINTER NULL ポインタ引数
現在有効な最適化機能を DMO に通知する。
構文
HRESULT SetOperationMode( ULONG ulOutputStreamIndex, DWORD dwEnabledFeatures );
パラメータ
- ulOutputStreamIndex
- DMO の出力ストリームのゼロベースのインデックス。
- dwEnabledFeatures
- DMO_VIDEO_OUTPUT_STREAM_FLAGS 列挙の 0 個以上のフラグのビット単位の論理和。
戻り値
HRESULT 値を返す。以下の値をとる。
S_OK 成功 DMO_E_INVALIDSTREAMINDEX 無効なストリーム インデックス E_INVALIDARG 無効な引数
注意
このメソッドを呼び出す前に、QueryOperationModePreferences メソッドを呼び出して、DMO が要求している機能を調べる。その後、このメソッドを呼び出して、どの機能を提供するかを DMO に通知する。いずれの機能も提供しない場合は、このメソッドを呼び出す必要はない。DMO は、いずれかの機能が提供されるものとは見なさない。
アプリケーションは、承諾した機能をすべて提供する必要がある。ただし、一部の機能については、DMO がすべてのサンプルについて機能を要求しないことがある。DMO が次のサンプルについて省略できる機能があるかどうかを調べるには、GetCurrentSampleRequirements メソッドを呼び出す。これにより、DMO は、1 つのサンプルに対して、承諾済みの機能を放棄することができる。
ストリーミングが始まる前に、さらにこのメソッドを呼び出すと、前の呼び出しはオーバーライドされる。複数の機能を設定するには、1 回のメソッド呼び出しで機能を設定する必要がある。ストリーミングが始まると、このメソッドはエラーを返す。ストリーミングは、アプリケーションが少なくとも 1 つの入力ストリームに対して IMediaObject::ProcessInput を呼び出したときに始まる。
ストリーミングが終了すれば、アプリケーションは機能をネゴシエートできる。ストリーミングは、アプリケーションが IMediaObject::Flush メソッドを呼び出したとき、または、すべての入力ストリームに対して IMediaObject::Discontinuity を呼び出した後、残っているすべての出力を処理したときに終了する。
現在有効な最適化機能を取得する。
構文
HRESULT GetCurrentOperationMode( ULONG ulOutputStreamIndex, DWORD *pdwEnabledFeatures );
パラメータ
- ulOutputStreamIndex
- DMO の出力ストリームのゼロベースのインデックス。
- pdwEnabledFeatures
- 現在の機能を受け取る変数を指すポインタ。返される値は、DMO_VIDEO_OUTPUT_STREAM_FLAGS 列挙の 0 個以上のフラグのビット単位の論理和である。
戻り値
HRESULT 値を返す。以下の値をとる。
S_OK 成功 DMO_E_INVALIDSTREAMINDEX 無効なストリーム インデックス E_POINTER NULL ポインタ引数
アプリケーションが既に承諾した機能がある場合に、次のサンプルを処理するのに必要な最適化機能を取得する。
構文
HRESULT GetCurrentSampleRequirements( ULONG ulOutputStreamIndex, DWORD *pdwRequestedFeatures );
パラメータ
- ulOutputStreamIndex
- DMO の出力ストリームのゼロベースのインデックス。
- pdwRequestedFeatures
- 必要な機能を受け取る変数を指すポインタ。返される値は、DMO_VIDEO_OUTPUT_STREAM_FLAGS 列挙の 0 個以上のフラグのビット単位の論理和である。
戻り値
HRESULT 値を返す。以下の値をとる。
S_OK 成功 DMO_E_INVALIDSTREAMINDEX 無効なストリーム インデックス E_POINTER NULL ポインタ引数
注意
アプリケーションは、SetOperationMode メソッドを呼び出した後、承諾したすべての機能を提供する必要がある。ただし、一部の機能については、DMO がすべてのサンプルに対して必要としないことがある。DMO は、このメソッドを利用して、1 つのサンプルに対して、承諾済みの機能を放棄することができる。
アプリケーションは、サンプルを処理する前にこのメソッドを呼び出す。DMO は、次のサンプルを処理するために特定の機能を必要としない場合、その機能に対応するフラグを pdwRequestedFeatures パラメータから削除する。次のサンプルに限って、アプリケーションは、その機能を無視できる。このメソッドの結果は、IMediaObject::ProcessOutput メソッドに対する次の呼び出しに対してのみ有効である。
DMO は、SetOperationMode メソッドで承諾されたフラグのみを返す。つまり、このメソッドを使って新しい機能を動的に有効にすることはできない。