解码端的coding_tree_unit函数会返回一个bool值,编码端的coding_tree_unit函数则没有返回值。
解码端返回的bool值赋给isLastCtuOfSliceSegment,标识当前解码ctu是否是一帧的最后一个ctu,如果是最后一个ctu,decompressCtu之后还需要解码剩余bit。
解码端的coding_tree_unit函数流程基本和编码端的一致,不同点在于,解码端必须要进行SAO滤波,而编码端在真正编码时不需要再一次滤波。
入口参数cs是picture的cs,包含存储了一帧内所有ctu的所有信息,area即当前解码ctu的区域。
调用coding_tree函数寻址解码ctu中的所有cu的信息
bool CABACReader::coding_tree_unit( CodingStructure& cs, const UnitArea& area, int (&qps)[2], unsigned ctuRsAddr )
{
CUCtx cuCtx( qps[CH_L] );
Partitioner *partitioner = PartitionerFactory::get( *cs.slice );
partitioner->initCtu( area, CH_L, *cs.slice );
sao( cs, ctuRsAddr ); //滤波,便于下一个ctu的compress
bool isLast = coding_tree( cs, *partitioner, cuCtx ); //ctu解码,返回isLast表示是否为一帧的最后一个ctu
qps[CH_L] = cuCtx.qp;
if( !isLast && CS::isDualITree( cs ) && cs.pcv->chrFormat != CHROMA_400 )
{
//DualITree,I帧时的色度分量解码
CUCtx cuCtxChroma( qps[CH_C] );
partitioner->initCtu( area, CH_C, *cs.slice );
isLast = coding_tree( cs, *partitioner, cuCtxChroma ); //DualITree情况时,只有色度域的最后一个c