IMFContentProtectionManager
COM公式ドキュメント
コンテンツイネーブラーオブジェクトへのポインターをアプリケーションに提供することで、保護されたコンテンツの再生を可能にします。
解説(Remarks)
コンテンツイネーブラーは、保護されたコンテンツを再生するために必要な何らかのアクションを実行するオブジェクトです。たとえば、そのアクションとは DRM ライセンスの取得などです。コンテンツイネーブラーは IMFContentEnabler インターフェイスを公開します。このインターフェイスは、コンテンツイネーブラーのための汎用的なメカニズムを定義します。コンテンツイネーブラーは、保護されたメディアパス (PMP) プロセス内で作成されます。ただし、これらはアプリケーションプロセスから呼び出す必要があります。そのため、IMFContentProtectionManager インターフェイスは、PMP Media Session がアプリケーションに通知するための手段を提供します。
このインターフェイスを使用するには、次の手順を実行します。
- アプリケーションでこのインターフェイスを実装します。
- MFCreateAttributes を呼び出して、属性ストアを作成します。
- 属性ストアに MF_SESSION_CONTENT_PROTECTION_MANAGER 属性を設定します。属性値は、実装した IMFContentProtectionManager へのポインターです。
- MFCreatePMPMediaSession を呼び出し、pConfiguration パラメーターに属性ストアを渡します。
多くのコンテンツイネーブラーは、マシン固有のデータをネットワークに送信します。これはプライバシー上の影響を及ぼす可能性があります。IMFContentProtectionManager インターフェイスの目的の 1 つは、アプリケーションがユーザーに情報を表示し、ユーザーがその処理を許可するか拒否するかを選択できる機会を提供することです。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
コンテンツ有効化アクションを実行する非同期要求を開始します。
| pEnablerActivate | IMFActivate* | in | コンテンツイネーブラーオブジェクトの IMFActivate インターフェイスへのポインター。コンテンツイネーブラーを作成するには、IMFActivate::ActivateObject を呼び出し、IMFContentEnabler インターフェイスを要求します。アプリケーションは、IMFContentEnabler のメソッドを使用してコンテンツ有効化アクションを完了する必要があります。 |
| pTopo | IMFTopology* | in | 保留中のトポロジーの IMFTopology インターフェイスへのポインター。 |
| pCallback | IMFAsyncCallback* | in | コールバックオブジェクトの IMFAsyncCallback インターフェイスへのポインター。操作が完了したら、アプリケーションはコールバックに対して IMFAsyncCallback::Invoke を呼び出す必要があります。 |
| punkState | IUnknown* | in | 予約されています。現在、このパラメーターは常に NULL です。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 |
解説(Remarks)
このコールバックメソッド内でブロックしないでください。代わりに、コンテンツ有効化アクションを別のスレッドで非同期に実行してください。操作が完了したら、pCallback パラメーターを通じて保護されたメディアパス (PMP) に通知します。
このメソッドから成功コードを返した場合は、コールバックに対して Invoke を呼び出す必要があります。逆に、このメソッドからエラーコードを返した場合は、Invoke を呼び出してはなりません。メソッドが成功コードを返した後で操作が失敗した場合は、IMFAsyncResult オブジェクトのステータスコードを使用してエラーを報告します。
コールバックが呼び出された後、PMP はアプリケーションの IMFContentProtectionManager::EndEnableContent メソッドを呼び出して非同期呼び出しを完了します。
このメソッドは、アプリケーションが保護されたコンテンツを再生するたびに必ず呼び出されるわけではありません。一般に、ユーザーがそのコンテンツに対する有効で最新のライセンスを持っている場合、このメソッドは呼び出されません。内部的には、入力信頼機関 (ITA) が、コンテンツプロバイダーの DRM ポリシーに基づいて BeginEnableContent を呼び出すかどうかを決定します。詳細については、「Protected Media Path」を参照してください。
コンテンツ有効化アクションを実行する非同期要求を終了します。このメソッドは、IMFContentProtectionManager::BeginEnableContent への非同期呼び出しを完了するために、保護されたメディアパス (PMP) によって呼び出されます。
| pResult | IMFAsyncResult* | in | IMFAsyncResult インターフェイスへのポインター。このポインターは、アプリケーションが呼び出し元の IMFAsyncCallback::Invoke メソッドに渡したものと同じ値です。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 |
解説(Remarks)
BeginEnableContent メソッドが非同期に完了すると、アプリケーションは非同期コールバックを呼び出して PMP に通知します。PMP はアプリケーションに対して EndEnableContent を呼び出し、結果コードを取得します。このメソッドは、コールバックメソッド内からアプリケーションのスレッド上で呼び出されます。そのため、コールバックを呼び出したスレッドをブロックしてはなりません。
アプリケーションは、BeginEnableContent の呼び出しに続いて行われた非同期処理の成功または失敗コードを返す必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFContentProtectionManager "{ACF92459-6A61-42BD-B57C-B43E51203CB0}"
#usecom global IMFContentProtectionManager IID_IMFContentProtectionManager "{}"
#comfunc global IMFContentProtectionManager_BeginEnableContent 3 sptr,sptr,sptr,sptr
#comfunc global IMFContentProtectionManager_EndEnableContent 4 sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。