【HEVC学习与研究】30、解码Coding Unit数据

一个CU结构可以认为是编码过程中作为实际处理过程的一个单元,标准文档的7.3.8.5节说明了CU的语法结构,如下图:




这个结构中,第一个元素cu_transquant_bypass_flag表示是否跳过scaling和变换过程,如果该元素不存在则默认为0。在xDecodeCU函数中,解析该元素的代码如下:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if (pcCU->getSlice()->getPPS()->getTransquantBypassEnableFlag())  
  2. {  
  3. <span style="white-space:pre">    </span>m_pcEntropyDecoder->decodeCUTransquantBypassFlag( pcCU, uiAbsPartIdx, uiDepth );  
  4. }  
由于PPS中禁止了T ransquantBypassEnableFlag,因此该段代码被跳过,即默认cu_transquant_bypass_flag为0。


第二个元素cu_skip_flag[ x0 ][ y0 ]判断该CU在以P或者B模式编码时,是否使用跳过模式。在I帧编码时,该元素被跳过。解析该元素的部分代码:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if( !pcCU->getSlice()->isIntra())  
  2. {  
  3.     m_pcEntropyDecoder->decodeSkipFlag( pcCU, uiAbsPartIdx, uiDepth );  
  4. }  


第三个元素pred_mode_flag只有在当前slice不是I slice的情况下才会出现。在解码I帧的数据时将会忽略。

第四个元素part_mode的语义表示当前CU的划分模式。解析的部分为:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Void TDecEntropy::decodePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )  
  2. {  
  3.   m_pcEntropyDecoderIf->parsePredMode( pcCU, uiAbsPartIdx, uiDepth );  
  4. }  

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Void TDecSbac::parsePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )  
  2. {  
  3.   if( pcCU->getSlice()->isIntra() )  
  4.   {  
  5.     pcCU->setPredModeSubParts( MODE_INTRA, uiAbsPartIdx, uiDepth );  
  6.     return;  
  7.   }  
  8.     
  9.   UInt uiSymbol;  
  10.   Int  iPredMode = MODE_INTER;  
  11.   m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPredModeSCModel.get000 ) );  
  12.   iPredMode += uiSymbol;  
  13.   pcCU->setPredModeSubParts( (PredMode)iPredMode, uiAbsPartIdx, uiDepth );  
  14. }  

在解析的过程中,若发现当前slice是I slice,则这个语法元素直接被设置为1;反之,则解码根据算数解码的结果设置为1或0;

第五个元素pcm_flag表示当前CU中所包含的是pcm_sample( )还是transform_tree( )。调试实例中pcm_flag不存在,因此默认不使用pcm_sample( ),同时也不包含pcm_alignment_zero_bit字段。

prev_intra_luma_pred_flag、mpm_idx和rem_intra_luma_pred_mode等元素都表示了亮度分量的帧内预测模式信息。intra_chroma_pred_mode呢顾名思义保存了色度分量的帧内预测信息。具体的解析方法在研究帧内预测时详述。

rqt_root_cbf元素标识了当前CU中是否包含transform_tree( )部分,若该元素取值为1,则当前CU中包含transform_tree( ),否则就没有transform_tree( )。在该元素未出现的情况下,此值默认为1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值