7. 解析过程
7.1. syntax element type h(v) 的过程
此过程用于解析第 5.3.15 节和第 5.3.16 节中 descriptor 为 h(v) 的 syntax element.
7.1.1. abs_dc_coeff_diff 的过程
此过程的输入是 abs_dc_coeff_diff syntax element 的 bits. 此过程的输出是 abs_dc_coeff_diff syntax element 的值. 变量 kParam 派生如下:
kParam = clip(0, 5, PrevDcDiff >> 1)
syntax element abs_dc_coeff_diff 的值通过使用 kParam 调用第 7.1.4 节所规定的 variable-length codes 解析过程获得.
7.1.2. coeff_zero_run 的过程
此过程的输入是 coeff_zero_run syntax element 的 bits.
此过程的输出是 coeff_zero_run syntax element 的值.
变量 kParam 派生如下:
kParam = clip(0, 2, PrevRun >> 2)
syntax element coeff_zero_run 的值通过使用 kParam 调用第 7.1.4 节所规定的 variable-length codes 解析过程获得.
7.1.3. abs_ac_coeff_minus1 的过程
此过程的输入是 abs_ac_coeff_minus1 syntax element 的 bits.
此过程的输出是 abs_ac_coeff_minus1 syntax element 的值.
变量 kParam 派生如下:
kParam = clip(0, 4, PrevLevel >> 2)
syntax element abs_ac_coeff_minus1 的值通过使用 kParam 调用第 7.1.4 节所规定的 variable-length codes 解析过程获得.
7.1.4. Variable-Length Codes 的过程
此过程的输入是 kParam.
此过程的输出是 syntax element 的一个值 symbolValue.
symbolValue 派生如下:
symbolValue = 0
parseExpGolomb = 1
k = kParam
stopLoop = 0
if(read_bits(1) == 1){
parseExpGolomb = 0
}
else{
if(read_bits (1) == 0){
symbolValue += (1 << k)
parseExpGolomb = 0
}
else{
symbolValue += (2 << k)
parseExpGolomb = 1
}
}
if(parseExpGolomb){
do{
if(read_bits(1) == 1){
stopLoop = 1
}
else{
symbolValue += (1 << k)
k++
}
} while(!stopLoop)
}
if(k > 0)
symbolValue += read_bits(k)
图 26: symbolValue 的解析过程
其中, 从 read_bits(n) 返回的值被解释为 n-bit unsigned integer 的二进制表示, most significant bit 写在最前.
7.2. h(v) 的 Codeword 生成过程 (资料性)
此过程规定 descriptor 为 h(v) 的 syntax element 的 code generation process.
7.2.1. abs_dc_coeff_diff 的过程
此过程的输入是 abs_dc_coeff_diff syntax element 的 symbol value.
此过程的输出是 abs_dc_coeff_diff syntax element 的 codeword.
变量 kParam 派生如下:
kParam = clip(0, 5, PrevDcDiff >> 1)
syntax element abs_dc_coeff_diff 的 codeword 通过使用 symbol value symbolValue 和 kParam 调用第 7.2.4 节所规定的 variable-length codes 生成过程获得.
7.2.2. coeff_zero_run 的过程
此过程的输入是 coeff_zero_run syntax element 的 symbol value.
此过程的输出是 coeff_zero_run syntax element 的 codeword.
变量 kParam 派生如下:
kParam = clip(0, 2, PrevRun >> 2)
syntax element coeff_zero_run 的 codeword 通过使用 symbol value symbolValue 和 kParam 调用第 7.2.4 节所规定的 variable-length codes 生成过程获得.
7.2.3. abs_ac_coeff_minus1 的过程
此过程的输入是 abs_ac_coeff_minus1 syntax element 的 symbol value.
此过程的输出是 abs_ac_coeff_minus1 syntax element 的 codeword.
变量 kParam 派生如下:
kParam = clip(0, 4, PrevLevel >> 2)
syntax element abs_ac_coeff_minus1 的 codeword 通过使用 symbol value symbolValue 和 kParam 调用第 7.2.4 节所规定的 variable-length codes 生成过程获得.
7.2.4. Variable-Length Codes 的过程
此过程的输入是 symbolVal 和 kParam.
此过程的输出是 syntax element 的 codeword.
codeword 派生如下:
PrefixVLCTable[3][2] = {{1, 0}, {0, 0}, {0, 1}}
symbolValue = symbolVal
valPrefixVLC = clip(0, 2, symbolVal >> kParam)
bitCount = 0
k = kParam
while(symbolValue >= (1 << k)){
symbolValue -= (1 << k)
if(bitCount < 2)
put_bits(PrefixVLCTable[valPrefixVLC][bitCount], 1)
else
put_bits(0, 1)
if(bitCount >= 2)
k++
bitCount++
}
if(bitCount < 2)
put_bits(PrefixVLCTable[valPrefixVLC][bitCount], 1)
else
put_bits(1, 1)
if(k > 0)
put_bits(symbolValue, k)
图 27: 从 symbolValue 生成 bits
其中, 从 put_bits(v, n) 生成的 codeword 被解释为 n-bit unsigned integer value v 的二进制表示, most significant bit 写在最前.