coding_unit函数在coding_tree中被调用,来对一个cu中的所有预测信息、变换系数等信息进行编码。
其实对一个cu的编码,主要编码3个信息:预测模式、预测数据、变换系数。
void CABACWriter::coding_unit( const CodingUnit& cu, Partitioner& partitioner, CUCtx& cuCtx )
{
CodingStructure& cs = *cu.cs;
// transquant bypass flag
if( cs.pps->getTransquantBypassEnabledFlag() )
{
cu_transquant_bypass_flag( cu ); //变换系数旁路编码标志
}
// skip flag
if( !cs.slice->isIntra() )
{
cu_skip_flag( cu ); //skip模式时编码skip_flag
}
// skip data
if( cu.skip )
{
CHECK( !cu.firstPU->mergeFlag, "Merge flag has to be on!" );
PredictionUnit& pu = *cu.firstPU;
prediction_unit ( pu ); //skip模式时编码预测数据:merge_idx
end_of_ctu ( cu, cuCtx ); //如果ctu结束,编码一个0(一帧最后一个ctu不编码这个0)
return;
}
// prediction mode and partitioning data
pred_mode ( cu ); //编码帧内还是帧间
#if HEVC_USE_PART_SIZE
part_mode ( cu );
#endif
// pcm samples
if