void CodingStructure::initSubStructure( CodingStructure& subStruct, const ChannelType _chType, const UnitArea &subArea, const bool &isTuEnc )
{
CHECK( this == &subStruct, "Trying to init self as sub-structure" );
subStruct.useDbCost = false;
subStruct.costDbOffset = 0;
for( uint32_t i = 0; i < subStruct.area.blocks.size(); i++ )
{
CHECKD( subStruct.area.blocks[i].size() != subArea.blocks[i].size(), "Trying to init sub-structure of incompatible size" );
subStruct.area.blocks[i].pos() = subArea.blocks[i].pos();
}
if( parent )
{
// allow this to be false at the top level (need for edge CTU's)
CHECKD( !area.contains( subStruct.area ), "Trying to init sub-structure not contained in the parent" );
}
subStruct.parent = this;
subStruct.picture = picture;
subStruct.sps = sps;
subStruct.vps = vps;
subStruct.pps = pps;
subStruct.picHeader = picHeader;
memcpy(subStruct.alfApss, alfApss, sizeof(alfApss));
subStruct.lmcsAps = lmcsAps;
subStruct.scalinglistAps = scalinglistAps;
subStruct.slice = slice;
subStruct.baseQP = baseQP;
subStruct.prevQP[_chType]
= prevQP[_chType];
subStruct.pcv = pcv;
subStruct.m_isTuEnc = isTuEnc;
subStruct.motionLut = motionLut;
subStruct.prevPLT = prevPLT;
subStruct.treeType = treeType;
subStruct.modeType = modeType;
subStruct.initStructData( currQP[_chType] );
if( isTuEnc )
{
CHECKD( area != subStruct.area, "Trying to init sub-structure for TU-encoding of incompatible size" );
for( const auto &pcu : cus )
{
CodingUnit &cu = subStruct.addCU( *pcu, _chType );
cu = *pcu;
}
for( const auto &ppu : pus )
{
PredictionUnit &pu = subStruct.addPU( *ppu, _chType );
pu = *ppu;
}
unsigned numComp = ::getNumberValidChannels( area.chromaFormat );
for( unsigned i = 0; i < numComp; i++)
{
::memcpy( subStruct.m_isDecomp[i], m_isDecomp[i], (unitScale[i].scale( area.blocks[i].size() ).area() * sizeof( bool ) ) );
}
}
}
for循环:将已划分的子CU的YCbCr三个分量的位置和宽高填充,举例,Y为64 X 64,CbCr都为 32 X 32
if语句:检验当前CU是否在父节点这个CTU中
下面是将一些共用参数传给当前子CU