DecodingProcess

Frame Header (7.1)

フレームタイプ (Intra, Inter), qi (フレーム品質パラメータ) をデコードする。

Coded Block Flags (7.3)

Inter フレームのとき、フレーム内の各々のブロックが符号化されているか否を判別する。 Intra フレームの場合は、全てのブロックが符号化されるので、処理はスキップされる。 符号化されないブロックは、参照フレームの該当ブロックをそのままコピーすることになる。

デコードは、ビット単位のランレングス法 (7.2) をベースに、3パスに分かれて処理される。

  1. Super Block 内の Block 全てが同じモードか否かをデコードする。
  2. 全て同じモードの Super Block について、符号化されるかされないかをデコードする。
  3. 混在モードの Super Block について、それぞれのブロックが、符号化されるか否かをデコードする。

Macro Block Coding Modes (7.4)

Inter フレームのとき、各マクロブロックの符号化モードをデコードする。 Intra フレームの場合は、全てのマクロブロックが INTRA モードとなるので、処理はスキップされる。

符号化モードは、以下の8つ。

  1. INTER_NOMV
  2. INTRA
  3. INTER_MV
  4. INTER_MV_LAST
  5. INTER_MV_LAST2
  6. INTER_GOLDEN_NOMV
  7. INTER_GOLDEN_MV
  8. INTER_MV_FOUR

デコードは、ハフマンコードもしくは固定長コードで、マクロブロック毎に抽出する。輝度プレーンに符号化された ブロックがないマクロブロックは、スキップされ INTER_NOMV モードなる。

Motion Vectors (7.5)

Inter フレームのとき、各マクロブロックの符号化モードに応じて、モーションベクターをデコードする。 Intra フレームの場合は、モーションベクターを要さないので、処理はスキップされる。

モーションベクターのデコードが必要な符号化モードは、以下の通り。

  • INTER_MV
  • INTER_GOLDEN_MV
  • INTER_MV_FOUR

INTER_NOMV, INTER_GOLDEN_NOMV は、(0, 0) のベクター (動きなし) が適用される。 INTER_MV_LAST, INTER_MV_LAST2 では、直前にデコードされたベクターを使用する。 INTER_MV_FOUR は、ブロック単位のモーションベクターで、最大4つのベクターを抽出する。

モーションベクターのデコードは、ハフマンコードもしくは固定長コードで行われる。

モーションベクターの範囲は、X, Y 軸共に 「-15.5 ... 15.5」(半ピクセル精度) である。

Block-Level qi Decode (7.6)

Block レベル qi デコーディング

DCT Coefficients (7.7)

Block の DCT 係数をデコードする。通常、MPEG 系の CODEC では、Block 単位でコーディング されるが、Theora では、各係数毎に全ての Block を走査 (64 パス) する。そのため、 全 Block の DCT 係数をバッファリングする必要がある。

各 DCT 係数のデコードでは、ハフマンコードで 32 種のトークン値をデコードする。 トークン値に応じて、EOB ラン値, 係数値, ゼロラン値をデコードする。

EOB ラン値が 1 以上のとき、その数のブロックのデコードを終了させる。 EOB ラン値が 0 のとき、ゼロランの数、係数 0 を設定し、係数値を格納する。

コーディングが完了している係数については、スキップされる。

トークン値のデコードに使用するハフマンコードブックは、DC 係数用と、AC 係数用に、それぞれ 16 の候補から選択される。輝度プレーンと色差プレーンでは、別の候補が選択される。AC 係数 は、4 つのクラスに分けられ、コードブックの候補クラスが変更される。トークン値用のハフマン コードブックは、16 * (1 + 4) = 80 個用意されている。

Undoing DC Prediction (7.8)

Block の DC 係数は、他の類似 CODEC と同様に、予測符号化されているため、コーディング された誤差から、実係数を復元する。

係数値予測は、同列の左側の Block 、前列の左, 同, 右側の Block の近傍 4 Block から、Block 位置、 近傍 Block のマクロブロック符号化モードを考慮した、重みつき平均によって行われる。