WebRTC のためのスケーラブル映像符号化(SVC)拡張

W3C 作業草案

この文書に関する詳細
このバージョン:
https://www.w3.org/TR/2024/WD-webrtc-svc-20240817/
最新公開バージョン:
https://www.w3.org/TR/webrtc-svc/
最新エディターズドラフト:
https://w3c.github.io/webrtc-svc/
履歴:
https://www.w3.org/standards/history/webrtc-svc/
コミット履歴
エディター:
Bernard Aboba (Microsoft Corporation)
元エディター:
Peter Thatcher (Microsoft Corporation) - まで
フィードバック:
GitHub w3c/webrtc-svc (プルリクエスト, 新規イシュー, 未解決イシュー)
public-webrtc@w3.org へ、件名行を [webrtc-svc] … メッセージのトピック … として送信すること(アーカイブ
参加
メーリングリスト
IETF AVTCORE Working Group

概要

この文書は、WebRTC 仕様を拡張して、Scalable Video Coding (SVC) のエンコーディングパラメーターの構成を可能にするための、 WebIDL による一連の ECMAScript API を定義する。SVC エンコーダーおよびデコーダーの能力の発見は、 Media Capabilities 仕様によって扱われる。

この文書のステータス

この節は、この文書の公開時点における 文書のステータスを説明する。現在の W3C 公開物の一覧と、この技術レポートの最新リビジョンは、 https://www.w3.org/TR/ にある W3C 技術 レポート索引で確認できる。

この API は、W3C ORTC コミュニティグループで行われた予備作業に基づいている。

この文書は、Web Real-Time Communications Working Group により、 Recommendation track を用いる 作業草案として公開された。

作業草案としての公開は、 W3C およびその会員による承認を意味しない。

これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される可能性がある。 この文書を、進行中の作業以外のものとして引用することは不適切である。

この文書は、 W3C Patent Policy の下で運営されるグループによって作成された。 W3C は、このグループの成果物に関連して行われた 特許開示の公開リスト を維持している。そのページには、 特許を開示するための手順も含まれている。ある個人が、 Essential Claim(s) を含むと当該個人が考える特許について実際の知識を有している場合、その個人は、 W3C Patent Policy の第 6 節に従って その情報を開示しなければならない。

この文書は、 2023 年 11 月 03 日付 W3C Process Document によって管理される。

1. 序論

この節は非規範的である。

この仕様は、WebRTC 仕様 [WEBRTC] を拡張し、 Scalable Video Coding (SVC) のエンコーディングパラメーターの設定を可能にする。 SVC エンコーダーおよびデコーダーの能力の発見は、 Media Capabilities API [Media-Capabilities] によって扱われる。

この仕様は、WebRTC オブジェクトおよびメソッドの挙動を変更しない。 したがって、Offer/Answer 交渉および エンコーディングパラメーターに関する制約は、[WEBRTC] Section 5.2 に記述されているとおり維持される: 「setParameters() は SDP 再交渉を引き起こさず、 Offer/Answer によって交渉された範囲内でメディアスタックが送信または受信しているものを 変更するためにのみ使用できる。」

その結果、この仕様は、 VP8 [RFC6386]、VP9 [VP9] および AV1 [AV1] コーデックのような、 Offer/Answer で SVC サポートを交渉しないコーデックについて、 エンコーディングパラメーターを設定できる。 時間的スケーラビリティの設定は、 H.264 [ITU-T-REC-H.264] および H.265 [ITU-T-REC-H.265] コーデックについてもサポートされ得る。

2. 適合性

非規範的であると記された節に加え、この仕様におけるすべての著作ガイドライン、図、例、および注は 非規範的である。この仕様のそれ以外のすべては規範的である。

この文書におけるキーワード MAYMUST、および SHOULD は、 ここに示すようにすべて大文字で出現する場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているように解釈される。

この仕様は、この仕様に含まれるインターフェイスを実装する ユーザーエージェントという単一の製品に適用される適合性基準を定義する。

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

ECMAScript を用いてこの仕様で定義される API を実装する実装は、 Web IDL 仕様 [WEBIDL] で定義される ECMAScript Bindings と整合する方法でそれらを実装しなければならない(MUST)。 これは、この仕様がその仕様および用語を使用するためである。

3. 用語

「simulcast envelope」という用語は、[WEBRTC] Section 5.4.1 で定義される。

この仕様は、[WEBRTC] で定義される オブジェクト、メソッド、内部スロット および辞書を参照する。

Scalable Video Coding (SVC) については、「single-session transmission」 (SST) および「multi-session transmission」 (MST) という用語は、 [RFC6190] で定義される。この仕様は SST のみをサポートし、 MST はサポートしない。

「Single Real-time Transport Protocol stream Single Transport」 (SRST) という用語は、 [RFC7656] Section 3.7 で定義され、 単一のトランスポート内で、 単一の Real-time Transport Protocol (RTP) ストリームおよび 同期ソース (SSRC) を使用してすべてのレイヤーを送信する SVC 実装を指す。「Multiple RTP stream Single Transport」 (MRST) という用語も [RFC7656] Section 3.7 で定義され、 単一のトランスポート内で、 各レイヤーごとに異なる SSRC を持つ複数の RTP ストリームを使用して すべてのレイヤーを送信する実装を指す。 この仕様は SRST のみをサポートし、MRST はサポートしない。 SRST をサポートする RTP ペイロード仕様を持つコーデックには、VP8 [RFC7741]、VP9 [VP9-PAYLOAD]、AV1 [AV1-RTP-SPEC]、H.264 [RFC6184] および H.265 [RFC7798] が含まれる。

「S mode」という用語は、同じ SSRC 上で複数の エンコーディングが送信されるスケーラビリティモードを指す。これには、"S2T1""S2T1h""S2T2""S2T2h""S2T3""S2T3h""S3T1""S3T1h""S3T2""S3T2h""S3T3" および "S3T3h"scalabilityMode 値が含まれる。

Selective Forwarding Middlebox (SFM) という用語は、[RFC7667] の Section 3.7 で定義される。

4. 設定

この仕様は、RTCRtpEncodingParameters 辞書を拡張することにより、SVC のためのエンコーディングパラメーターの設定を可能にする。

4.1 RTCRtpEncodingParameters 辞書拡張

WebIDLpartial dictionary RTCRtpEncodingParameters {
             DOMString scalabilityMode;
};

辞書 RTCRtpEncodingParameters メンバー

scalabilityMode、型 DOMString

このストリームに使用されるスケーラビリティモードの 大文字小文字を区別する識別子。スケーラビリティモードは Section 5 で定義される。

4.2 挙動

[WEBRTC] は、 addTransceiver() (Section 5.1) および setParameters() (Section 5.2) におけるエラー処理を記述しており、 サポートされていないエンコーディングパラメーターによる "hardware-encoder-error" を示すための RTCError の使用、 およびその他のエラーを含む。 実装は、無効な scalabilityMode 値が setParameters() または addTransceiver() に提供された場合、規定された方法で RTCError およびその他のエラーを利用する。

4.2.1 addTransceiver()

[WEBRTC] Section 5.1 は、 sendEncodings の検証を addTransceiver() 内で記述している。 scalabilityMode を検証するため、 addTransceiver sendEncodings validation steps の step 3 の後に次の手順を追加する:

  1. sendEncodings が、RTCRtpEncodingParameters.codeccodec存在するエンコーディングであって、同じエンコーディングの scalabilityMode 値が codec によってサポートされていないものを含む場合、 throw an OperationError.
  2. そうでなく、sendEncodings が、 scalabilityMode 値が kind に対する 実装済み送信コーデックの一覧 内のいずれのコーデックによってもサポートされていないエンコーディングを含む場合、 throw an OperationError.
  3. sendEncodings に格納された RTCRtpEncodingParameters が、値が true である active メンバーを持つエンコーディングを 2 つ以上含み、 かつ sendEncodings が、 scalabilityMode 値が "S mode" を表し、かつその active メンバーの値が true であるエンコーディングを含む場合、throw an OperationError.

addTransceiver() および setCodecPreferences() メソッドが Offer/Answer 交渉の完了前に呼び出される場合、 交渉されるコーデックおよびその能力は知られていないことがある。この状況では、 scalabilityMode values configured in sendEncodings に設定された値が、最終的に交渉されるコーデックによってサポートされないことがある。 しかし、要求された scalabilityMode 値が サポートされるいずれのコーデックに対しても無効である場合、または混合サイマルキャストトランスポートが要求された場合にのみ、 エラーが発生する。

目的の scalabilityMode 値を適用できることを確保するために、setCodecPreferences() を使用して、目的の設定をサポートするコーデックを優先する、またはそれらのみを含めることができる。 たとえば、時間的スケーラビリティが空間サイマルキャストとともに必要な場合、 addTransceiver() が呼び出されるときに、 sendEncodings を、異なる解像度を持つ複数の サイマルキャストストリームを送信し、各ストリームが時間的スケーラビリティを利用するように設定できる。 VP8、VP9 および AV1 コーデック実装のみが時間的スケーラビリティをサポートする場合、 setCodecPreferences() を使用して H.264/AVC コーデックを Offer から削除し、時間的スケーラビリティをサポートするコーデックが 交渉される可能性を高めることができる。

sendEncodings を使用して addTransceiver() により複数のサイマルキャストストリームの送信を要求する場合、 "S mode" は要求できない。ブラウザーは、 複数の SSRC と RID を持つサイマルキャストエンコーディングを送信するように、 または代替として、すべてのサイマルキャストエンコーディングを単一の RTP ストリームで送信するようにのみ設定できる。両方のサイマルキャストトランスポート技法を 同時に使用することは許可されない。

4.2.2 setParameters()

[WEBRTC] Section 5.2 は、 setParameters() 内での parameters の検証を記述している。 操作が InvalidModificationError で拒否された promise を生じさせる 次の条件を、 setParameters validation steps の (step 4) に挿入する:

  1. encodings が、既存の RTCRtpEncodingParameters.codec 値 codec を持つエンコーディングであって、その同じエンコーディングの scalabilityMode 値が codec によってサポートされていないものを含む場合。
  2. そうでなく、sender.[[SendCodecs]]空である かつ encodings が、 scalabilityMode 値が kind に対する 実装済み送信コーデックの一覧 内のいずれのコーデックによってもサポートされていないエンコーディングを含む場合。
  3. そうでなく、sender.[[SendCodecs]]空でない かつ encodings が、そのエンコーディングの RTP ストリームに使用されるコーデックによって scalabilityMode 値が サポートされていないエンコーディングを含む場合。
  4. encodings に格納された RTCRtpEncodingParameters が、値が true である active メンバーを持つエンコーディングを 2 つ以上含み、 かつ encodings が、 scalabilityMode 値が "S mode" を表し、かつその active メンバーの値が true であるエンコーディングを含む場合。

"L1T1" スケーラビリティモードは、 setParameters() を使用して SVC エンコーディングをオフにすることを可能にする。 "L1T1"setParameters() を使用して設定された場合、 getParameters() への応答として返される。

4.2.3 getParameters()

初期交渉が完了する前、 getParameters() は、encodings 内の各エンコーディングについて、 scalabilityMode 値を、 addTransceiver() または setParameters() によって最後に設定されたものとして返す。 encodings 内のエンコーディングに scalabilityMode 値が提供されていない場合、 または値が正常に設定されなかった場合、 getParameters() はそのエンコーディングについて scalabilityMode 値を返さない。

初期交渉が完了した後、getParameters() は、初期交渉前に値を持っていた encodings 内の各エンコーディングについて、 現在設定されている scalabilityMode 値を返す。これは、 addTransceiver() または setParameters() で要求された値と異なることがある(MAY)。 たとえば、交渉中に選択されたコーデックに、目的の scalabilityMode 値をサポートするエンコーダーが含まれていない場合、ユーザーエージェントは別の値を選択することがある(MAY)。 設定が満足できない場合、setParameters() を使用して変更できる。

addTransceiver() または setParameters() が、encodings 内の エンコーディングについて scalabilityMode 値を提供しなかった場合、 初期交渉が完了した後、 getParameters()scalabilityMode 値を返さず、エンコーダーは そのエンコーディングの RTP ストリームに対するコーデックの デフォルトの scalabilityMode を使用する。 各コーデックのデフォルトの scalabilityMode は実装依存である。デフォルトの scalabilityMode は、時間的スケーラビリティモードのいずれか (例: "L1T1""L1T2""L1T3" など)であるべきである(SHOULD)。

4.2.4 交渉上の問題

この節は非規範的である。

SVC は、ビデオ会議で最もよく用いられる。そこでは、 SFM のような会議サーバーが、参加者のデバイス特性および利用可能な帯域幅に基づいて レイヤーを選択的に転送する。そのような環境では、 アプリケーションは会議サーバーとの間で送受信されるコーデックを交渉する。 しかし、スケーラビリティモードは Offer/Answer で交渉されないため、 アプリケーションは、ブラウザーおよび会議サーバーがどのスケーラビリティモードをサポートするかを 他の手段によって判断する必要がある。

[Media-Capabilities] API は、 スケーラブル映像符号化に対するエンコーダーおよびデコーダーの サポートの発見を可能にする。scalabilityMode は、エンコーダーが scalabilityMode 値をサポートするかどうかを問い合わせるために使用され、それが "supported"、"smooth" および "power efficient" であるかどうかを示す。

[Media-Capabilities] API は、 空間スケーラビリティモードに対するデコーダーサポートに関する情報も提供する。 spatialScalability は、デコーダーが空間予測をサポートする能力を持つかどうかを示す。 これには、現在の解像度とは異なる解像度のフレームを依存関係として使用する能力が必要である。 spatialScalabilitytrue に設定されている場合、デコーダーはエンコーダーによってサポートされる任意の scalabilityMode 値をデコードできる。 spatialScalabilityfalse に設定されている、または存在しない場合、デコーダーは空間スケーラビリティモードをデコードできないが、 エンコーダーによってサポートされるその他すべての scalabilityMode 値をデコードできる。

アプリケーションが、利用可能なコーデックと scalabilityMode 値の組み合わせを判断した後、 これらの組み合わせのどれが SFM によってサポートされるかを判断する必要がある。 これを処理する一つの方法は、SFM が転送できるコーデックと スケーラビリティモードの組み合わせを受信側能力の形で示すことである。 SFM の能力を受け取った後、アプリケーションは、 ブラウザーの RTCRtpSenderSFM の受信側によってサポートされる コーデックおよび scalabilityMode 値の共通部分を計算できる。これは、ブラウザーの addTransceiver() および setParameters() メソッドに渡される引数を判断するために使用できる。

以下はいくつかの例である:

  1. コーデックペイロードを解析する SFM は、 スケーラビリティなしの H.264/AVC コーデックと、 時間的スケーラビリティを伴う VP8 コーデックのみをサポートする場合がある。 一方で、ブラウザーは、時間的スケーラビリティを伴う VP8、時間的および空間的スケーラビリティを伴う VP9 および AV1、 ならびに時間的スケーラビリティを伴う H.264/AVC をエンコードできる場合がある。 この例では、SVC の使用を望むアプリケーションは、 時間的スケーラビリティを伴う VP8 のみをエンコードできる。
  2. SFM は、AV1 コーデックで "S2T1" および "S2T1h" スケーラビリティ モードを使用する単一ストリームサイマルキャストのみをサポートする場合がある一方、ブラウザーは VP9 および AV1 コーデックの両方で、"S2T1""S2T1h""S3T1" および "S3T1h" モードを使用する単一 ストリームサイマルキャストのエンコードをサポートする場合がある。この例では、 アプリケーションは AV1 コーデックで最大 2 レイヤーの 単一ストリームサイマルキャストのみを使用できる。アプリケーションが 3 レイヤーを利用することを好む場合、単一ストリームサイマルキャストの使用を見送り、 代わりにマルチストリームサイマルキャストを交渉することを決定してもよい。

ブラウザーと SFM の能力の共通部分を計算する際に、 RTP ヘッダー拡張を考慮に入れる必要がある状況がある。 SFM がコーデックペイロードを解析できない場合 (解析するように設計されていないため、またはペイロードが暗号化されているため)、 [AV1-RTP-SPEC] の Appendix A で定義される AV1 Dependency Descriptor のような RTP ヘッダー拡張の交渉が、 SFM が特定のコーデックを転送するために必要となることがある。 これを考慮するため、コーデックの転送に必要な RTP ヘッダー拡張を SFM の受信側能力に追加できる。するとアプリケーションは、 ブラウザーの RTCRtpSenderSFM の受信側によってサポートされる コーデック、ヘッダー拡張および scalabilityMode 値の共通部分を計算できる。

5. スケーラビリティモード

この仕様でサポートされる scalabilityMode 値は、 それらに関連付けられた識別子および特性とともに、下の表に示される。 scalabilityMode 値の名前 (大文字小文字を区別する)が、[AV1] Section 6.7.5 で割り当てられた スケーラビリティモード識別子、および Section 9 で提供される依存関係図へのリンクとともに提供される。

[AV1] および VP9 [VP9] 仕様は、 表で定義されるすべての scalabilityMode 値をサポートするが、 他のコーデック仕様はそうではない。たとえば、VP8 [RFC6386]、H.264 [RFC6184] および H.265 [RFC7798] は、 時間的スケーラビリティ(例: "L1T2""L1T3")のみをサポートする。 また、VP8 [RFC6386]、H.264 [RFC6184] および H.265 [RFC7798] は、 異なる SSRC 上でのサイマルキャストの転送のみを許可するため、 (複数のエンコーディングが単一の RTP ストリーム上で転送される)"S" モードはサポートされない。

スケーラビリティモード識別子 空間レイヤー 解像度比 時間レイヤー レイヤー間依存関係 AV1 scalability_mode_idc
"L1T1" 1 1 該当なし
"L1T2" 1 2 SCALABILITY_L1T2
"L1T3" 1 3 SCALABILITY_L1T3
"L2T1" 2 2:1 1 あり SCALABILITY_L2T1
"L2T2" 2 2:1 2 あり SCALABILITY_L2T2
"L2T3" 2 2:1 3 あり SCALABILITY_L2T3
"L3T1" 3 2:1 1 あり SCALABILITY_L3T1
"L3T2" 3 2:1 2 あり SCALABILITY_L3T2
"L3T3" 3 2:1 3 あり SCALABILITY_L3T3
"L2T1h" 2 1.5:1 1 あり SCALABILITY_L2T1h
"L2T2h" 2 1.5:1 2 あり SCALABILITY_L2T2h
"L2T3h" 2 1.5:1 3 あり SCALABILITY_L2T3h
"L3T1h" 3 1.5:1 1 あり
"L3T2h" 3 1.5:1 2 あり
"L3T3h" 3 1.5:1 3 あり
"S2T1" 2 2:1 1 なし SCALABILITY_S2T1
"S2T2" 2 2:1 2 なし SCALABILITY_S2T2
"S2T3" 2 2:1 3 なし SCALABILITY_S2T3
"S2T1h" 2 1.5:1 1 なし SCALABILITY_S2T1h
"S2T2h" 2 1.5:1 2 なし SCALABILITY_S2T2h
"S2T3h" 2 1.5:1 3 なし SCALABILITY_S2T3h
"S3T1" 3 2:1 1 なし SCALABILITY_S3T1
"S3T2" 3 2:1 2 なし SCALABILITY_S3T2
"S3T3" 3 2:1 3 なし SCALABILITY_S3T3
"S3T1h" 3 1.5:1 1 なし SCALABILITY_S3T1h
"S3T2h" 3 1.5:1 2 なし SCALABILITY_S3T2h
"S3T3h" 3 1.5:1 3 なし SCALABILITY_S3T3h
"L2T2_KEY" 2 2:1 2 あり SCALABILITY_L3T2_KEY
"L2T2_KEY_SHIFT" 2 2:1 2 あり SCALABILITY_L3T2_KEY_SHIFT
"L2T3_KEY" 2 2:1 3 あり SCALABILITY_L3T3_KEY
"L2T3_KEY_SHIFT" 2 2:1 3 あり SCALABILITY_L3T3_KEY_SHIFT
"L3T1_KEY" 3 2:1 1 あり
"L3T2_KEY" 3 2:1 2 あり SCALABILITY_L4T5_KEY
"L3T2_KEY_SHIFT" 3 2:1 2 あり SCALABILITY_L4T5_KEY_SHIFT
"L3T3_KEY" 3 2:1 3 あり SCALABILITY_L4T7_KEY
"L3T3_KEY_SHIFT" 3 2:1 3 あり SCALABILITY_L4T7_KEY_SHIFT

5.1 scalabilityMode 値の追加に関するガイドライン

scalabilityMode 値を提案する場合、 次の原則に従うべきである:

  1. 提案される scalabilityMode は、 Section 5 の表に対するエントリーを定義しなければならない(MUST)。 これには、Scalability Mode Identifier、空間および時間レイヤー、 Resolution Ratio、Inter-layer dependency、および対応する AV1 scalability_mode_idc 値(割り当てられている場合)の値が含まれる。
  2. Scalability Mode Identifier は、既存の命名方式と整合しているべきである(SHOULD)。この方式は、 2:1 の解像度比を使用する x 個の空間レイヤーと y 個の時間レイヤーを持つ scalabilityMode を表すために LxTy を利用する。 LxTyh は、1.5:1 の解像度比を持つ x 個の空間レイヤーと y 個の時間レイヤーを表す。SxTy は、2:1 の解像度比を持つ x 個のサイマルキャストエンコーディングを持ち、各 サイマルキャストエンコーディングが y 個の時間レイヤーを含む scalabilityMode を表す。SxTyh は 1.5:1 の解像度比を表す。LxTy_KEY は、 2:1 の解像度比を使用する x 個の空間レイヤーと y 個の時間レイヤーを持ち、 空間レイヤーがキーフレームでのみ下位の空間レイヤーに依存する scalabilityMode を表す。LxTy_KEY_SHIFT モードは、 2:1 の解像度比を使用する x 個の空間レイヤーと y 個の時間レイヤーを持ち、空間レイヤーがキーフレームでのみ下位の空間レイヤーに依存し、 後続フレームでは時間識別子が上方にシフトされる scalabilityMode を表す。
  3. 依存関係図は、Section 9 で提供される形式で提供されなければならない(MUST)。

6.

6.1 空間サイマルキャスト と時間的スケーラビリティ

この節は非規範的である。

この例は、[WEBRTC] Section 7.1 (Example 1) を拡張し、各サイマルキャストレイヤーに SSRC と RID を使用して、 それぞれが 3 つの時間レイヤーを持つ 3 つの空間 サイマルキャストレイヤーを送信することを示す。 元の例から変更されているのは "sendEncodings" 属性のみである。

const signaling = new SignalingChannel(); // JSON.stringify/parse を扱う
const constraints = {audio: true, video: true};
const configuration = {'iceServers': [{'urls': 'stun:stun.example.org'}]};
let pc;

// 開始するために start() を呼び出す
async function start() {
  pc = new RTCPeerConnection(configuration);

  // "negotiationneeded" イベントに offer 生成をトリガーさせる
  pc.onnegotiationneeded = async () => {
    try {
      await pc.setLocalDescription();
      // offer を相手ピアに送信する
      signaling.send({description: pc.localDescription});
    } catch (err) {
      console.error(err);
    }
  };

  try {
    // ローカルストリームを取得し、self-view に表示して送信用に追加する
    const stream = await navigator.mediaDevices.getUserMedia(constraints);
    selfView.srcObject = stream;
    pc.addTransceiver(stream.getAudioTracks()[0], {direction: 'sendonly'});
    pc.addTransceiver(stream.getVideoTracks()[0], {
      direction: 'sendonly',
      sendEncodings: [
        {rid: 'q', scaleResolutionDownBy: 4.0, scalabilityMode: 'L1T3'},
        {rid: 'h', scaleResolutionDownBy: 2.0, scalabilityMode: 'L1T3'},
        {rid: 'f', scalabilityMode: 'L1T3'}
      ]
    });
  } catch (err) {
    console.error(err);
  }
}

signaling.onmessage = async ({data: {description, candidate}}) => {
  try {
    if (description) {
      await pc.setRemoteDescription(description);
      // offer を受け取った場合は、answer で応答する必要がある
      if (description.type == 'offer') {
        await pc.setLocalDescription();
        signaling.send({description: pc.localDescription});
      }
    } else if (candidate) {
      await pc.addIceCandidate(candidate);
    }
  } catch (err) {
    console.error(err);
  }
};

これは、2 つの空間レイヤー(2:1 の比率)と 3 つの時間レイヤーを持つ例である。

let sendEncodings = [
  {scalabilityMode: 'L2T3'}
];

これは、各サイマルキャストレイヤーが 3 つの時間レイヤーを持つ、混合コーデックサイマルキャストの例である。

let sendEncodings = [
  {rid: 'q', codec: {clockRate: 90000, mimeType: 'video/AV1'}, scaleResolutionDownBy: 4.0, scalabilityMode: 'L1T3'},
  {rid: 'h', codec: {clockRate: 90000, mimeType: 'video/VP8'}, scaleResolutionDownBy: 2.0, scalabilityMode: 'L1T3'},
  {rid: 'f', codec: {clockRate: 90000, mimeType: 'video/VP8'}, scalabilityMode: 'L1T3'}
];

これは、単一の SSRC 上で、それぞれが 3 つの時間レイヤーを持つ 3 つの空間サイマルキャストレイヤーを持つ例である。

let sendEncodings = [
  {scalabilityMode: 'S3T3'}
]

6.2 SVC エンコーダー能力

この節は非規範的である。

これは、[WEBRTC] および [Media-Capabilities] を実装するブラウザーによって返される encodingInfo(configuration) の例である。

const contentType = 'video/VP9';

const configuration = {
  type: 'webrtc',
  video: {
    contentType,
    width: 640,
    height: 480,
    bitrate: 10000,
    framerate: 29.97,
    scalabilityMode: 'L3T3_KEY'
  }
};

try {
  const info = await navigator.mediaCapabilities.encodingInfo(configuration);

  if (!info.supported) {
    console.log(`${contentType} is unsupported.`);
    return;
  }
  console.log(`${contentType} is ${info.smooth || 'NOT '}smooth, and ` +
              `${info.powerEfficient || 'NOT '}power efficient`);
} catch (err) {
  console.error(err, ' caused encodingInfo to fail');
}

6.3 SFM 能力

この節は非規範的である。

これは、VP8、VP9 および AV1 の時間的スケーラビリティモードの転送のみを サポートする SFM によって返される受信側能力の例である。

 "codecs": [
    {
      "clockRate": 90000,
      "mimeType": "video/VP8",
      "scalabilityModes": [
        "L1T1",
        "L1T2",
        "L1T3"
      ]
    },
    {
      "clockRate": 90000,
      "mimeType": "video/VP9",
      "scalabilityModes": [
        "L1T1",
        "L1T2",
        "L1T3"
      ]
    },
    {
      "clockRate": 90000,
      "mimeType": "video/AV1",
      "scalabilityModes": [
        "L1T1",
        "L1T2",
        "L1T3"
      ]
    }
]

7. プライバシーに関する考慮事項

この節は非規範的である。

この節は非規範的である。これは新しい挙動を規定するものではなく、 代わりに、この仕様の他の部分にすでに存在する情報を 要約するものである。WebRTC API に関するプライバシー上の考慮事項は、 [WEBRTC] Section 13 に記述されている。

7.1 永続的情報

WebRTC では、スケーラブル符号化ツールの使用は ピア間で交渉されないため、サポートされる scalabilityMode 値も 空間予測に対するデコーダーサポートも SDP には公開されない。

setParameters() API を使用して各コーデックに対する scalabilityMode 値を 設定しようとすることで、 アプリケーションは、どの設定試行が成功し、 どの設定試行が失敗するかを記録することにより、 エンコーダーによってサポートされる値を判断できる。 しかし、これは scalabilityMode 値がハードウェアエンコーダーまたはソフトウェアエンコーダー (またはその両方)によってサポートされているかどうかを示すものではない。 setParameters()RTCRtpReceiver では サポートされないため、デコーダーサポートを判断するために同等の 実験を実行することはできない。

ソフトウェアエンコーダーによってサポートされる scalabilityMode 値は通常、ハードウェアでサポートされる値の 上位集合であるため、これらの実験から得られる情報は、 使用中のブラウザーと高い相関を持つ。この情報はすでに ウェブページに利用可能である。メディアが流れ始めると、 使用中のコーデックに対する性能特性、または scalabilityMode 値が デコード可能であるかどうかに関する情報を取得でき、 これはハードウェア能力に関するさらなる情報を提供する。

[Media-Capabilities] Section 3.1 で述べられているように、Media Capabilities API は、この仕様から利用可能な情報よりも 「より正確で一貫した情報を提供する可能性が高い」。 [Media-Capabilities] Section 3.1 で述べられているように、 「この情報は、特定の種類のデバイスが非常に類似したデコード/エンコード 能力を持つことが期待されるため、ウェブページにすでに利用可能な他の情報と 高い相関を持つことが予想される」。

8. セキュリティに関する考慮事項

この節は非規範的である。

この節は非規範的である。これは新しい挙動を規定するものではなく、 代わりに、この仕様の他の部分にすでに存在する情報を 要約するものである。WebRTC プロトコルのセキュリティ上の考慮事項は [RFC8827] に記述されており、WebRTC API に関するセキュリティおよびプライバシー上の考慮事項は [WEBRTC] Section 13 に記述されている。

9. スケーラビリティモード依存関係 図

この仕様で定義されるスケーラビリティモードの依存関係図を 以下に示す。

9.1 L1T1

L1T1: 単一レイヤー
1 L1T1: 1 レイヤーエンコーディング

9.2 L1T2

L1T2: 2 レイヤー時間的スケーラビリティエンコーディング
2 L1T2: 1 レイヤー空間および 2 レイヤー時間的スケーラビリティエンコーディング

9.3 L1T3

L1T3: 3 レイヤー時間的スケーラビリティエンコーディング
3 L1T3: 1 レイヤー空間および 3 レイヤー時間的スケーラビリティエンコーディング

9.4 L2T1 および L2T1h

L2T1 および L2T1h: 2 レイヤー空間および 1 レイヤー時間的スケーラビリティエンコーディング
4 L2T1 および L2T1h: 2 レイヤー空間および 1 レイヤー時間的スケーラビリティエンコーディング

9.5 L2T1_KEY

L2T1_KEY: 2 レイヤー空間および 1 レイヤー時間的スケーラビリティ K-SVC エンコーディング
5 L2T1_KEY: 2 レイヤー空間および 1 レイヤー時間的スケーラビリティ K-SVC エンコーディング

9.6 L2T2 および L2T2h

L2T2 および L2T2h: 2 レイヤー空間および 2 レイヤー時間的スケーラビリティエンコーディング
6 L2T2 および L2T2h: 2 レイヤー空間および 2 レイヤー時間的スケーラビリティエンコーディング

9.7 L2T2_KEY

L2T2_KEY: 2 レイヤー空間および 2 レイヤー時間的スケーラビリティ K-SVC エンコーディング
7 L2T2_KEY: 2 レイヤー空間および 2 レイヤー時間的スケーラビリティ K-SVC エンコーディング

9.8 L2T2_KEY_SHIFT

L2T2_KEY_SHIFT: 2 レイヤー空間および 2 レイヤー時間的スケーラビリティ、時間シフト付き K-SVC シフトエンコーディング
8 L2T2_KEY_SHIFT: 2 レイヤー空間および 2 レイヤー時間的スケーラビリティ、時間 シフト付き K-SVC エンコーディング

9.9 L2T3 および L2T3h

L2T3 および L2T3h: 2 レイヤー空間および 3 レイヤー時間的スケーラビリティエンコーディング
9 L2T3 および L2T3h: 2 レイヤー空間および 3 レイヤー時間的スケーラビリティエンコーディング

9.10 L2T3_KEY

L2T3_KEY: 2 レイヤー空間および 3 レイヤー時間的スケーラビリティ K-SVC エンコーディング
10 L2T3_KEY: 2 レイヤー空間および 3 レイヤー時間的スケーラビリティ K-SVC エンコーディング

9.11 L2T3_KEY_SHIFT

L2T3_KEY_SHIFT: 2 レイヤー空間および 3 レイヤー時間的スケーラビリティ、時間シフト付き K-SVC シフトエンコーディング
11 L2T3_KEY_SHIFT: 2 レイヤー空間および 3 レイヤー時間的スケーラビリティ、時間 シフト付き K-SVC エンコーディング

9.12 L3T1 および L3T1h

L3T1 および L3T1h: 3 レイヤー空間および 1 レイヤー時間的スケーラビリティエンコーディング
12 L3T1 および L3T1h: 3 レイヤー空間および 1 レイヤー時間的スケーラビリティエンコーディング

9.13 L3T1_KEY

L3T1_KEY: 3 レイヤー空間および 1 レイヤー時間的スケーラビリティ K-SVC エンコーディング
13 L3T1_KEY: 3 レイヤー空間および 1 レイヤー時間的スケーラビリティ K-SVC エンコーディング

9.14 L3T2 および L3T2h

L3T2 および L3T2h: 3 レイヤー空間および 2 レイヤー時間的スケーラビリティエンコーディング
14 L3T2 および L3T2h: 3 レイヤー空間および 2 レイヤー時間的スケーラビリティエンコーディング

9.15 L3T2_KEY

L3T2_KEY: 3 レイヤー空間および 2 レイヤー時間的スケーラビリティ K-SVC エンコーディング
15 L3T2_KEY: 3 レイヤー空間および 2 レイヤー時間的スケーラビリティ K-SVC エンコーディング

9.16 L3T2_KEY_SHIFT

L3T2_KEY_SHIFT: 3 レイヤー空間および 2 レイヤー時間的スケーラビリティ、時間シフト付き K-SVC
16 L3T2_KEY_SHIFT: 3 レイヤー空間および 2 レイヤー時間的スケーラビリティ、時間シフト付き K-SVC

9.17 L3T3 および L3T3h

L3T3 および L3T3h: 3 レイヤー空間および 3 レイヤー時間的スケーラビリティエンコーディング
17 L3T3 および L3T3h: 3 レイヤー空間および 3 レイヤー時間的スケーラビリティエンコーディング

9.18 L3T3_KEY

L3T3_KEY: 3 レイヤー空間および 3 レイヤー時間的スケーラビリティ K-SVC エンコーディング
18 L3T3_KEY: 3 レイヤー空間および 3 レイヤー時間的スケーラビリティ K-SVC エンコーディング

9.19 L3T3_KEY_SHIFT

L3T3_KEY_SHIFT: 3 レイヤー空間および 3 レイヤー時間的スケーラビリティ、時間シフト付き K-SVC
19 L3T3_KEY_SHIFT: 3 レイヤー空間および 3 レイヤー時間的スケーラビリティ、時間シフト付き K-SVC

9.20 S2T1 および S2T1h

S2T1 および S2T1h: 2 レイヤー空間サイマルキャストエンコーディング
20 S2T1 および S2T1h: 2 レイヤー空間サイマルキャストエンコーディング

9.21 S2T2 および S2T2h

S2T2 および S2T2h: 2 レイヤー空間サイマルキャストおよび 2 レイヤー時間的スケーラビリティエンコーディング
21 S2T2 および S2T2h: 2 レイヤー空間サイマルキャストおよび 2 レイヤー時間的スケーラビリティエンコーディング

9.22 S2T3 および S2T3h

S2T3 および S2T3h: 2 レイヤー空間サイマルキャストおよび 3 レイヤー時間的スケーラビリティエンコーディング
22 S2T3 および S2T3h: 2 レイヤー空間サイマルキャストおよび 3 レイヤー時間的スケーラビリティエンコーディング

9.23 S3T1 および S3T1h

S3T1 および S3T1h: 3 レイヤー空間サイマルキャストエンコーディング
23 S3T1 および S3T1h: 3 レイヤー空間サイマルキャストエンコーディング

9.24 S3T2 および S3T2h

S3T2 および S3T2h: 3 レイヤー空間サイマルキャストおよび 2 レイヤー時間的スケーラビリティエンコーディング
24 S3T2 および S3T2h: 3 レイヤー空間サイマルキャストおよび 2 レイヤー時間的スケーラビリティエンコーディング

9.25 S3T3 および S3T3h

S3T3 および S3T3h: 3 レイヤー空間サイマルキャストおよび 3 レイヤー時間的スケーラビリティエンコーディング
25 S3T3 および S3T3h: 3 レイヤー空間サイマルキャストおよび 3 レイヤー時間的スケーラビリティエンコーディング

A. 謝辞

編集者は、この仕様への貢献について Robin Raymond、Michael Horowitz、Harald Alvestrand、 Chris Cunningham、Danil Chapovalov、Florent Castelli、Erik Språng および Henrik Boström に感謝する。 この仕様は、W3C ORTC CG で開発された ORTC API から発展したものである。

B. 参考文献

B.1 規範的参考文献

[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC7656]
A Taxonomy of Semantics and Mechanisms for Real-Time Transport Protocol (RTP) Sources. J. Lennox; K. Gross; S. Nandakumar; G. Salgueiro; B. Burman, Ed.. IETF. November 2015. Informational. URL: https://www.rfc-editor.org/rfc/rfc7656
[RFC7667]
RTP Topologies. M. Westerlund; S. Wenger. IETF. November 2015. RFC. URL: https://datatracker.ietf.org/doc/html/rfc7667
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/
[WEBRTC]
WebRTC: Real-Time Communication in Browsers. Cullen Jennings; Florent Castelli; Henrik Boström; Jan-Ivar Bruaroey. W3C. 6 March 2023. W3C Recommendation. URL: https://www.w3.org/TR/webrtc/

B.2 参考情報文献

[AV1]
AV1 Bitstream & Decoding Process Specification. Peter de Rivaz; Jack Haughton. AOM. 8 January 2019. Standard. URL: https://aomediacodec.github.io/av1-spec/av1-spec.pdf
[AV1-RTP-SPEC]
RTP Payload Format For AV1 (v1.0). Alliance for Open Media. Draft Deliverable. URL: https://aomediacodec.github.io/av1-rtp-spec/
[ITU-T-REC-H.264]
H.264 : Advanced video coding for generic audiovisual services. ITU. June 2019. URL: https://www.itu.int/rec/T-REC-H.264
[ITU-T-REC-H.265]
H.265 : High efficiency video coding. ITU. August 2021. URL: https://www.itu.int/rec/T-REC-H.265
[Media-Capabilities]
Media Capabilities. Jean-Yves Avenard. W3C. 8 August 2024. W3C Working Draft. URL: https://www.w3.org/TR/media-capabilities/
[RFC6184]
RTP Payload Format for H.264 Video. Y.-K. Wang; R. Even; T. Kristensen; R. Jesup. IETF. May 2011. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6184
[RFC6190]
RTP Payload Format for Scalable Video Coding. S. Wenger; Y.-K. Wang; T. Schierl; A. Eleftheriadis. IETF. May 2011. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6190
[RFC6386]
VP8 Data Format and Decoding Guide. J. Bankoski; J. Koleszar; L. Quillio; J. Salonen; P. Wilkins; Y. Xu. IETF. November 2011. Informational. URL: https://www.rfc-editor.org/rfc/rfc6386
[RFC7741]
RTP Payload Format for VP8 Video. P. Westin; H. Lundin; M. Glover; J. Uberti; F. Galligan. IETF. March 2016. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7741
[RFC7798]
RTP Payload Format for High Efficiency Video Coding (HEVC). Y.-K. Wang; Y. Sanchez; T. Schierl; S. Wenger; M. M. Hannuksela. IETF. March 2016. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7798
[RFC8827]
WebRTC Security Architecture. E. Rescorla. IETF. January 2021. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8827
[VP9]
VP9 Bitstream & Decoding Process Specification. A. Grange; P. de Rivaz; J. Hunt. Google. February 2016. Version 0.6. URL: https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.6-20160331-draft.pdf
[VP9-PAYLOAD]
RTP Payload Format for VP9 Video. J. Uberti; S. Holmer; M. Flodman; J. Lennox; D. Hong. IETF. 10 June 2021. Internet Draft (work in progress). URL: https://datatracker.ietf.org/doc/html/draft-ietf-payload-vp9