跳到主要内容

5. 语法和语义 (Syntax and Semantics)

5.1. 指定语法的方法 (Method of Specifying Syntax)

语法表指定所有允许的比特流 (bitstream) 语法的超集. 注意, 解码器 (decoder) 必须实现某种方法, 用于识别进入比特流的入口点, 并且必须实现某种方法, 用于识别和处理不符合要求的比特流. 本文档不规定识别和处理错误以及其他类似情况的方法.

APV 比特流使用基于 C 编程语言 [ISO9899] 的语法代码来描述, 包括使用 if/else, whilefor, 以及本文档中定义的函数.

语法代码中的语法表以两列格式呈现, 如图 7 所示. 在这种形式中, type 列提供一个类型, 该类型由同一行语法代码通过第 5.2.5 节定义的语法元素处理函数引用.

syntax code                                                   | type
--------------------------------------------------------------|-----
ExampleSyntaxCode(){ |
operations |
syntax_element | u(n)
} |

图 7: 本文档中用于语法描述的带类型标注语法代码示意图.

5.2. 语法函数和描述符 (Syntax Functions and Descriptors)

本文档给出的函数用于语法描述. 这些函数根据比特流指针 (bitstream pointer) 的值来表达, 该指针指示解码过程将从比特流读取的下一个比特的位置.

5.2.1. byte_aligned()

  • 如果比特流中的当前位置位于某个字节的最后一位, 即比特流中的下一位是某个字节的第一位, 则 byte_aligned() 的返回值等于 TRUE.

  • 否则, byte_aligned() 的返回值等于 FALSE.

5.2.2. more_data_in_tile()

  • 如果第 i 个 tile() 语法结构中的当前位置距离第 i 个 tile 的 tile_header() 语法结构开头小于 TileSize[i] 字节, 则 more_data_in_tile() 的返回值等于 TRUE.

  • 否则, more_data_in_tile() 的返回值等于 FALSE.

5.2.3. next_bits(n)

此函数提供比特流中的下 n 位以供比较, 但不推进比特流指针.

5.2.4. read_bits(n)

此函数表示要从比特流读取接下来的 n 位, 并将比特流指针推进 n 个比特位置. 当 n 等于 0 时, read_bits(n) 被规定为返回等于 0 的值, 并且不推进比特流指针.

5.2.5. 语法元素处理函数 (Syntax Element Processing Functions)

b(8): 具有任意比特串模式的字节 (8 位). 此描述符的解析过程由函数 read_bits(8) 的返回值规定.

f(n): 使用 n 位的固定模式比特串, 以左位在先的方式从左到右写入, 即大端格式 (big endian format). 此描述符的解析过程由函数 read_bits(n) 的返回值规定.

u(n): 使用 n 位的无符号整数. 此描述符的解析过程由函数 read_bits(n) 的返回值规定, 该返回值被解释为最高有效位先写入的无符号整数二进制表示.

h(v): 左位在先的变长熵编码语法元素, 即大端格式. 此描述符的解析过程见第 7.1 节.

5.3. 语法和语义列表 (List of Syntax and Semantics)

5.3.1. 访问单元 (Access Unit)

syntax code                                                   | type
--------------------------------------------------------------|-----
access_unit(au_size){ |
signature | f(32)
currReadSize = 4 |
do(){ |
pbu_size | u(32)
currReadSize += 4 |
pbu() |
currReadSize += pbu_size |
} while (au_size > currReadSize) |
} |

图 8: 访问单元语法代码.

signature

: 一个四字符代码, 用于将比特流标识为 APV 访问单元 (Access Unit, AU). 其值必须为 'aPv1' (0x61507631).

pbu_size

: 原始比特流单元 (Primitive Bitstream Unit, PBU) 的大小, 以字节为单位. 值 0 被禁止, pbu_size 的值 0xFFFFFFFF 预留供将来使用.

注: 一个 AU 由一个主帧, 零个或多个非主帧 (例如用于附加视图的帧), 零个或多个 alpha 帧, 零个或多个深度帧, 零个或多个预览帧 (例如分辨率较小的帧), 零个或多个元数据以及零个或多个填充组成.

5.3.2. 原始比特流单元 (Primitive Bitstream Unit)

syntax code                                                   | type
--------------------------------------------------------------|-----
pbu(){ |
pbu_header() |
if((1 <= pbu_type && pbu_type <=2) || |
(25 <= pbu_type && pbu_type <= 27)) |
frame() |
else if(pbu_type == 65) |
au_info() |
else if(pbu_type == 66) |
metadata() |
else if (pbu_type == 67) |
filler() |
} |

图 9: 原始比特流单元语法代码.

5.3.3. 原始比特流单元头部 (Primitive Bitstream Unit Header)

syntax code                                                   | type
--------------------------------------------------------------|-----
pbu_header(){ |
pbu_type | u(8)
group_id | u(16)
reserved_zero_8bits | u(8)
} |

图 10: 原始比特流单元头部语法代码.

pbu_type

: 指示 PBU 中的数据类型, 如表 3 所列. pbu_type 的其他值预留供将来使用.

pbu_type含义 (meaning)注释 (notes)
0预留
1主帧
2非主帧
3...24预留
25预览帧
26深度帧
27alpha 帧
28...64预留
65访问单元信息
66元数据
67填充
68...255预留

表 3: PBU 类型列表.

注: pbu_type 等于 65 (访问单元信息) 的 PBU 可以出现在 AU 中. 如果存在, 它必须是 AU 中的第一个 PBU, 并且解码器可以忽略它.

group_id

: 指示用于将编码帧与元数据关联的标识符. 单个 AU 中可以有两个以上帧具有相同的 group_id. 主帧和非主帧必须具有不同的 group_id 值, 两个非主帧也必须具有不同的 group_id 值. 当 group_id 的值等于 0 时, pbu_type 的值必须大于 64. group_id 的值 0xFFFF 预留供将来使用.

reserved_zero_8bits

: 在符合第 9 节规定 profile 的比特流中必须等于 0. 大于 0 的 reserved_zero_8bits 值预留供将来使用. 符合第 9 节规定 profile 的解码器必须忽略 reserved_zero_8bits 值大于 0 的 PBU.

5.3.4. 帧 (Frame)

syntax code                                                   | type
--------------------------------------------------------------|-----
frame(){ |
frame_header() |
for(i = 0; i < NumTiles; i++){ |
tile_size[i] | u(32)
tile(i) |
} |
filler() |
} |

图 11: frame() 语法代码.

tile_size[i]

: 指示帧中按光栅顺序排列的第 i 个 tile 数据 (即 tile(i)) 的大小, 以字节为单位. tile_size[i] 的值 0 预留供将来使用.

变量 TileSize[i] 被设置为等于 tile_size[i].

5.3.5. 帧头部 (Frame Header)

syntax code                                                   | type
--------------------------------------------------------------|-----
frame_header(){ |
frame_info() |
reserved_zero_8bits | u(8)
color_description_present_flag | u(1)
if(color_description_present_flag){ |
color_primaries | u(8)
transfer_characteristics | u(8)
matrix_coefficients | u(8)
full_range_flag | u(1)
} |
use_q_matrix | u(1)
if(use_q_matrix){ |
quantization_matrix() |
} |
tile_info() |
reserved_zero_8bits | u(8)
byte_alignment() |
} |

图 12: frame_header() 语法代码.

reserved_zero_8bits

: 在符合第 9 节规定 profile 的比特流中必须等于 0. 大于 0 的 reserved_zero_8bits 值预留供将来使用. 符合第 9 节规定 profile 的解码器必须忽略 reserved_zero_8bits 值大于 0 的 PBU.

color_description_present_flag 等于 1

: 指定存在 color_primaries, transfer_characteristicsmatrix_coefficients. color_description_present_flag 等于 0 指定不存在 color_primaries, transfer_characteristicsmatrix_coefficients.

color_primaries

: 必须具有 [H273] 中规定的 ColourPrimaries 语义. 当 color_primaries 语法元素不存在时, color_primaries 的值推断为等于 2.

transfer_characteristics

: 必须具有 [H273] 中规定的 TransferCharacteristics 语义. 当 transfer_characteristics 语法元素不存在时, transfer_characteristics 的值推断为等于 2.

matrix_coefficients

: 必须具有 [H273] 中规定的 MatrixCoefficients 语义. 当 matrix_coefficients 语法元素不存在时, matrix_coefficients 的值推断为等于 2.

full_range_flag

: 必须具有 [H273] 中规定的 VideoFullRangeFlag 语义. 当 full_range_flag 语法元素不存在时, full_range_flag 的值推断为等于 0.

use_q_matrix

: 值为 1 指定存在量化矩阵. 值为 0 指定不存在量化矩阵.

第二个 reserved_zero_8bits 在符合第 9 节规定 profile 的比特流中必须等于 0. 大于 0 的 reserved_zero_8bits 值预留供将来使用. 符合第 9 节规定 profile 的解码器必须忽略 reserved_zero_8bits 值大于 0 的 PBU.

5.3.6. 帧信息 (Frame Information)

syntax code                                                   | type
--------------------------------------------------------------|-----
frame_info(){ |
profile_idc | u(8)
level_idc | u(8)
band_idc | u(3)
reserved_zero_5bits | u(5)
frame_width | u(24)
frame_height | u(24)
chroma_format_idc | u(4)
bit_depth_minus8 | u(4)
capture_time_distance | u(8)
reserved_zero_8bits | u(8)
} |

图 13: frame_info() 语法代码.

profile_idc

: 指示编码帧符合第 9 节规定的哪个 profile. 比特流不得包含第 9 节规定之外的 profiles_idc 值. profile_idc 的其他值预留供将来使用.

level_idc

: 指示编码帧符合第 9 节规定的哪个 level. 比特流不得包含第 9 节规定之外的 level_idc 值. level_idc 的其他值预留供将来使用.

band_idc

: 指定第 9 节规定的 level_idc 最大编码数据率. 比特流不得包含第 9 节规定之外的 band_idc 值. band_idc 的值必须在 0 到 3 的范围内. band_idc 的其他值预留供将来使用.

reserved_zero_5bits

: 在符合第 9 节规定 profile 的比特流中必须等于 0. 大于 0 的 reserved_zero_8bits 值预留供将来使用. 符合第 9 节规定 profile 的解码器必须忽略 reserved_zero_8bits 值大于 0 的 PBU.

frame_width

: 指定以亮度样本为单位的帧宽度. 当 chroma_format_idc 的值为 2 时, frame_width 必须是 2 的倍数. 值 0 预留供将来使用.

frame_height

: 指定以亮度样本为单位的帧高度. 值 0 预留供将来使用.

变量 FrameWidthInMbsY, FrameHeightInMbsY, FrameWidthInSamplesY, FrameHeightInSamplesY, FrameWidthInSamplesC, FrameHeightInSamplesC, FrameSizeInMbsYFrameSizeInSamplesY 按如下方式派生:

  • FrameWidthInSamplesY = frame_width
  • FrameHeightInSamplesY = frame_height
  • FrameWidthInMbsY = ceil(FrameWidthInSamplesY / MbWidth)
  • FrameHeightInMbsY = ceil(FrameHeightInSamplesY / MbHeight)
  • FrameWidthInSamplesC = FrameWidthInSamplesY // SubWidthC
  • FrameHeightInSamplesC = FrameHeightInSamplesY // SubHeightC
  • FrameSizeInMbsY = FrameWidthInMbsY * FrameHeightInMbsY
  • FrameSizeInSamplesY = FrameWidthInSamplesY * FrameHeightInSamplesY

chroma_format_idc

: 按表 2 的规定指定相对于亮度采样的色度采样. chroma_format_idc 的值必须为 0, 2, 3 或 4. 其他值预留供将来使用.

bit_depth_minus8

: 指定样本的位深. 变量 BitDepthQpBdOffset 按如下方式派生:

  • BitDepth = bit_depth_minus8 + 8
  • QpBdOffset = bit_depth_minus8 * 6

bit_depth_minus8 必须在 2 到 8 的范围内, 包含端点. 其他值预留供将来使用.

capture_time_distance

: 如果此帧所属访问单元之前已有任何访问单元, 则指示前一个访问单元中的帧与当前访问单元中的帧之间的采集时间差, 以毫秒为单位.

reserved_zero_8bits

: 在符合第 9 节规定 profile 的比特流中必须等于 0. 大于 0 的 reserved_zero_8bits 值预留供将来使用. 符合第 9 节规定 profile 的解码器必须忽略 reserved_zero_8bits 值大于 0 的 PBU.

5.3.7. 量化矩阵 (Quantization Matrix)

syntax code                                                   | type
--------------------------------------------------------------|-----
quantization_matrix(){ |
for(i = 0; i < NumComps; i++){ |
for(y = 0; y < 8; y++){ |
for(x = 0; x < 8; x++){ |
q_matrix[i][x][y] | u(8)
} |
} |
} |
} |

图 14: quantization_matrix() 语法代码.

q_matrix[i][x][y]

: 指定量化矩阵中的缩放值. 当 q_matrix[i][x][y] 不存在时, 它被推断为等于 16. 数组索引 i 指定颜色分量的指示符. 当 chroma_format_idc 等于 2 或 3 时, 索引 i 的值对于 Y 分量等于 0, 对于 Cb 等于 1, 对于 Cr 等于 2. q_matrix[i][x][y] 的值 0 预留供将来使用.

量化矩阵 QMatrix[i][x][y] 按如下方式派生:

  • QMatrix[i][x][y] = q_matrix[i][x][y]

5.3.8. Tile 信息 (Tile Info)

syntax code                                                   | type
--------------------------------------------------------------|-----
tile_info(){ |
tile_width_in_mbs | u(20)
tile_height_in_mbs | u(20)
startMb = 0 |
for(i = 0; startMb < FrameWidthInMbsY; i++){ |
ColStarts[i] = startMb * MbWidth |
startMb += tile_width_in_mbs |
} |
ColStarts[i] = FrameWidthInMbsY*MbWidth |
TileCols = i |
startMb = 0 |
for(i = 0; startMb < FrameHeightInMbsY; i++){ |
RowStarts[i] = startMb * MbHeight |
startMb += tile_height_in_mbs |
} |
RowStarts[i] = FrameHeightInMbsY*MbHeight |
TileRows = i |
NumTiles = TileCols * TileRows |
tile_size_present_in_fh_flag | u(1)
if(tile_size_present_in_fh_flag){ |
for(i = 0; i < NumTiles; i++){ |
tile_size_in_fh[i] | u(32)
} |
} |
} |

图 15: tile_info() 语法代码.

tile_width_in_mbs

: 指定以 MB 为单位的 tile 宽度.

tile_height_in_mbs

: 指定以 MB 为单位的 tile 高度.

tile_size_present_in_fh_flag

: 等于 1 指定 tile_size_in_fh[i] 存在于帧头部中. tile_size_present_in_fh_flag 等于 0 指定 tile_size_in_fh[i] 不存在于帧头部中.

tile_size_in_fh[i]

: 指示帧中按光栅顺序排列的第 i 个 tile 数据的大小, 以字节为单位. tile_size_in_fh[i] 的值必须与 tile_size[i] 具有相同值. 当它不存在时, tile_size_in_fh[i] 的值推断为等于 tile_size[i]. tile_size_in_fh[i] 的值 0 预留供将来使用.

5.3.9. 访问单元信息 (Access Unit Information)

syntax code                                                   | type
--------------------------------------------------------------|-----
au_info(){ |
num_frames | u(16)
for(i = 0; i < num_frames; i++){ |
pbu_type | u(8)
group_id | u(16)
reserved_zero_8bits | u(8)
frame_info() |
} |
reserved_zero_8bits | u(8)
byte_alignment() |
filler() |
} |

图 16: au_info() 语法代码.

num_frames

: 指示当前 AU 中包含的帧数量.

pbu_type

: 具有与 pbu_header() 语法中的 pbu_type 相同的语义.

注: 在符合本文档的比特流中, pbu_type 的值必须为 1, 2, 25, 26 或 27.

group_id

: 具有与 pbu_header() 语法中的 group_id 相同的语义.

reserved_zero_8bits

: 在符合第 9 节规定 profile 的比特流中必须等于 0. 大于 0 的 reserved_zero_8bits 值预留供将来使用. 符合第 9 节规定 profile 的解码器必须忽略 reserved_zero_8bits 值大于 0 的 PBU.

5.3.10. 元数据 (Metadata)

syntax code                                                   | type
--------------------------------------------------------------|-----
metadata(){ |
metadata_size | u(32)
currReadSize = 0 |
do{ |
payloadType = 0 |
while(next_bits(8) == 0xFF){ |
ff_byte | f(8)
payloadType += ff_byte |
currReadSize++ |
} |
metadata_payload_type | u(8)
payloadType += metadata_payload_type |
currReadSize++ |
|
payloadSize = 0 |
while(next_bits(8) == 0xFF){ |
ff_byte | f(8)
payloadSize += ff_byte |
currReadSize++ |
} |
metadata_payload_size | u(8)
payloadSize += metadata_payload_size |
currReadSize++ |
|
metadata_payload(payloadType, payloadSize) |
currReadSize += payloadSize |
} while(metadata_size > currReadSize) |
filler() |
} |

图 17: metadata() 语法代码.

metadata_size

: 指定当前 PBU 中 filler() 之前的元数据大小.

ff_byte

: 是等于 0xFF 的字节.

metadata_payload_type

: 指定元数据负载类型的最后一个字节.

metadata_payload_size

: 指定元数据负载大小的最后一个字节.

metadata_payload() 的语法和语义见第 8 节.

5.3.11. 填充 (Filler)

syntax code                                                   | type
--------------------------------------------------------------|-----
filler(){ |
while(next_bits(8) == 0xFF) |
ff_byte | f(8)
} |

图 18: filler() 语法代码.

ff_byte

: 是等于 0xFF 的字节.

5.3.12. Tile

syntax code                                                   | type
--------------------------------------------------------------|-----
tile(tileIdx){ |
tile_header(tileIdx) |
for(i = 0; i < NumComps; i++){ |
tile_data(tileIdx, i) |
} |
while(more_data_in_tile()){ |
tile_dummy_byte | b(8)
} |
} |

图 19: tile() 语法代码.

tile_dummy_byte

: 具有任意 8 位比特串模式.

5.3.13. Tile 头部 (Tile Header)

syntax code                                                   | type
--------------------------------------------------------------|-----
tile_header(tileIdx){ |
tile_header_size | u(16)
tile_index | u(16)
for(i = 0; i < NumComps; i++){ |
tile_data_size[i] | u(32)
} |
for(i = 0; i < NumComps; i++){ |
tile_qp[i] | u(8)
} |
reserved_zero_8bits | u(8)
byte_alignment() |
} |

图 20: tile_header() 语法代码.

tile_header_size

: 指示 tile 头部的大小, 以字节为单位.

tile_index

: 指定帧中按光栅顺序排列的 tile 索引. tile_index 必须具有与 tileIdx 相同的值.

tile_data_size[i]

: 指示 tile 中第 i 个颜色分量数据的大小, 以字节为单位. 数组索引 i 指定颜色分量的指示符. 当 chroma_format_idc 等于 2 或 3 时, 索引 i 的值对于 Y 分量等于 0, 对于 Cb 等于 1, 对于 Cr 等于 2. tile_data_size[i] 的值 0 预留供将来使用.

tile_qp[i]

: 指定第 i 个颜色分量的量化参数值. 数组索引 i 指定颜色分量的指示符. 当 chroma_format_idc 等于 2 或 3 时, 索引 i 的值对于 Y 分量等于 0, 对于 Cb 等于 1, 对于 Cr 等于 2. 要用于 tile 中 MB 的 Qp[i] 按如下方式派生:

  • Qp[i] = tile_qp[i] - QpBdOffset
  • Qp[i] 必须在 -QpBdOffset 到 51 的范围内, 包含端点.

reserved_zero_8bits

: 在符合第 9 节规定 profile 的比特流中必须等于 0. 大于 0 的 reserved_zero_8bits 值预留供将来使用. 符合第 9 节规定 profile 的解码器必须忽略 reserved_zero_8bits 值大于 0 的 PBU.

5.3.14. Tile 数据 (Tile Data)

syntax code                                                   | type
--------------------------------------------------------------|-----
tile_data(tileIdx, cIdx){ |
x0 = ColStarts[tileIdx % TileCols] |
y0 = RowStarts[tileIdx // TileCols] |
numMbColsInTile = (ColStarts[tileIdx % TileCols + 1] - |
ColStarts[tileIdx % TileCols]) // MbWidth |
numMbRowsInTile = (RowStarts[tileIdx // TileCols + 1] - |
RowStarts[tileIdx // TileCols]) // MbHeight |
numMbsInTile = numMbColsInTile * numMbRowsInTile |
PrevDC = 0 |
PrevDcDiff = 20 |
Prev1stAcLevel = 0 |
for(i = 0; i < numMbsInTile; i++){ |
xMb = x0 + ((i % numMbColsInTile) * MbWidth) |
yMb = y0 + ((i // numMbColsInTile) * MbHeight) |
macroblock_layer(xMb, yMb, cIdx) |
} |
byte_alignment() |
} |

图 21: tile_data() 语法代码.

tile_data() 语法计算属于每个 tile 的宏块 (macroblock) 的位置并收集这些宏块.

5.3.15. 宏块层 (Macroblock Layer)

syntax code                                                   | type
--------------------------------------------------------------|-----
macroblock_layer(xMb, yMb, cIdx){ |
subW = (cIdx == 0)? 1 : SubWidthC |
subH = (cIdx == 0)? 1 : SubHeightC |
blkWidth = (cIdx == 0)? MbWidth : MbWidthC |
blkHeight = (cIdx == 0)? MbHeight : MbHeightC |
TrSize = 8 |
for(y = 0; y < blkHeight; y += TrSize){ |
for(x = 0; x < blkWidth; x += TrSize){ |
abs_dc_coeff_diff | h(v)
if(abs_dc_coeff_diff) |
sign_dc_coeff_diff | u(1)
TransCoeff[cIdx][xMb // subW + x][yMb // subH + y] = |
PrevDC + abs_dc_coeff_diff * |
(1 - 2*sign_dc_coeff_diff) |
PrevDC = |
TransCoeff[cIdx][xMb // subW + x][yMb // subH + y] |
PrevDcDiff = abs_dc_coeff_diff |
ac_coeff_coding(xMb // subW + x, yMb // subH + y, |
log2(TrSize), log2(TrSize), cIdx) |
} |
} |
} |

图 22: macroblock_layer() 语法代码.

abs_dc_coeff_diff

: 指定当前 DC 变换系数级别与 PrevDC 之间差值的绝对值.

sign_dc_coeff_diff

: 指定当前 DC 变换系数级别与 PrevDC 之间差值的符号. sign_dc_coeff_diff 等于 0 指定该差值为正值. sign_dc_coeff_diff 等于 1 指定该差值为负值.

变换系数由数组 TransCoeff[cIdx][x0][y0] 表示. 数组索引 x0, y0 指定相对于帧中每个分量左上样本的位置 (x0, y0). 数组索引 cIdx 指定颜色分量的指示符. 当 chroma_format_idc 等于 2 或 3 时, 索引 i 的值对于 Y 分量等于 0, 对于 Cb 等于 1, 对于 Cr 等于 2. TransCoeff[cIdx][x0][y0] 的值必须在 -32768 到 32767 的范围内, 包含端点.

5.3.16. AC 系数编码 (AC Coefficient Coding)

syntax code                                                   | type
--------------------------------------------------------------|-----
ac_coeff_coding(x0, y0, log2BlkWidth, log2BlkHeight, cIdx){ |
scanPos = 1 |
firstAC = 1 |
PrevLevel = Prev1stAcLevel |
PrevRun = 0 |
do{ |
coeff_zero_run | h(v)
for(i = 0; i < coeff_zero_run; i++){ |
blkPos = ScanOrder[scanPos] |
xC = blkPos & ((1 << log2BlkWidth) - 1) |
yC = blkPos >> log2BlkWidth |
TransCoeff[cIdx][x0+xC][y0 + yC] = 0 |
scanPos++ |
} |
PrevRun = coeff_zero_run |
if(scanPos < (1 << (log2BlkWidth + log2BlkHeight))){ |
abs_ac_coeff_minus1 | h(v)
sign_ac_coeff | u(1)
level = (abs_ac_coeff_minus1 + 1) * |
(1 - 2 * sign_ac_coeff) |
blkPos = ScanOrder[scanPos] |
xC = blkPos & ((1 << log2BlkWidth) - 1) |
yC = blkPos >> log2BlkWidth |
TransCoeff[cIdx][x0 + xC][y0 + yC] = level |
scanPos++ |
PrevLevel = abs_ac_coeff_minus1 + 1 |
if(firstAC == 1){ |
firstAC = 0 |
Prev1stAcLevel = PrevLevel |
} |
} |
} while(scanPos < (1 << (log2BlkWidth + log2BlkHeight))) |
} |

图 23: ac_coeff_coding() 语法代码.

coeff_zero_run

: 指定在变换系数级别扫描中, 位于下一个非零变换系数级别位置之前的零值变换系数级别数量.

abs_ac_coeff_minus1

: 加 1 后指定给定扫描位置处 AC 变换系数级别的绝对值.

sign_ac_coeff

: 指定给定扫描位置处 AC 变换系数级别的符号. sign_ac_coeff 等于 0 指定对应 AC 变换系数级别为正值. sign_ac_coeff 等于 1 指定对应 AC 变换系数级别为负值.

数组 ScanOrder[sPos] 指定从 zig-zag 扫描位置 sPos 到光栅扫描位置 rPos 的映射, 其中 sPos 的范围为 0 到 (1 << log2BlkWidth) * (1 << log2BlkHeight) - 1, 包含端点. ScanOrder 通过调用第 4.4.1 节派生, 输入参数 blkWidth 等于 (1 << log2BlkWidth), blkHeight 等于 (1 << log2BlkHeight).

5.3.17. 字节对齐 (Byte Alignment)

syntax code                                                   | type
--------------------------------------------------------------|-----
byte_alignment(){ |
while(!byte_aligned()) |
alignment_bit_equal_to_zero | f(1)
} |

图 24: byte_alignment() 语法代码.

alignment_bit_equal_to_zero

: 必须等于 0.