1. はじめに
このセクションは規範的ではありません本仕様は、ユーザーエージェントの音声および映像のデコード・エンコード機能について、 コーデック、プロファイル、解像度、ビットレートなどのメディア情報に基づき 問い合わせるAPIを定義します。このAPIは構成がサポートされているかどうか、 さらに再生が滑らかであるか/省電力であるかも示します。
本仕様は主にエンコード・デコード機能に焦点を当てています。 表示デバイスの色域やダイナミックレンジなどの情報を提供する他のWeb APIと 組み合わせて利用されることを想定しています。これによりWebアプリケーションは 適切な表示用コンテンツを選択でき、例えばSDRディスプレイにHDRコンテンツを 提供しないなどの制御が可能となります。
2. デコードおよびエンコード機能
2.1. メディア設定
2.1.1. MediaConfiguration
dictionary {
MediaConfiguration VideoConfiguration ;
video AudioConfiguration ; };
audio
dictionary :
MediaDecodingConfiguration MediaConfiguration {required MediaDecodingType ;
type MediaCapabilitiesKeySystemConfiguration ; };
keySystemConfiguration
dictionary :
MediaEncodingConfiguration MediaConfiguration {required MediaEncodingType ; };
type
デコード機能への入力はMediaDecodingConfiguration
辞書で表現され、エンコード機能への入力はMediaEncodingConfiguration
辞書で表現されます。
MediaConfiguration
が有効な
MediaConfigurationとなるためには、以下の条件すべてを満たさなければなりません:
MediaDecodingConfiguration
が有効な
MediaDecodingConfigurationとなるためには、以下の条件すべてを満たさなければなりません:
- 有効なMediaConfigurationであること。
-
keySystemConfiguration
が存在する場合:
MediaDecodingConfiguration
が[ENCRYPTED-MEDIA]を記述する場合、
keySystemConfiguration
が存在しなければなりません。
2.1.2. MediaDecodingType
enum {
MediaDecodingType "file" ,"media-source" ,"webrtc" };
MediaDecodingConfiguration
には3つのタイプがあります。
file
は、 [media-source]で定義されるMediaSource
や、[webrtc]で定義されるRTCPeerConnection
以外のメディアソースの再生に使われる構成を表します。media-source
は、MediaSource
の再生に使われる構成を表します。webrtc
は、RTCPeerConnection
を用いた受信構成を表します。
2.1.3. MediaEncodingType
enum {
MediaEncodingType "record" ,"webrtc" };
MediaEncodingConfiguration
には2つのタイプがあります。
record
はメディアの録画構成を表します。 例:[mediastream-recording]で定義されるMediaRecorder
など。webrtc
は、 [webrtc]で定義されるRTCPeerConnection
を用いて送信する構成を表します。
2.1.4. VideoConfiguration
dictionary {
VideoConfiguration required DOMString contentType ;required unsigned long width ;required unsigned long height ;required unsigned long long bitrate ;required double framerate ;boolean hasAlphaChannel ;HdrMetadataType hdrMetadataType ;ColorGamut colorGamut ;TransferFunction transferFunction ;DOMString scalabilityMode ;boolean spatialScalability ; };
contentType
メンバーは、動画トラックのMIMEタイプを表します。
VideoConfiguration
configurationが
有効な
video configurationかどうかを確認するには、以下の手順を実行します。
-
framerate
が有限でない、または0以下の場合、false
を返して手順を中止します。 -
任意のメンバーが、該当しない
MediaDecodingType
またはMediaEncodingType
に指定された場合、false
を返して手順を中止します。適用ルールは下記メンバー定義を参照してください。 -
mimeType を parse a MIME type
を configuration の
contentType
で実行した結果とします。 -
mimeTypeが
failure
の場合、false
を返します。 -
check MIME type validity を
mimeTypeおよび
video
で実行した結果を返します。
width
および
height
メンバーは、
それぞれエンコードされた動画フレームの表示される水平・垂直ピクセル数を表します。
bitrate
メンバーは、
動画トラックのビットレート(単位:bps)を表します。
動画ストリームが定常ビットレート(CBR)の場合は平均ビットレート、
可変ビットレート(VBR)の場合は最大ビットレートとなります。
framerate
メンバーは、
動画トラックのフレームレート(1秒間のフレーム数、fps)を表します。double型で表現されます。
hasAlphaChannel
メンバーは、
動画トラックがアルファチャンネル情報を含むかどうかを示します。trueの時、デコード時にピクセル毎のアルファ情報を生成可能です。
falseの場合は生成できません。未定義の場合、UAはcontentType
に基づき判断し、できない場合は生成不可とみなします。
hdrMetadataType
メンバーが存在する場合、
動画トラックに指定のHDRメタデータタイプが含まれることを示します。UAはHDRコンテンツを出力デバイスの色ボリュームや輝度にトーンマッピングするため、
このメタデータを解釈する必要があります。入力値はHdrMetadataType
で定義されます。MediaDecodingConfiguration
のうちmedia-source
とfile
タイプにのみ適用されます。
colorGamut
メンバーが存在する場合、
動画トラックが指定された色域で配信されることを示します。出力デバイスがその色域に対応していれば適切に描画し、
非対応の場合は近い色域にマッピングします。入力値はColorGamut
で定義されます。MediaDecodingConfiguration
のうちmedia-source
とfile
タイプにのみ適用されます。
transferFunction
メンバーが存在する場合、
動画トラックが指定された伝達関数の理解をUAに要求します。伝達関数は、表示デバイスとは独立して、
デコードしたメディアの色を表示色へ変換するユーザーエージェントのレンダリング能力を記述します。
入力値はTransferFunction
で定義されます。MediaDecodingConfiguration
のうちmedia-source
とfile
タイプにのみ適用されます。
scalabilityMode
メンバーが存在する場合、
[webrtc-svc]で定義される
スケーラビリティモードを表します。未指定の場合は、contentType
に対する実装依存のデフォルトモードとなります(setParameters()
で指定しない場合に得られるモード)。scalabilityModeはMediaEncodingConfiguration
のうち
webrtc
タイプにのみ適用されます。
scalabilityMode
が複数の空間レイヤーを示す場合、
width
およびheight
の値は、エンコードされた最大の空間レイヤーを表します。
spatialScalability
メンバーが存在する場合、
空間予測(異なる解像度のフレームを依存関係に使う)機能を示します。未指定の場合、spatialScalability
のデフォルト値はfalse
です。spatialScalability
がtrueなら、デコーダはエンコーダが設定したコーデック用の任意のscalabilityMode
をデコード可能です。falseなら空間スケーラビリティモードはデコードできませんが、他のscalabilityMode
はデコードできます。spatialScalability
はMediaDecodingConfiguration
のうちmedia-source
、
file
、
webrtc
タイプにのみ適用されます。
2.1.5. HdrMetadataType
enum {
HdrMetadataType "smpteSt2086" ,"smpteSt2094-10" ,"smpteSt2094-40" };
存在する場合、HdrMetadataType
は指定された種類のHDRメタデータを解釈する能力を表します。
VideoConfiguration
には以下のいずれかの種類が含まれる場合があります。
-
smpteSt2086
: [SMPTE-ST-2086]で定義される静的メタデータタイプ。 -
smpteSt2094-10
: [SMPTE-ST-2094]で定義される動的メタデータタイプ。 -
smpteSt2094-40
: [SMPTE-ST-2094]で定義される動的メタデータタイプ。
2.1.6. ColorGamut
enum {
ColorGamut "srgb" ,"p3" ,"rec2020" };
VideoConfiguration
には以下のいずれかの種類が含まれる場合があります。
2.1.7. TransferFunction
enum {
TransferFunction "srgb" ,"pq" ,"hlg" };
VideoConfiguration
には以下のいずれかの種類が含まれる場合があります。
-
srgb
: [sRGB]で定義される伝達関数。 -
pq
: [SMPTE-ST-2084]で定義される「Perceptual Quantizer」伝達関数。 -
hlg
: BT.2100で定義される「Hybrid Log Gamma」伝達関数。
2.1.8. AudioConfiguration
dictionary {
AudioConfiguration required DOMString contentType ;DOMString channels ;unsigned long long bitrate ;unsigned long samplerate ;boolean spatialRendering ; };
contentType
メンバーは、音声トラックのMIMEタイプを表します。
AudioConfiguration
configurationが
有効な
audio configurationかどうかを確認するには、以下の手順を実行します。
-
mimeTypeを parse a MIME type
をconfigurationの
contentType
で実行した結果とします。 -
mimeTypeが
failure
の場合、false
を返します。 -
check MIME type validity を
mimeTypeと
audio
で実行した結果を返します。
channels
メンバーは、音声トラックに使用されるチャンネル構成を表します。channelsは、デコードタイプmedia-source
、
file
、
webrtc
およびエンコードタイプwebrtc
にのみ適用されます。
channels
は、double
(2.1、4.1、5.1など)、unsigned short
(チャンネル数)、またはenum
値として定義する必要があります。現在の定義はプレースホルダーです。
bitrate
メンバーは、音声トラックの平均ビットレートを表します。ビットレートは音声トラックの1秒間のエンコードに使用されるビット数です。
samplerate
メンバーは、音声トラックのサンプリングレートを表します。サンプリングレートは毎秒の音声サンプル数です。samplerateは、デコードタイプmedia-source
、
file
、
webrtc
およびエンコードタイプwebrtc
にのみ適用されます。
samplerate
はHz
(毎秒のサンプル数)で表記されます。場合によってはサンプリングレートがkHz
(毎秒千サンプル)で表記されることがあります。
44100Hz
は44.1kHz
と同等です。
spatialRendering
メンバーは、音声を空間的にレンダリングすべきであることを示します。空間レンダリングの詳細はcontentType
から推測されるべきです。
存在しない場合、UAは空間レンダリング不要とみなす必要があります。true
の場合、ユーザーエージェントは現在の音声出力デバイスで空間レンダリングをサポートできる場合のみ、この構成をsupported
として報告するべきです。
spatialRendering
は
MediaDecodingConfiguration
のうちmedia-source
およびfile
タイプにのみ適用されます。
2.1.9. MediaCapabilitiesKeySystemConfiguration
dictionary {
MediaCapabilitiesKeySystemConfiguration required DOMString keySystem ;DOMString initDataType = "";MediaKeysRequirement distinctiveIdentifier = "optional";MediaKeysRequirement persistentState = "optional";sequence <DOMString >sessionTypes ;KeySystemTrackConfiguration audio ;KeySystemTrackConfiguration video ; };
この辞書では[ENCRYPTED-MEDIA]
(EME)で定義される複数の型を参照します。EMEタイプのシーケンスは、シーケンスの目的がrequestMediaKeySystemAccess()
によってサポートされる部分集合を選択する場合、
単一値にフラット化されます。
MediaCapabilities では、呼び出し元が複数回の呼び出しでシーケンスを指定し、最終的にどの構成を使用するかを呼び出し元が選択できます。
keySystem
メンバーは、
[ENCRYPTED-MEDIA]で説明されるkeySystem
名を表します。
initDataType
メンバーは、
[ENCRYPTED-MEDIA]で説明されるinitDataTypes
シーケンスからの単一値を表します。
distinctiveIdentifier
メンバーは、
[ENCRYPTED-MEDIA]で説明されるdistinctiveIdentifier
要件を表します。
persistentState
メンバーは、
[ENCRYPTED-MEDIA]で説明されるpersistentState
要件を表します。
sessionTypes
メンバーは、
[ENCRYPTED-MEDIA]で説明されるsessionTypes
の必須シーケンスを表します。
audio
メンバーは、
KeySystemTrackConfiguration
で、
AudioConfiguration
に関連付けられます。
video
メンバーは、
KeySystemTrackConfiguration
で、
VideoConfiguration
に関連付けられます。
2.1.10. KeySystemTrackConfiguration
dictionary {
KeySystemTrackConfiguration DOMString robustness = "";DOMString ?encryptionScheme =null ; };
robustness
メンバーは、[ENCRYPTED-MEDIA]で説明される
robustness
レベルを表します。
encryptionScheme
メンバーは、[ENCRYPTED-MEDIA-DRAFT]で説明される
encryptionScheme
を表します。
2.2. メディア機能情報
dictionary {
MediaCapabilitiesInfo required boolean supported ;required boolean smooth ;required boolean powerEfficient ; };
dictionary :
MediaCapabilitiesDecodingInfo MediaCapabilitiesInfo {required MediaKeySystemAccess ?keySystemAccess ;required MediaDecodingConfiguration configuration ; };
dictionary :
MediaCapabilitiesEncodingInfo MediaCapabilitiesInfo {required MediaEncodingConfiguration configuration ; };
MediaCapabilitiesInfo
には、supported
、smooth
、powerEfficient
というフィールドがあり、いずれもboolean型です。
エンコードまたはデコードが省電力であるとみなされるのは、電力消費が最適である場合です。エンコードやデコードの最適な電力消費の定義はユーザーエージェントに委ねられますが、一般的な実装方針としてはハードウェア利用が最適な消費の指標となることが多いです。ユーザーエージェントはハードウェアエンコード/デコードをデフォルトで省電力とみなすべきではありません。非ハードウェアコーデックでも低解像度動画では同等に効率的な場合があります。ユーザーエージェントは、省電力の判定にデバイスの電源供給(電源の有無)を考慮すべきではありませんが、電源供給によって異なるエンコード・デコードモジュールが有効化されるなど副作用がある場合は考慮しても構いません。
MediaCapabilitiesDecodingInfo
には、keySystemAccess
という、MediaKeySystemAccess
またはnull
が適宜関連付けられます。
暗号化デコード構成がサポートされている場合、返されるMediaCapabilitiesInfo
には
MediaKeySystemAccess
が含まれます。著者はこれを利用して
MediaKeys
を作成し、暗号化再生のセットアップが可能です。
MediaCapabilitiesDecodingInfo
には、configuration
が関連付けられ、
MediaCapabilitiesDecodingInfo
を生成するために使われたデコード構成プロパティです。
MediaCapabilitiesEncodingInfo
には、configuration
が関連付けられ、
MediaCapabilitiesEncodingInfo
を生成するために使われたエンコード構成プロパティです。
2.3. アルゴリズム
2.3.1. MediaCapabilitiesEncodingInfoの作成
MediaCapabilitiesEncodingInfoの作成を行うには、
MediaEncodingConfiguration
configurationが与えられたとき、以下の手順を実行します。返値はMediaCapabilitiesEncodingInfo
です:
-
infoを新しい
MediaCapabilitiesEncodingInfo
インスタンスとして作成します。特に明記がない限り、以後の手順の読取・書込はinfoに対して行います。 -
configuration
を新しいMediaEncodingConfiguration
とします。 configuration内の各プロパティについて、同名・同値の新しいプロパティをconfiguration
に作成します。 -
videoSupportedを
unknown
とします。 -
video
がconfigurationに存在する場合、以下を実行します:-
videoMimeTypeをconfigurationの
contentType
でMIMEタイプの解析を実行した結果とします。 -
videoSupportedに、MIMEタイプサポートの確認を
videoMimeType、configurationの
type
で実行した結果を設定します。
-
videoMimeTypeをconfigurationの
-
audioSupportedを
unknown
とします。 -
audio
がconfigurationに存在する場合、以下を実行します:-
audioMimeTypeをconfigurationの
contentType
でMIMEタイプの解析を実行した結果とします。 -
audioSupportedに、MIMEタイプサポートの確認を
audioMimeType、configurationの
type
で実行した結果を設定します。
-
audioMimeTypeをconfigurationの
-
videoSupportedまたはaudioSupportedが
unsupported
の場合、supported
にfalse
、smooth
にfalse
、powerEfficient
にfalse
を設定し、infoを返します。 -
それ以外の場合、
supported
にtrue
を設定します。 -
ユーザーエージェントがconfigurationで示されたフレームレートでメディアをエンコードできる場合、
smooth
にtrue
を設定し、そうでない場合はfalse
にします。 -
ユーザーエージェントがconfigurationで示されたメディアを
省電力で
エンコードできる場合、
powerEfficient
にtrue
を設定し、そうでない場合はfalse
にします。 - infoを返します。
2.3.2. MediaCapabilitiesDecodingInfoの作成
MediaCapabilitiesDecodingInfoの作成を行うには、
MediaDecodingConfiguration
configurationが与えられたとき、以下の手順を実行します。返値はMediaCapabilitiesDecodingInfo
です:
-
infoを新しい
MediaCapabilitiesDecodingInfo
インスタンスとして作成します。特に明記がない限り、以後の手順の読取・書込はinfoに対して行います。 -
configuration
を新しいMediaDecodingConfiguration
とします。 configuration内の各プロパティについて、同名・同値の新しいプロパティをconfiguration
に作成します。 -
configuration.keySystemConfiguration
が存在する場合:-
keySystemAccess
に暗号化デコードサポートの確認アルゴリズムを configurationで実行した結果を設定します。 -
keySystemAccess
がnull
の場合、supported
にfalse
、smooth
にfalse
、powerEfficient
にfalse
を設定し、infoを返します。 -
それ以外の場合、
supported
にtrue
を設定し、ステップ6に進みます。
-
-
それ以外の場合は以下を実行します:
-
keySystemAccess
にnull
を設定します。 -
videoSupportedを
unknown
とします。 -
video
がconfigurationに存在する場合、以下を実行します:-
videoMimeTypeをconfigurationの
contentType
でMIMEタイプの解析を実行した結果とします。 -
videoSupportedに、MIMEタイプサポートの確認を
videoMimeType、configurationの
type
、 configurationのcolorGamut
、transferFunction
で実行した結果を設定します。
-
videoMimeTypeをconfigurationの
-
audioSupportedを
unknown
とします。 -
audio
がconfigurationに存在する場合、以下を実行します:-
audioMimeTypeをconfigurationの
contentType
でMIMEタイプの解析を実行した結果とします。 -
audioSupportedに、MIMEタイプサポートの確認を
audioMimeType、configurationの
type
で実行した結果を設定します。
-
audioMimeTypeをconfigurationの
-
videoSupportedまたはaudioSupportedが
unsupported
の場合、supported
にfalse
、smooth
にfalse
、powerEfficient
にfalse
を設定し、infoを返します。
-
-
supported
にtrue
を設定します。 -
ユーザーエージェントがconfigurationで示されたフレームレートで
フレーム落ちなしにメディアをデコードできる場合、
smooth
にtrue
を設定し、そうでない場合はfalse
にします。 -
ユーザーエージェントがconfigurationで示されたメディアを
省電力で
デコードできる場合、
powerEfficient
にtrue
を設定し、そうでない場合はfalse
にします。 - infoを返します。
2.3.3. MIMEタイプの有効性の確認
MIMEタイプの有効性の確認を行うには、 MIMEタイプレコード mimeTypeと 文字列mediaが与えられたとき、以下の手順を実行します:
-
mimeTypeの型([RFC9110]参照)がmediaでも
application
でもない場合、false
を返します。 -
mimeTypeの
type
とsubtype
が単一メディアコーデックを許容し、 mimeTypeのparameters
が空でない場合、false
を返します。 -
mimeTypeの
type
とsubtype
が複数メディアコーデックを許容する場合は、以下を実行します:-
mimeTypeの
parameters
に"codecs"というキーが1つだけ含まれていなければfalse
を返します。単一メディアコーデックのみが記載されていることがなぜ重要か?[Issue #235]
-
mimeType.parameters["codecs"]
の値が単一メディアコーデックを記述していなければfalse
を返します。
-
mimeTypeの
-
true
を返します。
このロジックはwebrtc
にも適用されるか?[Issue #238]
2.3.4. MIMEタイプサポートの確認
MIMEタイプサポートの確認を行うには、
MIMEタイプレコード mimeType、
MediaEncodingType
またはMediaDecodingType
encodingOrDecodingType、任意のcolorGamut
colorGamut
、
任意のtransferFunction
transferFunction
が与えられたとき、以下の手順を実行します。MIMEタイプが
ユーザーエージェントでサポートされていればsupported
、
サポートされていなければunsupported
を返します:
-
encodingOrDecodingTypeが
webrtc
(MediaEncodingType
) またはwebrtc
(MediaDecodingType
) かつmimeTypeがRTPで使用されるものでない場合(RTPペイロードフォーマット仕様参照 [IANA-MEDIA-TYPES] [RFC6838])、unsupported
を返します。コーデック名は通常subtypeとして指定され、コーデックに応じてゼロ以上のパラメータが追加されます。
-
colorGamutが存在し、mimeTypeに対して無効な場合、
unsupported
を返します。 -
transferFunctionが存在し、mimeTypeに対して無効な場合、
unsupported
を返します。ユーザーエージェントは、mimeTypeで指定されたビデオコーデックの仕様を参照し、 colorGamutやtransferFunctionの有効値を判断するべきです。
ここでの検証ステップの相互運用性はどう保証する?[Issue #245]
-
mimeTypeがユーザーエージェントでサポートされていなければ、
unsupported
を返します。 -
supported
を返します。
2.3.5. 暗号化デコードサポートの確認
暗号化デコードサポートの確認を行うには、
MediaDecodingConfiguration
config(keySystemConfiguration
存在)が与えられたとき、以下の手順を実行します。返値はMediaKeySystemAccess
またはnull
です:
-
keySystem
が ユーザーエージェントがサポートするKey Systemのいずれでもない場合はnull
を返します。文字列比較は大文字小文字区別です。 -
originを呼び出し元コンテキストの
Document
の オリジンとします。 -
implementationを
config.keySystemConfiguration.keySystem
の実装とします。 -
emeConfigurationを新しい
MediaKeySystemConfiguration
とし、以下のように初期化します:-
initDataTypes
属性にconfig.keySystemConfiguration.initDataType
のみを含むシーケンスを設定します。 -
distinctiveIdentifier
属性にconfig.keySystemConfiguration.distinctiveIdentifier
を設定します。 -
persistentState
属性にconfig.keySystemConfiguration.peristentState
を設定します。 -
sessionTypes
属性にconfig.keySystemConfiguration.sessionTypes
を設定します。 -
audio
がconfigに存在する場合、audioCapabilities
属性に、以下のように初期化されたMediaKeySystemMediaCapability
を1つだけ含むシーケンスを設定します:-
contentType
属性にconfig.audio.contentType
を設定します。 -
config.keySystemConfiguration.audio
が存在する場合:-
config.keySystemConfiguration.audio.robustness
が存在しnull
でない場合、robustness
属性にconfig.keySystemConfiguration.audio.robustness
を設定します。 -
encryptionScheme
属性にconfig.keySystemConfiguration.audio.encryptionScheme
を設定します。
-
-
-
video
がconfigに存在する場合、 videoCapabilities属性に、以下のように初期化されたMediaKeySystemMediaCapability
を1つだけ含むシーケンスを設定します:-
contentType
属性にconfig.video.contentType
を設定します。 -
config.keySystemConfiguration.video
が存在する場合:-
config.keySystemConfiguration.video.robustness
が存在しnull
でない場合、robustness
属性にconfig.keySystemConfiguration.video.robustness
を設定します。 -
encryptionScheme
属性にconfig.keySystemConfiguration.video.encryptionScheme
を設定します。
-
-
-
- supported configurationに、Get Supported Configurationアルゴリズム [ENCRYPTED-MEDIA]を implementation、emeConfiguration、originで実行した結果を設定します。
-
supported configurationが
NotSupported
の場合、null
を返します。 -
accessを新しい
MediaKeySystemAccess
オブジェクトとして作成し、以下で初期化します:-
keySystem
属性にemeConfiguration.keySystem
を設定します。 - configuration値にsupported configurationを設定します。
- cdm implementation値にimplementationを設定します。
-
- accessを返します。
2.4. Navigator および WorkerNavigator 拡張
[Exposed =Window ]partial interface Navigator { [SameObject ]readonly attribute MediaCapabilities ; };
mediaCapabilities
[Exposed =Worker ]partial interface WorkerNavigator { [SameObject ]readonly attribute MediaCapabilities ; };
mediaCapabilities
2.5. MediaCapabilities インターフェース
[Exposed =(Window ,Worker )]interface { [
MediaCapabilities NewObject ]Promise <MediaCapabilitiesDecodingInfo >(
decodingInfo MediaDecodingConfiguration ); [
configuration NewObject ]Promise <MediaCapabilitiesEncodingInfo >(
encodingInfo MediaEncodingConfiguration ); };
configuration
2.5.1. MediaCapabilities タスクソース
この仕様で言及されているタスクの task source は、media capabilities task source です。
アルゴリズムが メディア機能タスクをキューする T の場合、 ユーザーエージェントは グローバルタスクをキュー T を media capabilities task source 上の グローバルオブジェクト(current realm record)を使って実行しなければなりません。
2.5.2. decodingInfo() メソッド
decodingInfo()
メソッドは以下の手順を実行しなければなりません:
-
configuration が 有効な MediaDecodingConfiguration
でない場合、
新規作成した
TypeError
で reject された Promise を返します。 -
configuration.keySystemConfiguration
が 存在する場合、以下のサブステップを実行します:-
グローバルオブジェクト が
WorkerGlobalScope
型の場合、DOMException
(name がInvalidStateError
)で reject された Promise を返します。 -
グローバルオブジェクトの 関連設定オブジェクト が
非セキュアコンテキスト の場合、
DOMException
(name がSecurityError
)で reject された Promise を返します。
-
グローバルオブジェクト が
- p を新しい Promise とします。
-
以下の手順を 並列で実行します:
- MediaCapabilitiesDecodingInfoの作成アルゴリズムを configurationで実行します。
- Media Capabilities タスクをキューし、 その結果で p を resolve します。
- p を返します。
注: decodingInfo()
で keySystemConfiguration
が存在する場合、ユーザーに可視な影響(ユーザー同意要求など)が発生する場合があります。
著者は、本当に MediaKeys
オブジェクトを作成し使用する場合のみ、この呼び出しを行うべきです。
2.5.3. encodingInfo() メソッド
encodingInfo()
メソッドは以下の手順を実行しなければなりません:
-
configuration が 有効な MediaConfiguration でない場合、
新規作成した
TypeError
で reject された Promise を返します。 - p を新しい Promise とします。
-
以下の手順を 並列で実行します:
- MediaCapabilitiesEncodingInfoの作成 アルゴリズムを configuration で実行します。
- Media Capabilities タスクをキューし、 その結果で p を resolve します。
- p を返します。
3. セキュリティおよびプライバシーに関する考慮事項
本仕様はセキュリティに敏感な情報やAPIを導入するものではありませんが、ユーザーのフィンガープリントに利用可能な情報へのアクセスを容易にします。
3.1. 機能モデル
本仕様は MediaDecodingType
の値 file
、
media-source
、
webrtc
および MediaEncodingType
の値 record
と webrtc
をサポートします。
[webrtc] がサポートするリアルタイム通信では、メディアはピア間で伝送されます。 サイトは両ユーザーエージェント間で共通のメディアパラメータをネゴシエートするための情報交換は行いますが、通常メディアの伝送・エンコード・デコードには関与しません。 1対1通話では、ユーザーエージェント同士が送受信するメディアの交渉を行います。
会議シナリオでは、ユーザーエージェントが数十人、時には数百人の受信者へメディアを送信することができます。スケーラビリティ向上のため、アプリケーションは外部サーバ(選択的フォワーディングユニットや会議ブリッジ等)を利用します。 これらサーバは参加者とメディアパラメータを交渉し、送信者と受信者間で一貫性を確保します。これはユーザーエージェント同士でN*(N-1)交渉が必要となる場合よりもスケーラブルです。 通常送信者は単一コーデックでエンコードし、会議サーバはトランスコーディングをサポートしないため、ユーザーエージェントが「好みのものを選ぶ」ことはできません。
3.2. デコード/エンコードとフィンガープリント
デコード/エンコード機能で公開される情報は、既に実験によって取得可能ですが、APIはより正確かつ一貫した情報を提供する可能性があります。 この情報は既にウェブページが取得できる他の情報と高い相関があると考えられており、同じカテゴリのデバイスは非常に類似したデコード/エンコード機能を持つと予想されます。 つまり、特定の年の高性能デバイスはある種の動画をデコードでき、古いデバイスはそうでない場合があります。 したがって、このAPIによるエントロピーの増加は有意ではないものと考えられます。
HDR検出はより微妙です。colorGamut
、
transferFunction
、
hdrMetadataType
の追加は有意なエントロピーを生む可能性があります。しかし、UAのデコーダがソフトウェアで実装されており、機能がデバイス間で固定されている場合、この機能は実質的にエントロピーを増やしません。
また、多くの場合デバイスは大きなカテゴリに分かれ、その中では機能が似通っているため、実質的なエントロピーは最小化されます。
利用可能なメディアフォーマットをサイトが公開し、ブラウザが機能と照合して選ばれたフォーマットだけ返すという代替設計も検討されました。 しかしこの場合も、サイトはAPIを繰り返し呼び出すことで完全な機能セットを取得できるため、プライバシー上の利点にはなりません。 APIの厳格なレート制限は、複数の再生アイテムへの投機的な準備など、通常のサイト動作に支障をきたす恐れがあります。
実装が本仕様のフィンガープリント耐性バージョンを提供したい場合、常に「はい」や「いいえ」を返すのではなく、1080p VP9までデコード可能等、一定の機能セットを偽装することが推奨されます。 後者はユーザー体験を大幅に損なう可能性があるためです。もう一つの緩和策は、これらのWeb APIをトップレベルの閲覧コンテキストに限定することです。 さらに、プライバシーバジェットを利用してAPI呼び出しを閾値以上で制限・遮断する方法もあります。 また、ブラウザはサイトが検出した機能を実際に利用するかどうかを判断し、利用しない場合はより厳格な制御を適用することも検討できます。
4. 例
4.1. Media Source Extensions
decodingInfo()
で再生機能を照会する例
次の例は decodingInfo()
を使って
Media Source Extensions
[media-source]
利用時にメディア再生機能を照会する方法を示しています。
< script> const contentType= 'video/mp4;codecs=avc1.640028' ; const configuration= { type: 'media-source' , video: { contentType: contentType, width: 640 , height: 360 , bitrate: 2000 , framerate: 29.97 } }; navigator. mediaCapabilities. decodingInfo( configuration) . then(( result) => { console. log( 'Decoding of ' + contentType+ ' is' + ( result. supported? '' : ' NOT' ) + ' supported,' + ( result. smooth? '' : ' NOT' ) + ' smooth and' + ( result. powerEfficient? '' : ' NOT' ) + ' power efficient' ); }) . catch (( err) => { console. error( err, ' caused decodingInfo to reject' ); }); < /script>
次の例は decodingInfo()
を使って WebRTC受信機能
[webrtc]
を照会する方法を示しています。
< script> const contentType= 'video/VP8' ; const configuration= { type: 'webrtc' , video: { contentType: contentType, width: 640 , height: 360 , bitrate: 2000 , framerate: 25 } }; navigator. mediaCapabilities. decodingInfo( configuration) . then(( result) => { console. log( 'Decoding of ' + contentType+ ' is' + ( result. supported? '' : ' NOT' ) + ' supported,' + ( result. smooth? '' : ' NOT' ) + ' smooth and' + ( result. powerEfficient? '' : ' NOT' ) + ' power efficient' ); }) . catch (( err) => { console. error( err, ' caused decodingInfo to reject' ); }); < /script>
< script> const contentType= 'video/H264;level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f' ; const configuration= { type: 'webrtc' , video: { contentType: contentType, width: 640 , height: 360 , bitrate: 2000 , framerate: 25 } }; navigator. mediaCapabilities. decodingInfo( configuration) . then(( result) => { console. log( 'Decoding of ' + contentType+ ' is' + ( result. supported? '' : ' NOT' ) + ' supported,' + ( result. smooth? '' : ' NOT' ) + ' smooth and' + ( result. powerEfficient? '' : ' NOT' ) + ' power efficient' ); }) . catch (( err) => { console. error( err, ' caused decodingInfo to reject' ); }); < /script>
4.2. WebRTC送信機能を encodingInfo()
で照会する例
< script> const contentType= 'video/VP9' ; const configuration= { type: 'webrtc' , video: { contentType: contentType, width: 640 , height: 480 , bitrate: 10000 , framerate: 29.97 , scalabilityMode: "L3T3_KEY" } }; navigator. mediaCapabilities. encodingInfo( configuration) . then(( result) => { console. log( contentType+ ' is:' + ( result. supported? '' : ' NOT' ) + ' supported,' + ( result. smooth? '' : ' NOT' ) + ' smooth and' + ( result. powerEfficient? '' : ' NOT' ) + ' power efficient' ); }) . catch (( err) => { console. error( err, ' caused encodingInfo to reject' ); }); < /script>
< script> const contentType= 'video/webm;codecs=vp8' ; const configuration= { type: 'record' , video: { contentType: contentType, width: 640 , height: 480 , bitrate: 10000 , framerate: 29.97 } }; navigator. mediaCapabilities. encodingInfo( configuration) . then(( result) => { console. log( contentType+ ' is:' + ( result. supported? '' : ' NOT' ) + ' supported,' + ( result. smooth? '' : ' NOT' ) + ' smooth and' + ( result. powerEfficient? '' : ' NOT' ) + ' power efficient' ); }) . catch (( err) => { console. error( err, ' caused encodingInfo to reject' ); }); < /script>