LoginSignup
1
0

More than 5 years have passed since last update.

AV1 specification を読む (デコード処理の概要3:参考)

Posted at

概要はここまで。

AVCやHEVCは無味乾燥な規格書にはない章だったと思います。
厳密さ、正確さには欠けますが、導入としてこのような章がそんざいするのは非常に良いと思います。


セグメントマップ

AV1には画像を分割するような機能があり、様々な信号や補正値をセグメントレベルで適用します。
セグメンテーションは、ビデオシーケンスが多くのフレームにわたって持続あるいは微小な変化しかない場合に特に有効です。
最大8つのセグメントが1フレーム内に定義できます。
各セグメントでは以下の項目が指定できます。

  • 量子化
  • ループフィルタ強度
  • 予測参照フレーム
  • ゼロ動きベクトルで係数なしのための、ブロックスキップモード

各セグメントのこれら各値は、フレームレベルで独立して更新できます。
あるフレームで値の更新がない場合、直前のフレームの値を維持します。
この例外はキーフレーム・イントラオンリーフレーム・過去のフレームからの独立がが必要な他のフレームです(エラー復帰できるようにするなどのため)。
この場合、すべての値はデフォルト値に戻ります。

8x8以上のサイズの予測ブロックでは、セグメントへの所属を示すことができます。
このセグメンテーションマップの更新は、時間方向の符号化あるいはダイレクト符号化方式(フレームレベルで選択)で明示的になされます。

ブロックのセグメント所属の明示的な更新がないならば、上で説明したようなセグメントデータ値がフレームにわたって維持されます。
キーフレーム・イントラオンリーフレーム・過去のフレームから独立が必要なフレームに関しては、セグメント各ブロックのセグメント所属は明示的に更新がない限りデフォルト0になります。

内部的には、セグメント所属は8x8ブロックの解像度で格納されます(セグメントマップ)。
これは、例えば64x64領域で32x32変換を選択するときにコンフリクトするかもしれません。
より広い領域を覆う異なる成分の8x8ブロックが異なるセグメント所属である場合、そのより広い領域のセグメント所属はそれに寄与する任意の8x8領域のもっとも小さいセグメントIDとして定義されます。

参照フレームスケーリング

異なるデコードフレームが異なるフレームサイズ(とアスペクト比)を持つもつのも問題ありません。
AV1は自動的に異なるサイズの参照フレームからの予測のために、自動的にリサイズをします。

しかし、参照フレームは同じ色深度とスケール可能なサブサンプリングフォーマットでなければなりません。
そして、up/downスケーリングは16x拡大から2x縮小までの範囲に制約されます。
例えば、新たなフレームは任意の参照フレームよりも16倍以上広い/高いことは許されません。

算術符号化

4つのシンボル(例えば、インターモードは NEW, NEAREST, NEAR, ZEROを取り得ます)をエンコードしたいと仮定してみましょう。
これらがすべて等しく出現するならば、それぞれ2bitでエンコードすることがよいでしょう。

MODE BITS
NEW 00
NEAR 01
NEAREST 10
ZERO 11

しかし、ZERO 50%、NEAREST 25%、 NEAR/NEW 12.5%で発生することを仮定します。
この場合、以下のような可変長符号をつかうのが良いかもしれません。

MODE BITS
NEW 000
NEAR 001
NEAREST 01
ZERO 1

この方式は、一様なエンコード方式よりも平均的に少ないビットになるでしょう。

では、ZEROが90%で発生すると仮定しましょう。
算術符号化では、この場合にビットの小数点以下を効果的に使うことができます。

AV1の最下層では、1つのbool値 (0,1)をデコードする2値デコーダがあります。
これには、値の推定確率を入力として与えます。
bool値が0よりも1になりそう(あるいはその逆)のならば、算術符号化器はきちんと平均的にbool値を1ビット以下で符号化します。

2値デコーダは、符号なし16ビット整数と、符号なし16ビット乗算処理で動作します。

確率更新

2値デコーダは、シンタックス要素の推定確率が実際の発生する頻度と一致するとき最小のビットを生成します。

AV1にはこれらを一致させるために2つの仕組みがあります。

  1. フレームヘッダで明示的に確率を変更できます。(実際にはこの処理のコストを減らすため、確率自信を算術符号化を使って符号化します。)
  2. 2値デコーダは、どのタイプのシンタックス要素が何回デコードされたかを記録していて、フレームの最後で観測された頻度と一致するように、その確率を自動的に補正できます。

最初のアイデアは、確率を正確に設定することでフレームを符号化するビット数を削減できます。
しかし、この更新のために消費するビットがコストとなります。

2番目のアイデアは、次のフレームの確率は現在のフレームの確率と非常に近いので、フレームの最後確率に補正することが、圧縮の改善になります。

色差フォーマット

人間の視覚は明るさよりも色に対して鈍感であるといわれています。
このため、輝度画素よりも少ない色差画素で符号化することがよくあります。
AV1では、縦あるいは横方向(両方あるいは、どちらも無し)に間引いた2つの色平面(U,V)を使います。

プロファイル0と2では4:2:0フォーマット(縦横両方で間引いてあります)だけが許可されています。
プロファイル1と3では、その他フォーマットが許可されます。

高ビット深度

AV1では出力画素として8,10,12ビット/画素をサポートしています。

プロファイル0と1では、8bit/画素のみ許可されています。

プロファイル2と3では、8以上の画素が許可されます。

確率コンテキスト

シンタックス要素を符号化するとき、例えばどのブロックをスキップするか等で、AV1はどの確率を使うか決める処理が定義されています。
確率の選択はシンタックス要素のコンテキストに基づきます。
例えば、そのシンタックス要素が過去にどうデコードされたか(隣接してしていたり同じサイズであるなど)によります。

この処理は、デコーダがシンタックス要素の確率分布をよりよく正確に予測させるので、デコーダは平均的に少ないビットでシンタックス要素を表現できます。

ジグザグ順

自然なブロックの変換係数は、低周波数側にかたまる傾向があります。
これは、少数の非ゼロ係数だけが存在し、それは変換ブロックの角に固まっていることを意味します。

AV1では、最初にDC成分を読みだんだん高周波側に移動する、特殊なジグザグ順でデコードします。

各比ゼロ係数の後にbool値がデコードされます。
これは、変換ブロック全体としてもう非ゼロ係数が存在しないかどうかを示しています。
この条件を検出したら、ビットストリームからビットを消費せずにデコーダは変換ブロックの残りをゼロ詰めします。

イントラの予測方向に依存して、変換係数は変換ブロックの左や上にかたまることがあります。
このため、AV1ではイントラ予測方向に基づいてスキャン順を選択します。

下図に4x4ブロックのスキャン順の例を示します。
ここで、数値と矢印はデコード処理順を示しています。

ループフィルタ

非可逆圧縮をつかうときには、量子化によってデコードデータに誤差を発生させます。
例えば、元データは以下のとおりであるとします。

100 102 104 106 108 110 112 114
100 102 104 106 108 110 112 114
100 102 104 106 108 110 112 114
100 102 104 106 108 110 112 114

非可逆圧縮の結果、以下のように2つの平坦なブロックになってしまいます。

103 103 103 103 111 111 111 111
103 103 103 103 111 111 111 111
103 103 103 103 111 111 111 111
103 103 103 103 111 111 111 111

各4x4ブロックは確かに元画像に似ているのですが、真ん中に段差があります。
これはよくある問題で、デコードが王にブロックエッジが見えてしまいます。

この誤差を低減するため、ループフィルタと呼ばれる処理が画像のブロックエッジに対してなされます。
この処理では、このような突然の段差を滑らかにするため、ブロックエッジ間の画素をフィルタします。
フィルタされるブロック境界は、異なる変換ブロック・異なるモード情報ブロック間になることがあります。

この処理は、フィルタされたフレームがインター予測で参照されるので、ループ内フィルタと呼ばれます。

ループフィルタ順とフィルタ

ループフィルタはスーパーブロックのラスタスキャン順で処理します。

各スーパーブロックにおいて、ループフィルタはまず左の縦境界に適用され、すべての縦境界に適用されます(下図の赤で示しています)。

その後横境界にとすべての内部横境界(青で示しています)に適用されます。

番号は境界の処理順を示しています。

各境界において、フィルタ処理はエッジ両側の最大8画素に依存してなされ、最大7画素が変更されます。
(This is true for both luma and chroma and in both subsampled and non-subsampled modes of operation.)
フィルタ処理に使われるスーパーブロックの外部の領域はグレーで示しています。

フレーム構造

符号化されたバイトは、以下のようなシーケンスで格納されます。

最初のバイトには非圧縮ヘッダが含まれます。
ここにはフレームレベルの情報がほとんどすべて含まれていて、生のバイナリ符号化が使われます(つまり、算術符号化を使っていません)。

非圧縮ヘッダに続いて、圧縮ヘッダがあります。
これはfれーm内で使われる変換サイズと、どの確率を補正するかの情報を指定します。
第2のヘッダ内の情報は、算術符号化で圧縮されます。

ヘッダに続いて、各タイルが順番にあります。
各タイルは(最終タイルを除いて)タイルサイズを含み、それに続いて算術符号化されたデータがありあmす。

この構造は通常のフレーム絵使われ明日。
1バイト(プロファイル3では2バイト)の非圧縮ヘッダのみを含む短いフレームも存在します。
これは、デコーダは直前にデコードされたフレームを表示しなければならないことを示しています。
この短いフレームには、圧縮ヘッダもタイルデータもありません。

スーパーフレーム

AV1では複数の圧縮されたビデオフレームを1つのチャンクにまとめあげることができ、スーパーフレームと呼ばれます。
このスーパーフレームインデックスは、チャンクの最後のバイト(最大34バイト)に格納されます。
中に含まれるフレームは、このスーパーフレームインデックスをパースすることで特定できます。

コンテナフォーマットからみると、スーパーフレームは一緒に格納されます。
このフォーマットは、各スーパーフレームは非表示のフレームを使って1つのデコードフレームのみを生成するようなことが可能になります。
とはいえ、スーパーフレームから複数のフレームを出力しても構いませんし、出力フレームなしでも構いません。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0