📊

WebRTC SVC拡張とAV1コーデック

2022/04/01に公開

はじめに

この記事はW3Cにて策定中 Scalable Video Coding (SVC) Extension for WebRTC 仕様(2022年3月現在)に登場する "Scalability Mode Dependency Diagrams" の意味を理解したい人向けの内容となっています。

この記事のゴール設定としては、もっとも複雑な下記L3T3_KEY_SHIFT構造の解釈を目指します。

L3T3_KEY_SHIFT
L3T3_KEY_SHIFT: 3-layer spatial and 3-layer temporal scalability K-SVC with temporal shift

ビデオコーデックAV1

AV1は2018年にAlliance for Open Mediaによって策定された、使用料が無料のロイヤリティフリー(Royalty Free)をうたうビデオコーデックです。技術的な系譜としてはGoogle社によるVP8, VP9の直系にあたります。

WebRTCは下記ビデオコーデックをサポートしており、最古世代のVP8とH.264は全クライアントがサポートすべき必須ビデオコーデック(mandatory video codec)となっています。おおまかに世代が1つ進むとコーデック性能は2倍に向上、つまり前世代と同じ画質をデータ量半分で実現すると言われており、最新世代のAV1は次期標準コーデックとしての役割を期待されています。

  • VP8 または H.264/AVC
  • VP9 または H.265/HEVC
  • AV1

これらのビデオコーデックを構成するアルゴリズム詳細は異なるものの、データ圧縮スキームとしては典型的なハイブリッドMC+DCT方式を採用しています。本記事スコープを超えるため詳細説明は省きますが、当該圧縮データだけから1フレームを復号可能な キーフレーム と、以前の復号済みフレーム+圧縮データに含まれる差分情報から1フレームを復元する 差分フレーム の2種類が存在するとだけ理解していれば問題ありません。

旧世代コーデックと比べたAV1の特徴の一つとして、SVC機能をネイティブサポートしていることが挙げられます。つまりAV1仕様準拠デコーダであれば任意のAV1 SVCストリームを復号可能なのです。なおAV1エンコーダがSVC機能をサポートするか否かは実装に委ねられます。

L1T1構造

一番シンプルなL1T1構造は、キーフレームと差分フレームの連なりです。L1は解像度レイヤーが1層、このストリームを復号すると1種類の解像度のみ取り出せることを意味します。同様にT1は時間レイヤーが1層、復号後のフレームレートが1種類と固定的になることを意味します。このL1T1構造はあらゆるビデオコーデックの基本形となります。

L1T1
L1T1: 1-layer encoding

時刻0がキーフレーム、時刻1以降は全て参照フレームで構成されることを表現します。2フレーム間をつなぐ矢印は、参照フレームがどのフレームに対する差分情報を含むかという 依存関係(Dependency) を表しています。

L1T2構造

2番目に単純なL1T2構造は、差分フレームの依存先を変更した構造です。その名前が示すおとりL1T2は2層の 時間スケーラビリティ(Temporal Scalability) を持ちます。

L1T2
L1T2 and L1T2h: 1-layer spatial and 2-layer temporal scalability encoding

先のL1T1構造と異なり、時刻1および2の参照フレームの両方が時刻0のキーフレームに依存することに注目してください。レイヤーS0T0の圧縮データだけを復号すると半分のフレームレートとなり、追加でレイヤーS0T1の圧縮データも復号することでオリジナルのフレームレートまで復元されます(例:15fps → 30fps)。

L1T3構造

L1T3構造は、さらに時間スケーラビリティを3層に増やした構造です。

L1T3
L1T3 and L1T3h: 1-layer spatial and 3-layer temporal scalability encoding

レイヤーS0T0のみ利用するとフレームレート1/4、レイヤーS0T0+S0T1ではフレームレート1/2、全レイヤーを用いるとオリジナルのフレームレートを復号します(例:7.5fps → 15fps → 30fps)。

ここまで見てきたL1T1, L1T2, L1T3構造は、参照フレームの依存関係変更だけで時間スケーラビリティを実現しています。エンコード処理負荷にはさほど影響を与えないものの、参照フレーム依存先が時間的に離れていくため映像品質が低下するデメリットもあります。

ビデオコーデックの一般論として、スケーラビリティ機能と映像品質はトレードオフの関係 にあります。圧縮データ量が同じL1T1復号後30fps映像とL1T3全レイヤ復号後30fpsを比べると、時間スケーラビリティを持たないL1T1の方がより綺麗な映像となります。タダ飯はありません。

サイマルキャスト(Simulcast)

複数フレームレートの選択肢を提供する時間スケーラビリティとは別の軸として、複数の解像度を選択可能とする 空間スケーラビリティ(Spatial Scalability) という考え方もあります。この空間スケーラビリティを効率的に実現するには、WebRTCクライアントが搭載するコーデックに後述するSVC機能が必要とされます。

VP8やH.264/AVCなどの古いコーデックでも空間スケーラビリティを実現すべく、WebRTCでは サイマルキャスト(Simulcast) 方式が規程されます。サイマルキャストの考え方はシンプルです。必要とされる複数の解像度ストリームを同時にエンコードし、全ストリームを同時送信するという一種のパワープレイをとります。

例えば2層の空間スケーラビリティは、オリジナルの高解像ストリームと画像縮小された解像ストリームの2本で構成されます(例:1280x720@2Mbps+640x360@0.5Mbpsの計2.5Mbps)。P2P通信では無駄にエンコード負荷とネットワーク負荷が増えるだけで何らメリットがありません。サイマルキャストが意味を持つのは中間ノードとして SFU(Selective Forwarding Unit) が介在し、多数の受信クライアントに対してそれぞれ適切な解像度データを選択的に転送するようなユースケースです。

S2T1構造

サイマルキャスト方式で一番シンプルなS2T1構造は、2層の空間スケーラビリティを提供します。

S2T1
S2T1 and S2T1h: 2-layer spatial simulcast encoding

SFU対向の受信クライアントがレイヤーS0T0のストリームを受信する場合は低解像度ビデオ、S1T0のストリームを受信する場合は高解像度ビデオとなります。

S2T2構造

S2T2構造は空間スケーラビリティ2層×時間スケーラビリティ2層、計4パターンのスケーラビリティを提供する構造です。

S2T2
S2T2 and S2T2h: 2-layer spatial simulcast and 2-layer temporal scalability encoding

復号対象 復号後ビデオ
S0T0のみ 低解像度, フレームレート1/2 640x360 15fps
S0T0+S0T1 低解像度, オリジナルフレームレート 640x360 30fps
S1T0のみ 高解像度, フレームレート1/2 1280x720 15fps
S1T0+S1T1 高解像度, オリジナルフレームレート 1280x720 30fps

SmTn構造

同様の考え方でS2T3, S3T1, S3T2, S3T3構造も定義されます。それぞれの解釈は読者への宿題とします:P

S3T3
S3T3 and S3T3h: 3-layer spatial simulcast and 3-layer temporal scalability encoding

SVC(Scalable Video Coding)

サイマルキャスト方式であればコーデックを問わず空間スケーラビリティを実現できますが、解像度レイヤーを増やすほどエンコード負荷およびネットワーク負荷が増大するというデメリットがあります。VP9やAV1ビデオコーデックが持つSVC機能は、解像度レイヤーを増やしても総データ量を増加させないアプローチをとります。

空間スケーラビリティのための各解像度レイヤーに属する同一時刻フレームを考えると、オリジナルの解像度から縮小されたものですから当然よく似通った映像となっています。SVCの基本的な考え方は、参照フレームの依存先を従来の時間方向に加えて、空間方向つまり 低解像度フレームも参照できるよう拡張 したものです(例:1280x720フレーム復号のために復号済みの640x360フレームを拡大して参照)。つまりSVC方式における参照フレームの依存先は、時間方向/空間方向/時間+空間方向の3パターンが候補となります。

例えばサイマルキャスト方式ではHD@2Mbps+SD@0.5Mbps=2.5Mbps送信していたストリームは、SVC方式ではHD差分@1.5Mbps+SD@0.5Mbps=2.0Mbpsと冗長な圧縮データを送信しないため上りネットワーク負荷を抑えられます。P2P通信であってもSVC方式に一定のメリットはあるものの、やはりSFU介在を前提とした1:N配信ユースケースに向いています。

一方でSVC機能エンコード/デコード処理は複雑なため送受信クライアントの負荷が増大し、スケーラビリティのトレードオフとして映像品質が低下するデメリットもあります。サイマルキャスト方式に比べると、SVC方式ではデコード負荷が増えることに留意ください。No Free Lunch。

L2T1構造

SVC方式で一番シンプルなL2T1構造は、2層の空間スケーラビリティを提供します。

L2T1
L2T1 and L2T1h: 2-layer spatial and 1-layer temporal scalability encoding

受信クライアントがレイヤーS0T0のみを復号すると低解像度、ストリーム全体を復号すると高解像度ビデオが得られます。サイマルキャスト方式(S2T1)とは異なり、受信クライアントが高解像度ビデオを復元するために内部的には低解像度デコードする必要があります。

L2T2構造

L2T2構造は空間スケーラビリティ2層×時間スケーラビリティ2層、計4パターンのスケーラビリティを提供する構造です。

L2T2
L2T2 and L2T2h: 2-layer spatial and 2-layer temporal scalability encoding

復号対象 復号後ビデオ
S0T0のみ 低解像度, フレームレート1/2 640x360 15fps
S0T0+S0T1 低解像度, オリジナルフレームレート 640x360 30fps
S0T0+S1T0 高解像度, フレームレート1/2 1280x720 15fps
全データ 高解像度, オリジナルフレームレート 1280x720 30fps

LmTn構造

同様の考え方でL2T3, L3T1, L3T2, L3T3構造も定義されます。

L3T3
L3T3 and L3T3h: 3-layer spatial and 3-layer temporal scalability encoding

それぞれSVCLmTn構造とサイマルキャストSmTn構造とを対比させて、ある参照フレームを正しく復号するために必要となる依存関係を辿ってみてください。

K-SVCエンコード

SVC方式による空間スケーラビリティはネットワーク利用効率の観点では無駄がないですが、エンコーダ/デコーダ処理負荷という観点では無視できないデメリットがあります。そこでSVC方式にサイマルキャスト方式の考え方を取り入れ、SVC機能利用をキーフレームのみに制限 したK-SVC方式が規程されます。K-SVC方式は制約を設けたSVC方式の一種ですから、送受信クライアントのコーデックとしてはSVC対応必須となります。

フルSVC方式と比べたK-SVC方式の最大のメリットは、受信クライアントにおけるデコード処理負荷の軽減 にあります。フルSVCでオリジナル解像度までデコードしたい場合、デコーダ内部処理としては低解像度ストリームを全て復号・拡大したうえで差分情報を重ねていく必要があります。K-SVC方式はキーフレームでのみ複雑な解像度レイヤー間処理を必要としますが、以降の参照フレームでは非SVCコーデック同様の時間方向依存関係のみとなるため直接目的の解像度ビデオを取り出せます。

L2T1_KEY構造

K-SVC方式で一番シンプルなL2T1_KEY構造は、2層の空間スケーラビリティを提供します。

L2T1_KEY
L2T1_KEY: 2-layer spatial and 1-layer temporal scalability K-SVC encoding

時刻0のキーフレームでのみ解像度レイヤー間の依存関係がありますが、参照フレームでは同一解像度レイヤー内での時間方向依存関係のみとなっています。

2階層の空間スケーラビリティをもつサイマルキャスト(S2T1)/フルSVC(L2T1)/K-SVC(L2T1_KEY)の各方式について、送信クライアント→SFU、SFU→低解像受信クライアント、SFU→高解像受信クライアントのデータ転送量の比較をしたものが下表です。※数値は傾向把握用の参考として解釈ください。

方式 送信→SFU SFU→受信/低 SFU→受信/高
Simulcast 120
(10+1x14
+ 40+4x14)
24
(10+1x14)
96
(40+1x14)
SVC 96
(10+1x14
+ 30+3x14)
24
(10+1x14)
96
(10+1x14
+ 30+3x14)
K-SVC 110
(10+1x14
+ 30+4x14)
24
(10+1x14)
96
(10+30+4x14)

L2T2_KEY構造

L2T2_KEY構造は空間スケーラビリティ2層×時間スケーラビリティ2層、計4パターンのスケーラビリティを提供する構造です。

L2T2_KEY
L2T2_KEY: 2-layer spatial and 2-layer temporal scalability K-SVC encoding

復号対象 復号後ビデオ
S0T0のみ 低解像度, フレームレート1/2 640x360 15fps
S0T0+S0T1 低解像度, オリジナルフレームレート 640x360 30fps
S0T0キーフレーム+S1T0 高解像度, フレームレート1/2 1280x720 15fps
S0T0キーフレーム+S1T0+S1T1 高解像度, オリジナルフレームレート 1280x720 30fps

LmTn_KEY構造

同様の考え方でL2T3_KEY, L3T2_KEY, L3T3_KEY構造も定義されます。

L3T3_KEY
L3T3_KEY: 3-layer spatial and 3-layer temporal scalability K-SVC encoding

対応するSVCLmTn構造とK-SVCLmTn_KEY構造とを見比べると、キーフレーム以外の参照フレームでは空間方向の依存関係がなく単純化されていることが読み取れます。

K-SVC+時間シフト(Temporal Shift)

ここまでで説明した時間スケーラビリティを持つ構造では全解像度レイヤーにおいて、ある参照フレームは同一時刻の別フレームに依存していました。例えば2階層の時間スケーラビリティの場合、偶数時刻 2n+2 の参照フレームは2つ離れた偶数時刻 2n フレームに依存し、奇数時刻 2n+1 の参照フレームは直前の偶数時刻 2n フレームに依存するという構造です。

ビデオコーデックによるエンコード処理では、参照先フレームとの変化量が小さいほど圧縮データが少なくて済むという性質があります。時間的に近いフレームに依存する参照フレームの方が生成データ量が少ないことから、偶数時刻と奇数時刻では生成されるデータ量が均質ではなくなります。もちろん入力ビデオの変化量(例:カメラの前で手を動かしたり)によるデータ変動の方が大きいのですが、K-SVC+時間シフト方式では 解像度レイヤー別に依存関係を時間方向シフトすることで総データ量の時間変動を抑える ことを試みます。

L2T2_KEY_SHIFT構造

K-SVC+時間シフト方式で一番シンプルなL2T1_KEY_SHIFT構造は、2層の空間スケーラビリティを提供します。

L2T2_KEY_SHIFT
L2T2_KEY_SHIFT: 2-layer spatial and 2-layer temporal scalability K-SVC encoding with temporal shift

キーフレームを除くと、低解像レイヤーS0Tnでは奇数時刻 2n+1 が低FPS時間レイヤーの参照フレームに、高解像レイヤーS1Tnでは偶数時刻 2n が低FPS時間レイヤーの参照フレームに対応すると読み取れます。

L3T3_KEY_SHIFT構造

同様の考え方でL2T3_KEY_SHIFT, L3T2_KEY_SHIFT, L3T3_KEY_SHIFT構造も定義されます。一気に最終ゴールまで進めましょう。

L3T3_KEY_SHIFT
L3T3_KEY_SHIFT: 3-layer spatial and 3-layer temporal scalability K-SVC with temporal shift

各解像度レイヤーの時間レイヤーを構成するフレーム時刻を下表にまとめます。

解像度\時間 T0(低FPS) T1(中FPS) T2(高FPS)
S2(高解像度) 4n 4n+2 2n+1
S1(中解像度) 4n+2 4n 2n+1
S0(低解像度) 4n+1 4n+3 2n

もう何も恐くない![要出展]

外部リンク

仕様:

参考記事:

Discussion