HEVC Cabac解码

Cabac解码说明

解码slice segment data过程中,每碰到1syntax element需要解析时,需参考Table 9-48等表格组合解析,整理整个流程解码如下:

9.3.4.2 ctxTable, ctxIdx, bypassFlag解析过程

9.3.4.2.1

此过程的输入为二值化后的二进制串(码流)和binIdx(当前解析的第几个位)。

此过程的输出为ctxTable ctxIdxbypassFlag

解析基于Table 9-48,过程如下:

1.       如果当前的syntax element不是”termonate”, “bypass””na”,那么将执行DecodeDecision的解码流程。

ctxTable定义如Table 9-4所示。

HEVC Cabac解码_第1张图片

2.       ctxIdx等于ctxInc + ctxIdxOffset

3.       ctxIdxOffsetTable 9-4中由initType所指定的ctxIdx列表的最小值。

HEVC Cabac解码_第2张图片

例如:当前解码syntax element=split_cu_flaginitType = 0,那么ctxIdx列表为0..2 (0, 1, 2),那么ctxIdxOffset = 0   (0, 1, 2中的0)

4.    ctxInc定义由Table 9-48所示,由syntax elementbinIdx所指定。如果ctxInc多于一个,则由其对应的详细说明指出。

binIdx代表当前已经解析了多少个bit,例如,开始解码syntax element=split_cu_flag,那么设定binIdx = 0,对应Table 9-48所示,ctxInc0,1,2,共3个待选数值。具体需要使用0,1,23个数值中的哪一个,由clause 9.3.4.2.2说明唯一指定。

 

HEVC Cabac解码_第3张图片

 

 

HEVC Cabac解码_第4张图片

5.     设定bypassFlag = 0

到些为止,可以得到ctxIdxctxTablebaypassFlag数值,可以执行9.3.4.3.2 DecodeDecision过程。

 

9.3.4.3.2 DecodeDecision过程

9.3.4.3.2.1

此过程的输入为ctxTable, ctxIdx, ivlCurrRangeivlOffset

此过程的输出为binVal1bit数据,01)以及更新ivlCurrRangeivlOffset

DecodeDecision的流程图如下:

HEVC Cabac解码_第5张图片

上图未知变量有ivlCurrRangeivlOffsetvalMpspStateIdxrangeTabLpstansIdxMpstransIdxLpsRenormD.

  1.        rangeTabLpsTable 9-52所定义,如下:

HEVC Cabac解码_第6张图片

tansIdxMpstransIdxLps定义如下:

 

HEVC Cabac解码_第7张图片

RenormD定义如下:

 

HEVC Cabac解码_第8张图片

 

 

valMpspStateIdx的数值会在DecodeDecision的流程中动态更新,但是其初始值需由9.3.2.2 context初始化过程 给出。

 

ivlCurrRangeivlOffset的数值也会在DecodeDecision的流程中动态更新,但是其初始值在syntex element解码开始时给出,如下:

ivlCurrRange初始设定为510ivlOffset从码流中读取9 bit作为初始值,即:

ivlCurrRange = 510

ivlOffset = read_bits( 9 )

9.3.2.2 context初始化过程

此过程输入为ctxTablectxIdx(由此两变量推出initValue的值).

输出为各个syntex elementcontext列表的pStateIdxvalMps的初始值

Table 9-5Table 9-37分别给出各个syntex elementinitValue8bit长度的初始值,其包含所有定义在 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值的推断如下:

HEVC Cabac解码_第9张图片

InitTypeslice header所给的当前帧类型指出。

例如当前帧类型为I, initType = 0; syntax element = split_cu_flag[][],则获知ctxTable = Table 9-7。所使用的initValue列表为0..2。再由ctxIdx指定特定的initValue

 

Table 9-7如下:

HEVC Cabac解码_第10张图片

列表0..2initValue值分别为139, 141, 157。具体使用哪个作为当前解码的初始值,需要ctxIdx唯一指定(参考 9.3.4.2 ctxTable, ctxIdx, bypassFlag解析过程 章节第4点)。

 

Syntax element的长度说明

长度如表Table 9-43所示:

 

HEVC Cabac解码_第11张图片

 

 

FL: fixed-length定长编码

TR: truncated Rice 截断莱斯编码

EGk: the k-th order Exp-Golomb 哥仑布编码

cMax = 2代表最多只有2

 

对应Table 9-48解析不同的bit会走不同的decode流程

 

HEVC Cabac解码_第12张图片

 

Table 9-43指出sao_type_idx_luma长度cMax = 2,最多2 bit,因此binIdx = 0binIdx = 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

 

9.3.4.3.4 Bypass decoding process for binary decisions

此过程输入 slice segment dataivlCurrRange, ivlOffset

此过程输出binVal和更新ivlOffset

 

 

 

 

HEVC Cabac解码_第13张图片

 

 

9.3.4.3.5 Decoding process for binary decisions before termination

此过程输入 slice segment dataivlCurrRange, ivlOffset

此过程输出binVal和更新ivlCurrRange, ivlOffset

 

HEVC Cabac解码_第14张图片

 

FFMPEG示例

 

HEVC Cabac解码_第15张图片

 

 

HEVC Cabac解码_第16张图片

 

 

HEVC Cabac解码_第17张图片

 

 

 

 

 

你可能感兴趣的:(cabac)