WebCodecs

W3C作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2025/WD-webcodecs-20250708/
最新公開バージョン:
https://www.w3.org/TR/webcodecs/
編集者草案:
https://w3c.github.io/webcodecs/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/webcodecs/
フィードバック:
GitHub
仕様内でインライン
編集者:
Paul Adenot (Mozilla)
Eugene Zemtsov (Google LLC)
以前の編集者:
Bernard Aboba (Microsoft Corporation)
Chris Cunningham (Google Inc.)
参加:
Gitリポジトリ
Issueを提出
バージョン履歴:
https://github.com/w3c/webcodecs/commits

概要

本仕様は、音声・映像・画像のエンコードおよびデコードのためのコーデックへのインターフェースを定義します。

本仕様は、特定のコーデックやエンコード・デコード手法を指定したり要求したりしません。本仕様の目的は、他で開発された既存のコーデック技術の実装に対してJavaScriptインターフェースを提供することです。実装者は、任意のコーデックの組み合わせをサポートしても、まったくサポートしなくても構いません。

この文書のステータス

このセクションは、本書が公開された時点でのステータスを説明します。現在のW3C出版物および本技術レポートの最新版は、W3C標準・草案一覧で確認できます。

本仕様へのフィードバックやコメントは歓迎します。 GitHub Issuesでの議論が推奨されます。もしくは、Media Working Groupのメーリングリストpublic-media-wg@w3.orgアーカイブ)へ送信できます。 この草案では、ワーキンググループでまだ議論中の保留中の課題がいくつか強調されています。これらの課題の結果については、妥当かどうかも含めてまだ決定されていません。

本書はMedia Working Groupによって、勧告トラックを用いて作業草案として公開されました。 本書はW3C勧告となることを意図しています。

作業草案として公開されても、W3Cおよびその会員による承認を意味しません。

本書はドラフト文書であり、随時更新・置換・廃止される可能性があります。 本書を進行中の作業以外として引用するのは不適切です。

本書はW3C特許ポリシーの下で活動するグループによって作成されました。 W3Cは、グループの成果物に関連して提出された特許開示の公開リストを管理しています。そのページには特許開示の方法も記載されています。ある個人が、必須クレームを含むと考える特許について実際に知っている場合は、W3C特許ポリシー第6節に従って情報を開示する必要があります。

本書は2023年11月3日W3Cプロセス文書に従って管理されています。

1. 定義

コーデック

AudioDecoderAudioEncoderVideoDecoder、 またはVideoEncoderのインスタンスを総称して指します。

キーチャンク

他のフレームに依存せずデコードできるエンコード済みチャンク。一般的に「キーフレーム」とも呼ばれます。

内部保留出力

VideoFrameなど、 現在基盤となるコーデック実装の内部パイプラインに存在するコーデック出力。基盤となるコーデック実装は新しい入力が提供された場合のみ新しい出力を生成してもよい。また、flushに応じてすべての出力を生成しなければならない

コーデックシステムリソース

CPUメモリ、GPUメモリ、特定のデコード/エンコードハードウェアへの排他的ハンドルなど、コーデックの設定やAudioDataVideoFrameオブジェクトの生成の一部としてユーザーエージェントが割り当てる場合があるリソース。これらのリソースはすぐに枯渇する場合があり、不要になったら直ちに解放すべきです。

時間層

タイムスタンプの間隔によって特定のフレームレートを生み出すEncodedVideoChunkのグループ。scalabilityMode参照。

プログレッシブ画像

複数の詳細レベルへのデコードをサポートする画像。エンコードデータが完全にバッファされていなくても、低い詳細レベルが利用可能になります。

プログレッシブ画像フレーム世代

プログレッシブ画像のデコード出力に対する世代識別子。 各世代ごとにデコード出力に追加の詳細が加わります。 フレームの世代を算出する仕組みは実装依存です。

主画像トラック

画像ファイルによってデフォルトトラックとしてマークされた画像トラック。主トラックの指定方法はフォーマット依存です。

RGBフォーマット

赤・緑・青のカラーチャンネルを任意の順序やレイアウト(インターリーブまたはプレーナー)で含み、アルファチャンネルの有無に関わらずVideoPixelFormatで表現されるもの。

sRGBカラースペース

VideoColorSpaceオブジェクトで、以下のように初期化されます:

  1. [[primaries]]bt709に設定

  2. [[transfer]]iec61966-2-1に設定

  3. [[matrix]]rgbに設定

  4. [[full range]]trueに設定

Display P3カラースペース

VideoColorSpaceオブジェクトで、以下のように初期化されます:

  1. [[primaries]]smpte432に設定

  2. [[transfer]]iec61966-2-1に設定

  3. [[matrix]]rgbに設定

  4. [[full range]]trueに設定

REC709カラースペース

VideoColorSpaceオブジェクトで、以下のように初期化されます:

  1. [[primaries]]bt709に設定

  2. [[transfer]]bt709に設定

  3. [[matrix]]bt709に設定

  4. [[full range]]falseに設定

コーデック飽和

基盤となるコーデック実装で、アクティブなデコードまたはエンコード要求数が実装固有の最大値に達し、一時的に追加の作業を受け付けられなくなった状態。最大値は2以上の任意の値(無限大=制限なしも含む)であり得ます。飽和状態では、追加のdecode()encode()呼び出しは制御メッセージキューにバッファされ、decodeQueuSizeencodeQueueSize属性が増加します。コーデック実装は現在の作業が十分進行すると飽和状態を解除します。

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"は現時点で処理すべきでないことを示し、制御メッセージキューに残して後で再試行します。

制御メッセージキューの処理は、以下の手順を実行します:

  1. [[message queue blocked]]falseで、 [[control message queue]]が空でない間:

    1. front message[[control message queue]]の先頭のメッセージとする。

    2. outcomeを、制御メッセージの手順front messageに対して実行した結果とする。

    3. outcome"not processed"なら、breakする。

    4. それ以外の場合、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]]

次にdecode()に渡されるチャンクが、[[type]]で示されるキーチャンクなければならないことを示す真偽値。

[[state]]

このAudioDecoderの現在のCodecState

[[decodeQueueSize]]

保留中のデコード要求数。基盤となるコーデックが新しい入力を受け付け可能になると減少します。

[[pending flush promises]]

flush()呼び出しで返された未解決のPromiseのリスト。

[[dequeue event scheduled]]

dequeueイベントがすでに発火予定かどうかを示す真偽値。イベントスパム防止用。

3.2. コンストラクター

AudioDecoder(init)
  1. dを新しいAudioDecoderオブジェクトとする。

  2. [[control message queue]]に新しいキューを割り当てる。

  3. [[message queue blocked]]falseを割り当てる。

  4. [[codec implementation]]nullを割り当てる。

  5. [[codec work queue]]に新しいparallel queueの開始結果を割り当てる。

  6. [[codec saturated]]falseを割り当てる。

  7. [[output callback]]にinit.outputを割り当てる。

  8. [[error callback]]にinit.errorを割り当てる。

  9. [[key chunk required]]trueを割り当てる。

  10. [[state]]"unconfigured"を割り当てる。

  11. [[decodeQueueSize]]0を割り当てる。

  12. [[pending flush promises]]に新しいリストを割り当てる。

  13. [[dequeue event scheduled]]falseを割り当てる。

  14. dを返す。

3.3. 属性

state, CodecState、readonly

[[state]]の値を返します。

decodeQueueSize, unsigned long、readonly

[[decodeQueueSize]]の値を返します。

ondequeue, EventHandler

イベントハンドラーIDL属性で、イベントハンドラーイベントタイプdequeueです。

3.4. イベント概要

dequeue

AudioDecoderで、decodeQueueSizeが減少したときに発火します。

3.5. メソッド

configure(config)
制御メッセージをキューに追加し、configで記述された通りにオーディオデコーダーを設定してチャンクのデコードを行います。

注: このメソッドは、ユーザーエージェントがconfigをサポートしない場合、NotSupportedError を発生させます。著者はまずconfigを使ってisConfigSupported() を呼び出してサポート状況を確認することが推奨されます。ユーザーエージェントは特定のコーデックタイプや設定をサポートする必要はありません。

呼び出されたとき、以下の手順を実行します:

  1. config有効なAudioDecoderConfigでない場合、TypeErrorを投げる。

  2. [[state]]“closed”の場合、InvalidStateErrorを投げる。

  3. [[state]]"configured"を設定する。

  4. [[key chunk required]]trueを設定する。

  5. 制御メッセージをキューに追加し、configでデコーダーを設定する。

  6. 制御メッセージキューを処理する。

制御メッセージの実行でデコーダーを設定する場合、以下の手順を実行します:

  1. [[message queue blocked]]trueを割り当てる。

  2. [[codec work queue]]に以下の手順をキューに追加する:

    1. supportedを、Check Configuration Supportアルゴリズムをconfigで実行した結果とする。

    2. supportedfalseの場合、タスクをキューに追加し、Close AudioDecoderアルゴリズムをNotSupportedErrorで実行し、これ以降の手順を中止する。

    3. 必要に応じて、[[codec implementation]]configをサポートする実装を割り当てる。

    4. [[codec implementation]]configで設定する。

    5. タスクをキューに追加し、以下の手順を実行する:

      1. [[message queue blocked]]falseを割り当てる。

      2. タスクをキューに追加し、制御メッセージキューを処理する。

  3. "processed"を返す。

decode(chunk)
制御メッセージをキューに追加し、指定されたchunkをデコードします。

呼び出されたとき、以下の手順を実行します:

  1. [[state]]"configured"でない場合、InvalidStateErrorを投げる。

  2. [[key chunk required]]trueの場合:

    1. chunk.[[type]]keyでない場合、DataErrorを投げる。

    2. 実装者は推奨として、chunk[[internal data]]を検査し、本当にkey chunkであることを確認するべきです。不一致が検出された場合、DataErrorを投げる。

    3. それ以外の場合、[[key chunk required]]falseを割り当てる。

  3. [[decodeQueueSize]]をインクリメントする。

  4. 制御メッセージをキューに追加し、chunkをデコードする。

  5. 制御メッセージキューを処理する。

制御メッセージの実行でchunkをデコードする場合、以下の手順を実行します:

  1. [[codec saturated]]trueの場合、"not processed"を返す。

  2. chunkのデコードにより[[codec implementation]]saturatedになる場合、[[codec saturated]]trueを割り当てる。

  3. [[decodeQueueSize]]をデクリメントし、Dequeueイベントスケジュールアルゴリズムを実行する。

  4. [[codec work queue]]に以下の手順をキューに追加する:

    1. [[codec implementation]]でchunkのデコードを試みる。

    2. デコードでエラーが発生した場合、タスクをキューに追加し、Close AudioDecoderアルゴリズムをEncodingErrorで実行し、戻る。

    3. [[codec saturated]]trueかつ[[codec implementation]]saturatedでなくなった場合、タスクをキューに追加し、以下の手順を実行する:

      1. [[codec saturated]]falseを割り当てる。

      2. 制御メッセージキューを処理する。

    4. decoded outputsを、[[codec implementation]]から出力されたデコード済みオーディオデータのリストとする。

    5. decoded outputsが空でない場合、タスクをキューに追加し、Output AudioDataアルゴリズムをdecoded outputsで実行する。

  5. "processed"を返す。

flush()
制御メッセージをすべて制御メッセージキューで完了し、すべての出力を発行します。

呼び出されたとき、以下の手順を実行します:

  1. [[state]]"configured"でない場合、拒否されたPromiseInvalidStateError DOMExceptionで返す。

  2. [[key chunk required]]trueを設定する。

  3. promiseを新しいPromiseとする。

  4. promise[[pending flush promises]]に追加する。

  5. 制御メッセージをキューに追加し、コーデックをpromiseでフラッシュする。

  6. 制御メッセージキューを処理する。

  7. promiseを返す。

制御メッセージの実行でコーデックをフラッシュする場合、promiseを使って以下の手順を実行します:

  1. [[codec work queue]]に以下の手順をキューに追加する:

    1. [[codec implementation]]にすべての内部保留出力を発行するようにシグナルする。

    2. decoded outputsを、[[codec implementation]]から出力されたデコード済みオーディオデータのリストとする。

    3. タスクをキューに追加し、以下の手順を実行する:

      1. decoded outputsが空でない場合、Output AudioData アルゴリズムをdecoded outputsで実行する。

      2. promise[[pending flush promises]]から削除する。

      3. promiseを解決する。

  2. "processed"を返す。

reset()
設定、制御メッセージ制御メッセージキュー内のすべてのメッセージ、および保留中のコールバックを即座にリセットします。

呼び出されたとき、Reset AudioDecoderアルゴリズムをAbortError DOMExceptionで実行する。

close()
保留中のすべての作業を即座に中止し、システムリソースを解放します。 closeは最終的な操作です。

呼び出されたとき、Close AudioDecoderアルゴリズムをAbortError DOMExceptionで実行する。

isConfigSupported(config)
指定されたconfigがユーザーエージェントでサポートされているかどうかを示すPromiseを返します。

注: 返されるAudioDecoderSupportconfig には、ユーザーエージェントが認識した辞書メンバーのみが含まれます。 認識されない辞書メンバーは無視されます。著者は、config と提供したconfigを比較することで認識されないメンバーを検出できます。

呼び出されたとき、以下の手順を実行します:

  1. config有効なAudioDecoderConfigでない場合、拒否されたPromiseTypeErrorで返す。

  2. pを新しいPromiseとする。

  3. checkSupportQueueを新しいparallel queueの開始結果とする。

  4. checkSupportQueueに以下の手順をキューに追加する:

    1. supportedCheck Configuration Supportアルゴリズムをconfigで実行した結果とする。

    2. タスクをキューに追加し、以下の手順を実行する:

      1. decoderSupportを新しく構築したAudioDecoderSupportとし、以下のように初期化する:

        1. configClone Configurationアルゴリズムをconfigで実行した結果に設定する。

        2. supportedsupportedに設定する。

      2. pdecoderSupportで解決する。

  5. pを返す。

3.6. アルゴリズム

Dequeueイベントスケジュール
  1. [[dequeue event scheduled]]trueの場合、戻る。

  2. [[dequeue event scheduled]]trueを割り当てる。

  3. タスクをキューに追加し、以下の手順を実行する:

    1. thisdequeue という名前の単純なイベントを発火する。

    2. [[dequeue event scheduled]]falseを割り当てる。

AudioData出力 (outputs付き)
以下の手順を実行する:
  1. outputs内の各outputについて:

    1. dataを以下のように初期化したAudioDataとする:

      1. [[Detached]]falseを割り当てる。

      2. resourceoutputで記述されたメディアリソースとする。

      3. resourceReferenceresourceへの参照とする。

      4. [[resource reference]]resourceReferenceを割り当てる。

      5. timestampoutputに関連付けられたEncodedAudioChunk[[timestamp]]とする。

      6. [[timestamp]]timestampを割り当てる。

      7. outputが認識されたAudioSampleFormatを使用している場合、そのフォーマットを[[format]]に割り当てる。そうでなければnull[[format]]に割り当てる。

      8. [[sample rate]][[number of frames]][[number of channels]]outputで決定された値を割り当てる。

    2. [[output callback]]dataで呼び出す。

AudioDecoderリセット (exception付き)
以下の手順を実行する:
  1. [[state]]"closed"の場合、InvalidStateErrorを投げる。

  2. [[state]]"unconfigured"を設定する。

  3. [[codec implementation]]に、以前の設定の出力生成を停止するようシグナルする。

  4. [[control message queue]]から制御メッセージをすべて削除する。

  5. [[decodeQueueSize]] が0より大きい場合:

    1. [[decodeQueueSize]]を0に設定する。

    2. Dequeueイベントスケジュールアルゴリズムを実行する。

  6. [[pending flush promises]]内の各promiseについて:

    1. promiseexceptionで拒否する。

    2. promise[[pending flush promises]]から削除する。

AudioDecoderクローズ (exception付き)
以下の手順を実行する:
  1. AudioDecoderリセットアルゴリズムをexceptionで実行する。

  2. [[state]]"closed"を設定する。

  3. [[codec implementation]]をクリアし、関連するシステムリソースを解放する。

  4. exceptionAbortError 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]]

次にdecode()に渡されるチャンクが、typeで示されるkey chunkでなければならないことを示す真偽値。

[[state]]

このVideoDecoderの現在のCodecState

[[decodeQueueSize]]

保留中のデコード要求の数。この値は基礎となるコーデックが新しい入力を受け付け可能になると減少します。

[[pending flush promises]]

flush()呼び出しで返された未解決のPromiseのリスト。

[[dequeue event scheduled]]

dequeueイベントがすでに発火予定かどうかを示す真偽値。イベントスパム防止用。

4.2. コンストラクター

VideoDecoder(init)
  1. dを新しいVideoDecoderオブジェクトとする。

  2. [[control message queue]]に新しいキューを割り当てる。

  3. [[message queue blocked]]falseを割り当てる。

  4. [[codec implementation]]nullを割り当てる。

  5. [[codec work queue]]に新しいparallel queueの開始結果を割り当てる。

  6. [[codec saturated]]falseを割り当てる。

  7. [[output callback]]にinit.outputを割り当てる。

  8. [[error callback]]にinit.errorを割り当てる。

  9. [[active decoder config]]nullを割り当てる。

  10. [[key chunk required]]trueを割り当てる。

  11. [[state]]"unconfigured"を割り当てる。

  12. [[decodeQueueSize]]0を割り当てる。

  13. [[pending flush promises]]に新しいリストを割り当てる。

  14. [[dequeue event scheduled]]falseを割り当てる。

  15. dを返す。

4.3. 属性

state, CodecState、readonly

[[state]]の値を返します。

decodeQueueSize, unsigned long、readonly

[[decodeQueueSize]]の値を返します。

ondequeue, EventHandler

イベントハンドラーIDL属性で、イベントハンドラーイベントタイプdequeueです。

4.4. イベント概要

dequeue

VideoDecoderで、decodeQueueSizeが減少したときに発火します。

4.5. メソッド

configure(config)
制御メッセージをキューに追加し、configで記述された通りにビデオデコーダーを設定してチャンクのデコードを行います。

注: このメソッドは、ユーザーエージェントがconfigをサポートしない場合、NotSupportedError を発生させます。著者はまずconfigを使ってisConfigSupported() を呼び出してサポート状況を確認することが推奨されます。ユーザーエージェントは特定のコーデックタイプや設定をサポートする必要はありません。

呼び出されたとき、以下の手順を実行します:

  1. config有効なVideoDecoderConfigでない場合、TypeErrorを投げる。

  2. [[state]]“closed”の場合、InvalidStateErrorを投げる。

  3. [[state]]"configured"を設定する。

  4. [[key chunk required]]trueを設定する。

  5. 制御メッセージをキューに追加し、configでデコーダーを設定する。

  6. 制御メッセージキューを処理する。

制御メッセージの実行でデコーダーを設定する場合、以下の手順を実行します:

  1. [[message queue blocked]]trueを割り当てる。

  2. [[codec work queue]]に以下の手順をキューに追加する:

    1. supportedを、Check Configuration Supportアルゴリズムをconfigで実行した結果とする。

    2. supportedfalseの場合、タスクをキューに追加し、Close VideoDecoderアルゴリズムをNotSupportedErrorで実行し、これ以降の手順を中止する。

    3. 必要に応じて、[[codec implementation]]configをサポートする実装を割り当てる。

    4. [[codec implementation]]configで設定する。

    5. タスクをキューに追加し、以下の手順を実行する:

      1. [[message queue blocked]]falseを割り当てる。

      2. タスクをキューに追加し、制御メッセージキューを処理する。

  3. "processed"を返す。

decode(chunk)
制御メッセージをキューに追加し、指定されたchunkをデコードします。

注: 出力されたVideoFrameが不要になったらすぐにclose()を呼び出すことが推奨されます。基礎となるメディアリソースVideoDecoderが所有しており、解放しない(またはガベージコレクションまで待つ)とデコードが停止することがあります。

注: VideoDecoderは、フレームが提示順(presentation order)で出力されることを要求します。一部の[[codec implementation]]を使用する場合、ユーザーエージェントが出力を提示順に並べ替える必要があります。

呼び出されたとき、以下の手順を実行します:

  1. [[state]]"configured"でない場合、InvalidStateErrorを投げる。

  2. [[key chunk required]]trueの場合:

    1. chunk.typekeyでない場合、DataErrorを投げる。

    2. 実装者は推奨として、chunk[[internal data]]を検査し、本当にkey chunkであることを確認するべきです。不一致が検出された場合、DataErrorを投げる。

    3. それ以外の場合、[[key chunk required]]falseを割り当てる。

  3. [[decodeQueueSize]]をインクリメントする。

  4. 制御メッセージをキューに追加し、chunkをデコードする。

  5. 制御メッセージキューを処理する。

制御メッセージの実行でchunkをデコードする場合、以下の手順を実行します:

  1. [[codec saturated]]trueの場合、"not processed"を返す。

  2. chunkのデコードにより[[codec implementation]]saturatedになる場合、[[codec saturated]]trueを割り当てる。

  3. [[decodeQueueSize]]をデクリメントし、Dequeueイベントスケジュールアルゴリズムを実行する。

  4. [[codec work queue]]に以下の手順をキューに追加する:

    1. [[codec implementation]]でchunkのデコードを試みる。

    2. デコードでエラーが発生した場合、タスクをキューに追加し、Close VideoDecoderアルゴリズムをEncodingErrorで実行し、戻る。

    3. [[codec saturated]]trueかつ[[codec implementation]]saturatedでなくなった場合、タスクをキューに追加し、以下の手順を実行する:

      1. [[codec saturated]]falseを割り当てる。

      2. 制御メッセージキューを処理する。

    4. decoded outputsを、[[codec implementation]]から出力された提示順のデコード済みビデオデータのリストとする。

    5. decoded outputsが空でない場合、タスクをキューに追加し、Output VideoFrameアルゴリズムをdecoded outputsで実行する。

  5. "processed"を返す。

flush()
制御メッセージをすべて制御メッセージキューで完了し、すべての出力を発行します。

呼び出されたとき、以下の手順を実行します:

  1. [[state]]"configured"でない場合、拒否されたPromiseInvalidStateError DOMExceptionで返す。

  2. [[key chunk required]]trueを設定する。

  3. promiseを新しいPromiseとする。

  4. promise[[pending flush promises]]に追加する。

  5. 制御メッセージをキューに追加し、コーデックをpromiseでフラッシュする。

  6. 制御メッセージキューを処理する。

  7. promiseを返す。

制御メッセージの実行でコーデックをフラッシュする場合、promiseを使って以下の手順を実行します:

  1. [[codec work queue]]に以下の手順をキューに追加する:

    1. [[codec implementation]]にすべての内部保留出力を発行するようにシグナルする。

    2. decoded outputsを、[[codec implementation]]から出力されたデコード済みビデオデータのリストとする。

    3. タスクをキューに追加し、以下の手順を実行する:

      1. decoded outputsが空でない場合、Output VideoFrame アルゴリズムをdecoded outputsで実行する。

      2. promise[[pending flush promises]]から削除する。

      3. promiseを解決する。

  2. "processed"を返す。

reset()
設定、制御メッセージ制御メッセージキュー内のすべてのメッセージ、および保留中のコールバックを即座にリセットします。

呼び出されたとき、Reset VideoDecoderアルゴリズムをAbortError DOMExceptionで実行する。

close()
保留中のすべての作業を即座に中止し、システムリソースを解放します。 closeは最終的な操作です。

呼び出されたとき、Close VideoDecoderアルゴリズムをAbortError DOMExceptionで実行する。

isConfigSupported(config)
指定されたconfigがユーザーエージェントでサポートされているかどうかを示すPromiseを返します。

注: 返されるVideoDecoderSupportconfig には、ユーザーエージェントが認識した辞書メンバーのみが含まれます。 認識されない辞書メンバーは無視されます。著者は、config と提供したconfigを比較することで認識されないメンバーを検出できます。

呼び出されたとき、以下の手順を実行します:

  1. config有効なVideoDecoderConfigでない場合、拒否されたPromiseTypeErrorで返す。

  2. pを新しいPromiseとする。

  3. checkSupportQueueを新しいparallel queueの開始結果とする。

  4. checkSupportQueueに以下の手順をキューに追加する:

    1. supportedCheck Configuration Supportアルゴリズムをconfigで実行した結果とする。

    2. タスクをキューに追加し、以下の手順を実行する:

      1. decoderSupportを新しく構築したVideoDecoderSupportとし、以下のように初期化する:

        1. configClone Configurationアルゴリズムをconfigで実行した結果に設定する。

        2. supportedsupportedに設定する。

      2. pdecoderSupportで解決する。

  5. pを返す。

4.6. アルゴリズム

デキューイベントのスケジュール
  1. [[dequeue event scheduled]]true の場合、リターンする。

  2. [[dequeue event scheduled]]true を代入する。

  3. タスクをキューに追加し、以下のステップを実行する:

    1. dequeue という名前のシンプルなイベントを this に発火する。

    2. [[dequeue event scheduled]]false を代入する。

VideoFrameの出力 (with outputs)
以下のステップを実行する:
  1. outputs の各 output について:

    1. output に関連付けられた timestampdurationtimestamp および duration とする。

    2. displayAspectWidth および displayAspectHeight を未定義とする。

    3. displayAspectWidth および displayAspectHeight[[active decoder config]]存在する場合、それぞれの値を displayAspectWidth および displayAspectHeight に代入する。

    4. colorSpace を、コーデック実装によって検出された VideoColorSpace とする。検出されない場合は undefined とする。

      注: コーデック実装は VideoColorSpace をビットストリーム解析によって検出できる。検出はベストエフォートで行われる。検出方法は実装依存かつコーデック固有である。著者は VideoDecoderConfigcolorSpace を指定することで検出された VideoColorSpace を上書きできる。

    5. colorSpace[[active decoder config]]存在する場合、その値を colorSpace に代入する。

    6. rotation および flip の値を rotation および flip に代入する。

    7. frame を、VideoFrame生成 アルゴリズムを output, timestamp, duration, displayAspectWidth, displayAspectHeight, colorSpace, rotation, flip で実行した結果とする。

    8. [[output callback]]frame で呼び出す。

VideoDecoderのリセット (with exception)
以下のステップを実行する:
  1. state"closed" の場合、InvalidStateError をスローする。

  2. state"unconfigured" に設定する。

  3. [[codec implementation]] に、以前の設定の出力生成を停止するよう通知する。

  4. [[control message queue]] からすべての 制御メッセージ を削除する。

  5. [[decodeQueueSize]] が 0 より大きい場合:

    1. [[decodeQueueSize]] を 0 に設定する。

    2. デキューイベントのスケジュール アルゴリズムを実行する。

  6. [[pending flush promises]] の各 promise について:

    1. promiseexception で reject する。

    2. promise[[pending flush promises]] から削除する。

VideoDecoderのクローズ (with exception)
以下のステップを実行する:
  1. VideoDecoderのリセットアルゴリズムを exception で実行する。

  2. state"closed" に設定する。

  3. [[codec implementation]] をクリアし、関連する システムリソース を解放する。

  4. exceptionAbortError 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)
  1. e を新しい AudioEncoder オブジェクトとする。

  2. 新しい キュー[[control message queue]] に代入する。

  3. [[message queue blocked]]false を代入する。

  4. [[codec implementation]]null を代入する。

  5. 新しい 並列キュー の開始結果を [[codec work queue]] に代入する。

  6. [[codec saturated]]false を代入する。

  7. init.output を [[output callback]] に代入する。

  8. init.error を [[error callback]] に代入する。

  9. [[active encoder config]]null を代入する。

  10. [[active output config]]null を代入する。

  11. [[state]]"unconfigured" を代入する。

  12. [[encodeQueueSize]]0 を代入する。

  13. 新しい リスト[[pending flush promises]] に代入する。

  14. [[dequeue event scheduled]]false を代入する。

  15. e を返す。

5.3. 属性

state, CodecState, 読み取り専用

[[state]] の値を返す。

encodeQueueSize, unsigned long, 読み取り専用

[[encodeQueueSize]] の値を返す。

ondequeue, EventHandler

イベントハンドラーIDL属性であり、イベントハンドラーイベント型dequeue である。

5.4. イベント概要

dequeue

AudioEncoderencodeQueueSize が減少したときに発火される。

5.5. メソッド

configure(config)
制御メッセージをキューに追加し、config で記述された音声データのエンコード用に オーディオエンコーダを構成する。

注: このメソッドは、ユーザーエージェントが config を サポートしない場合 NotSupportedError を発生させる。著者は configisConfigSupported() を呼び出して事前にサポートを確認することが推奨される。ユーザーエージェントは特定のコーデックタイプや構成をサポートする必要はない。

呼び出されたとき、以下のステップを実行する:

  1. config有効な AudioEncoderConfig でない場合、 TypeError をスローする。

  2. [[state]]"closed" の場合、 InvalidStateError をスローする。

  3. [[state]]"configured" に設定する。

  4. 制御メッセージをキューに追加し、config で エンコーダを構成する。

  5. 制御メッセージキューを処理する。

制御メッセージの実行でエンコーダを構成する場合、以下のステップを実行する:

  1. [[message queue blocked]]true を代入する。

  2. [[codec work queue]] に以下のステップをエンキューする:

    1. supportedCheck Configuration Support アルゴリズムを config で実行した結果とする。

    2. supportedfalse の場合、タスクをキューに追加し、AudioEncoderのクローズ アルゴリズムを NotSupportedError で実行し、これ以降のステップを中止する。

    3. 必要に応じて [[codec implementation]]config をサポートする実装を代入する。

    4. [[codec implementation]]config で構成する。

    5. タスクをキューに追加し、以下のステップを実行する:

      1. [[message queue blocked]]false を代入する。

      2. タスクをキューに追加し、 制御メッセージキューを処理する。

  3. "processed" を返す。

encode(data)
制御メッセージをキューに追加し、指定された data をエンコードする。

呼び出されたとき、以下のステップを実行する:

  1. data[[Detached]] 内部スロットの値が true の場合、 TypeError をスローする。

  2. [[state]]"configured" でない場合、 InvalidStateError をスローする。

  3. dataCloneAudioDataの複製 アルゴリズムを data で実行した結果とする。

  4. [[encodeQueueSize]] をインクリメントする。

  5. 制御メッセージをキューに追加し、 dataClone をエンコードする。

  6. 制御メッセージキューを処理する。

制御メッセージの実行でデータをエンコードする場合、以下のステップを実行する:

  1. [[codec saturated]]true の場合、"not processed" を返す。

  2. エンコードによって [[codec implementation]]saturated になる場合、 [[codec saturated]]true を代入する。

  3. [[encodeQueueSize]] をデクリメントし、 デキューイベントのスケジュール アルゴリズムを実行する。

  4. [[codec work queue]] に以下のステップをエンキューする:

    1. [[codec implementation]] を使って media resourcedataCloneで記述される)を エンコードしようと試みる。

    2. エンコードでエラーが発生した場合、タスクをキューに追加し、 AudioEncoderのクローズアルゴリズムを EncodingError で実行し、リターンする。

    3. [[codec saturated]]true で、かつ [[codec implementation]]saturated でなくなった場合、 タスクをキューに追加し、以下のステップを実行する:

      1. [[codec saturated]]false を代入する。

      2. 制御メッセージキューを処理する。

    4. encoded outputsリスト型の エンコード済み音声データ出力([[codec implementation]] から出力されたもの)とする。

    5. encoded outputs が空でない場合、タスクをキューに追加し、 EncodedAudioChunksの出力 アルゴリズムを encoded outputs で実行する。

  5. "processed" を返す。

flush()
制御メッセージcontrol message queue で全て完了し、すべての出力を発行する。

呼び出されたとき、以下のステップを実行する:

  1. [[state]]"configured" でない場合、 rejectされたpromiseInvalidStateError DOMException)を返す。

  2. promise を新しい Promise とする。

  3. promise[[pending flush promises]] に追加する。

  4. 制御メッセージをキューに追加し、promise でコーデックをフラッシュする。

  5. 制御メッセージキューを処理する。

  6. promise を返す。

制御メッセージの実行でコーデックをフラッシュする場合、promise で以下のステップを実行する:

  1. [[codec work queue]] に以下のステップをエンキューする:

    1. [[codec implementation]]内部保留出力 のすべてを発行するよう通知する。

    2. encoded outputsリスト型の エンコード済み音声データ出力([[codec implementation]] から出力されたもの)とする。

    3. タスクをキューに追加し、以下のステップを実行する:

      1. encoded outputs が空でない場合、 EncodedAudioChunksの出力 アルゴリズムを encoded outputs で実行する。

      2. promise[[pending flush promises]] から削除する。

      3. promise を resolve する。

  2. "processed" を返す。

reset()
構成、制御メッセージcontrol message queue内)、 保留中のコールバックを含むすべての状態を即座にリセットする。

呼び出されたとき、AudioEncoderのリセットアルゴリズムを AbortError DOMException で実行する。

close()
保留中の作業を即座に中止し、システムリソースを解放する。 closeは最終的な操作である。

呼び出されたとき、AudioEncoderのクローズアルゴリズムを AbortError DOMException で実行する。

isConfigSupported(config)
指定された config がユーザーエージェントでサポートされているかどうかを示す promise を返す。

注: 返される AudioEncoderSupportconfig には、ユーザーエージェントが認識した辞書メンバーのみが含まれる。認識されない辞書メンバーは無視される。 著者は config と提供した config を比較することで認識されないメンバーを検出できる。

呼び出されたとき、以下のステップを実行する:

  1. config有効な AudioEncoderConfig でない場合、 rejectされたpromiseTypeError)を返す。

  2. p を新しい Promise とする。

  3. checkSupportQueue を新しい 並列キューの開始結果とする。

  4. checkSupportQueue に以下のステップをエンキューする:

    1. supportedCheck Configuration Support アルゴリズムを config で実行した結果とする。

    2. タスクをキューに追加し、以下のステップを実行する:

      1. encoderSupport を新しく構築した AudioEncoderSupport とし、以下のように初期化する:

        1. configClone Configuration アルゴリズムを config で実行した結果に設定する。

        2. supportedsupported に設定する。

      2. pencoderSupport で resolve する。

  5. p を返す。

5.6. アルゴリズム

デキューイベントのスケジュール
  1. [[dequeue event scheduled]]true の場合、リターンする。

  2. [[dequeue event scheduled]]true を代入する。

  3. タスクをキューに追加し、以下のステップを実行する:

    1. dequeue という名前のシンプルなイベントを this に発火する。

    2. [[dequeue event scheduled]]false を代入する。

EncodedAudioChunkの出力 (with outputs)
以下のステップを実行する:
  1. outputs の各 output について:

    1. chunkInit を、以下のキーを持つ EncodedAudioChunkInit とする:

      1. dataoutput からのエンコード済み音声データを格納する。

      2. typeoutputEncodedAudioChunkType を格納する。

      3. timestampoutput に関連付けられた AudioData の timestamp を格納する。

      4. durationoutput に関連付けられた AudioData の duration を格納する。

    2. chunkchunkInit で構築した新しい EncodedAudioChunk とする。

    3. chunkMetadata を新しい EncodedAudioChunkMetadata とする。

    4. encoderConfig[[active encoder config]] とする。

    5. outputConfigoutput を記述する新しい AudioDecoderConfig とし、以下のように初期化する:

      1. encoderConfig.codecoutputConfig.codec に代入する。

      2. encoderConfig.sampleRateoutputConfig.sampleRate に代入する。

      3. encoderConfig.numberOfChannelsoutputConfig.numberOfChannels に代入する。

      4. outputConfig.description[[codec implementation]] によって決定されるコーデック固有のバイト列を代入する。ユーザーエージェントは、提供された description が 出力の正しいデコードに使用できることを 必須 とする。

        注: description のコーデック固有要件は [WEBCODECS-CODEC-REGISTRY] で記述されている。

    6. outputConfig[[active output config]]等価な辞書でない場合:

      1. outputConfigchunkMetadata.decoderConfig に代入する。

      2. outputConfig[[active output config]] に代入する。

    7. [[output callback]]chunkchunkMetadata で呼び出す。

AudioEncoderのリセット (with exception)
以下のステップを実行する:
  1. [[state]]"closed" の場合、InvalidStateError をスローする。

  2. [[state]]"unconfigured" に設定する。

  3. [[active encoder config]]null に設定する。

  4. [[active output config]]null に設定する。

  5. [[codec implementation]] に、以前の構成の出力生成を停止するよう通知する。

  6. [[control message queue]] からすべての 制御メッセージ を削除する。

  7. [[encodeQueueSize]] が 0 より大きい場合:

    1. [[encodeQueueSize]] を 0 に設定する。

    2. デキューイベントのスケジュール アルゴリズムを実行する。

  8. [[pending flush promises]] の各 promise について:

    1. promiseexception で reject する。

    2. promise[[pending flush promises]] から削除する。

AudioEncoderのクローズ (with exception)
以下のステップを実行する:
  1. AudioEncoderのリセットアルゴリズムを exception で実行する。

  2. [[state]]"closed" に設定する。

  3. [[codec implementation]] をクリアし、関連する システムリソース を解放する。

  4. exceptionAbortError 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)
  1. e を新しい VideoEncoder オブジェクトとする。

  2. 新しいキュー[[control message queue]] に割り当てる。

  3. false[[message queue blocked]] に割り当てる。

  4. null[[codec implementation]] に割り当てる。

  5. 新しい並列キューを開始した結果[[codec work queue]] に割り当てる。

  6. false[[codec saturated]] に割り当てる。

  7. init.output を [[output callback]] に割り当てる。

  8. init.error を [[error callback]] に割り当てる。

  9. null[[active encoder config]] に割り当てる。

  10. null[[active output config]] に割り当てる。

  11. "unconfigured"[[state]] に割り当てる。

  12. 0[[encodeQueueSize]] に割り当てる。

  13. 新しいリスト[[pending flush promises]] に割り当てる。

  14. false[[dequeue event scheduled]] に割り当てる。

  15. 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 で呼び出してサポートを確認することが推奨されます。ユーザーエージェントは特定のコーデックタイプや構成を必ずサポートする必要はありません。

呼び出されたとき、次の手順を実行します:

  1. もし config が有効な VideoEncoderConfig でない場合、TypeError を投げる。

  2. もし [[state]]"closed" の場合、InvalidStateError を投げる。

  3. [[state]]"configured" に設定する。

  4. [[active orientation]]null に設定する。

  5. 制御メッセージをキューに追加して、config を使用してエンコーダを構成する。

  6. 制御メッセージキューを処理する。

エンコーダを構成するための制御メッセージを実行するとは、次の手順を行うことを意味します:

  1. true[[message queue blocked]] に割り当てる。

  2. 以下の手順を [[codec work queue]] にエンキューする:

    1. supported を、Check Configuration Support アルゴリズムを config で実行した結果とする。

    2. もし supportedfalse であれば、タスクをキューに追加して Close VideoEncoder アルゴリズムを NotSupportedError で実行し、これらの手順を中止する。

    3. 必要であれば、[[codec implementation]]config をサポートする実装を割り当てる。

    4. [[codec implementation]]config で構成する。

    5. タスクをキューに追加して次の手順を実行する:

      1. false[[message queue blocked]] に割り当てる。

      2. タスクをキューに追加して 制御メッセージキューを処理する。

  3. "processed" を返す。

encode(frame, options)
制御メッセージをキューに追加して、与えられた frame をエンコードします。

呼び出されたとき、次の手順を実行します:

  1. もし frame[[Detached]] 内部スロットの値が true であれば、TypeError を投げる。

  2. もし [[state]]"configured" でなければ、InvalidStateError を投げる。

  3. もし [[active orientation]]null でなく、かつ frame[[rotation]][[flip]] と一致しない場合、DataError を投げる。

  4. もし [[active orientation]]null であれば、それを frame[[rotation]][[flip]] に設定する。

  5. frameClone を、Clone VideoFrame アルゴリズムを frame で実行した結果とする。

  6. [[encodeQueueSize]] をインクリメントする。

  7. 制御メッセージをキューに追加して frameClone をエンコードする。

  8. 制御メッセージキューを処理する。

フレームをエンコードするための制御メッセージを実行するとは、次の手順を行うことを意味します:

  1. もし [[codec saturated]]true であれば、"not processed" を返す。

  2. もしエンコードすることで [[codec implementation]]saturated になる場合、[[codec saturated]]true を割り当てる。

  3. [[encodeQueueSize]] をデクリメントし、Schedule Dequeue Event アルゴリズムを実行する。

  4. 以下の手順を [[codec work queue]] にエンキューする:

    1. [[codec implementation]] を用いて frameCloneoptions に従ってエンコードしようと試みる。

    2. もしエンコードがエラーになる場合、タスクをキューに追加して Close VideoEncoder アルゴリズムを EncodingError で実行し、戻る。

    3. もし [[codec saturated]]true であり、かつ [[codec implementation]] がもはや saturated でない場合、タスクをキューに追加して次の手順を実行する:

      1. false[[codec saturated]] に割り当てる。

      2. 制御メッセージキューを処理する。

    4. encoded outputs を、[[codec implementation]] によって出力されたエンコード済みビデオデータ出力の リストとする。

    5. もし encoded outputs が空でなければ、タスクをキューに追加して Output EncodedVideoChunks アルゴリズムを encoded outputs で実行する。

  5. "processed" を返す。

flush()

制御メッセージキュー内のすべての制御メッセージを完了し、すべての出力を生成します。

呼び出されたとき、次の手順を実行します:

  1. もし [[state]]"configured" でなければ、a promise rejected with InvalidStateError DOMException を返す。

  2. 新しい Promise を promise とする。

  3. promise[[pending flush promises]] に追加する。

  4. 制御メッセージをキューに追加して、promise とともにコーデックをフラッシュする。

  5. 制御メッセージキューを処理する。

  6. promise を返す。

コーデックをフラッシュするための制御メッセージを実行するとは、次の手順を promise とともに行うことを意味します:

  1. 以下の手順を [[codec work queue]] にエンキューする:

    1. [[codec implementation]] に対して、すべての内部保留出力 (internal pending outputs) を出力するよう信号を送る。

    2. encoded outputs を、[[codec implementation]] によって出力されたエンコード済みビデオデータ出力の リストとする。

    3. タスクをキューに追加して次の手順を実行する:

      1. もし encoded outputs が空でなければ、Output EncodedVideoChunks アルゴリズムを encoded outputs で実行する。

      2. promise[[pending flush promises]] から削除する。

      3. promise を解決する。

  2. "processed" を返す。

reset()

構成、制御メッセージキュー内の制御メッセージ、およびすべての保留中コールバックを含むすべての状態を即座にリセットします。

呼び出されたとき、Reset VideoEncoder アルゴリズムを AbortError DOMException で実行します。

close()

保留中のすべての作業を即座に中止し、システムリソース を解放します。Close は最終的な操作です。

呼び出されたとき、Close VideoEncoder アルゴリズムを AbortError DOMException で実行します。

isConfigSupported(config)

指定された config がユーザーエージェントによってサポートされているかどうかを示す Promise を返します。

NOTE: 返される VideoEncoderSupportconfig にはユーザーエージェントが認識した辞書メンバーのみが含まれます。認識されない辞書メンバーは無視されます。作者は、自身が提供した config と返された config を比較して、認識されていない辞書メンバーを検出できます。

呼び出されたとき、次の手順を実行します:

  1. もし config が有効な VideoEncoderConfig でない場合、a promise rejected with TypeError を返す。

  2. 新しい Promise を p とする。

  3. 新しい 並列キュー を開始した結果を checkSupportQueue とする。

  4. 以下の手順を checkSupportQueue にエンキューする:

    1. supported を、Check Configuration Support アルゴリズムを config で実行した結果とする。

    2. タスクをキューに追加して次の手順を実行する:

      1. encoderSupport を新しく構築された VideoEncoderSupport とし、以下のように初期化する:

        1. config を、Clone Configuration アルゴリズムを config で実行した結果に設定する。

        2. supportedsupported に設定する。

    3. pencoderSupport で解決する。

  5. p を返す。

6.6. アルゴリズム

Schedule Dequeue Event
  1. もし [[dequeue event scheduled]]true と等しいなら、戻る。

  2. true[[dequeue event scheduled]] に割り当てる。

  3. タスクをキューに追加して、次の手順を実行するタスクを登録する:

    1. dequeue という名前のシンプルイベントを this 上で発火させる。

    2. false[[dequeue event scheduled]] に割り当てる。

Output EncodedVideoChunks (with outputs)
次の手順を実行する:
  1. outputs の各 output について:

    1. chunkInit を、次のキーを持つ EncodedVideoChunkInit とする:

      1. dataoutput からのエンコード済みビデオデータを含む。

      2. typeoutputEncodedVideoChunkType である。

      3. timestampoutput に関連付けられた [[timestamp]]VideoFrame から)である。

      4. durationoutput に関連付けられた [[duration]]VideoFrame から)である。

    2. chunk を、chunkInit で構築された新しい EncodedVideoChunk とする。

    3. chunkMetadata を新しい EncodedVideoChunkMetadata とする。

    4. encoderConfig[[active encoder config]] とする。

    5. outputConfigoutput を記述する VideoDecoderConfig とする。outputConfig を次のように初期化する:

      1. encoderConfig.codecoutputConfig.codec に割り当てる。

      2. encoderConfig.widthoutputConfig.codedWidth に割り当てる。

      3. encoderConfig.heightoutputConfig.codedHeight に割り当てる。

      4. encoderConfig.displayWidthoutputConfig.displayAspectWidth に割り当てる。

      5. encoderConfig.displayHeightoutputConfig.displayAspectHeight に割り当てる。

      6. [[rotation]] を、output に関連付けられた VideoFrame から取り出して outputConfig.rotation に割り当てる。

      7. [[flip]] を、output に関連付けられた VideoFrame から取り出して outputConfig.flip に割り当てる。

      8. outputConfig の残りのキーは [[codec implementation]] によって決定されるものを割り当てる。ユーザーエージェントは MUSToutputConfigoutput を正しくデコードするために十分に記述されていることを保証しなければならない。

        NOTE: description を埋めるためのコーデック固有の要件は [WEBCODECS-CODEC-REGISTRY] に記載されている。

    6. もし outputConfig[[active output config]] が等しくない(equal dictionaries でない)場合:

      1. outputConfigchunkMetadata.decoderConfig に割り当てる。

      2. outputConfig[[active output config]] に割り当てる。

    7. もし encoderConfig.scalabilityMode が複数の temporal layers を記述している場合:

      1. svc を新しい SvcOutputMetadata インスタンスとする。

      2. temporal_layer_id を、output の temporal layer を示すゼロベースのインデックスとする。

      3. temporal_layer_idsvc.temporalLayerId に割り当てる。

      4. svcchunkMetadata.svc に割り当てる。

    8. もし encoderConfig.alpha"keep" に設定されている場合:

      1. alphaSideData を、output に含まれるエンコード済みアルファデータとする。

      2. alphaSideDatachunkMetadata.alphaSideData に割り当てる。

    9. [[output callback]]chunkchunkMetadata を引数に呼び出す。

Reset VideoEncoder (with exception)
次の手順を実行する:
  1. もし [[state]]"closed" であれば、InvalidStateError を投げる。

  2. [[state]]"unconfigured" に設定する。

  3. [[active encoder config]]null に設定する。

  4. [[active output config]]null に設定する。

  5. [[codec implementation]] に前の構成に対する出力を停止するよう信号を送る。

  6. [[control message queue]] からすべての control messages を削除する。

  7. もし [[encodeQueueSize]] が 0 より大きいなら:

    1. [[encodeQueueSize]] を 0 に設定する。

    2. Schedule Dequeue Event アルゴリズムを実行する。

  8. [[pending flush promises]] の各 promise について:

    1. promiseexception で拒否する。

    2. promise[[pending flush promises]] から削除する。

Close VideoEncoder (with exception)
次の手順を実行する:
  1. Reset VideoEncoder アルゴリズムを exception を使って実行する。

  2. [[state]]"closed" に設定する。

  3. [[codec implementation]] をクリアし、関連する system resources を解放する。

  4. もし exceptionAbortError ではない 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付き)

次の手順を実行する:
  1. もし config.codec にある codec stringvalid codec string ではない、あるいはユーザーエージェントによって認識されない場合、false を返す。

  2. もし configAudioDecoderConfig または VideoDecoderConfig であり、ユーザーエージェントが codec を提供できず、config.codec に示される(存在する場合の)正確なプロファイル、レベル、制約ビットをデコードできないなら、false を返す。

  3. もし configAudioEncoderConfig または VideoEncoderConfig の場合:

    1. もし config.codec の codec string にプロファイルが含まれており、ユーザーエージェントがそのプロファイルをエンコードできる codec を提供できないなら、false を返す。

    2. もし config.codec の codec string にレベルが含まれており、ユーザーエージェントが config.codec に示されたレベル以下にエンコードできる codec を提供できないなら、false を返す。

    3. もし config.codec の codec string に制約ビットが含まれており、ユーザーエージェントが config.codec に示された制約以上に制約されたビットストリームを生成できる codec を提供できないなら、false を返す。

  4. もしユーザーエージェントが、含まれていないキーに対する適用されるデフォルト値を含めて、config のすべての項目をサポートする codec を提供できるなら、true を返す。

    NOTE: AudioDecoderConfigVideoDecoderConfigAudioEncoderConfig、 および VideoEncoderConfig はそれぞれ対応する構成エントリとデフォルトを定義する。

    NOTE: ハードウェアが変更された場合(例: 外付けGPUが抜かれた)や必須のハードウェア資源が枯渇した場合、特定の構成のサポートは動的に変化する可能性がある。ユーザーエージェントは、その時点で利用可能な資源に基づいてベストエフォートでサポートを記述する。

  5. それ以外の場合、false を返す。

7.2. 設定の複製config付き)

NOTE: このアルゴリズムは、ユーザーエージェントがその辞書型の一部として認識する辞書メンバーのみをコピーします。

次の手順を実行する:

  1. dictTypeconfig の辞書型とする。

  2. clonedictType の新しい空のインスタンスとする。

  3. dictType に定義されている各辞書メンバー m について:

    1. もし mconfig に存在しないなら、続行(continue)する。

    2. もし config[m] がネストされた辞書であれば、再帰的に Clone Configuration アルゴリズムを config[m] に対して実行した結果を clone[m] に設定する。

    3. それ以外の場合、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.

  1. 関連するコーデック仕様に従って有効である(下の例を参照)。

  2. 単一のコーデックを記述していること。

  3. プロファイル、レベル、および制約ビットを定義するコーデックについて、これらに関して曖昧さがないこと。

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 であるかを確認するには、次の手順を実行する:

  1. もし codec が先頭および末尾の ASCII 空白を取り除いた後に空文字列であれば、false を返す。

  2. もし description が[detached]であれば、false を返す。

  3. true を返す。

codec, of type DOMString
config.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 であるかを確認するには、次の手順を実行する:

  1. もし codec先頭および末尾の ASCII 空白を取り除いた後 に空文字列であれば、false を返す。

  2. もし codedWidth または codedHeight のどちらか一方のみが存在し、もう一方が存在しない場合、false を返す。

  3. もし codedWidth = 0 または codedHeight = 0 であれば、false を返す。

  4. もし displayAspectWidth または displayAspectHeight のどちらか一方のみが存在し、もう一方が存在しない場合、false を返す。

  5. もし displayAspectWidth = 0 または displayAspectHeight = 0 であれば、false を返す。

  6. もし description が [detached] であれば、false を返す。

  7. true を返す。

codec, of type DOMString
config.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 to 0
デコードされたフレームの rotation 属性を設定する。
flip, of type boolean, defaulting to false
デコードされたフレームの 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 であるかを確認するには、次の手順を実行する:

  1. もし codec が先頭および末尾の ASCII 空白を取り除いた後に空文字列であれば、false を返す。

  2. もし AudioEncoderConfig がコーデック固有の拡張を持ち、対応する [WEBCODECS-CODEC-REGISTRY] の登録がその拡張が有効かどうかを検証する手順を定義している場合、その手順を実行した結果を返す。

  3. もし sampleRate または numberOfChannels が 0 と等しい場合、false を返す。

  4. true を返す。

codec, of type DOMString
config.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] に記述されている。

次の手順を実行して、VideoEncoderConfigvalid VideoEncoderConfig であるかを確認する:

  1. もし codec先頭および末尾の ASCII 空白を取り除いた後 に空文字列であれば、false を返す。

  2. もし width = 0 または height = 0 であれば、false を返す。

  3. もし displayWidth = 0 または displayHeight = 0 であれば、false を返す。

  4. true を返す。

codec, of type DOMString
config.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 を既定値とする。
NOTE: displayWidth または displayHeightwidth および height と異なることを示す場合、それはチャンクがデコード後に最終的な表示アスペクト比に到達するようスケーリングされることを意味する。

多くのコーデックではこれは単に透過的な情報に過ぎないが、いくつかのコーデックはビットストリーム内に表示サイズを含めることがある。

bitrate, of type unsigned long long
エンコードされたビデオの平均ビットレート(ビット毎秒)。

NOTE: 作者はレート制御のために、追加で framerate を提供することが推奨される。

framerate, of type double
既知の場合の期待フレームレート(フレーム毎秒)。この値はフレームの timestamp とともに、各エンコード済みフレームの最適なバイト長を計算するためにビデオエンコーダによって使用されることがSHOULDである。さらに、latencyModerealtime に設定されている場合、この値は出力の締め切り目標として考慮されるべきである。
hardwareAcceleration, of type HardwareAcceleration, defaulting to "no-preference"
このコーデックのハードウェアアクセラレーションを構成するヒント。詳しくは HardwareAcceleration を参照。
alpha, of type AlphaOption, defaulting to "discard"
入力される VideoFrame のアルファ成分をエンコード前に保持するか破棄するかを指定する。もし alphadiscard の場合、アルファデータは常に破棄される(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-hardwareprefer-software を無視できる良い例は、ユーザープライバシーの理由や、ユーザーエージェントが別の設定の方がエンドユーザーにとって有益と判断した場合です。

ほとんどの作者はデフォルト値 no-preference を使うのが最適です。これによりユーザーエージェントはシステムや構成に関する知識をもとに最適化できます。一般的な戦略は、高解像度ではハードウェアアクセラレーションを優先し、失敗した場合はソフトウェアコーデックにフォールバックすることです。

作者はハードウェアアクセラレーションの指定時にトレードオフを慎重に検討することが推奨されます。具体的なトレードオフはデバイスごとに異なりますが、一般的には以下の点が考えられます:

これらのトレードオフを踏まえ、「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ことを示します。このモードでは:

  • ユーザーエージェントは品質向上のためにエンコードレイテンシを増加させてもよいMAY

  • ユーザーエージェントは目標 bitrateframerate を達成するためにフレームをドロップしてはならないMUST

  • framerate はエンコード済みチャンクの出力締め切り目標として使うべきではないSHOULD

realtime

ユーザーエージェントは低レイテンシの最適化を優先するべきSHOULDことを示します。このモードでは:

  • ユーザーエージェントはレイテンシ向上のために品質を犠牲にしてもよいMAY

  • ユーザーエージェントは目標 bitrateframerate を達成するためにフレームをドロップしてもよいMAY

  • framerate はエンコード済みチャンクの出力締め切り目標として使うべきSHOULD

7.12. 設定の同等性

2つの辞書は、同じキーと値を持つ場合equal dictionariesとみなされます。ネストされた辞書については、この定義を再帰的に適用します。

7.13. VideoEncoderEncodeOptions

dictionary VideoEncoderEncodeOptions {
    boolean keyFrame = false;
};

NOTE: VideoEncoderEncodeOptions に対するコーデック固有の拡張は、[WEBCODECS-CODEC-REGISTRY] の登録で説明されている。

keyFrame, of type boolean, defaulting to false
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;          // microseconds
  readonly attribute unsigned long long? duration; // microseconds
  readonly attribute unsigned long byteLength;

  undefined copyTo(AllowSharedBufferSource destination);
};

dictionary EncodedAudioChunkInit {
  required EncodedAudioChunkType type;
  [EnforceRange] required long long timestamp;    // microseconds
  [EnforceRange] unsigned long long duration;     // microseconds
  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)
  1. もし init.transfer が同じ ArrayBuffer を複数参照している場合、DataCloneError DOMException をスローします。

  2. init.transfer の各 transferable について:

    1. もし [[Detached]] 内部スロットが true であれば、DataCloneError DOMException をスローします。

  3. chunk を新しい EncodedAudioChunk オブジェクトとして生成し、次のように初期化します

    1. init.type[[type]] に代入します。

    2. init.timestamp[[timestamp]] に代入します。

    3. もし init.duration が存在すればそれを [[duration]] に代入し、存在しない場合は null を代入します。

    4. init.data.byteLength[[byte length]] に代入します;

    5. もし init.transferinit.data によって参照される ArrayBuffer を含む場合、ユーザーエージェントは次のいずれかを選択することができます:

      1. resourcemedia resource として生成し、init.data 内のサンプルデータを参照させます。

    6. それ以外の場合:

      1. init.data のコピーを [[internal data]] に代入します。

  4. init.transfer の各 transferable について:

    1. DetachArrayBuffertransferable に対して実行します。

  5. 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)

呼び出されたとき、次の手順を実行します:

  1. もしこの [[byte length]]destination のサイズより大きい場合、TypeError をスローします。

  2. [[internal data]]destination にコピーします。

8.1.5. シリアライズ

EncodedAudioChunkシリアライズ手順valueserialized、 および forStorage を持つ)は以下の通りです:
  1. forStoragetrue の場合、DataCloneError をスローします。

  2. value 内の各 EncodedAudioChunk 内部スロットについて、各内部スロットの値を、同じ名前のフィールドに serialized へ代入します。

EncodedAudioChunkデシリアライズ手順serializedvalue を持つ)は以下の通りです:
  1. serialized の全ての名前付きフィールドについて、それぞれの値を同じ名前の valueEncodedAudioChunk 内部スロットに代入します。

注意: 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;             // microseconds
  readonly attribute unsigned long long? duration;    // microseconds
  readonly attribute unsigned long byteLength;

  undefined copyTo(AllowSharedBufferSource destination);
};

dictionary EncodedVideoChunkInit {
  required EncodedVideoChunkType type;
  [EnforceRange] required long long timestamp;        // microseconds
  [EnforceRange] unsigned long long duration;         // microseconds
  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)
  1. init.transfer が同じ ArrayBuffer を複数参照している場合は、DataCloneError DOMException をスローします。

  2. init.transfer の各 transferable について:

    1. [[Detached]] 内部スロットが true なら、DataCloneError DOMException をスローします。

  3. chunk を新しい EncodedVideoChunk オブジェクトとして生成し、次のように初期化します:

    1. init.type[[type]] に代入します。

    2. init.timestamp[[timestamp]] に代入します。

    3. init に duration があれば init.duration[[duration]] に代入し、 なければ null[[duration]] に代入します。

    4. init.data.byteLength[[byte length]] に代入します;

    5. init.transferinit.data によって参照される ArrayBuffer を含む場合、ユーザーエージェントは以下のいずれかを選択できます:

      1. resource を新しい media resource とし、init.data のサンプルデータを参照させます。

    6. それ以外の場合:

      1. init.data のコピーを [[internal data]] に代入します。

  4. init.transfer の各 transferable について:

    1. DetachArrayBuffertransferable に対して行います。

  5. 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)

呼び出された際、次の手順を実行します:

  1. [[byte length]]destination[[byte length]] より大きい場合は、 TypeError を投げます。

  2. [[internal data]]destination にコピーします。

8.2.5. シリアライズ

EncodedVideoChunkシリアライズ手順valueserializedforStorage を持つ)は以下の通りです:
  1. forStoragetrue の場合、DataCloneError をスローします。

  2. value 内の各 EncodedVideoChunk 内部スロットについて、各内部スロットの値を、同じ名前のフィールドに serialized へ代入します。

EncodedVideoChunkデシリアライズ手順serializedvalue を持つ)は以下の通りです:
  1. serialized の全ての名前付きフィールドについて、それぞれの値を同じ名前の valueEncodedVideoChunk 内部スロットに代入します。

注意: 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() と同様に)閉じます。著者はこの仕組みを使って、 AudioDataVideoFrame を基盤となる media resource をコピーせずに異なる realm 間で移動できます。

AudioData または VideoFrame のシリアライズは、実質的に(clone() のように)元のオブジェクトを複製し、 両方のオブジェクトが同じ media resource を参照します。著者はこの仕組みを使って、 AudioDataVideoFrame を基盤となる 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;  // microseconds
  readonly attribute long long timestamp;          // microseconds

  unsigned 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 timestamp;  // microseconds
  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]]

この AudioDataフレーム数。

[[number of channels]]

この AudioData のオーディオチャンネル数。

[[timestamp]]

この AudioData の表示タイムスタンプ(マイクロ秒単位)。

9.2.2. コンストラクタ

AudioData(init)
  1. initvalid AudioDataInit でない場合、TypeError をスローする。

  2. init.transfer が同じ ArrayBuffer を複数参照している場合は、DataCloneError DOMException をスローする。

  3. init.transfer の各 transferable について:

    1. [[Detached]] 内部スロットが true であれば、DataCloneError DOMException をスローする。

  4. frame を新しい AudioData オブジェクトとして生成し、次のように初期化する:

    1. false[[Detached]] に代入する。

    2. init.format[[format]] に代入する。

    3. init.sampleRate[[sample rate]] に代入する。

    4. init.numberOfFrames[[number of frames]] に代入する。

    5. init.numberOfChannels[[number of channels]] に代入する。

    6. init.timestamp[[timestamp]] に代入する。

    7. init.transferinit.data によって参照される ArrayBuffer を含む場合、ユーザーエージェントは次のいずれかを選ぶことができる:

      1. resource を新しい media resource として生成し、data のサンプルデータを参照させる。

    8. それ以外の場合:

      1. resourcemedia resource として、init.data のコピーを含める。

    9. resourceReferenceresource への参照とする。

    10. resourceReference[[resource reference]] に代入する。

  5. init.transfer の各 transferable について:

    1. DetachArrayBuffertransferable に対して実行する。

  6. 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、読み取り専用

この AudioDataフレーム数。

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 手順は:

  1. microsecondsPerSecond1,000,000 とする。

  2. durationInSeconds[[number of frames]][[sample rate]] で割った結果とする。

  3. durationInSecondsmicrosecondsPerSecond の積を返す。

9.2.4. メソッド

allocationSize(options)

options で記述されたサンプルを保持するのに必要なバイト数を返します。

呼び出された際、次の手順を実行します:

  1. [[Detached]]true の場合は InvalidStateError DOMException をスローします。

  2. copyElementCountCompute Copy Element Count アルゴリズムに options を渡して得ます。

  3. destFormat[[format]] の値とします。

  4. もし options.format存在するなら、 options.formatdestFormat に代入します。

  5. bytesPerSampledestFormat が定義するサンプルごとのバイト数とします。

  6. bytesPerSample × copyElementCount の積を返します。

copyTo(destination, options)

指定した AudioData のプレーンのサンプルを destination バッファへコピーします。

呼び出された際、次の手順を実行します:

  1. [[Detached]]true の場合は InvalidStateError DOMException をスローします。

  2. copyElementCountCompute Copy Element Count アルゴリズムに options を渡して得ます。

  3. destFormat[[format]] の値とします。

  4. もし options.format存在するなら、 options.formatdestFormat に代入します。

  5. bytesPerSampledestFormat が定義するサンプルごとのバイト数とします。

  6. bytesPerSample × copyElementCount の積が destination.byteLength より大きい場合は RangeError をスローします。

  7. resource[[resource reference]] が参照する media resource とします。

  8. planeFramesresource のうち options.planeIndex に対応する領域とします。

  9. planeFrames の要素を destination にコピーします。コピーは options.frameOffset で示される フレーム から始め、copyElementCount 個のサンプルがコピーされるまで続けます。destFormat[[format]] と異なる場合は、コピー時に destFormat AudioSampleFormat へ変換します。

clone()

同じ media resource への参照を持つ新しい AudioData を生成します。

呼び出された際、次の手順を実行します:

  1. [[Detached]]true の場合は InvalidStateError DOMException をスローします。

  2. Clone AudioData アルゴリズムに this を渡した結果を返します。

close()

すべての状態をクリアし、media resource への参照を解放します。 close は最終的な操作です。

呼び出された際、Close AudioData アルゴリズムに this を渡して実行します。

9.2.5. アルゴリズム

Compute Copy Element Count (options を受け取る)

次の手順を実行します:

  1. destFormat[[format]] の値とします。

  2. もし options.format存在するなら、 options.formatdestFormat に代入します。

  3. もし destFormatインターリーブ AudioSampleFormat を記述し、 options.planeIndex0 より大きい場合、 RangeError をスローします。

  4. それ以外で、destFormatプレーナ AudioSampleFormat を記述し、 options.planeIndex[[number of channels]] 以上の場合、 RangeError をスローします。

  5. もし [[format]]destFormat と異なり、ユーザーエージェントが要求された AudioSampleFormat 変換に対応していない場合、 NotSupportedError DOMException をスローします。 f32-planar への変換は MUST 常にサポートされます。

  6. frameCountoptions.planeIndex で識別されるプレーンのフレーム数とします。

  7. もし options.frameOffsetframeCount 以上なら RangeError をスローします。

  8. copyFrameCountframeCount から options.frameOffset を引いた値とします。

  9. もし options.frameCount存在する場合:

    1. もし options.frameCountcopyFrameCount より大きければ RangeError をスローします。

    2. それ以外の場合、options.frameCountcopyFrameCount に代入します。

  10. elementCountcopyFrameCount とします。

  11. もし destFormatインターリーブ AudioSampleFormat を記述する場合は elementCount × [[number of channels]] とします。

  12. elementCount を返します。

Clone AudioData (data を受け取る)

次の手順を実行します:

  1. clone を新しい AudioData として、以下のように初期化します:

    1. resourcedata[[resource reference]] が参照する media resource とします。

    2. referenceresource への新しい参照とします。

    3. reference[[resource reference]] に代入します。

    4. data[[Detached]][[format]][[sample rate]][[number of frames]][[number of channels]][[timestamp]] の値を clone の対応するスロットに代入します。

  2. clone を返します。

Close AudioData (data を受け取る)

次の手順を実行します:

  1. data[[Detached]]true を代入します。

  2. data[[resource reference]]null を代入します。

  3. data[[sample rate]]0 を代入します。

  4. data[[number of frames]]0 を代入します。

  5. data[[number of channels]]0 を代入します。

  6. data[[format]]null を代入します。

AudioDataInitvalid AudioDataInit かどうか判定するには、以下の手順を実行します:
  1. sampleRate0 以下なら false を返す。

  2. numberOfFrames0 なら false を返す。

  3. numberOfChannels0 なら false を返す。

  4. data に十分なデータがあるかを次の手順で確認する:

    1. totalSamplesnumberOfFrames × numberOfChannels の積とする。

    2. bytesPerSampleformat が定義するサンプルごとのバイト数とする。

    3. totalSizebytesPerSample × totalSamples の積とする。

    4. dataSizedata のバイトサイズとする。

    5. もし dataSizetotalSize より小さいなら false を返す。

  5. true を返す。

注意: AudioDataInitdata の メモリ レイアウトは planar または interleaved format の期待に合っていることが想定されています。 サンプルが本当に AudioSampleFormat に準拠しているかを検証する方法はありません。

9.2.6. 転送とシリアライズ

AudioData転送手順value および dataHolder を持つ)は以下の通りです:
  1. value[[Detached]]true の場合は DataCloneError DOMException をスローします。

  2. value の全ての AudioData 内部スロットについて、各内部スロット値を同じ名前のフィールドに dataHolder へ代入します。

  3. Close AudioData アルゴリズムに value を渡して実行します。

AudioData転送受信手順dataHolder および value を持つ)は以下の通りです:
  1. dataHolder の全ての名前付きフィールドについて、それぞれの値を同じ名前の valueAudioData 内部スロットに代入します。

AudioDataシリアライズ手順valueserializedforStorage を持つ)は以下の通りです:
  1. value[[Detached]]true の場合は DataCloneError DOMException をスローします。

  2. forStoragetrue の場合は DataCloneError をスローします。

  3. resourcevalue[[resource reference]] が参照する media resource とします。

  4. newReferenceresource への新しい参照とします。

  5. newReference を |serialized.resource reference| に代入します。

  6. 残りの AudioData 内部スロット( [[resource reference]] を除く) について、各内部スロット値を同じ名前のフィールドに serialized へ代入します。

AudioDataデシリアライズ手順serialized および value を持つ)は以下の通りです:
  1. serialized の全ての名前付きフィールドについて、それぞれの値を同じ名前の valueAudioData 内部スロットに代入します。

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

8ビット符号なし整数サンプルインターリーブされたチャンネル配置

s16

16ビット符号付き整数サンプルインターリーブされたチャンネル配置

s32

32ビット符号付き整数サンプルインターリーブされたチャンネル配置

f32

32ビット浮動小数点サンプルインターリーブされたチャンネル配置

u8-planar

8ビット符号なし整数サンプルプレーナチャンネル配置

s16-planar

16ビット符号付き整数サンプルプレーナチャンネル配置

s32-planar

32ビット符号付き整数サンプルプレーナチャンネル配置

f32-planar

32ビット浮動小数点サンプルプレーナチャンネル配置

9.3.1. オーディオバッファの配置

AudioDataAudioSampleFormatインターリーブ形式の場合、異なるチャンネルのオーディオサンプルが同じバッファ内で連続して並びます。順序は § 9.3.3 オーディオチャンネル順序で説明されています。AudioData は 単一プレーンを持ち、その要素数は [[number of frames]] × [[number of channels]] です。

AudioDataAudioSampleFormatプレーナ形式の場合、異なるチャンネルのオーディオサンプルは異なるバッファに配置され、それぞれの順序は § 9.3.3 オーディオチャンネル順序で説明されています。AudioData のプレーン数は AudioData[[number of channels]] の値になります。 各プレーンの要素数は [[number of frames]] です。

注意: Web Audio API は現在 f32-planar のみを使用しています。

注意: 以下の図は プレーナ形式と インターリーブ形式の AudioSampleFormat のメモリレイアウトの例です。

インターリーブ形式とプレーナ形式のメモリレイアウトの図示

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 インターフェイス

注意: VideoFrameCanvasImageSource です。 VideoFrameCanvasImageSource を受け付ける全てのメソッドに渡すことができ、 CanvasDrawImagedrawImage() などに利用できます。

[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;  // microseconds
  readonly attribute long long timestamp;           // microseconds
  readonly 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 duration;  // microseconds
  long long timestamp;          // microseconds
  AlphaOption alpha = "keep";

  // デフォルトは画像サイズ。効率的なクロップに使える。displayWidth/displayHeightが明示されていなければ画像のピクセルアスペクト比で再計算される。
  DOMRectInit visibleRect;

  double rotation = 0;
  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 timestamp;  // microseconds
  [EnforceRange] unsigned long long duration;  // microseconds

  // デフォルトレイアウトはタイトパック
  sequence<PlaneLayout> layout;

  // デフォルトの visibleRect は coded size で (0,0) に配置
  DOMRectInit visibleRect;

  double rotation = 0;
  boolean flip = false;

  // デフォルトの displayWidth/displayHeight は visibleRect と一致
  [EnforceRange] unsigned long displayWidth;
  [EnforceRange] unsigned long displayHeight;

  VideoColorSpaceInit colorSpace;

  sequence<ArrayBuffer> transfer = [];

  VideoFrameMetadata metadata;
};

dictionary VideoFrameMetadata {
  // メンバーは VideoFrame Metadata Registry に記録されています。
};

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)

  1. image 引数の利用可能性を確認する。例外が投げられるか bad が返された場合は、 InvalidStateError DOMException をスローする。

  2. imageorigin-clean でない場合、 SecurityError DOMException をスローする。

  3. frame を新しい VideoFrame とする。

  4. image の型によって分岐:

    注意: 著者は、CanvasImageSource から暗黙的に提供されない限り、意味のある timestamp を指定することが推奨されます。 VideoFrame を利用するインターフェイスはこの値でタイミングの判断ができます。例えば VideoEncodertimestamp をレート制御の指標にできます(framerate 参照)。

  5. frame を返す。

VideoFrame(data, init)

  1. initvalid VideoFrameBufferInit でない場合、TypeError をスローする。

  2. defaultRect を «[ "x:" → 0, "y" → 0, "width" → init.codedWidth, "height" → init.codedWidth ]» とする。

  3. overrideRectundefined とする。

  4. init.visibleRect存在する場合は、その値を overrideRect に代入する。

  5. parsedRectParse Visible Rect アルゴリズムを defaultRect, overrideRect, init.codedWidth, init.codedHeight, init.format で実行した結果とする。

  6. parsedRect が例外の場合は parsedRect を返す。

  7. optLayoutundefined とする。

  8. init.layout存在する場合は、その値を optLayout に代入する。

  9. combinedLayoutCompute Layout and Allocation Size アルゴリズムを parsedRect, init.format, optLayout で実行した結果とする。

  10. combinedLayout が例外の場合はそれをスローする。

  11. data.byteLengthcombinedLayoutallocationSize より小さい場合、TypeError をスローする。

  12. init.transfer が同じ ArrayBuffer を複数参照している場合は、 DataCloneError DOMException をスローする。

  13. init.transfer の各 transferable について:

    1. [[Detached]] 内部スロットが true なら、 DataCloneError DOMException をスローする。

  14. init.transferdata を参照する ArrayBuffer を含む場合、ユーザーエージェントは以下のいずれかを選択できる:

    1. resourcedata のピクセルデータを参照する新しい media resource とする。

  15. それ以外の場合:

    1. resourcedata のコピーを含む新しい media resource とする。 visibleRectlayout で各プレーンのピクセル位置を特定する。

      ユーザーエージェントはメモリアラインメント向上のため、より大きな coded size や plane stride で resource を確保する MAY がある。増加分は codedWidthcodedHeight に反映される。 また visibleRect で可視矩形のみコピーしたり、 resource 内で可視矩形を再配置することもできる。その最終位置は visibleRect に反映される。

  16. init.transfer の各 transferable について:

    1. DetachArrayBuffertransferable に対して行う。

  17. resourceCodedWidthresource の coded width とする。

  18. resourceCodedHeightresource の coded height とする。

  19. resourceVisibleLeftresource の可視矩形の左オフセットとする。

  20. resourceVisibleTopresource の可視矩形の上オフセットとする。

    この仕様は coded size、visible rectangle、display size の定義(および図示)を追加する SHOULD がある。#166 参照。

  21. frame を以下のように初期化した新しい VideoFrame オブジェクトとする:

    1. resourceCodedWidth, resourceCodedHeight, resourceVisibleLeft, resourceVisibleTop[[coded width]][[coded height]][[visible left]][[visible top]] にそれぞれ代入する。

    2. init.visibleRect存在する場合:

      1. truncatedVisibleWidthvisibleRect.width の切り捨て値とする。

      2. truncatedVisibleWidth[[visible width]] に代入。

      3. truncatedVisibleHeightvisibleRect.height の切り捨て値とする。

      4. truncatedVisibleHeight[[visible height]] に代入。

    3. それ以外の場合:

      1. [[coded width]][[visible width]] に代入。

      2. [[coded height]][[visible height]] に代入。

    4. Parse Rotation アルゴリズムを init.rotation で実行し、 結果を [[rotation]] に代入。

    5. init.flip[[flip]] に代入。

    6. displayWidthdisplayHeightinit存在する場合は、 それぞれを [[display width]][[display height]] に代入する。

    7. それ以外の場合:

      1. [[rotation]]0 または 180 の場合:

        1. [[visible width]][[display width]] に代入。

        2. [[visible height]][[display height]] に代入。

      2. それ以外の場合:

        1. [[visible height]][[display width]] に代入。

        2. [[visible width]][[display height]] に代入。

    8. inittimestampduration[[timestamp]][[duration]] に代入。

    9. colorSpaceundefined とする。

    10. init.colorSpace存在する場合は、その値を colorSpace に代入。

    11. initformat[[format]] に代入する。

    12. Pick Color Space アルゴリズムを colorSpace[[format]] で実行した結果を [[color space]] に代入する。

    13. Copy VideoFrame metadatainitmetadata で呼び出した結果を frame[[metadata]] に代入する。

  22. 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 で、 widthheightcodedWidthcodedHeight に一致し、 x / y(0,0) になります。 allocationSize()copyTo() で便利に使えます。

codedRect の getter 手順:

  1. [[Detached]]true なら null を返す。

  2. rect を新しい DOMRectReadOnly とし、次のように初期化:

    1. 0xy に代入。

    2. [[coded width]][[coded height]]widthheight にそれぞれ代入。

  3. rect を返す。

visibleRect, 型は DOMRectReadOnly、読み取り専用、nullable

この VideoFrame のピクセルの可視矩形を記述する DOMRectReadOnly

visibleRect の getter 手順:

  1. [[Detached]]true なら null を返す。

  2. rect を新しい DOMRectReadOnly とし、次のように初期化:

    1. [[visible left]][[visible top]][[visible width]][[visible height]]xywidthheight にそれぞれ代入。

  3. rect を返す。

rotation, 型は double、読み取り専用

描画時に VideoFrame に適用される回転(時計回り度数)。回転は flip より先に適用。

rotation の getter 手順は [[rotation]] を返します。

flip, 型は boolean、読み取り専用

描画時に VideoFrame に水平反転が適用されるかどうか。 flip は回転の後に適用。

flip の getter 手順は [[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(複合バッファレイアウト)は、構造体であり、次で構成されます:

computed plane layout(計算済みプレーンレイアウト)は、構造体であり、次で構成されます:

9.4.5. メソッド

allocationSize(options)

指定した BufferSourcecopyTo() で利用する場合の最小バイト長を返します。

呼び出し時の手順:

  1. [[Detached]]true の場合、InvalidStateError DOMException をスローします。

  2. [[format]]null の場合、NotSupportedError DOMException をスローします。

  3. Parse VideoFrameCopyToOptions アルゴリズムを options で実行し、結果を combinedLayout とする。

  4. combinedLayout が例外なら、それをスローする。

  5. combinedLayoutallocationSize を返す。

copyTo(destination, options)

このフレームのプレーンを destinationoptions に従って非同期でコピーします。データのフォーマットは options.format存在する場合はそれ、なければ this VideoFrameformat です。

注意: copyTo() を複数回呼び出した際、返却される Promise の解決順序は保証されません。

呼び出し時の手順:

  1. [[Detached]]true の場合、Promise を InvalidStateError DOMException でリジェクトして返す。

  2. [[format]]null の場合、Promise を NotSupportedError DOMException でリジェクトして返す。

  3. Parse VideoFrameCopyToOptions アルゴリズムを options で実行し、結果を combinedLayout とする。

  4. combinedLayout が例外なら、Promise を combinedLayout でリジェクトして返す。

  5. destination.byteLengthcombinedLayoutallocationSize より小さい場合、Promise を TypeError でリジェクトして返す。

  6. options.formatRGBA, RGBX, BGRA, BGRX のいずれかである場合:

    1. Clone Configuration アルゴリズムを options で実行し、結果を newOptions とする。

    2. newOptions.formatundefined を代入。

    3. Convert to RGB frame アルゴリズムを thisoptions.formatoptions.colorSpace で実行し、結果を rgbFrame とする。

    4. rgbFramedestinationnewOptionscopyTo() を呼び出した結果を返す。

  7. p を新しい Promise とする。

  8. parallel queue を開始し、結果を copyStepsQueue とする。

  9. planeLayouts を新しい リストとする。

  10. copyStepsQueue に以下の手順をエンキュー:

    1. [[resource reference]] が参照する media resource を resource とする。

    2. [[format]] で定義されたプレーン数を numPlanes とする。

    3. planeIndex0 とする。

    4. planeIndexcombinedLayoutnumPlanes より小さい間:

      1. resource 内の planeIndex で識別されるプレーンのストライドを sourceStride とする。

      2. combinedLayoutcomputedLayoutsplaneIndex 位置の computed plane layoutcomputedLayout とする。

      3. computedLayoutsourceTop × sourceStridesourceOffset とする。

      4. computedLayoutsourceLeftBytessourceOffset に加算。

      5. computedLayoutdestinationOffsetdestinationOffset とする。

      6. computedLayoutsourceWidthBytesrowBytes とする。

      7. 新しい PlaneLayoutlayout とし、 offsetdestinationOffsetstriderowBytes を代入。

      8. row0 とする。

      9. rowcomputedLayoutsourceHeight より小さい間:

        1. resourcesourceOffset から destinationdestinationOffsetrowBytes バイトコピー。

        2. sourceOffsetsourceStride を加算。

        3. destinationOffsetcomputedLayoutdestinationStride を加算。

        4. row1 加算。

      10. planeIndex1 加算。

      11. layoutplaneLayouts に追加。

    5. Queue a taskpplaneLayouts で解決。

  11. p を返す。

clone()

同じ media resource を参照する新しい VideoFrame を生成します。

呼び出し時の手順:

  1. frame[[Detached]]true の場合、 InvalidStateError DOMException をスローする。

  2. Clone VideoFrame アルゴリズムを this で実行した結果を返す。

close()

すべての状態をクリアし、media resource への参照を解放します。 close は最終操作です。

呼び出し時、Close VideoFrame アルゴリズムを this で実行します。

metadata()

このフレームに関連付けられている VideoFrameMetadata を取得します。

呼び出し時の手順:

  1. [[Detached]]true の場合、 InvalidStateError DOMException をスローする。

  2. Copy VideoFrame metadata[[metadata]] で呼び出した結果を返す。

9.4.6. アルゴリズム

VideoFrameを作成するoutput, timestamp, duration, displayAspectWidth, displayAspectHeight, colorSpace, rotation, flip を受け取る)
  1. frame を新しい VideoFrame として、以下のように構築する:

    1. [[Detached]]false を代入する。

    2. resourceoutput で記述される media resource とする。

    3. resourceReferenceresource への参照とする。

    4. resourceReference[[resource reference]] に代入する。

    5. output が認識可能な VideoPixelFormat を使っている場合はそのフォーマットを [[format]] に代入し、 そうでなければ [[format]]null を代入する。

    6. codedWidthcodedHeightoutput のピクセル単位のcoded幅・高さとする。

    7. visibleLeft, visibleTop, visibleWidth, visibleHeightoutput の可視矩形の左端・上端・幅・高さとする。

    8. displayWidthdisplayHeightoutput の表示サイズ(ピクセル単位)とする。

    9. displayAspectWidthdisplayAspectHeight が指定されている場合は、 displayWidth または displayHeight を増やして displayWidth / displayHeight の比率が displayAspectWidth / displayAspectHeight と一致するまで調整する。

    10. codedWidthcodedHeightvisibleLeftvisibleTopvisibleWidthvisibleHeightdisplayWidthdisplayHeight を、 [[coded width]][[coded height]][[visible left]][[visible top]][[visible width]][[visible height]] にそれぞれ代入する。

    11. durationtimestamp[[duration]][[timestamp]] にそれぞれ代入する。

    12. [[color space]]Pick Color Space アルゴリズムを colorSpace[[format]] で実行した結果を代入する。

    13. rotationfliprotationflip をそれぞれ代入する。

  2. frame を返す。

Color Space を選択するoverrideColorSpace, format を受け取る)
  1. overrideColorSpace が指定されていれば、それを使って新しい VideoColorSpace を構築して返す。

    ユーザーエージェントは、overrideColorSpacenull メンバーを実装依存の推論値で置換してもよい MAY

  2. それ以外で [[format]]RGB format の場合は、新しい sRGB Color Space インスタンスを返す。

  3. それ以外の場合は、新しい REC709 Color Space インスタンスを返す。

VideoFrameInitを検証するformat, codedWidth, codedHeight を受け取る)
  1. visibleRect存在する場合:

    1. Verify Rect Offset AlignmentformatvisibleRect で実行し、結果を validAlignment とする。

    2. validAlignmentfalse なら false を返す。

    3. visibleRect のどの属性も負または有限値でない場合は false を返す。

    4. visibleRect.width == 0 または visibleRect.height == 0 の場合は false を返す。

    5. visibleRect.y + visibleRect.height > codedHeight の場合は false を返す。

    6. visibleRect.x + visibleRect.width > codedWidth の場合は false を返す。

  2. codedWidth = 0 または codedHeight = 0 の場合は false を返す。

  3. displayWidthdisplayHeight のいずれか一方のみが 存在する場合は false を返す。

  4. displayWidth == 0 または displayHeight == 0 の場合は false を返す。

  5. true を返す。

VideoFrameBufferInitvalid VideoFrameBufferInit か判定するには、以下の手順を実行する:
  1. codedWidth = 0 または codedHeight = 0 の場合は false を返す。

  2. visibleRect のどの属性も負または有限値でない場合は false を返す。

  3. visibleRect.y + visibleRect.height > codedHeight の場合は false を返す。

  4. visibleRect.x + visibleRect.width > codedWidth の場合は false を返す。

  5. displayWidthdisplayHeight のいずれか一方のみが 存在する場合は false を返す。

  6. displayWidth = 0 または displayHeight = 0 の場合は false を返す。

  7. true を返す。

他のフレームからフレームを初期化するinit, frame, otherFrame を受け取る)
  1. formatotherFrame.format とする。

  2. init.alphadiscard の場合、 otherFrame.formatequivalent opaque formatformat に代入する。

  3. Validate VideoFrameInit アルゴリズムを formatotherFrame[[coded width]][[coded height]] で実行し、結果を validInit とする。

  4. validInitfalse の場合は TypeError をスローする。

  5. resourceotherFrame[[resource reference]] が参照する media resource とする。

  6. resource への新しい参照を frame[[resource reference]] に代入する。

  7. otherFrame から frame へ以下の属性を代入する: codedWidthcodedHeightcolorSpace

  8. defaultVisibleRectotherFramevisibleRect のgetter手順を実行した結果とする。

  9. baseRotationbaseFlipotherFrame[[rotation]][[flip]] とする。

  10. defaultDisplayWidthdefaultDisplayHeightotherFrame[[display width]][[display height]] とする。

  11. Initialize Visible Rect, Orientation, and Display Size アルゴリズムを init, frame, defaultVisibleRect, baseRotation, baseFlip, defaultDisplayWidth, defaultDisplayHeight で実行する。

  12. durationinit存在すれば、frame[[duration]] に代入し、なければ otherFrame.durationframe[[duration]] に代入する。

  13. timestampinit存在すれば、frame[[timestamp]] に代入し、なければ otherFrametimestampframe[[timestamp]] に代入する。

  14. formatframe[[format]] に代入する。

  15. Copy VideoFrame metadatainitmetadata で呼び出した結果を frame[[metadata]] に代入する。

リソースでフレームを初期化するinit, frame, resource, codedWidth, codedHeight, baseRotation, baseFlip, defaultDisplayWidth, defaultDisplayHeight を受け取る)
  1. formatnull とする。

  2. resource が認識可能な VideoPixelFormat を使っている場合、 resourceVideoPixelFormatformat に代入する。

  3. Validate VideoFrameInit アルゴリズムを format, width, height で実行し、結果を validInit とする。

  4. validInitfalse の場合、TypeError をスローする。

  5. resource への新しい参照を frame[[resource reference]] に代入する。

  6. init.alphadiscard の場合、 formatequivalent opaque formatformat に代入する。

  7. format[[format]] に代入する。

  8. codedWidthcodedHeightframe[[coded width]][[coded height]] にそれぞれ代入する。

  9. defaultVisibleRectDOMRect の新しいインスタンスとして、 «[ "x:" → 0, "y" → 0, "width" → codedWidth, "height" → codedHeight ]» で構築する。

  10. Initialize Visible Rect, Orientation, and Display Size アルゴリズムを init, frame, defaultVisibleRect, defaultDisplayWidth, defaultDisplayHeight で実行する。

  11. init.durationframe[[duration]] に代入する。

  12. init.timestampframe[[timestamp]] に代入する。

  13. resource が既知の VideoColorSpace を持つ場合は、その値を [[color space]] に代入する。

  14. それ以外の場合は、空の VideoColorSpaceInit で構築した新しい VideoColorSpace[[color space]] に代入する。

可視矩形・向き・表示サイズを初期化するinit, frame, defaultVisibleRect, baseRotation, baseFlip, defaultDisplayWidth, defaultDisplayHeight を受け取る)
  1. visibleRectdefaultVisibleRect とする。

  2. init.visibleRect存在する場合は、それを visibleRect に代入する。

  3. visibleRectxywidthheightframe[[visible left]][[visible top]][[visible width]][[visible height]] にそれぞれ代入する。

  4. Parse Rotation アルゴリズムを init.rotation で実行し、結果を rotation とする。

  5. Add Rotations アルゴリズムを baseRotation, baseFlip, rotation で実行した結果を frame[[rotation]] に代入する。

  6. baseFlipinit.flip と等しい場合、 frame[[flip]]false を、 そうでなければ [[flip]]true を代入する。

  7. displayWidthdisplayHeightinit存在する場合は、それぞれ [[display width]][[display height]] に代入する。

  8. それ以外の場合:

    1. baseRotation0 または 180 の場合:

      1. widthScaledefaultDisplayWidthdefaultVisibleRect.width で割った値とする。

      2. heightScaledefaultDisplayHeightdefaultVisibleRect.height で割った値とする。

    2. それ以外の場合:

      1. widthScaledefaultDisplayHeightdefaultVisibleRect.width で割った値とする。

      2. heightScaledefaultDisplayWidthdefaultVisibleRect.height で割った値とする。

    3. displayWidth|frame|'s {{VideoFrame/[[visible width]]}} * |widthScale|(四捨五入)とする。

    4. displayHeight|frame|'s {{VideoFrame/[[visible height]]}} * |heightScale|(四捨五入)とする。

    5. rotation0 または 180 の場合:

      1. displayWidthframe[[display width]] に代入する。

      2. displayHeightframe[[display height]] に代入する。

    6. それ以外の場合:

      1. displayHeightframe[[display width]] に代入する。

      2. displayWidthframe[[display height]] に代入する。

VideoFrameを複製するframe を受け取る)
  1. clone を新しい VideoFrame として、以下のように初期化する:

    1. resourceframe[[resource reference]] が参照する media resource とする。

    2. newReferenceresource への新しい参照とする。

    3. newReferenceclone[[resource reference]] に代入する。

    4. frame の残りの内部スロット([[resource reference]] を除く)を同名の clone の内部スロットに代入する。

  2. clone を返す。

VideoFrameを閉じるframe を受け取る)
  1. frame[[resource reference]]null を代入する。

  2. frame[[Detached]]true を代入する。

  3. frameformatnull を代入する。

  4. frame[[coded width]][[coded height]][[visible left]][[visible top]][[visible width]][[visible height]][[rotation]][[display width]][[display height]]0 を代入する。

  5. frame[[flip]]false を代入する。

  6. frame[[metadata]] に新しい VideoFrameMetadata を代入する。

回転をパースするrotation を受け取る)
  1. alignedRotationrotation に最も近い 90 の倍数(同値は正の無限大方向に丸める)とする。

  2. fullTurnsalignedRotation 以下で最大の 360 の倍数とする。

  3. |alignedRotation| - |fullTurns| を返す。

回転を加算するbaseRotation, baseFlip, rotation を受け取る)
  1. baseFlipfalse の場合、combinedRotation|baseRotation| + |rotation| とし、そうでなければ |baseRotation| - |rotation| とする。

  2. fullTurnscombinedRotation 以下で最大の 360 の倍数とする。

  3. |combinedRotation| - |fullTurns| を返す。

VideoFrameCopyToOptionsをパースするoptions を受け取る)
  1. defaultRectvisibleRect のgetter手順で得た値とする。

  2. overrideRectundefined とする。

  3. options.rect存在する場合は、その値を overrideRect に代入する。

  4. parsedRectParse Visible Rect アルゴリズムを defaultRect, overrideRect, [[coded width]], [[coded height]], [[format]] で実行した結果とする。

  5. parsedRect が例外ならそれを返す。

  6. optLayoutundefined とする。

  7. options.layout存在する場合は、その値を optLayout に代入する。

  8. formatundefined とする。

  9. options.format存在しない場合、[[format]]format に代入する。

  10. それ以外で options.formatRGBARGBXBGRABGRX のいずれかの場合は、その値を format に代入し、 それ以外の場合は NotSupportedError を返す。

  11. combinedLayoutCompute Layout and Allocation Size アルゴリズムを parsedRect, format, optLayout で実行した結果とする。

  12. combinedLayout を返す。

矩形オフセットのアラインメントを検証するformat, rect を受け取る)
  1. formatnull の場合は true を返す。

  2. planeIndex0 とする。

  3. numPlanesformat で定義されるプレーン数とする。

  4. planeIndexnumPlanes より小さい間:

    1. planeformat で定義される planeIndex のプレーンとする。

    2. sampleWidthplane の各サブサンプルの水平方向サブサンプリング係数とする。

    3. sampleHeightplane の各サブサンプルの垂直方向サブサンプリング係数とする。

    4. rect.xsampleWidth の倍数でなければ false を返す。

    5. rect.ysampleHeight の倍数でなければ false を返す。

    6. planeIndex1 加算する。

  5. true を返す。

可視矩形をパースするdefaultRect, overrideRect, codedWidth, codedHeight, format を受け取る)
  1. sourceRectdefaultRect とする。

  2. overrideRectundefined でない場合:

    1. overrideRect.width または height のいずれかが 0 なら、TypeError を返す。

    2. overrideRect.x + overrideRect.widthcodedWidth より大きい場合、TypeError を返す。

    3. overrideRect.y + overrideRect.heightcodedHeight より大きい場合、TypeError を返す。

    4. sourceRectoverrideRect を代入する。

  3. 矩形オフセットのアラインメントを検証する アルゴリズムを format, sourceRect で実行した結果を validAlignment とする。

  4. validAlignmentfalse の場合は TypeError をスローする。

  5. sourceRect を返す。

レイアウトと割り当てサイズを計算するparsedRect, format, layout を受け取る)
  1. numPlanesformat で定義されるプレーン数とする。

  2. layoutundefined でなく、かつその長さが numPlanes と異なる場合は、TypeError をスローする。

  3. minAllocationSize0 とする。

  4. computedLayouts を新しい リストとする。

  5. endOffsets を新しい リストとする。

  6. planeIndex0 とする。

  7. planeIndex < numPlanes の間:

    1. planeformat で定義される planeIndex のプレーンとする。

    2. sampleBytesplane のサンプルあたりのバイト数とする。

    3. sampleWidthplane の各サブサンプルの水平方向サブサンプリング係数とする。

    4. sampleHeightplane の各サブサンプルの垂直方向サブサンプリング係数とする。

    5. computedLayout を新しい 計算済みプレーンレイアウトとする。

    6. computedLayoutsourceTop に、切り捨てた parsedRect.ysampleHeight で割り、切り上げした値を代入する。

    7. computedLayoutsourceHeight に、切り捨てた parsedRect.heightsampleHeight で割り、切り上げした値を代入する。

    8. computedLayoutsourceLeftBytes に、切り捨てた parsedRect.xsampleWidth で割った整数値に sampleBytes を掛けた値を代入する。

    9. computedLayoutsourceWidthBytes に、切り捨てた parsedRect.widthsampleWidth で割った整数値に sampleBytes を掛けた値を代入する。

    10. layoutundefined でない場合:

      1. planeLayoutlayoutplaneIndex 位置の PlaneLayout とする。

      2. planeLayout.stridecomputedLayoutsourceWidthBytes より小さい場合、TypeError を返す。

      3. planeLayout.offsetcomputedLayoutdestinationOffset に代入する。

      4. planeLayout.stridecomputedLayoutdestinationStride に代入する。

    11. それ以外の場合:

      注意: 明示的なレイアウトが指定されていない場合、以下の手順はタイトパック(隙間なく配置)のデフォルト動作です。

      1. computedLayoutdestinationOffsetminAllocationSize を代入する。

      2. computedLayoutdestinationStridecomputedLayoutsourceWidthBytes を代入する。

    12. planeSizecomputedLayoutdestinationStride × sourceHeight の積とする。

    13. planeEndplaneSize + computedLayoutdestinationOffset の合計とする。

    14. planeSize または planeEndunsigned long の最大値を超える場合、TypeError を返す。

    15. endOffsetsplaneEnd を追加する。

    16. minAllocationSizeminAllocationSizeplaneEnd の最大値で更新する。

      注意: 上記のステップは、ユーザー指定のプレーンオフセットによるプレーン順序変更の可能性を考慮しています。

    17. earlierPlaneIndex0 とする。

    18. earlierPlaneIndexplaneIndex より小さい間:

      1. earlierLayoutcomputedLayouts[earlierPlaneIndex] とする。

      2. endOffsets[planeIndex]earlierLayoutdestinationOffset 以下、または endOffsets[earlierPlaneIndex]computedLayoutdestinationOffset 以下なら、処理を続行。

        注意: プレーンAがプレーンBの開始前で終わる場合、両者は重なりません。

      3. それ以外の場合、TypeError を返す。

      4. earlierPlaneIndex1 加算する。

    19. computedLayoutscomputedLayout を追加する。

    20. planeIndex1 加算する。

  8. combinedLayout を新しい 複合バッファレイアウトとして以下のように初期化する:

    1. computedLayoutscomputedLayouts に代入する。

    2. minAllocationSizeallocationSize に代入する。

  9. combinedLayout を返す。

PredefinedColorSpace を VideoColorSpace に変換するcolorSpace を受け取る)
  1. アサート: colorSpacesrgb または display-p3 のいずれかと等しいこと。

  2. colorSpacesrgb と等しい場合、新しい sRGB カラースペース インスタンスを返す。

  3. colorSpacedisplay-p3 と等しい場合、新しい Display P3 カラースペース インスタンスを返す。

RGBフレームへ変換するframe, format, colorSpace を受け取る)
  1. このアルゴリズムは formatRGBA, RGBX, BGRA, BGRX のいずれかと等しい場合のみ MUST 呼び出されなければならない。

  2. convertedFrame を新しい VideoFrame として、以下のように構築する:

    1. [[Detached]]false を代入する。

    2. [[format]]format を代入する。

    3. widthframe[[visible width]] とする。

    4. heightframe[[visible height]] とする。

    5. width, height, 0, 0, width, height, width, height をそれぞれ [[coded width]][[coded height]][[visible left]][[visible top]][[visible width]][[visible height]] にそれぞれ代入する。

    6. frame[[duration]][[timestamp]][[duration]][[timestamp]] にそれぞれ代入する。

    7. PredefinedColorSpace を VideoColorSpace に変換する アルゴリズムを colorSpace で実行し、その結果を [[color space]] に代入する。

    8. resource を、frame[[resource reference]] が参照する media resource[[color space]][[format]] で指定されたカラースペース・ピクセルフォーマットに変換した結果を格納する新しい media resource とする。

    9. resource の参照を [[resource reference]] に代入する。

  3. convertedFrame を返す。

VideoFrame メタデータを複製するmetadata を受け取る)
  1. metadataCopySerializedStructuredSerialize(metadata) の結果とする。

  2. metadataCopyStructuredDeserialize(metadataCopySerialized, 現在の Realm) の結果とする。

  3. metadataCopy を返す。

このアルゴリズムの目的は、VideoFrame が所有するメタデータが不変であることを保証することです。

9.4.7. 転送とシリアライズ

VideoFrame転送手順valuedataHolder を受け取る)は以下:
  1. value[[Detached]]true の場合、DataCloneError DOMException をスローする。

  2. value のすべての VideoFrame 内部スロットについて、その値を同名のフィールドとして dataHolder に代入する。

  3. Close VideoFrame アルゴリズムを value で実行する。

VideoFrame転送受信手順dataHoldervalue を受け取る)は以下:
  1. dataHolder のすべてのフィールドについて、その値を同名の valueVideoFrame 内部スロットに代入する。

VideoFrameシリアライズ手順value, serialized, forStorage を受け取る)は以下:
  1. value[[Detached]]true の場合、DataCloneError DOMException をスローする。

  2. forStoragetrue の場合、DataCloneError をスローする。

  3. resourcevalue[[resource reference]] が参照する media resource とする。

  4. newReferenceresource への新しい参照とする。

  5. newReference を |serialized.resource reference| に代入する。

  6. value の残りの VideoFrame 内部スロット([[resource reference]] を除く)について、その値を同名のフィールドとして serialized に代入する。

VideoFrameデシリアライズ手順serializedvalue を受け取る)は以下:
  1. serialized のすべてのフィールドについて、その値を同名の valueVideoFrame 内部スロットに代入する。

9.4.8. 描画

描画時(例:CanvasDrawImage drawImage() など)、VideoFrame は レンダリングターゲットに互換性のあるカラースペースに変換されなければならない MUST。 (カラースペース変換が明示的に無効化されていない限り)

ImageBitmap 構築時のカラースペース変換は ImageBitmapOptionscolorSpaceConversion で制御される。 この値を "none" に設定すると カラースペース変換は無効化される。

VideoFrame の描画は、media resource から生成され、 必要なカラースペース変換・visibleRect への切り抜き、 rotation 度の時計回り回転、 fliptrue の場合は水平反転を適用して生成される。

9.5. VideoFrame CopyTo() オプション

ピクセルの矩形領域、フォーマット、宛先バッファのプレーンごとのオフセットとストライドを指定するオプション。
dictionary VideoFrameCopyToOptions {
  DOMRectInit rect;
  sequence<PlaneLayout> layout;
  VideoPixelFormat format;
  PredefinedColorSpace colorSpace;
};
注意: copyTo()allocationSize() の手順で以下の要件が強制される:
rect, 型は DOMRectInit

DOMRectInitVideoFrame からコピーするピクセル矩形領域を記述。 指定がない場合、visibleRect が使用される。

注意: コーデッド矩形領域は VideoFramecodedRect を渡すことで指定可能。

注意: デフォルトの rect は必ずしもサンプルアラインメント条件を満たさず、copyTo()allocationSize() でリジェクトされる場合あり。

layout, 型は sequence<PlaneLayout>

PlaneLayoutVideoFrame の各プレーンに指定し、 宛先 BufferSource での各プレーンのオフセット・ストライドを指定できる。 指定がない場合はタイトパック(隙間なく配置)。プレーンが重複する指定は無効。

format, 型は VideoPixelFormat

宛先 BufferSource のピクセルデータの VideoPixelFormat。 指定可能値は RGBARGBXBGRABGRX存在しない場合は、宛先 BufferSourceformat と同じフォーマットになる。

colorSpace, 型は PredefinedColorSpace

宛先 BufferSource のピクセルデータのターゲットカラースペースとして MUST 使用される PredefinedColorSpace。 ただし formatRGBARGBXBGRABGRX の場合のみ有効。 それ以外の場合は無視される。 存在しない場合は srgb が利用される。

9.6. VideoFrameにおけるDOMRect

VideoFrame インターフェイスは、DOMRect を使ってピクセルの矩形領域の位置とサイズを指定します。DOMRectInitcopyTo()allocationSize() で ソース矩形の寸法を指定するために利用されます。VideoFrame には codedRect および visibleRect が定義されており、 それぞれコーデッドサイズや可視領域のコピーに便利に使えます。

注意: VideoFrameのピクセルは整数値のみでアドレス指定できます。DOMRectInit に渡された浮動小数点値はすべて切り捨てられます。

9.7. プレーンレイアウト

PlaneLayout は、VideoFrameのプレーンを BufferSource にコピーした際のオフセットとストライドを指定する辞書です。 PlaneLayout のシーケンスは MAY VideoFramecopyTo() に渡すことで、宛先 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 VideoPixelFormat {
  // 4:2:0 Y, U, V
  "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)
  1. c を新しい VideoColorSpace オブジェクトとして、以下のように初期化する:

    1. init.primaries[[primaries]] に代入する。

    2. init.transfer[[transfer]] に代入する。

    3. init.matrix[[matrix]] に代入する。

    4. init.fullRange[[full range]] に代入する。

  2. 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 もこのパターンに従っており、VideoDecoderAudioDecoder とは大きく異なるインターフェイス設計となっています。

これらの違いがあるにもかかわらず、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)

注意: 構築されたImageDecoderdecode()を呼び出すと、ユーザーエージェントがtypeをサポートしない場合はNotSupportedErrorが発生します。実装側はまずisTypeSupported()typeのサポートを確認することが推奨されます。User Agentはどのtypeも必ずしもサポートする必要はありません。

呼び出されたとき、以下の手順を実行します:

  1. init有効なImageDecoderInitでなければ、TypeErrorをスローする。

  2. init.transfer に同じArrayBufferへの参照が複数ある場合、DataCloneError DOMExceptionをスローする。

  3. init.transferの各transferableについて:

    1. [[Detached]] 内部スロットがtrueなら、DataCloneError DOMExceptionをスローする。

  4. dを新しいImageDecoderオブジェクトとする。以下の手順で、ImageDecoderのメンバーは特記なき限りdに適用される。

  5. [[control message queue]]に新しいキューを代入する。

  6. [[message queue blocked]]falseを代入する。

  7. [[codec work queue]]に新しい並列キューを開始して代入する。

  8. [[ImageTrackList]]に新しいImageTrackListを以下のように初期化して代入する:

    1. [[track list]]に新しいリストを代入する。

    2. [[selected index]]-1を代入する。

  9. [[type]]typeを代入する。

  10. [[codec implementation]]nullを代入する。

  11. init.preferAnimationが存在する場合は、init.preferAnimation[[prefer animation]]内部スロットに代入し、そうでなければ'null'を代入する。

  12. [[pending decode promises]]に新しいリストを代入する。

  13. [[internal selected track index]]-1を代入する。

  14. [[tracks established]]falseを代入する。

  15. [[closed]]falseを代入する。

  16. [[progressive frame generations]]に新しいマップを代入する。

  17. initdataメンバーがReadableStream型の場合:

    1. [[encoded data]]に新しいリストを代入する。

    2. [[complete]]falseを代入する。

    3. 制御メッセージをキューに追加し、画像デコーダを構成する。

    4. 制御メッセージキューを処理する。

    5. readerを、リーダー取得を使ってdataに対して取得する。

    6. 並列で、Fetch Stream Data Loopdreaderで実行する。

  18. それ以外の場合:

    1. assert: init.dataの型はBufferSourceである。

    2. init.transferArrayBufferinit.dataで参照されている場合、User Agentは以下のいずれかをMAY選択する:

      1. [[encoded data]]を、data内のエンコード済み画像データを参照するバイト列にする。

    3. それ以外の場合:

      1. init.dataのコピーを[[encoded data]]に代入する。

    4. [[complete]]trueを代入する。

    5. [[completed promise]]を解決する。

    6. 画像デコーダを構成する制御メッセージをキューに追加する。

    7. トラックメタデータをデコードする制御メッセージをキューに追加する。

    8. 制御メッセージキューを処理する。

  19. init.transferの各transferableについて:

    1. transferableに対してDetachArrayBufferを実行する。

  20. dを返す。

制御メッセージの実行画像デコーダを構成するとは、以下の手順を実行することを意味します:

  1. supported型サポートの確認アルゴリズムをinit.typeで実行した結果とする。

  2. supportedfalseなら、ImageDecoderを閉じる アルゴリズムをNotSupportedError DOMException で実行し、"processed"を返す。

  3. それ以外の場合、[[codec implementation]]内部スロットにinit.typeをサポートする実装を代入する。

  4. [[message queue blocked]]trueを代入する。

  5. [[codec work queue]]に以下の手順をエンキューする:

    1. [[codec implementation]]を、colorSpaceConversiondesiredWidthdesiredHeightの値に従って構成する。

    2. [[message queue blocked]]falseを代入する。

    3. タスクをキューに追加し、制御メッセージキューを処理する。

  6. "processed"を返す。

制御メッセージの実行トラックメタデータのデコードとは、以下の手順を実行することを意味します:

  1. [[codec work queue]]に以下の手順をエンキューする:

    1. トラック確立アルゴリズムを実行する。

10.2.3. 属性

type, DOMString, 読み取り専用

構築時に与えられた MIME type の値を反映する文字列です。

type の getter 手順は [[type]] の値を返します。

complete, boolean, 読み取り専用

[[encoded data]] が完全にバッファリングされているかどうかを示します。

complete の getter 手順は [[complete]] の値を返します。

completed, 型 Promise<undefined>, 読み取り専用

completetrue になったとき通知するための Promise です。

completed の getter 手順は [[completed promise]] の値を返します。

tracks, ImageTrackList, 読み取り専用

利用可能なトラックのメタデータを提供し、デコードするトラックを選択する機構を持つ ライブImageTrackList を返します。

tracks の getter 手順は [[ImageTrackList]] の値を返します。

10.2.4. メソッド

decode(options)

optionsに従ってフレームをデコードする制御メッセージをキューに追加します。

呼び出されたとき、以下の手順を実行します:

  1. [[closed]]true の場合、PromiseInvalidStateError DOMException で reject して返す。

  2. [[ImageTrackList]][[selected index]] が '-1' の場合、PromiseInvalidStateError DOMException で reject して返す。

  3. optionsundefined の場合、新しい ImageDecodeOptionsoptions に代入する。

  4. promise を新しい Promise とする。

  5. promise[[pending decode promises]] に追加する。

  6. 制御メッセージをキューに追加し、 optionspromiseで画像をデコードする。

  7. 制御メッセージキューを処理する。

  8. promise を返す。

制御メッセージの実行で画像をデコードするとは、以下の手順を実行することを意味します:

  1. [[codec work queue]]に以下の手順をエンキューする:

    1. [[tracks established]]true になるまで待つ。

    2. options.completeFramesOnlyfalse かつ画像が プログレッシブ画像であり、ユーザーエージェントがプログレッシブデコードをサポートしている場合、プログレッシブフレームのデコードアルゴリズムを options.frameIndexpromise で実行する。

    3. それ以外の場合、完全フレームのデコード アルゴリズムを options.frameIndexpromise で実行する。

reset()

保留中のすべての処理を即座に中断します。

呼び出されたとき、ImageDecoderリセットアルゴリズムを AbortError DOMException で実行する。

close()

保留中のすべての処理を即座に中断し、システムリソースを解放します。closeは最終的です。

呼び出されたとき、ImageDecoderを閉じるアルゴリズムを AbortError DOMException で実行する。

isTypeSupported(type)

指定された設定がユーザーエージェントでサポートされているかを示すPromiseを返します。

呼び出されたとき、以下の手順を実行します:

  1. type有効な画像 MIME タイプでなければ、PromiseTypeErrorでrejectして返す。

  2. pを新しいPromiseとする。

  3. 並列で、p型サポートの確認アルゴリズムをtypeで実行した結果でresolveする。

  4. pを返す。

10.2.5. アルゴリズム

Fetch Stream Data Loopreader を受け取る)

次の手順を実行する:

  1. readRequest を次の read request とする。

    chunk stepschunk を受け取る)
    1. [[closed]]true であれば、これらの手順を中止する。

    2. chunk が Uint8Array オブジェクトでない場合、タスクをキューに追加して ImageDecoderを閉じる アルゴリズムを DataError DOMException で実行し、これらの手順を中止する。

    3. Uint8Array オブジェクトが表すバイト列を bytes とする。

    4. bytes[[encoded data]] 内部スロットに追加する。

    5. [[tracks established]]false であれば、 トラック確立アルゴリズムを実行する。

    6. そうでなければ トラック更新アルゴリズムを実行する。

    7. Fetch Stream Data Loopアルゴリズムを reader で再度実行する。

    close steps
    1. true[[complete]] に代入する。

    2. [[completed promise]] を解決する。

    error steps
    1. タスクをキューに追加して ImageDecoderを閉じる アルゴリズムを NotReadableError DOMException で実行する。

  2. reader から readRequest を使って chunk を読む。

Establish Tracks

次の手順を実行する:

  1. [[tracks established]]false であることを確認する。

  2. [[encoded data]] にトラック数を判定できるデータが十分にない場合:

    1. completetrue なら、タスクをキューに追加して ImageDecoderを閉じるアルゴリズムを InvalidStateError DOMException で実行する。

    2. これらの手順を中止する。

  3. トラック数が 0 である場合、タスクをキューに追加して ImageDecoderを閉じるアルゴリズムを実行し、これらの手順を中止する。

  4. newTrackList を新しい リストとして作成する。

  5. [[encoded data]] で見つかった各 image track について:

    1. newTrack を新しい ImageTrack として、以下のように初期化する:

      1. this[[ImageDecoder]] に代入する。

      2. tracks[[ImageTrackList]] に代入する。

      3. image track がアニメーションであれば、newTrack[[animated]]true を代入し、そうでなければ false を代入する。

      4. image track がフレーム数を示す場合、その数値を newTrack[[frame count]] に代入し、そうでなければ 0 を代入する。

        注意: thisdataReadableStream)で構築された場合、 frameCount[[encoded data]] に追加バイトが追加されるごとに変化する可能性がある。 詳細は トラック更新アルゴリズムを参照。

      5. image track が繰り返し回数を示す場合、その数値を [[repetition count]] に代入し、そうでなければ 0 を代入する。

        注意: Infinity は無限繰り返しを示す。

      6. falsenewTrack[[selected]] に代入する。

    2. newTracknewTrackList に追加する。

  6. selectedTrackIndexデフォルト選択トラックインデックス取得アルゴリズムを newTrackList で実行した結果とする。

  7. selectedTracknewTrackListselectedTrackIndex 番目のトラックとする。

  8. trueselectedTrack[[selected]] に代入する。

  9. selectedTrackIndex[[internal selected track index]] に代入する。

  10. true[[tracks established]] に代入する。

  11. タスクをキューに追加して以下の手順を実行する:

    1. newTrackListtracks[[track list]] 内部スロットに代入する。

    2. selectedTrackIndextracks[[selected index]] に代入する。

    3. [[ready promise]] を解決する。

デフォルト選択トラックインデックス取得 (trackListを受け取る)

次の手順を実行する:

  1. [[encoded data]]主画像トラックを識別できる場合:

    1. primaryTracktrackListから主画像トラックを記述するImageTrackとする。

    2. primaryTrackIndextrackList内でのprimaryTrackの位置とする。

    3. [[prefer animation]]nullなら、primaryTrackIndexを返す。

    4. primaryTrack.animated[[prefer animation]]と等しい場合、primaryTrackIndexを返す。

  2. trackList内のいずれかのImageTrackanimated[[prefer animation]]が等しい場合、trackList内で最も早く現れるそのトラックの位置を返す。

  3. 0を返す。

トラック更新

トラック更新構造体は、構造体であり、 トラックインデックスunsigned long)と フレーム数unsigned long)からなる。

以下の手順を実行する:

  1. [[tracks established]]true であることを確認する。

  2. trackChanges を新しい リストとする。

  3. trackListtracks[[track list]] のコピーとする。

  4. trackList の各 track について:

    1. trackIndextracktrackList 内での位置とする。

    2. latestFrameCount[[encoded data]] から track に対応するトラックのフレーム数とする。

    3. latestFrameCounttrack.frameCount 以上であることを確認する。

    4. もし latestFrameCounttrack.frameCount より大きい場合:

      1. changeトラック更新構造体とし、 トラックインデックスtrackIndexフレーム数latestFrameCount とする。

      2. changetracksChanges に追加する。

  5. もし tracksChangesなら、これらの手順を中止する。

  6. タスクをキューに追加して、以下の手順を実行する:

    1. trackChanges の各 update について:

      1. updateTrackImageTrackupdate.trackIndex 番目の要素とする(tracks[[track list]] 内)。

      2. update.frameCountupdateTrack[[frame count]] に代入する。

完全フレームのデコード (frameIndexpromise を受け取る)
  1. [[tracks established]]true であることを確認する。

  2. [[internal selected track index]]-1 でないことを確認する。

  3. encodedFrameframeIndex[[internal selected track index]] で識別されるエンコード済みフレームとする。

  4. 以下のいずれかの条件が成立するまで待つ(最初に成立したもの):

    1. [[encoded data]]encodedFrame を完全にデコードするのに十分なバイトが含まれている。

    2. [[encoded data]] が不正であることが判明した。

    3. completetrue である。

    4. [[closed]]true である。

  5. もし [[encoded data]] が不正であることが判明した場合、 致命的なデータ拒否アルゴリズムを実行し、これらの手順を中止する。

  6. もし [[encoded data]]encodedFrame を完全にデコードするのに十分なバイトが含まれていない場合、 実行不可能なデコード拒否アルゴリズムを promise で実行し、これらの手順を中止する。

  7. [[codec implementation]] を使って encodedFrame のデコードを試みる。

  8. もしデコードでエラーが発生した場合、 致命的なデータ拒否アルゴリズムを実行し、これらの手順を中止する。

  9. もし [[progressive frame generations]]frameIndex をキーとするエントリがあれば、そのエントリをマップから削除する。

  10. output[[codec implementation]] から encodedFrame に対応するデコード済み画像データとする。

  11. decodeResult を新しい ImageDecodeResult とし、 以下のように初期化する:

    1. complete に 'true' を代入する。

    2. durationoutput の表示時間(encodedFrame で記述される)とし、encodedFrame に duration がなければ null を代入する。

    3. timestampoutput の表示タイムスタンプ(encodedFrame で記述される)とし、encodedFrame に timestamp がなければ:

      1. もし encodedFrame が静止画像なら 0timestamp に代入する。

      2. もし encodedFrame が定常レートのアニメーション画像で durationnull でなければ、|frameIndex| * |duration|timestamp に代入する。

      3. もしメタデータから追加のデコードなしで timestamp を簡単に生成できる場合は、それを timestamp に代入する。

      4. それ以外の場合は 0timestamp に代入する。

    4. もし [[encoded data]] に 画像の向きメタデータがあれば rotationflip として記述し、なければ rotation を 0、flip を false とする。

    5. imageVideoFrame生成アルゴリズムを output, timestamp, duration, rotation, flip で実行した結果を代入する。

  12. デコード解決アルゴリズムを promisedecodeResult で実行する。

プログレッシブフレームのデコードframeIndexpromise を指定)
  1. [[tracks established]]true であることをアサートする。

  2. [[internal selected track index]]-1 でないことをアサートする。

  3. encodedFrameframeIndex および [[internal selected track index]] で識別されるエンコード済みフレームとする。

  4. lastFrameGenerationnull とする。

  5. もし [[progressive frame generations]]frameIndex をキーとするマップエントリーが含まれていれば、その値を lastFrameGeneration に代入する。

  6. 次のいずれかの条件が最初に満たされるまで待つ:

    1. [[encoded data]]encodedFrame をデコードするのに十分なバイト数を含み、 かつ プログレッシブ画像フレーム世代lastFrameGeneration を超える出力が得られる場合。

    2. [[encoded data]] が不正であると判明した場合。

    3. completetrue である場合。

    4. [[closed]]true である場合。

  7. もし [[encoded data]] が不正であると判明した場合、 Fatally Reject Bad Data アルゴリズムを実行し、これらの手順を中止する。

  8. それ以外で、[[encoded data]]encodedFrame をデコードして プログレッシブ画像フレーム世代lastFrameGeneration を超える出力を得るのに十分なバイト数を含まない場合は、 Reject Infeasible Decode アルゴリズムを promise とともに実行し、これらの手順を中止する。

  9. [[codec implementation]] を用いて encodedFrame のデコードを試みる。

  10. デコードでエラーが発生した場合、 Fatally Reject Bad Data アルゴリズムを実行し、これらの手順を中止する。

  11. output[[codec implementation]] から encodedFrame に対応して出力されたデコード済み画像データとする。

  12. decodeResult を新しい ImageDecodeResult とする。

  13. もし outputencodedFrame に対応する最終的な完全詳細プログレッシブ出力であれば:

    1. decodeResultcompletetrue を代入する。

    2. もし [[progressive frame generations]]frameIndex をキーとするエントリーがあれば、マップからそのエントリーを削除する。

  14. それ以外の場合:

    1. decodeResultcompletefalse を代入する。

    2. frameGenerationoutputプログレッシブ画像フレーム世代 とする。

    3. [[progressive frame generations]]frameIndex をキー、frameGeneration を値として新しいエントリーを追加する。

  15. durationoutput の提示時間(encodedFrame に記述されている場合)とする。encodedFrame が duration を記述していなければ、nullduration に代入する。

  16. timestampoutput の提示タイムスタンプ(encodedFrame に記述されている場合)とする。encodedFrame がタイムスタンプを持たない場合:

    1. もし encodedFrame が静止画像なら、timestamp0 を代入する。

    2. もし encodedFrame が一定速度のアニメ画像で durationnull でなければ、|frameIndex| * |duration|timestamp に代入する。

    3. もしメタデータから追加のデコード無しで簡単に生成できる場合、その値を timestamp に代入する。

    4. それ以外の場合、timestamp0 を代入する。

  17. もし [[encoded data]] に向きメタデータが含まれていれば rotationflip として記述し、それ以外の場合は rotation を 0, flip を false とする。

  18. imageCreate a VideoFrame アルゴリズムの結果(output, timestamp, duration, rotation, flip)を代入する。

  19. promise[[pending decode promises]] から削除する。

  20. promisedecodeResult で解決する。

デコードの解決promiseresult を指定)
  1. タスクをキューして以下の手順を実行する:

    1. [[closed]] なら、これらの手順を中止する。

    2. promise[[pending decode promises]] の要素であることをアサートする。

    3. promise[[pending decode promises]] から削除する。

    4. promiseresult で解決する。

実現不可能なデコードの拒否promise を指定)
  1. completetrue または [[closed]]true であることをアサートする。

  2. もし completetrue なら、exceptionRangeError とする。 それ以外は exceptionInvalidStateError DOMException とする。

  3. タスクをキューして以下の手順を実行する:

    1. [[closed]] なら、これらの手順を中止する。

    2. promise[[pending decode promises]] の要素であることをアサートする。

    3. promise[[pending decode promises]] から削除する。

    4. promiseexception で拒否する。

致命的な不正データの拒否
  1. タスクをキューして以下の手順を実行する:

    1. [[closed]] なら、これらの手順を中止する。

    2. ImageDecoderのクローズ アルゴリズムを EncodingError DOMException 付きで実行する。

型サポートの確認type を指定)
  1. ユーザーエージェントが type のデコードをサポートするコーデックを提供できる場合、true を返す。

  2. それ以外の場合、false を返す。

ImageDecoderのリセットexception を指定)
  1. [[codec implementation]] にアクティブなデコード操作を中止するよう指示する。

  2. [[pending decode promises]] の各 decodePromise について:

    1. decodePromiseexception で拒否する。

    2. decodePromise[[pending decode promises]] から削除する。

ImageDecoderのクローズexception を指定)
  1. ImageDecoderのリセット アルゴリズムを exception 付きで実行する。

  2. true[[closed]] に代入する。

  3. [[codec implementation]] をクリアし、関連する システムリソース を解放する。

  4. [[ImageTrackList]] が空なら [[ready promise]]exception で拒否する。そうでなければ、以下を実行する:

    1. [[ImageTrackList]] のすべてのエントリーを削除する。

    2. -1[[ImageTrackList]][[selected index]] に代入する。

  5. もし [[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かどうか判定するには、以下の手順を実行する:

  1. type有効な画像のMIMEタイプでない場合、falseを返す。

  2. dataReadableStream 型であり、その ReadableStream が 撹乱されているまたはロックされている場合、falseを返す。

  3. dataBufferSource 型の場合:

    1. data が [切り離されている] 場合、falseを返す。

    2. dataの場合、falseを返す。

  4. desiredWidth存在しdesiredHeight が存在しない場合、falseを返す。

  5. desiredHeight存在しdesiredWidth が存在しない場合、falseを返す。

  6. trueを返す。

有効な画像のMIMEタイプは、有効なMIMEタイプ文字列であり、[RFC9110]の8.3.1節に従いtypeimageとなる文字列である。

type, 型:DOMString

デコードする画像ファイルのMIMEタイプを含む文字列。

data, 型:ImageBufferSource

BufferSource または ReadableStream で、typeで記述されるエンコード済み画像ファイルのバイト列を表す。

colorSpaceConversion, 型:ColorSpaceConversion、デフォルトは "default"

デコードされた出力の色空間を変換または無視するかを制御する。詳細は colorSpaceConversionImageBitmapOptions)を参照。

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で複数回呼び出すと、 前回よりも高いプログレッシブ画像フレーム世代 (より細かい画像)で解決され、最終的には完全な詳細画像が得られる。

completeFramesOnlytrueを指定した場合、画像がプログレッシブ画像でない場合、またはユーザーエージェントが指定画像型のプログレッシブデコードをサポートしない場合は、 decode() の呼び出しは完全詳細画像がデコードされて初めて解決される。

注: プログレッシブ画像では completeFramesOnlyfalseに設定することで、ネットワークからバッファリング中の画像をユーザーにプレビューとして表示できる (data ReadableStreamを通じて)。

完全な詳細画像がデコードされた際、ImageDecodeResultcomplete は true になる。

10.5. ImageDecodeResult インターフェイス

dictionary ImageDecodeResult {
  required VideoFrame image;
  required boolean complete;
};

image, 型:VideoFrame

デコードされた画像。

complete, 型:boolean

image が最終的な完全詳細出力であるかどうかを示す。

注: completedecode()completeFramesOnlytrueを指定して呼び出された場合は常に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]]

ImageTrackListImageTrackで 埋められたことを通知するためのPromise。

注: ImageTrackframeCountcompletetrueになるまで更新される可能性がある。

[[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の動作は以下:

  1. [[selected index]]-1の場合、nullを返す。

  2. それ以外の場合、[[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を超えることを早期に示す指標となる。これは frameCount0で始まり、ReadableStreamdata の新しいチャンクが到着するごとにインクリメントされる画像の場合である。

frameCount, 型:unsigned long、readonly

frameCount のgetterの手順は [[frame count]] の値を返すこと。

repetitionCount, 型: unrestricted float、readonly

repetitionCount のgetterの手順は [[repetition count]] の値を返すこと。

selected, 型:boolean

selected のgetterの手順は [[selected]] の値を返すこと。

selected のsetterの手順:

  1. [[ImageDecoder]][[closed]] スロットがtrueなら、これらの手順を中止する。

  2. newValue与えられた値とする。

  3. もしnewValue[[selected]] と等しければ、これらの手順を中止する。

  4. newValue[[selected]] に代入する。

  5. parentTrackList[[ImageTrackList]] とする。

  6. oldSelectedIndexparentTrackList[[selected index]] の値とする。

  7. もしoldSelectedIndex-1でない場合:

    1. oldSelectedTrackparentTrackList[[track list]]oldSelectedIndex の位置にあるImageTrack とする。

    2. oldSelectedTrack[[selected]]falseを代入する。

  8. もしnewValuetrueなら、 selectedIndexparentTrackList[[track list]] 内でthis ImageTrack のインデックスとする。そうでなければ、selectedIndex-1とする。

  9. selectedIndexparentTrackList[[selected index]] に代入する。

  10. [[ImageDecoder]] に対してImageDecoderのリセットアルゴリズムを実行する。

  11. [[ImageDecoder]]control message queueに、内部選択トラックインデックスを selectedIndexに更新する制御メッセージを キューする。

  12. [[ImageDecoder]]control message queueの処理を行う。

内部選択トラックインデックスを更新する制御メッセージの実行は以下の手順:

  1. [[ImageDecoder]][[codec work queue]] に以下の手順をキューする:

    1. [[internal selected track index]]selectedIndexを代入する。

    2. [[progressive frame generations]] のすべてのエントリーを削除する。

11. リソース回収

リソースが制約されている場合、ユーザーエージェントはMAY積極的にコーデックを回収することがある。これは特にハードウェアコーデックが限られていて、Webページやプラットフォームアプリ間で共有されている場合に該当する。

コーデックの回収を行うには、ユーザーエージェントは MUST該当するクローズアルゴリズム(AudioDecoderのクローズAudioEncoderのクローズVideoDecoderのクローズ および VideoEncoderのクローズの中から)を QuotaExceededError 付きで実行する。

コーデックがいつ回収可能かのルールは、コーデックがアクティブ非アクティブか、またはバックグラウンドコーデックかによって異なる。

アクティブコーデックは、過去10秒以内に[[codec work queue]]で進捗のあったコーデックを指す。

注: ワークキューの進捗の信頼できる兆候はoutput()コールバックの呼出しである。

非アクティブコーデックは、アクティブコーデックの定義を満たさないコーデックである。

バックグラウンドコーデックは、その ownerDocument (またはワーカー内コーデックの場合はowner setDocument)の hidden 属性がtrueになっているコーデックである。

ユーザーエージェントは、非アクティブコーデックバックグラウンドコーデック、またはその両方であるコーデックのみ 回収できるMUSTアクティブかつ前景(バックグラウンドでない)のコーデックは回収してはならないMUST NOT

加えて、ユーザーエージェントは、以下の場合はアクティブ バックグラウンドコーデックを 回収MUST NOT

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 に捧げます。

適合性

文書の慣例

適合性要件は、記述的なアサーションと RFC 2119 用語の組み合わせで表現されます。 規範部分で使われる “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” という主要語は RFC 2119 の記述に従って解釈されます。 ただし、可読性のため、この仕様書ではこれらの語はすべて大文字では記載されません。

この仕様書の文全体が規範的ですが、明示的に非規範的、例、および注記と示された節は除きます。[RFC2119]

本仕様書の例は「for example」で始まる文や、以下のように class="example" で規範文から区別されています:

これは情報例の一例です。

情報的な注記は “Note” で始まり、class="note" で規範文と区別されます:

注:これは情報的な注記です。

適合するアルゴリズム

アルゴリズムの一部として命令形で表現された要件(例えば "strip any leading space characters" や "return false and abort these steps" など)は、アルゴリズムの導入部に使われている主要語("must", "should", "may" など)の意味で解釈されます。

アルゴリズムや具体的な手順として表現された適合性要件は、最終的な結果が同等である限り、どのような方法で実装しても構いません。 特に、この仕様書で定義されたアルゴリズムは理解しやすいように意図されており、必ずしも高パフォーマンスではありません。 実装者は最適化を推奨します。

索引

この仕様で定義されている用語

参照によって定義される用語

参考文献

規範的参考文献

[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 3. 2023年12月18日. CRD. URL: https://www.w3.org/TR/css-images-3/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[GEOMETRY-1]
Simon Pieters; Chris Harrelson. Geometry Interfaces Module Level 1. 2018年12月4日. CR. URL: https://www.w3.org/TR/geometry-1/
[HTML]
Anne van Kesteren; 他. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[MEDIASTREAM-RECORDING]
Miguel Casas-sanchez. MediaStream Recording. 2025年4月17日. WD. URL: https://www.w3.org/TR/mediastream-recording/
[MIMESNIFF]
Gordon P. Hemsley. MIME Sniffing Standard. Living Standard. URL: https://mimesniff.spec.whatwg.org/
[MST-CONTENT-HINT]
Harald Alvestrand. MediaStreamTrack Content Hints. 2024年10月31日. WD. URL: https://www.w3.org/TR/mst-content-hint/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[STREAMS]
Adam Rice; 他. Streams Standard. Living Standard. URL: https://streams.spec.whatwg.org/
[SVG2]
Amelia Bellamy-Royds; 他. Scalable Vector Graphics (SVG) 2. 2018年10月4日. CR. URL: https://www.w3.org/TR/SVG2/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/
[WebRTC-SVC]
Bernard Aboba. Scalable Video Coding (SVC) Extension for WebRTC. 2024年8月17日. WD. URL: https://www.w3.org/TR/webrtc-svc/

参考情報文献

[H.273]
Coding-independent code points for video signal type identification. 2016年12月. URL: https://www.itu.int/rec/T-REC-H.273/en
[MEDIA-CAPABILITIES]
Jean-Yves Avenard; Mark Foltz. Media Capabilities. 2025年6月23日. WD. URL: https://www.w3.org/TR/media-capabilities/
[MEDIA-SOURCE-2]
Jean-Yves Avenard; Mark Watson. Media Source Extensions™. 2025年4月17日. WD. URL: https://www.w3.org/TR/media-source-2/
[RFC6381]
R. Gellens; D. Singer; P. Frojdh. The 'Codecs' and 'Profiles' Parameters for "Bucket" Media Types. 2011年8月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6381
[RFC9110]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. HTTP Semantics. 2022年6月. Internet Standard. URL: https://httpwg.org/specs/rfc9110.html
[WEBAUDIO]
Paul Adenot; Hongchan Choi. Web Audio API. 2021年6月17日. REC. URL: https://www.w3.org/TR/webaudio-1.0/
[WEBAUDIO-1.1]
Paul Adenot; Hongchan Choi. Web Audio API 1.1. 2024年11月5日. FPWD. URL: https://www.w3.org/TR/webaudio-1.1/
[WEBCODECS-CODEC-REGISTRY]
Paul Adenot; Bernard Aboba. WebCodecs Codec Registry. 2024年9月9日. DRY. URL: https://www.w3.org/TR/webcodecs-codec-registry/
[WEBCODECS-VIDEO-FRAME-METADATA-REGISTRY]
Youenn Fablet. WebCodecs VideoFrame Metadata Registry. ED. URL: https://w3c.github.io/webcodecs/video_frame_metadata_registry.html
[WebRTC]
Cullen Jennings; 他. WebRTC: Real-Time Communication in Browsers. 2025年3月13日. REC. URL: https://www.w3.org/TR/webrtc/

IDL索引

[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);

[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);

[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 = {});

dictionary EncodedAudioChunkMetadata {
  AudioDecoderConfig decoderConfig;
};

[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 = {});

dictionary EncodedVideoChunkMetadata {
  VideoDecoderConfig decoderConfig;
  SvcOutputMetadata svc;
  BufferSource alphaSideData;
};

dictionary SvcOutputMetadata {
  unsigned long temporalLayerId;
};

dictionary AudioDecoderSupport {
  boolean supported;
  AudioDecoderConfig config;
};

dictionary VideoDecoderSupport {
  boolean supported;
  VideoDecoderConfig config;
};

dictionary AudioEncoderSupport {
  boolean supported;
  AudioEncoderConfig config;
};

dictionary VideoEncoderSupport {
  boolean supported;
  VideoEncoderConfig config;
};

dictionary AudioDecoderConfig {
  required DOMString codec;
  [EnforceRange] required unsigned long sampleRate;
  [EnforceRange] required unsigned long numberOfChannels;
  AllowSharedBufferSource description;
};

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;
};

dictionary AudioEncoderConfig {
  required DOMString codec;
  [EnforceRange] required unsigned long sampleRate;
  [EnforceRange] required unsigned long numberOfChannels;
  [EnforceRange] unsigned long long bitrate;
  BitrateMode bitrateMode = "variable";
};

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;
};

enum HardwareAcceleration {
  "no-preference",
  "prefer-hardware",
  "prefer-software",
};

enum AlphaOption {
  "keep",
  "discard",
};

enum LatencyMode {
  "quality",
  "realtime"
};

dictionary VideoEncoderEncodeOptions {
  boolean keyFrame = false;
};

enum VideoEncoderBitrateMode {
  "constant",
  "variable",
  "quantizer"
};

enum CodecState {
  "unconfigured",
  "configured",
  "closed"
};

callback WebCodecsErrorCallback = undefined(DOMException error);

[Exposed=(Window,DedicatedWorker), Serializable]
interface EncodedAudioChunk {
  constructor(EncodedAudioChunkInit init);
  readonly attribute EncodedAudioChunkType type;
  readonly attribute long long timestamp;          // microseconds
  readonly attribute unsigned long long? duration; // microseconds
  readonly attribute unsigned long byteLength;

  undefined copyTo(AllowSharedBufferSource destination);
};

dictionary EncodedAudioChunkInit {
  required EncodedAudioChunkType type;
  [EnforceRange] required long long timestamp;    // microseconds
  [EnforceRange] unsigned long long duration;     // microseconds
  required AllowSharedBufferSource data;
  sequence<ArrayBuffer> transfer = [];
};

enum EncodedAudioChunkType {
    "key",
    "delta",
};

[Exposed=(Window,DedicatedWorker), Serializable]
interface EncodedVideoChunk {
  constructor(EncodedVideoChunkInit init);
  readonly attribute EncodedVideoChunkType type;
  readonly attribute long long timestamp;             // microseconds
  readonly attribute unsigned long long? duration;    // microseconds
  readonly attribute unsigned long byteLength;

  undefined copyTo(AllowSharedBufferSource destination);
};

dictionary EncodedVideoChunkInit {
  required EncodedVideoChunkType type;
  [EnforceRange] required long long timestamp;        // microseconds
  [EnforceRange] unsigned long long duration;         // microseconds
  required AllowSharedBufferSource data;
  sequence<ArrayBuffer> transfer = [];
};

enum EncodedVideoChunkType {
    "key",
    "delta",
};

[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;  // microseconds
  readonly attribute long long timestamp;          // microseconds

  unsigned 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 timestamp;  // microseconds
  required BufferSource data;
  sequence<ArrayBuffer> transfer = [];
};

dictionary AudioDataCopyToOptions {
  [EnforceRange] required unsigned long planeIndex;
  [EnforceRange] unsigned long frameOffset = 0;
  [EnforceRange] unsigned long frameCount;
  AudioSampleFormat format;
};

enum AudioSampleFormat {
  "u8",
  "s16",
  "s32",
  "f32",
  "u8-planar",
  "s16-planar",
  "s32-planar",
  "f32-planar",
};

[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;  // microseconds
  readonly attribute long long timestamp;           // microseconds
  readonly 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 duration;  // microseconds
  long long timestamp;          // microseconds
  AlphaOption alpha = "keep";

  // Default matches image. May be used to efficiently crop. Will trigger
  // new computation of displayWidth and displayHeight using image's pixel
  // aspect ratio unless an explicit displayWidth and displayHeight are given.
  DOMRectInit visibleRect;

  double rotation = 0;
  boolean flip = false;

  // Default matches image unless visibleRect is provided.
  [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 timestamp;  // microseconds
  [EnforceRange] unsigned long long duration;  // microseconds

  // Default layout is tightly-packed.
  sequence<PlaneLayout> layout;

  // Default visible rect is coded size positioned at (0,0)
  DOMRectInit visibleRect;

  double rotation = 0;
  boolean flip = false;

  // Default display dimensions match visibleRect.
  [EnforceRange] unsigned long displayWidth;
  [EnforceRange] unsigned long displayHeight;

  VideoColorSpaceInit colorSpace;

  sequence<ArrayBuffer> transfer = [];

  VideoFrameMetadata metadata;
};

dictionary VideoFrameMetadata {
  // Possible members are recorded in the VideoFrame Metadata Registry.
};

dictionary VideoFrameCopyToOptions {
  DOMRectInit rect;
  sequence<PlaneLayout> layout;
  VideoPixelFormat format;
  PredefinedColorSpace colorSpace;
};

dictionary PlaneLayout {
  [EnforceRange] required unsigned long offset;
  [EnforceRange] required unsigned long stride;
};

enum VideoPixelFormat {
  // 4:2:0 Y, U, V
  "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",
};

[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;
};

enum VideoColorPrimaries {
  "bt709",
  "bt470bg",
  "smpte170m",
  "bt2020",
  "smpte432",
};

enum VideoTransferCharacteristics {
  "bt709",
  "smpte170m",
  "iec61966-2-1",
  "linear",
  "pq",
  "hlg",
};

enum VideoMatrixCoefficients {
  "rgb",
  "bt709",
  "bt470bg",
  "smpte170m",
  "bt2020-ncl",
};

[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);
};


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 = [];
};


dictionary ImageDecodeOptions {
  [EnforceRange] unsigned long frameIndex = 0;
  boolean completeFramesOnly = true;
};


dictionary ImageDecodeResult {
  required VideoFrame image;
  required boolean complete;
};


[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;
};


[Exposed=(Window,DedicatedWorker)]
interface ImageTrack {
  readonly attribute boolean animated;
  readonly attribute unsigned long frameCount;
  readonly attribute unrestricted float repetitionCount;
  attribute boolean selected;
};


課題索引

仕様書はSHOULD コーデッドサイズ、可視矩形、および表示サイズの定義(および可能であれば図)を提供するべきである。 詳細は #166 を参照。