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

IMFExtendedDRMTypeSupport

COM
IID332ec562-3758-468d-a784-e38f23552128継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

指定したキーシステムに対して、指定したコンテンツタイプがサポートされているかどうかを照会するためのメソッドを提供します。

メソッド 1

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

vtbl 3 HRESULT IsTypeSupportedEx(LPWSTR type, LPWSTR keySystem, MF_MEDIA_ENGINE_CANPLAY* pAnswer)

指定したキーシステムに対して、指定したコンテンツタイプがサポートされているかどうかを照会します。

typeLPWSTRinoptional

サポートを照会する対象の機能を識別する BSTR です。このパラメーターは、メディアタイプおよびサブタイプの識別子を指定するための RFC 2045 Content-Type 文字列と、必要なコーデックを指定するための RFC 6381 Codecs 識別子を受け付けます。これらの基本文字列は、HTML5 HTMLMediaElement の canPlayType メソッドで使用されるものと一致しています。RFC 2045 では、";<parameter>=<name>[=<value>] [,<name>[=<value>]" の形式で、修飾子として追加のカスタムパラメーターを指定できます。RFC 2045 準拠のパーサーは、認識できないこれらのパラメーターを無視しなければなりません。機能照会では、<parameter> は feature という名前になります。

有効な照会結果を返すためには、実装上、RFC 2045 のメディアタイプおよびサブタイプ識別子(例: "video/mp4")と、RFC 6381 のコーデックパラメーター codec=”<video codec>[,<audio codec>]” が常に存在している必要があります。

なお、コンテンツタイプおよびタイプという用語は、歴史的に MIME タイプとしてよく知られています。

keySystemLPWSTRin照会対象を確認する PlayReady 名前空間を識別する BSTR で、ハードウェア保護またはソフトウェア保護を指定します。ハードウェア照会には "com.microsoft.playready.recommendation.3000"(PlayReady がハードウェアオフロードをサポートしている必要があります)、ソフトウェア保護のサポートを明示的に照会するには "com.microsoft.playready.recommendation.2000"、一般的な照会には "com.microsoft.playready.recommendation"(後方互換性を保証するため、ソフトウェア保護のサポートに対して回答しなければなりません)を使用します。
pAnswerMF_MEDIA_ENGINE_CANPLAY*outMF_MEDIA_ENGINE_CANPLAY 列挙体の値で、照会した機能がサポートされている可能性が高いか、サポートされている可能性があるか、またはサポートされていないかを示します。

戻り値

成功した場合は S_OK

解説(Remarks)

type 入力パラメーターには、RFC 6381 の Content-Type メディアタイプおよびサブタイプ識別子が存在している必要があります。また、RFC 2045 の Codecs パラメーター文字列も存在している必要があります。この API でサポートされるコンテナーは MPEG-4 のみです。サポートされる回答を返す動画コーデックは、H.264(avc1)と HEVC(hvc1、hev1)のみです。サポートされる回答を返す音声コーデックは、MPEG-4(mp4a)、MPEG-1 Layer 3(mp3)、Dolby Digital(ac-3)、Dolby Digital Plus(ec-3)のみです。サポートされる文字列は次のとおりです。

video/mp4;codecs=”avc1,<audio codec>”

video/mp4;codecs=”hvc1, <audio codec>”

video/mp4;codecs=”hev1, <audio codec>”

Windows 10 バージョン 1709 以降では、次のものもサポートされます。

Video/mp4;codecs=”vp9,<audio codec>”

Video/mp4;codecs=”vp09,<audio codec>”

照会文字列の features 部分は、セミコロン区切りで上記のいずれかの文字列に追加されます。基盤となるグラフィックスドライバーおよびハードウェアは、機能を照会する方法に制約を課します。動画サブシステムについては、次の要件が適用されます。

  1. 1 回の呼び出しでは、各サブシステムから機能名と値の組を 1 つのみ使用できます。
  2. Decode サブシステムの照会は、Display 1、Display 2、または Output Protection の照会なしで実行できます。
  3. Display 1 サブシステムの照会には、Decode サブシステムの照会が存在している必要があります。
  4. Display 2 サブシステムの照会には Decode サブシステムの照会が必要ですが、Display 1 サブシステムの照会は必要ありません。
  5. 出力保護サブシステム(HDCP)の照会は、制約 #3 および #4 に従うことを前提として、Decode、Display 1、または Display 2 サブシステムの照会の有無にかかわらず実行できます。

General: Efficiency の照会は、他の任意のサブシステム照会と組み合わせることができます。

返される結果は、すべての個別機能照会の論理積(AND)ですが、次の点に注意してください。Maybe の結果は出力保護サブシステムからのみ、かつ一時的にのみ許可されます。この Maybe は、他のすべての機能照会の AND による Probably の結果よりも優先され、時間の経過とともに MaybeProbably または Not Supported のいずれかに解決されるまで続きます。Maybe が解決するまでの現在の制限時間は 10 秒です。

次の表は、動画サブシステムごとに整理した、サポートされる個別機能照会の一覧です。

項目 動画サブシステム 機能名 機能値 説明 このサブシステムで必須か
1a Decode decode-res-x ピクセル単位の非負の数 動画デコーダーは X 軸方向のこの最大解像度をサポートしているか? Y
1b Decode decode-res-y ピクセル単位の非負の数 動画デコーダーは Y 軸方向のこの最大解像度をサポートしているか? Y
1c Decode decode-bitrate キロビット毎秒(Kbps)単位の正の数 動画デコーダーはこの最大ビットレートをサポートしているか? Y
1d Decode decode-fps 24、25、29.97、30、50、59.94、または 60 動画デコーダーはこの最大フレームレート(FPS)値をサポートしているか? Y
1e Decode decode-bpc(decode-bpp は非推奨) 0、8、10、または 12 動画デコーダーはこのピクセルあたりの色深度を扱えるか? Y
1f Decode decoder-hardware-acceleration** 1 または値なしで true OS デコーダーの有無にかかわらず、DXVA ハードウェアアクセラレーションが利用可能か? N
1g Decode decoder-software-acceleration ** 1 または値なしで true ストリームをデコードできる OS デコーダーが存在するか? N
1h Decode decoder-software-requires-hardware** 1 または値なしで true OS デコーダーの機能は DXVA ハードウェアアクセラレーションの存在を必要とするか? N
2a Display 1 display-res-x ピクセル単位の非負の数 少なくとも 1 つの交差する**ディスプレイが X 軸方向のこの解像度をサポートしているか? Y
2b Display 1 display-res-y ピクセル単位の非負の数 少なくとも 1 つの交差する***ディスプレイが Y 軸方向のこの解像度をサポートしているか? Y
2c Display 1 display-refreshrate 24、25、29.97、30、50、59.94、または 60 ディスプレイは(Windows が認識する範囲で)少なくとも要求されたリフレッシュレートに構成されているか? N
2d Display 1 display-bpc(display-bpp は非推奨) 8 または 10 必要な解像度以上を持つすべての交差ディスプレイが、少なくともこの色深度を実現しているか? N
3 Display 2* hdr 1(サポートあり) ターゲットは High Dynamic Range(HDR)レンダリングをサポートしているか? Y
4 Output Protection hdcp 0(オフ)、1(HDCP 2.2 Type 1 制限なしでオン)、2(HDCP 2.2 Type 1 制限ありでオン) 交差する有効なすべてのディスプレイが、少なくとも要求された保護レベルをサポートしているか? Y
5 General: Efficiency** efficiency-setting 0(オフ = 制限なし)、1(オン = バッテリー電源時に解像度を制限) ユーザーは最高解像度よりもバッテリー寿命、ストリーミングオーバーヘッド、およびダウンロード速度を優先するか?**** Y
6a Decryption encryption-type “cenc” または “cbcs”。オプションで "-clearlead" サフィックスを付加可能。 指定したコーデック/キーシステムでの復号において、この暗号化タイプはサポートされているか? 値が指定されていない場合は、既定値の "cenc" が使用されます。Windows 11 Build 22621 および Windows 10 Build 19045.5796 以降では、サフィックス "-clearlead" がサポートされます。暗号化タイプの値に "-clearlead" を付加すると、暗号化されたコンテンツの冒頭部分でクリアコンテンツを使用するサポートも要求されます。コンテンツ冒頭のクリアコンテンツにより、最初のフレームを表示するまでの時間が短縮されます。encryption-type に "-clearlead" を追加した場合、要求されたコーデックのバージョン番号がチェックされます。AV1 および VP9 コーデックはメジャーバージョン 2 がチェックされ、HEVC は v2.0.53421 以降がチェックされます。 N
6b Decryption encryption-iv-size 8 または 16 指定したコーデック/キーシステムでの復号において、この初期化ベクトル(IV)サイズ(バイト単位)はサポートされているか? 値が指定されていない場合は、既定値の 8 が使用されます。 N

* Windows 10 バージョン 1607 以降の OS バージョンでのみサポートされます

** Windows 10 バージョン 1709 以降の OS バージョンでのみサポートされます

*** 交差アルゴリズムは次のとおりです。

  1. アプリケーションのユーザーインターフェイスの動画クライアント領域にピクセルが存在するすべてのディスプレイを検出します。
  2. ステップ 1 のディスプレイを駆動しているすべてのグラフィックスアダプターを検出します。ハードウェア DRM 照会の場合、このアダプターの集合は、ハードウェア DRM をサポートするアダプターのみにフィルターされます。
  3. ステップ 2 のグラフィックスアダプターに接続されているすべてのディスプレイを検出します。

**** このポリシーがオンのときに使用する解像度の上限を選択するのは、コンテンツプロバイダーの責任です。1080p の上限が推奨されますが、720p を使用することもできます。なお、このポリシーの入力は、Windows 10 バージョン 1709 で追加された動画設定のユーザーインターフェイスページから得られます。

項目 1a と 1b、および 2a と 2b の各組は、それぞれ(要求 x >= 実際の交差集合の最大 x)AND(要求 y >= 実際の交差集合の最大 y)として計算されますが、縦向きディスプレイは必要に応じて x と y を入れ替えて横向きに正規化するという変更が加えられます。

hdcp 照会(項目 4)は、初回呼び出しのコストが計算上高くなります。要求されたレベルをアクティブなディスプレイトポロジで満たせるかどうかを調べるために、HDCP を要求されたレベルでオンにする必要があります。HDCP が非同期に評価され、HDCP 2.2 では最大数秒かかる一方で、照会自体は同期的で最小限のブロッキングであるため、Maybe の結果が返される場合、呼び出し側は結果が Probably または Not Supported として確定するまで照会を繰り返し実行する必要があります。Maybe 状態のまま照会内で要求する HDCP レベルを変更すると、無効な応答が返される可能性が高くなります。Maybe のタイムアウトはおよそ 10 秒です。

基盤となる計算コストのため、hdcp 照会は 250 ミリ秒に 1 回より頻繁に呼び出さないことを強く推奨します。500 ミリ秒が推奨される最小間隔です。このコストを最小限に抑えるためにキャッシュが行われますが、ポーリング中にディスプレイトポロジが変更されるとキャッシュは無効になります。

実装上の詳細として、グラフィックスアダプターは、すべてのノードが HDCP 2.2 をサポートしている場合、HDCP 2.2 Type 1 制限が設定されていなくても HDCP 2.2 を使用することを選択する場合があります。HDCP 2.2 は、HDCP 1.x よりも有効化に大幅に時間がかかることがあります。現行世代のテレビでの観測では、HDCP 1.x 機器(リピーターを含む)が約 1 秒であるのに対し、最大 8 秒かかることがあります。したがって、アプリケーション起動時または出力トポロジ変更後の最初の hdcp=1 照会では、この最悪ケースに備えて最大 8 秒に余裕を加えた待機が必要です。最大待機時間として 10 秒を用い、アプリケーション起動時の照会は、ユーザーがタイトルを選択する可能性が最も低いタイミング(例: 初期 UI 上)で実行することを推奨します。トポロジの変更が発生しない場合、それ以降のすべての hdcp 照会は 1 秒未満で完了します。コンテンツが照会と同じ HDCP 出力要件を持つ場合、キャッシュにより、再生開始時に再び数秒の待機が発生することを回避できます。

出力トポロジの変更時には、高解像度のテレビやモニターがデスクトップを安定させるのに数秒かかることがよくあります。出力保護レベルの変更、特に低下は、通常、設計上ハードウェア DRM を使用したアクティブな再生を失敗させます。この場合、MF_POLICY_UNSUPPORTED(0xC00D7159)エラーへの対応としては、そのエラーをユーザーから隠し、再照会を行い、変更された機能に適したコンテンツバージョンで再開することが望まれます。事実上、これは「ホットプラグ」の安定化時間の延長として機能します。

ソフトウェア DRM のデコード機能照会は、H.264 実装がソフトウェアデコードまたは DirectX Video Acceleration(DXVA)GPU オフロードのいずれかを許可するため、パフォーマンスの点で曖昧になる可能性があります。ただし、H.264 DXVA はすべての Windows エンドポイントで非常に一般的です。

ソフトウェア DRM デコード照会の機能上の制限として、decode-bpc は評価されません。Windows は H.264 の 10 ビットデコードをサポートしていませんが、decode-bpc=10 を含む照会は成功します。

機能照会の結果は、サブシステムの理論上の最大能力を反映します。GPU 内の他のアクティビティや電源状態の変動により、実際の能力が低下する場合があります。

ハードウェア DRM 照会の例

次の例は、ハードウェア DRM および HDCP 2.2 Type 1 制限を使用した 4K 10 ビット HEVC 標準ダイナミックレンジ(SDR)コンテンツで最も一般的な使い方を示しています。

IsTypeSupported(‘com.microsoft.playready.recommendation.3000’,’video/mp4;codecs=”hvc1,mp4a”;features=”decode-res-x=3840,decode-res-y=2160,decode-bitrate=20000,decode-fps=30,decode-bpc=10,display-res-x=3840,display-res-y=2160,display-bpc=8,hdcp=2”’);

ここで、mp4amp3ac-3、または ec-3 に置き換えることができます。decode-bitrate はコンテンツプロバイダーのエンコードに応じて調整できます。decode-fps は 30 ではなく 60 に設定できますが、ハードウェア DRM セキュリティプロセッサのスループット能力によって制限される場合があります。プロバイダーが 4K ストリームを 3200 x 1800、3000 x 2000、または 2560 x 1440 のディスプレイにプッシュしたい場合など、display-res-x および display-res-y の値をフル 4K より低く設定できます。

デコード照会の結果は動的に変化しないと想定されるため、Maybe 状態にある間の hdcp=2 に対する連続的なポーリングでは、ちょっとした最適化として短い形式を使用できます。

IsTypeSupported(‘com.microsoft.playready.recommendation.3000’,’video/mp4;codecs=”hvc1,mp4a”;features=”hdcp=2”’);

もちろん、この最適化では動的なモニター解像度の変更は捕捉できませんが、そのような変更は、いずれにしても進行中の HDCP 確立を妨げる可能性が高いでしょう。

次の例は、ハードウェア DRM および HDCP 2.2 Type 1 制限を使用した 4K 10 ビット HEVC ハイダイナミックレンジ(HDR)コンテンツで最も一般的な使い方を示しています。

IsTypeSupported(‘com.microsoft.playready.recommendation.3000’,’video/mp4;codecs=”hvc1,mp4a”;features=”decode-res-x=3840,decode-res-y=2160,decode-bitrate=20000,decode-fps=30,decode-bpc=10,display-res-x=3840,display-res-y=2160,display-bpc=8,hdr=1,hdcp=2”’);

注: Windows 10 バージョン 1607 では、hdr=1 は、DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709、または DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 による 10 ビット MPO サポートが存在すること、あるいは開発専用の HighColor レジストリキーが存在し設定されていること(HKLM\SOFTWARE\Microsoft\Windows\DWM キーの HighColor が DWORD 値 1)を示します。

次の例は、ハードウェア DRM および 2.2 Type 1 制限なしの HDCP を使用した 1080p 8 ビット H.264 SDR コンテンツで最も一般的な使い方を示しています。

IsTypeSupported(‘com.microsoft.playready.recommendation.3000’,’video/mp4;codecs=”avc1,mp4a”;features=”decode-res-x=1920,decode-res-y=1080,decode-bitrate=10000,decode-fps=30,decode-bpc=8,display-res-x=1920,display-res-y=1080,display-bpc=8,hdcp=1”’);

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IMFExtendedDRMTypeSupport "{332EC562-3758-468D-A784-E38F23552128}"
#usecom global IMFExtendedDRMTypeSupport IID_IMFExtendedDRMTypeSupport "{}"
#comfunc global IMFExtendedDRMTypeSupport_IsTypeSupportedEx  3 wstr,wstr,var
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。