AV1 specification を読む 2018-03-26 (7.3. Decode Frame Process)

#AV1 specification 日本語訳 (2018-03-26)

この節では、1フレームのデコード処理がなされます。
ここで言う「フレームのデコード」とは、ブロック単位のデコードが済んでいる状態で、1フレームを完成させる処理のことです。

（すでに完成済みのフレームを、再度表示する場合にも呼び出されます）

ブロック単位でのデコードとは、予測処理（インター・イントラ）と、変換係数の逆量子化・逆変換による残差の計算、そして、予測値＋残差＝再構成ブロック　までの処理です。

フレームのデコードでは、フィルタ処理の呼び出し方法、デコード画像の格納方法、出力方法について述べられています。


----

## 7.3. Decode Frame Process

>This process is triggered by a call to decode_frame from within the syntax tables.

この処理は、シンタックステーブル内の decode_frame() の呼び出しで実行します。


>If show_existing_frame is equal to 0, the process first performs any post processing filtering by the following ordered steps:

show_existing_frame==0　ならば、以下の手順でポストプロセスフィルタリングを実行します。

>1. If loop_filter_level[ 0 ] is not equal to 0 or loop_filter_level[ 1 ] is not equal to 0, the loop filter process specified in section 7.13 is invoked (this process modifies the contents of CurrFrame).
>2. The CDEF process specified in section 7.14 is invoked (this process takes CurrFrame and produces CdefFrame).
>3. The upscaling process specified in section 7.15 is invoked with CdefFrame as input and the output is assigned to UpscaledCdefFrame.
>4. The upscaling process specified in section 7.15 is invoked with CurrFrame as input and the output is assigned to UpscaledCurrFrame.
>5. The loop restoration process specified in section 7.16 is invoked (this process takes UpscaledCurrFrame and UpscaledCdefFrame and produces LrFrame).
>6. The motion field motion vector storage process specified in section 7.18 is invoked.

1. loop_filter_level[0] != 0 || loop_filter_level[1] != 0 ならば、のループフィルタ処理を(7.13節)呼びます（この処理は、CurrFrameの内容を変更します）
2. CDEF処理(7.14節)を呼び出します（この処理では、CurrFrame から CdefFrame を生成します）
3. CdefFrameを入力として、アップスケーリング処理(7.13節) を呼び出し、出力を UpscaledCdefFrame とします
4. CurrFrameを入力として、アップスケーリング処理(7.13節) を呼び出し、出力を UpscaledCurrFrame とします
5. ループ復元処理(7.14節)を呼び出します（この処理は、UpscaledCurrFrameとUpscaledCdefFrameをとり、LrFrame生成します）
6. モーションフィールドMV格納処理 (7.18節) を呼び出します

>Otherwise (show_existing_frame is equal to 1), if frame_type is equal to KEY_FRAME, the reference frame loading process as specified in section 7.20 is invoked (this process loads frame state from the reference buffers into the current frame state variables).

そうではなく（show_existing_frame==1ならば）、frame_type==KEY_FRAMEならば、参照フレームロード処理（7.20節）を呼び出します（この処理は、参照バッファからフレーム状態を読み出し、カレントフレーム状態変数に格納します）。

>The following ordered steps now apply:
>
>1. The reference frame update process as specified in section 7.19 is invoked (this process saves the current frame state into the reference buffers).
>2. If show_frame is equal to 1 or show_existing_frame is equal to 1, the output process as specified in section 7.17 is invoked (this will output the current frame or a saved frame).

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

1. 参照フレーム更新処理（7.19節）を呼び出します（この処理は、カレントフレーム状態を参照バッファに格納します）。
2. show_frame==1 || show_existing_frame==1 ならば、出力処理（7.17節）を呼び出します（これは、カレントフレームあるいは格納されたフレームを出力します）。

>Note:
>lthough it is specified that all samples in CurrFrame are upscaled, at most 2 lines above and below each stripe (defined by StripeStartY and StripeEndY) will end up being read. Implementations may wish to avoid upscaling the unused lines.

注意：
CurrFrame内の全ての画素がアップスケールされると規定されていますが、（StripeStartY, StripeEndYで定義される）各ストライプの高々2ライン上下だけが読まれます。
使用しないラインをアップスケーリングしない実装でも構いません。