Win32 API 日本語リファレンス
ホームMedia.DxMediaObjects › IDMOVideoOutputOptimizations

IDMOVideoOutputOptimizations

COM
IIDbe8f4f4e-5b16-4d29-b350-7f6b5d9298ac継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

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。

vtbl 3 HRESULT QueryOperationModePreferences(DWORD ulOutputStreamIndex, DWORD* pdwRequestedCapabilities)

QueryOperationModePreferences メソッドは、DMO が優先する最適化機能を取得します。

ulOutputStreamIndexDWORDinDMO の出力ストリームの 0 から始まるインデックス。
pdwRequestedCapabilitiesDWORD*outDMO が要求する機能を受け取る変数へのポインター。返される値は、DMO_VIDEO_OUTPUT_STREAM_FLAGS 列挙型の 0 個以上のフラグのビット単位の組み合わせです。

戻り値

HRESULT 値を返します。取り得る値には次の表のものが含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
ストリームインデックスが無効です
E_POINTER
NULL ポインター引数です
S_OK
成功しました
vtbl 4 HRESULT SetOperationMode(DWORD ulOutputStreamIndex, DWORD dwEnabledFeatures)

SetOperationMode メソッドは、有効になっている最適化機能を DMO に通知します。

ulOutputStreamIndexDWORDinDMO の出力ストリームの 0 から始まるインデックス。
dwEnabledFeaturesDWORDinDMO_VIDEO_OUTPUT_STREAM_FLAGS 列挙型の 0 個以上のフラグのビット単位の組み合わせ。

戻り値

HRESULT 値を返します。取り得る値には次の表のものが含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
ストリームインデックスが無効です
E_INVALIDARG
引数が無効です
S_OK
成功しました

解説(Remarks)

このメソッドを呼び出す前に、IDMOVideoOutputOptimizations::QueryOperationModePreferences メソッドを呼び出して、DMO がどの機能を要求しているかを判断してください。その後、このメソッドを呼び出して、それらの機能のうちどれを提供するかを DMO に通知します。いずれの機能も提供しない場合は、このメソッドを呼び出す必要はありません。DMO は、それらの機能が提供されることを前提としません。

アプリケーションは、提供に同意したすべての機能を提供しなければなりません。ただし、一部の機能については、DMO がすべてのサンプルでその機能を必要とするとは限りません。次のサンプルで DMO がいずれかの機能を省略できるかどうかを判断するには、IDMOVideoOutputOptimizations::GetCurrentSampleRequirements メソッドを呼び出します。これにより、DMO は合意済みの機能を 1 つのサンプルに限って免除できます。

ストリーミングが開始される前は、このメソッドを再度呼び出すと以前の呼び出しが上書きされます。複数の機能を設定するには、1 回のメソッド呼び出しで行う必要があります。ストリーミングが開始された後は、このメソッドはエラーを返します。ストリーミングは、アプリケーションが少なくとも 1 つの入力ストリームに対して IMediaObject::ProcessInput を呼び出した時点で開始されます。

ストリーミングが終了すると、アプリケーションは機能を再ネゴシエートできます。ストリーミングは、アプリケーションが IMediaObject::Flush メソッドを呼び出した場合、またはすべての入力ストリームに対して IMediaObject::Discontinuity を呼び出し、残りの出力をすべて処理した場合に終了します。

vtbl 5 HRESULT GetCurrentOperationMode(DWORD ulOutputStreamIndex, DWORD* pdwEnabledFeatures)

GetCurrentOperationMode メソッドは、現在有効になっている最適化機能を取得します。

ulOutputStreamIndexDWORDinDMO の出力ストリームの 0 から始まるインデックス。
pdwEnabledFeaturesDWORD*out現在の機能を受け取る変数へのポインター。返される値は、DMO_VIDEO_OUTPUT_STREAM_FLAGS 列挙型の 0 個以上のフラグのビット単位の組み合わせです。

戻り値

HRESULT 値を返します。取り得る値には次の表のものが含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
ストリームインデックスが無効です
E_POINTER
NULL ポインター引数です
S_OK
成功しました
vtbl 6 HRESULT GetCurrentSampleRequirements(DWORD ulOutputStreamIndex, DWORD* pdwRequestedFeatures)

GetCurrentSampleRequirements メソッドは、アプリケーションが既に同意した機能を踏まえて、次のサンプルの処理に必要な最適化機能を取得します。

ulOutputStreamIndexDWORDinDMO の出力ストリームの 0 から始まるインデックス。
pdwRequestedFeaturesDWORD*out必要な機能を受け取る変数へのポインター。返される値は、DMO_VIDEO_OUTPUT_STREAM_FLAGS 列挙型の 0 個以上のフラグのビット単位の組み合わせです。

戻り値

HRESULT 値を返します。取り得る値には次の表のものが含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
ストリームインデックスが無効です
E_POINTER
NULL ポインター引数です
S_OK
成功しました

解説(Remarks)

アプリケーションが IDMOVideoOutputOptimizations::SetOperationMode メソッドを呼び出した後は、同意したすべての機能を提供しなければなりません。ただし、DMO がすべてのサンプルであらゆる機能を必要とするとは限りません。このメソッドにより、DMO は合意済みの機能を 1 つのサンプルに限って免除できます。

アプリケーションは、サンプルを処理する前にこのメソッドを呼び出すことができます。DMO が次のサンプルを処理するうえで特定の機能を必要としない場合、DMO は pdwRequestedFeatures パラメーターから対応するフラグを除外します。アプリケーションは、次のサンプルに限りその機能を無視できます。このメソッドの結果は、次回の IMediaObject::ProcessOutput メソッドの呼び出しに対してのみ有効です。

DMO は、SetOperationMode メソッドで合意されたフラグのみを返します。言い換えると、このメソッドで新しい機能を動的に有効にすることはできません。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 方式にも切替可。