WebRTC エンコード済み変換

W3C 作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-webrtc-encoded-transform-20260521/
最新公開バージョン:
https://www.w3.org/TR/webrtc-encoded-transform/
編集者草案:
https://w3c.github.io/webrtc-encoded-transform/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/webrtc-encoded-transform/
フィードバック:
public-webrtc@w3.org 宛に、件名行を「[webrtc-encoded-transform] … メッセージのトピック …」として送信 (アーカイブ)
GitHub
編集者:
(Google)
(Google)
(Apple)

要約

この API は、 MediaStreamTrack 上のビットであって、RTCPeerConnection を介して送信されるものを操作するための API サーフェスを定義する。

この文書のステータス

この節は、公開時点におけるこの文書のステータスを説明する。 現在の W3C 公開文書およびこの技術報告書の最新リビジョンの一覧は、 W3C 技術報告書 索引にある。

この文書は、 Web Real-Time Communications Working Group により、勧告 トラックを用いた作業草案として公開された。この文書は W3C 勧告になることを意図している。

この文書に関するコメントを行いたい場合は、 public-webrtc@w3.org まで送信されたい (購読, アーカイブ)。 電子メールを送信する際は、 件名に “webrtc-encoded-transform” というテキストを含め、 できれば次のようにすること: “[webrtc-encoded-transform] …コメントの要約…”。 すべてのコメントを歓迎する。

作業草案としての公開は、 W3C およびそのメンバーによる承認を意味しない。これは草案文書であり、 いつでも更新、置換、または 他の文書により廃止される可能性がある。この文書を作業中のもの以外として引用することは不適切である。

この文書は、 W3C 特許ポリシーの下で運営されるグループにより作成された。 W3C は、グループの成果物に関連して行われた 特許開示の公開一覧 を管理している。 そのページには、特許を開示するための手順も含まれている。 個人が、当該個人の考えにおいて 必須クレーム を含む特許について実際の知識を有する場合、 W3C 特許ポリシー第 6 節に従って その情報を開示しなければならない。

この文書は、2025年8月18日 W3C プロセス文書により管理される。

1. 導入

[WEBRTC-NV-USE-CASES] 文書は、次のユースケースを記述している

これは、会議サーバーがクリアテキストのメディアへアクセスできないことを 要求する(要件 N27)。

この仕様はエンコード済みメディアへのアクセスを提供する。 これは、コーデックのエンコーダー部分の出力であり、 コーデックのデコーダー部分への入力であって、ユーザーエージェントが暗号化を ローカルで適用できるようにするものである。

このインターフェイスは [WEBCODECS] に着想を得ており、 RTCPeerConnection のセットアップフローを維持しつつ、 そのような機能へのアクセスを提供する。

2. 仕様

Streams の定義は WebIDL をあまり使用しないが、WebRTC 仕様は使用する。 この仕様は WebRTC の IDL 拡張を示す。

これは RTCRtpSender および RTCRtpReceiver 上の追加 API を用いて、 処理をパイプラインへ挿入する。

typedef (RTCRtpSFrameEncrypter or RTCRtpScriptTransform) RTCRtpSenderTransform;
typedef (RTCRtpSFrameDecrypter or RTCRtpScriptTransform) RTCRtpReceiverTransform;

// New methods for RTCRtpSender and RTCRtpReceiver
partial interface RTCRtpSender {
    attribute RTCRtpSenderTransform? transform;
};

partial interface RTCRtpReceiver {
    attribute RTCRtpReceiverTransform? transform;
};

この API は、RTCRtpSender の 基盤となる エンコーダーパケタイザーの処理ステップ間、および/または RTCRtpReceiver の 基盤となる デパケタイザーデコーダーの間のメディア パイプラインにおける エンコード済みフレーム の操作を可能にする。

エンコーダーおよび デパケタイザーはそれぞれ、 空の キューに初期化される [[processedFramesQueue]] 内部スロットと、 エンコード済みフレーム frame が与えられたときに frame を返す [[transformFrameAlgorithm]] 内部スロットを持ち、そのスロットは パススルー アルゴリズムに初期化される。

エンコーダーエンコード済みフレームを出力するたびに、ユーザー エージェントはそれに対して エンコーダー.[[transformFrameAlgorithm]] を呼び出し、 元のフレームの代わりに、その結果を関連する パケタイザーへ渡さなければならない。

デパケタイザーエンコード済みフレームを出力するたびに、 ユーザーエージェントはそれに対して デパケタイザー.[[transformFrameAlgorithm]] を呼び出し、元のフレームの代わりに、その結果を関連する デコーダーへ渡さなければならない。

2.1. 拡張操作

RTCRtpTransceiver の構築時に、 次の手順を実行する:

  1. this.[[useSFrame]] を undefined に初期化する。

  2. this が メディア記述に関連付けられている場合、this.[[useSFrame]] をそのメディア記述から初期化する。this.[[useSFrame]] が true である場合、this に対して SFrame RTP パケタイゼーションを有効にする。

  3. そうでなければ、次の手順を実行するためにタスクをキューに入れる:

    1. this.[[useSFrame]] が undefined である場合、this.[[useSFrame]] を false に設定する。

RTCRtpTransceiver.[[useSFrame]] は、すでに SDP m-section に結び付けられている場合は同期的に、または SDP m-section に関連付けられる前に非同期的に設定されるべきである。 これにより、RTCRtpTransceiver.[[useSFrame]] と対応する SDP が常に同期されることが保証される。 このようにすることで、negotiation-needed フラグを確認するアルゴリズムのような、 negotiation-needed フラグに関連する処理は、RTCRtpTransceiver.[[useSFrame]] を考慮する 必要がない。

RTCRtpSender または RTCRtpReceiver の構築時に、 次の手順を実行する:

  1. this.[[transform]] を null に初期化する。

  2. this.[[pipeToController]] を null に初期化する。

  3. this.[[frameSource]] を、thisRTCRtpSender である場合は thisエンコーダーに、そうでなければ thisデパケタイザーに初期化する。

2.1.1. ストリーム処理

Streams のバックプレッシャーは、データパイプライン内で可能な限り早く データ生成を一時停止することで、処理とメモリ消費を制限しながらスループットを最適化できる。 これは、信頼性が不可欠であり、レイテンシーの懸念が比較的小さい文脈で有用である。 一方で、WebRTC メディアパイプラインは、たとえばさまざまな場所で フレームの破棄を許可し、回復メカニズムを使用することにより、 信頼性よりも低レイテンシーを重視する。 変換内でバッファリングを行うと、ウェブアプリケーションがあまり適応できないままレイテンシーが追加される。 とりわけ変換の両端を制御しているため、ユーザーエージェントがこれらの適応を行う責任を負う。 これらの理由により、WebRTC エンコード済み変換では Streams のバックプレッシャーは無効化される。

readEncodedData アルゴリズムは、RTCRtpScriptTransformer transformer をパラメーターとして、frame を入力として与えられる。これは次の 手順を実行することにより定義される:

  1. frame.[[owner]]transformer.[[frameSource]] に設定する。

  2. frame.[[counter]]transformer.[[lastEnqueuedFrameCounter]] に設定する。

  3. frame.[[owner]]デパケタイザーである場合:

    1. 関連する RTP パケットが 絶対キャプチャ時刻用 RTP ヘッダー拡張を含む場合、 frame.[[captureTime]]absolute capture timestamp フィールドに設定し、存在するなら frame.[[senderCaptureTimeOffset]]capture clock offset field に設定する。

    2. そうでなく、関連する RTP パケットが 絶対キャプチャ時刻用 RTP ヘッダー拡張を含まないが、 以前の RTP パケットが含んでいた場合、 frame.[[captureTime]]timestamp interpolation に従って絶対キャプチャタイムスタンプを計算した結果に設定し、 frame.[[senderCaptureTimeOffset]] を存在していた直近の値に設定する。

    3. そうでなければ、frame.[[captureTime]] を undefined に設定し、 frame.[[senderCaptureTimeOffset]] を undefined に設定する。

  4. frame.[[owner]]エンコーダーである場合、frame.[[captureTime]]RTP Header Extension for Absolute Capture Time § absolute-capture-timestamp で説明されている方法論を用いた キャプチャタイムスタンプに設定し、 frame.[[senderCaptureTimeOffset]] を undefined に設定する。

  5. frametransformer.[[readable]]エンキューする

writeEncodedData アルゴリズムは、RTCRtpScriptTransformer transformer をパラメーターとして、frame を入力として与えられる。これは次の 手順を実行することにより定義される:

  1. frame.[[owner]]transformer.[[frameSource]] と等しくない場合、 これらの手順を中止し、undefined で解決される promise を返す。プロセッサーは フレームを作成したり、ストリーム間でフレームを移動したりできない。

  2. frame.[[counter]]transformer.[[lastReceivedFrameCounter]] 以下である場合、これらの手順を中止し、 undefined で解決される promise を返す。プロセッサーは フレームを並べ替えることはできないが、遅延させたり破棄したりすることはできる。

  3. transformer.[[lastReceivedFrameCounter]]frame.[[counter]] に設定する。

  4. dataframe.[[data]] とする。

  5. serializedFrameStructuredSerializeWithTransfer(frame, « data ») とする。

  6. frameCopyStructuredDeserializeWithTransfer(serializedFrame, frame関連レルム) とする。

  7. processedFrameframeCopy の基盤となる エンコード済みフレームとする。

  8. 並列にprocessedFrametransformer.[[frameSource]].[[processedFramesQueue]]エンキューする

  9. undefined で解決される promise を返す。

送信側では、readEncodedData の一部として、 エンコーダーによって生成されたフレームは、エンキューされるとき、 transformer.[[readable]] に、エンコーダーの出力順で入れられなければならない。 writeEncodedData は変換が フレームを並べ替えられないことを保証するため、エンコーダーの出力順は、パケタイザーが RTP パケットを生成し、 RTP パケットシーケンス番号を割り当てる際に従う順序でもある。 パケタイザーは、 変換済みデータが、たとえば Annex B 開始コードで区切られた一連の NAL ユニットのように、 依然として元の形式に適合していることを期待するかもしれない。

受信側では、readEncodedData の一部として、 デパケタイザーによって生成されたフレームは、 同じ エンコーダーの出力順で、 transformer.[[readable]]エンキューされなければならない。 その順序が尊重されることを保証するため、デパケタイザーは通常、transformer.[[readable]] にフレームをエンキューする前に、 必要に応じて RTP パケットシーケンス番号を使用して RTP パケットを並べ替える。 writeEncodedData は変換が フレームを並べ替えられないことを保証するため、これは デコーダーが期待する順序となる。

2.1.2. RTCRtpTransform 共通処理

RTCRtpTransform には private スロットがある:

各 RTCRtpTransform は、関連付けアルゴリズム関連付け解除アルゴリズムを持ち、どちらも既定では空である。

2.2. 拡張属性

transform getter 手順は、 this.[[transform]] を返すものである。setter 手順は次のとおりである:

  1. transform を setter への引数とする。

  2. transceiver を、this に関連付けられた RTCRtpTransceiver とする。

  3. transform.[[useSFrame]] が true である場合、次の手順を実行する:

    1. transceiver.[[useSFrame]] が false である場合、InvalidModificationError を投げ、これらの手順を中止する。

    2. そうでなく、transceiver.[[useSFrame]] が undefined である場合、次の 手順を実行する:

      1. transceiver.[[useSFrame]] を true に設定する。

      2. transceiver に対して SFrame RTP パケタイゼーションを有効にする。

  4. そうでなければ、次の手順を実行する:

    1. transceiver.[[useSFrame]] が true である場合、InvalidModificationError を投げ、これらの手順を中止する。

    2. transceiver.[[useSFrame]] を false に設定する。

  5. transform が null ではなく、かつ transform.[[owner]] が null ではない場合、 InvalidStateError を投げ、これらの手順を中止する。

  6. transform.[[owner]]this に設定する。

  7. oldTransformthis.[[transform]] とする。

  8. oldTransform が null ではない場合、oldTransform関連付け解除 アルゴリズムを実行する。

  9. this.[[transform]]transform に設定する。

  10. transform が null ではない場合、transform関連付けアルゴリズムthis を伴って実行する。

  11. transform が null である場合、次の手順を実行する:

    1. frameSourcethis.[[frameSource]] とする。

    2. 並列にframeSource.[[transformFrameAlgorithm]]パススルーアルゴリズムに設定する。

このアルゴリズムは、変換を動的に更新できるように定義されている。 以前の変換から新しい変換への切り替えがどのフレームで発生するかについての保証はない。

ウェブアプリケーションが RTCRtpSender の作成時に同期的に変換を設定する場合(たとえば addTrack の呼び出し時)、その変換は RTCRtpSender の エンコーダーによって生成された最初のフレームを受信する。 同様に、ウェブアプリケーションが RTCRtpReceiver の作成時に同期的に変換を設定する場合(たとえば addTrack の呼び出し時、または track イベントハンドラーで)、その変換は RTCRtpReceiver の パケタイザーによって生成された最初の完全なフレームを受信する。

3. SFrame 変換

この節で提示される API により、アプリケーションは [RFC9605] で定義される特定の暗号スイートを用いて SFrame データを処理できる。

// List of supported cipher suites, as defined in [[RFC9605]] section 4.5 and in https://datatracker.ietf.org/doc/draft-barnes-sframe-iana-256/.
enum SFrameCipherSuite {
     "AES_128_CTR_HMAC_SHA256_80",
     "AES_128_CTR_HMAC_SHA256_64",
     "AES_128_CTR_HMAC_SHA256_32",
     "AES_128_GCM_SHA256_128",
     "AES_256_GCM_SHA512_128",
     "AES_256_CTR_HMAC_SHA512_80",
     "AES_256_CTR_HMAC_SHA512_64",
     "AES_256_CTR_HMAC_SHA512_32"
};

dictionary SFrameTransformOptions {
    required SFrameCipherSuite cipherSuite;
};

enum SFrameType {
    "per-frame",
    "per-packet"
};

dictionary RTCRtpSFrameEncrypterOptions : SFrameTransformOptions {
    SFrameType type = "per-frame";
};

typedef [EnforceRange] unsigned long long SmallCryptoKeyID;
typedef (SmallCryptoKeyID or bigint) CryptoKeyID;

interface mixin SFrameEncrypterManager {
    Promise<undefined> setEncryptionKey(CryptoKey key, CryptoKeyID keyId);
};

interface mixin SFrameDecrypterManager {
    Promise<undefined> addDecryptionKey(CryptoKey key, CryptoKeyID keyId);
    Promise<undefined> removeDecryptionKey(CryptoKeyID keyId);
    attribute EventHandler onerror;
};

[Exposed=Window]
interface RTCRtpSFrameEncrypter {
    constructor(RTCRtpSFrameEncrypterOptions options);
};
RTCRtpSFrameEncrypter includes SFrameEncrypterManager;

[Exposed=Window]
interface RTCRtpSFrameDecrypter : EventTarget {
    constructor(SFrameTransformOptions options);
};
RTCRtpSFrameDecrypter includes SFrameDecrypterManager;

[Exposed=(Window,DedicatedWorker)]
interface SFrameEncrypterStream {
    constructor(SFrameTransformOptions options);
};
SFrameEncrypterStream includes GenericTransformStream;
SFrameEncrypterStream includes SFrameEncrypterManager;

[Exposed=(Window,DedicatedWorker)]
interface SFrameDecrypterStream : EventTarget {
    constructor(SFrameTransformOptions options);
};
SFrameDecrypterStream includes GenericTransformStream;
SFrameDecrypterStream includes SFrameDecrypterManager;

enum SFrameTransformErrorEventType {
    "authentication",
    "keyID",
    "syntax"
};

[Exposed=(Window,DedicatedWorker)]
interface SFrameTransformErrorEvent : Event {
    constructor(DOMString type, SFrameTransformErrorEventInit eventInitDict);

    readonly attribute SFrameTransformErrorEventType errorType;
    readonly attribute CryptoKeyID? keyID;
    readonly attribute any frame;
};

dictionary SFrameTransformErrorEventInit : EventInit {
    required SFrameTransformErrorEventType errorType;
    required any frame;
    CryptoKeyID? keyID;
};

new RTCRtpSFrameEncrypter(options) コンストラクターの手順は、次のとおり:

  1. options をメソッドの第 1 引数とする。

  2. SFrame 初期化アルゴリズムthisoptions で実行する。

  3. this.[[role]] を 'encrypt' に設定する。

  4. this.[[useSFrame]] を true に設定する。

new RTCRtpSFrameDecrypter(options) コンストラクターの手順は、次のとおり:

  1. options をメソッドの第 1 引数とする。

  2. SFrame 初期化アルゴリズムthisoptions で実行する。

  3. this.[[role]] を 'decrypt' に設定する。

  4. this.[[useSFrame]] を true に設定する。

new SFrameEncrypterStream(options) コンストラクターの手順は、次のとおり:

  1. options をメソッドの第 1 引数とする。

  2. SFrame 初期化アルゴリズムthisoptions で実行する。

  3. this.[[role]] を 'encrypt' に設定する。

new SFrameDecrypterStream(options) コンストラクターの手順は、次のとおり:

  1. options をメソッドの第 1 引数とする。

  2. SFrame 初期化アルゴリズムthisoptions で実行する。

  3. this.[[role]] を 'decrypt' に設定する。

3.1. アルゴリズム

this および options が与えられる SFrame 初期化アルゴリズムは、次の手順を実行する:

  1. transformAlgorithm を、frame を入力として取り、 thisframeSFrame 変換アルゴリズムを実行するアルゴリズムとする。

  2. options["type"] が存在する場合、これらの手順を実行する:

    1. options["type"] が 'per-frame' であれば、[RTP-SFRAME-PAYLOAD] で定義される per-frame 送信を使用する。

    2. そうでなければ、[RTP-SFRAME-PAYLOAD] で定義される per-packet 送信を使用する。

  3. this.[[transform]] を新しい TransformStream に設定する。

  4. 設定 this.[[transform]] を、transformAlgorithmtransformAlgorithm に設定して行う。

  5. this.[[cipherSuite]]options["cipherSuite"] に設定する。

  6. this.[[readable]]this.[[transform]].[[readable]] に設定する。

  7. this.[[writable]]this.[[transform]].[[writable]] に設定する。

this および frame が与えられる SFrame 変換アルゴリズムは、次の手順を実行する:

  1. rolethis.[[role]] とする。

  2. this.[[owner]]RTCRtpSender である場合、role を 'encrypt' に設定する。

  3. this.[[owner]]RTCRtpReceiver である場合、role を 'decrypt' に設定する。

  4. data を undefined とする。

  5. frameBufferSource である場合、dataframe に設定する。

  6. frameRTCEncodedAudioFrame である場合、dataframe.data に設定する。

  7. frameRTCEncodedVideoFrame である場合、dataframe.data に設定する。

  8. data が undefined である場合、これらの手順を中止する。

  9. buffer を、datathis.[[cipherSuite]]、 および role をパラメーターとして SFrame アルゴリズムを実行した結果とする。 このアルゴリズムは [RFC9605] によって定義され、 ArrayBuffer を返す。

  10. SFrame アルゴリズムがエラーを伴って突然終了した場合、次のサブ手順を実行するために タスクをキューに入れる:

    1. 復号側で、data が SFrame 形式に従っていないことにより処理が失敗した場合、 this に対して error という名前のイベントを発火する。 その際、SFrameTransformErrorEvent インターフェイスを用い、その errorType 属性を syntax に設定し、その frame 属性を frame に設定する。

    2. 復号側で、data から解析された鍵識別子が不明であることにより 処理が失敗した場合、this に対して error という名前のイベントを発火する。 その際、SFrameTransformErrorEvent インターフェイスを用い、その errorType 属性を keyID に設定し、その frame 属性を frame に設定し、その keyID 属性を SFrame ヘッダー内で解析された keyID 値に設定する。

    3. 復号側で、認証タグの検証により処理が失敗した場合、this に対して error という名前のイベントを発火する。 その際、SFrameTransformErrorEvent インターフェイスを用い、その errorType 属性を authentication に設定し、その frame 属性を frame に設定する。

    4. これらの手順を中止する。

  11. frameBufferSource である場合、framebuffer に設定する。

  12. frameRTCEncodedAudioFrame である場合、frame.databuffer に設定する。

  13. frameRTCEncodedVideoFrame である場合、frame.databuffer に設定する。

  14. framethis.[[transform]]エンキューする

3.2. メソッド

setEncryptionKey(key, keyId) メソッド手順は次のとおりである:
  1. promise新しい promise とする。

  2. keyId が、0 以上 264-1 以下の整数として表現できない bigint である場合、promiseRangeError 例外で却下し、これらの手順を中止する。

  3. 並列に、次の手順を実行する:

    1. [RFC9605] によって定義されるように、SFrame 変換暗号化アルゴリズムの鍵材料を key および keyId に設定する。

    2. 鍵材料の設定が失敗した場合、promiseInvalidModificationError 例外で却下するように タスクをキューに入れ、これらの手順を中止する。

    3. promise を undefined で解決するように タスクをキューに入れる

  4. promise を返す。

addDecryptionKey(key, keyId) メソッド手順は次のとおりである:

  1. promise新しい promise とする。

  2. keyId が、0 以上 264-1 以下の整数として表現できない bigint である場合、promiseRangeError 例外で却下し、これらの手順を中止する。

  3. 並列に、次の手順を実行する:

    1. keyStore を、[RFC9605] によって定義される、SFrame 変換アルゴリズムに使用される鍵ストアとする。

    2. keyStore[keyId] を key設定する

    3. 鍵材料の設定が失敗した場合、promiseInvalidModificationError 例外で却下するように タスクをキューに入れ、これらの手順を中止する。

    4. promise を undefined で解決するように タスクをキューに入れる

  4. promise を返す。

removeDecryptionKey(keyId) メソッド手順は次のとおりである:

  1. promise新しい promise とする。

  2. keyId が、0 以上 264-1 以下の整数として表現できない bigint である場合、promiseRangeError 例外で却下し、これらの手順を中止する。

  3. 並列に、次の手順を実行する:

    1. keyStore を、[RFC9605] によって定義される、SFrame 変換アルゴリズムに使用される鍵ストアとする。

    2. keyStore[keyId] を削除する

    3. promise を undefined で解決するように タスクをキューに入れる

  4. promise を返す。

4. スクリプト変換

この節において、キャプチャシステムとはメディアの供給元となるシステムを指し、送信側システムとは、 RTCEncodedFrameMetadata データが入力される受信側システムへ RTP および RTCP パケットを送信するシステムを指す。

4.1. RTCEncodedFrameMetadata 辞書

dictionary RTCEncodedFrameMetadata {
    unsigned long synchronizationSource;
    octet payloadType;
    sequence<unsigned long> contributingSources;
    unsigned long rtpTimestamp;
    DOMHighResTimeStamp receiveTime;
    DOMHighResTimeStamp captureTime;
    DOMHighResTimeStamp senderCaptureTimeOffset;
    DOMString mimeType;
};

4.1.1. メンバー

synchronizationSource, unsigned longunsigned long

synchronization source (ssrc) 識別子は、[RFC3550] に従う符号なし整数値であり、エンコード済みフレームオブジェクトが記述している RTP パケットのストリームを識別するために使用される。

payloadType, octetoctet

ペイロード型は、[RFC3550] に従う 0 から 127 までの範囲の符号なし整数値であり、 RTP ペイロードの形式を記述するために使用される。

contributingSources, sequence<unsigned long>sequence<unsigned long>

[RFC3550] で定義される contribution source のリスト(csrc list)。

rtpTimestamp, unsigned longunsigned long

RTP タイムスタンプ識別子は、[RFC3550] に従う符号なし整数値であり、RTP データパケット内の最初のオクテットのサンプリング時点を反映する。

receiveTime, DOMHighResTimeStampDOMHighResTimeStamp

RTCRtpReceiver から来るフレームについて、このメディアフレームを生成するために使用された 最後に受信されたパケットのタイムスタンプを表す。この タイムスタンプは、Performance.timeOrigin に相対的である。

captureTime, DOMHighResTimeStampDOMHighResTimeStamp

このフレームのキャプチャシステムのクロックにおけるキャプチャ時刻。 このメンバーを入力する際、ユーザーエージェントはフレームの [[captureTime]] スロットの値を返さなければならず、 それは Performance.timeOrigin に相対的になるようにシフトされる。

senderCaptureTimeOffset, DOMHighResTimeStampDOMHighResTimeStamp

senderCaptureTimeOffset は、同じフレームについて、送信側システム自身の NTP クロックとキャプチャシステムの NTP クロックとの間の オフセットに関する送信側システムの推定値であり、 captureTime の由来となったものと同じフレームに対するものである。 このメンバーを入力する際、ユーザーエージェントはフレームの [[senderCaptureTimeOffset]] スロットの値を返さなければならない。

mimeType, DOMStringDOMString

IANA メディア型レジストリ [IANA-MEDIA-TYPES] で定義されるコーデック MIME メディア型/サブ型。 例: audio/opus または video/VP8。

4.2. RTCEncodedVideoFrameMetadata 辞書

dictionary RTCEncodedVideoFrameMetadata : RTCEncodedFrameMetadata {
    unsigned long long frameId;
    sequence<unsigned long long> dependencies;
    unsigned short width;
    unsigned short height;
    unsigned long spatialIndex;
    unsigned long temporalIndex;
    long long timestamp;    // microseconds
};

4.2.1. メンバー

frameId, unsigned long longunsigned long long

エンコード済みフレームの識別子であり、復号順に単調増加する。その下位 16 ビットは、存在する場合、[AV1-RTP-SPEC] の Appendix A で定義される AV1 Dependency Descriptor Header Extension の frame_number と一致する。 受信フレームについては、Dependency Descriptor Header Extension が存在する場合にのみ存在する。

dependencies, sequence<unsigned long long>sequence<unsigned long long>

このフレームが参照するフレームの frameId のリスト。 [AV1-RTP-SPEC] の Appendix A で定義される AV1 Dependency Descriptor Header Extension が存在する場合にのみ、受信フレームについて存在する。

timestamp, long longlong long

生フレームのメディア提示タイムスタンプ(PTS)をマイクロ秒単位で表し、 このフレームに対応する生フレームの timestamp と一致する。

4.3. RTCEncodedVideoFrame インターフェイス

dictionary RTCEncodedVideoFrameOptions {
    RTCEncodedVideoFrameMetadata metadata;
};

// New interfaces to define RTC specific encoded video and audio frames used by RTCRtpScriptTransform.
[Exposed=(Window,DedicatedWorker), Serializable]
interface RTCEncodedVideoFrame {
    constructor(RTCEncodedVideoFrame originalFrame, optional RTCEncodedVideoFrameOptions options = {});
    readonly attribute EncodedVideoChunkType type;
    attribute ArrayBuffer data;
    RTCEncodedVideoFrameMetadata getMetadata();
};

4.3.1. コンストラクター

constructor()

指定された originalFrame および options.[metadata] から、新しい RTCEncodedVideoFrame を作成する。新しく作成されたフレームは originalFrame から完全に独立しており、その [[data]]originalFrame.[[data]] の深いコピーである。 新しいフレームの [[metadata]]originalFrame.[[metadata]] の深いコピーであり、 フィールドは options.[metadata] に存在するフィールドの深いコピーで 置き換えられる。

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

  1. this.[[type]]originalFrame.[[type]] に設定する。

  2. this.[[data]] を、[CloneArrayBuffer](originalFrame.[[data]], 0, originalFrame.[[data]].[[ArrayBufferByteLength]]) の結果とする。

  3. [[metadata]] を、この新しく構築された フレームに関連付けられたメタデータを表すものとする。

    1. originalFrame.[[getMetadata()]] の 各 {[[key]],[[value]]} ペアについて、 [[metadata]].[[key]][[value]] の深いコピーに設定する。

    2. options.[metadata] の 各 {[[key]],[[value]]} ペアについて、 [[metadata]].[[key]][[value]] の深いコピーに設定する。

4.3.2. メンバー

type, EncodedVideoChunkType, readonlyEncodedVideoChunkType

type 属性により、アプリケーションはフレームがキーフレームであるかデルタフレームであるかを判定できる。 取得時には、this.[[type]] が返されなければならない。

data, ArrayBufferArrayBuffer

エンコード済みフレームデータ。データの形式は、フレームのエンコード/デコードに 使用される動画コーデックに依存し、これは mimeType を見ることで判定できる。 SVC については、各空間レイヤーが 個別に変換される。 取得時には、this.[[data]] が返されなければならない。設定時には、 this.[[data]] が新しい値に設定されなければならない。

パケタイザーは特定の要素、たとえば AV1 temporal delimiter OBU を破棄する可能性があるため、 受信側変換への入力は、送信側変換の出力と異なる場合がある。

次の表にいくつかの例を示す:

mimeType データ形式
video/VP8 データは、 9.1 節で定義される "uncompressed data chunk" で始まり、 その後に残りのフレームデータが続く。 VP8 payload descriptor にはアクセスできない。
video/VP9 データは、[VP9] の Section 6 で説明されるフレームである。 VP9 payload descriptor にはアクセスできない。
video/H264 データは、[ITU-T-REC-H.264] Annex B で定義される Annex B 形式の NAL ユニット列である。
video/AV1 データは、[AV1] の Section 5 で説明される low-overhead bitstream format に適合する一連の OBU である。 AV1 aggregation header にはアクセスできない。

4.3.3. メソッド

getMetadata()

フレームに関連付けられたメタデータを返す。

4.3.4. 直列化

RTCEncodedVideoFrame オブジェクトは直列化可能オブジェクトである。 それらの直列化手順は、valueserialized、 および forStorage が与えられ、次のとおりである:

  1. forStorage が true である場合、DataCloneError を投げる。

  2. serialized.[[type]]value.[[type]] の値に設定する。

  3. serialized.[[metadata]]value のメタデータの内部表現に設定する。

  4. serialized.[[data]]value.[[data]]下位直列化に設定する。

それらの逆直列化手順は、serializedvalue および realm が与えられ、次のとおりである:

  1. value.[[type]]serialized.[[type]] に設定する。

  2. value のメタデータを serialized.[[metadata]] のプラットフォームオブジェクト表現に設定する。

  3. value.[[data]]serialized.[[data]]下位逆直列化に設定する。

直列化された RTCEncodedVideoFrame の内部形式は観察できない。 これは主に、writeEncodedData アルゴリズム内のフレーム複製、および structuredClone() 操作で使用できるように定義されている。 したがって、実装は最適に機能する任意の方法を自由に選択できる。

4.4. RTCEncodedAudioFrameMetadata 辞書

dictionary RTCEncodedAudioFrameMetadata : RTCEncodedFrameMetadata {
    short sequenceNumber;
    double audioLevel;
};

4.4.1. メンバー

sequenceNumber, shortshort

[RFC3550] で定義される RTP シーケンス番号。着信音声フレームにのみ存在する。

2 つのシーケンス番号を比較するには、[RFC1982] で説明されるシリアル番号演算が必要である。

audioLevel, doubledouble

このフレームの音声レベル。値は 0..1(線形)の範囲であり、 1.0 は 0 dBov、0 は無音、0.5 は 0 dBov からの音圧レベルにおける およそ 6 dBSPL の変化を表す。

フレームがリモート由来のトラックから来る場合、これは [RFC6464] で定義されるレベル値から変換されなければならない。 フレームの受信済みパケット内に [RFC6464] ヘッダー拡張が存在しない場合、 この値は存在してはならない。 この RFC は音声レベルを 0 から 127 までの整数値として定義し、 システムが符号化可能な最も大きい信号を基準とした負のデシベル単位の 音声レベルを表す。したがって、0 はシステムが符号化可能な最も大きい信号を表し、 127 は無音を表す。これらの値を線形の 0..1 範囲に変換するには、値 127 を 0 に変換し、その他のすべての値は 次の式を用いて変換される: 10^(-rfc_level/20)

フレームがローカル由来のトラックから来る場合、レベルはソースから 直接取得されなければならず、ネゴシエートされている場合は [RFC6464] ヘッダー拡張用の値を生成する入力として使用されなければならない。

4.5. RTCEncodedAudioFrame インターフェイス

dictionary RTCEncodedAudioFrameOptions {
    RTCEncodedAudioFrameMetadata metadata;
};

[Exposed=(Window,DedicatedWorker), Serializable]
interface RTCEncodedAudioFrame {
    constructor(RTCEncodedAudioFrame originalFrame, optional RTCEncodedAudioFrameOptions options = {});
    attribute ArrayBuffer data;
    RTCEncodedAudioFrameMetadata getMetadata();
};

4.5.1. コンストラクター

constructor()

指定された originalFrame および options.[metadata] から、新しい RTCEncodedAudioFrame を作成する。新しく作成されたフレームは originalFrame から完全に独立しており、その [[data]]originalFrame.[[data]] の深いコピーである。 新しいフレームの [[metadata]]originalFrame.[[metadata]] の深いコピーであり、 フィールドは options.[metadata] に存在するフィールドの深いコピーで 置き換えられる。

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

  1. this.[[data]] を、[CloneArrayBuffer](originalFrame.[[data]], 0, originalFrame.[[data]].[[ArrayBufferByteLength]]) の結果とする。

  2. [[metadata]] を、この新しく構築された フレームに関連付けられたメタデータを表すものとする。

    1. originalFrame.[[getMetadata()]] の 各 {[[key]],[[value]]} ペアについて、 [[metadata]].[[key]][[value]] の深いコピーに設定する。

    2. options.[metadata] の 各 {[[key]],[[value]]} ペアについて、 [[metadata]].[[key]][[value]] の深いコピーに設定する。

4.5.2. メンバー

data, ArrayBufferArrayBuffer

エンコード済みフレームデータ。データの形式は、フレームのエンコード/デコードに 使用される音声コーデックに依存し、これは mimeType を見ることで判定できる。 取得時には、this.[[data]] が返されなければならない。設定時には、 this.[[data]] が新しい値に設定されなければならない。 次の表にいくつかの例を示す:

mimeType データ形式
audio/opus データは、 3 節で説明される Opus パケットである。[RFC6716]
audio/PCMU データは任意長のバイト列であり、各バイトは [ITU-G.711] の Table 2a および 2b で定義される u-law 符号化 PCM サンプルである。
audio/PCMA データは任意長のバイト列であり、各バイトは [ITU-G.711] の Tables 1a および 1b で定義される A-law 符号化 PCM サンプルである。
audio/G722 データは [ITU-G.722] で説明される G.722 音声である。
audio/RED データは、 3 節で説明される Redundant Audio Data である。[RFC2198]
audio/CN データは、 3 節で説明される Comfort Noise である。[RFC3389]

4.5.3. メソッド

getMetadata()

フレームに関連付けられたメタデータを返す。

4.5.4. 直列化

RTCEncodedAudioFrame オブジェクトは直列化可能オブジェクトである。 それらの直列化手順は、valueserialized、および forStorage が与えられ、次のとおりである:

  1. forStorage が true である場合、DataCloneError を投げる。

  2. serialized.[[metadata]]value のメタデータの内部表現に設定する。

  3. serialized.[[data]]value.[[data]]下位直列化に設定する。

それらの逆直列化手順は、serializedvalue および realm が与えられ、次のとおりである:

  1. value のメタデータを serialized.[[metadata]] のプラットフォームオブジェクト表現に設定する

  2. value.[[data]]serialized.[[data]]下位逆直列化に設定する。

5. RTCRtpScriptTransform インターフェイス

enum RTCRtpScriptTransformType {
    "sframe"
};

dictionary WorkerAndParameters {
     required Worker worker;
     RTCRtpScriptTransformType type;
};

typedef (Worker or WorkerAndParameters) WorkerOrWorkerAndParameters;

[Exposed=Window]
interface RTCRtpScriptTransform {
    constructor(WorkerOrWorkerAndParameters workerOrWorkerAndParameters, optional any options, optional sequence<object> transfer);
};

5.1. 内部スロット

RTCRtpScriptTransform オブジェクトは次の内部スロットを持つ:

内部スロット 説明(非規範的
[[worker]] コンストラクターで提供された Worker

5.2. コンストラクター

new RTCRtpScriptTransform(workerOrWorkerAndParameters, options, transfer) コンストラクター手順は次のとおりである:

  1. worker を undefined とする。

  2. useSFrame を undefined とする。

  3. workerOrWorkerAndParametersWorker オブジェクトである場合、workerworkerOrWorkerAndParameters に設定し、 useSFrame を false に設定する。

  4. そうでなければ、次のサブ手順を実行する:

    1. workerworkerOrWorkerAndParameters["worker"] に設定する。

    2. workerOrWorkerAndParameters["type"] が "sframe" である場合は useSFrame を true に、そうでなければ false に設定する。

  5. this の内部スロットを次のように初期化する:

    [[worker]]

    worker

  6. this.[[useSFrame]]useSFrame に初期化する。

  7. serializedOptionsStructuredSerializeWithTransfer(options, transfer) の結果とする。

  8. workerWorkerGlobalScope で、DOM 操作タスクソース上にグローバルタスクをキューに入れ、 次の手順を実行する:

    1. transformerOptionsStructuredDeserializeWithTransfer(serializedOptions, 現在の Realm) の結果とする。

    2. transformer を、transformerOptions を用いて RTCRtpScriptTransformer作成する結果とする。

    3. transformer関連グローバルオブジェクト上で、 RTCTransformEvent を用い、その transformertransformer に設定して、 rtctransform という名前のイベントを発火する

// FIXME: エラー処理を記述する(RTCRtpScriptTransform 作成時に worker closing flag が true である場合。 および transform がデータを処理している間に worker が終了される場合)。

5.3. アルゴリズム

RTCRtpScriptTransform は、rtcObject が与えられる次の関連付けアルゴリズムを持つ:

  1. transform を、関連付けアルゴリズム を所有する RTCRtpScriptTransform オブジェクトとする。

  2. frameSourcertcObject[[frameSource]] とする。

  3. workerGlobalScopetransform.[[worker]]WorkerGlobalScope とする。

  4. workerGlobalScope で、DOM 操作タスクソース上にグローバルタスクをキューに入れ、 次の手順を実行する:

    1. transformer を、transform に関連付けられた RTCRtpScriptTransformer オブジェクトとする。

    2. transformer.[[frameSource]]frameSource に設定する。

  5. 並列にframeSource.[[transformFrameAlgorithm]] を、入力として エンコード済み フレーム frame が与えられる次の手順に設定する:

    1. workerGlobalScope で、DOM 操作タスクソース上にグローバルタスクをキューに入れ、 次の手順を実行する:

      1. transformer を、transform に関連付けられた RTCRtpScriptTransformer オブジェクトとする。

      2. frame が動画フレームである場合は frame から新しい RTCEncodedVideoFrame を作成し、そうでなければ frame から新しい RTCEncodedAudioFrame を作成し、それを jsFrame とする。

      3. transformer および jsFrame を用いて readEncodedData を呼び出す。

    2. frameSource.[[processedFramesQueue]] が空でなくなるまで待機する。

    3. frameSource.[[processedFramesQueue]] からデキューした結果を返す。

RTCRtpScriptTransform は、次の関連付け解除アルゴリズムを持つ:

  1. transform を、関連付け解除 アルゴリズムを所有する RTCRtpScriptTransform オブジェクトとする。

  2. transform.[[worker]]WorkerGlobalScope で、DOM 操作タスクソース上にグローバルタスクをキューに入れ、 次の手順を実行する:

    1. transformer を、transform に関連付けられた RTCRtpScriptTransformer オブジェクトとする。

    2. transformer.[[readable]]キャンセルする

    3. transformer.[[writable]]中止する

6. RTCRtpScriptTransformer インターフェイス

[Exposed=DedicatedWorker]
interface RTCRtpScriptTransformer : EventTarget {
    // Attributes and methods related to the transformer source
    readonly attribute ReadableStream readable;
    Promise<undefined> generateKeyFrame(optional DOMString rid);
    Promise<undefined> sendKeyFrameRequest();
    // Attributes and methods related to the transformer sink
    readonly attribute WritableStream writable;
    attribute EventHandler onkeyframerequest;
    // Attributes for configuring the Javascript code
    readonly attribute any options;
};

6.1. 内部スロット

RTCRtpScriptTransformer オブジェクトは次の内部スロットを持つ:

内部スロット 説明(非規範的
[[frameSource]] エンコーダーデパケタイザー、または undefined。
[[options]] 省略可能な Object、 または null。
[[readable]] ReadableStream
[[writable]] WritableStream
[[lastReceivedFrameCounter]] 受信されたフレーム数。
[[lastEnqueuedFrameCounter]] エンキューされたフレーム数。
options オブジェクトが与えられたとき、 RTCRtpScriptTransformer作成するには、 次の手順を実行する:
  1. transformer を、次を伴う新しい RTCRtpScriptTransformer とする:

    [[frameSource]]

    undefined

    [[options]]

    options

    [[readable]]

    新しい ReadableStream

    [[writable]]

    新しい WritableStream

    [[lastReceivedFrameCounter]]

    0

    [[lastEnqueuedFrameCounter]]

    0

  2. transformer.[[readable]]設定する

    this をパラメーターとして与えられる readEncodedData アルゴリズムは、 エンコード済みフレームをそれに提供する。

  3. writeAlgorithm を、frame が与えられたときに、 this をパラメーターとして、frame を入力として writeEncodedData を実行する動作とする。

  4. transformer.[[writable]]設定し、 その writeAlgorithmwriteAlgorithm に設定し、その highWaterMarkInfinity に設定する。

    highWaterMark は、バックプレッシャーを明示的に無効化するために Infinity に設定される。

  5. transformer を返す。

6.2. メソッド

generateKeyFrame(rid) メソッド手順は次のとおりである:

  1. promise を新しい promise とする。

  2. promisethis.[[frameSource]] および rid を用いて キーフレーム生成アルゴリズムを実行する。

  3. promise を返す。

sendKeyFrameRequest() メソッド 手順は次のとおりである:

  1. promise を新しい promise とする。

  2. promise および this.[[frameSource]] を用いて キーフレーム要求送信 アルゴリズムを実行する。

  3. promise を返す。

6.3. 属性

options getter 手順は次のとおりである:

  1. this.[[options]] を返す。

readable getter 手順は次のとおりである:

  1. this.[[readable]] を返す。

writable getter 手順は次のとおりである:

  1. this.[[writable]] を返す。

onbandwidthestimate EventHandler は bandwidthestimate 型を持つ。

onkeyframerequest EventHandler は keyframerequest 型を持つ。

6.4. イベント

[Exposed=DedicatedWorker]
interface RTCTransformEvent : Event {
    readonly attribute RTCRtpScriptTransformer transformer;
};

partial interface DedicatedWorkerGlobalScope {
    attribute EventHandler onrtctransform;
};

[Exposed=DedicatedWorker]
interface KeyFrameRequestEvent : Event {
  constructor(DOMString type, optional DOMString rid);
  readonly attribute DOMString? rid;
};

次のイベントは RTCRtpScriptTransformer 上で発火する:

KeyFrameRequestEvent 型のイベントを生成する手順は次のとおりである:

関連付けられた RTCRtpScriptTransformer transformerエンコーダーが、 たとえば着信 RTCP Picture Loss Indication (PLI) または Full Intra Refresh (FIR) からキーフレーム要求を受信したとき、 次の手順を実行するためにタスクをキューに入れる:

  1. rid を適切なレイヤーの RID に設定する、または要求が特定のレイヤーに対するものではない場合は undefined に設定する。

  2. transformer に対して keyframerequest という名前のイベントを発火する。 その際、KeyFrameRequestEvent を用い、その cancelable 属性を "true" に初期化し、ridrid に設定する。

  3. イベントのキャンセル済みフラグが true である場合、これらの手順を中止する。

  4. 新しい promise、transformer.[[frameSource]] および rid を用いて キーフレーム生成アルゴリズムを実行する。

6.5. キーフレームアルゴリズム

promiseframeSource および rid が与えられる キーフレーム生成アルゴリズムは、次の手順を実行することにより定義される:

  1. frameSourceエンコーダーでない場合、promiseInvalidStateError で却下し、 これらの手順を中止する。

  2. encoderframeSource とする。

  3. encoder が動画 RTCRtpSender に属していない場合、promiseInvalidStateError で却下し、 これらの手順を中止する。

  4. rid が定義されているが、[RFC8851] の Section 10 で指定される文法要件に適合しない場合、 promiseTypeError で却下し、 これらの手順を中止する。

  5. 並列に、次の手順を実行する:

    1. layers を、この encoder に対するレイヤーの新しいリストとし、 negotiated encoding index の順に並べる。

    2. layers から、active でないすべてのレイヤー、または対応する RTCRtpSender track が終了しているすべてのレイヤーを削除する

    3. rid が undefined でない場合、layers から、RID が rid でない すべてのレイヤーを削除する

    注: rid が渡されない場合、 すべてのアクティブなレイヤーについてキーフレームが生成される。

    1. layers がここで空である場合、promiseNotFoundError で却下し、これらの手順を中止するためにタスクをキューに入れる

    2. layers から、 encoder.[[pendingKeyFrameTasks]] 内の任意のタスクの任意の [[layers]] 内にすでに見つかっているすべてのレイヤーを削除する

    3. task と呼ばれる pending key frame task を作成し、 task.[[layers]]layers に設定し、 task.[[promise]]promise に設定する。

    4. encoder.[[pendingKeyFrameTasks]] が undefined である場合、 encoder.[[pendingKeyFrameTasks]] を空の集合に初期化する。

    5. taskencoder.[[pendingKeyFrameTasks]]追加する

    6. layers 内の各 layer について(もしあれば)、 encoder に、その layer へ次に提供される動画フレームに対する キーフレームを生成するよう指示する。

RTCRtpScriptTransformer transformer に関連付けられた任意のエンコーダーについて、 ユーザーエージェントは、任意の frametransformer.[[readable]]エンキューされる直前に、次の手順を実行しなければならない:

  1. encodertransformer.[[frameSource]] とする。

  2. encoder.[[pendingKeyFrameTasks]] が undefined である場合、これらの手順を中止する。

  3. frame が動画 "key" フレームでない場合、これらの手順を中止する。

  4. encoder.[[pendingKeyFrameTasks]] 内の各 task について、次の手順を実行する:

    1. frametask.[[layers]] 内に含まれるレイヤーのために生成された場合、 次の手順を実行する:

      1. そのレイヤーを task.[[layers]] から削除する

      2. task.[[layers]] がここで空である場合、 taskencoder.[[pendingKeyFrameTasks]] から削除する

      3. task.[[promise]] を undefined で解決する

対応するキーフレームを RTCRtpScriptTransformer の readable にエンキューする直前に promise を解決することで、 promise の解決コールバックは、対応するキーフレームが公開される直前に常に実行される。 promise が複数のレイヤーに関連付けられている場合、それらすべてについてキーフレームがエンキューされた時点で解決される。

promise および frameSource が与えられる キーフレーム要求送信アルゴリズムは、 次の手順を実行することにより定義される:

  1. frameSourceデパケタイザーでない場合、promiseInvalidStateError で却下し、 これらの手順を中止する。

  2. depacketizerframeSource とする。

  3. depacketizer が動画 RTCRtpReceiver に属していない場合、promiseInvalidStateError で却下し、 これらの手順を中止する。

  4. 並列に、次の手順を実行する:

    1. depacketizer の receiver による Full Intra Request (FIR) の送信が適切と見なされない場合、 promise を undefined で解決し、これらの手順を中止する。 [RFC5104] の Section 4.3.1 は、Full Intra Request の送信がいつどのように適切であるかの指針を提供する。

    2. [RFC5104] の section 4.3.1 で定義される Full Intra Request (FIR) パケットを生成し、 depacketizer の receiver を通じて送信する。

    3. promise を undefined で解決 するためにタスクをキューに入れる

7. プライバシーとセキュリティに関する考慮事項

この API は、JavaScript にメディアストリームの内容へのアクセスを与える。これは Canvas や WebAudio など、他のソースからも利用可能である。

しかし、分離されているストリーム([WEBRTC-IDENTITY] で指定されるもの)または他のオリジンによって汚染されたストリームは、 この API を用いてアクセスできない。これは分離規則を破ることになるためである。

この API は、それ以外では利用できないタイミング情報のいくつかの側面へのアクセスを可能にし、 それによってフィンガープリンティング面が生じる。

この API はエンコード済みメディアへのアクセスを与える。つまり、JS アプリケーションは、 パケタイザーやデコーダーのような内部コンポーネントへ渡されるものを完全に制御できる。 これには、これらのコンポーネント内でデータがどのように扱われるかの監査に、 追加の注意が必要となる場合がある。

たとえば、パケタイザーは信頼されたエンコーダーからのデータのみを見ることを期待している場合があり、 信頼されていないソースからのデータ受信について監査されていない場合がある。

8.

解説 文書を参照。

適合性

文書 規約

適合性要件は、 記述的な表明と RFC 2119 用語を組み合わせて表現される。 この文書の規範的部分におけるキーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, および “OPTIONAL” は、RFC 2119 で説明されるとおりに解釈されるものとする。 ただし、読みやすさのため、 これらの語はこの仕様のすべての箇所で大文字で現れるわけではない。

この仕様のすべてのテキストは規範的である。 ただし、非規範的であると明示的に記された節、例、および注は除く。[RFC2119]

この仕様における例は、“例えば” という語で導入されるか、 class="example" により 規範的テキストから分離される。 次のように:

これは参考例の例である。

参考注記は “注” という語で始まり、 class="note" により 規範的テキストから分離される。 次のように:

注、これは参考注記である。

適合する アルゴリズム

アルゴリズムの一部として命令形で表現される要件 (たとえば "strip any leading space characters" または "return false and abort these steps") は、そのアルゴリズムを導入する際に使用されたキーワード ("must", "should", "may" など)の意味で解釈されるものとする。

アルゴリズムまたは特定の手順として表現される適合性要件は、 最終結果が等価である限り、 任意の方法で実装できる。 特に、この仕様で定義されるアルゴリズムは 理解しやすいことを意図しており、 高性能であることを意図していない。 実装者は最適化することが推奨される。

索引

この仕様で定義される用語

参照により 定義される用語

参照文献

規範的参照文献

[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. 2026年3月24日。 WD。URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[IANA-MEDIA-TYPES]
Media Types. URL: https://www.iana.org/assignments/media-types/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[MEDIACAPTURE-STREAMS]
Cullen Jennings; et al. Media Capture and Streams. 2025年10月9日。CRD。URL: https://www.w3.org/TR/mediacapture-streams/
[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
[RFC6464]
J. Lennox, Ed.; E. Ivov; E. Marocco. A Real-time Transport Protocol (RTP) Header Extension for Client-to-Mixer Audio Level Indication. 2011年12月。Proposed Standard。URL: https://www.rfc-editor.org/rfc/rfc6464
[RFC8851]
A.B. Roach, Ed.. RTP Payload Format Restrictions. 2021年1月。Proposed Standard。URL: https://www.rfc-editor.org/rfc/rfc8851
[RTP-EXT-CAPTURE-TIME]
RTP Header Extension for Absolute Capture Time. URL: https://datatracker.ietf.org/doc/draft-ietf-avtcore-abs-capture-time/
[STREAMS]
Adam Rice; et al. Streams Standard. Living Standard. URL: https://streams.spec.whatwg.org/
[WEBCODECS]
Paul Adenot; Eugene Zemtsov. WebCodecs. 2026年5月5日。 WD。URL: https://www.w3.org/TR/webcodecs/
[WEBCRYPTO-2]
Daniel Huigens. Web Cryptography Level 2. 2025年4月22日。 FPWD。URL: https://www.w3.org/TR/webcrypto-2/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/
[WEBRTC]
Cullen Jennings; et al. WebRTC: Real-Time Communication in Browsers. 2025年3月13日。REC。URL: https://www.w3.org/TR/webrtc/

参考参照文献

[AV1]
Peter de Rivaz; Jack Haughton. AV1 Bitstream & Decoding Process Specification. 2019年1月8日。Standard。URL: https://aomediacodec.github.io/av1-spec/av1-spec.pdf
[AV1-RTP-SPEC]
RTP Payload Format For AV1. Draft Deliverable. URL: https://aomediacodec.github.io/av1-rtp-spec/
[CloneArrayBuffer]
CloneArrayBuffer. URL: https://tc39.es/ecma262/#sec-clonearraybuffer
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[ITU-G.711]
G.711 : Pulse code modulation (PCM) of voice frequencies. URL: https://www.itu.int/rec/T-REC-G.711/
[ITU-G.722]
G.722 : 7 kHz audio-coding within 64 kbit/s. URL: https://www.itu.int/rec/T-REC-G.722/
[ITU-T-REC-H.264]
H.264 : Advanced video coding for generic audiovisual services. URL: https://www.itu.int/rec/T-REC-H.264
[RFC1982]
R. Elz; R. Bush. Serial Number Arithmetic. 1996年8月。Proposed Standard。URL: https://www.rfc-editor.org/rfc/rfc1982
[RFC2198]
C. Perkins; et al. RTP Payload for Redundant Audio Data. 1997年9月。Proposed Standard。URL: https://www.rfc-editor.org/rfc/rfc2198
[RFC3389]
R. Zopf. Real-time Transport Protocol (RTP) Payload for Comfort Noise (CN). 2002年9月。Proposed Standard。URL: https://www.rfc-editor.org/rfc/rfc3389
[RFC3550]
H. Schulzrinne; et al. RTP: A Transport Protocol for Real-Time Applications. 2003年7月。Internet Standard。URL: https://www.rfc-editor.org/rfc/rfc3550
[RFC5104]
S. Wenger; et al. Codec Control Messages in the RTP Audio-Visual Profile with Feedback (AVPF). 2008年2月。Proposed Standard。URL: https://www.rfc-editor.org/rfc/rfc5104
[RFC6386]
J. Bankoski; et al. VP8 Data Format and Decoding Guide. 2011年11月。Informational。URL: https://www.rfc-editor.org/rfc/rfc6386
[RFC6716]
JM. Valin; K. Vos; T. Terriberry. Definition of the Opus Audio Codec. 2012年9月。Proposed Standard。URL: https://www.rfc-editor.org/rfc/rfc6716
[RFC9605]
E. Omara; et al. Secure Frame (SFrame): Lightweight Authenticated Encryption for Real-Time Media. 2024年8月。Proposed Standard。URL: https://www.rfc-editor.org/rfc/rfc9605
[RTP-SFRAME-PAYLOAD]
RTP Payload Format for SFrame. URL: https://datatracker.ietf.org/doc/draft-ietf-avtcore-rtp-sframe/
[VP9]
VP9 Bitstream & Decoding Process Specification. URL: https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.6-20160331-draft.pdf
[WEBRTC-IDENTITY]
Cullen Jennings; Martin Thomson. Identity for WebRTC 1.0. 2018年9月27日。CR。URL: https://www.w3.org/TR/webrtc-identity/
[WEBRTC-NV-USE-CASES]
Bernard Aboba. WebRTC Extended Use Cases. 2023年12月14日。DNOTE。URL: https://www.w3.org/TR/webrtc-nv-use-cases/

IDL 索引

typedef (RTCRtpSFrameEncrypter or RTCRtpScriptTransform) RTCRtpSenderTransform;
typedef (RTCRtpSFrameDecrypter or RTCRtpScriptTransform) RTCRtpReceiverTransform;

// New methods for RTCRtpSender and RTCRtpReceiver
partial interface RTCRtpSender {
    attribute RTCRtpSenderTransform? transform;
};

partial interface RTCRtpReceiver {
    attribute RTCRtpReceiverTransform? transform;
};

// List of supported cipher suites, as defined in [[RFC9605]] section 4.5 and in https://datatracker.ietf.org/doc/draft-barnes-sframe-iana-256/.
enum SFrameCipherSuite {
     "AES_128_CTR_HMAC_SHA256_80",
     "AES_128_CTR_HMAC_SHA256_64",
     "AES_128_CTR_HMAC_SHA256_32",
     "AES_128_GCM_SHA256_128",
     "AES_256_GCM_SHA512_128",
     "AES_256_CTR_HMAC_SHA512_80",
     "AES_256_CTR_HMAC_SHA512_64",
     "AES_256_CTR_HMAC_SHA512_32"
};

dictionary SFrameTransformOptions {
    required SFrameCipherSuite cipherSuite;
};

enum SFrameType {
    "per-frame",
    "per-packet"
};

dictionary RTCRtpSFrameEncrypterOptions : SFrameTransformOptions {
    SFrameType type = "per-frame";
};

typedef [EnforceRange] unsigned long long SmallCryptoKeyID;
typedef (SmallCryptoKeyID or bigint) CryptoKeyID;

interface mixin SFrameEncrypterManager {
    Promise<undefined> setEncryptionKey(CryptoKey key, CryptoKeyID keyId);
};

interface mixin SFrameDecrypterManager {
    Promise<undefined> addDecryptionKey(CryptoKey key, CryptoKeyID keyId);
    Promise<undefined> removeDecryptionKey(CryptoKeyID keyId);
    attribute EventHandler onerror;
};

[Exposed=Window]
interface RTCRtpSFrameEncrypter {
    constructor(RTCRtpSFrameEncrypterOptions options);
};
RTCRtpSFrameEncrypter includes SFrameEncrypterManager;

[Exposed=Window]
interface RTCRtpSFrameDecrypter : EventTarget {
    constructor(SFrameTransformOptions options);
};
RTCRtpSFrameDecrypter includes SFrameDecrypterManager;

[Exposed=(Window,DedicatedWorker)]
interface SFrameEncrypterStream {
    constructor(SFrameTransformOptions options);
};
SFrameEncrypterStream includes GenericTransformStream;
SFrameEncrypterStream includes SFrameEncrypterManager;

[Exposed=(Window,DedicatedWorker)]
interface SFrameDecrypterStream : EventTarget {
    constructor(SFrameTransformOptions options);
};
SFrameDecrypterStream includes GenericTransformStream;
SFrameDecrypterStream includes SFrameDecrypterManager;

enum SFrameTransformErrorEventType {
    "authentication",
    "keyID",
    "syntax"
};

[Exposed=(Window,DedicatedWorker)]
interface SFrameTransformErrorEvent : Event {
    constructor(DOMString type, SFrameTransformErrorEventInit eventInitDict);

    readonly attribute SFrameTransformErrorEventType errorType;
    readonly attribute CryptoKeyID? keyID;
    readonly attribute any frame;
};

dictionary SFrameTransformErrorEventInit : EventInit {
    required SFrameTransformErrorEventType errorType;
    required any frame;
    CryptoKeyID? keyID;
};

dictionary RTCEncodedFrameMetadata {
    unsigned long synchronizationSource;
    octet payloadType;
    sequence<unsigned long> contributingSources;
    unsigned long rtpTimestamp;
    DOMHighResTimeStamp receiveTime;
    DOMHighResTimeStamp captureTime;
    DOMHighResTimeStamp senderCaptureTimeOffset;
    DOMString mimeType;
};

dictionary RTCEncodedVideoFrameMetadata : RTCEncodedFrameMetadata {
    unsigned long long frameId;
    sequence<unsigned long long> dependencies;
    unsigned short width;
    unsigned short height;
    unsigned long spatialIndex;
    unsigned long temporalIndex;
    long long timestamp;    // microseconds
};

dictionary RTCEncodedVideoFrameOptions {
    RTCEncodedVideoFrameMetadata metadata;
};

// New interfaces to define RTC specific encoded video and audio frames used by RTCRtpScriptTransform.
[Exposed=(Window,DedicatedWorker), Serializable]
interface RTCEncodedVideoFrame {
    constructor(RTCEncodedVideoFrame originalFrame, optional RTCEncodedVideoFrameOptions options = {});
    readonly attribute EncodedVideoChunkType type;
    attribute ArrayBuffer data;
    RTCEncodedVideoFrameMetadata getMetadata();
};

dictionary RTCEncodedAudioFrameMetadata : RTCEncodedFrameMetadata {
    short sequenceNumber;
    double audioLevel;
};

dictionary RTCEncodedAudioFrameOptions {
    RTCEncodedAudioFrameMetadata metadata;
};

[Exposed=(Window,DedicatedWorker), Serializable]
interface RTCEncodedAudioFrame {
    constructor(RTCEncodedAudioFrame originalFrame, optional RTCEncodedAudioFrameOptions options = {});
    attribute ArrayBuffer data;
    RTCEncodedAudioFrameMetadata getMetadata();
};

enum RTCRtpScriptTransformType {
    "sframe"
};

dictionary WorkerAndParameters {
     required Worker worker;
     RTCRtpScriptTransformType type;
};

typedef (Worker or WorkerAndParameters) WorkerOrWorkerAndParameters;

[Exposed=Window]
interface RTCRtpScriptTransform {
    constructor(WorkerOrWorkerAndParameters workerOrWorkerAndParameters, optional any options, optional sequence<object> transfer);
};

[Exposed=DedicatedWorker]
interface RTCRtpScriptTransformer : EventTarget {
    // Attributes and methods related to the transformer source
    readonly attribute ReadableStream readable;
    Promise<undefined> generateKeyFrame(optional DOMString rid);
    Promise<undefined> sendKeyFrameRequest();
    // Attributes and methods related to the transformer sink
    readonly attribute WritableStream writable;
    attribute EventHandler onkeyframerequest;
    // Attributes for configuring the Javascript code
    readonly attribute any options;
};

[Exposed=DedicatedWorker]
interface RTCTransformEvent : Event {
    readonly attribute RTCRtpScriptTransformer transformer;
};

partial interface DedicatedWorkerGlobalScope {
    attribute EventHandler onrtctransform;
};

[Exposed=DedicatedWorker]
interface KeyFrameRequestEvent : Event {
  constructor(DOMString type, optional DOMString rid);
  readonly attribute DOMString? rid;
};