《AV1 Bitstream & Decoding Process Specification》,译名:AV1比特流及解码规范-Chapter 04-公约

Table of Contents

4.1 概述

4.2 算数运算符

4.3 逻辑运算符

4.4 关系运算符

4.5 位运算符

4.6 赋值运算符

4.7 数学函数

4.8 描述比特流语法的方法

4.9 函数

4.10 描述子

4.10.1 概述

4.10.2 f(n)

4.10.3 uvlc()

4.10.4 le(n)

4.10.5 leb128()

4.10.6. su(n)

4.10.7. ns(n)

4.10.8. L(n)

4.10.9. S()

4.10.10. NS(n)

附注


4.1 概述

除了特殊定义的具有截断的整数除法运算,此规范中描述的数学运算符及其优先级规则与C语言中所使用的类似。

另外,可以将运动变量存储为一个长度为2的数组(以Mv或者Mvs作为变量名称的结尾),并且使用数组符号(例如Mv[0]和Mv[1])或者直接通过名称(例如Mv)进行访问。使用名称时定义的唯一操作是赋值和等式/不等式测试。可以使用A=B表示数组的赋值,等同于A[0]=B[0]并且A[1]=B[1]。使用符号A==B表示2个运动矢量的等式测试,等同于(A[0]==B[0] && A[1]==B[1])。不等式测试定义为A!=B,等同于(A[0]!=B[0] || A[1]!=B[1])。

当一个有符号整型变量使用x比特表示时,意味着该变量的取值范围为:-(1<<(x-1))~(1<<(x-1))-1)。

本文中的关键词“must”、“must not”、“required”、“shall”、“shall not”、“should”、“should not”、“recommended”、“may”和“optional”均可按照RFC 2119(可参见附注)中的描述进行理解。

4.2 算数运算符

+、-、*

/:整数除法,将结果截断为零。例如,7/4和-7/-4被截断为1,-7/4和7/-4被截断为-1

÷:浮点(算术)除法

a%b:a和b均为正整数

ceil(x):向上取整,大于等于x的最小整数

floor(x):向下取整,小于等于x的最大整数

4.3 逻辑运算符

&&、||、!

4.4 关系运算符

>、>=、<、<=、==、!=

4.5 位运算符

&、|、^、~、>>、<<

4.6 赋值运算符

=、++、--、+=、-=

4.7 数学函数

部分常用数学函数定义如下,

《AV1 Bitstream & Decoding Process Specification》,译名:AV1比特流及解码规范-Chapter 04-公约_第1张图片

《AV1 Bitstream & Decoding Process Specification》,译名:AV1比特流及解码规范-Chapter 04-公约_第2张图片

《AV1 Bitstream & Decoding Process Specification》,译名:AV1比特流及解码规范-Chapter 04-公约_第3张图片

《AV1 Bitstream & Decoding Process Specification》,译名:AV1比特流及解码规范-Chapter 04-公约_第4张图片

《AV1 Bitstream & Decoding Process Specification》,译名:AV1比特流及解码规范-Chapter 04-公约_第5张图片

Round2的定义使用标准的数学幂和除法运算,而不是整数运算。

其使用整数运算的等效伪码如下,

Round2( x, n )
{
    if ( n == 0 )
        return x
    return ( x + ( 1 << (n - 1) ) ) >> n
}

FloorLog2(x)函数被定义为输入x的基数2对数的向下取整,其输入x始终为整数,并且大于或等于1。

该函数可以提取x中的最高有效位的位置。其等效伪码表示如下,

FloorLog2( x )
{
    s = 0
    while ( x != 0 )
    {
        x = x >> 1
        s++
    }
    return s - 1
}

CeilLog2(x)函数被定义为输入x的基数2对数的向上取整,其输入x始终为整数,并且大于或等于0,当x=0时,返回值为0。

该函数可用于计算取值范围为0~(x-1)的值进行编码时所需的比特数。其等效伪码表示如下,

CeilLog2( x )
{
    if ( x < 2 )
        return 0
    i = 1
    p = 2
    while ( p < x )
    {
        i++
        p = p << 1
    }
    return i
}

4.8 描述比特流语法的方法

语法的描述风格类似于C语言。

比特流中的语法元素以粗体表示,每个语法元素由其名称(仅使用带下划线字符的小写字母)及其编码表示方法的描述符组成。

解码过程根据语法元素的值和先前解码的语法元素的值来执行。当在语法表或文本中使用语法元素的值时,它以常规(即非粗体)类型出现。如果正在计算语法元素的值(例如使用默认值而不是在比特流中编码),则它也以常规类型出现(例如tile_size_minus_1)。

在某些情况下,语法表可以使用从语法元素值派生的其他变量的值。这些变量出现在语法表或文本中,由小写和大写字母混合命名,没有任何下划线字符。以大写字母开头的变量被导出用于解码当前语法结构和所有依赖语法结构,这些变量可以用于之后的语法结构的解码过程中。以小写字母开头的变量仅在派生它们的过程中使用。(允许使用单个字符变量)

常量值使用带有下划线字符的大写字母表示(例如MI_SIZE)。

常量查找表通常使用下划线分隔的单词来表示(例如Block_Width[...],每个单词的第一个字母大写,剩余字母小写)。当比特数是4的整数倍时,可以使用十六进制符号表示,例如,0x1A表示比特串0001 1010。使用前缀0b标识当前数据为二进制表示,例如,0b00011010表示位串0001 1010。二进制数字可以包含下划线字符,以增强可读性。此时,下划线的位置从LSB开始每4个二进制数字位置。例如,0b11010可以写为0b1_1010。0值可以表示测试语句中的FALSE条件。而TRUE条件则由任何不等于0的值表示。

以下内容为语法规范格式的示例,当出现syntax_element(粗体格式)时,它指定需从比特流解析此语法元素。

/* A statement can be a syntax element with associated
descriptor or can be an expression used to specify its
existence, type, and value, as in the following
examples */

syntax_element         // Type f(1)

/* A group of statements enclosed in brackets is a
compound statement and is treated functionally as a single
statement. */

{
    statement
    …
}

/* A “while” structure specifies that the statement is
to be evaluated repeatedly while the condition remains
true. */

while ( condition )
    statement

/* A “do .. while” structure executes the statement once,
and then tests the condition. It repeatedly evaluates the
statement while the condition remains true. */

do
    statement
while ( condition )

/* An “if .. else” structure tests the condition first. If
it is true, the primary statement is evaluated. Otherwise,
the alternative statement is evaluated. If the alternative
statement is unnecessary to be evaluated, the “else” and
corresponding alternative statement can be omitted. */

if ( condition )
    primary statement
else
    alternative statement

/* A “for” structure evaluates the initial statement at the
beginning then tests the condition. If it is true, the primary
and subsequent statements are evaluated until the condition
becomes false. */

for ( initial statement; condition; subsequent statement )
    primary statement

/* The return statement in a syntax structure specifies
that the parsing of the syntax structure will be terminated
without processing any additional information after this stage.
When a value immediately follows a return statement, this value
shall also be returned as the output of this syntax structure. */

return x

4.9 函数

在本节中主要介绍用于语法描述的比特流函数。

其他函数可参见语法表中的描述。

通常,如果某部分能够直接或间接地引起从比特流中通过子进程读取语法元素,则该部分被称为语法,其余部分被称为函数。

这些函数的规范会利用到比特流位置标识符。 该比特流位置标识符将会定位接下来要读取的比特的位置。

get_position():返回比特流位置标识符的值。

init_symbol(sz):初始化符号解码器的算术解码过程,其大小为sz字节,如8.2.2节所述。

exit_symbol():退出算术解码过程,如8.2.4节所述(其中包含尾部数据读取)。

4.10 描述子

4.10.1 概述

以下描述子用于指定语法元素的解析过程。

小写描述子指定了由比特流中的整数位表示的语法元素;大写描述子指定了由算术编码表示的语法元素。

4.10.2 f(n)

表示直接出现在比特流中的无符号n比特数值。

可以通过调用8.1节中指定的解析过程,从高到低读取这些比特位,并且语法元素等于返回值。

4.10.3 uvlc()

表示直接出现在比特流中的无符号n比特数值的变量长度,其解析过程如下,

uvlc() 
{
    leadingZeros = 0
    while ( 1 ) 
    {
        done                      // Type f(1)
        if ( done )
            break
        leadingZeros++
    }
    if ( leadingZeros >= 32 ) 
    {
        return ( 1 << 32 ) - 1
    }
    value                   // Type f(leadingZeros)
    return value + ( 1 << leadingZeros ) - 1
}

4.10.4 le(n)

表示直接出现在比特流中的无符号小端模式的n字节数值,其解析过程如下,

le(n) 
{
    t = 0
    for ( i = 0; i < n; i++) 
    {
        byte                   // Type f(8)
        t += ( byte << ( i * 8 ) )
    }
    return t
}

注意:仅当比特流位置是字节对齐时,才存在该语法元素。

4.10.5 leb128()

表示无符号整数,该数值表现为一个可变的小端模式字节数。

注意:仅当比特流位置是字节对齐时,才存在该语法元素。

在此编码中,每个字节的最高有效位等于1,以表示应该读取更多字节,或者等于0,以表示编码结束。

变量Leb128Bytes等于此过程中读取的字节数。

其解析过程如下,

leb128()
{
    value = 0
    Leb128Bytes = 0
    for ( i = 0; i < 8; i++ )
    {
        leb128_byte               // Type f(8)
        value |= ( (leb128_byte & 0x7f) << (i*7) )
        Leb128Bytes += 1
        if ( !(leb128_byte & 0x80) )
        {
            break
        }
    }
    return value
}

依据比特流的一致性要求,由leb128解析过程返回的值应该小于或等于(1 << 32)-1。

leb128_byte包含从比特流读取的8位,其中低7位用于计算变量值,最高有效位用于指示要读取更多的字节数。如果i等于7,则按照比特流的一致性要求,leb128_byte的最高有效位应该等于0。(确保此语法的描述子所使用的字节数永远不会超过8)

注意:考虑到编码的前导零位数,有多种方法可以编码相同的值。因此并未要求该语法描述子使用最压缩的表示。这对于编码器的实现是非常有用的,在值确定时,它允许填充固定数量的空间。

4.10.6. su(n)

表示有符号整数,由比特流中的n比特无符号整数转换而来。(无符号整数对应于有符号整数的低n位)

其解析过程如下,

su(n) 
{
    value         // Type f(n)
    signMask = 1 << (n - 1)
    if ( value & signMask )
        value = value - 2 * signMask
    return value
}

4.10.7. ns(n)

无符号编码整数,其最大值为n(输出范围为0..n-1)。

该描述符类似于f(CeilLog2(n)),但是通过采用较少的编码比特数(减少1比特)对非幂序的值域范围中的较小数值进行编码,从而避免了浪费。例如,当n等于5时,编码如下(完整的二进制编码用于比较),

《AV1 Bitstream & Decoding Process Specification》,译名:AV1比特流及解码规范-Chapter 04-公约_第6张图片

其解析过程如下,

ns( n )
{
    w = FloorLog2(n) + 1
    m = (1 << w) - n
    v          // Type f(w - 1)
    if ( v < m )
        return v
    extra_bit        // Type f(1)
    return (v << 1) - m + extra_bit
}

缩写ns代表非对称。该编码是非对称的,因为这些值并非全部使用相同的比特数进行编码。

4.10.8. L(n)

表示无符号算术编码的n比特数值,编码为n个标志(“文字”)。

标志按照从高到低的顺序读取。

语法元素等于read_literal(n)的返回值(有关此过程的规范,请参见8.2.5节)。

4.10.9. S()

表示算术编码符号,其编码来自一个至多包含16个条目的小字母表。

符号解码基于对上下文敏感的CDF(有关此过程的规范,请参见8.3节)。

4.10.10. NS(n)

表示无符号的算数编码整数,其最大值为n(例如输出范围为0..n-1)。

除了使用算数编码,该描述子与ns(n)相同。

其解析过程如下,

NS( n ) 
{
    w = FloorLog2(n) + 1
    m = (1 << w) - n
    v          // Type L(w - 1)
    if ( v < m )
        return v
    extra_bit                 // Type L(1)
    return (v << 1) - m + extra_bit
}

附注

RFC(Request For Comments)指的关于互联网标准的正式文件,其内容必须清晰明了。表达的时候,必须严格区分哪些是“建议”(suggestion),哪些是“要求”(requirement)。为此RFC2119专门对一些词语的涵义做出规定,定义了五个关键词,表示“要求”的严格程度。

MUST:表示绝对要求这样做。REQUIRED或者SHALL,与之同义。

MUST NOT:表示绝对不要求这样做。SHALL NOT与之同义。

SHOULD:表示一般情况下应该这样做,但是在某些特定情况下可以忽视这个要求。RECOMMENDED与之同义。

SHOULD NOT:表示一般情况下不应该这样做,但是在某些特定情况下可以忽视这个要求。NOT RECOMMENDED与之同义。

MAY:表示这个要求完全是可选的(optional),你可以这样做,也可以不这样做。OPTIONAL与之同义。

你可能感兴趣的:(图像处理,AV1比特流及解码规范)