IDMOVideoOutputOptimizations
COM公式ドキュメント
IDMOVideoOutputOptimizations インターフェイスは、Microsoft DirectX Media Object (DMO) 上でのビデオ最適化をサポートします。
解説(Remarks)
このインターフェイスにより、アプリケーションは DMO とビデオ出力の最適化についてネゴシエートできます。DMO は、アプリケーション側の対応が必要な最適化を実行できる場合に、このインターフェイスを公開します。アプリケーションは DMO に対して優先される機能を照会し、それを提供することに同意する (または同意しない) ことができます。アプリケーションが最適化を拒否した場合でも、DMO は出力を処理しなければなりません。
たとえば、ビデオデコーダーは、直前の出力フレームに差分を適用して出力フレームを生成することがあります。この場合、照会されると、直前のフレームを出力バッファーに与えるようアプリケーションに要求します。アプリケーションはこの要求に同意することも、しないこともできます。
ビデオ最適化は、出力ストリームごとに個別にネゴシエートされます。
次の擬似コードは、アプリケーションが DMO とネゴシエートする方法を示しています。
IDMOVideoOutputOptimizations *pVidOpt;
// Query the DMO for IDMOVideoOutputOptimizations (not shown).
BOOL bWantsPreviousBuffer = FALSE;
DWORD wFlags;
pVidOpt->QueryOperationModePreferences(0,&dwFlags);
if (dwFlags & DMO_VOSF_NEEDS_PREVIOUS_SAMPLE)
{
// Agree to the request.
pVidOpt->SetOperationMode(0, DMO_VOSF_NEEDS_PREVIOUS_SAMPLE);
bWantsPreviousBuffer = TRUE;
}
// Processing loop
while (there is input).
{
ProcessInput(0, ...);
if (bWantsPreviousBuffer)
pDMO->ProcessOutput(0, ...) // Use the same buffer as last time.
else
pDMO->ProcessOutput(0, ...) // OK to use a new buffer.
}
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
QueryOperationModePreferences メソッドは、DMO が優先する最適化機能を取得します。
| ulOutputStreamIndex | DWORD | in | DMO の出力ストリームの 0 から始まるインデックス。 |
| pdwRequestedCapabilities | DWORD* | out | DMO が要求する機能を受け取る変数へのポインター。返される値は、DMO_VIDEO_OUTPUT_STREAM_FLAGS 列挙型の 0 個以上のフラグのビット単位の組み合わせです。 |
戻り値
HRESULT 値を返します。取り得る値には次の表のものが含まれます。
| 戻り値 | 説明 |
|---|---|
| ストリームインデックスが無効です | |
| NULL ポインター引数です | |
| 成功しました |
SetOperationMode メソッドは、有効になっている最適化機能を DMO に通知します。
| ulOutputStreamIndex | DWORD | in | DMO の出力ストリームの 0 から始まるインデックス。 |
| dwEnabledFeatures | DWORD | in | DMO_VIDEO_OUTPUT_STREAM_FLAGS 列挙型の 0 個以上のフラグのビット単位の組み合わせ。 |
戻り値
HRESULT 値を返します。取り得る値には次の表のものが含まれます。
| 戻り値 | 説明 |
|---|---|
| ストリームインデックスが無効です | |
| 引数が無効です | |
| 成功しました |
解説(Remarks)
このメソッドを呼び出す前に、IDMOVideoOutputOptimizations::QueryOperationModePreferences メソッドを呼び出して、DMO がどの機能を要求しているかを判断してください。その後、このメソッドを呼び出して、それらの機能のうちどれを提供するかを DMO に通知します。いずれの機能も提供しない場合は、このメソッドを呼び出す必要はありません。DMO は、それらの機能が提供されることを前提としません。
アプリケーションは、提供に同意したすべての機能を提供しなければなりません。ただし、一部の機能については、DMO がすべてのサンプルでその機能を必要とするとは限りません。次のサンプルで DMO がいずれかの機能を省略できるかどうかを判断するには、IDMOVideoOutputOptimizations::GetCurrentSampleRequirements メソッドを呼び出します。これにより、DMO は合意済みの機能を 1 つのサンプルに限って免除できます。
ストリーミングが開始される前は、このメソッドを再度呼び出すと以前の呼び出しが上書きされます。複数の機能を設定するには、1 回のメソッド呼び出しで行う必要があります。ストリーミングが開始された後は、このメソッドはエラーを返します。ストリーミングは、アプリケーションが少なくとも 1 つの入力ストリームに対して IMediaObject::ProcessInput を呼び出した時点で開始されます。
ストリーミングが終了すると、アプリケーションは機能を再ネゴシエートできます。ストリーミングは、アプリケーションが IMediaObject::Flush メソッドを呼び出した場合、またはすべての入力ストリームに対して IMediaObject::Discontinuity を呼び出し、残りの出力をすべて処理した場合に終了します。
GetCurrentOperationMode メソッドは、現在有効になっている最適化機能を取得します。
| ulOutputStreamIndex | DWORD | in | DMO の出力ストリームの 0 から始まるインデックス。 |
| pdwEnabledFeatures | DWORD* | out | 現在の機能を受け取る変数へのポインター。返される値は、DMO_VIDEO_OUTPUT_STREAM_FLAGS 列挙型の 0 個以上のフラグのビット単位の組み合わせです。 |
戻り値
HRESULT 値を返します。取り得る値には次の表のものが含まれます。
| 戻り値 | 説明 |
|---|---|
| ストリームインデックスが無効です | |
| NULL ポインター引数です | |
| 成功しました |
GetCurrentSampleRequirements メソッドは、アプリケーションが既に同意した機能を踏まえて、次のサンプルの処理に必要な最適化機能を取得します。
| ulOutputStreamIndex | DWORD | in | DMO の出力ストリームの 0 から始まるインデックス。 |
| pdwRequestedFeatures | DWORD* | out | 必要な機能を受け取る変数へのポインター。返される値は、DMO_VIDEO_OUTPUT_STREAM_FLAGS 列挙型の 0 個以上のフラグのビット単位の組み合わせです。 |
戻り値
HRESULT 値を返します。取り得る値には次の表のものが含まれます。
| 戻り値 | 説明 |
|---|---|
| ストリームインデックスが無効です | |
| NULL ポインター引数です | |
| 成功しました |
解説(Remarks)
アプリケーションが IDMOVideoOutputOptimizations::SetOperationMode メソッドを呼び出した後は、同意したすべての機能を提供しなければなりません。ただし、DMO がすべてのサンプルであらゆる機能を必要とするとは限りません。このメソッドにより、DMO は合意済みの機能を 1 つのサンプルに限って免除できます。
アプリケーションは、サンプルを処理する前にこのメソッドを呼び出すことができます。DMO が次のサンプルを処理するうえで特定の機能を必要としない場合、DMO は pdwRequestedFeatures パラメーターから対応するフラグを除外します。アプリケーションは、次のサンプルに限りその機能を無視できます。このメソッドの結果は、次回の IMediaObject::ProcessOutput メソッドの呼び出しに対してのみ有効です。
DMO は、SetOperationMode メソッドで合意されたフラグのみを返します。言い換えると、このメソッドで新しい機能を動的に有効にすることはできません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDMOVideoOutputOptimizations "{BE8F4F4E-5B16-4D29-B350-7F6B5D9298AC}" #usecom global IDMOVideoOutputOptimizations IID_IDMOVideoOutputOptimizations "{}" #comfunc global IDMOVideoOutputOptimizations_QueryOperationModePreferences 3 int,var #comfunc global IDMOVideoOutputOptimizations_SetOperationMode 4 int,int #comfunc global IDMOVideoOutputOptimizations_GetCurrentOperationMode 5 int,var #comfunc global IDMOVideoOutputOptimizations_GetCurrentSampleRequirements 6 int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IDMOVideoOutputOptimizations "{BE8F4F4E-5B16-4D29-B350-7F6B5D9298AC}" #usecom global IDMOVideoOutputOptimizations IID_IDMOVideoOutputOptimizations "{}" #comfunc global IDMOVideoOutputOptimizations_QueryOperationModePreferences 3 int,sptr #comfunc global IDMOVideoOutputOptimizations_SetOperationMode 4 int,int #comfunc global IDMOVideoOutputOptimizations_GetCurrentOperationMode 5 int,sptr #comfunc global IDMOVideoOutputOptimizations_GetCurrentSampleRequirements 6 int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。