您的位置:首页 > 其它

H.264协议CABAC熵编码学习(三)

2018-03-20 16:28 741 查看
目录:

H.264协议CABAC熵编码学习(一)

H.264协议CABAC熵编码学习(二)

H.264协议CABAC熵编码学习(三)

H.264协议CABAC熵编码学习(四)

H.264协议CABAC熵编码学习(五)

回顾上一节,我们知道ctxIdx都是由以下两个公式推导得出:

ctxIdx=ctxIdxOffset+ctxIdxInc(ctxIdxOffset,binIdx)(1)(1)ctxIdx=ctxIdxOffset+ctxIdxInc(ctxIdxOffset,binIdx)

ctxIdx=ctxIdxOffset+ctxIdxInc(ctxBlockCat)+ctxIdxBlockCatOffset(ctxBlockCat)(2)(2)ctxIdx=ctxIdxOffset+ctxIdxInc(ctxBlockCat)+ctxIdxBlockCatOffset(ctxBlockCat)

这一节,我们将详细介绍宏块级语法元素ctxIdx的推导过程。若语法元素不在以下特殊说明,其ctxIdx的推导过程皆使用式1。其中ctxIdxOffset和maxBinIdxCtx通过协议的Table 9-34查
15066
询,同时可以参考协议9.3.3.1节的Table 9-39,了解通过ctxIdxOffset和binIdx查表获取ctxIdxInc。

ctxIdxInc推导

无论式1还是式2,ctxIdxOffset和ctxIdxBlockCatOffset都可以通过简单的查表获取。而对于ctxIdxInc,个别语法元素需要使用如下方法进行推导。大致推导过程可以分为三种:

使用相邻宏块的语法元素推导

利用已编码的比特串进行推导



残差相关语法元素的推导

接下来,我们将详细的介绍协议中特殊语法元素的ctxIdxInc推导过程。

特殊语法元素ctxInc推导过程

再次说明,若无介绍到,则该语法元素使用式1进行推导,而式1的ctxIdxOffset和ctxIdxInc可以通过查阅Table 9-34获取。

mb_skip_flag

该语法元素表示的是当前块是否是skip块。使用式1计算ctxIdx,假设左边相邻宏块为mbAddrA,上边相邻宏块为mbAddrB,则condTermFlagN(N为A或B)可通过如下关系推导:

若mbAddrN不可用或mbAddrN的mb_skip_flag为1,则condTermFlagN为0

否则condTermFlagN为1

ctxIdxInc可通过如下算式计算:

ctxIdxInc=condTermFlagA+condTermFlagBctxIdxInc=condTermFlagA+condTermFlagB

mb_field_decoding_flag

该语法元素表示当前块是帧宏块对还是场宏块对。使用式1计算ctxIdx。ctxIdxInc推导规则如下:

若mbAddrN不存在,或者mbAddrN是帧宏块,则condTermFlagN为0

否则,condTermFlagN为1

ctxIdxInc可通过如下算式计算:

ctxIdxInc=condTermFlagA+condTermFlagBctxIdxInc=condTermFlagA+condTermFlagB

coded_block_pattern

该语法元素只出现在P块和B块中,低4位表示4个8x8亮度块残差是否为0,高4位用于表示色度块,chroma的具体含义如下:



coded_block_pattern的内存布局:



使用式1计算ctxIdx,亮度的ctxInc的推导如下:

若ctxIdxOffset为73时:

根据binIdx,推导出mbAddrN和luma8x8BlkIdxN,参考协议6.4.11.2节

满足下列条件之一,condTermFlagN为0:

mbAddrN不可用

mbAddrN为PCM

还有两个条件待补充,笔者不是很理解

否则condTermFlagN为1

ctxIdxInc=condTermFlagA+2∗condTermFlagBctxIdxInc=condTermFlagA+2∗condTermFlagB

若ctxIdxOffset为77时:

根据6.4.11.1节推导出mbAddrN

若mbAddrN为PCM,condTermFlagN为1

满足下列条件之一,condTermFlagN为0:

mbAddrN不可用或者为P_SKIP\B_SKIP

binIdx为0,并且mbAddrN的CBP为0

binIdx为1,并且mbaddrN的CBP不为2

否则condTermFlag为1

ctxIdxInc=condTermFlagA+2∗condTermFlagB+((binIdx==1)?4:0)ctxIdxInc=condTermFlagA+2∗condTermFlagB+((binIdx==1)?4:0)

mb_qp_delta

该语法元素表示当前宏块的QP_DELTA。使用式1计算ctxIdx。假设prevMbAddr是当前块在解码/编码顺序上的前一块,若当前块是当前slice的第一个宏块,则prevMbAddr为不可用。

满足以下条件之一,ctxIdxInc为0:

prevMbAddr不可用或者prevMbAddr是SKIP块

prevMbAddr是PCM

prevMbAddr的mb_qp_delta为0

prevMbAddr不是Intra_16x16预测模式,并且coded_block_pattern为0

否则ctxIdxInc为1

intra_chroma_pred_mode

该语法元素表示帧内预测时,chroma的预测方式。使用式1计算ctxIdx。

若满足下列条件之一,condTermFlagN为0:

mbAddrN不可用

mbAddrN为帧间预测模式

mbAddrN为PCM

mbAddrN的intra_chroma_pred_mode为0

否则,condTermFlagN为1

ctxIdxInc的计算公式如下:

ctxIdxInc=condTermFlagA+condTermFlagBctxIdxInc=condTermFlagA+condTermFlagB

transform_size_8x8_flag

该语法元素,表示宏块是否使用8x8的DCT变换。使用式1计算ctxIdx。

若满足下列条件之一,condTermFlagN为0:

mbAddrN不可用

mbAddrN的transform_size_8x8_flag为0

否则,condTermFlagN为1

ctxIdxInc的计算公式如下:

ctxIdxInc=condTermFlagA+condTermFlagBctxIdxInc=condTermFlagA+condTermFlagB
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息