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をInvalidStateError
DOMException
で返す。 -
[[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アルゴリズムを
AbortError
DOMException
で実行する。 close()
-
保留中のすべての作業を即座に中止し、システムリソースを解放します。
closeは最終的な操作です。
呼び出されたとき、Close AudioDecoderアルゴリズムを
AbortError
DOMException
で実行する。 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が
AbortError
DOMException
でない場合、[[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をInvalidStateError
DOMException
で返す。 -
[[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アルゴリズムを
AbortError
DOMException
で実行する。 close()
-
保留中のすべての作業を即座に中止し、システムリソースを解放します。
closeは最終的な操作です。
呼び出されたとき、Close VideoDecoderアルゴリズムを
AbortError
DOMException
で実行する。 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 が
AbortError
DOMException
でない場合、[[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(InvalidStateError
DOMException
)を返す。 -
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のリセットアルゴリズムを
AbortError
DOMException
で実行する。 close()
-
保留中の作業を即座に中止し、システムリソースを解放する。
closeは最終的な操作である。
呼び出されたとき、AudioEncoderのクローズアルゴリズムを
AbortError
DOMException
で実行する。 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 が
AbortError
DOMException
でない場合、[[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 withInvalidStateError
DOMException
を返す。 -
新しい 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 アルゴリズムを
AbortError
DOMException
で実行します。 close()
-
保留中のすべての作業を即座に中止し、システムリソース を解放します。Close は最終的な操作です。
呼び出されたとき、Close VideoEncoder アルゴリズムを
AbortError
DOMException
で実行します。 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 ; // microseconds
duration 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
を複数参照している場合、DataCloneError
DOMException
をスローします。 -
init.
transfer
の各 transferable について:-
もし
[[Detached]]
内部スロットがtrue
であれば、DataCloneError
DOMException
をスローします。
-
-
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 ; // microseconds
duration 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
を複数参照している場合は、DataCloneError
DOMException
をスローします。 -
init.
transfer
の各 transferable について:-
[[Detached]]
内部スロットがtrue
なら、DataCloneError
DOMException
をスローします。
-
-
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 ; // microseconds
timestamp 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
を複数参照している場合は、DataCloneError
DOMException
をスローする。 -
init.
transfer
の各 transferable について:-
[[Detached]]
内部スロットがtrue
であれば、DataCloneError
DOMException
をスローする。
-
-
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
の場合はInvalidStateError
DOMException
をスローします。 -
copyElementCount を Compute Copy Element Count アルゴリズムに options を渡して得ます。
-
destFormat を
[[format]]
の値とします。 -
もし options.
format
が 存在するなら、 options.format
を destFormat に代入します。 -
bytesPerSample を destFormat が定義するサンプルごとのバイト数とします。
-
bytesPerSample × copyElementCount の積を返します。
-
copyTo(destination, options)
-
指定した
AudioData
のプレーンのサンプルを destination バッファへコピーします。呼び出された際、次の手順を実行します:
-
[[Detached]]
がtrue
の場合はInvalidStateError
DOMException
をスローします。 -
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
の場合はInvalidStateError
DOMException
をスローします。 -
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
変換に対応していない場合、NotSupportedError
DOMException
をスローします。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
の場合はDataCloneError
DOMException
をスローします。 -
value の全ての
AudioData
内部スロットについて、各内部スロット値を同じ名前のフィールドに dataHolder へ代入します。 -
Close AudioData アルゴリズムに value を渡して実行します。
-
AudioData
の転送受信手順(dataHolder および value を持つ)は以下の通りです:-
-
dataHolder の全ての名前付きフィールドについて、それぞれの値を同じ名前の value の
AudioData
内部スロットに代入します。
-
AudioData
のシリアライズ手順(value、serialized、forStorage を持つ)は以下の通りです:-
-
value の
[[Detached]]
がtrue
の場合はDataCloneError
DOMException
をスローします。 -
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" , };
u8
s16
s32
f32
u8-planar
s16-planar
s32-planar
f32-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 ; // microseconds
duration long long ; // microseconds
timestamp 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 が返された場合は、
InvalidStateError
DOMException
をスローする。 -
image が origin-clean でない場合、
SecurityError
DOMException
をスローする。 -
frame を新しい
VideoFrame
とする。 -
image の型によって分岐:
注意: 著者は、
CanvasImageSource
から暗黙的に提供されない限り、意味のある timestamp を指定することが推奨されます。VideoFrame
を利用するインターフェイスはこの値でタイミングの判断ができます。例えばVideoEncoder
はtimestamp
をレート制御の指標にできます(framerate
参照)。-
-
image のメディアデータが natural dimensions を持たない場合(例:ベクターグラフィックで内容サイズが指定されていない場合)、
InvalidStateError
DOMException
をスローする。 -
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
の場合、InvalidStateError
DOMException
をスローする。 -
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
を複数参照している場合は、DataCloneError
DOMException
をスローする。 -
init.
transfer
の各 transferable について:-
[[Detached]]
内部スロットがtrue
なら、DataCloneError
DOMException
をスローする。
-
-
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
の場合、InvalidStateError
DOMException
をスローします。 -
[[format]]
がnull
の場合、NotSupportedError
DOMException
をスローします。 -
Parse VideoFrameCopyToOptions アルゴリズムを options で実行し、結果を combinedLayout とする。
-
combinedLayout が例外なら、それをスローする。
-
combinedLayout の allocationSize を返す。
-
copyTo(destination, options)
-
このフレームのプレーンを destination に options に従って非同期でコピーします。データのフォーマットは options.
format
が 存在する場合はそれ、なければ thisVideoFrame
のformat
です。注意:
copyTo()
を複数回呼び出した際、返却される Promise の解決順序は保証されません。呼び出し時の手順:
-
[[Detached]]
がtrue
の場合、Promise をInvalidStateError
DOMException
でリジェクトして返す。 -
[[format]]
がnull
の場合、Promise をNotSupportedError
DOMException
でリジェクトして返す。 -
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
の場合、InvalidStateError
DOMException
をスローする。 -
Clone VideoFrame アルゴリズムを this で実行した結果を返す。
-
close()
-
すべての状態をクリアし、media resource への参照を解放します。 close は最終操作です。
呼び出し時、Close VideoFrame アルゴリズムを this で実行します。
metadata()
-
このフレームに関連付けられている
VideoFrameMetadata
を取得します。呼び出し時の手順:
-
[[Detached]]
がtrue
の場合、InvalidStateError
DOMException
をスローする。 -
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
の場合、DataCloneError
DOMException
をスローする。 -
value のすべての
VideoFrame
内部スロットについて、その値を同名のフィールドとして dataHolder に代入する。 -
Close VideoFrame アルゴリズムを value で実行する。
-
VideoFrame
の 転送受信手順(dataHolder と value を受け取る)は以下:-
-
dataHolder のすべてのフィールドについて、その値を同名の value の
VideoFrame
内部スロットに代入する。
-
VideoFrame
の シリアライズ手順(value, serialized, forStorage を受け取る)は以下:-
-
value の
[[Detached]]
がtrue
の場合、DataCloneError
DOMException
をスローする。 -
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, V
VideoPixelFormat "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
への参照が複数ある場合、DataCloneError
DOMException
をスローする。 -
init.
transfer
の各transferableについて:-
[[Detached]]
内部スロットがtrue
なら、DataCloneError
DOMException
をスローする。
-
-
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を閉じる アルゴリズムをNotSupportedError
DOMException
で実行し、"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
をInvalidStateError
DOMException
で reject して返す。 -
[[ImageTrackList]]
の[[selected index]]
が '-1' の場合、Promise
をInvalidStateError
DOMException
で 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リセットアルゴリズムを
AbortError
DOMException
で実行する。 close()
-
保留中のすべての処理を即座に中断し、システムリソースを解放します。closeは最終的です。
呼び出されたとき、ImageDecoderを閉じるアルゴリズムを
AbortError
DOMException
で実行する。 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を閉じる アルゴリズムを
DataError
DOMException
で実行し、これらの手順を中止する。 -
Uint8Array オブジェクトが表すバイト列を bytes とする。
-
bytes を
[[encoded data]]
内部スロットに追加する。 -
[[tracks established]]
がfalse
であれば、 トラック確立アルゴリズムを実行する。 -
そうでなければ トラック更新アルゴリズムを実行する。
-
Fetch Stream Data Loopアルゴリズムを reader で再度実行する。
-
- close steps
-
-
true
を[[complete]]
に代入する。 -
[[completed promise]]
を解決する。
-
- error steps
-
-
タスクをキューに追加して ImageDecoderを閉じる アルゴリズムを
NotReadableError
DOMException
で実行する。
-
-
reader から readRequest を使って chunk を読む。
-
- Establish Tracks
-
次の手順を実行する:
-
[[tracks established]]
がfalse
であることを確認する。 -
[[encoded data]]
にトラック数を判定できるデータが十分にない場合:-
complete
がtrue
なら、タスクをキューに追加して ImageDecoderを閉じるアルゴリズムをInvalidStateError
DOMException
で実行する。 -
これらの手順を中止する。
-
-
トラック数が
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 をInvalidStateError
DOMException
とする。 -
タスクをキューして以下の手順を実行する:
-
[[closed]]
なら、これらの手順を中止する。 -
promise が
[[pending decode promises]]
の要素であることをアサートする。 -
promise を
[[pending decode promises]]
から削除する。 -
promise を exception で拒否する。
-
-
- 致命的な不正データの拒否
-
-
タスクをキューして以下の手順を実行する:
-
[[closed]]
なら、これらの手順を中止する。 -
ImageDecoderのクローズ アルゴリズムを
EncodingError
DOMException
付きで実行する。
-
-
- 型サポートの確認(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
に設定することで、ネットワークからバッファリング中の画像をユーザーにプレビューとして表示できる (data
ReadableStream
を通じて)。完全な詳細画像がデコードされた際、
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 )]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 )]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 に捧げます。