AV1 specification を読む (Annex B スーパーフレーム)


AV1 specification 日本語訳

具体的な用途は謎ですが。


Annex B: スーパーフレーム

B.1 概要

AV1では、複数の符号化フレームを1つのチャンクにまとめる「スーパーフレーム」をサポートしています。

このスーパーフレームのインデックスは、チャンクの34bytesまでに格納されます。
中に含まれるフレームは、このスーパーフレームインデックスを解釈することで特定できます。

スーパーフレームのシンタックスはを B.2 節で示し、 シンタックス要素の意味を B.3 節で説明します。
スーパーフレームのパース方法を B.4 節で説明します。

B.2 スーパーフレームシンタックス

superframe(sz)
{
    for (i=0; i<NumFrames; i++)
    {
        frame(frame_sizes[i])
    }
    superframe_index(sz)
}

B.2.1 スーパーフレームインデックス

superframe_index(sz)
{
    frameSizeSum = 0
    superframe_header()
    for (i=0; i<NumFrames-1; i++)
    {
        frame_sizes[i]                          f(SzBytes)
        framesSizeSum += frame_size[i]
    }
    frame_size[i] = sz - SzIndex - frameSizeSum
    superframe_header()
}

B.2.2 スーパーフレームヘッダ

superframe_header()
{
    superframe_marker                   f(3)
    bytes_per_framesize_minus_1         f(2)
    frames_in_superframe_minus_1        f(3)
}

B.3 スーパーフレームセマンティクス

sz

スーパーフレームのバイト数を指定します。
外部から与えられます。

frame_sizes[i]

このスーパーフレーム内のフレーム番号 i(0開始)のフレームのバイト数を指定します。

superframe_marker

0b110 の固定ビット列で、スーパーフレームがそんざいするかどうかを検出するためにあります。

bytes_per_framesize_minus_1

フレームサイズを符号化するために必要なバイト数を指定します。

SzBytes = bytes_per_framesize_minus_1 + 1

frames_in_superframe_minus_1

このスーパーフレーム内のフレーム数を指定します。

NumFrames = frames_in_superframe_minus_1 + 1

注意:
スーパーフレームにはNumFrame==1で1フレームだけが含まれてもかまいません。

B.4 スーパーフレームパーシング

スーパーフレームの使用は選択可能で、1つのチャンクには1つのフレームあるいはスーパーフレームが含まれます。

デコーダは、スーパーフレームの存在意を以下のように検出します。

  1. チャンクの最終バイトをパース氏、superframe_marker==0b110 であることをチェックします。
  2. superframe_indexの合計サイズ SzIndex = 2 + (NumFrames-1)*SzBytes
  3. superframe_indexの最初のバイトが、最後のバイトと一致することをチェックします。

1,3 の両方のチェックが成功したら、そのチャンクにはスーパーフレームが含まれると判断され、スーパーフレーム内の各フレームが順番にデコード処理に渡されます。

そうではなければ、そのチャンクにはスーパーフレームが含まれず、チャンク全体をデコード処理に渡します。

注意:
符号化フレームの最終バイトには superframe_marker が含まれてはいけないという規定があるために、この処理はうまく動きます