IMFMediaEngineExtension
COM公式ドキュメント
アプリケーションが Media Engine でメディアリソースを読み込めるようにします。
解説(Remarks)
このインターフェイスを使用するには、IMFMediaEngineClassFactory::CreateInstance メソッドを呼び出す際に MF_MEDIA_ENGINE_EXTENSION 属性を設定します。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
指定した種類のメディアリソースをこのオブジェクトが読み込めるかどうかを照会します。
| AudioOnly | BOOL | in | TRUE の場合、Media Engine はオーディオのみのモードに設定されます。それ以外の場合、Media Engine はオーディオ/ビデオモードに設定されます。 |
| MimeType | LPWSTR | in | RFC 4281 で定義されている、オプションの codecs パラメーターを含む MIME タイプを表す文字列。 |
| pAnswer | MF_MEDIA_ENGINE_CANPLAY* | out | MF_MEDIA_ENGINE_CANPLAY 列挙型のメンバーを受け取ります。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
Media Engine 拡張機能が 1 つ以上の MIME タイプをサポートする場合は、このメソッドを実装してください。
バイトストリームまたはメディアソースを作成する非同期要求を開始します。
| bstrURL | LPWSTR | in | メディアリソースの URL。 | ||||||
| pByteStream | IMFByteStream* | inoptional | IMFByteStream インターフェイスへのポインター。 type パラメーターが MF_OBJECT_BYTESTREAM の場合、このパラメーターは NULL です。 type が MF_OBJECT_MEDIASOURCE の場合、このパラメーターはバイトストリームへのポインターを含むか、NULL のいずれかです。詳細については「解説」を参照してください。 | ||||||
| type | MF_OBJECT_TYPE | in | 作成するオブジェクトの種類を指定する MF_OBJECT_TYPE 列挙型のメンバー。
| ||||||
| ppIUnknownCancelCookie | IUnknown** | out | IUnknown インターフェイスへのポインターを受け取ります。このポインターを IMFMediaEngineExtension::CancelObjectCreation メソッドに渡すことで、非同期操作をキャンセルできます。 呼び出し元はこのインターフェイスを解放する必要があります。このパラメーターは NULL にできます。 | ||||||
| pCallback | IMFAsyncCallback* | in | IMFAsyncCallback インターフェイスへのポインター。このインターフェイスは非同期操作の完了を通知するために使用されます。 | ||||||
| punkState | IUnknown* | inoptional | 呼び出し元が実装したオブジェクトの IUnknown インターフェイスへのポインター。このオブジェクトを使用して、コールバック用の状態情報を保持できます。オブジェクトはコールバックが呼び出される際に呼び出し元へ返されます。このパラメーターは NULL にできます。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは、type パラメーターの値に応じて、バイトストリームまたはメディアソースの作成をオブジェクトに要求します。
- type が MF_OBJECT_BYTESTREAM の場合、このメソッドは bstrURL で指定された URL のバイトストリームを作成します。この場合、pByteStream パラメーターは NULL です。
- type が MF_OBJECT_MEDIASOURCE の場合、このメソッドは pByteStream パラメーターで指定されたバイトストリームを使用してメディアソースを作成します。この場合、pByteStream は NULL になることもあります。
実装に関する注意
Media Engine 拡張機能は、カスタムのバイトストリームオブジェクト、カスタムのメディアソース、またはその両方をサポートするために使用できます。バイトストリームの場合は、type が MF_OBJECT_BYTESTREAM のときにバイトストリームオブジェクトを作成します。メディアソースの場合は、type が MF_OBJECT_MEDIASOURCE のときにソースを作成します。URL を読み込むために、Media Engine は次の手順を実行します。
- URL からバイトストリームの作成を試みます。
- バイトストリームが正常に作成された場合、そのバイトストリームからメディアソースの作成を試みます。
- バイトストリームを作成できない場合、URL から直接メディアソースの作成を試みます。
各手順で、Media Engine は拡張オブジェクトに対して IMFMediaEngineExtension::BeginCreateObject を呼び出します。BeginCreateObject メソッドが失敗すると、Media Engine は Source Resolver を試します。
BeginCreateObject メソッドでは、次のいずれのケースを処理するかを選択できます。
- type パラメーターが MF_OBJECT_BYTESTREAM の場合。URL からバイトストリームを作成します。
- type パラメーターが MF_OBJECT_MEDIASOURCE で、pByteStream がバイトストリームを指している場合。そのバイトストリームを使用してメディアソースを作成します。
- type パラメーターが MF_OBJECT_MEDIASOURCE で、pByteStream が NULL の場合。URL からメディアソースを作成します。
処理しないケースについては失敗コードを返してください。
例:
- カスタムのメディア形式をサポートするには、メディアソースを実装します。メディアソースが特別なバイトストリーム実装を必要としない場合は、type が MF_OBJECT_MEDIASOURCE で、pByteStream が非 NULL のときにメディアソースを作成します。この場合、標準の Microsoft Media Foundation バイトストリーム実装が使用されます。
- カスタムの URL スキームをサポートするには、type が MF_OBJECT_BYTESTREAM のケースを処理し、その URL を読み取れるバイトストリームオブジェクトを返します。
BeginCreateObject メソッドが成功した場合、操作は非同期に実行される必要があります。操作が完了したら、pCallback で指定されたコールバックインターフェイスの IMFAsyncCallback::Invoke メソッドを呼び出します。Media Engine は IMFMediaEngineExtension::EndCreateObject を呼び出して操作を完了します。
現在のオブジェクト作成要求をキャンセルします。
| pIUnknownCancelCookie | IUnknown* | in | IMFMediaEngineExtension::BeginCreateObject メソッドの ppIUnknownCancelCookie パラメーターで返されたポインター。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは、以前の BeginCreateObject の呼び出しをキャンセルしようとします。ただし、このメソッドは非同期であるため、操作をキャンセルする前に完了してしまう場合があります。
バイトストリームまたはメディアソースを作成する非同期要求を完了します。
| pResult | IMFAsyncResult* | in | IMFAsyncResult インターフェイスへのポインター。 |
| ppObject | IUnknown** | out | バイトストリームまたはメディアソースの IUnknown インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
Media Engine は、IMFMediaEngineExtension::BeginCreateObject メソッドを完了するためにこのメソッドを呼び出します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFMediaEngineExtension "{2F69D622-20B5-41E9-AFDF-89CED1DDA04E}" #usecom global IMFMediaEngineExtension IID_IMFMediaEngineExtension "{}" #comfunc global IMFMediaEngineExtension_CanPlayType 3 int,wstr,var #comfunc global IMFMediaEngineExtension_BeginCreateObject 4 wstr,sptr,int,sptr,sptr,sptr #comfunc global IMFMediaEngineExtension_CancelObjectCreation 5 sptr #comfunc global IMFMediaEngineExtension_EndCreateObject 6 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMFMediaEngineExtension "{2F69D622-20B5-41E9-AFDF-89CED1DDA04E}" #usecom global IMFMediaEngineExtension IID_IMFMediaEngineExtension "{}" #comfunc global IMFMediaEngineExtension_CanPlayType 3 int,wstr,sptr #comfunc global IMFMediaEngineExtension_BeginCreateObject 4 wstr,sptr,int,sptr,sptr,sptr #comfunc global IMFMediaEngineExtension_CancelObjectCreation 5 sptr #comfunc global IMFMediaEngineExtension_EndCreateObject 6 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。