解码slice segment data过程中,每碰到1个syntax element需要解析时,需参考Table 9-48等表格组合解析,整理整个流程解码如下:
9.3.4.2.1
此过程的输入为二值化后的二进制串(码流)和binIdx(当前解析的第几个位)。
此过程的输出为ctxTable, ctxIdx和bypassFlag。
解析基于Table 9-48,过程如下:
1. 如果当前的syntax element不是”termonate”, “bypass”和”na”,那么将执行DecodeDecision的解码流程。
ctxTable定义如Table 9-4所示。
2. ctxIdx等于ctxInc + ctxIdxOffset
3. ctxIdxOffset为Table 9-4中由initType所指定的ctxIdx列表的最小值。
例如:当前解码syntax element=split_cu_flag,initType = 0,那么ctxIdx列表为0..2 (0, 1, 2),那么ctxIdxOffset = 0 (0, 1, 2中的0)。
4. ctxInc定义由Table 9-48所示,由syntax element和binIdx所指定。如果ctxInc多于一个,则由其对应的详细说明指出。
binIdx代表当前已经解析了多少个bit,例如,开始解码syntax element=split_cu_flag,那么设定binIdx = 0,对应Table 9-48所示,ctxInc为0,1,2,共3个待选数值。具体需要使用0,1,2这3个数值中的哪一个,由clause 9.3.4.2.2说明唯一指定。
5. 设定bypassFlag = 0
到些为止,可以得到ctxIdx,ctxTable及baypassFlag数值,可以执行9.3.4.3.2 DecodeDecision过程。
9.3.4.3.2.1
此过程的输入为ctxTable, ctxIdx, ivlCurrRange和ivlOffset
此过程的输出为binVal(1bit数据,0或1)以及更新ivlCurrRange和ivlOffset
DecodeDecision的流程图如下:
上图未知变量有ivlCurrRange,ivlOffset,valMps,pStateIdx,rangeTabLps,tansIdxMps,transIdxLps和RenormD.
tansIdxMps,transIdxLps定义如下:
RenormD定义如下:
valMps和pStateIdx的数值会在DecodeDecision的流程中动态更新,但是其初始值需由9.3.2.2 context初始化过程 给出。
ivlCurrRange和ivlOffset的数值也会在DecodeDecision的流程中动态更新,但是其初始值在syntex element解码开始时给出,如下:
ivlCurrRange初始设定为510,ivlOffset从码流中读取9 bit作为初始值,即:
ivlCurrRange = 510
ivlOffset = read_bits( 9 )
此过程输入为ctxTable和ctxIdx(由此两变量推出initValue的值).
输出为各个syntex element的context列表的pStateIdx和valMps的初始值
Table 9-5到Table 9-37分别给出各个syntex element的initValue的8bit长度的初始值,其包含所有定义在 7.3.8.1 章节的slice segment data里面用到的syntex element。
流程如下:
slopeIdx = initValue >> 4
offsetIdx = initValue & 15
m = slopeIdx * 5 - 45
n = ( offsetIdx << 3 ) - 16
preCtxState = Clip3( 1, 126, ( ( m * Clip3( 0, 51, SliceQpY ) ) >> 4 ) + n )
valMps = ( preCtxState <= 63 ) ? 0 : 1
pStateIdx = valMps ? ( preCtxState - 64 ) : ( 63 - preCtxState )
其中initValue值的推断如下:
InitType由slice header所给的当前帧类型指出。
例如当前帧类型为I, 则initType = 0; 当syntax element = split_cu_flag[][],则获知ctxTable = Table 9-7。所使用的initValue列表为0..2。再由ctxIdx指定特定的initValue。
Table 9-7如下:
列表0..2的initValue值分别为139, 141, 157。具体使用哪个作为当前解码的初始值,需要ctxIdx唯一指定(参考 9.3.4.2 ctxTable, ctxIdx, bypassFlag解析过程 章节第4点)。
长度如表Table 9-43所示:
FL: fixed-length定长编码
TR: truncated Rice 截断莱斯编码
EGk: the k-th order Exp-Golomb 哥仑布编码
cMax = 2代表最多只有2位
对应Table 9-48解析不同的bit会走不同的decode流程
如Table 9-43指出sao_type_idx_luma长度cMax = 2,最多2 bit,因此binIdx = 0,binIdx = 1。
当解码第1 bit (binIdx = 0)时,使用DecodeDecision流程。当解码到第2 bit(binIdx = 1)时,使用bypass的流程 9.3.4.3.4 Bypass decoding process for binary decisions。
如果为terminate,使用的流程为 9.3.4.3.5 Decoding process for binary decisions before termination。
此过程输入 slice segment data和ivlCurrRange, ivlOffset
此过程输出binVal和更新ivlOffset
此过程输入 slice segment data和ivlCurrRange, ivlOffset
此过程输出binVal和更新ivlCurrRange, ivlOffset
FFMPEG示例