1. 定義
- コーデック
-
AudioDecoder、AudioEncoder、VideoDecoder、 またはVideoEncoderのインスタンスを総称して指します。 - キーチャンク
-
他のフレームに依存せずデコードできるエンコード済みチャンク。一般的に「キーフレーム」とも呼ばれます。
- 内部保留出力
-
VideoFrameなど、 現在基盤となるコーデック実装の内部パイプラインに存在するコーデック出力。基盤となるコーデック実装は新しい入力が提供された場合のみ新しい出力を生成してもよい。また、flushに応じてすべての出力を生成しなければならない。 - コーデックシステムリソース
-
CPUメモリ、GPUメモリ、特定のデコード/エンコードハードウェアへの排他的ハンドルなど、コーデックの設定や
AudioDataやVideoFrameオブジェクトの生成の一部としてユーザーエージェントが割り当てる場合があるリソース。これらのリソースはすぐに枯渇する場合があり、不要になったら直ちに解放すべきです。 - 時間層
-
タイムスタンプの間隔によって特定のフレームレートを生み出す
EncodedVideoChunkのグループ。scalabilityMode参照。 - プログレッシブ画像
-
複数の詳細レベルへのデコードをサポートする画像。エンコードデータが完全にバッファされていなくても、低い詳細レベルが利用可能になります。
- プログレッシブ画像フレーム世代
-
プログレッシブ画像のデコード出力に対する世代識別子。 各世代ごとにデコード出力に追加の詳細が加わります。 フレームの世代を算出する仕組みは実装依存です。
- 主画像トラック
-
画像ファイルによってデフォルトトラックとしてマークされた画像トラック。主トラックの指定方法はフォーマット依存です。
- RGBフォーマット
-
赤・緑・青のカラーチャンネルを任意の順序やレイアウト(インターリーブまたはプレーナー)で含み、アルファチャンネルの有無に関わらず
VideoPixelFormatで表現されるもの。 - sRGBカラースペース
-
VideoColorSpaceオブジェクトで、以下のように初期化されます:-
[[matrix]]はrgbに設定 -
[[full range]]はtrueに設定
- Display P3カラースペース
-
VideoColorSpaceオブジェクトで、以下のように初期化されます:-
[[matrix]]はrgbに設定 -
[[full range]]はtrueに設定
- REC709カラースペース
-
VideoColorSpaceオブジェクトで、以下のように初期化されます:-
[[matrix]]はbt709に設定 -
[[full range]]はfalseに設定
- コーデック飽和
-
基盤となるコーデック実装で、アクティブなデコードまたはエンコード要求数が実装固有の最大値に達し、一時的に追加の作業を受け付けられなくなった状態。最大値は2以上の任意の値(無限大=制限なしも含む)であり得ます。飽和状態では、追加の
decode()やencode()呼び出しは制御メッセージキューにバッファされ、decodeQueuSizeやencodeQueueSize属性が増加します。コーデック実装は現在の作業が十分進行すると飽和状態を解除します。
2. コーデック処理モデル
2.1. 背景
本仕様で定義されるコーデックインターフェースは、前のタスクが保留中でも新しいコーデックタスクをスケジュールできるよう設計されています。例えば、Web著者は前のdecode()が完了するのを待たずにdecode()を呼び出すことができます。これは、基盤となるコーデックタスクを並列実行用のparallel queueにオフロードすることで実現されています。
このセクションでは、Web著者の視点から見えるスレッド動作について説明します。実装者は、外部から見えるブロッキングや順序付けの動作が維持される限り、より多くのスレッドを利用しても構いません。
2.2. 制御メッセージ
制御メッセージは、
コーデックインスタンス(例:encode())へのメソッド呼び出しに対応する一連の手順を定義します。
制御メッセージキューは、 キューであり、 制御メッセージの集合です。各コーデックインスタンスは、内部スロット[[control message queue]]に制御メッセージキューを保持します。
制御メッセージのキューイングは、 キューに追加することを意味し、コーデックの[[control message queue]]にメッセージを追加します。コーデックのメソッド呼び出しは通常、作業をスケジュールするために制御メッセージをキューイングします。
制御メッセージの実行は、 メッセージをキューイングしたメソッドで指定された一連の手順を実行することを意味します。
特定の制御メッセージの手順は、制御メッセージキュー内の後続メッセージの処理をブロックする場合があります。各コーデックインスタンスは、[[message queue
blocked]]という真偽値の内部スロットを持ち、これがtrueになるとブロック状態となります。ブロックするメッセージは、終了時に[[message queue
blocked]]をfalseに設定し、制御メッセージキューの処理手順を再実行します。
すべての制御メッセージは"processed"または"not processed"を返します。
"processed"はメッセージの手順が実行中または完了しており、メッセージを制御メッセージキューから削除できることを示します。
"not processed"は現時点で処理すべきでないことを示し、制御メッセージキューに残して後で再試行します。
制御メッセージキューの処理は、以下の手順を実行します:
-
[[message queue blocked]]が
falseで、 [[control message queue]]が空でない間:-
front messageを [[control message queue]]の先頭のメッセージとする。
-
outcomeを、制御メッセージの手順をfront messageに対して実行した結果とする。
-
outcomeが
"not processed"なら、breakする。 -
それ以外の場合、front messageを [[control message queue]]から除去する。
-
2.3. コーデック作業並列キュー
各コーデックインスタンスは、[[codec work queue]]という内部スロットを持ち、これはparallel queueです。
各コーデックインスタンスは、[[codec implementation]]という内部スロットを持ち、これは基盤となるプラットフォームのエンコーダまたはデコーダを指します。初期割り当て以外で、[[codec implementation]]を参照する手順は[[codec work queue]]にキューイングされます。
各コーデックインスタンスは一意なコーデックタスクソースを持ちます。 タスクをキューする際、[[codec work queue]]からイベントループへ コーデックタスクソースが使われます。
3. AudioDecoderインターフェース
[Exposed =(Window ,DedicatedWorker ),SecureContext ]interface :AudioDecoder EventTarget {constructor (AudioDecoderInit );init readonly attribute CodecState state ;readonly attribute unsigned long decodeQueueSize ;attribute EventHandler ondequeue ;undefined configure (AudioDecoderConfig );config undefined decode (EncodedAudioChunk );chunk Promise <undefined >flush ();undefined reset ();undefined close ;static Promise <AudioDecoderSupport >isConfigSupported (AudioDecoderConfig ); };config dictionary {AudioDecoderInit required AudioDataOutputCallback ;output required WebCodecsErrorCallback ; };error callback =AudioDataOutputCallback undefined (AudioData );output
3.1. 内部スロット
[[control message queue]]-
このコーデックインスタンスで実行されるキュー型の制御メッセージ。[[control message queue]]参照。
[[message queue blocked]]-
[[control message queue]]の処理が保留中の制御メッセージによってブロックされているかどうかを示す真偽値。[[message queue blocked]]参照。 [[codec implementation]]-
ユーザーエージェントが提供する基盤となるデコーダ実装。[[codec implementation]]参照。
[[codec work queue]]-
[[codec implementation]]を参照する並列手順の実行に使われるparallel queue。[[codec work queue]]参照。 [[codec saturated]]-
[[codec implementation]]が追加のデコード作業を受け付けられない場合にtrueとなる真偽値。 [[output callback]]-
デコード出力用にコンストラクタで指定されたコールバック。
[[error callback]]-
デコードエラー用にコンストラクタで指定されたコールバック。
[[key chunk required]][[state]]-
この
AudioDecoderの現在のCodecState。 [[decodeQueueSize]]-
保留中のデコード要求数。基盤となるコーデックが新しい入力を受け付け可能になると減少します。
[[pending flush promises]]-
flush()呼び出しで返された未解決のPromiseのリスト。 [[dequeue event scheduled]]-
dequeueイベントがすでに発火予定かどうかを示す真偽値。イベントスパム防止用。
3.2. コンストラクター
AudioDecoder(init)
-
dを新しい
AudioDecoderオブジェクトとする。 -
[[control message queue]]に新しいキューを割り当てる。 -
[[message queue blocked]]にfalseを割り当てる。 -
[[codec implementation]]にnullを割り当てる。 -
[[codec work queue]]に新しいparallel queueの開始結果を割り当てる。 -
[[codec saturated]]にfalseを割り当てる。 -
[[output callback]]にinit.outputを割り当てる。 -
[[error callback]]にinit.errorを割り当てる。 -
[[key chunk required]]にtrueを割り当てる。 -
[[state]]に"unconfigured"を割り当てる。 -
[[decodeQueueSize]]に0を割り当てる。 -
[[pending flush promises]]に新しいリストを割り当てる。 -
[[dequeue event scheduled]]にfalseを割り当てる。 -
dを返す。
3.3. 属性
state, 型 CodecState、readonly-
[[state]]の値を返します。 decodeQueueSize, 型 unsigned long、readonly-
[[decodeQueueSize]]の値を返します。 ondequeue, 型 EventHandler
3.4. イベント概要
dequeue-
AudioDecoderで、decodeQueueSizeが減少したときに発火します。
3.5. メソッド
configure(config)-
制御メッセージをキューに追加し、configで記述された通りにオーディオデコーダーを設定してチャンクのデコードを行います。
注: このメソッドは、ユーザーエージェントがconfigをサポートしない場合、
NotSupportedErrorを発生させます。著者はまずconfigを使ってisConfigSupported()を呼び出してサポート状況を確認することが推奨されます。ユーザーエージェントは特定のコーデックタイプや設定をサポートする必要はありません。呼び出されたとき、以下の手順を実行します:
-
configが有効なAudioDecoderConfigでない場合、
TypeErrorを投げる。 -
[[state]]が“closed”の場合、InvalidStateErrorを投げる。 -
[[state]]に"configured"を設定する。 -
[[key chunk required]]にtrueを設定する。 -
制御メッセージをキューに追加し、configでデコーダーを設定する。
制御メッセージの実行でデコーダーを設定する場合、以下の手順を実行します:
-
[[message queue blocked]]にtrueを割り当てる。 -
[[codec work queue]]に以下の手順をキューに追加する:-
supportedを、Check Configuration Supportアルゴリズムをconfigで実行した結果とする。
-
supportedが
falseの場合、タスクをキューに追加し、Close AudioDecoderアルゴリズムをNotSupportedErrorで実行し、これ以降の手順を中止する。 -
必要に応じて、
[[codec implementation]]にconfigをサポートする実装を割り当てる。 -
[[codec implementation]]をconfigで設定する。 -
タスクをキューに追加し、以下の手順を実行する:
-
[[message queue blocked]]にfalseを割り当てる。
-
-
-
"processed"を返す。
-
decode(chunk)-
制御メッセージをキューに追加し、指定されたchunkをデコードします。
呼び出されたとき、以下の手順を実行します:
-
[[state]]が"configured"でない場合、InvalidStateErrorを投げる。 -
[[key chunk required]]がtrueの場合:-
実装者は推奨として、chunkの
[[internal data]]を検査し、本当にkey chunkであることを確認するべきです。不一致が検出された場合、DataErrorを投げる。 -
それ以外の場合、
[[key chunk required]]にfalseを割り当てる。
-
[[decodeQueueSize]]をインクリメントする。 -
制御メッセージをキューに追加し、chunkをデコードする。
制御メッセージの実行でchunkをデコードする場合、以下の手順を実行します:
-
[[codec saturated]]がtrueの場合、"not processed"を返す。 -
chunkのデコードにより
[[codec implementation]]がsaturatedになる場合、[[codec saturated]]にtrueを割り当てる。 -
[[decodeQueueSize]]をデクリメントし、Dequeueイベントスケジュールアルゴリズムを実行する。 -
[[codec work queue]]に以下の手順をキューに追加する:-
[[codec implementation]]でchunkのデコードを試みる。 -
デコードでエラーが発生した場合、タスクをキューに追加し、Close AudioDecoderアルゴリズムを
EncodingErrorで実行し、戻る。 -
[[codec saturated]]がtrueかつ[[codec implementation]]がsaturatedでなくなった場合、タスクをキューに追加し、以下の手順を実行する:-
[[codec saturated]]にfalseを割り当てる。
-
-
decoded outputsを、
[[codec implementation]]から出力されたデコード済みオーディオデータのリストとする。 -
decoded outputsが空でない場合、タスクをキューに追加し、Output AudioDataアルゴリズムをdecoded outputsで実行する。
-
-
"processed"を返す。
-
flush()-
制御メッセージをすべて制御メッセージキューで完了し、すべての出力を発行します。
呼び出されたとき、以下の手順を実行します:
-
[[state]]が"configured"でない場合、拒否されたPromiseをInvalidStateErrorDOMExceptionで返す。 -
[[key chunk required]]にtrueを設定する。 -
promiseを新しいPromiseとする。
-
promiseを
[[pending flush promises]]に追加する。 -
制御メッセージをキューに追加し、コーデックをpromiseでフラッシュする。
-
promiseを返す。
制御メッセージの実行でコーデックをフラッシュする場合、promiseを使って以下の手順を実行します:
-
[[codec work queue]]に以下の手順をキューに追加する:-
[[codec implementation]]にすべての内部保留出力を発行するようにシグナルする。 -
decoded outputsを、
[[codec implementation]]から出力されたデコード済みオーディオデータのリストとする。 -
タスクをキューに追加し、以下の手順を実行する:
-
decoded outputsが空でない場合、Output AudioData アルゴリズムをdecoded outputsで実行する。
-
promiseを
[[pending flush promises]]から削除する。 -
promiseを解決する。
-
-
-
"processed"を返す。
-
reset()-
設定、制御メッセージ、制御メッセージキュー内のすべてのメッセージ、および保留中のコールバックを即座にリセットします。
呼び出されたとき、Reset AudioDecoderアルゴリズムを
AbortErrorDOMExceptionで実行する。 close()-
保留中のすべての作業を即座に中止し、システムリソースを解放します。
closeは最終的な操作です。
呼び出されたとき、Close AudioDecoderアルゴリズムを
AbortErrorDOMExceptionで実行する。 isConfigSupported(config)-
指定されたconfigがユーザーエージェントでサポートされているかどうかを示すPromiseを返します。
注: 返される
AudioDecoderSupportのconfigには、ユーザーエージェントが認識した辞書メンバーのみが含まれます。 認識されない辞書メンバーは無視されます。著者は、configと提供したconfigを比較することで認識されないメンバーを検出できます。呼び出されたとき、以下の手順を実行します:
-
configが有効なAudioDecoderConfigでない場合、拒否されたPromiseを
TypeErrorで返す。 -
pを新しいPromiseとする。
-
checkSupportQueueを新しいparallel queueの開始結果とする。
-
checkSupportQueueに以下の手順をキューに追加する:
-
supportedをCheck Configuration Supportアルゴリズムをconfigで実行した結果とする。
-
タスクをキューに追加し、以下の手順を実行する:
-
decoderSupportを新しく構築した
AudioDecoderSupportとし、以下のように初期化する:-
configをClone Configurationアルゴリズムをconfigで実行した結果に設定する。 -
supportedをsupportedに設定する。
-
-
pをdecoderSupportで解決する。
-
-
-
pを返す。
-
3.6. アルゴリズム
- Dequeueイベントスケジュール
-
-
[[dequeue event scheduled]]がtrueの場合、戻る。 -
[[dequeue event scheduled]]にtrueを割り当てる。 -
タスクをキューに追加し、以下の手順を実行する:
-
[[dequeue event scheduled]]にfalseを割り当てる。
-
- AudioData出力 (outputs付き)
-
以下の手順を実行する:
-
outputs内の各outputについて:
-
dataを以下のように初期化した
AudioDataとする:-
[[Detached]]にfalseを割り当てる。 -
resourceをoutputで記述されたメディアリソースとする。
-
resourceReferenceをresourceへの参照とする。
-
[[resource reference]]にresourceReferenceを割り当てる。 -
timestampをoutputに関連付けられた
EncodedAudioChunkの[[timestamp]]とする。 -
[[timestamp]]にtimestampを割り当てる。 -
outputが認識された
AudioSampleFormatを使用している場合、そのフォーマットを[[format]]に割り当てる。そうでなければnullを[[format]]に割り当てる。 -
[[sample rate]]、[[number of frames]]、[[number of channels]]にoutputで決定された値を割り当てる。
-
-
[[output callback]]をdataで呼び出す。
-
-
- AudioDecoderリセット (exception付き)
-
以下の手順を実行する:
-
[[state]]が"closed"の場合、InvalidStateErrorを投げる。 -
[[state]]に"unconfigured"を設定する。 -
[[codec implementation]]に、以前の設定の出力生成を停止するようシグナルする。 -
[[control message queue]]から制御メッセージをすべて削除する。 -
[[decodeQueueSize]]が0より大きい場合:-
[[decodeQueueSize]]を0に設定する。 -
Dequeueイベントスケジュールアルゴリズムを実行する。
-
-
[[pending flush promises]]内の各promiseについて:-
promiseをexceptionで拒否する。
-
promiseを
[[pending flush promises]]から削除する。
-
-
- AudioDecoderクローズ (exception付き)
-
以下の手順を実行する:
-
AudioDecoderリセットアルゴリズムをexceptionで実行する。
-
[[state]]に"closed"を設定する。 -
[[codec implementation]]をクリアし、関連するシステムリソースを解放する。 -
exceptionが
AbortErrorDOMExceptionでない場合、[[error callback]]をexceptionで呼び出す。
-
4. VideoDecoderインターフェース
[Exposed =(Window ,DedicatedWorker ),SecureContext ]interface :VideoDecoder EventTarget {constructor (VideoDecoderInit );init readonly attribute CodecState state ;readonly attribute unsigned long decodeQueueSize ;attribute EventHandler ondequeue ;undefined configure (VideoDecoderConfig );config undefined decode (EncodedVideoChunk );chunk Promise <undefined >flush ();undefined reset ();undefined close ();static Promise <VideoDecoderSupport >isConfigSupported (VideoDecoderConfig ); };config dictionary {VideoDecoderInit required VideoFrameOutputCallback ;output required WebCodecsErrorCallback ; };error callback =VideoFrameOutputCallback undefined (VideoFrame );output
4.1. 内部スロット
[[control message queue]]-
このコーデックインスタンスで実行されるキュー型の制御メッセージ。詳細は[[control message queue]]参照。
[[message queue blocked]]-
[[control message queue]]の処理が保留中の制御メッセージによってブロックされているかどうかを示す真偽値。詳細は[[message queue blocked]]参照。 [[codec implementation]]-
ユーザーエージェントが提供する基礎となるデコーダー実装。詳細は[[codec implementation]]参照。
[[codec work queue]]-
[[codec implementation]]を参照する並列ステップの実行に使われるparallel queue。詳細は[[codec work queue]]参照。 [[codec saturated]]-
[[codec implementation]]が追加のデコード作業を受け付けられない状態かどうかを示す真偽値。 [[output callback]]-
デコード出力用にコンストラクタで指定されたコールバック。
[[error callback]]-
デコードエラー用にコンストラクタで指定されたコールバック。
[[active decoder config]]-
現在適用されている
VideoDecoderConfig。 [[key chunk required]][[state]]-
この
VideoDecoderの現在のCodecState。 [[decodeQueueSize]]-
保留中のデコード要求の数。この値は基礎となるコーデックが新しい入力を受け付け可能になると減少します。
[[pending flush promises]]-
flush()呼び出しで返された未解決のPromiseのリスト。 [[dequeue event scheduled]]-
dequeueイベントがすでに発火予定かどうかを示す真偽値。イベントスパム防止用。
4.2. コンストラクター
VideoDecoder(init)
-
dを新しい
VideoDecoderオブジェクトとする。 -
[[control message queue]]に新しいキューを割り当てる。 -
[[message queue blocked]]にfalseを割り当てる。 -
[[codec implementation]]にnullを割り当てる。 -
[[codec work queue]]に新しいparallel queueの開始結果を割り当てる。 -
[[codec saturated]]にfalseを割り当てる。 -
[[output callback]]にinit.outputを割り当てる。 -
[[error callback]]にinit.errorを割り当てる。 -
[[active decoder config]]にnullを割り当てる。 -
[[key chunk required]]にtrueを割り当てる。 -
[[state]]に"unconfigured"を割り当てる。 -
[[decodeQueueSize]]に0を割り当てる。 -
[[pending flush promises]]に新しいリストを割り当てる。 -
[[dequeue event scheduled]]にfalseを割り当てる。 -
dを返す。
4.3. 属性
state, 型 CodecState、readonly-
[[state]]の値を返します。 decodeQueueSize, 型 unsigned long、readonly-
[[decodeQueueSize]]の値を返します。 ondequeue, 型 EventHandler
4.4. イベント概要
dequeue-
VideoDecoderで、decodeQueueSizeが減少したときに発火します。
4.5. メソッド
configure(config)-
制御メッセージをキューに追加し、configで記述された通りにビデオデコーダーを設定してチャンクのデコードを行います。
注: このメソッドは、ユーザーエージェントがconfigをサポートしない場合、
NotSupportedErrorを発生させます。著者はまずconfigを使ってisConfigSupported()を呼び出してサポート状況を確認することが推奨されます。ユーザーエージェントは特定のコーデックタイプや設定をサポートする必要はありません。呼び出されたとき、以下の手順を実行します:
-
configが有効なVideoDecoderConfigでない場合、
TypeErrorを投げる。 -
[[state]]が“closed”の場合、InvalidStateErrorを投げる。 -
[[state]]に"configured"を設定する。 -
[[key chunk required]]にtrueを設定する。 -
制御メッセージをキューに追加し、configでデコーダーを設定する。
制御メッセージの実行でデコーダーを設定する場合、以下の手順を実行します:
-
[[message queue blocked]]にtrueを割り当てる。 -
[[codec work queue]]に以下の手順をキューに追加する:-
supportedを、Check Configuration Supportアルゴリズムをconfigで実行した結果とする。
-
supportedが
falseの場合、タスクをキューに追加し、Close VideoDecoderアルゴリズムをNotSupportedErrorで実行し、これ以降の手順を中止する。 -
必要に応じて、
[[codec implementation]]にconfigをサポートする実装を割り当てる。 -
[[codec implementation]]をconfigで設定する。 -
タスクをキューに追加し、以下の手順を実行する:
-
[[message queue blocked]]にfalseを割り当てる。
-
-
-
"processed"を返す。
-
decode(chunk)-
制御メッセージをキューに追加し、指定されたchunkをデコードします。
注: 出力された
VideoFrameが不要になったらすぐにclose()を呼び出すことが推奨されます。基礎となるメディアリソースはVideoDecoderが所有しており、解放しない(またはガベージコレクションまで待つ)とデコードが停止することがあります。注:
VideoDecoderは、フレームが提示順(presentation order)で出力されることを要求します。一部の[[codec implementation]]を使用する場合、ユーザーエージェントが出力を提示順に並べ替える必要があります。呼び出されたとき、以下の手順を実行します:
-
[[state]]が"configured"でない場合、InvalidStateErrorを投げる。 -
[[key chunk required]]がtrueの場合:-
実装者は推奨として、chunkの
[[internal data]]を検査し、本当にkey chunkであることを確認するべきです。不一致が検出された場合、DataErrorを投げる。 -
それ以外の場合、
[[key chunk required]]にfalseを割り当てる。
-
[[decodeQueueSize]]をインクリメントする。 -
制御メッセージをキューに追加し、chunkをデコードする。
制御メッセージの実行でchunkをデコードする場合、以下の手順を実行します:
-
[[codec saturated]]がtrueの場合、"not processed"を返す。 -
chunkのデコードにより
[[codec implementation]]がsaturatedになる場合、[[codec saturated]]にtrueを割り当てる。 -
[[decodeQueueSize]]をデクリメントし、Dequeueイベントスケジュールアルゴリズムを実行する。 -
[[codec work queue]]に以下の手順をキューに追加する:-
[[codec implementation]]でchunkのデコードを試みる。 -
デコードでエラーが発生した場合、タスクをキューに追加し、Close VideoDecoderアルゴリズムを
EncodingErrorで実行し、戻る。 -
[[codec saturated]]がtrueかつ[[codec implementation]]がsaturatedでなくなった場合、タスクをキューに追加し、以下の手順を実行する:-
[[codec saturated]]にfalseを割り当てる。
-
-
decoded outputsを、
[[codec implementation]]から出力された提示順のデコード済みビデオデータのリストとする。 -
decoded outputsが空でない場合、タスクをキューに追加し、Output VideoFrameアルゴリズムをdecoded outputsで実行する。
-
-
"processed"を返す。
-
flush()-
制御メッセージをすべて制御メッセージキューで完了し、すべての出力を発行します。
呼び出されたとき、以下の手順を実行します:
-
[[state]]が"configured"でない場合、拒否されたPromiseをInvalidStateErrorDOMExceptionで返す。 -
[[key chunk required]]にtrueを設定する。 -
promiseを新しいPromiseとする。
-
promiseを
[[pending flush promises]]に追加する。 -
制御メッセージをキューに追加し、コーデックをpromiseでフラッシュする。
-
promiseを返す。
制御メッセージの実行でコーデックをフラッシュする場合、promiseを使って以下の手順を実行します:
-
[[codec work queue]]に以下の手順をキューに追加する:-
[[codec implementation]]にすべての内部保留出力を発行するようにシグナルする。 -
decoded outputsを、
[[codec implementation]]から出力されたデコード済みビデオデータのリストとする。 -
タスクをキューに追加し、以下の手順を実行する:
-
decoded outputsが空でない場合、Output VideoFrame アルゴリズムをdecoded outputsで実行する。
-
promiseを
[[pending flush promises]]から削除する。 -
promiseを解決する。
-
-
-
"processed"を返す。
-
reset()-
設定、制御メッセージ、制御メッセージキュー内のすべてのメッセージ、および保留中のコールバックを即座にリセットします。
呼び出されたとき、Reset VideoDecoderアルゴリズムを
AbortErrorDOMExceptionで実行する。 close()-
保留中のすべての作業を即座に中止し、システムリソースを解放します。
closeは最終的な操作です。
呼び出されたとき、Close VideoDecoderアルゴリズムを
AbortErrorDOMExceptionで実行する。 isConfigSupported(config)-
指定されたconfigがユーザーエージェントでサポートされているかどうかを示すPromiseを返します。
注: 返される
VideoDecoderSupportのconfigには、ユーザーエージェントが認識した辞書メンバーのみが含まれます。 認識されない辞書メンバーは無視されます。著者は、configと提供したconfigを比較することで認識されないメンバーを検出できます。呼び出されたとき、以下の手順を実行します:
-
configが有効なVideoDecoderConfigでない場合、拒否されたPromiseを
TypeErrorで返す。 -
pを新しいPromiseとする。
-
checkSupportQueueを新しいparallel queueの開始結果とする。
-
checkSupportQueueに以下の手順をキューに追加する:
-
supportedをCheck Configuration Supportアルゴリズムをconfigで実行した結果とする。
-
タスクをキューに追加し、以下の手順を実行する:
-
decoderSupportを新しく構築した
VideoDecoderSupportとし、以下のように初期化する:-
configをClone Configurationアルゴリズムをconfigで実行した結果に設定する。 -
supportedをsupportedに設定する。
-
-
pをdecoderSupportで解決する。
-
-
-
pを返す。
-
4.6. アルゴリズム
- デキューイベントのスケジュール
-
-
[[dequeue event scheduled]]がtrueの場合、リターンする。 -
[[dequeue event scheduled]]にtrueを代入する。 -
タスクをキューに追加し、以下のステップを実行する:
-
[[dequeue event scheduled]]にfalseを代入する。
-
- VideoFrameの出力 (with outputs)
-
以下のステップを実行する:
-
outputs の各 output について:
-
output に関連付けられた
timestampとdurationを timestamp および duration とする。 -
displayAspectWidth および displayAspectHeight を未定義とする。
-
displayAspectWidthおよびdisplayAspectHeightが[[active decoder config]]に 存在する場合、それぞれの値を displayAspectWidth および displayAspectHeight に代入する。 -
colorSpace を、コーデック実装によって検出された
VideoColorSpaceとする。検出されない場合はundefinedとする。注: コーデック実装は
VideoColorSpaceをビットストリーム解析によって検出できる。検出はベストエフォートで行われる。検出方法は実装依存かつコーデック固有である。著者はVideoDecoderConfigのcolorSpaceを指定することで検出されたVideoColorSpaceを上書きできる。 -
colorSpaceが[[active decoder config]]に 存在する場合、その値を colorSpace に代入する。 -
frame を、VideoFrame生成 アルゴリズムを output, timestamp, duration, displayAspectWidth, displayAspectHeight, colorSpace, rotation, flip で実行した結果とする。
-
[[output callback]]を frame で呼び出す。
-
-
- VideoDecoderのリセット (with exception)
-
以下のステップを実行する:
-
stateが"closed"の場合、InvalidStateErrorをスローする。 -
stateを"unconfigured"に設定する。 -
[[codec implementation]]に、以前の設定の出力生成を停止するよう通知する。 -
[[control message queue]]からすべての 制御メッセージ を削除する。 -
[[decodeQueueSize]]が 0 より大きい場合:-
[[decodeQueueSize]]を 0 に設定する。 -
デキューイベントのスケジュール アルゴリズムを実行する。
-
-
[[pending flush promises]]の各 promise について:-
promise を exception で reject する。
-
promise を
[[pending flush promises]]から削除する。
-
-
- VideoDecoderのクローズ (with exception)
-
以下のステップを実行する:
-
VideoDecoderのリセットアルゴリズムを exception で実行する。
-
stateを"closed"に設定する。 -
[[codec implementation]]をクリアし、関連する システムリソース を解放する。 -
exception が
AbortErrorDOMExceptionでない場合、[[error callback]]を exception で呼び出す。
-
5. AudioEncoder インターフェイス
[Exposed =(Window ,DedicatedWorker ),SecureContext ]interface :AudioEncoder EventTarget {constructor (AudioEncoderInit );init readonly attribute CodecState state ;readonly attribute unsigned long encodeQueueSize ;attribute EventHandler ondequeue ;undefined configure (AudioEncoderConfig );config undefined encode (AudioData );data Promise <undefined >flush ();undefined reset ();undefined close ;static Promise <AudioEncoderSupport >isConfigSupported (AudioEncoderConfig ); };config dictionary {AudioEncoderInit required EncodedAudioChunkOutputCallback ;output required WebCodecsErrorCallback ; };error callback =EncodedAudioChunkOutputCallback undefined (EncodedAudioChunk ,output optional EncodedAudioChunkMetadata = {});metadata
5.1. 内部スロット
[[control message queue]]-
この コーデック インスタンスで実行される 制御メッセージ の キュー。[[control message queue]] を参照。
[[message queue blocked]]-
[[control message queue]]の処理が保留中の 制御メッセージ によってブロックされているかどうかを示すブール値。[[message queue blocked]] を参照。 [[codec implementation]]-
ユーザーエージェントが提供する基礎となるエンコーダ実装。[[codec implementation]] を参照。
[[codec work queue]]-
[[codec implementation]]を参照する並列ステップを実行するための 並列キュー。[[codec work queue]] を参照。 [[codec saturated]]-
[[codec implementation]]が追加のエンコード作業を受け付けられない場合にtrueとなるブール値。 [[output callback]]-
エンコード出力のためにコンストラクタで与えられるコールバック。
[[error callback]]-
エンコードエラーのためにコンストラクタで与えられるコールバック。
[[active encoder config]]-
現在適用されている
AudioEncoderConfig。 [[active output config]]-
直近で出力された
EncodedAudioChunkのデコード方法を記述するAudioDecoderConfig。 [[state]]-
この
AudioEncoderの現在のCodecState。 [[encodeQueueSize]]-
保留中のエンコード要求の数。この数は基礎となるコーデックが新しい入力を受け付け可能になると減少する。
[[pending flush promises]]-
flush()の呼び出しによって返された未解決のプロミスのリスト。 [[dequeue event scheduled]]-
dequeueイベントがすでに発火予定かどうかを示すブール値。イベントスパムを防ぐために使用される。
5.2. コンストラクタ
AudioEncoder(init)
-
e を新しい
AudioEncoderオブジェクトとする。 -
新しい キュー を
[[control message queue]]に代入する。 -
[[message queue blocked]]にfalseを代入する。 -
[[codec implementation]]にnullを代入する。 -
新しい 並列キュー の開始結果を
[[codec work queue]]に代入する。 -
[[codec saturated]]にfalseを代入する。 -
init.output を
[[output callback]]に代入する。 -
init.error を
[[error callback]]に代入する。 -
[[active encoder config]]にnullを代入する。 -
[[active output config]]にnullを代入する。 -
[[state]]に"unconfigured"を代入する。 -
[[encodeQueueSize]]に0を代入する。 -
新しい リスト を
[[pending flush promises]]に代入する。 -
[[dequeue event scheduled]]にfalseを代入する。 -
e を返す。
5.3. 属性
state, 型 CodecState, 読み取り専用-
[[state]]の値を返す。 encodeQueueSize, 型 unsigned long, 読み取り専用-
[[encodeQueueSize]]の値を返す。 ondequeue, 型 EventHandler-
イベントハンドラーIDL属性であり、イベントハンドラーイベント型は
dequeueである。
5.4. イベント概要
dequeue-
AudioEncoderのencodeQueueSizeが減少したときに発火される。
5.5. メソッド
configure(config)-
制御メッセージをキューに追加し、config で記述された音声データのエンコード用に
オーディオエンコーダを構成する。
注: このメソッドは、ユーザーエージェントが config を サポートしない場合
NotSupportedErrorを発生させる。著者は config でisConfigSupported()を呼び出して事前にサポートを確認することが推奨される。ユーザーエージェントは特定のコーデックタイプや構成をサポートする必要はない。呼び出されたとき、以下のステップを実行する:
-
config が 有効な AudioEncoderConfig でない場合、
TypeErrorをスローする。 -
[[state]]が"closed"の場合、InvalidStateErrorをスローする。 -
[[state]]を"configured"に設定する。 -
制御メッセージをキューに追加し、config で エンコーダを構成する。
制御メッセージの実行でエンコーダを構成する場合、以下のステップを実行する:
-
[[message queue blocked]]にtrueを代入する。 -
[[codec work queue]]に以下のステップをエンキューする:-
supported を Check Configuration Support アルゴリズムを config で実行した結果とする。
-
supported が
falseの場合、タスクをキューに追加し、AudioEncoderのクローズ アルゴリズムをNotSupportedErrorで実行し、これ以降のステップを中止する。 -
必要に応じて
[[codec implementation]]に config をサポートする実装を代入する。 -
[[codec implementation]]を config で構成する。 -
タスクをキューに追加し、以下のステップを実行する:
-
[[message queue blocked]]にfalseを代入する。 -
タスクをキューに追加し、 制御メッセージキューを処理する。
-
-
-
"processed"を返す。
-
encode(data)-
制御メッセージをキューに追加し、指定された data をエンコードする。
呼び出されたとき、以下のステップを実行する:
-
data の
[[Detached]]内部スロットの値がtrueの場合、TypeErrorをスローする。 -
[[state]]が"configured"でない場合、InvalidStateErrorをスローする。 -
dataClone を AudioDataの複製 アルゴリズムを data で実行した結果とする。
-
[[encodeQueueSize]]をインクリメントする。 -
制御メッセージをキューに追加し、 dataClone をエンコードする。
制御メッセージの実行でデータをエンコードする場合、以下のステップを実行する:
-
[[codec saturated]]がtrueの場合、"not processed"を返す。 -
エンコードによって
[[codec implementation]]が saturated になる場合、[[codec saturated]]にtrueを代入する。 -
[[encodeQueueSize]]をデクリメントし、 デキューイベントのスケジュール アルゴリズムを実行する。 -
[[codec work queue]]に以下のステップをエンキューする:-
[[codec implementation]]を使って media resource(dataCloneで記述される)を エンコードしようと試みる。 -
エンコードでエラーが発生した場合、タスクをキューに追加し、 AudioEncoderのクローズアルゴリズムを
EncodingErrorで実行し、リターンする。 -
[[codec saturated]]がtrueで、かつ[[codec implementation]]が saturated でなくなった場合、 タスクをキューに追加し、以下のステップを実行する:-
[[codec saturated]]にfalseを代入する。
-
-
encoded outputs を リスト型の エンコード済み音声データ出力(
[[codec implementation]]から出力されたもの)とする。 -
encoded outputs が空でない場合、タスクをキューに追加し、 EncodedAudioChunksの出力 アルゴリズムを encoded outputs で実行する。
-
-
"processed"を返す。
-
flush()-
制御メッセージを
control
message queue で全て完了し、すべての出力を発行する。
呼び出されたとき、以下のステップを実行する:
-
[[state]]が"configured"でない場合、 rejectされたpromise(InvalidStateErrorDOMException)を返す。 -
promise を新しい Promise とする。
-
promise を
[[pending flush promises]]に追加する。 -
制御メッセージをキューに追加し、promise でコーデックをフラッシュする。
-
promise を返す。
制御メッセージの実行でコーデックをフラッシュする場合、promise で以下のステップを実行する:
-
[[codec work queue]]に以下のステップをエンキューする:-
[[codec implementation]]に 内部保留出力 のすべてを発行するよう通知する。 -
encoded outputs を リスト型の エンコード済み音声データ出力(
[[codec implementation]]から出力されたもの)とする。 -
タスクをキューに追加し、以下のステップを実行する:
-
encoded outputs が空でない場合、 EncodedAudioChunksの出力 アルゴリズムを encoded outputs で実行する。
-
promise を
[[pending flush promises]]から削除する。 -
promise を resolve する。
-
-
-
"processed"を返す。
-
reset()-
構成、制御メッセージ
(control
message queue内)、
保留中のコールバックを含むすべての状態を即座にリセットする。
呼び出されたとき、AudioEncoderのリセットアルゴリズムを
AbortErrorDOMExceptionで実行する。 close()-
保留中の作業を即座に中止し、システムリソースを解放する。
closeは最終的な操作である。
呼び出されたとき、AudioEncoderのクローズアルゴリズムを
AbortErrorDOMExceptionで実行する。 isConfigSupported(config)-
指定された config がユーザーエージェントでサポートされているかどうかを示す promise を返す。
注: 返される
AudioEncoderSupportのconfigには、ユーザーエージェントが認識した辞書メンバーのみが含まれる。認識されない辞書メンバーは無視される。 著者はconfigと提供した config を比較することで認識されないメンバーを検出できる。呼び出されたとき、以下のステップを実行する:
-
config が 有効な AudioEncoderConfig でない場合、 rejectされたpromise(
TypeError)を返す。 -
p を新しい Promise とする。
-
checkSupportQueue を新しい 並列キューの開始結果とする。
-
checkSupportQueue に以下のステップをエンキューする:
-
supported を Check Configuration Support アルゴリズムを config で実行した結果とする。
-
タスクをキューに追加し、以下のステップを実行する:
-
encoderSupport を新しく構築した
AudioEncoderSupportとし、以下のように初期化する:-
configを Clone Configuration アルゴリズムを config で実行した結果に設定する。 -
supportedを supported に設定する。
-
-
p を encoderSupport で resolve する。
-
-
-
p を返す。
-
5.6. アルゴリズム
- デキューイベントのスケジュール
-
-
[[dequeue event scheduled]]がtrueの場合、リターンする。 -
[[dequeue event scheduled]]にtrueを代入する。 -
タスクをキューに追加し、以下のステップを実行する:
-
[[dequeue event scheduled]]にfalseを代入する。
-
- EncodedAudioChunkの出力 (with outputs)
-
以下のステップを実行する:
-
outputs の各 output について:
-
chunkInit を、以下のキーを持つ
EncodedAudioChunkInitとする: -
chunk を chunkInit で構築した新しい
EncodedAudioChunkとする。 -
chunkMetadata を新しい
EncodedAudioChunkMetadataとする。 -
encoderConfig を
[[active encoder config]]とする。 -
outputConfig を output を記述する新しい
AudioDecoderConfigとし、以下のように初期化する:-
encoderConfig.
sampleRateを outputConfig.sampleRateに代入する。 -
encoderConfig.
numberOfChannelsを outputConfig.numberOfChannelsに代入する。 -
outputConfig.
descriptionに[[codec implementation]]によって決定されるコーデック固有のバイト列を代入する。ユーザーエージェントは、提供された description が 出力の正しいデコードに使用できることを 必須 とする。注: description のコーデック固有要件は [WEBCODECS-CODEC-REGISTRY] で記述されている。
-
outputConfig と
[[active output config]]が 等価な辞書でない場合:-
outputConfig を chunkMetadata.
decoderConfigに代入する。 -
outputConfig を
[[active output config]]に代入する。
-
-
[[output callback]]を chunk と chunkMetadata で呼び出す。
-
-
- AudioEncoderのリセット (with exception)
-
以下のステップを実行する:
-
[[state]]が"closed"の場合、InvalidStateErrorをスローする。 -
[[state]]を"unconfigured"に設定する。 -
[[active encoder config]]をnullに設定する。 -
[[active output config]]をnullに設定する。 -
[[codec implementation]]に、以前の構成の出力生成を停止するよう通知する。 -
[[control message queue]]からすべての 制御メッセージ を削除する。 -
[[encodeQueueSize]]が 0 より大きい場合:-
[[encodeQueueSize]]を 0 に設定する。 -
デキューイベントのスケジュール アルゴリズムを実行する。
-
-
[[pending flush promises]]の各 promise について:-
promise を exception で reject する。
-
promise を
[[pending flush promises]]から削除する。
-
-
- AudioEncoderのクローズ (with exception)
-
以下のステップを実行する:
-
AudioEncoderのリセットアルゴリズムを exception で実行する。
-
[[state]]を"closed"に設定する。 -
[[codec implementation]]をクリアし、関連する システムリソース を解放する。 -
exception が
AbortErrorDOMExceptionでない場合、[[error callback]]を exception で呼び出す。
-
5.7. EncodedAudioChunkMetadata
以下のメタデータ辞書は、EncodedAudioChunkOutputCallback
で関連する
EncodedAudioChunk
とともに発行される。
dictionary {EncodedAudioChunkMetadata AudioDecoderConfig decoderConfig ; };
decoderConfig, 型 AudioDecoderConfig-
著者が関連する
EncodedAudioChunkのデコードに 任意 で使用できるAudioDecoderConfig。
6. VideoEncoder インターフェイス
[Exposed =(Window ,DedicatedWorker ),SecureContext ]interface :VideoEncoder EventTarget {constructor (VideoEncoderInit );init readonly attribute CodecState state ;readonly attribute unsigned long encodeQueueSize ;attribute EventHandler ondequeue ;undefined configure (VideoEncoderConfig );config undefined encode (VideoFrame ,frame optional VideoEncoderEncodeOptions = {});options Promise <undefined >flush ();undefined reset ();undefined close ();static Promise <VideoEncoderSupport >isConfigSupported (VideoEncoderConfig ); };config dictionary {VideoEncoderInit required EncodedVideoChunkOutputCallback ;output required WebCodecsErrorCallback ; };error callback =EncodedVideoChunkOutputCallback undefined (EncodedVideoChunk ,chunk optional EncodedVideoChunkMetadata = {});metadata
6.1. 内部スロット
[[control message queue]]-
このキューは、この制御メッセージがこのコーデックインスタンス上で実行されるためのものです。参照: [[control message queue]]。
[[message queue blocked]]-
保留中の制御メッセージによって
[[control message queue]]の処理がブロックされているかどうかを示す真偽値。参照: [[message queue blocked]]。 [[codec implementation]]-
ユーザーエージェントが提供する基盤となるエンコーダ実装。参照: [[codec implementation]]。
[[codec work queue]]-
並列キューで、
[[codec implementation]]を参照する並列ステップを実行するために使用されます。参照: [[codec work queue]]。 [[codec saturated]]-
[[codec implementation]]が追加のエンコード作業を受け付けられない状態であるかどうかを示す真偽値。 [[output callback]]-
エンコード済み出力用に構築時に渡されるコールバック。
[[error callback]]-
エンコードエラー用に構築時に渡されるコールバック。
[[active encoder config]]-
現在適用されている
VideoEncoderConfig。 [[active output config]]-
直近に出力された
EncodedVideoChunkをどのようにデコードするかを記述するVideoDecoderConfig。 [[state]]-
この
VideoEncoderの現在のCodecState。 [[encodeQueueSize]]-
保留中のエンコード要求の数。基盤となるコーデックが新しい入力を受け入れるとこの数は減少します。
[[pending flush promises]]-
flush()の呼び出しによって返された未解決の Promise のリスト。 [[dequeue event scheduled]]-
dequeueイベントが既に発火予定であるかを示す真偽値。イベントの連続発火を避けるために使用されます。 [[active orientation]]-
configure() の後に
encode()に渡された最初のVideoFrameの[[flip]]と[[rotation]]を示す整数と真偽の組です。
6.2. コンストラクター
VideoEncoder(init)
-
e を新しい
VideoEncoderオブジェクトとする。 -
新しいキューを
[[control message queue]]に割り当てる。 -
falseを[[message queue blocked]]に割り当てる。 -
nullを[[codec implementation]]に割り当てる。 -
新しい並列キューを開始した結果を
[[codec work queue]]に割り当てる。 -
falseを[[codec saturated]]に割り当てる。 -
init.output を
[[output callback]]に割り当てる。 -
init.error を
[[error callback]]に割り当てる。 -
nullを[[active encoder config]]に割り当てる。 -
nullを[[active output config]]に割り当てる。 -
"unconfigured"を[[state]]に割り当てる。 -
0を[[encodeQueueSize]]に割り当てる。 -
新しいリストを
[[pending flush promises]]に割り当てる。 -
falseを[[dequeue event scheduled]]に割り当てる。 -
e を返す。
6.3. 属性
state, of type CodecState, readonly-
[[state]]の値を返す。 encodeQueueSize, of type unsigned long, readonly-
[[encodeQueueSize]]の値を返す。 ondequeue, of type EventHandler-
そのイベントハンドラのイベントタイプが
dequeueであるイベントハンドラIDL属性です。
6.4. イベント概要
dequeue-
VideoEncoderにおいてencodeQueueSizeが減少したときに発火します。
6.5. メソッド
configure(config)-
制御メッセージをキューに追加して、configで記述されたとおりにビデオフレームをエンコードするようビデオエンコーダを構成します。
NOTE: ユーザーエージェントが config をサポートしていない場合、このメソッドは
NotSupportedErrorを発生させます。作者はまずisConfigSupported()を config で呼び出してサポートを確認することが推奨されます。ユーザーエージェントは特定のコーデックタイプや構成を必ずサポートする必要はありません。呼び出されたとき、次の手順を実行します:
-
もし config が有効な VideoEncoderConfig でない場合、
TypeErrorを投げる。 -
もし
[[state]]が"closed"の場合、InvalidStateErrorを投げる。 -
[[state]]を"configured"に設定する。 -
[[active orientation]]をnullに設定する。 -
制御メッセージをキューに追加して、config を使用してエンコーダを構成する。
エンコーダを構成するための制御メッセージを実行するとは、次の手順を行うことを意味します:
-
trueを[[message queue blocked]]に割り当てる。 -
以下の手順を
[[codec work queue]]にエンキューする:-
supported を、Check Configuration Support アルゴリズムを config で実行した結果とする。
-
もし supported が
falseであれば、タスクをキューに追加して Close VideoEncoder アルゴリズムをNotSupportedErrorで実行し、これらの手順を中止する。 -
必要であれば、
[[codec implementation]]に config をサポートする実装を割り当てる。 -
[[codec implementation]]を config で構成する。 -
タスクをキューに追加して次の手順を実行する:
-
falseを[[message queue blocked]]に割り当てる。 -
タスクをキューに追加して 制御メッセージキューを処理する。
-
-
-
"processed"を返す。
-
encode(frame, options)-
制御メッセージをキューに追加して、与えられた frame をエンコードします。
呼び出されたとき、次の手順を実行します:
-
もし frame の
[[Detached]]内部スロットの値がtrueであれば、TypeErrorを投げる。 -
もし
[[state]]が"configured"でなければ、InvalidStateErrorを投げる。 -
もし
[[active orientation]]がnullでなく、かつ frame の[[rotation]]と[[flip]]と一致しない場合、DataErrorを投げる。 -
もし
[[active orientation]]がnullであれば、それを frame の[[rotation]]と[[flip]]に設定する。 -
frameClone を、Clone VideoFrame アルゴリズムを frame で実行した結果とする。
-
[[encodeQueueSize]]をインクリメントする。 -
制御メッセージをキューに追加して frameClone をエンコードする。
フレームをエンコードするための制御メッセージを実行するとは、次の手順を行うことを意味します:
-
もし
[[codec saturated]]がtrueであれば、"not processed"を返す。 -
もしエンコードすることで
[[codec implementation]]が saturated になる場合、[[codec saturated]]にtrueを割り当てる。 -
[[encodeQueueSize]]をデクリメントし、Schedule Dequeue Event アルゴリズムを実行する。 -
以下の手順を
[[codec work queue]]にエンキューする:-
[[codec implementation]]を用いて frameClone を options に従ってエンコードしようと試みる。 -
もしエンコードがエラーになる場合、タスクをキューに追加して Close VideoEncoder アルゴリズムを
EncodingErrorで実行し、戻る。 -
もし
[[codec saturated]]がtrueであり、かつ[[codec implementation]]がもはや saturated でない場合、タスクをキューに追加して次の手順を実行する:-
falseを[[codec saturated]]に割り当てる。
-
-
encoded outputs を、
[[codec implementation]]によって出力されたエンコード済みビデオデータ出力の リストとする。 -
もし encoded outputs が空でなければ、タスクをキューに追加して Output EncodedVideoChunks アルゴリズムを encoded outputs で実行する。
-
-
"processed"を返す。
-
flush()-
制御メッセージキュー内のすべての制御メッセージを完了し、すべての出力を生成します。
呼び出されたとき、次の手順を実行します:
-
もし
[[state]]が"configured"でなければ、a promise rejected withInvalidStateErrorDOMExceptionを返す。 -
新しい Promise を promise とする。
-
promise を
[[pending flush promises]]に追加する。 -
制御メッセージをキューに追加して、promise とともにコーデックをフラッシュする。
-
promise を返す。
コーデックをフラッシュするための制御メッセージを実行するとは、次の手順を promise とともに行うことを意味します:
-
以下の手順を
[[codec work queue]]にエンキューする:-
[[codec implementation]]に対して、すべての内部保留出力 (internal pending outputs) を出力するよう信号を送る。 -
encoded outputs を、
[[codec implementation]]によって出力されたエンコード済みビデオデータ出力の リストとする。 -
タスクをキューに追加して次の手順を実行する:
-
もし encoded outputs が空でなければ、Output EncodedVideoChunks アルゴリズムを encoded outputs で実行する。
-
promise を
[[pending flush promises]]から削除する。 -
promise を解決する。
-
-
-
"processed"を返す。
-
reset()-
構成、制御メッセージキュー内の制御メッセージ、およびすべての保留中コールバックを含むすべての状態を即座にリセットします。
呼び出されたとき、Reset VideoEncoder アルゴリズムを
AbortErrorDOMExceptionで実行します。 close()-
保留中のすべての作業を即座に中止し、システムリソース を解放します。Close は最終的な操作です。
呼び出されたとき、Close VideoEncoder アルゴリズムを
AbortErrorDOMExceptionで実行します。 isConfigSupported(config)-
指定された config がユーザーエージェントによってサポートされているかどうかを示す Promise を返します。
NOTE: 返される
VideoEncoderSupportのconfigにはユーザーエージェントが認識した辞書メンバーのみが含まれます。認識されない辞書メンバーは無視されます。作者は、自身が提供した config と返されたconfigを比較して、認識されていない辞書メンバーを検出できます。呼び出されたとき、次の手順を実行します:
-
もし config が有効な VideoEncoderConfig でない場合、a promise rejected with
TypeErrorを返す。 -
新しい Promise を p とする。
-
新しい 並列キュー を開始した結果を checkSupportQueue とする。
-
以下の手順を checkSupportQueue にエンキューする:
-
supported を、Check Configuration Support アルゴリズムを config で実行した結果とする。
-
タスクをキューに追加して次の手順を実行する:
-
encoderSupport を新しく構築された
VideoEncoderSupportとし、以下のように初期化する:-
configを、Clone Configuration アルゴリズムを config で実行した結果に設定する。 -
supportedを supported に設定する。
-
-
-
p を encoderSupport で解決する。
-
-
p を返す。
-
6.6. アルゴリズム
- Schedule Dequeue Event
-
-
もし
[[dequeue event scheduled]]がtrueと等しいなら、戻る。 -
trueを[[dequeue event scheduled]]に割り当てる。 -
タスクをキューに追加して、次の手順を実行するタスクを登録する:
-
falseを[[dequeue event scheduled]]に割り当てる。
-
- Output EncodedVideoChunks (with outputs)
-
次の手順を実行する:
-
outputs の各 output について:
-
chunkInit を、次のキーを持つ
EncodedVideoChunkInitとする:-
dataは output からのエンコード済みビデオデータを含む。 -
typeは output のEncodedVideoChunkTypeである。 -
timestampは output に関連付けられた[[timestamp]](VideoFrameから)である。 -
durationは output に関連付けられた[[duration]](VideoFrameから)である。
-
-
chunk を、chunkInit で構築された新しい
EncodedVideoChunkとする。 -
chunkMetadata を新しい
EncodedVideoChunkMetadataとする。 -
encoderConfig を
[[active encoder config]]とする。 -
outputConfig を output を記述する
VideoDecoderConfigとする。outputConfig を次のように初期化する:-
encoderConfig.codecをoutputConfig.codecに割り当てる。 -
encoderConfig.widthをoutputConfig.codedWidthに割り当てる。 -
encoderConfig.heightをoutputConfig.codedHeightに割り当てる。 -
encoderConfig.displayWidthをoutputConfig.displayAspectWidthに割り当てる。 -
encoderConfig.displayHeightをoutputConfig.displayAspectHeightに割り当てる。 -
[[rotation]]を、output に関連付けられたVideoFrameから取り出してoutputConfig.rotationに割り当てる。 -
[[flip]]を、output に関連付けられたVideoFrameから取り出してoutputConfig.flipに割り当てる。 -
outputConfigの残りのキーは[[codec implementation]]によって決定されるものを割り当てる。ユーザーエージェントは MUST、outputConfig が output を正しくデコードするために十分に記述されていることを保証しなければならない。NOTE:
descriptionを埋めるためのコーデック固有の要件は [WEBCODECS-CODEC-REGISTRY] に記載されている。
-
-
もし outputConfig と
[[active output config]]が等しくない(equal dictionaries でない)場合:-
outputConfig を chunkMetadata.
decoderConfigに割り当てる。 -
outputConfig を
[[active output config]]に割り当てる。
-
-
もし encoderConfig.
scalabilityModeが複数の temporal layers を記述している場合:-
svc を新しい
SvcOutputMetadataインスタンスとする。 -
temporal_layer_id を、output の temporal layer を示すゼロベースのインデックスとする。
-
temporal_layer_id を svc.
temporalLayerIdに割り当てる。 -
svc を chunkMetadata.
svcに割り当てる。
-
-
もし encoderConfig.
alphaが"keep"に設定されている場合:-
alphaSideData を、output に含まれるエンコード済みアルファデータとする。
-
alphaSideData を chunkMetadata.
alphaSideDataに割り当てる。
-
-
[[output callback]]を chunk と chunkMetadata を引数に呼び出す。
-
-
- Reset VideoEncoder (with exception)
-
次の手順を実行する:
-
もし
[[state]]が"closed"であれば、InvalidStateErrorを投げる。 -
[[state]]を"unconfigured"に設定する。 -
[[active encoder config]]をnullに設定する。 -
[[active output config]]をnullに設定する。 -
[[codec implementation]]に前の構成に対する出力を停止するよう信号を送る。 -
[[control message queue]]からすべての control messages を削除する。 -
もし
[[encodeQueueSize]]が 0 より大きいなら:-
[[encodeQueueSize]]を 0 に設定する。 -
Schedule Dequeue Event アルゴリズムを実行する。
-
-
[[pending flush promises]]の各 promise について:-
promise を exception で拒否する。
-
promise を
[[pending flush promises]]から削除する。
-
-
- Close VideoEncoder (with exception)
-
次の手順を実行する:
-
Reset VideoEncoder アルゴリズムを exception を使って実行する。
-
[[state]]を"closed"に設定する。 -
[[codec implementation]]をクリアし、関連する system resources を解放する。 -
もし exception が
AbortErrorではないDOMExceptionの場合、[[error callback]]を exception を用いて呼び出す。
-
6.7. EncodedVideoChunkMetadata
次のメタデータ辞書は、対応するEncodedVideoChunk
とともに EncodedVideoChunkOutputCallback
によって出力されます。
dictionary {EncodedVideoChunkMetadata VideoDecoderConfig decoderConfig ;SvcOutputMetadata svc ;BufferSource alphaSideData ; };dictionary {SvcOutputMetadata unsigned long temporalLayerId ; };
decoderConfig, of type VideoDecoderConfig-
作者は、関連する
EncodedVideoChunkのデコードに使用するために、このVideoDecoderConfigを使用してもよい(MAY)。 svc, of type SvcOutputMetadata-
構成された
scalabilityModeに関して、このEncodedVideoChunkを記述するメタデータの集合。 alphaSideData, of type BufferSource-
追加のアルファチャンネルデータを含む
BufferSource。 temporalLayerId, of type unsigned long-
関連する
EncodedVideoChunkの temporal layer を識別する数値。
7. 設定
7.1. 設定サポートの確認(config付き)
次の手順を実行する:-
もし config.codec にある codec string が valid codec string ではない、あるいはユーザーエージェントによって認識されない場合、
falseを返す。 -
もし config が
AudioDecoderConfigまたはVideoDecoderConfigであり、ユーザーエージェントが codec を提供できず、config.codec に示される(存在する場合の)正確なプロファイル、レベル、制約ビットをデコードできないなら、falseを返す。 -
もし config が
AudioEncoderConfigまたはVideoEncoderConfigの場合:-
もし config.codec の codec string にプロファイルが含まれており、ユーザーエージェントがそのプロファイルをエンコードできる codec を提供できないなら、
falseを返す。 -
もし config.codec の codec string にレベルが含まれており、ユーザーエージェントが config.codec に示されたレベル以下にエンコードできる codec を提供できないなら、
falseを返す。 -
もし config.codec の codec string に制約ビットが含まれており、ユーザーエージェントが config.codec に示された制約以上に制約されたビットストリームを生成できる codec を提供できないなら、
falseを返す。
-
-
もしユーザーエージェントが、含まれていないキーに対する適用されるデフォルト値を含めて、config のすべての項目をサポートする codec を提供できるなら、
trueを返す。NOTE:
AudioDecoderConfig、VideoDecoderConfig、AudioEncoderConfig、 およびVideoEncoderConfigはそれぞれ対応する構成エントリとデフォルトを定義する。NOTE: ハードウェアが変更された場合(例: 外付けGPUが抜かれた)や必須のハードウェア資源が枯渇した場合、特定の構成のサポートは動的に変化する可能性がある。ユーザーエージェントは、その時点で利用可能な資源に基づいてベストエフォートでサポートを記述する。
-
それ以外の場合、
falseを返す。
7.2. 設定の複製(config付き)
NOTE: このアルゴリズムは、ユーザーエージェントがその辞書型の一部として認識する辞書メンバーのみをコピーします。
次の手順を実行する:
-
dictType を config の辞書型とする。
-
clone を dictType の新しい空のインスタンスとする。
-
dictType に定義されている各辞書メンバー m について:
-
もし m が config に存在しないなら、続行(continue)する。
-
もし
config[m]がネストされた辞書であれば、再帰的に Clone Configuration アルゴリズムをconfig[m]に対して実行した結果をclone[m]に設定する。 -
それ以外の場合、
config[m]のコピーをclone[m]に割り当てる。
-
Note: これは「ディープコピー」を実装する。これらの構成オブジェクトは非同期操作の入力として頻繁に使用されるため、コピーすることで操作が進行中に元のオブジェクトを変更しても、その操作の結果は変わらないことを保証する。
7.3. 設定サポートの通知
7.3.1. AudioDecoderSupport
dictionary {AudioDecoderSupport boolean supported ;AudioDecoderConfig config ; };
supported, of type boolean-
該当する
configがユーザーエージェントによりサポートされているかどうかを示すブール値。 config, of type AudioDecoderConfig-
ユーザーエージェントが
AudioDecoderConfigを評価するために使用する構成。
7.3.2. VideoDecoderSupport
dictionary {VideoDecoderSupport boolean supported ;VideoDecoderConfig config ; };
supported, of type boolean-
該当する
configがユーザーエージェントによりサポートされているかどうかを示すブール値。 config, of type VideoDecoderConfig-
ユーザーエージェントが
VideoDecoderConfigを評価するために使用する構成。
7.3.3. AudioEncoderSupport
dictionary {AudioEncoderSupport boolean supported ;AudioEncoderConfig config ; };
supported, of type boolean-
該当する
configがユーザーエージェントによりサポートされているかどうかを示すブール値。 config, of type AudioEncoderConfig-
ユーザーエージェントが
AudioEncoderConfigを評価するために使用する構成。
7.3.4. VideoEncoderSupport
dictionary {VideoEncoderSupport boolean supported ;VideoEncoderConfig config ; };
supported, of type boolean-
該当する
configがユーザーエージェントによりサポートされているかどうかを示すブール値。 config, of type VideoEncoderConfig-
ユーザーエージェントが
VideoEncoderConfigを評価するために使用する構成。
7.4. Codec String
codec string は、エンコードまたはデコードに使用される特定のコーデック形式を記述します。
A valid codec string MUST meet the following conditions.
-
関連するコーデック仕様に従って有効である(下の例を参照)。
-
単一のコーデックを記述していること。
-
プロファイル、レベル、および制約ビットを定義するコーデックについて、これらに関して曖昧さがないこと。
NOTE: 他のメディア仕様では、codec string は歴史的に
MIME
typeの "codecs=" パラメータとともに使用されていました
(isTypeSupported()、
canPlayType())
[RFC6381]。
この仕様では、符号化されたメディアはコンテナ化されていないため、'codecs' パラメータの値のみが受け付けられます。
NOTE: レベルや制約ビットを定義するコーデックのエンコーダは、これらのパラメータに対して柔軟性を持つことができるが、要求されたより高いレベルを持つ、または要求よりも制約が緩いビットストリームを生成することはしない。
codec string の形式と意味は、[WEBCODECS-CODEC-REGISTRY] に列挙されたコーデック登録によって定義されます。準拠実装は、任意の組み合わせのコーデック登録、またはまったくサポートしないことができます。
7.5. AudioDecoderConfig
dictionary {AudioDecoderConfig required DOMString codec ; [EnforceRange ]required unsigned long sampleRate ; [EnforceRange ]required unsigned long numberOfChannels ;AllowSharedBufferSource description ; };
`AudioDecoderConfig` が有効な AudioDecoderConfig であるかを確認するには、次の手順を実行する:
-
もし
codecが先頭および末尾の ASCII 空白を取り除いた後に空文字列であれば、falseを返す。 -
もし
descriptionが[detached]であれば、falseを返す。 -
trueを返す。
codec, of type DOMStringconfig.codec に含まれる codec string でコーデックを記述する。sampleRate, of type unsigned long- 1秒あたりのフレームサンプル数。
numberOfChannels, of type unsigned long- オーディオチャンネル数。
description, of type AllowSharedBufferSource-
コーデック固有のバイト列(一般に extradata と呼ばれる)。
NOTE: [WEBCODECS-CODEC-REGISTRY] の登録は、このシーケンスをどのように/どうやって設定するかを、提供された
codecに対応して記述している。
7.6. VideoDecoderConfig
dictionary {VideoDecoderConfig required DOMString codec ;AllowSharedBufferSource description ; [EnforceRange ]unsigned long codedWidth ; [EnforceRange ]unsigned long codedHeight ; [EnforceRange ]unsigned long displayAspectWidth ; [EnforceRange ]unsigned long displayAspectHeight ;VideoColorSpaceInit colorSpace ;HardwareAcceleration hardwareAcceleration = "no-preference";boolean optimizeForLatency ;double rotation = 0;boolean flip =false ; };
`VideoDecoderConfig`
が valid
VideoDecoderConfig であるかを確認するには、次の手順を実行する:
-
もし
codecが 先頭および末尾の ASCII 空白を取り除いた後 に空文字列であれば、falseを返す。 -
もし
codedWidthまたはcodedHeightのどちらか一方のみが存在し、もう一方が存在しない場合、falseを返す。 -
もし
codedWidth= 0 またはcodedHeight= 0 であれば、falseを返す。 -
もし
displayAspectWidthまたはdisplayAspectHeightのどちらか一方のみが存在し、もう一方が存在しない場合、falseを返す。 -
もし
displayAspectWidth= 0 またはdisplayAspectHeight= 0 であれば、falseを返す。 -
もし
descriptionが [detached] であれば、falseを返す。 -
trueを返す。
codec, of type DOMStringconfig.codec に含まれる codec string でコーデックを記述する。description, of type AllowSharedBufferSource-
コーデック固有のバイト列(一般に extradata と呼ばれる)。
NOTE: [WEBCODECS-CODEC-REGISTRY] の登録は、提供された
codecに対応して、このシーケンスをどのように作成/設定するかを記述している。 codedWidth, of type unsigned long- ピクセル単位での VideoFrame の幅(非表示のパディングを含む場合があり)、および潜在的な比率調整を考慮する前の値。
codedHeight, of type unsigned long-
ピクセル単位での VideoFrame の高さ(非表示のパディングを含む場合があり)、および潜在的な比率調整を考慮する前の値。
NOTE:
codedWidthおよびcodedHeightは、[[codec implementation]]を選択する際に使用される。 displayAspectWidth, of type unsigned long- 表示時の VideoFrame のアスペクト比の水平方向の寸法。
displayAspectHeight, of type unsigned long-
表示時の VideoFrame のアスペクト比の垂直方向の寸法。
NOTE:
displayWidthおよびdisplayHeightは、displayAspectWidthおよびdisplayAspectHeightと異なることがあるが、スケーリングが適用されるときに作成された VideoFrame の表示時には比率が同じである。 colorSpace, of type VideoColorSpaceInit-
この
VideoFrameに関連付けられた VideoFrame のcolorSpaceを設定する。
もしcolorSpaceが 存在する 場合、提供された値はビットストリームのインバンド値を上書きする。 hardwareAcceleration, of type HardwareAcceleration, defaulting to"no-preference"-
このコーデックのハードウェアアクセラレーションを構成するヒント。詳しくは
HardwareAccelerationを参照。 optimizeForLatency, of type boolean-
選択されたデコーダが、SHOULD 出力される VideoFrame の前にデコードしなければならない
EncodedVideoChunkの数を最小化するように設定されることを示すヒント。NOTE: ユーザーエージェントやハードウェアの制約に加えて、一部のコーデックビットストリームは出力を生成する前に最小限の入力数を必要とする。
rotation, of type double, defaulting to0-
デコードされたフレームの
rotation属性を設定する。 flip, of type boolean, defaulting tofalse-
デコードされたフレームの
flip属性を設定する。
7.7. AudioEncoderConfig
dictionary {AudioEncoderConfig required DOMString codec ; [EnforceRange ]required unsigned long sampleRate ; [EnforceRange ]required unsigned long numberOfChannels ; [EnforceRange ]unsigned long long bitrate ;BitrateMode bitrateMode = "variable"; };
NOTE: AudioEncoderConfig
に対するコーデック固有の拡張は、[WEBCODECS-CODEC-REGISTRY] の登録で説明されている。
`AudioEncoderConfig` が valid AudioEncoderConfig であるかを確認するには、次の手順を実行する:
-
もし
codecが先頭および末尾の ASCII 空白を取り除いた後に空文字列であれば、falseを返す。 -
もし
AudioEncoderConfigがコーデック固有の拡張を持ち、対応する [WEBCODECS-CODEC-REGISTRY] の登録がその拡張が有効かどうかを検証する手順を定義している場合、その手順を実行した結果を返す。 -
もし
sampleRateまたはnumberOfChannelsが 0 と等しい場合、falseを返す。 -
trueを返す。
codec, of type DOMStringconfig.codec に含まれる codec string でコーデックを記述する。sampleRate, of type unsigned long- 1秒あたりのフレームサンプル数。
numberOfChannels, of type unsigned long- オーディオチャンネル数。
bitrate, of type unsigned long long- エンコードされたオーディオの平均ビットレート(ビット毎秒)。
bitrateMode, of type BitrateMode, defaulting to"variable"-
エンコーダを
constantまたはvariableビットレートを使用するよう設定する([MEDIASTREAM-RECORDING] に従う)。NOTE: すべてのオーディオコーデックが特定の
BitrateModeをサポートするわけではない。作者はisConfigSupported()を呼び出して config を検証することを推奨される。
7.8. VideoEncoderConfig
dictionary {VideoEncoderConfig required DOMString codec ; [EnforceRange ]required unsigned long width ; [EnforceRange ]required unsigned long height ; [EnforceRange ]unsigned long displayWidth ; [EnforceRange ]unsigned long displayHeight ; [EnforceRange ]unsigned long long bitrate ;double framerate ;HardwareAcceleration hardwareAcceleration = "no-preference";AlphaOption alpha = "discard";DOMString scalabilityMode ;VideoEncoderBitrateMode bitrateMode = "variable";LatencyMode latencyMode = "quality";DOMString contentHint ; };
NOTE: VideoEncoderConfig
に対するコーデック固有の拡張は、対応する登録が [WEBCODECS-CODEC-REGISTRY] に記述されている。
次の手順を実行して、VideoEncoderConfig
が valid
VideoEncoderConfig であるかを確認する:
-
もし
codecが 先頭および末尾の ASCII 空白を取り除いた後 に空文字列であれば、falseを返す。 -
もし
displayWidth= 0 またはdisplayHeight= 0 であれば、falseを返す。 -
trueを返す。
codec, of type DOMStringconfig.codec に含まれる codec string でコーデックを記述する。width, of type unsigned long-
出力される
EncodedVideoChunkの符号化幅(ピクセル単位)、表示アスペクト比の調整を適用する前の値。エンコーダは、MUST この値と異なる
VideoFrameの[[visible width]]をスケーリングする。 height, of type unsigned long-
出力される
EncodedVideoChunkの符号化高さ(ピクセル単位)、表示アスペクト比の調整を適用する前の値。エンコーダは、MUST この値と異なる
VideoFrameの[[visible height]]をスケーリングする。
displayWidth, of type unsigned long-
出力される
EncodedVideoChunkの意図された表示幅(ピクセル単位)。 指定されていない場合はwidthを既定値とする。 displayHeight, of type unsigned long-
出力される
EncodedVideoChunkの意図された表示高さ(ピクセル単位)。 指定されていない場合はwidthを既定値とする。
displayWidth
または
displayHeight
が width
および height
と異なることを示す場合、それはチャンクがデコード後に最終的な表示アスペクト比に到達するようスケーリングされることを意味する。
多くのコーデックではこれは単に透過的な情報に過ぎないが、いくつかのコーデックはビットストリーム内に表示サイズを含めることがある。
bitrate, of type unsigned long long-
エンコードされたビデオの平均ビットレート(ビット毎秒)。
NOTE: 作者はレート制御のために、追加で
framerateを提供することが推奨される。 framerate, of type double-
既知の場合の期待フレームレート(フレーム毎秒)。この値はフレームの
timestampとともに、各エンコード済みフレームの最適なバイト長を計算するためにビデオエンコーダによって使用されることがSHOULDである。さらに、latencyModeがrealtimeに設定されている場合、この値は出力の締め切り目標として考慮されるべきである。 hardwareAcceleration, of type HardwareAcceleration, defaulting to"no-preference"-
このコーデックのハードウェアアクセラレーションを構成するヒント。詳しくは
HardwareAccelerationを参照。 alpha, of type AlphaOption, defaulting to"discard"-
入力される
VideoFrameのアルファ成分をエンコード前に保持するか破棄するかを指定する。もしalphaがdiscardの場合、アルファデータは常に破棄される(VideoFrameの[[format]]に関わらず)。 scalabilityMode, of type DOMString- WebRTC-SVC で定義されたエンコーディングのスケーラビリティモード識別子。
bitrateMode, of type VideoEncoderBitrateMode, defaulting to"variable"-
エンコーディングを
VideoEncoderBitrateModeで指定されるレート制御モードのいずれかで動作するよう構成する。NOTE: いずれのモードにおけるビットレートの具体的な変動幅は実装ごとに定義される。
latencyMode, of type LatencyMode, defaulting to"quality"-
このコーデックのレイテンシ関連の動作を構成する。詳しくは
LatencyModeを参照。 contentHint, of type DOMString-
video content hint(MediaStreamTrack Content Hints で定義)に相当するエンコーディングのヒント。
ユーザーエージェントは、このヒントを使用して入力される
VideoFrameに関する期待を設定し、エンコード品質を向上させることが MAY ある。もしこのヒントを使用する場合:-
ユーザーエージェントは、エンコーダの設定時に明示的に設定された他のエンコードオプション(コーデック固有のエンコードオプションを含む)をMUST 尊重する。
-
ユーザーエージェントは、該当する video content hint の目的に従って、エンコード品質を改善するために追加の構成オプションを最善努力で使用すること SHOULD。
NOTE: 一部のエンコーダオプションは実装固有であり、
contentHintとそれらのオプション間のマッピングは規定できない場合がある。ユーザーエージェントは、このコンテンツヒントをサポートしていないからといって構成を拒否してはならない MUST NOT。詳細は
isConfigSupported()を参照。 -
7.9. ハードウェアアクセラレーション
enum {HardwareAcceleration "no-preference" ,"prefer-hardware" ,"prefer-software" , };
サポートされている場合、ハードウェアアクセラレーションはエンコードやデコード処理を専用ハードウェアにオフロードします。prefer-hardware
および
prefer-software
はヒントです。ユーザーエージェントは可能な限りこれらの値を尊重SHOULDしますが、状況によっては任意の理由で無視する場合があります。
フィンガープリント防止のため、ユーザーエージェントが [media-capabilities] を実装している場合、
ユーザーエージェントは、MUST 指定された HardwareAcceleration
の拒否や受理が、ユーザーエージェント固有の情報や [media-capabilities] で既に公開されている情報以外を明らかにしないようにしなければなりません。
フィンガープリント防止の理由で [media-capabilities] を実装しない場合、ユーザーエージェントは HardwareAcceleration
の指定を無視するべきですSHOULD。
prefer-hardware
や
prefer-software
を無視できる良い例は、ユーザープライバシーの理由や、ユーザーエージェントが別の設定の方がエンドユーザーにとって有益と判断した場合です。
ほとんどの作者はデフォルト値 no-preference
を使うのが最適です。これによりユーザーエージェントはシステムや構成に関する知識をもとに最適化できます。一般的な戦略は、高解像度ではハードウェアアクセラレーションを優先し、失敗した場合はソフトウェアコーデックにフォールバックすることです。
作者はハードウェアアクセラレーションの指定時にトレードオフを慎重に検討することが推奨されます。具体的なトレードオフはデバイスごとに異なりますが、一般的には以下の点が考えられます:
-
prefer-hardwareやprefer-softwareを指定すると、サポートされる構成が大きく制限される場合があります。ユーザーのデバイスがいずれのコーデックにもアクセラレーションを提供しない場合や、古いコーデックの最も一般的なプロファイルのみ対応している場合もあります。また、特定のユーザーエージェントがソフトウェアコーデック実装を持たない場合もあります。 -
ハードウェアアクセラレーションは単に高速なエンコード/デコードを意味するものではありません。多くの場合、起動時のレイテンシは高くなりますが、スループット性能はより安定します。アクセラレーションは一般的にCPU負荷を低減します。
-
デコード時、ハードウェアアクセラレーションはラベル誤りや仕様違反の入力に対してソフトウェアより堅牢性が低いことがあります。
-
ハードウェアアクセラレーションは純粋なソフトウェアコーデックよりも電力効率が高い場合が多いです。
-
低解像度コンテンツでは、ハードウェアアクセラレーションによるオーバーヘッドが純粋なソフトウェアコーデックよりも性能や電力効率を低下させる場合があります。
これらのトレードオフを踏まえ、「prefer-hardware」を使う良い例は、作者がWebAssemblyなどで独自のソフトウェアフォールバックを提供する場合です。
逆に「prefer-software」を使う良い例は、作者がハードウェアアクセラレーションに伴う高い起動レイテンシや堅牢性低下に特に敏感な場合です。
no-preference- ユーザーエージェントは、利用可能かつ他のコーデック構成と互換性がある場合、ハードウェアアクセラレーションを使用してもよいMAYことを示します。
prefer-software-
ユーザーエージェントはソフトウェアコーデック実装を優先するべきSHOULDことを示します。ユーザーエージェントは任意の理由でこの値を無視する場合があります。
NOTE: この値を指定すると、非アクセラレートコーデックが利用できない、または他のコーデック構成と互換性がないプラットフォームでは構成がサポートされなくなる場合があります。
prefer-hardware-
ユーザーエージェントはハードウェアアクセラレーションを優先するべきSHOULDことを示します。ユーザーエージェントは任意の理由でこの値を無視する場合があります。
NOTE: この値を指定すると、アクセラレートコーデックが利用できない、または他のコーデック構成と互換性がないプラットフォームでは構成がサポートされなくなる場合があります。
7.10. アルファオプション
enum {AlphaOption "keep" ,"discard" , };
アルファチャンネルを扱う際に、ユーザーエージェントがどのように振る舞うべきかSHOULDを記述します(様々な操作に対して)。
keep-
ユーザーエージェントは、
VideoFrameにアルファチャンネルデータが存在する場合、それを保持するべきSHOULDことを示します。 discard-
ユーザーエージェントは
VideoFrameのアルファチャンネルデータを無視または除去するべきSHOULDことを示します。
7.11. レイテンシモード
enum {LatencyMode "quality" ,"realtime" };
quality-
ユーザーエージェントはエンコード品質の最適化を優先するべきSHOULDことを示します。このモードでは:
realtime-
ユーザーエージェントは低レイテンシの最適化を優先するべきSHOULDことを示します。このモードでは:
7.12. 設定の同等性
2つの辞書は、同じキーと値を持つ場合equal dictionariesとみなされます。ネストされた辞書については、この定義を再帰的に適用します。7.13. VideoEncoderEncodeOptions
dictionary {VideoEncoderEncodeOptions boolean keyFrame =false ; };
NOTE: VideoEncoderEncodeOptions
に対するコーデック固有の拡張は、[WEBCODECS-CODEC-REGISTRY] の登録で説明されている。
keyFrame, of type boolean, defaulting tofalse-
trueの場合、指定されたフレームはMUSTキー・フレームとしてエンコードされます。falseの場合、ユーザーエージェントはそのフレームをkey frameとしてエンコードするかどうかを柔軟に決定できます。
7.14. VideoEncoderBitrateMode
enum {VideoEncoderBitrateMode "constant" ,"variable" ,"quantizer" };
constant- 一定のビットレートでエンコードします。詳細は
bitrateを参照してください。 variable-
可変ビットレートでエンコードします。複雑な信号にはより多く、単純な信号にはより少ない領域を使用できます。
詳細は
bitrateを参照してください。 quantizer-
コーデック固有の
VideoEncoderEncodeOptionsの拡張で各ビデオフレームごとに指定される量子化器を使用してエンコードします。
7.15. CodecState
enum {CodecState "unconfigured" ,"configured" ,"closed" };
unconfigured- コーデックはエンコードまたはデコード用に構成されていません。
configured- 有効な構成が提供されています。コーデックはエンコードおよびデコードの準備ができています。
closed- コーデックはもはや使用できず、基盤となる system resources は解放されています。
7.16. WebCodecsErrorCallback
callback =WebCodecsErrorCallback undefined (DOMException );error
8. エンコード済みメディアインターフェース(チャンク)
これらのインターフェイスは、エンコードされたメディアのチャンクを表します。8.1. EncodedAudioChunk インターフェース
[Exposed =(Window ,DedicatedWorker ),Serializable ]interface {EncodedAudioChunk constructor (EncodedAudioChunkInit );init readonly attribute EncodedAudioChunkType type ;readonly attribute long long timestamp ; // microsecondsreadonly attribute unsigned long long ?duration ; // microsecondsreadonly attribute unsigned long byteLength ;undefined copyTo (AllowSharedBufferSource ); };destination dictionary {EncodedAudioChunkInit required EncodedAudioChunkType ; [type EnforceRange ]required long long ; // microseconds [timestamp EnforceRange ]unsigned long long ; // microsecondsduration required AllowSharedBufferSource ;data sequence <ArrayBuffer >= []; };transfer enum {EncodedAudioChunkType ,"key" , };"delta"
8.1.1. 内部スロット
[[internal data]]-
エンコードされたチャンクデータを表すバイト配列。
[[type]]-
このチャンクがkey chunkであるかどうかを説明します。
[[timestamp]]-
プレゼンテーションのタイムスタンプ(マイクロ秒単位)。
[[duration]]-
プレゼンテーションの継続時間(マイクロ秒単位)。
[[byte length]]-
[[internal data]]のバイト長。
8.1.2. コンストラクター
EncodedAudioChunk(init)
-
もし init.
transferが同じArrayBufferを複数参照している場合、DataCloneErrorDOMExceptionをスローします。 -
init.
transferの各 transferable について:-
もし
[[Detached]]内部スロットがtrueであれば、DataCloneErrorDOMExceptionをスローします。
-
-
chunk を新しい
EncodedAudioChunkオブジェクトとして生成し、次のように初期化します-
init.typeを[[type]]に代入します。 -
init.timestampを[[timestamp]]に代入します。 -
もし
init.durationが存在すればそれを[[duration]]に代入し、存在しない場合はnullを代入します。 -
init.data.byteLengthを[[byte length]]に代入します; -
もし init.
transferが init.dataによって参照されるArrayBufferを含む場合、ユーザーエージェントは次のいずれかを選択することができます:-
resource を media resource として生成し、init.
data内のサンプルデータを参照させます。
-
-
それ以外の場合:
-
init.
dataのコピーを[[internal data]]に代入します。
-
-
-
init.
transferの各 transferable について:-
DetachArrayBuffer を transferable に対して実行します。
-
-
chunk を返します。
8.1.3. 属性
type, of type EncodedAudioChunkType, readonly-
[[type]]の値を返します。 timestamp, of type long long, readonly-
[[timestamp]]の値を返します。 duration, of type unsigned long long, readonly, nullable-
[[duration]]の値を返します。 byteLength, of type unsigned long, readonly-
[[byte length]]の値を返します。
8.1.4. メソッド
copyTo(destination)-
呼び出されたとき、次の手順を実行します:
-
もしこの
[[byte length]]が destination のサイズより大きい場合、TypeError をスローします。 -
[[internal data]]を destination にコピーします。
-
8.1.5. シリアライズ
EncodedAudioChunkのシリアライズ手順(value、serialized、 および forStorage を持つ)は以下の通りです:-
-
forStorage が
trueの場合、DataCloneErrorをスローします。 -
value 内の各
EncodedAudioChunk内部スロットについて、各内部スロットの値を、同じ名前のフィールドに serialized へ代入します。
-
EncodedAudioChunkのデシリアライズ手順(serialized と value を持つ)は以下の通りです:-
-
serialized の全ての名前付きフィールドについて、それぞれの値を同じ名前の value の
EncodedAudioChunk内部スロットに代入します。
-
注意: EncodedAudioChunk
は不変(immutable)なので、
ユーザーエージェントは § 9.2.6 転送とシリアライズ と同様の参照カウントモデルで
シリアライズを実装することができます。
8.2. EncodedVideoChunk インターフェイス
[Exposed =(Window ,DedicatedWorker ),Serializable ]interface {EncodedVideoChunk constructor (EncodedVideoChunkInit );init readonly attribute EncodedVideoChunkType type ;readonly attribute long long timestamp ; // microsecondsreadonly attribute unsigned long long ?duration ; // microsecondsreadonly attribute unsigned long byteLength ;undefined copyTo (AllowSharedBufferSource ); };destination dictionary {EncodedVideoChunkInit required EncodedVideoChunkType ; [type EnforceRange ]required long long ; // microseconds [timestamp EnforceRange ]unsigned long long ; // microsecondsduration required AllowSharedBufferSource ;data sequence <ArrayBuffer >= []; };transfer enum {EncodedVideoChunkType ,"key" , };"delta"
8.2.1. 内部スロット
[[internal data]]-
エンコードされたチャンクデータを表すバイト配列。
[[type]]-
この
EncodedVideoChunkTypeの種類。 [[timestamp]]-
表示タイムスタンプ(マイクロ秒単位)。
[[duration]]-
表示継続時間(マイクロ秒単位)。
[[byte length]]-
[[internal data]]のバイト長。
8.2.2. コンストラクタ
EncodedVideoChunk(init)
-
init.
transferが同じArrayBufferを複数参照している場合は、DataCloneErrorDOMExceptionをスローします。 -
init.
transferの各 transferable について:-
[[Detached]]内部スロットがtrueなら、DataCloneErrorDOMExceptionをスローします。
-
-
chunk を新しい
EncodedVideoChunkオブジェクトとして生成し、次のように初期化します:-
init.typeを[[type]]に代入します。 -
init.timestampを[[timestamp]]に代入します。 -
init に duration があれば
init.durationを[[duration]]に代入し、 なければnullを[[duration]]に代入します。 -
init.data.byteLengthを[[byte length]]に代入します; -
init.
transferが init.dataによって参照されるArrayBufferを含む場合、ユーザーエージェントは以下のいずれかを選択できます:-
resource を新しい media resource とし、init.
dataのサンプルデータを参照させます。
-
-
それ以外の場合:
-
init.
dataのコピーを[[internal data]]に代入します。
-
-
-
init.
transferの各 transferable について:-
DetachArrayBuffer を transferable に対して行います。
-
-
chunk を返します。
8.2.3. 属性
type, 型は EncodedVideoChunkType、読み取り専用-
[[type]]の値を返します。 timestamp, 型は long long、読み取り専用-
[[timestamp]]の値を返します。 duration, 型は unsigned long long、読み取り専用、nullable-
[[duration]]の値を返します。 byteLength, 型は unsigned long、読み取り専用-
[[byte length]]の値を返します。
8.2.4. メソッド
copyTo(destination)-
呼び出された際、次の手順を実行します:
-
[[byte length]]が destination の[[byte length]]より大きい場合は、TypeErrorを投げます。 -
[[internal data]]を destination にコピーします。
-
8.2.5. シリアライズ
EncodedVideoChunkのシリアライズ手順(value、serialized、forStorage を持つ)は以下の通りです:-
-
forStorage が
trueの場合、DataCloneErrorをスローします。 -
value 内の各
EncodedVideoChunk内部スロットについて、各内部スロットの値を、同じ名前のフィールドに serialized へ代入します。
-
EncodedVideoChunkのデシリアライズ手順(serialized と value を持つ)は以下の通りです:-
-
serialized の全ての名前付きフィールドについて、それぞれの値を同じ名前の value の
EncodedVideoChunk内部スロットに代入します。
-
注意: EncodedVideoChunk
は不変(immutable)なので、
ユーザーエージェントは § 9.4.7 転送とシリアライズ と同様の参照カウントモデルで
シリアライズを実装することができます。
9. Raw メディアインターフェイス
これらのインターフェイスは、エンコードされていない(raw)メディアを表します。9.1. メモリモデル
9.1.1. 背景
この節は規範的ではありません。
デコード済みメディアデータは MAY
大量のシステムメモリを占有する場合があります。高価なコピーの必要性を最小限に抑えるため、本仕様は参照カウント方式(clone() および
close())を定義します。
注意: 著者は、フレームが不要になったらすぐに close()
を呼び出すことが推奨されます。
9.1.2. 参照カウント
media resource とは、VideoFrame
または AudioData
によって記述される実際のピクセルデータやオーディオサンプルデータの保存領域です。
AudioData
の [[resource reference]]
および VideoFrame
の [[resource reference]]
内部スロットは、media resource
への参照を保持します。
VideoFrame.clone()
および
AudioData.clone()
は、元のオブジェクトと同じ media resource
を参照する新しいオブジェクトを返します。
VideoFrame.close()
および AudioData.close()
は、自身の [[resource reference]] スロットをクリアし、
保持していた media resource
への参照を解放します。
media resource は、
[[resource reference]] により参照されている限り、MUST 存在し続ける必要があります。
注意: media resource が [[resource reference]] により参照されなくなった場合、
そのリソースは破棄できます。ユーザーエージェントは、メモリ圧力の低減やリソース再利用のため、速やかに破棄することが推奨されます。
9.1.3. 転送とシリアライズ
この節は規範的ではありません。
AudioData および
VideoFrame
は共に
transferable
かつ
serializable
オブジェクトです。それらの転送と
シリアライズ手順は § 9.2.6 転送とシリアライズ および
§ 9.4.7 転送とシリアライズ で定義されています。
AudioData または
VideoFrame
の転送は、その [[resource reference]] を転送先オブジェクトに移動し、転送元オブジェクトを(close()
と同様に)閉じます。著者はこの仕組みを使って、
AudioData や
VideoFrame
を基盤となる media resource
をコピーせずに異なる realm 間で移動できます。
AudioData または
VideoFrame
のシリアライズは、実質的に(clone()
のように)元のオブジェクトを複製し、
両方のオブジェクトが同じ media resource
を参照します。著者はこの仕組みを使って、
AudioData や
VideoFrame
を基盤となる media resource
をコピーせずに別の realm に複製できます。
9.2. AudioData インターフェイス
[Exposed =(Window ,DedicatedWorker ),Serializable ,Transferable ]interface {AudioData constructor (AudioDataInit );init readonly attribute AudioSampleFormat ?format ;readonly attribute float sampleRate ;readonly attribute unsigned long numberOfFrames ;readonly attribute unsigned long numberOfChannels ;readonly attribute unsigned long long duration ; // microsecondsreadonly attribute long long timestamp ; // microsecondsunsigned long allocationSize (AudioDataCopyToOptions );options undefined copyTo (AllowSharedBufferSource ,destination AudioDataCopyToOptions );options AudioData clone ();undefined close (); };dictionary {AudioDataInit required AudioSampleFormat ;format required float ; [sampleRate EnforceRange ]required unsigned long ; [numberOfFrames EnforceRange ]required unsigned long ; [numberOfChannels EnforceRange ]required long long ; // microsecondstimestamp required BufferSource ;data sequence <ArrayBuffer >= []; };transfer
9.2.1. 内部スロット
[[resource reference]]-
この
AudioDataのオーディオサンプルデータを格納する media resource への参照。 [[format]]-
この
AudioDataで使用されるAudioSampleFormat。 基礎となるフォーマットがAudioSampleFormatに対応しない場合や、[[Detached]]がtrueの場合はnullになる。 [[sample rate]]-
この
AudioDataのサンプルレート(Hz単位)。 [[number of frames]][[number of channels]]-
この
AudioDataのオーディオチャンネル数。 [[timestamp]]-
この
AudioDataの表示タイムスタンプ(マイクロ秒単位)。
9.2.2. コンストラクタ
AudioData(init)
-
init が valid AudioDataInit でない場合、
TypeErrorをスローする。 -
init.
transferが同じArrayBufferを複数参照している場合は、DataCloneErrorDOMExceptionをスローする。 -
init.
transferの各 transferable について:-
[[Detached]]内部スロットがtrueであれば、DataCloneErrorDOMExceptionをスローする。
-
-
frame を新しい
AudioDataオブジェクトとして生成し、次のように初期化する:-
falseを[[Detached]]に代入する。 -
init.
formatを[[format]]に代入する。 -
init.
sampleRateを[[sample rate]]に代入する。 -
init.
numberOfFramesを[[number of frames]]に代入する。 -
init.
numberOfChannelsを[[number of channels]]に代入する。 -
init.
timestampを[[timestamp]]に代入する。 -
init.
transferが init.dataによって参照されるArrayBufferを含む場合、ユーザーエージェントは次のいずれかを選ぶことができる:-
resource を新しい media resource として生成し、data のサンプルデータを参照させる。
-
-
それ以外の場合:
-
resource を media resource として、init.
dataのコピーを含める。
-
-
resourceReference を resource への参照とする。
-
resourceReference を
[[resource reference]]に代入する。
-
-
init.
transferの各 transferable について:-
DetachArrayBuffer を transferable に対して実行する。
-
-
frame を返す。
9.2.3. 属性
format, 型は AudioSampleFormat、読み取り専用、nullable-
この
AudioDataで使用されるAudioSampleFormat。 基礎となるフォーマットがAudioSampleFormatに対応しない場合や、[[Detached]]がtrueの場合はnullになる。formatの getter 手順は[[format]]を返すこと。 sampleRate, 型は float、読み取り専用-
この
AudioDataのサンプルレート(Hz単位)。sampleRateの getter 手順は[[sample rate]]を返すこと。 numberOfFrames, 型は unsigned long、読み取り専用-
numberOfFramesの getter 手順は[[number of frames]]を返すこと。 numberOfChannels, 型は unsigned long、読み取り専用-
この
AudioDataのオーディオチャンネル数。numberOfChannelsの getter 手順は[[number of channels]]を返すこと。 timestamp, 型は long long、読み取り専用-
この
AudioDataの表示タイムスタンプ(マイクロ秒単位)。numberOfChannelsの getter 手順は[[timestamp]]を返すこと。 duration, 型は unsigned long long、読み取り専用-
この
AudioDataの継続時間(マイクロ秒単位)。durationの getter 手順は:-
microsecondsPerSecond を
1,000,000とする。 -
durationInSeconds を
[[number of frames]]を[[sample rate]]で割った結果とする。 -
durationInSeconds と microsecondsPerSecond の積を返す。
-
9.2.4. メソッド
allocationSize(options)-
options で記述されたサンプルを保持するのに必要なバイト数を返します。
呼び出された際、次の手順を実行します:
-
[[Detached]]がtrueの場合はInvalidStateErrorDOMExceptionをスローします。 -
copyElementCount を Compute Copy Element Count アルゴリズムに options を渡して得ます。
-
destFormat を
[[format]]の値とします。 -
もし options.
formatが 存在するなら、 options.formatを destFormat に代入します。 -
bytesPerSample を destFormat が定義するサンプルごとのバイト数とします。
-
bytesPerSample × copyElementCount の積を返します。
-
copyTo(destination, options)-
指定した
AudioDataのプレーンのサンプルを destination バッファへコピーします。呼び出された際、次の手順を実行します:
-
[[Detached]]がtrueの場合はInvalidStateErrorDOMExceptionをスローします。 -
copyElementCount を Compute Copy Element Count アルゴリズムに options を渡して得ます。
-
destFormat を
[[format]]の値とします。 -
もし options.
formatが 存在するなら、 options.formatを destFormat に代入します。 -
bytesPerSample を destFormat が定義するサンプルごとのバイト数とします。
-
bytesPerSample × copyElementCount の積が
destination.byteLengthより大きい場合はRangeErrorをスローします。 -
resource を
[[resource reference]]が参照する media resource とします。 -
planeFrames を resource のうち options.
planeIndexに対応する領域とします。 -
planeFrames の要素を destination にコピーします。コピーは options.
frameOffsetで示される フレーム から始め、copyElementCount 個のサンプルがコピーされるまで続けます。destFormat が[[format]]と異なる場合は、コピー時に destFormatAudioSampleFormatへ変換します。
-
clone()-
同じ media resource への参照を持つ新しい AudioData を生成します。
呼び出された際、次の手順を実行します:
-
[[Detached]]がtrueの場合はInvalidStateErrorDOMExceptionをスローします。 -
Clone AudioData アルゴリズムに this を渡した結果を返します。
-
close()-
すべての状態をクリアし、media resource への参照を解放します。 close は最終的な操作です。
呼び出された際、Close AudioData アルゴリズムに this を渡して実行します。
9.2.5. アルゴリズム
- Compute Copy Element Count (options を受け取る)
-
次の手順を実行します:
-
destFormat を
[[format]]の値とします。 -
もし options.
formatが 存在するなら、 options.formatを destFormat に代入します。 -
もし destFormat が インターリーブ
AudioSampleFormatを記述し、 options.planeIndexが0より大きい場合、RangeErrorをスローします。 -
それ以外で、destFormat が プレーナ
AudioSampleFormatを記述し、 options.planeIndexが[[number of channels]]以上の場合、RangeErrorをスローします。 -
もし
[[format]]が destFormat と異なり、ユーザーエージェントが要求されたAudioSampleFormat変換に対応していない場合、NotSupportedErrorDOMExceptionをスローします。f32-planarへの変換は MUST 常にサポートされます。 -
frameCount を options.
planeIndexで識別されるプレーンのフレーム数とします。 -
もし options.
frameOffsetが frameCount 以上ならRangeErrorをスローします。 -
copyFrameCount を frameCount から options.
frameOffsetを引いた値とします。 -
もし options.
frameCountが 存在する場合:-
もし options.
frameCountが copyFrameCount より大きければRangeErrorをスローします。 -
それ以外の場合、options.
frameCountを copyFrameCount に代入します。
-
-
elementCount を copyFrameCount とします。
-
もし destFormat が インターリーブ
AudioSampleFormatを記述する場合は elementCount ×[[number of channels]]とします。 -
elementCount を返します。
-
- Clone AudioData (data を受け取る)
-
次の手順を実行します:
-
clone を新しい
AudioDataとして、以下のように初期化します:-
resource を data の
[[resource reference]]が参照する media resource とします。 -
reference を resource への新しい参照とします。
-
reference を
[[resource reference]]に代入します。 -
data の
[[Detached]]、[[format]]、[[sample rate]]、[[number of frames]]、[[number of channels]]、[[timestamp]]の値を clone の対応するスロットに代入します。
-
-
clone を返します。
-
- Close AudioData (data を受け取る)
-
次の手順を実行します:
-
data の
[[Detached]]にtrueを代入します。 -
data の
[[resource reference]]にnullを代入します。 -
data の
[[sample rate]]に0を代入します。 -
data の
[[number of frames]]に0を代入します。 -
data の
[[number of channels]]に0を代入します。 -
data の
[[format]]にnullを代入します。
-
AudioDataInitが valid AudioDataInit かどうか判定するには、以下の手順を実行します:-
-
sampleRateが0以下ならfalseを返す。 -
numberOfFramesが0ならfalseを返す。 -
numberOfChannelsが0ならfalseを返す。 -
dataに十分なデータがあるかを次の手順で確認する:-
totalSamples を
numberOfFrames×numberOfChannelsの積とする。 -
bytesPerSample を
formatが定義するサンプルごとのバイト数とする。 -
totalSize を bytesPerSample × totalSamples の積とする。
-
dataSize を
dataのバイトサイズとする。 -
もし dataSize が totalSize より小さいなら false を返す。
-
-
trueを返す。
-
AudioDataInit
の
data
の
メモリ
レイアウトは planar または interleaved
format
の期待に合っていることが想定されています。
サンプルが本当に AudioSampleFormat
に準拠しているかを検証する方法はありません。
9.2.6. 転送とシリアライズ
AudioDataの転送手順(value および dataHolder を持つ)は以下の通りです:-
-
value の
[[Detached]]がtrueの場合はDataCloneErrorDOMExceptionをスローします。 -
value の全ての
AudioData内部スロットについて、各内部スロット値を同じ名前のフィールドに dataHolder へ代入します。 -
Close AudioData アルゴリズムに value を渡して実行します。
-
AudioDataの転送受信手順(dataHolder および value を持つ)は以下の通りです:-
-
dataHolder の全ての名前付きフィールドについて、それぞれの値を同じ名前の value の
AudioData内部スロットに代入します。
-
AudioDataのシリアライズ手順(value、serialized、forStorage を持つ)は以下の通りです:-
-
value の
[[Detached]]がtrueの場合はDataCloneErrorDOMExceptionをスローします。 -
forStorage が
trueの場合はDataCloneErrorをスローします。 -
resource を value の
[[resource reference]]が参照する media resource とします。 -
newReference を resource への新しい参照とします。
-
newReference を |serialized.resource reference| に代入します。
-
残りの
AudioData内部スロット([[resource reference]]を除く) について、各内部スロット値を同じ名前のフィールドに serialized へ代入します。
-
AudioDataのデシリアライズ手順(serialized および value を持つ)は以下の通りです:-
-
serialized の全ての名前付きフィールドについて、それぞれの値を同じ名前の value の
AudioData内部スロットに代入します。
-
9.2.7. AudioDataCopyToOptions
dictionary { [AudioDataCopyToOptions EnforceRange ]required unsigned long planeIndex ; [EnforceRange ]unsigned long frameOffset = 0; [EnforceRange ]unsigned long frameCount ;AudioSampleFormat format ; };
planeIndex, 型は unsigned long-
コピー元のプレーンを識別するインデックス。
frameOffset, 型は unsigned long、デフォルトは0-
ソースプレーンデータのオフセット。どの フレーム からコピーを開始するかを指します。デフォルトは
0。 frameCount, 型は unsigned long-
コピーする フレーム の数。指定しない場合は、
frameOffsetから始まるすべての フレーム がコピーされます。 format, 型は AudioSampleFormat-
出力先のデータの
AudioSampleFormat。 指定しない場合は、this AudioData の[[format]]になります。copyTo()を呼び出して 変換に対応していない場合はNotSupportedErrorをスローします。 どのAudioSampleFormatからでもf32-planarへの変換は MUST 常にサポートされます。注意: [WEBAUDIO] と連携したい場合は
f32-planarを指定し、 生成したコピーでAudioBufferを作成・AudioWorkletでレンダリングできます。
9.3. オーディオサンプルフォーマット
オーディオサンプルフォーマットは、単一サンプル(例: 32ビット浮動小数点数)を表す数値型と、複数チャンネルからのサンプルの配置(インターリーブ または プレーナ)を記述します。オーディオサンプル型は数値型とそのデータの格納間隔のみを指し、
u8,
s16,
s32,
f32
がそれぞれ
符号なし8ビット、符号付き16ビット、符号付き32ビット、32ビット浮動小数点数を表します。オーディオバッファの配置は、
メモリ上でサンプルがどのように並べられているか(プレーナ または インターリーブ)のみを指します。
サンプルとは、特定の時刻とチャンネルでの信号の大きさを表す単一値です。
フレーム(または サンプルフレーム)は、マルチチャンネル信号のすべてのチャンネル値が同時に揃ったセットを指します。
注意: オーディオ信号がモノラル(1チャンネルのみ)の場合、フレームとサンプルは同じものを指します。
この仕様のすべてのサンプルは線形パルス符号変調(Linear PCM)を使用します:量子化レベルは値間で均一です。
注意: 本仕様で想定されている Web Audio API も Linear PCM を使用します。
enum {AudioSampleFormat "u8" ,"s16" ,"s32" ,"f32" ,"u8-planar" ,"s16-planar" ,"s32-planar" ,"f32-planar" , };
u8s16s32f32u8-planars16-planars32-planarf32-planar
9.3.1. オーディオバッファの配置
AudioData の
AudioSampleFormat
が インターリーブ形式の場合、異なるチャンネルのオーディオサンプルが同じバッファ内で連続して並びます。順序は
§ 9.3.3 オーディオチャンネル順序で説明されています。AudioData は
単一プレーンを持ち、その要素数は [[number of frames]]
×
[[number of channels]]
です。
AudioData の
AudioSampleFormat
が プレーナ形式の場合、異なるチャンネルのオーディオサンプルは異なるバッファに配置され、それぞれの順序は
§ 9.3.3 オーディオチャンネル順序で説明されています。AudioData
のプレーン数は
AudioData の
[[number of channels]]
の値になります。
各プレーンの要素数は
[[number of frames]]
です。
注意: Web Audio API は現在 f32-planar
のみを使用しています。
9.3.2. オーディオサンプルの大きさ
最小値および 最大値は、特定のオーディオサンプル型において オーディオクリッピングが発生するしきい値を指します(それぞれ下回る、上回る場合に発生)。それ以外は通常の型で、中間処理中はこの範囲外の値を持つこともあります。
バイアス値は、オーディオサンプル型において 範囲の中間であることが多い値です(多くの場合、範囲は対称ではありません)。バイアス値のみで構成されたオーディオバッファは無音となります。
| サンプル型 | IDL型 | 最小値 | バイアス値 | 最大値 |
|---|---|---|---|---|
u8
| octet | 0 | 128 | +255 |
s16
| short | -32768 | 0 | +32767 |
s32
| long | -2147483648 | 0 | +2147483647 |
f32
| float | -1.0 | 0.0 | +1.0 |
注意: 24ビット情報を便利に格納できる型はありませんが、24ビットサンプルのオーディオコンテンツは一般的であるため、32ビット整数がよく使われます。
AudioData
で24ビットサンプルを含む場合は、
s32
または f32
で格納することが
SHOULD 推奨されます。s32
に格納する場合は、各サンプルを 8 ビット左シフトする
MUST 必要があります。この処理により、有効な24ビット範囲([-8388608, +8388607])外のサンプルはクリップされます。
クリッピングを避けてロスレス転送を保証するには、f32
へ変換
MAY が可能です。
注意: u8,
s16,
s32
のサンプルは
格納型の都合でクリッピングが避けられませんが、
f32
サンプル処理時は実装側が内部クリッピングを避ける
SHOULD 注意義務があります。
9.3.3. オーディオチャンネルの順序
デコード時、生成される AudioData
のチャンネル順序は、
MUST 元の EncodedAudioChunk
と同じでなければなりません。
エンコード時、生成される EncodedAudioChunk
のチャンネル順序は、
MUST 指定された AudioData
の順序と同じでなければなりません。
言い換えると、エンコード・デコード時にチャンネルの並び替えは行われません。
注意: コンテナはチャンネルマッピング(特定のチャンネルインデックスに割り当てられるチャンネル)を暗示または明示します。
9.4. VideoFrame インターフェイス
注意: VideoFrame は
CanvasImageSource
です。
VideoFrame
は
CanvasImageSource
を受け付ける全てのメソッドに渡すことができ、
CanvasDrawImage
の
drawImage()
などに利用できます。
[Exposed =(Window ,DedicatedWorker ),Serializable ,Transferable ]interface {VideoFrame constructor (CanvasImageSource ,image optional VideoFrameInit = {});init constructor (AllowSharedBufferSource ,data VideoFrameBufferInit );init readonly attribute VideoPixelFormat ?format ;readonly attribute unsigned long codedWidth ;readonly attribute unsigned long codedHeight ;readonly attribute DOMRectReadOnly ?codedRect ;readonly attribute DOMRectReadOnly ?visibleRect ;readonly attribute double rotation ;readonly attribute boolean flip ;readonly attribute unsigned long displayWidth ;readonly attribute unsigned long displayHeight ;readonly attribute unsigned long long ?duration ; // microsecondsreadonly attribute long long timestamp ; // microsecondsreadonly attribute VideoColorSpace colorSpace ;VideoFrameMetadata metadata ();unsigned long allocationSize (optional VideoFrameCopyToOptions = {});options Promise <sequence <PlaneLayout >>copyTo (AllowSharedBufferSource ,destination optional VideoFrameCopyToOptions = {});options VideoFrame clone ();undefined close (); };dictionary {VideoFrameInit unsigned long long ; // microsecondsduration long long ; // microsecondstimestamp AlphaOption = "keep"; // デフォルトは画像サイズ。効率的なクロップに使える。displayWidth/displayHeightが明示されていなければ画像のピクセルアスペクト比で再計算される。alpha DOMRectInit ;visibleRect double = 0;rotation boolean =flip false ; // visibleRect が指定されていなければ画像サイズに一致。 [EnforceRange ]unsigned long ; [displayWidth EnforceRange ]unsigned long ;displayHeight VideoFrameMetadata ; };metadata dictionary {VideoFrameBufferInit required VideoPixelFormat ;format required [EnforceRange ]unsigned long ;codedWidth required [EnforceRange ]unsigned long ;codedHeight required [EnforceRange ]long long ; // microseconds [timestamp EnforceRange ]unsigned long long ; // microseconds // デフォルトレイアウトはタイトパックduration sequence <PlaneLayout >; // デフォルトの visibleRect は coded size で (0,0) に配置layout DOMRectInit ;visibleRect double = 0;rotation boolean =flip false ; // デフォルトの displayWidth/displayHeight は visibleRect と一致 [EnforceRange ]unsigned long ; [displayWidth EnforceRange ]unsigned long ;displayHeight VideoColorSpaceInit ;colorSpace sequence <ArrayBuffer >= [];transfer VideoFrameMetadata ; };metadata dictionary { // メンバーは VideoFrame Metadata Registry に記録されています。 };VideoFrameMetadata
9.4.1. 内部スロット
[[resource reference]]-
このフレームのピクセルデータを保存する media resource への参照。
[[format]]-
この
VideoFrameのピクセルフォーマットを記述するVideoPixelFormat。 基礎となるフォーマットがVideoPixelFormatに該当しない場合や、[[Detached]]がtrueの場合はnull。 [[coded width]]-
この
VideoFrameのピクセル幅(非表示パディング含む場合あり、比率調整前)。 [[coded height]]-
この
VideoFrameのピクセル高さ(非表示パディング含む場合あり、比率調整前)。 [[visible left]]-
表示領域の左端オフセットを定義するピクセル数。
[[visible top]]-
表示領域の上端オフセットを定義するピクセル数。
[[visible width]]-
[[visible left]]から始まる表示領域内ピクセルの幅。 [[visible height]]-
[[visible top]]から始まる表示領域内ピクセルの高さ。 [[rotation]]-
描画時に
VideoFrameに適用される回転(時計回り度数)。回転は flip より先に適用。 [[flip]]-
描画時に
VideoFrameに水平反転が適用されるかどうか。 flip は回転の後に適用。 [[display width]]-
アスペクト比調整後に表示される
VideoFrameの幅。 [[display height]]-
アスペクト比調整後に表示される
VideoFrameの高さ。 [[duration]]-
表示継続時間(マイクロ秒単位)。この値は対応する
EncodedVideoChunkからコピーされます。 [[timestamp]]-
表示タイムスタンプ(マイクロ秒単位)。この値は対応する
EncodedVideoChunkからコピーされます。 [[color space]]-
このフレームに関連付けられた
VideoColorSpace。 [[metadata]]-
このフレームに関連付けられた
VideoFrameMetadata。 メンバーは [webcodecs-video-frame-metadata-registry] に記録されています。 設計上、すべてのVideoFrameMetadataのプロパティはシリアライズ可能です。
9.4.2. コンストラクタ
VideoFrame(image, init)
-
image 引数の利用可能性を確認する。例外が投げられるか bad が返された場合は、
InvalidStateErrorDOMExceptionをスローする。 -
image が origin-clean でない場合、
SecurityErrorDOMExceptionをスローする。 -
frame を新しい
VideoFrameとする。 -
image の型によって分岐:
注意: 著者は、
CanvasImageSourceから暗黙的に提供されない限り、意味のある timestamp を指定することが推奨されます。VideoFrameを利用するインターフェイスはこの値でタイミングの判断ができます。例えばVideoEncoderはtimestampをレート制御の指標にできます(framerate参照)。-
-
image のメディアデータが natural dimensions を持たない場合(例:ベクターグラフィックで内容サイズが指定されていない場合)、
InvalidStateErrorDOMExceptionをスローする。 -
resource を image のメディアデータのコピーを格納する新しい media resource とする。アニメ画像の場合は、image の bitmap data は、アニメーション非対応時に使用される既定画像(なければ最初のフレーム)のみを取得する MUST である。
-
codedWidth と codedHeight を resource の幅・高さとする。
-
baseRotation と baseFlip を image の resource に対する回転・反転として記録。
-
defaultDisplayWidth と defaultDisplayHeight を image の natural width および natural height とする。
-
Initialize Frame With Resource アルゴリズムを init, frame, resource, codedWidth, codedHeight, baseRotation, baseFlip, defaultDisplayWidth, defaultDisplayHeight で実行する。
-
-
image の
networkState属性がNETWORK_EMPTYの場合、InvalidStateErrorDOMExceptionをスローする。 -
currentPlaybackFrame を 再生位置の
VideoFrameとする。 -
metadataが init に 存在しない場合、 currentPlaybackFrame.[[metadata]]を代入する。 -
Initialize Frame From Other Frame アルゴリズムを init, frame, currentPlaybackFrame で実行する。
-
-
-
resource を image の bitmap data のコピーを格納する新しい media resource とする。
注意: 実装者は参照カウントの活用等によるディープコピー回避が推奨される。
-
width を
image.width、height をimage.heightとする。 -
Initialize Frame With Resource アルゴリズムを init, frame, resource, width, height,
0,false, width, height で実行する。
-
-
Initialize Frame From Other Frame アルゴリズムを init, frame, image で実行する。
-
-
frame を返す。
VideoFrame(data, init)
-
init が valid VideoFrameBufferInit でない場合、
TypeErrorをスローする。 -
defaultRect を «[ "x:" →
0, "y" →0, "width" → init.codedWidth, "height" → init.codedWidth]» とする。 -
overrideRect を
undefinedとする。 -
init.
visibleRectが 存在する場合は、その値を overrideRect に代入する。 -
parsedRect を Parse Visible Rect アルゴリズムを defaultRect, overrideRect, init.
codedWidth, init.codedHeight, init.formatで実行した結果とする。 -
parsedRect が例外の場合は parsedRect を返す。
-
optLayout を
undefinedとする。 -
combinedLayout を Compute Layout and Allocation Size アルゴリズムを parsedRect, init.
format, optLayout で実行した結果とする。 -
combinedLayout が例外の場合はそれをスローする。
-
data.byteLengthが combinedLayout の allocationSize より小さい場合、TypeErrorをスローする。 -
init.
transferが同じArrayBufferを複数参照している場合は、DataCloneErrorDOMExceptionをスローする。 -
init.
transferの各 transferable について:-
[[Detached]]内部スロットがtrueなら、DataCloneErrorDOMExceptionをスローする。
-
-
init.
transferが data を参照するArrayBufferを含む場合、ユーザーエージェントは以下のいずれかを選択できる:-
resource を data のピクセルデータを参照する新しい media resource とする。
-
-
それ以外の場合:
-
resource を data のコピーを含む新しい media resource とする。
visibleRectやlayoutで各プレーンのピクセル位置を特定する。ユーザーエージェントはメモリアラインメント向上のため、より大きな coded size や plane stride で resource を確保する MAY がある。増加分は
codedWidth、codedHeightに反映される。 またvisibleRectで可視矩形のみコピーしたり、 resource 内で可視矩形を再配置することもできる。その最終位置はvisibleRectに反映される。
-
-
init.
transferの各 transferable について:-
DetachArrayBuffer を transferable に対して行う。
-
-
resourceCodedWidth を resource の coded width とする。
-
resourceCodedHeight を resource の coded height とする。
-
resourceVisibleLeft を resource の可視矩形の左オフセットとする。
-
resourceVisibleTop を resource の可視矩形の上オフセットとする。
この仕様は coded size、visible rectangle、display size の定義(および図示)を追加する SHOULD がある。#166 参照。
-
frame を以下のように初期化した新しい
VideoFrameオブジェクトとする:-
resourceCodedWidth, resourceCodedHeight, resourceVisibleLeft, resourceVisibleTop を
[[coded width]]、[[coded height]]、[[visible left]]、[[visible top]]にそれぞれ代入する。 -
init.
visibleRectが 存在する場合:-
truncatedVisibleWidth を
visibleRect.widthの切り捨て値とする。 -
truncatedVisibleWidth を
[[visible width]]に代入。 -
truncatedVisibleHeight を
visibleRect.heightの切り捨て値とする。 -
truncatedVisibleHeight を
[[visible height]]に代入。
-
-
それ以外の場合:
-
[[coded width]]を[[visible width]]に代入。
-
-
Parse Rotation アルゴリズムを init.
rotationで実行し、 結果を[[rotation]]に代入。 -
displayWidthとdisplayHeightが init に 存在する場合は、 それぞれを[[display width]]、[[display height]]に代入する。 -
それ以外の場合:
-
[[rotation]]が0または180の場合: -
それ以外の場合:
-
-
init の
timestamp、durationを[[timestamp]]、[[duration]]に代入。 -
colorSpace を
undefinedとする。 -
init.
colorSpaceが 存在する場合は、その値を colorSpace に代入。 -
init の
formatを[[format]]に代入する。 -
Pick Color Space アルゴリズムを colorSpace と
[[format]]で実行した結果を[[color space]]に代入する。 -
Copy VideoFrame metadata を init の
metadataで呼び出した結果を frame の[[metadata]]に代入する。
-
-
frame を返す。
9.4.3. 属性
format, 型は VideoPixelFormat、読み取り専用、nullable-
各プレーン内のバイトの配置、プレーン数および順序を記述します。基礎となるフォーマットが
VideoPixelFormatに該当しない場合や、[[Detached]]がtrueの場合はnullになります。formatの getter 手順は[[format]]を返します。 codedWidth, 型は unsigned long、読み取り専用-
この
VideoFrameのピクセル幅(非表示パディングを含む場合あり、比率調整前)。codedWidthの getter 手順は[[coded width]]を返します。 codedHeight, 型は unsigned long、読み取り専用-
この
VideoFrameのピクセル高さ(非表示パディングを含む場合あり、比率調整前)。codedHeightの getter 手順は[[coded height]]を返します。 codedRect, 型は DOMRectReadOnly、読み取り専用、nullable-
DOMRectReadOnlyで、widthとheightがcodedWidthとcodedHeightに一致し、x/yが(0,0)になります。allocationSize()やcopyTo()で便利に使えます。codedRectの getter 手順:-
[[Detached]]がtrueならnullを返す。 -
rect を新しい
DOMRectReadOnlyとし、次のように初期化:-
[[coded width]]と[[coded height]]をwidthとheightにそれぞれ代入。
-
rect を返す。
-
visibleRect, 型は DOMRectReadOnly、読み取り専用、nullable-
この
VideoFrameのピクセルの可視矩形を記述するDOMRectReadOnly。visibleRectの getter 手順:-
[[Detached]]がtrueならnullを返す。 -
rect を新しい
DOMRectReadOnlyとし、次のように初期化:-
[[visible left]]、[[visible top]]、[[visible width]]、[[visible height]]をx、y、width、heightにそれぞれ代入。
-
-
rect を返す。
-
rotation, 型は double、読み取り専用-
描画時に VideoFrame に適用される回転(時計回り度数)。回転は flip より先に適用。
rotationの getter 手順は[[rotation]]を返します。 flip, 型は boolean、読み取り専用-
描画時に
VideoFrameに水平反転が適用されるかどうか。 flip は回転の後に適用。 displayWidth, 型は unsigned long、読み取り専用-
回転およびアスペクト比調整後に表示される VideoFrame の幅。
displayWidthの getter 手順は[[display width]]を返します。 displayHeight, 型は unsigned long、読み取り専用-
回転およびアスペクト比調整後に表示される VideoFrame の高さ。
displayHeightの getter 手順は[[display height]]を返します。 timestamp, 型は long long、読み取り専用-
表示タイムスタンプ(マイクロ秒単位)。デコード時は対応する
EncodedVideoChunkからコピーされ、 エンコード時はこのVideoFrameから対応するEncodedVideoChunkへコピーされます。timestampの getter 手順は[[timestamp]]を返します。 duration, 型は unsigned long long、読み取り専用、nullable-
表示継続時間(マイクロ秒単位)。この値は対応する
EncodedVideoChunkからコピーされます。durationの getter 手順は[[duration]]を返します。 colorSpace, 型は VideoColorSpace、読み取り専用-
このフレームに関連付けられた
VideoColorSpace。colorSpaceの getter 手順は[[color space]]を返します。
9.4.4. 内部構造
combined buffer layout(複合バッファレイアウト)は、構造体であり、次で構成されます:-
allocationSize(割り当てサイズ)(
unsigned long型) -
computedLayouts(計算済みレイアウト)(リスト型、要素は computed plane layout構造体)
computed plane layout(計算済みプレーンレイアウト)は、構造体であり、次で構成されます:
-
destinationOffset(出力オフセット)(
unsigned long型) -
destinationStride(出力ストライド)(
unsigned long型) -
sourceTop(ソース上端)(
unsigned long型) -
sourceHeight(ソース高さ)(
unsigned long型) -
sourceLeftBytes(ソース左端バイト数)(
unsigned long型) -
sourceWidthBytes(ソース幅バイト数)(
unsigned long型)
9.4.5. メソッド
allocationSize(options)-
指定した
BufferSourceをcopyTo()で利用する場合の最小バイト長を返します。呼び出し時の手順:
-
[[Detached]]がtrueの場合、InvalidStateErrorDOMExceptionをスローします。 -
[[format]]がnullの場合、NotSupportedErrorDOMExceptionをスローします。 -
Parse VideoFrameCopyToOptions アルゴリズムを options で実行し、結果を combinedLayout とする。
-
combinedLayout が例外なら、それをスローする。
-
combinedLayout の allocationSize を返す。
-
copyTo(destination, options)-
このフレームのプレーンを destination に options に従って非同期でコピーします。データのフォーマットは options.
formatが 存在する場合はそれ、なければ thisVideoFrameのformatです。注意:
copyTo()を複数回呼び出した際、返却される Promise の解決順序は保証されません。呼び出し時の手順:
-
[[Detached]]がtrueの場合、Promise をInvalidStateErrorDOMExceptionでリジェクトして返す。 -
[[format]]がnullの場合、Promise をNotSupportedErrorDOMExceptionでリジェクトして返す。 -
Parse VideoFrameCopyToOptions アルゴリズムを options で実行し、結果を combinedLayout とする。
-
combinedLayout が例外なら、Promise を combinedLayout でリジェクトして返す。
-
destination.byteLengthが combinedLayout の allocationSize より小さい場合、Promise をTypeErrorでリジェクトして返す。 -
options.
formatがRGBA,RGBX,BGRA,BGRXのいずれかである場合:-
Clone Configuration アルゴリズムを options で実行し、結果を newOptions とする。
-
newOptions.
formatにundefinedを代入。 -
Convert to RGB frame アルゴリズムを this、options.
format、 options.colorSpaceで実行し、結果を rgbFrame とする。 -
rgbFrame に destination と newOptions で
copyTo()を呼び出した結果を返す。
-
-
p を新しい
Promiseとする。 -
parallel queue を開始し、結果を copyStepsQueue とする。
-
planeLayouts を新しい リストとする。
-
copyStepsQueue に以下の手順をエンキュー:
-
[[resource reference]]が参照する media resource を resource とする。 -
[[format]]で定義されたプレーン数を numPlanes とする。 -
planeIndex を
0とする。 -
planeIndex が combinedLayout の numPlanes より小さい間:
-
resource 内の planeIndex で識別されるプレーンのストライドを sourceStride とする。
-
combinedLayout の computedLayouts の planeIndex 位置の computed plane layout を computedLayout とする。
-
computedLayout の sourceTop × sourceStride を sourceOffset とする。
-
computedLayout の sourceLeftBytes を sourceOffset に加算。
-
computedLayout の destinationOffset を destinationOffset とする。
-
computedLayout の sourceWidthBytes を rowBytes とする。
-
新しい
PlaneLayoutを layout とし、offsetに destinationOffset、strideに rowBytes を代入。 -
row を
0とする。 -
row が computedLayout の sourceHeight より小さい間:
-
resource の sourceOffset から destination の destinationOffset へ rowBytes バイトコピー。
-
sourceOffset に sourceStride を加算。
-
destinationOffset に computedLayout の destinationStride を加算。
-
row を
1加算。
-
-
planeIndex を
1加算。 -
layout を planeLayouts に追加。
-
-
Queue a task で p を planeLayouts で解決。
-
-
p を返す。
-
clone()-
同じ media resource を参照する新しい
VideoFrameを生成します。呼び出し時の手順:
-
frame の
[[Detached]]がtrueの場合、InvalidStateErrorDOMExceptionをスローする。 -
Clone VideoFrame アルゴリズムを this で実行した結果を返す。
-
close()-
すべての状態をクリアし、media resource への参照を解放します。 close は最終操作です。
呼び出し時、Close VideoFrame アルゴリズムを this で実行します。
metadata()-
このフレームに関連付けられている
VideoFrameMetadataを取得します。呼び出し時の手順:
-
[[Detached]]がtrueの場合、InvalidStateErrorDOMExceptionをスローする。 -
Copy VideoFrame metadata を
[[metadata]]で呼び出した結果を返す。
-
9.4.6. アルゴリズム
- VideoFrameを作成する(output, timestamp, duration, displayAspectWidth, displayAspectHeight, colorSpace, rotation, flip を受け取る)
-
-
frame を新しい
VideoFrameとして、以下のように構築する:-
[[Detached]]にfalseを代入する。 -
resource を output で記述される media resource とする。
-
resourceReference を resource への参照とする。
-
resourceReference を
[[resource reference]]に代入する。 -
output が認識可能な
VideoPixelFormatを使っている場合はそのフォーマットを[[format]]に代入し、 そうでなければ[[format]]にnullを代入する。 -
codedWidth と codedHeight を output のピクセル単位のcoded幅・高さとする。
-
visibleLeft, visibleTop, visibleWidth, visibleHeight を output の可視矩形の左端・上端・幅・高さとする。
-
displayWidth と displayHeight を output の表示サイズ(ピクセル単位)とする。
-
displayAspectWidth と displayAspectHeight が指定されている場合は、 displayWidth または displayHeight を増やして displayWidth / displayHeight の比率が displayAspectWidth / displayAspectHeight と一致するまで調整する。
-
codedWidth、codedHeight、visibleLeft、 visibleTop、 visibleWidth、visibleHeight、displayWidth、displayHeight を、
[[coded width]]、[[coded height]]、[[visible left]]、[[visible top]]、[[visible width]]、[[visible height]]にそれぞれ代入する。 -
duration と timestamp を
[[duration]]、[[timestamp]]にそれぞれ代入する。 -
[[color space]]に Pick Color Space アルゴリズムを colorSpace と[[format]]で実行した結果を代入する。
-
-
frame を返す。
-
- Color Space を選択する(overrideColorSpace, format を受け取る)
-
-
overrideColorSpace が指定されていれば、それを使って新しい
VideoColorSpaceを構築して返す。ユーザーエージェントは、overrideColorSpace の
nullメンバーを実装依存の推論値で置換してもよい MAY。 -
それ以外で
[[format]]が RGB format の場合は、新しい sRGB Color Space インスタンスを返す。 -
それ以外の場合は、新しい REC709 Color Space インスタンスを返す。
-
- VideoFrameInitを検証する(format, codedWidth, codedHeight を受け取る)
-
-
visibleRectが 存在する場合:-
Verify Rect Offset Alignment を format と visibleRect で実行し、結果を validAlignment とする。
-
validAlignment が
falseならfalseを返す。 -
visibleRectのどの属性も負または有限値でない場合はfalseを返す。 -
visibleRect.width==0またはvisibleRect.height==0の場合はfalseを返す。 -
visibleRect.y+visibleRect.height> codedHeight の場合はfalseを返す。 -
visibleRect.x+visibleRect.width> codedWidth の場合はfalseを返す。
-
-
codedWidth = 0 または codedHeight = 0 の場合は
falseを返す。 -
displayWidth、displayHeightのいずれか一方のみが 存在する場合はfalseを返す。 -
displayWidth==0またはdisplayHeight==0の場合はfalseを返す。 -
trueを返す。
-
-
VideoFrameBufferInitが valid VideoFrameBufferInit か判定するには、以下の手順を実行する: -
-
codedWidth= 0 またはcodedHeight= 0 の場合はfalseを返す。 -
visibleRectのどの属性も負または有限値でない場合はfalseを返す。 -
visibleRect.y+visibleRect.height>codedHeightの場合はfalseを返す。 -
visibleRect.x+visibleRect.width>codedWidthの場合はfalseを返す。 -
displayWidth、displayHeightのいずれか一方のみが 存在する場合はfalseを返す。 -
displayWidth= 0 またはdisplayHeight= 0 の場合はfalseを返す。 -
trueを返す。
-
- 他のフレームからフレームを初期化する(init, frame, otherFrame を受け取る)
-
-
format を otherFrame.
formatとする。 -
init.
alphaがdiscardの場合、 otherFrame.formatの equivalent opaque format を format に代入する。 -
Validate VideoFrameInit アルゴリズムを format、otherFrame の
[[coded width]]、[[coded height]]で実行し、結果を validInit とする。 -
validInit が
falseの場合はTypeErrorをスローする。 -
resource を otherFrame の
[[resource reference]]が参照する media resource とする。 -
resource への新しい参照を frame の
[[resource reference]]に代入する。 -
otherFrame から frame へ以下の属性を代入する:
codedWidth、codedHeight、colorSpace。 -
defaultVisibleRect を otherFrame の
visibleRectのgetter手順を実行した結果とする。 -
baseRotation と baseFlip を otherFrame の
[[rotation]]、[[flip]]とする。 -
defaultDisplayWidth と defaultDisplayHeight を otherFrame の
[[display width]]、[[display height]]とする。 -
Initialize Visible Rect, Orientation, and Display Size アルゴリズムを init, frame, defaultVisibleRect, baseRotation, baseFlip, defaultDisplayWidth, defaultDisplayHeight で実行する。
-
durationが init に 存在すれば、frame の[[duration]]に代入し、なければ otherFrame.durationを frame の[[duration]]に代入する。 -
timestampが init に 存在すれば、frame の[[timestamp]]に代入し、なければ otherFrame のtimestampを frame の[[timestamp]]に代入する。 -
format を frame の
[[format]]に代入する。 -
Copy VideoFrame metadata を init の
metadataで呼び出した結果を frame の[[metadata]]に代入する。
-
- リソースでフレームを初期化する(init, frame, resource, codedWidth, codedHeight, baseRotation, baseFlip, defaultDisplayWidth, defaultDisplayHeight を受け取る)
-
-
format を
nullとする。 -
resource が認識可能な
VideoPixelFormatを使っている場合、 resource のVideoPixelFormatを format に代入する。 -
Validate VideoFrameInit アルゴリズムを format, width, height で実行し、結果を validInit とする。
-
validInit が
falseの場合、TypeErrorをスローする。 -
resource への新しい参照を frame の
[[resource reference]]に代入する。 -
init.
alphaがdiscardの場合、 format の equivalent opaque format を format に代入する。 -
format を
[[format]]に代入する。 -
codedWidth と codedHeight を frame の
[[coded width]]、[[coded height]]にそれぞれ代入する。 -
defaultVisibleRect を
DOMRectの新しいインスタンスとして、 «[ "x:" →0, "y" →0, "width" → codedWidth, "height" → codedHeight ]» で構築する。 -
Initialize Visible Rect, Orientation, and Display Size アルゴリズムを init, frame, defaultVisibleRect, defaultDisplayWidth, defaultDisplayHeight で実行する。
-
init.durationを frame の[[duration]]に代入する。 -
init.timestampを frame の[[timestamp]]に代入する。 -
resource が既知の
VideoColorSpaceを持つ場合は、その値を[[color space]]に代入する。 -
それ以外の場合は、空の
VideoColorSpaceInitで構築した新しいVideoColorSpaceを[[color space]]に代入する。
-
- 可視矩形・向き・表示サイズを初期化する (init, frame, defaultVisibleRect, baseRotation, baseFlip, defaultDisplayWidth, defaultDisplayHeight を受け取る)
-
-
visibleRect を defaultVisibleRect とする。
-
init.
visibleRectが 存在する場合は、それを visibleRect に代入する。 -
visibleRect の
x、y、width、heightを frame の[[visible left]]、[[visible top]]、[[visible width]]、[[visible height]]にそれぞれ代入する。 -
Parse Rotation アルゴリズムを init.
rotationで実行し、結果を rotation とする。 -
Add Rotations アルゴリズムを baseRotation, baseFlip, rotation で実行した結果を frame の
[[rotation]]に代入する。 -
baseFlip が init.
flipと等しい場合、 frame の[[flip]]にfalseを、 そうでなければ[[flip]]にtrueを代入する。 -
displayWidthとdisplayHeightが init に 存在する場合は、それぞれ[[display width]]、[[display height]]に代入する。 -
それ以外の場合:
-
baseRotation が
0または180の場合: -
それ以外の場合:
-
displayWidth を
|frame|'s {{VideoFrame/[[visible width]]}} * |widthScale|(四捨五入)とする。 -
displayHeight を
|frame|'s {{VideoFrame/[[visible height]]}} * |heightScale|(四捨五入)とする。 -
rotation が
0または180の場合:-
displayWidth を frame の
[[display width]]に代入する。 -
displayHeight を frame の
[[display height]]に代入する。
-
-
それ以外の場合:
-
displayHeight を frame の
[[display width]]に代入する。 -
displayWidth を frame の
[[display height]]に代入する。
-
-
-
- VideoFrameを複製する(frame を受け取る)
-
-
clone を新しい
VideoFrameとして、以下のように初期化する:-
resource を frame の
[[resource reference]]が参照する media resource とする。 -
newReference を resource への新しい参照とする。
-
newReference を clone の
[[resource reference]]に代入する。 -
frame の残りの内部スロット(
[[resource reference]]を除く)を同名の clone の内部スロットに代入する。
-
-
clone を返す。
-
- VideoFrameを閉じる(frame を受け取る)
-
-
frame の
[[resource reference]]にnullを代入する。 -
frame の
[[Detached]]にtrueを代入する。 -
frame の
formatにnullを代入する。 -
frame の
[[coded width]]、[[coded height]]、[[visible left]]、[[visible top]]、[[visible width]]、[[visible height]]、[[rotation]]、[[display width]]、[[display height]]に0を代入する。 -
frame の
[[flip]]にfalseを代入する。 -
frame の
[[metadata]]に新しいVideoFrameMetadataを代入する。
-
- 回転をパースする(rotation を受け取る)
-
-
alignedRotation を rotation に最も近い
90の倍数(同値は正の無限大方向に丸める)とする。 -
fullTurns を alignedRotation 以下で最大の
360の倍数とする。 -
|alignedRotation| - |fullTurns|を返す。
-
- 回転を加算する(baseRotation, baseFlip, rotation を受け取る)
-
-
baseFlip が
falseの場合、combinedRotation を|baseRotation| + |rotation|とし、そうでなければ|baseRotation| - |rotation|とする。 -
fullTurns を combinedRotation 以下で最大の
360の倍数とする。 -
|combinedRotation| - |fullTurns|を返す。
-
- VideoFrameCopyToOptionsをパースする(options を受け取る)
-
-
defaultRect を
visibleRectのgetter手順で得た値とする。 -
overrideRect を
undefinedとする。 -
parsedRect を Parse Visible Rect アルゴリズムを defaultRect, overrideRect,
[[coded width]],[[coded height]],[[format]]で実行した結果とする。 -
parsedRect が例外ならそれを返す。
-
optLayout を
undefinedとする。 -
format を
undefinedとする。 -
options.
formatが 存在しない場合、[[format]]を format に代入する。 -
それ以外で options.
formatがRGBA、RGBX、BGRA、BGRXのいずれかの場合は、その値を format に代入し、 それ以外の場合はNotSupportedErrorを返す。 -
combinedLayout を Compute Layout and Allocation Size アルゴリズムを parsedRect, format, optLayout で実行した結果とする。
-
combinedLayout を返す。
-
- 矩形オフセットのアラインメントを検証する(format, rect を受け取る)
-
-
format が
nullの場合はtrueを返す。 -
planeIndex を
0とする。 -
numPlanes を format で定義されるプレーン数とする。
-
planeIndex が numPlanes より小さい間:
-
plane を format で定義される planeIndex のプレーンとする。
-
sampleWidth を plane の各サブサンプルの水平方向サブサンプリング係数とする。
-
sampleHeight を plane の各サブサンプルの垂直方向サブサンプリング係数とする。
-
rect.
xが sampleWidth の倍数でなければfalseを返す。 -
rect.
yが sampleHeight の倍数でなければfalseを返す。 -
planeIndex を
1加算する。
-
-
trueを返す。
-
- 可視矩形をパースする(defaultRect, overrideRect, codedWidth, codedHeight, format を受け取る)
-
-
sourceRect を defaultRect とする。
-
overrideRect が
undefinedでない場合: -
矩形オフセットのアラインメントを検証する アルゴリズムを format, sourceRect で実行した結果を validAlignment とする。
-
validAlignment が
falseの場合はTypeErrorをスローする。 -
sourceRect を返す。
-
- レイアウトと割り当てサイズを計算する(parsedRect, format, layout を受け取る)
-
-
numPlanes を format で定義されるプレーン数とする。
-
layout が
undefinedでなく、かつその長さが numPlanes と異なる場合は、TypeErrorをスローする。 -
minAllocationSize を
0とする。 -
computedLayouts を新しい リストとする。
-
endOffsets を新しい リストとする。
-
planeIndex を
0とする。 -
planeIndex < numPlanes の間:
-
plane を format で定義される planeIndex のプレーンとする。
-
sampleBytes を plane のサンプルあたりのバイト数とする。
-
sampleWidth を plane の各サブサンプルの水平方向サブサンプリング係数とする。
-
sampleHeight を plane の各サブサンプルの垂直方向サブサンプリング係数とする。
-
computedLayout を新しい 計算済みプレーンレイアウトとする。
-
computedLayout の sourceTop に、切り捨てた parsedRect.
yを sampleHeight で割り、切り上げした値を代入する。 -
computedLayout の sourceHeight に、切り捨てた parsedRect.
heightを sampleHeight で割り、切り上げした値を代入する。 -
computedLayout の sourceLeftBytes に、切り捨てた parsedRect.
xを sampleWidth で割った整数値に sampleBytes を掛けた値を代入する。 -
computedLayout の sourceWidthBytes に、切り捨てた parsedRect.
widthを sampleWidth で割った整数値に sampleBytes を掛けた値を代入する。 -
layout が
undefinedでない場合:-
planeLayout を layout の planeIndex 位置の
PlaneLayoutとする。 -
planeLayout.
strideが computedLayout の sourceWidthBytes より小さい場合、TypeErrorを返す。 -
planeLayout.
offsetを computedLayout の destinationOffset に代入する。 -
planeLayout.
strideを computedLayout の destinationStride に代入する。
-
-
それ以外の場合:
注意: 明示的なレイアウトが指定されていない場合、以下の手順はタイトパック(隙間なく配置)のデフォルト動作です。
-
computedLayout の destinationOffset に minAllocationSize を代入する。
-
computedLayout の destinationStride に computedLayout の sourceWidthBytes を代入する。
-
-
planeSize を computedLayout の destinationStride × sourceHeight の積とする。
-
planeEnd を planeSize + computedLayout の destinationOffset の合計とする。
-
planeSize または planeEnd が
unsigned longの最大値を超える場合、TypeErrorを返す。 -
endOffsets に planeEnd を追加する。
-
minAllocationSize を minAllocationSize と planeEnd の最大値で更新する。
注意: 上記のステップは、ユーザー指定のプレーンオフセットによるプレーン順序変更の可能性を考慮しています。
-
earlierPlaneIndex を
0とする。 -
earlierPlaneIndex が planeIndex より小さい間:
-
earlierLayout を
computedLayouts[earlierPlaneIndex]とする。 -
endOffsets[planeIndex]が earlierLayout の destinationOffset 以下、またはendOffsets[earlierPlaneIndex]が computedLayout の destinationOffset 以下なら、処理を続行。注意: プレーンAがプレーンBの開始前で終わる場合、両者は重なりません。
-
それ以外の場合、
TypeErrorを返す。 -
earlierPlaneIndex を
1加算する。
-
-
computedLayouts に computedLayout を追加する。
-
planeIndex を
1加算する。
-
-
combinedLayout を新しい 複合バッファレイアウトとして以下のように初期化する:
-
computedLayouts を computedLayouts に代入する。
-
minAllocationSize を allocationSize に代入する。
-
-
combinedLayout を返す。
-
- PredefinedColorSpace を VideoColorSpace に変換する(colorSpace を受け取る)
-
-
アサート: colorSpace は
srgbまたはdisplay-p3のいずれかと等しいこと。 -
colorSpace が
srgbと等しい場合、新しい sRGB カラースペース インスタンスを返す。 -
colorSpace が
display-p3と等しい場合、新しい Display P3 カラースペース インスタンスを返す。
-
- RGBフレームへ変換する(frame, format, colorSpace を受け取る)
-
-
このアルゴリズムは format が
RGBA,RGBX,BGRA,BGRXのいずれかと等しい場合のみ MUST 呼び出されなければならない。 -
convertedFrame を新しい
VideoFrameとして、以下のように構築する:-
[[Detached]]にfalseを代入する。 -
[[format]]に format を代入する。 -
width を frame の
[[visible width]]とする。 -
height を frame の
[[visible height]]とする。 -
width, height, 0, 0, width, height, width, height をそれぞれ
[[coded width]]、[[coded height]]、[[visible left]]、[[visible top]]、[[visible width]]、[[visible height]]にそれぞれ代入する。 -
frame の
[[duration]]と[[timestamp]]を[[duration]]、[[timestamp]]にそれぞれ代入する。 -
PredefinedColorSpace を VideoColorSpace に変換する アルゴリズムを colorSpace で実行し、その結果を
[[color space]]に代入する。 -
resource を、frame の
[[resource reference]]が参照する media resource を[[color space]]と[[format]]で指定されたカラースペース・ピクセルフォーマットに変換した結果を格納する新しい media resource とする。 -
resource の参照を
[[resource reference]]に代入する。
-
-
convertedFrame を返す。
-
- VideoFrame メタデータを複製する(metadata を受け取る)
-
-
metadataCopySerialized を StructuredSerialize(metadata) の結果とする。
-
metadataCopy を StructuredDeserialize(metadataCopySerialized, 現在の Realm) の結果とする。
-
metadataCopy を返す。
-
このアルゴリズムの目的は、VideoFrame
が所有するメタデータが不変であることを保証することです。
9.4.7. 転送とシリアライズ
VideoFrameの 転送手順(value と dataHolder を受け取る)は以下:-
-
value の
[[Detached]]がtrueの場合、DataCloneErrorDOMExceptionをスローする。 -
value のすべての
VideoFrame内部スロットについて、その値を同名のフィールドとして dataHolder に代入する。 -
Close VideoFrame アルゴリズムを value で実行する。
-
VideoFrameの 転送受信手順(dataHolder と value を受け取る)は以下:-
-
dataHolder のすべてのフィールドについて、その値を同名の value の
VideoFrame内部スロットに代入する。
-
VideoFrameの シリアライズ手順(value, serialized, forStorage を受け取る)は以下:-
-
value の
[[Detached]]がtrueの場合、DataCloneErrorDOMExceptionをスローする。 -
forStorage が
trueの場合、DataCloneErrorをスローする。 -
resource を value の
[[resource reference]]が参照する media resource とする。 -
newReference を resource への新しい参照とする。
-
newReference を |serialized.resource reference| に代入する。
-
value の残りの
VideoFrame内部スロット([[resource reference]]を除く)について、その値を同名のフィールドとして serialized に代入する。
-
VideoFrameの デシリアライズ手順(serialized と value を受け取る)は以下:-
-
serialized のすべてのフィールドについて、その値を同名の value の
VideoFrame内部スロットに代入する。
-
9.4.8. 描画
描画時(例:CanvasDrawImage
drawImage()
など)、VideoFrame は
レンダリングターゲットに互換性のあるカラースペースに変換されなければならない MUST。
(カラースペース変換が明示的に無効化されていない限り)
ImageBitmap
構築時のカラースペース変換は ImageBitmapOptions
の colorSpaceConversion
で制御される。
この値を "none"
に設定すると
カラースペース変換は無効化される。
VideoFrame
の描画は、media resource から生成され、
必要なカラースペース変換・visibleRect
への切り抜き、
rotation
度の時計回り回転、
flip
が true の場合は水平反転を適用して生成される。
9.5. VideoFrame CopyTo() オプション
ピクセルの矩形領域、フォーマット、宛先バッファのプレーンごとのオフセットとストライドを指定するオプション。dictionary {VideoFrameCopyToOptions DOMRectInit rect ;sequence <PlaneLayout >layout ;VideoPixelFormat format ;PredefinedColorSpace colorSpace ; };
copyTo()、
allocationSize()
の手順で以下の要件が強制される:
-
rectの座標は[[format]]によりサンプルアラインメントされている必要あり。 -
layoutが 存在する場合、すべてのプレーンにPlaneLayoutが指定されている必要あり。
rect, 型は DOMRectInit-
DOMRectInitでVideoFrameからコピーするピクセル矩形領域を記述。 指定がない場合、visibleRectが使用される。注意: コーデッド矩形領域は
VideoFrameのcodedRectを渡すことで指定可能。注意: デフォルトの
rectは必ずしもサンプルアラインメント条件を満たさず、copyTo()やallocationSize()でリジェクトされる場合あり。 layout, 型は sequence<PlaneLayout>-
PlaneLayoutをVideoFrameの各プレーンに指定し、 宛先BufferSourceでの各プレーンのオフセット・ストライドを指定できる。 指定がない場合はタイトパック(隙間なく配置)。プレーンが重複する指定は無効。 format, 型は VideoPixelFormat-
宛先
BufferSourceのピクセルデータのVideoPixelFormat。 指定可能値はRGBA、RGBX、BGRA、BGRX。 存在しない場合は、宛先BufferSourceはformatと同じフォーマットになる。 colorSpace, 型は PredefinedColorSpace-
宛先
BufferSourceのピクセルデータのターゲットカラースペースとして MUST 使用されるPredefinedColorSpace。 ただしformatがRGBA、RGBX、BGRA、BGRXの場合のみ有効。 それ以外の場合は無視される。 存在しない場合はsrgbが利用される。
9.6. VideoFrameにおけるDOMRect
VideoFrame
インターフェイスは、DOMRect
を使ってピクセルの矩形領域の位置とサイズを指定します。DOMRectInit
は
copyTo()
や allocationSize()
で
ソース矩形の寸法を指定するために利用されます。VideoFrame には
codedRect
および visibleRect
が定義されており、
それぞれコーデッドサイズや可視領域のコピーに便利に使えます。
注意: VideoFrameのピクセルは整数値のみでアドレス指定できます。DOMRectInit
に渡された浮動小数点値はすべて切り捨てられます。
9.7. プレーンレイアウト
PlaneLayout
は、VideoFrameのプレーンを
BufferSource
にコピーした際のオフセットとストライドを指定する辞書です。
PlaneLayout
のシーケンスは
MAY VideoFrame の
copyTo()
に渡すことで、宛先
BufferSource
内のプレーン配置を指定できます。
あるいは、呼び出し側は copyTo()
が返す PlaneLayout
のシーケンスを調べることで、
ユーザーエージェントが決定したプレーンのオフセットやストライドを知ることができます。
dictionary { [PlaneLayout EnforceRange ]required unsigned long offset ; [EnforceRange ]required unsigned long stride ; };
offset, 型は unsigned long-
指定されたプレーンが
BufferSource内で始まるバイトオフセット。 stride, 型は unsigned long-
そのプレーンの各行が
BufferSource内で使用する(パディング込)バイト数。
9.8. ピクセルフォーマット
ピクセルフォーマットは各プレーン内のバイト配置、プレーン数、順序を記述します。各フォーマットの詳細は個別のサブセクションで説明します。enum { // 4:2:0 Y, U, VVideoPixelFormat "I420" ,"I420P10" ,"I420P12" , // 4:2:0 Y, U, V, A"I420A" ,"I420AP10" ,"I420AP12" , // 4:2:2 Y, U, V"I422" ,"I422P10" ,"I422P12" , // 4:2:2 Y, U, V, A"I422A" ,"I422AP10" ,"I422AP12" , // 4:4:4 Y, U, V"I444" ,"I444P10" ,"I444P12" , // 4:4:4 Y, U, V, A"I444A" ,"I444AP10" ,"I444AP12" , // 4:2:0 Y, UV"NV12" , // 4:4:4 RGBA"RGBA" , // 4:4:4 RGBX (opaque)"RGBX" , // 4:4:4 BGRA"BGRA" , // 4:4:4 BGRX (opaque)"BGRX" , };
サブサンプリングは、単一のサンプルが最終画像の複数のピクセルに関する情報を含む手法です。サブサンプリングは水平方向、垂直方向、あるいはその両方で行われることがあり、係数(サブサンプリングされたサンプルから派生する最終画像内のピクセル数)を持ちます。
If a VideoFrame
is in I420
format, then the very first
component of the second plane (the U plane) corresponds to four pixels, that are
the pixels in the top-left angle of the image. Consequently, the first
component of the second row corresponds to the four pixels below those initial
four top-left pixels. The sub-sampling factor is 2 in both the horizontal
and vertical direction.
VideoPixelFormat
にアルファ成分がある場合、そのフォーマットの
等価の不透明フォーマットは、アルファ成分を除いた同じ VideoPixelFormat
です。もし VideoPixelFormat
にアルファ成分が含まれていない場合、それ自体が等価の不透明フォーマットとなります。
整数値は特に指定がない限り符号なしです。
I420-
このフォーマットは3つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で、それぞれ Y, U, V と呼ばれ、この順序で存在します。Planar YUV 4:2:0 とも呼ばれます。
U および V プレーンは サブサンプリング により、Y プレーンと比較して水平方向・垂直方向ともに 係数 2 で縮小されています。
このフォーマットの各サンプルは8ビットです。
Y プレーンには
codedWidth*codedHeightサンプル(したがってバイト)が含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。U および V プレーンの行数は、
codedHeightを 2 で割った結果を切り上げた整数です。各行のサンプル数は、codedWidthを 2 で割った結果を切り上げた整数です。サンプルは画像の左上から順に配置されます。可視矩形のオフセット(
visibleRect.xおよびvisibleRect.y) は MUST 偶数でなければなりません。 I420P10-
このフォーマットは3つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で、それぞれ Y, U, V と呼ばれ、この順序で存在します。
U および V プレーンは サブサンプリング により、Y プレーンと比較して水平方向・垂直方向ともに 係数 2 で縮小されています。
このフォーマットの各サンプルは10ビットで、リトルエンディアンの 16 ビット整数としてエンコードされます。
Y プレーンには
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。U および V プレーンの行数は、
codedHeightを 2 で割った結果を切り上げた整数です。各行のサンプル数は、codedWidthを 2 で割った結果を切り上げた整数です。サンプルは画像の左上から順に配置されます。可視矩形のオフセット(
visibleRect.xおよびvisibleRect.y) は MUST 偶数でなければなりません。 I420P12-
このフォーマットは3つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で、それぞれ Y, U, V と呼ばれ、この順序で存在します。
U および V プレーンは サブサンプリング により、Y プレーンと比較して水平方向・垂直方向ともに 係数 2 で縮小されています。
このフォーマットの各サンプルは12ビットで、リトルエンディアンの 16 ビット整数としてエンコードされます。
Y プレーンには
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。U および V プレーンの行数は、
codedHeightを 2 で割った結果を切り上げた整数です。各行のサンプル数は、codedWidthを 2 で割った結果を切り上げた整数です。サンプルは画像の左上から順に配置されます。可視矩形のオフセット(
visibleRect.xおよびvisibleRect.y) は MUST 偶数でなければなりません。 I420A-
このフォーマットは4つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で(Y, U, V)、さらにアルファ値のプレーンがあり、この順序で存在します。アルファチャネル付きの Planar YUV 4:2:0 とも呼ばれます。
U および V プレーンは サブサンプリング により、Y および Alpha プレーンと比較して水平方向・垂直方向ともに 係数 2 で縮小されています。
このフォーマットの各サンプルは8ビットです。
Y および Alpha プレーンには
codedWidth*codedHeightサンプル(したがってバイト)が含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。U および V プレーンの行数は、
codedHeightを 2 で割った結果を切り上げた整数です。各行のサンプル数は、codedWidthを 2 で割った結果を切り上げた整数です。サンプルは画像の左上から順に配置されます。可視矩形のオフセット(
visibleRect.xおよびvisibleRect.y) は MUST 偶数でなければなりません。I420Aの 等価の不透明フォーマット はI420です。 I420AP10-
このフォーマットは4つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で(Y, U, V)、さらにアルファ値のプレーンがあり、この順序で存在します。
U および V プレーンは サブサンプリング により、Y および Alpha プレーンと比較して水平方向・垂直方向ともに 係数 2 で縮小されています。
このフォーマットの各サンプルは10ビットで、リトルエンディアンの 16 ビット整数としてエンコードされます。
Y および Alpha プレーンには
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。U および V プレーンの行数は、
codedHeightを 2 で割った結果を切り上げた整数です。各行のサンプル数は、codedWidthを 2 で割った結果を切り上げた整数です。サンプルは画像の左上から順に配置されます。可視矩形のオフセット(
visibleRect.xおよびvisibleRect.y) は MUST 偶数でなければなりません。I420AP10の 等価の不透明フォーマット はI420P10です。 I420AP12-
このフォーマットは4つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で(Y, U, V)、さらにアルファ値のプレーンがあり、この順序で存在します。
U および V プレーンは サブサンプリング により、Y および Alpha プレーンと比較して水平方向・垂直方向ともに 係数 2 で縮小されています。
このフォーマットの各サンプルは12ビットで、リトルエンディアンの 16 ビット整数としてエンコードされます。
Y および Alpha プレーンには
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。U および V プレーンの行数は、
codedHeightを 2 で割った結果を切り上げた整数です。各行のサンプル数は、codedWidthを 2 で割った結果を切り上げた整数です。サンプルは画像の左上から順に配置されます。可視矩形のオフセット(
visibleRect.xおよびvisibleRect.y) は MUST 偶数でなければなりません。I420AP12の 等価の不透明フォーマット はI420P12です。 I422-
このフォーマットは3つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で、それぞれ Y, U, V と呼ばれ、この順序で存在します。Planar YUV 4:2:2 とも呼ばれます。
U および V プレーンは サブサンプリング により、Y プレーンと比較して水平方向にのみ 係数 2 で縮小され、垂直方向にはサブサンプリングされません。
このフォーマットの各サンプルは8ビットです。
Y プレーンには
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。U および V プレーンは
codedHeight行を持ちます。各行のサンプル数は、codedWidthを 2 で割った結果を切り上げた整数です。サンプルは画像の左上から順に配置されます。可視矩形の水平方向オフセット(
visibleRect.x) は MUST 偶数でなければなりません。 I422P10-
このフォーマットは3つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で、それぞれ Y, U, V と呼ばれ、この順序で存在します。
U および V プレーンは サブサンプリング により、Y プレーンと比較して水平方向にのみ 係数 2 で縮小され、垂直方向にはサブサンプリングされません。
このフォーマットの各サンプルは10ビットで、リトルエンディアンの 16 ビット整数としてエンコードされます。
Y プレーンには
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。U および V プレーンは
codedHeight行を持ちます。各行のサンプル数は、codedWidthを 2 で割った結果を切り上げた整数です。サンプルは画像の左上から順に配置されます。可視矩形の水平方向オフセット(
visibleRect.x) は MUST 偶数でなければなりません。 I422P12-
このフォーマットは3つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で、それぞれ Y, U, V と呼ばれ、この順序で存在します。
U および V プレーンは サブサンプリング により、Y プレーンと比較して水平方向にのみ 係数 2 で縮小され、垂直方向にはサブサンプリングされません。
このフォーマットの各サンプルは12ビットで、リトルエンディアンの 16 ビット整数としてエンコードされます。
Y プレーンには
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。U および V プレーンは
codedHeight行を持ちます。各行のサンプル数は、codedWidthを 2 で割った結果を切り上げた整数です。サンプルは画像の左上から順に配置されます。可視矩形の水平方向オフセット(
visibleRect.x) は MUST 偶数でなければなりません。 I422A-
このフォーマットは4つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で(Y, U, V)、さらにアルファ値のプレーンがあり、この順序で存在します。アルファチャネル付きの Planar YUV 4:2:2 とも呼ばれます。
U および V プレーンは サブサンプリング により、Y と Alpha プレーンと比較して水平方向にのみ 係数 2 で縮小され、垂直方向にはサブサンプリングされません。
このフォーマットの各サンプルは8ビットです。
Y および Alpha プレーンには
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。U および V プレーンは
codedHeight行を持ちます。各行のサンプル数は、codedWidthを 2 で割った結果を切り上げた整数です。サンプルは画像の左上から順に配置されます。可視矩形の水平方向オフセット(
visibleRect.x) は MUST 偶数でなければなりません。I422Aの 等価の不透明フォーマット はI422です。 I422AP10-
このフォーマットは4つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で(Y, U, V)、さらにアルファ値のプレーンがあり、この順序で存在します。
U および V プレーンは サブサンプリング により、Y と Alpha プレーンと比較して水平方向にのみ 係数 2 で縮小され、垂直方向にはサブサンプリングされません。
このフォーマットの各サンプルは10ビットで、リトルエンディアンの 16 ビット整数としてエンコードされます。
Y および Alpha プレーンには
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。U および V プレーンは
codedHeight行を持ちます。各行のサンプル数は、codedWidthを 2 で割った結果を切り上げた整数です。サンプルは画像の左上から順に配置されます。可視矩形の水平方向オフセット(
visibleRect.x) は MUST 偶数でなければなりません。I422AP10の 等価の不透明フォーマット はI420P10です。 I422AP12-
このフォーマットは4つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で(Y, U, V)、さらにアルファ値のプレーンがあり、この順序で存在します。
U および V プレーンは サブサンプリング により、Y と Alpha プレーンと比較して水平方向にのみ 係数 2 で縮小され、垂直方向にはサブサンプリングされません。
このフォーマットの各サンプルは12ビットで、リトルエンディアンの 16 ビット整数としてエンコードされます。
Y および Alpha プレーンには
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。U および V プレーンは
codedHeight行を持ちます。各行のサンプル数は、codedWidthを 2 で割った結果を切り上げた整数です。サンプルは画像の左上から順に配置されます。可視矩形の水平方向オフセット(
visibleRect.x) は MUST 偶数でなければなりません。I422AP10の 等価の不透明フォーマット はI420P10です。 I444-
このフォーマットは3つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で、それぞれ Y, U, V と呼ばれ、この順序で存在します。Planar YUV 4:4:4 とも呼ばれます。
このフォーマットは サブサンプリング を使用しません。
このフォーマットの各サンプルは8ビットです。
全てのプレーンにおいて、
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。 I444P10-
このフォーマットは3つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で、それぞれ Y, U, V と呼ばれ、この順序で存在します。
このフォーマットは サブサンプリング を使用しません。
このフォーマットの各サンプルは10ビットで、リトルエンディアンの 16 ビット整数としてエンコードされます。
全てのプレーンにおいて、
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。 I444P12-
このフォーマットは3つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で、それぞれ Y, U, V と呼ばれ、この順序で存在します。
このフォーマットは サブサンプリング を使用しません。
このフォーマットの各サンプルは12ビットで、リトルエンディアンの 16 ビット整数としてエンコードされます。
全てのプレーンにおいて、
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。 I444A-
このフォーマットは4つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で(Y, U, V)、さらにアルファ値のプレーンがあり、この順序で存在します。
このフォーマットは サブサンプリング を使用しません。
このフォーマットの各サンプルは8ビットです。
全ての4プレーンにおいて、
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。I444Aの 等価の不透明フォーマット はI444です。 I444AP10-
このフォーマットは4つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で(Y, U, V)、さらにアルファ値のプレーンがあり、この順序で存在します。
このフォーマットは サブサンプリング を使用しません。
このフォーマットの各サンプルは10ビットで、リトルエンディアンの 16 ビット整数としてエンコードされます。
全ての4プレーンにおいて、
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。I444AP10の 等価の不透明フォーマット はI444P10です。 I444AP12-
このフォーマットは4つの別個のプレーンで構成され、1つが輝度(Luma)、2つが色差(Chroma)で(Y, U, V)、さらにアルファ値のプレーンがあり、この順序で存在します。
このフォーマットは サブサンプリング を使用しません。
このフォーマットの各サンプルは12ビットで、リトルエンディアンの 16 ビット整数としてエンコードされます。
全ての4プレーンにおいて、
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。I444AP10の 等価の不透明フォーマット はI444P10です。 NV12-
このフォーマットは2つの別個のプレーンで構成され、1つが輝度(Y plane)で、もう1つが2つの色差成分を収めるプレーンです。プレーンはこの順序で存在し、それぞれ Y プレーンおよび UV プレーンと呼ばれます。
U および V 成分は サブサンプリング により、Y プレーン内の成分と比較して水平方向・垂直方向ともに 係数 2 で縮小されています。
このフォーマットの各サンプルは8ビットです。
Y プレーンには
codedWidth*codedHeightサンプルが含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。UV プレーンは、U と V の値が交互に格納された要素で構成され、行数は
codedHeightを 2 で割った結果を切り上げた整数です。各行の要素数はcodedWidthを 2 で割った結果を切り上げた整数です。各要素は2つの Chroma サンプル(U と V)で構成され、この順序で格納されます。サンプルは画像の左上から順に配置されます。可視矩形のオフセット(
visibleRect.xおよびvisibleRect.y) は MUST 偶数でなければなりません。An image in the NV12 pixel format that is 16 pixels wide and 10 pixels tall will be arranged like so in memory:
YYYYYYYYYYYYYYYY YYYYYYYYYYYYYYYY YYYYYYYYYYYYYYYY YYYYYYYYYYYYYYYY YYYYYYYYYYYYYYYY YYYYYYYYYYYYYYYY YYYYYYYYYYYYYYYY YYYYYYYYYYYYYYYY YYYYYYYYYYYYYYYY YYYYYYYYYYYYYYYY UVUVUVUVUVUVUVUV UVUVUVUVUVUVUVUV UVUVUVUVUVUVUVUV UVUVUVUVUVUVUVUV UVUVUVUVUVUVUVUV
すべてのサンプルはメモリ上で連続して配置されます。
RGBA-
このフォーマットは単一プレーンで構成され、4つの成分(Red, Green, Blue, alpha)をこの順序でエンコードします。
このフォーマットの各サンプルは8ビットであり、各ピクセルは32ビットです。
単一プレーンには
codedWidth*codedHeight* 4 のサンプル(したがってバイト)が含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。RGBAの 等価の不透明フォーマット はRGBXです。 RGBX-
このフォーマットは単一プレーンで構成され、4つの成分(Red, Green, Blue, パディング)をこの順序でエンコードします。
このフォーマットの各サンプルは8ビットです。各ピクセルの4番目の要素は無視され、画像は常に完全に不透過です。
単一プレーンには
codedWidth*codedHeight* 4 のサンプル(したがってバイト)が含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。 BGRA-
このフォーマットは単一プレーンで構成され、4つの成分(Blue, Green, Red, alpha)をこの順序でエンコードします。
このフォーマットの各サンプルは8ビットです。
単一プレーンには
codedWidth*codedHeight* 4 のサンプル(したがってバイト)が含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。BGRAの 等価の不透明フォーマット はBGRXです。 BGRX-
このフォーマットは単一プレーンで構成され、4つの成分(Blue, Green, Red, パディング)をこの順序でエンコードします。
このフォーマットの各サンプルは8ビットです。各ピクセルの4番目の要素は無視され、画像は常に完全に不透過です。
単一プレーンには
codedWidth*codedHeight* 4 のサンプル(したがってバイト)が含まれ、画像の左上から始まるcodedHeight行それぞれにcodedWidthサンプルが配置されます。
9.9. ビデオカラースペースインターフェイス
[Exposed =(Window ,DedicatedWorker )]interface {VideoColorSpace constructor (optional VideoColorSpaceInit = {});init readonly attribute VideoColorPrimaries ?primaries ;readonly attribute VideoTransferCharacteristics ?transfer ;readonly attribute VideoMatrixCoefficients ?matrix ;readonly attribute boolean ?fullRange ; [Default ]VideoColorSpaceInit (); };toJSON dictionary {VideoColorSpaceInit VideoColorPrimaries ?=primaries null ;VideoTransferCharacteristics ?=transfer null ;VideoMatrixCoefficients ?=matrix null ;boolean ?=fullRange null ; };
9.9.1. 内部スロット
[[primaries]]-
カラープライマリー。
[[transfer]]-
トランスファ特性。
[[matrix]]-
マトリックス係数。
[[full range]]-
フルレンジ色値が使われているかどうかを示します。
9.9.2. コンストラクター
VideoColorSpace(init)
-
c を新しい
VideoColorSpaceオブジェクトとして、以下のように初期化する:-
init.primariesを[[primaries]]に代入する。 -
init.transferを[[transfer]]に代入する。 -
init.matrixを[[matrix]]に代入する。 -
init.fullRangeを[[full range]]に代入する。
-
-
c を返す。
9.9.3. 属性
primaries, 型 VideoColorPrimaries, readonly, nullable-
primariesのゲッター手順は[[primaries]]の値を返すこと。 transfer, 型 VideoTransferCharacteristics, readonly, nullable-
transferのゲッター手順は[[transfer]]の値を返すこと。 matrix, 型 VideoMatrixCoefficients, readonly, nullable-
matrixのゲッター手順は[[matrix]]の値を返すこと。 fullRange, 型 boolean, readonly, nullable-
fullRangeのゲッター手順は[[full range]]の値を返すこと。
9.10. ビデオカラープライマリー
カラープライマリーはビデオサンプルの色域を記述します。enum {VideoColorPrimaries "bt709" ,"bt470bg" ,"smpte170m" ,"bt2020" ,"smpte432" , };
bt709- BT.709 や sRGB で使われるカラープライマリー。[H.273] セクション 8.1 テーブル2 値 1 に記載。
bt470bg- BT.601 PAL で使われるカラープライマリー。[H.273] セクション 8.1 テーブル2 値 5 に記載。
smpte170m- BT.601 NTSC で使われるカラープライマリー。[H.273] セクション 8.1 テーブル2 値 6 に記載。
bt2020- BT.2020 および BT.2100 で使われるカラープライマリー。[H.273] セクション 8.1 テーブル2 値 9 に記載。
smpte432- P3 D65 で使われるカラープライマリー。[H.273] セクション 8.1 テーブル2 値 12 に記載。
9.11. ビデオトランスファ特性
トランスファ特性はビデオサンプルの光電子変換特性(オプト・エレクトロニック・トランスファ)を記述します。enum {VideoTransferCharacteristics "bt709" ,"smpte170m" ,"iec61966-2-1" ,"linear" ,"pq" ,"hlg" , };
bt709- BT.709 で使われるトランスファ特性。[H.273] セクション 8.2 テーブル3 値 1 に記載。
smpte170m- BT.601 で使われるトランスファ特性。[H.273] セクション 8.2 テーブル3 値 6 に記載。(機能的には "bt709" と同じ)
iec61966-2-1- sRGB で使われるトランスファ特性。[H.273] セクション 8.2 テーブル3 値 13 に記載。
linear- 線形RGBで使われるトランスファ特性。[H.273] セクション 8.2 テーブル3 値 8 に記載。
pq- BT.2100 PQ で使われるトランスファ特性。[H.273] セクション 8.2 テーブル3 値 16 に記載。
hlg- BT.2100 HLG で使われるトランスファ特性。[H.273] セクション 8.2 テーブル3 値 18 に記載。
9.12. ビデオマトリックス係数
マトリックス係数はサンプル成分値と色座標の関係を記述します。enum {VideoMatrixCoefficients "rgb" ,"bt709" ,"bt470bg" ,"smpte170m" ,"bt2020-ncl" , };
rgb- sRGB で使われるマトリックス係数。[H.273] セクション 8.3 テーブル4 値 0 に記載。
bt709- BT.709 で使われるマトリックス係数。[H.273] セクション 8.3 テーブル4 値 1 に記載。
bt470bg- BT.601 PAL で使われるマトリックス係数。[H.273] セクション 8.3 テーブル4 値 5 に記載。
smpte170m- BT.601 NTSC で使われるマトリックス係数。[H.273] セクション 8.3 テーブル4 値 6 に記載。(機能的には "bt470bg" と同じ)
bt2020-ncl- BT.2020 NCL で使われるマトリックス係数。[H.273] セクション 8.3 テーブル4 値 9 に記載。
10. 画像デコード
10.1. 背景
画像コーデック定義は、通常対応するファイルフォーマットの定義も伴います。そのため、画像デコーダはパック解除(デマックス)および画像データのデコードの両方を実行することが多いです。WebCodecs の
ImageDecoder
もこのパターンに従っており、VideoDecoder
や AudioDecoder
とは大きく異なるインターフェイス設計となっています。
これらの違いがあるにもかかわらず、ImageDecoder
は他のコーデックインターフェイス同様に コーデック処理モデル を使用します。また、ImageDecoder
はデコード出力の記述に VideoFrame
インターフェイスを使用します。
10.2. ImageDecoder インターフェイス
[Exposed =(Window ,DedicatedWorker ),SecureContext ]interface {ImageDecoder constructor (ImageDecoderInit );init readonly attribute DOMString type ;readonly attribute boolean complete ;readonly attribute Promise <undefined >completed ;readonly attribute ImageTrackList tracks ;Promise <ImageDecodeResult >decode (optional ImageDecodeOptions = {});options undefined reset ();undefined close ();static Promise <boolean >isTypeSupported (DOMString ); };type
10.2.1. 内部スロット
[[control message queue]]-
このキューには、このコーデックインスタンスに対して実行される制御メッセージが格納されます。[[control message queue]]を参照してください。
[[message queue blocked]]-
[[control message queue]]の処理が、保留中の制御メッセージによってブロックされているときに true になるブール値です。[[message queue blocked]]を参照してください。 [[codec work queue]]-
並列ステップを実行するために使われる並列キューです。
[[codec implementation]]への参照を持ちます。[[codec work queue]]を参照してください。 [[ImageTrackList]]-
ImageTrackListで[[encoded data]]に見つかったトラックを記述します。 [[type]]-
構築時に与えられた MIME
typeの値を反映する文字列です。 [[complete]]-
[[encoded data]]が完全にバッファリングされているかどうかを示すブール値です。 [[completed promise]]-
[[complete]]がtrueになるときに通知するための Promise です。 [[codec implementation]]-
ユーザーエージェントが提供する下位の画像デコーダ実装。[[codec implementation]]を参照。
[[encoded data]]-
デコードされるべき画像データが入ったバイトシーケンスです。
[[prefer animation]]-
構築時に与えられた
preferAnimationの値を反映するブール値です。 [[pending decode promises]]-
decode()呼び出しによって返された未解決のPromiseのリストです。
[[internal selected track index]]-
[[encoded data]]の中でデコードアルゴリズムに使われる画像トラックを識別します。 [[tracks established]]-
トラックリストが
[[ImageTrackList]]で確立されているかどうかを示すブール値です。 [[closed]]-
ImageDecoderが永久的に閉じられ、もはや使用できない状態であることを示すブール値です。 [[progressive frame generations]]-
フレームインデックスからProgressive Image Frame Generationへのマッピング。値は、 そのフレームインデックスで
decode()呼び出しにより最後に出力されたVideoFrameのProgressive Image Frame Generationを表します。
10.2.2. コンストラクター
ImageDecoder(init)-
注意: 構築された
ImageDecoderでdecode()を呼び出すと、ユーザーエージェントがtypeをサポートしない場合はNotSupportedErrorが発生します。実装側はまずisTypeSupported()でtypeのサポートを確認することが推奨されます。User Agentはどのtypeも必ずしもサポートする必要はありません。呼び出されたとき、以下の手順を実行します:
-
initが有効なImageDecoderInitでなければ、
TypeErrorをスローする。 -
init.
transferに同じArrayBufferへの参照が複数ある場合、DataCloneErrorDOMExceptionをスローする。 -
init.
transferの各transferableについて:-
[[Detached]]内部スロットがtrueなら、DataCloneErrorDOMExceptionをスローする。
-
-
dを新しい
ImageDecoderオブジェクトとする。以下の手順で、ImageDecoderのメンバーは特記なき限りdに適用される。 -
[[control message queue]]に新しいキューを代入する。 -
[[message queue blocked]]にfalseを代入する。 -
[[codec work queue]]に新しい並列キューを開始して代入する。 -
[[ImageTrackList]]に新しいImageTrackListを以下のように初期化して代入する:-
[[track list]]に新しいリストを代入する。 -
[[selected index]]に-1を代入する。
-
-
[[codec implementation]]にnullを代入する。 -
init.preferAnimationが存在する場合は、init.preferAnimationを[[prefer animation]]内部スロットに代入し、そうでなければ'null'を代入する。 -
[[pending decode promises]]に新しいリストを代入する。 -
[[internal selected track index]]に-1を代入する。 -
[[tracks established]]にfalseを代入する。 -
[[closed]]にfalseを代入する。 -
[[progressive frame generations]]に新しいマップを代入する。 -
initの
dataメンバーがReadableStream型の場合:-
[[encoded data]]に新しいリストを代入する。 -
[[complete]]にfalseを代入する。 -
並列で、Fetch Stream Data Loopをdとreaderで実行する。
-
-
それ以外の場合:
-
assert:
init.dataの型はBufferSourceである。 -
init.
transferにArrayBufferがinit.dataで参照されている場合、User Agentは以下のいずれかをMAY選択する:-
[[encoded data]]を、data内のエンコード済み画像データを参照するバイト列にする。
-
-
それ以外の場合:
-
init.dataのコピーを[[encoded data]]に代入する。
-
-
[[complete]]にtrueを代入する。 -
[[completed promise]]を解決する。 -
画像デコーダを構成する制御メッセージをキューに追加する。
-
トラックメタデータをデコードする制御メッセージをキューに追加する。
-
-
init.
transferの各transferableについて:-
transferableに対してDetachArrayBufferを実行する。
-
-
dを返す。
制御メッセージの実行で画像デコーダを構成するとは、以下の手順を実行することを意味します:
-
supportedを型サポートの確認アルゴリズムを
init.typeで実行した結果とする。 -
supportedが
falseなら、ImageDecoderを閉じる アルゴリズムをNotSupportedErrorDOMExceptionで実行し、"processed"を返す。 -
それ以外の場合、
[[codec implementation]]内部スロットにinit.typeをサポートする実装を代入する。 -
[[message queue blocked]]にtrueを代入する。 -
[[codec work queue]]に以下の手順をエンキューする:-
[[codec implementation]]を、colorSpaceConversion、desiredWidth、desiredHeightの値に従って構成する。 -
[[message queue blocked]]にfalseを代入する。
-
-
"processed"を返す。
制御メッセージの実行でトラックメタデータのデコードとは、以下の手順を実行することを意味します:
-
[[codec work queue]]に以下の手順をエンキューする:-
トラック確立アルゴリズムを実行する。
-
-
10.2.3. 属性
type, 型 DOMString, 読み取り専用-
構築時に与えられた MIME
typeの値を反映する文字列です。 complete, 型 boolean, 読み取り専用-
[[encoded data]]が完全にバッファリングされているかどうかを示します。completeの getter 手順は[[complete]]の値を返します。 completed, 型 Promise<undefined>, 読み取り専用-
completeがtrueになったとき通知するための Promise です。completedの getter 手順は[[completed promise]]の値を返します。 tracks, 型 ImageTrackList, 読み取り専用-
利用可能なトラックのメタデータを提供し、デコードするトラックを選択する機構を持つ ライブな
ImageTrackListを返します。tracksの getter 手順は[[ImageTrackList]]の値を返します。
10.2.4. メソッド
decode(options)-
optionsに従ってフレームをデコードする制御メッセージをキューに追加します。
呼び出されたとき、以下の手順を実行します:
-
[[closed]]がtrueの場合、PromiseをInvalidStateErrorDOMExceptionで reject して返す。 -
[[ImageTrackList]]の[[selected index]]が '-1' の場合、PromiseをInvalidStateErrorDOMExceptionで reject して返す。 -
options が
undefinedの場合、新しいImageDecodeOptionsを options に代入する。 -
promise を新しい
Promiseとする。 -
promise を
[[pending decode promises]]に追加する。 -
制御メッセージをキューに追加し、 optionsとpromiseで画像をデコードする。
-
promise を返す。
制御メッセージの実行で画像をデコードするとは、以下の手順を実行することを意味します:
-
[[codec work queue]]に以下の手順をエンキューする:-
[[tracks established]]がtrueになるまで待つ。 -
options.
completeFramesOnlyがfalseかつ画像が プログレッシブ画像であり、ユーザーエージェントがプログレッシブデコードをサポートしている場合、プログレッシブフレームのデコードアルゴリズムを options.frameIndexと promise で実行する。 -
それ以外の場合、完全フレームのデコード アルゴリズムを options.
frameIndexと promise で実行する。
-
-
reset()-
保留中のすべての処理を即座に中断します。
呼び出されたとき、ImageDecoderリセットアルゴリズムを
AbortErrorDOMExceptionで実行する。 close()-
保留中のすべての処理を即座に中断し、システムリソースを解放します。closeは最終的です。
呼び出されたとき、ImageDecoderを閉じるアルゴリズムを
AbortErrorDOMExceptionで実行する。 isTypeSupported(type)-
指定された設定がユーザーエージェントでサポートされているかを示すPromiseを返します。
呼び出されたとき、以下の手順を実行します:
-
typeが有効な画像 MIME タイプでなければ、
PromiseをTypeErrorでrejectして返す。 -
pを新しい
Promiseとする。 -
並列で、pを型サポートの確認アルゴリズムをtypeで実行した結果でresolveする。
-
pを返す。
-
10.2.5. アルゴリズム
- Fetch Stream Data Loop(reader を受け取る)
-
次の手順を実行する:
-
readRequest を次の read request とする。
- chunk steps(chunk を受け取る)
-
-
[[closed]]がtrueであれば、これらの手順を中止する。 -
chunk が Uint8Array オブジェクトでない場合、タスクをキューに追加して ImageDecoderを閉じる アルゴリズムを
DataErrorDOMExceptionで実行し、これらの手順を中止する。 -
Uint8Array オブジェクトが表すバイト列を bytes とする。
-
bytes を
[[encoded data]]内部スロットに追加する。 -
[[tracks established]]がfalseであれば、 トラック確立アルゴリズムを実行する。 -
そうでなければ トラック更新アルゴリズムを実行する。
-
Fetch Stream Data Loopアルゴリズムを reader で再度実行する。
-
- close steps
-
-
trueを[[complete]]に代入する。 -
[[completed promise]]を解決する。
-
- error steps
-
-
タスクをキューに追加して ImageDecoderを閉じる アルゴリズムを
NotReadableErrorDOMExceptionで実行する。
-
-
reader から readRequest を使って chunk を読む。
-
- Establish Tracks
-
次の手順を実行する:
-
[[tracks established]]がfalseであることを確認する。 -
[[encoded data]]にトラック数を判定できるデータが十分にない場合:-
completeがtrueなら、タスクをキューに追加して ImageDecoderを閉じるアルゴリズムをInvalidStateErrorDOMExceptionで実行する。 -
これらの手順を中止する。
-
-
トラック数が
0である場合、タスクをキューに追加して ImageDecoderを閉じるアルゴリズムを実行し、これらの手順を中止する。 -
newTrackList を新しい リストとして作成する。
-
[[encoded data]]で見つかった各 image track について:-
newTrack を新しい
ImageTrackとして、以下のように初期化する:-
this を
[[ImageDecoder]]に代入する。 -
tracksを[[ImageTrackList]]に代入する。 -
image track がアニメーションであれば、newTrack の
[[animated]]にtrueを代入し、そうでなければfalseを代入する。 -
image track がフレーム数を示す場合、その数値を newTrack の
[[frame count]]に代入し、そうでなければ0を代入する。注意: this が
data(ReadableStream)で構築された場合、frameCountは[[encoded data]]に追加バイトが追加されるごとに変化する可能性がある。 詳細は トラック更新アルゴリズムを参照。 -
image track が繰り返し回数を示す場合、その数値を
[[repetition count]]に代入し、そうでなければ0を代入する。注意:
Infinityは無限繰り返しを示す。 -
falseを newTrack の[[selected]]に代入する。
-
-
newTrack を newTrackList に追加する。
-
-
selectedTrackIndex を デフォルト選択トラックインデックス取得アルゴリズムを newTrackList で実行した結果とする。
-
selectedTrack を newTrackList の selectedTrackIndex 番目のトラックとする。
-
trueを selectedTrack の[[selected]]に代入する。 -
selectedTrackIndex を
[[internal selected track index]]に代入する。 -
trueを[[tracks established]]に代入する。 -
タスクをキューに追加して以下の手順を実行する:
-
newTrackList を
tracksの[[track list]]内部スロットに代入する。 -
selectedTrackIndex を
tracksの[[selected index]]に代入する。 -
[[ready promise]]を解決する。
-
-
- デフォルト選択トラックインデックス取得 (trackListを受け取る)
-
次の手順を実行する:
-
[[encoded data]]が主画像トラックを識別できる場合:-
primaryTrackをtrackListから主画像トラックを記述する
ImageTrackとする。 -
primaryTrackIndexをtrackList内でのprimaryTrackの位置とする。
-
[[prefer animation]]がnullなら、primaryTrackIndexを返す。 -
primaryTrack.
animatedが[[prefer animation]]と等しい場合、primaryTrackIndexを返す。
-
-
trackList内のいずれかの
ImageTrackがanimatedと[[prefer animation]]が等しい場合、trackList内で最も早く現れるそのトラックの位置を返す。 -
0を返す。
-
- トラック更新
-
トラック更新構造体は、構造体であり、 トラックインデックス(
unsigned long)と フレーム数 (unsigned long)からなる。以下の手順を実行する:
-
[[tracks established]]がtrueであることを確認する。 -
trackChanges を新しい リストとする。
-
trackList を
tracksの[[track list]]のコピーとする。 -
trackList の各 track について:
-
trackIndex を track の trackList 内での位置とする。
-
latestFrameCount を
[[encoded data]]から track に対応するトラックのフレーム数とする。 -
latestFrameCount が
track.frameCount以上であることを確認する。 -
もし latestFrameCount が
track.frameCountより大きい場合:-
change を トラック更新構造体とし、 トラックインデックスは trackIndex、 フレーム数は latestFrameCount とする。
-
change を tracksChanges に追加する。
-
-
-
もし tracksChanges が 空なら、これらの手順を中止する。
-
タスクをキューに追加して、以下の手順を実行する:
-
trackChanges の各 update について:
-
updateTrack を
ImageTrackのupdate.trackIndex番目の要素とする(tracksの[[track list]]内)。 -
update.frameCountを updateTrack の[[frame count]]に代入する。
-
-
-
- 完全フレームのデコード (frameIndex と promise を受け取る)
-
-
[[tracks established]]がtrueであることを確認する。 -
[[internal selected track index]]が-1でないことを確認する。 -
encodedFrame を frameIndex と
[[internal selected track index]]で識別されるエンコード済みフレームとする。 -
以下のいずれかの条件が成立するまで待つ(最初に成立したもの):
-
[[encoded data]]に encodedFrame を完全にデコードするのに十分なバイトが含まれている。 -
[[encoded data]]が不正であることが判明した。 -
completeがtrueである。 -
[[closed]]がtrueである。
-
-
もし
[[encoded data]]が不正であることが判明した場合、 致命的なデータ拒否アルゴリズムを実行し、これらの手順を中止する。 -
もし
[[encoded data]]に encodedFrame を完全にデコードするのに十分なバイトが含まれていない場合、 実行不可能なデコード拒否アルゴリズムを promise で実行し、これらの手順を中止する。 -
[[codec implementation]]を使って encodedFrame のデコードを試みる。 -
もしデコードでエラーが発生した場合、 致命的なデータ拒否アルゴリズムを実行し、これらの手順を中止する。
-
もし
[[progressive frame generations]]に frameIndex をキーとするエントリがあれば、そのエントリをマップから削除する。 -
output を
[[codec implementation]]から encodedFrame に対応するデコード済み画像データとする。 -
decodeResult を新しい
ImageDecodeResultとし、 以下のように初期化する:-
completeに 'true' を代入する。 -
duration を output の表示時間(encodedFrame で記述される)とし、encodedFrame に duration がなければ
nullを代入する。 -
timestamp を output の表示タイムスタンプ(encodedFrame で記述される)とし、encodedFrame に timestamp がなければ:
-
もし encodedFrame が静止画像なら
0を timestamp に代入する。 -
もし encodedFrame が定常レートのアニメーション画像で duration が
nullでなければ、|frameIndex| * |duration|を timestamp に代入する。 -
もしメタデータから追加のデコードなしで timestamp を簡単に生成できる場合は、それを timestamp に代入する。
-
それ以外の場合は
0を timestamp に代入する。
-
-
もし
[[encoded data]]に 画像の向きメタデータがあれば rotation と flip として記述し、なければ rotation を 0、flip を false とする。 -
imageに VideoFrame生成アルゴリズムを output, timestamp, duration, rotation, flip で実行した結果を代入する。
-
-
デコード解決アルゴリズムを promise と decodeResult で実行する。
-
- プログレッシブフレームのデコード(frameIndex と promise を指定)
-
-
[[tracks established]]がtrueであることをアサートする。 -
[[internal selected track index]]が-1でないことをアサートする。 -
encodedFrame を frameIndex および
[[internal selected track index]]で識別されるエンコード済みフレームとする。 -
lastFrameGeneration を
nullとする。 -
もし
[[progressive frame generations]]に frameIndex をキーとするマップエントリーが含まれていれば、その値を lastFrameGeneration に代入する。 -
次のいずれかの条件が最初に満たされるまで待つ:
-
[[encoded data]]が encodedFrame をデコードするのに十分なバイト数を含み、 かつ プログレッシブ画像フレーム世代 が lastFrameGeneration を超える出力が得られる場合。 -
[[encoded data]]が不正であると判明した場合。 -
completeがtrueである場合。 -
[[closed]]がtrueである場合。
-
-
もし
[[encoded data]]が不正であると判明した場合、 Fatally Reject Bad Data アルゴリズムを実行し、これらの手順を中止する。 -
それ以外で、
[[encoded data]]が encodedFrame をデコードして プログレッシブ画像フレーム世代 が lastFrameGeneration を超える出力を得るのに十分なバイト数を含まない場合は、 Reject Infeasible Decode アルゴリズムを promise とともに実行し、これらの手順を中止する。 -
[[codec implementation]]を用いて encodedFrame のデコードを試みる。 -
デコードでエラーが発生した場合、 Fatally Reject Bad Data アルゴリズムを実行し、これらの手順を中止する。
-
output を
[[codec implementation]]から encodedFrame に対応して出力されたデコード済み画像データとする。 -
decodeResult を新しい
ImageDecodeResultとする。 -
もし output が encodedFrame に対応する最終的な完全詳細プログレッシブ出力であれば:
-
decodeResult の
completeにtrueを代入する。 -
もし
[[progressive frame generations]]に frameIndex をキーとするエントリーがあれば、マップからそのエントリーを削除する。
-
-
それ以外の場合:
-
decodeResult の
completeにfalseを代入する。 -
frameGeneration を output の プログレッシブ画像フレーム世代 とする。
-
[[progressive frame generations]]に frameIndex をキー、frameGeneration を値として新しいエントリーを追加する。
-
-
duration を output の提示時間(encodedFrame に記述されている場合)とする。encodedFrame が duration を記述していなければ、
nullを duration に代入する。 -
timestamp を output の提示タイムスタンプ(encodedFrame に記述されている場合)とする。encodedFrame がタイムスタンプを持たない場合:
-
もし encodedFrame が静止画像なら、timestamp に
0を代入する。 -
もし encodedFrame が一定速度のアニメ画像で duration が
nullでなければ、|frameIndex| * |duration|を timestamp に代入する。 -
もしメタデータから追加のデコード無しで簡単に生成できる場合、その値を timestamp に代入する。
-
それ以外の場合、timestamp に
0を代入する。
-
-
もし
[[encoded data]]に向きメタデータが含まれていれば rotation と flip として記述し、それ以外の場合は rotation を 0, flip を false とする。 -
imageに Create a VideoFrame アルゴリズムの結果(output, timestamp, duration, rotation, flip)を代入する。 -
promise を
[[pending decode promises]]から削除する。 -
promise を decodeResult で解決する。
-
- デコードの解決(promise と result を指定)
-
-
タスクをキューして以下の手順を実行する:
-
[[closed]]なら、これらの手順を中止する。 -
promise が
[[pending decode promises]]の要素であることをアサートする。 -
promise を
[[pending decode promises]]から削除する。 -
promise を result で解決する。
-
-
- 実現不可能なデコードの拒否(promise を指定)
-
-
completeがtrueまたは[[closed]]がtrueであることをアサートする。 -
もし
completeがtrueなら、exception をRangeErrorとする。 それ以外は exception をInvalidStateErrorDOMExceptionとする。 -
タスクをキューして以下の手順を実行する:
-
[[closed]]なら、これらの手順を中止する。 -
promise が
[[pending decode promises]]の要素であることをアサートする。 -
promise を
[[pending decode promises]]から削除する。 -
promise を exception で拒否する。
-
-
- 致命的な不正データの拒否
-
-
タスクをキューして以下の手順を実行する:
-
[[closed]]なら、これらの手順を中止する。 -
ImageDecoderのクローズ アルゴリズムを
EncodingErrorDOMException付きで実行する。
-
-
- 型サポートの確認(type を指定)
-
-
ユーザーエージェントが type のデコードをサポートするコーデックを提供できる場合、
trueを返す。 -
それ以外の場合、
falseを返す。
-
- ImageDecoderのリセット(exception を指定)
-
-
[[codec implementation]]にアクティブなデコード操作を中止するよう指示する。 -
[[pending decode promises]]の各 decodePromise について:-
decodePromise を exception で拒否する。
-
decodePromise を
[[pending decode promises]]から削除する。
-
-
- ImageDecoderのクローズ(exception を指定)
-
-
ImageDecoderのリセット アルゴリズムを exception 付きで実行する。
-
trueを[[closed]]に代入する。 -
[[codec implementation]]をクリアし、関連する システムリソース を解放する。 -
[[ImageTrackList]]が空なら[[ready promise]]を exception で拒否する。そうでなければ、以下を実行する:-
[[ImageTrackList]]のすべてのエントリーを削除する。 -
-1を[[ImageTrackList]]の[[selected index]]に代入する。
-
-
もし
[[complete]]が false なら[[completed promise]]を exception で解決する。
-
10.3. ImageDecoderInit インターフェイス
typedef (AllowSharedBufferSource or ReadableStream );ImageBufferSource dictionary {ImageDecoderInit required DOMString type ;required ImageBufferSource data ;ColorSpaceConversion colorSpaceConversion = "default"; [EnforceRange ]unsigned long desiredWidth ; [EnforceRange ]unsigned long desiredHeight ;boolean preferAnimation ;sequence <ArrayBuffer >= []; };transfer
ImageDecoderInit
が有効なImageDecoderInitかどうか判定するには、以下の手順を実行する:
-
type が有効な画像のMIMEタイプでない場合、
falseを返す。 -
data が
ReadableStream型であり、その ReadableStream が 撹乱されているまたはロックされている場合、falseを返す。 -
data が
BufferSource型の場合: -
desiredWidthが存在し、desiredHeightが存在しない場合、falseを返す。 -
desiredHeightが存在し、desiredWidthが存在しない場合、falseを返す。 -
trueを返す。
有効な画像のMIMEタイプは、有効なMIMEタイプ文字列であり、[RFC9110]の8.3.1節に従いtypeが
imageとなる文字列である。
type, 型:DOMString-
デコードする画像ファイルのMIMEタイプを含む文字列。
data, 型:ImageBufferSource-
BufferSourceまたはReadableStreamで、typeで記述されるエンコード済み画像ファイルのバイト列を表す。 colorSpaceConversion, 型:ColorSpaceConversion、デフォルトは"default"-
デコードされた出力の色空間を変換または無視するかを制御する。詳細は
colorSpaceConversion(ImageBitmapOptions)を参照。 desiredWidth, 型: unsigned long-
デコード後出力の希望する幅を示す。実装はベストエフォートであり、希望する幅へのデコードはすべてのフォーマット/デコーダでサポートされるとは限らないMAY。
desiredHeight, 型: unsigned long-
デコード後出力の希望する高さを示す。実装はベストエフォートであり、希望する高さへのデコードはすべてのフォーマット/デコーダでサポートされるとは限らないMAY。
preferAnimation, 型: boolean-
複数トラックを持つ画像の場合、初期トラック選択がアニメーション付きトラックを優先するかどうかを示すSHOULD。
注: デフォルト選択トラックインデックス取得 アルゴリズムを参照。
10.4. ImageDecodeOptions インターフェイス
dictionary { [ImageDecodeOptions EnforceRange ]unsigned long frameIndex = 0;boolean completeFramesOnly =true ; };
frameIndex, 型:unsigned long、デフォルト値0-
デコードするフレームのインデックス。
completeFramesOnly, 型:boolean、デフォルト値true-
プログレッシブ画像の場合、値が
falseだとデコーダーは MAYで 詳細が低減されたimageを出力できる。 同じdecode()を 同じframeIndexで複数回呼び出すと、 前回よりも高いプログレッシブ画像フレーム世代 (より細かい画像)で解決され、最終的には完全な詳細画像が得られる。completeFramesOnlyにtrueを指定した場合、画像がプログレッシブ画像でない場合、またはユーザーエージェントが指定画像型のプログレッシブデコードをサポートしない場合は、decode()の呼び出しは完全詳細画像がデコードされて初めて解決される。注: プログレッシブ画像ではcompleteFramesOnlyをfalseに設定することで、ネットワークからバッファリング中の画像をユーザーにプレビューとして表示できる (dataReadableStreamを通じて)。完全な詳細画像がデコードされた際、
ImageDecodeResultのcompleteは true になる。
10.5. ImageDecodeResult インターフェイス
dictionary {ImageDecodeResult required VideoFrame image ;required boolean complete ; };
image, 型:VideoFrame-
デコードされた画像。
complete, 型:boolean-
imageが最終的な完全詳細出力であるかどうかを示す。注:
completeはdecode()がcompleteFramesOnlyにtrueを指定して呼び出された場合は常にtrueになる。
10.6. ImageTrackList インターフェイス
[Exposed =(Window ,DedicatedWorker ),SecureContext ]interface {ImageTrackList getter ImageTrack (unsigned long );index readonly attribute Promise <undefined >ready ;readonly attribute unsigned long length ;readonly attribute long selectedIndex ;readonly attribute ImageTrack ?selectedTrack ; };
10.6.1. 内部スロット
[[ready promise]]-
ImageTrackListがImageTrackで 埋められたことを通知するためのPromise。注:
ImageTrackのframeCountはcompleteがtrueになるまで更新される可能性がある。 [[track list]]-
この
ImageTrackListが 保持するImageTrackのリスト。 [[selected index]]-
[[track list]]内で選択されたトラックのインデックス。-1はトラックが選択されていないことを示す。初期値は-1。
10.6.2. 属性
ready, 型:Promise<undefined>、readonly-
readyのgetterの動作は、[[ready promise]]を返すこと。 length, 型:unsigned long、readonly-
lengthのgetterの動作は、[[track list]]の長さを返すこと。 selectedIndex, 型: long、readonly-
selectedIndexのgetterの動作は[[selected index]]を返すこと。 selectedTrack, 型: ImageTrack 、readonly、nullable-
selectedTrackのgetterの動作は以下:-
[[selected index]]が-1の場合、nullを返す。 -
それ以外の場合、
[[track list]]の[[selected index]]位置のImageTrackを返す。
-
10.7. ImageTrack インターフェイス
[Exposed =(Window ,DedicatedWorker ),SecureContext ]interface {ImageTrack readonly attribute boolean animated ;readonly attribute unsigned long frameCount ;readonly attribute unrestricted float repetitionCount ;attribute boolean selected ; };
10.7.1. 内部スロット
[[ImageDecoder]]-
この
ImageTrackを構築したImageDecoderインスタンス。 [[ImageTrackList]]-
この
ImageTrackを リストするImageTrackListインスタンス。 [[animated]]-
このトラックが複数フレームのアニメ画像を含むかどうかを示す。
[[frame count]]-
このトラックのフレーム数。
[[repetition count]]-
アニメーションが意図的に繰り返される回数。
[[selected]]-
このトラックがデコード用に選択されているかどうかを示す。
10.7.2. 属性
animated, 型:boolean、readonly-
animatedのgetterの手順は[[animated]]の値を返すこと。注: この属性は
frameCountが最終的に0を超えることを早期に示す指標となる。これはframeCountが0で始まり、ReadableStreamのdataの新しいチャンクが到着するごとにインクリメントされる画像の場合である。 frameCount, 型:unsigned long、readonly-
frameCountのgetterの手順は[[frame count]]の値を返すこと。 repetitionCount, 型: unrestricted float、readonly-
repetitionCountのgetterの手順は[[repetition count]]の値を返すこと。 selected, 型:boolean-
selectedのgetterの手順は[[selected]]の値を返すこと。selectedのsetterの手順:-
[[ImageDecoder]]の[[closed]]スロットがtrueなら、これらの手順を中止する。 -
newValue を与えられた値とする。
-
もしnewValueが
[[selected]]と等しければ、これらの手順を中止する。 -
newValueを
[[selected]]に代入する。 -
parentTrackList を
[[ImageTrackList]]とする。 -
oldSelectedIndex を parentTrackList の
[[selected index]]の値とする。 -
もしoldSelectedIndexが
-1でない場合:-
oldSelectedTrack を parentTrackList の
[[track list]]の oldSelectedIndex の位置にあるImageTrackとする。 -
oldSelectedTrack の
[[selected]]にfalseを代入する。
-
-
もしnewValueが
trueなら、 selectedIndex を parentTrackList の[[track list]]内でthisImageTrackのインデックスとする。そうでなければ、selectedIndexを-1とする。 -
selectedIndex を parentTrackList の
[[selected index]]に代入する。 -
[[ImageDecoder]]に対してImageDecoderのリセットアルゴリズムを実行する。 -
[[ImageDecoder]]のcontrol message queueに、内部選択トラックインデックスを selectedIndexに更新する制御メッセージを キューする。
内部選択トラックインデックスを更新する制御メッセージの実行は以下の手順:
-
[[ImageDecoder]]の[[codec work queue]]に以下の手順をキューする:-
[[internal selected track index]]にselectedIndexを代入する。 -
[[progressive frame generations]]のすべてのエントリーを削除する。
-
-
11. リソース回収
リソースが制約されている場合、ユーザーエージェントはMAY積極的にコーデックを回収することがある。これは特にハードウェアコーデックが限られていて、Webページやプラットフォームアプリ間で共有されている場合に該当する。
コーデックの回収を行うには、ユーザーエージェントは
MUST該当するクローズアルゴリズム(AudioDecoderのクローズ、
AudioEncoderのクローズ、
VideoDecoderのクローズ
および VideoEncoderのクローズの中から)を
QuotaExceededError
付きで実行する。
コーデックがいつ回収可能かのルールは、コーデックがアクティブか 非アクティブか、またはバックグラウンドコーデックかによって異なる。
アクティブコーデックは、過去10秒以内に[[codec work queue]]で進捗のあったコーデックを指す。
注: ワークキューの進捗の信頼できる兆候はoutput()コールバックの呼出しである。
非アクティブコーデックは、アクティブコーデックの定義を満たさないコーデックである。
バックグラウンドコーデックは、その
ownerDocument
(またはワーカー内コーデックの場合はowner setのDocument)の
属性がtrueになっているコーデックである。
ユーザーエージェントは、非アクティブコーデック、 バックグラウンドコーデック、またはその両方であるコーデックのみ 回収できるMUST。 アクティブかつ前景(バックグラウンドでない)のコーデックは回収してはならないMUST NOT。
加えて、ユーザーエージェントは、以下の場合はアクティブ バックグラウンドコーデックを 回収MUST NOT:
-
エンコーダ(例:
AudioEncoderやVideoEncoder)。注: これにより長時間実行されるエンコードタスクが中断されるのを防ぐ。
-
AudioDecoderやVideoDecoderで、同じグローバルオブジェクトに アクティブなAudioEncoderやVideoEncoderがある場合。注: これにより長時間実行されるトランスコードタスクが中断されるのを防ぐ。
-
タブで音声再生中の場合の
AudioDecoder。
12. セキュリティの考慮事項
主なセキュリティへの影響は、このAPIの機能により攻撃者が基盤となるプラットフォームコーデックの脆弱性を悪用しやすくなる点です。 さらに、コーデックの新しい構成や制御能力により、特定の構成や制御操作の連続性に依存する新たな攻撃が可能となります。
プラットフォームコーデックは歴史的に
HTMLMediaElement
や [WEBAUDIO]、
[WebRTC]などのAPIの内部詳細でした。
このため、様々なAPI制御メソッドを使用して不正なメディアファイルやストリームを使い基盤コーデックを攻撃することは
以前から可能でした。
例えば、任意のストリームをメディアコンテナ(例:mp4)でラップし
src
に設定したHTMLMediaElement
でデコーダに送信できます。その後、
reset()
を呼ぶには<video>.currentTimeに新しい値を設定すればよいです。
WebCodecsは低レベル制御を直接公開するため、このような攻撃がより容易になります。 また、これまで上位APIではできなかった制御メソッドの連続実行も攻撃者が行えるようになります。
ワーキンググループは、ユーザーエージェントが様々な入力や制御メソッドの呼び出しで広範に実装をファズテストすることで このリスクを緩和することを期待しています。 さらに、ユーザーエージェントは基盤コーデックを権限制限されたプロセス(サンドボックス)で分離し 攻撃が成功してもユーザーデータにアクセスできないようにすることが推奨されます。
もう一つの懸念は、基盤コーデックに入力のミューテーション競合状態を露出させることで コーデックがまだ処理中のデータに対してサイトが入力・出力を変更できてしまうリスクです。 この懸念は、入力・出力インターフェースを不変(immutable)にすることで緩和されます。
13. プライバシーの考慮事項
主なプライバシーへの影響は、さまざまなコーデック機能をクエリすることで コーデック機能プロファイルを確立し、ユーザーのフィンガープリントがしやすくなる点です。 このプロファイルの多くは既存APIでもすでに公開されています。 こうしたプロファイル単体では一意に特定する可能性は低いですが 他の指標と組み合わせることでフィンガープリントに使用できます。
攻撃者は多数の構成ディクショナリでIsConfigSupported()メソッドを呼び出すことで
コーデック機能プロファイルを収集できます。同様に、コーデックのconfigure()メソッドに
さまざまな構成ディクショナリを渡して、どの構成が受理されるか観察することも可能です。
攻撃者は既存APIでも多くのコーデック機能プロファイルを取得できます。例えば
[media-capabilities] の
decodingInfo()
APIはどの種類のデコーダがサポートされているか記述し
powerEfficient
属性はハードウェアアクセラレーションを使っているかを示します。同様に
[WebRTC] の
getCapabilities()
APIでどの種類のエンコーダがサポートされているか確認でき、
getStats()
APIでエンコーダがハードウェアアクセラレーションを使っているか判定できます。WebCodecsではこれに加えて低レベルコーデック機能情報が公開されます。
コーデック機能プロファイル単体では一意に特定される可能性は低いです。基盤コーデックはしばしばソフトウェア(ユーザーエージェントバイナリや OSの一部)で実装されるため、そのソフトウェアを使用しているユーザー全体が同じ機能セットを持つことになります。 また、基盤コーデックはハードウェアアクセラレーションで実装されることも多いですが そのハードウェアは大量生産されており、特定クラスや製造年のデバイス(例:2020年製フラッグシップスマホ)は 共通の機能を持つことが多いです。例外(旧バージョンのソフトウェアコーデックや珍しい自作ハードウェアなど)が存在しますが、 通常は同じコーデック機能プロファイルを大人数が共有します。
コーデック機能プロファイルでユーザーグループを分割すること自体は識別のエントロピーとなり 他の指標と組み合わせれば一意特定も可能です。ユーザーエージェントは WebCodecsや他の識別APIを使ってサイトが能力を大量にプローブしようとした場合 エラーを返すことで部分的にこれを緩和MAYできます。 また、ユーザーエージェントは「プライバシーバジェット」を実装し、 WebCodecsや識別APIの利用でバジェットが消費され、枯渇時には能力を共通ベースラインまで減らすか ユーザー承認を求めることもMAYできます。
14. WebCodecsを利用する著者向けベストプラクティス
WebCodecsは内部的にバックグラウンドスレッド上で動作しますが、リアルタイムメディアやメインスレッドの競合が予想される環境で作業する著者は、可能な限りメディアパイプラインをメインスレッドから完全に独立したワーカーコンテキスト上で動作させることを推奨します。例えば、VideoFrameの
リアルタイムメディア処理は一般的にワーカーコンテキストで行われるべきです。
メインスレッドは開発時には気づきにくい大きな競合やもたつき(jank)が発生しやすく、実際のデバイスやユーザーエージェントによっては一貫性なく劣化し、最終的なユーザー体験に大きな悪影響を及ぼす可能性があります。メディアパイプラインをメインスレッドから切り離すことで、エンドユーザーに滑らかな体験を提供できます。
メディアパイプラインをメインスレッドで利用する場合は、ターゲットのフレームレート、メインスレッドの作業負荷、アプリケーションの埋め込み方法、ユーザーが利用するデバイスのクラスなどを十分に把握しておく必要があります。
15. 謝辞
編集者は本仕様への貢献者である Alex Russell、Chris Needham、Dale Curtis、Dan Sanders、Eugene Zemtsov、Francois Daoust、Guido Urdaneta、Harald Alvestrand、Jan-Ivar Bruaroey、Jer Noble、Mark Foltz、Peter Thatcher、Steve Anton、Matt Wolenetz、Rijubrata Bhaumik、Thomas Guilbert、Tuukka Toivonen、Youenn Fablet 各氏に感謝します。また、メーリングリストやイシューを通じて仕様書へ貢献してくれた多くの方々にも感謝します。
ワーキンググループは本仕様を同僚 Bernard Aboba に捧げます。