【HEVC学习与研究】30、解码Coding Unit数据
2014-12-16 22:40
405 查看
一个CU结构可以认为是编码过程中作为实际处理过程的一个单元,标准文档的7.3.8.5节说明了CU的语法结构,如下图:
这个结构中,第一个元素cu_transquant_bypass_flag表示是否跳过scaling和变换过程,如果该元素不存在则默认为0。在xDecodeCU函数中,解析该元素的代码如下:
[objc] view
plaincopy
if (pcCU->getSlice()->getPPS()->getTransquantBypassEnableFlag())
{
<span style="white-space:pre"> </span>m_pcEntropyDecoder->decodeCUTransquantBypassFlag( pcCU, uiAbsPartIdx, uiDepth );
}
由于PPS中禁止了TransquantBypassEnableFlag,因此该段代码被跳过,即默认cu_transquant_bypass_flag为0。
第二个元素cu_skip_flag[ x0 ][ y0 ]判断该CU在以P或者B模式编码时,是否使用跳过模式。在I帧编码时,该元素被跳过。解析该元素的部分代码:
[objc] view
plaincopy
if( !pcCU->getSlice()->isIntra())
{
m_pcEntropyDecoder->decodeSkipFlag( pcCU, uiAbsPartIdx, uiDepth );
}
第三个元素pred_mode_flag只有在当前slice不是I slice的情况下才会出现。在解码I帧的数据时将会忽略。
第四个元素part_mode的语义表示当前CU的划分模式。解析的部分为:
[objc] view
plaincopy
Void TDecEntropy::decodePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
{
m_pcEntropyDecoderIf->parsePredMode( pcCU, uiAbsPartIdx, uiDepth );
}
[objc] view
plaincopy
Void TDecSbac::parsePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
{
if( pcCU->getSlice()->isIntra() )
{
pcCU->setPredModeSubParts( MODE_INTRA, uiAbsPartIdx, uiDepth );
return;
}
UInt uiSymbol;
Int iPredMode = MODE_INTER;
m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPredModeSCModel.get( 0, 0, 0 ) );
iPredMode += uiSymbol;
pcCU->setPredModeSubParts( (PredMode)iPredMode, uiAbsPartIdx, uiDepth );
}
在解析的过程中,若发现当前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。
这个结构中,第一个元素cu_transquant_bypass_flag表示是否跳过scaling和变换过程,如果该元素不存在则默认为0。在xDecodeCU函数中,解析该元素的代码如下:
[objc] view
plaincopy
if (pcCU->getSlice()->getPPS()->getTransquantBypassEnableFlag())
{
<span style="white-space:pre"> </span>m_pcEntropyDecoder->decodeCUTransquantBypassFlag( pcCU, uiAbsPartIdx, uiDepth );
}
由于PPS中禁止了TransquantBypassEnableFlag,因此该段代码被跳过,即默认cu_transquant_bypass_flag为0。
第二个元素cu_skip_flag[ x0 ][ y0 ]判断该CU在以P或者B模式编码时,是否使用跳过模式。在I帧编码时,该元素被跳过。解析该元素的部分代码:
[objc] view
plaincopy
if( !pcCU->getSlice()->isIntra())
{
m_pcEntropyDecoder->decodeSkipFlag( pcCU, uiAbsPartIdx, uiDepth );
}
第三个元素pred_mode_flag只有在当前slice不是I slice的情况下才会出现。在解码I帧的数据时将会忽略。
第四个元素part_mode的语义表示当前CU的划分模式。解析的部分为:
[objc] view
plaincopy
Void TDecEntropy::decodePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
{
m_pcEntropyDecoderIf->parsePredMode( pcCU, uiAbsPartIdx, uiDepth );
}
[objc] view
plaincopy
Void TDecSbac::parsePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
{
if( pcCU->getSlice()->isIntra() )
{
pcCU->setPredModeSubParts( MODE_INTRA, uiAbsPartIdx, uiDepth );
return;
}
UInt uiSymbol;
Int iPredMode = MODE_INTER;
m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPredModeSCModel.get( 0, 0, 0 ) );
iPredMode += uiSymbol;
pcCU->setPredModeSubParts( (PredMode)iPredMode, uiAbsPartIdx, uiDepth );
}
在解析的过程中,若发现当前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。
相关文章推荐
- 【HEVC学习与研究】30、解码Coding Unit数据
- 【HEVC学习与研究】36、对帧内预测参考数据进行滤波处理
- 【HEVC学习与研究】35、帧内预测参考数据的获取和滤波处理
- 【HEVC学习与研究】14.HEVC解码中VPS参数集解析
- 【HEVC学习与研究】15、HEVC解码中的SPS解析
- 【HEVC学习与研究】33、编码一个CU(帧内部分)2:帧内预测各种模式的实现
- oracle 11g 学习笔记 10_30(2)_数据字典和动态性能视图
- HEVC学习(十八) —— NAL unit 的解码过程之二
- 【AJAX学习笔记】JSON数据编码解码技术
- 【HEVC学习与研究】31、HM编码器的基本结构
- 学习机器学习 数据处理时 找到的这些链接 可以在上面下载到开源的研究数据数据
- 【ffmpeg学习】利用SDL2.0显示ffmpeg解码出来的数据
- 有关ImplicitStyleManager组件的研究——Silverlight学习笔记[30]
- 【ffmpeg学习】利用SDL2.0显示ffmpeg解码出来的数据
- 【HEVC学习与研究】26、HEVC的算数编码实现
- oracle 11g 学习笔记 10_30(2)_数据字典和动态性能视图
- 学习机器学习 数据处理时 找到的这些链接 可以在上面下载到开源的研究数据数据
- 有关DataForm组件的研究_显示多重数据模型集合——Silverlight学习笔记[24]