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

IMediaParams

COM
IID6d6cbb61-a223-44aa-842f-a2f06750be6e継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IMediaParams インターフェイスは、オブジェクトのエンベロープ追従パラメーターを設定および取得します。

メソッド 5

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT GetParam(DWORD dwParamIndex, FLOAT* pValue)

GetParam メソッドは、指定したパラメーターの現在の値を取得します。パラメーターが現在エンベロープセグメント内にある場合、最後に処理されたサンプルにおける値が返されます。

dwParamIndexDWORDinパラメーターの 0 から始まるインデックス。
pValueFLOAT*outパラメーター値を受け取る MP_DATA 型の変数へのポインター。

戻り値

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

戻り値 説明
E_INVALIDARG
インデックスが範囲外です。
E_POINTER
NULL ポインター引数です。
S_OK
成功しました。

解説(Remarks)

このオブジェクトがサポートするパラメーターとそのインデックス値を列挙するには、IMediaParamInfo インターフェイスを使用します。

vtbl 4 HRESULT SetParam(DWORD dwParamIndex, FLOAT value)

SetParam メソッドは、パラメーターの値を設定します。

dwParamIndexDWORDinパラメーターの 0 から始まるインデックス。すべてのパラメーターに値を適用するには DWORD_ALLPARAMS を指定します。
valueFLOATinパラメーターの新しい値。

戻り値

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

戻り値 説明
E_INVALIDARG
インデックスが範囲外、またはパラメーター値が不正です。
S_OK
成功しました。

解説(Remarks)

パラメーターが現在エンベロープセグメント内にある場合、エンベロープセグメントによって新しい値は上書きされます。エンベロープセグメントを削除するには、FlushEnvelope メソッドを呼び出します。

このオブジェクトがサポートするパラメーターとそのインデックス値を列挙するには、IMediaParamInfo インターフェイスを使用します。

vtbl 5 HRESULT AddEnvelope(DWORD dwParamIndex, DWORD cSegments, MP_ENVELOPE_SEGMENT* pEnvelopeSegments)

AddEnvelope メソッドは、パラメーターにエンベロープを追加します。

dwParamIndexDWORDinパラメーターの 0 から始まるインデックス。すべてのパラメーターにエンベロープを追加するには DWORD_ALLPARAMS を指定します。
cSegmentsDWORDinエンベロープ内のセグメント数。
pEnvelopeSegmentsMP_ENVELOPE_SEGMENT*inエンベロープセグメントを定義する MP_ENVELOPE_SEGMENT 構造体の配列へのポインター。配列のサイズは cPoints パラメーターで指定します。

戻り値

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

戻り値 説明
E_INVALIDARG
インデックスが範囲外です。
E_OUTOFMEMEORY
メモリが不足しています。
E_POINTER
NULL ポインター引数です。
S_OK
成功しました。

解説(Remarks)

呼び出し側は、時間の昇順でエンベロープを追加する必要があります。そうしないと、再生時の結果は不定になります。あるエンベロープが別のエンベロープと重なる場合、後のエンベロープが優先されます。

このオブジェクトがサポートするパラメーターとそのインデックス値を列挙するには、IMediaParamInfo インターフェイスを使用します。

次のコードは、いずれも線形関数を使用する 2 つのエンベロープセグメントを設定します。


#define MSEC 10000  // One millisecond

// Define an array with two segments. Note the segments appear in 
// time-ascending order.
MP_ENVELOPE_SEGMENT Segments[] =
{
    {  
        0,                  // rtStart
        3 * MSEC,           // rtStop
        0,                  // valStart
        12,                 // valStop
        MP_CURVE_LINEAR,    // iCurve
        MPF_ENVLP_STANDARD  // flags
    },
    {  
        6 * MSEC,
        9 * MSEC,
        12,
        0,
        MP_CURVE_LINEAR,
        MPF_ENVLP_STANDARD
    }
};
// Define the number of segments in the array.
DWORD cSegments = sizeof(Segments) / sizeof(Segments[0]);
DWORD dwParam = 0;  // Which parameter to set.

hr = pMediaParams->AddEnvelope(dwParam, cSegments, Segments);

この例では、呼び出し側が事前に IMediaParamInfo インターフェイスを使用して、DMO が該当パラメーターに対して MP_CURVE_LINEAR カーブをサポートしているかどうかを照会済みであることを前提としています。

vtbl 6 HRESULT FlushEnvelope(DWORD dwParamIndex, LONGLONG refTimeStart, LONGLONG refTimeEnd)

FlushEnvelope メソッドは、指定した時間範囲にわたって、指定したパラメーターのエンベロープデータをフラッシュします。

dwParamIndexDWORDinパラメーターの 0 から始まるインデックス。すべてのパラメーターからエンベロープデータをフラッシュするには DWORD_ALLPARAMS を指定します。
refTimeStartLONGLONGinフラッシュするエンベロープデータの開始時刻。
refTimeEndLONGLONGinフラッシュするエンベロープデータの終了時刻。

戻り値

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

戻り値 説明
E_INVALIDARG
インデックスが範囲外です。
S_OK
成功しました。

解説(Remarks)

refTimeStartrefTimeEnd で指定される時間範囲がエンベロープセグメントと重なる場合、そのセグメント全体がフラッシュされます。一方、範囲がエンベロープセグメントの境界上にある場合は、そのセグメント全体が保持されます。したがって、次のようになります。

このオブジェクトがサポートするパラメーターとそのインデックス値を列挙するには、IMediaParamInfo インターフェイスを使用します。
vtbl 7 HRESULT SetTimeFormat(GUID guidTimeFormat, DWORD mpTimeData)

SetTimeFormat メソッドは、オブジェクトの時間形式を指定します。

guidTimeFormatGUIDin時間形式を指定する時間形式 GUID。
mpTimeDataDWORDin新しい形式の測定単位を指定する MP_TIMEDATA 型の値。

戻り値

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

戻り値 説明
E_INVALIDARG
オブジェクトがこの時間形式をサポートしていません。
S_OK
成功しました。

解説(Remarks)

オブジェクトは複数の時間形式をサポートできます。すべてのオブジェクトは、各時間単位が 100 ナノ秒 (ns) である参照時間をサポートする必要があります。その他の形式は任意です。アプリケーションは、入力バッファーのタイムスタンプが、このメソッドで設定した時間形式に一致するようにする必要があります。

mpTimeData パラメーターの意味は、guidTimeFormat パラメーターの値によって異なります。

時間形式 時間データの意味
GUID_TIME_MUSIC 4 分音符あたりのパート数。
GUID_TIME_REFERENCE 無視されます。
GUID_TIME_SAMPLES 1 秒あたりのサンプル数。

このメソッドを呼び出すときは、FlushEnvelope メソッドも呼び出して、以前の時間形式で設定されたエンベロープをすべてフラッシュしてください。

オブジェクトがサポートする時間形式を確認するには、IMediaParamInfo::GetSupportedTimeFormat メソッドを呼び出します。現在の形式を取得するには、IMediaParamInfo::GetCurrentTimeFormat メソッドを呼び出します。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IMediaParams "{6D6CBB61-A223-44AA-842F-A2F06750BE6E}"
#usecom global IMediaParams IID_IMediaParams "{}"
#comfunc global IMediaParams_GetParam       3 int,var
#comfunc global IMediaParams_SetParam       4 int,float
#comfunc global IMediaParams_AddEnvelope    5 int,int,var
#comfunc global IMediaParams_FlushEnvelope  6 int,int64,int64
#comfunc global IMediaParams_SetTimeFormat  7 int,int
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。