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推导过程。
若mbAddrN不可用或mbAddrN的mb_skip_flag为1,则condTermFlagN为0
否则condTermFlagN为1
ctxIdxInc可通过如下算式计算:
ctxIdxInc=condTermFlagA+condTermFlagBctxIdxInc=condTermFlagA+condTermFlagB
若mbAddrN不存在,或者mbAddrN是帧宏块,则condTermFlagN为0
否则,condTermFlagN为1
ctxIdxInc可通过如下算式计算:
ctxIdxInc=condTermFlagA+condTermFlagBctxIdxInc=condTermFlagA+condTermFlagB
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)
满足以下条件之一,ctxIdxInc为0:
prevMbAddr不可用或者prevMbAddr是SKIP块
prevMbAddr是PCM
prevMbAddr的mb_qp_delta为0
prevMbAddr不是Intra_16x16预测模式,并且coded_block_pattern为0
否则ctxIdxInc为1
若满足下列条件之一,condTermFlagN为0:
mbAddrN不可用
mbAddrN为帧间预测模式
mbAddrN为PCM
mbAddrN的intra_chroma_pred_mode为0
否则,condTermFlagN为1
ctxIdxInc的计算公式如下:
ctxIdxInc=condTermFlagA+condTermFlagBctxIdxInc=condTermFlagA+condTermFlagB
若满足下列条件之一,condTermFlagN为0:
mbAddrN不可用
mbAddrN的transform_size_8x8_flag为0
否则,condTermFlagN为1
ctxIdxInc的计算公式如下:
ctxIdxInc=condTermFlagA+condTermFlagBctxIdxInc=condTermFlagA+condTermFlagB
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
相关文章推荐
- H.264协议CABAC熵编码学习(一)
- H.264协议CABAC熵编码学习(二)
- H.264协议CABAC熵编码学习(五)
- H.264/AVC 标准中CAVLC 和CABAC 熵编码算法研究
- 如何学习h.264协议
- H264学习笔记(4):CABAC基于上下文的自适应二进制熵编码
- MPEG4 & H.264学习笔记之三 ------ 熵编码
- H.264/AVC 标准中CAVLC 和CABAC 熵编码算法研究
- 如何学习h.264协议
- 如何学习h.264协议
- 如何学习h.264协议
- H.264学习笔记5——熵编码之CAVLC
- MPEG4 & H.264学习笔记之三 ------ 熵编码
- 如何学习h.264协议
- H.264/AVC 标准中CAVLC 和CABAC 熵编码算法研究
- H.264/AVC 标准中CAVLC 和CABAC 熵编码算法研究
- 如何学习h.264协议----vediodog
- H.264/AVC 标准中CAVLC 和CABAC 熵编码算法研究
- MPEG4 & H.264学习笔记之三 ------ 熵编码
- H.264/AVC 标准中CAVLC 和CABAC 熵编码算法研究