AV1 specification を読む (再構成と逆量子化)


AV1 specification 日本語訳

非可逆圧縮された変換係数を、予測値と元画像との差分である残差に戻すための処理です。


再構成と逆量子化

本節では、逆量子化と逆変換を使ったブロックの再構成について説明します。

逆量子化関数

本節では、逆量子化に必要な関数 get_dc_quant, get_ac_quant を定義します。

量子化パラメタはルックアップテーブルで求めます。

関数 dc_q(b) = dc_lookup[(BitDepth-8)>>1][Clp3(0,255,b)] と定義します。
dc_lookup は以下の通りです。

dc_lookup[3][256] = {
    ...
}

関数 ac_q(b) = ac_lookup[(BitDepth-8)>>1][Clp3(0,255,b)] と定義します。
ac_lookup は以下の通りです。

ac_lookup[3][256] = {
    ...
}

関数 get_qindex() は、カレントブロックの量子化インデックスを返します。

  • seg_feature_active(SEG_LEL_ALT_Q)==1ならば、以下の手順を適用します。
    1. data = FeatureData[segmant_id][SEG_LVL_ALT_Q]
    2. segmentation_abs_or_delta_updates==0ならば、data = base_q_idx + data
    3. return Clip3(0, 255, data)
  • そうではなければ、base_q_idx w返します。

関数 get_dc_quant(plane) は、特定の plane のDC係数の量子化値を返します。

  • plane==0ならば、return dc_q(get_qindex() + deltaQYDc)
  • そうではなければ、return dc_q(get_qindex() + deltaQUVDc)

関数 get_ac_quant(plane) は、特定の plane のAC係数の量子化値を返します。

  • plane==0ならば、return ac_q(get_qindex())
  • そうではなければ、return ac_q(get_qindex()+ deltaQUVAc)

再構成処理

再構成処理は、逆量子化・逆変換・再構成を処理するために呼ばれます。
この処理は、6.4.21節で説明した残差シンタックステーブル内の関数呼び出しで呼び出されます。

この処理の入力は以下の通りです。

  • 再構成するプレーンを指定する plane
  • カレント変換ブロックの CurrFrame[plane] 内の左上座標 x,y
  • 変換ブロックサイズ txsz

この処理の出力は、かれんとふれーむ  CurrFrame の再構成された画素です。

再構成と逆量子化処理は以下の手順です。

dqDenom = (TxSz == TX_32X32) ? 2 : 1
n = 2 + txSz (変換ブロックのlog2)
n0 = 1 << n (変換ブロックの幅)

以下の手順を適用します。

  1. Dequant[i][j] = (Tokens[i*n0 + j] * get_ac_quant(plane)) / dqDenom, i=0..(n0-1), j=0..(n0-1)
  2. Dequant[0][0] = (Tokens[0] * get_dc_quant(plane)) / dqDenom
  3. nを入力として8.7.2節の2次元逆変換処理を呼び出します。逆変換出力は Dequant バッファに格納します。
  4. CurrFrame[plane][y+i][x+j] = Clip1(CurrFrame[plane][y+i][x+j] L Dequant[i][j]), i=0..(n0-1), j=0..(n0-1)

ステップ1,2のDequant配列にかかれる値は、8+BitDepthビットの符号付き整数で表現できる必要があります。