ICodecAPI
COM公式ドキュメント
ICodecAPI インターフェイス (strmif.h) は、エンコーダーまたはデコーダーフィルターの設定を取得および設定します。
解説(Remarks)
このインターフェイスは、コーデック (エンコーダーまたはデコーダー) にプロパティを設定するための汎用的なメカニズムを定義します。コーデックプロパティはキー/値のペアであり、キーは GUID、値は VARIANT です。VARIANT データの解釈は、プロパティ GUID に依存します。コーデックプロパティ GUID の一覧については、Codec API Properties を参照してください。
コーデックプロファイル
コーデックは、プロファイルおよび機能情報をシステムレジストリに保存できます (省略可能)。この情報により、アプリケーションはデバイスの列挙時にデバイスを照会できます。既定のプロファイルは、次のレジストリキーに保存されます。HKEY_LOCAL_MACHINE
Software
Classes
CLSID
Category
Profiles各プロファイルはレジストリキーであり、その既定文字列はプロファイルのテキスト説明です。各値は GUID 名を持ち、その後に数値の GUID 値を含む文字列値が続きます。例:
| C++ |
|---|
HLKM\Software\Classes\CLSID\<category>\Profiles\DVD
default "HQ DVD"
REG_SZ {...} = "0"
REG_SZ {...} = "1234"
|
既定のコーデック機能は、HLKM\Software\Classes\CLSID<category>\Instance<Filter CLSID>\Capabilities に保存されます。各値は GUID 名を持ち、その後に数値の GUID 値を含む文字列値が続きます。例:
| C++ |
|---|
HLKM\Software\Classes\CLSID\<category>\Instance\<My DVD encoder>\Capabilities
default "My DVD encoder"
REG_SZ_MULTI {...}
|
メソッド 15
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
IsSupported メソッドは、コーデックが指定されたプロパティをサポートしているかどうかを照会します。(ICodecAPI.IsSupported)
| Api | GUID* | in | 照会するプロパティを指定する GUID へのポインター。標準コーデックプロパティの一覧については、Codec API Properties を参照してください。 |
戻り値
このメソッドは、次のいずれかの値を返すことができます。
| 戻り値コード | 説明 |
|---|---|
| コーデックはこのプロパティをサポートしていません。 | |
| コーデックはこのプロパティをサポートしています。 | |
| コーデックはこのプロパティをサポートしていません。 |
解説(Remarks)
上記の表に記載されているもの以外のエラーは、呼び出しを処理できないことを示します。
IsModifiable メソッドは、コーデックの現在の構成において、コーデックプロパティを変更できるかどうかを照会します。(ICodecAPI.IsModifiable)
| Api | GUID* | in | プロパティを指定する GUID へのポインター。標準コーデックプロパティの一覧については、Codec API Properties を参照してください。 |
戻り値
解説(Remarks)
上記の表に記載されているもの以外のエラーは、呼び出しを処理できないことを示します。
GetParameterRange メソッドは、コーデックプロパティの値の範囲を取得します。(ICodecAPI.GetParameterRange)
| Api | GUID* | in | 照会するプロパティを指定する GUID へのポインター。標準コーデックプロパティの一覧については、Codec API Properties を参照してください。 |
| ValueMin | VARIANT* | out | プロパティの最小値を受け取る VARIANT へのポインター。呼び出し元は VariantClear を呼び出して VARIANT を解放する必要があります。 |
| ValueMax | VARIANT* | out | プロパティの最大値を受け取る VARIANT へのポインター。呼び出し元は VariantClear を呼び出して VARIANT を解放する必要があります。 |
| SteppingDelta | VARIANT* | out | ステッピングデルタを受け取る VARIANT へのポインター。ステッピングデルタは、ValueMin から ValueMax までの有効な増分を定義します。呼び出し元は VariantClear を呼び出して VARIANT を解放する必要があります。 VARIANT の型が VT_EMPTY の場合、任意の増分が有効です。 |
戻り値
このメソッドは、次のいずれかの値を返すことができます。
| 戻り値コード | 説明 |
|---|---|
| 引数が無効です。 | |
| メソッドは成功しました。 | |
| このプロパティは、線形範囲ではなく、指定可能な値のリストをサポートしています。 |
解説(Remarks)
プロパティの有効な範囲は [ValueMin... ValueMax] であり、増分は SteppingDelta です。プロパティが値の線形範囲をサポートしている場合、そのプロパティは次のいずれかの variant 型を使用する必要があります。
プロパティが範囲ではなく値のリストをサポートしている場合、このメソッドは VFW_E_CODECAPI_ENUMERATED を返します。その場合は、ICodecAPI::GetParameterValues を呼び出して値のリストを取得してください。GetParameterValues メソッドは、コーデックプロパティに指定可能な値のリストを取得します。(ICodecAPI.GetParameterValues)
| Api | GUID* | in | 照会するプロパティを指定する GUID へのポインター。標準コーデックプロパティの一覧については、Codec API Properties を参照してください。 |
| Values | VARIANT** | out | VARIANT 型の配列へのポインターを受け取ります。この配列には、エンコーダーがこのプロパティに対してサポートする値のリストが含まれます。呼び出し元は VariantClear を呼び出して各 VARIANT を解放する必要があります。また、呼び出し元は CoTaskMemFree を呼び出して配列を解放する必要もあります。 |
| ValuesCount | DWORD* | out | Values 配列内の要素数を受け取ります。 |
戻り値
このメソッドは、次のいずれかの値を返すことができます。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 引数が無効です。 | |
| このプロパティは、リストではなく値の範囲をサポートしています。 |
解説(Remarks)
プロパティがリストではなく値の範囲をサポートしている場合、このメソッドは VFW_E_CODECAPI_LINEAR_RANGE を返します。その場合は、ICodecAPI::GetParameterRange を呼び出して値の範囲を取得してください。
GetDefaultValue メソッドは、コーデックプロパティの既定値を取得します。(ICodecAPI.GetDefaultValue)
| Api | GUID* | in | プロパティを指定する GUID へのポインター。標準コーデックプロパティの一覧については、Codec API Properties を参照してください。 |
| Value | VARIANT* | out | 既定値を受け取る VARIANT へのポインター。呼び出し元は VariantClear を呼び出して VARIANT を解放する必要があります。 |
戻り値
このメソッドは、次のいずれかの値を返すことができます。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 指定されたプロパティには既定値がありません。 |
GetValue メソッドは、コーデックプロパティの現在の値を取得します。
| Api | GUID* | in | プロパティを指定する GUID へのポインター。標準コーデックプロパティの一覧については、Codec API Properties を参照してください。 |
| Value | VARIANT* | out | プロパティの値を受け取る VARIANT へのポインター。呼び出し元は VariantClear を呼び出して VARIANT を解放する必要があります。 |
戻り値
このメソッドは、次のいずれかの値を返すことができます。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| このプロパティには現在値がありません。 |
SetValue メソッドは、コーデックプロパティの値を設定します。(ICodecAPI.SetValue)
| Api | GUID* | in | 設定するプロパティを指定する GUID へのポインター。 標準コーデックプロパティの一覧については、Codec API Properties を参照してください。 |
| Value | VARIANT* | in | プロパティの新しい値を含む VARIANT へのポインター。 |
戻り値
このメソッドは、次のいずれかの値を返すことができます。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| このプロパティは読み取り専用です。 | |
| プロパティ GUID または値が無効です。 |
RegisterForEvent メソッドは、コーデックからイベントを受信するようにアプリケーションを登録します。(ICodecAPI.RegisterForEvent)
| Api | GUID* | in | イベントを指定する GUID へのポインター。 イベントには 3 つのカテゴリがあります。
| ||||||||
| userData | INT_PTR | in | 呼び出し元が定義したデータへのポインター。アプリケーションは、このポインターを lParam1 イベントパラメーターで受け取ります。 |
戻り値
このメソッドは、次のいずれかの値を返すことができます。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 実装されていません。コーデックがイベント通知をサポートしていないか、Api パラメーターで指定されたイベント GUID をサポートしていません。 |
解説(Remarks)
エンコーダーコーデックがイベントを送信するたびに、アプリケーションは EC_CODECAPI_EVENT イベント通知を受け取ります。イベントを取得するには、IMediaEventEx インターフェイスを使用します。
イベントの lParam2 パラメーターは、CodecAPIEventData 構造体へのポインターです。この構造体の後には、イベント GUID に応じて追加データが続く場合があります。このデータのサイズは、dataLength メンバーによって示されます。
| GUID | イベントデータ |
|---|---|
| CODECAPI_CHANGELISTS | GUID の配列。各 GUID は、現在値または有効範囲が変更されたコーデックプロパティを指定します。配列のサイズは dataLength / sizeof(GUID) です。 |
| codecapi.h で定義されているプロパティ GUID。 | なし。 |
| 独自のイベント GUID。 | 実装依存です。 |
コーデックが指定されたイベントをサポートしていない場合、このメソッドは E_NOTIMPL を返します。コーデックは他のイベントをサポートしている可能性があります。
イベントの通知を無効にするには、ICodecAPI::UnregisterForEvent を呼び出してください。
UnregisterForEvent メソッドは、指定されたエンコーダーイベントに対するアプリケーションの登録を解除します。(ICodecAPI.UnregisterForEvent)
| Api | GUID* | in | イベントを指定する GUID へのポインター。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
SetAllDefaults メソッドは、すべてのコーデックプロパティを既定値にリセットします。(ICodecAPI.SetAllDefaults)
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
SetValueWithNotify メソッドは、コーデックにプロパティを設定し、その結果として変更された他のプロパティのリストを返します。(ICodecAPI.SetValueWithNotify)
| Api | GUID* | in | 設定するプロパティを指定する GUID へのポインター。 標準コーデックプロパティの一覧については、Codec API Properties を参照してください。 |
| Value | VARIANT* | in | プロパティの新しい値を含む VARIANT へのポインター。 |
| ChangedParam | GUID** | out | GUID の配列へのポインターを受け取ります。この配列には、このメソッド呼び出しの結果として変更されたプロパティの GUID が含まれます。呼び出し元は CoTaskMemFree を呼び出して配列を解放する必要があります。 |
| ChangedParamCount | DWORD* | out | ChangedParam 配列内の要素数を受け取ります。 |
戻り値
解説(Remarks)
ICodecAPI を実装するコーデックは、このメソッドをサポートする必要はありません。
SetAllDefaultsWithNotify メソッドは、すべてのコーデックプロパティを既定値にリセットし、変更されたプロパティのリストを返します。(ICodecAPI.SetAllDefaultsWithNotify)
| ChangedParam | GUID** | out | GUID の配列へのポインターを受け取ります。この配列には、このメソッド呼び出しの結果として変更されたプロパティの GUID が含まれます。呼び出し元は CoTaskMemFree を呼び出して配列を解放する必要があります。 |
| ChangedParamCount | DWORD* | out | ChangedParam 配列内の要素数を受け取ります。 |
戻り値
解説(Remarks)
ICodecAPI を実装するコーデックは、このメソッドをサポートする必要はありません。
GetAllSettings メソッドは、コーデックの現在のプロパティを取得し、ストリームに書き込みます。(ICodecAPI.GetAllSettings)
| __MIDL__ICodecAPI0000 | IStream* | in | ストリームの IStream インターフェイスへのポインター。 |
戻り値
解説(Remarks)
ICodecAPI を実装するコーデックは、このメソッドをサポートする必要はありません。
ストリームからプロパティを読み込んでコーデックに戻すには、ICodecAPI::SetAllSettings または ICodecAPI::SetAllSettingsWithNotify を呼び出してください。
ストリームに書き込まれるデータの形式は、コーデックの実装に依存します。標準的なシリアル化形式はありません。アプリケーションは、あるコーデックからプロパティを保存し、それを別のコーデックに読み込もうとしてはなりません。
SetAllSettings メソッドは、ストリームからコーデックプロパティを読み取り、コーデックに設定します。(ICodecAPI.SetAllSettings)
| __MIDL__ICodecAPI0001 | IStream* | in | ストリームの IStream インターフェイスへのポインター。 |
戻り値
解説(Remarks)
ICodecAPI を実装するコーデックは、このメソッドをサポートする必要はありません。
SetAllSettingsWithNotify メソッドは、ストリームからコーデックプロパティを読み取ってコーデックに設定し、変更されたプロパティのリストを返します。(ICodecAPI.SetAllSettingsWithNotify)
| __MIDL__ICodecAPI0002 | IStream* | in | ストリームの IStream インターフェイスへのポインター。 |
| ChangedParam | GUID** | out | GUID の配列へのポインターを受け取ります。この配列には、このメソッド呼び出しの結果として変更されたプロパティの GUID が含まれます。呼び出し元は CoTaskMemFree を呼び出して配列を解放する必要があります。 |
| ChangedParamCount | DWORD* | out | ChangedParam 配列内の要素数を受け取ります。 |
戻り値
解説(Remarks)
ICodecAPI を実装するコーデックは、このメソッドをサポートする必要はありません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ICodecAPI "{901DB4C7-31CE-41A2-85DC-8FA0BF41B8DA}" #usecom global ICodecAPI IID_ICodecAPI "{}" #comfunc global ICodecAPI_IsSupported 3 var #comfunc global ICodecAPI_IsModifiable 4 var #comfunc global ICodecAPI_GetParameterRange 5 var,var,var,var #comfunc global ICodecAPI_GetParameterValues 6 var,var,var #comfunc global ICodecAPI_GetDefaultValue 7 var,var #comfunc global ICodecAPI_GetValue 8 var,var #comfunc global ICodecAPI_SetValue 9 var,var #comfunc global ICodecAPI_RegisterForEvent 10 var,sptr #comfunc global ICodecAPI_UnregisterForEvent 11 var #comfunc global ICodecAPI_SetAllDefaults 12 #comfunc global ICodecAPI_SetValueWithNotify 13 var,var,var,var #comfunc global ICodecAPI_SetAllDefaultsWithNotify 14 var,var #comfunc global ICodecAPI_GetAllSettings 15 sptr #comfunc global ICodecAPI_SetAllSettings 16 sptr #comfunc global ICodecAPI_SetAllSettingsWithNotify 17 sptr,var,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ICodecAPI "{901DB4C7-31CE-41A2-85DC-8FA0BF41B8DA}" #usecom global ICodecAPI IID_ICodecAPI "{}" #comfunc global ICodecAPI_IsSupported 3 sptr #comfunc global ICodecAPI_IsModifiable 4 sptr #comfunc global ICodecAPI_GetParameterRange 5 sptr,sptr,sptr,sptr #comfunc global ICodecAPI_GetParameterValues 6 sptr,sptr,sptr #comfunc global ICodecAPI_GetDefaultValue 7 sptr,sptr #comfunc global ICodecAPI_GetValue 8 sptr,sptr #comfunc global ICodecAPI_SetValue 9 sptr,sptr #comfunc global ICodecAPI_RegisterForEvent 10 sptr,sptr #comfunc global ICodecAPI_UnregisterForEvent 11 sptr #comfunc global ICodecAPI_SetAllDefaults 12 #comfunc global ICodecAPI_SetValueWithNotify 13 sptr,sptr,sptr,sptr #comfunc global ICodecAPI_SetAllDefaultsWithNotify 14 sptr,sptr #comfunc global ICodecAPI_GetAllSettings 15 sptr #comfunc global ICodecAPI_SetAllSettings 16 sptr #comfunc global ICodecAPI_SetAllSettingsWithNotify 17 sptr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。