3. 本文档使用的约定 (Conventions Used in This Document)
3.1. 通用约定
本文档中的关键词 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY" 和 "OPTIONAL" 在且仅在它们以此处所示全大写形式出现时, 应按 BCP 14 [RFC2119] [RFC8174] 中的描述解释.
3.2. 运算符
运算符及其优先级顺序与 C programming language [ISO9899] 中使用的相同. 但是, 第 3.2.1 节和第 3.2.2 节描述的运算符存在一些例外, 这些例外遵循视频编解码器中广泛使用的行业实践.
3.2.1. 算术运算符
//
: 整数除法, 结果向 0 舍入. 例如, 7//4 和 -7//-4 舍入为 1, 而 -7//4 和 7//-4 舍入为 -1.
/ 或 div(x,y)
: 数学方程中的除法, 不意图进行截断或舍入.
min(x,y)
: 值 x 和 y 中的最小值.
max(x,y)
: 值 x 和 y 中的最大值.
ceil(x)
: 大于或等于 x 的最小整数值.
clip(x,y,z)
: clip(x,y,z)=max(x,min(z,y)).
sum (i=x, y, f(i))
: 对 f(i) 求和, 其中 i 取从 x 到 y 的所有整数值, 包含 x 和 y.
log2(x)
: x 的以 2 为底的对数.
3.2.2. 按位运算符
& (bitwise "and")
: 对整数参数进行操作时, 作用于该整数值的 two's complement 表示. 对 bit depth 不相等的参数进行操作时, 通过在低 bit depth 参数的有效位置添加 0 来使 bit depth 相等.
| (bitwise "or")
: 对整数参数进行操作时, 作用于该整数值的 two's complement 表示. 对 bit depth 不相等的参数进行操作时, 通过在低 bit depth 参数的有效位置添加 0 来使 bit depth 相等.
x >> y
: 将 x 的 two's complement 整数表示算术右移 y 个二进制位. 此函数仅对 y 的非负整数值有定义. 右移后移入 most significant bits (MSBs) 的 bit 值等于移位操作前 x 的 MSB.
x << y
: 将 x 的 two's complement 整数表示算术左移 y 个二进制位. 此函数仅对 y 的非负整数值有定义. 左移后移入 least significant bits (LSBs) 的 bit 值等于 0.
3.3. 范围记法
x = y..z
: x 取从 y 到 z 的整数值, 包含两端. 其中 x, y 和 z 为整数, 且 z 大于 y.
3.3.1. 运算优先级顺序
当没有通过括号明确指示优先级顺序时, 按以下顺序求值:
- 较高优先级的运算先于任何较低优先级的运算求值. 表 1 按从最高到最低的顺序指定运算优先级. 表中越靠上的运算表示优先级越高.
- 相同优先级的运算从左到右顺序求值.
| operations (with operands x, y, and z) |
|---|
"x++", "x--" |
"!x", "-x" (as a unary prefix operator) |
x^y (power) |
"x * y", "x / y", "x // y", "x % y" |
"x + y", "x - y", "sum (i=x, y, f(i))" |
"x << y", "x >> y" |
"x < y", "x <= y", "x > y", "x >= y" |
"x == y", "x != y" |
"x & y" |
| `"x |
"x && y" |
| `"x |
"x ? y : z" |
"x..y" |
"x = y", "x += y", "x -= y" |
表 1: 从最高 (表顶) 到最低 (表底) 的运算优先级
3.4. 变量, 语法元素和表
每个语法元素用全小写字母名称描述, 其类型在每行语法代码旁给出. 每个语法元素和多字节整数都以 big endian 格式写入. 解码过程根据语法元素的值以及先前已解码语法元素的值运行.
在某些情况下, 语法表可以使用从语法元素值派生的其他变量值. 这些变量出现在语法表或文本中, 其名称由大小写字母混合组成且不含下划线字符. 名称以大写字母开头的变量是为当前语法结构及所有依赖语法结构的解码而派生的. 名称以大写字母开头的变量可在后续语法结构的解码过程中使用, 而无需提及该变量来源的语法结构. 名称以小写字母开头的变量仅在派生它们的章节内使用.
指定 bitstream 当前位置属性的函数称为语法函数. 这些函数在第 5.2 节中规定, 并假定存在一个 bitstream pointer, 该指针指示解码过程接下来要从 bitstream 读取的 bit 的位置.
一维数组称为 list. 二维数组称为 matrix. 数组可以是语法元素或变量. 方括号用于数组索引. 当引用 matrix 的可视化描述时, 第一个方括号用作列, 即水平索引, 第二个方括号用作行, 即垂直索引.
数组各行和各列条目值的规范可以表示为 {{...}{...}}, 其中每个内部括号对按递增列顺序指定一行内元素值, 各行按递增行顺序排列. 因此, 将 matrix s 设置为 {{1 6}{4 9}} 表示 s[0][0] 设置为 1, s[1][0] 设置为 6, s[0][1] 设置为 4, s[1][1] 设置为 9.
二进制记法通过用单引号括起 bit 值字符串表示. 例如, '0b01000001' 表示一个 8-bit 字符串, 其中只有第二个 bit 和最后一个 bit (从最高有效 bit 到最低有效 bit 计数) 等于 1.
当 bit 数是 4 的整数倍时, 可以使用十六进制记法代替二进制记法. 十六进制记法通过在十六进制数字前加 "0x" 表示. 例如, 0x41 表示一个 8-bit 字符串, 其中只有第二个 bit 和最后一个 bit (从最高有效 bit 到最低有效 bit 计数) 等于 1.
在测试语句中, 等于 0 的值表示 FALSE 条件. TRUE 值由任何非 0 值表示.
3.5. 过程
过程用于描述语法元素的解码. 过程具有单独的规范和调用. 调用过程时, 变量赋值按如下方式指定:
- 如果调用处和过程规范处的变量名称不同, 则这些变量被显式赋值给过程规范中的小写输入或输出变量.
- 否则, 即调用处和过程规范处的变量名称相同, 赋值为隐式赋值.
在过程规范中, 特定 coding block 由变量名引用, 该变量名的值等于该特定 coding block 的地址.