上次大致讨论了一下VTM中的三个基本数据结构单元--CU,PU,TU。这三个单元都保存在Unit.h中,与此对应的有对于这三个XU的相关操作,可以在UnitTool中找到,今天,我们就来看一下。
namespace CU
{
bool isIntra (const CodingUnit &cu);//返回当前CU的预测模式是否是帧间
bool isInter (const CodingUnit &cu);//同上
bool isIBC (const CodingUnit &cu);//同上
bool isPLT (const CodingUnit &cu);同上
bool isSameCtu (const CodingUnit &cu, const CodingUnit &cu2);//返回两个cu是否在同一个ctu下
bool isSameSlice (const CodingUnit &cu, const CodingUnit &cu2);//返回两个cu是否在同一个slice下
bool isSameTile (const CodingUnit &cu, const CodingUnit &cu2);//返回两个cu是否在同一个tile下
bool isSameSliceAndTile (const CodingUnit &cu, const CodingUnit &cu2);//返回两个cu是否既在一个slice又在一个tile下
bool isSameSubPic (const CodingUnit &cu, const CodingUnit &cu2);//返回是否在同一个subpic下
bool isLastSubCUOfCtu (const CodingUnit &cu);//是否是当前ctu下的最后一个cu
uint32_t getCtuAddr (const CodingUnit &cu);//通过cu得到对应ctu的地址
int predictQP (const CodingUnit& cu, const int prevQP );//没看懂干嘛的
uint32_t getNumPUs (const CodingUnit& cu);//返回cu中pu的数量
void addPUs ( CodingUnit& cu);//把形参中的cu相关信息更新到cs中的pu
void saveMotionInHMVP (const CodingUnit& cu, const bool isToBeDone );//???
PartSplit getSplitAtDepth (const CodingUnit& cu, const unsigned depth);//返回当前cu是由上一个cu/ctu经哪种分解方式得到的,返回枚举类型,表示splittype
ModeType getModeTypeAtDepth (const CodingUnit& cu, const unsigned depth);//返回预测模式类型
uint32_t getNumNonZeroCoeffNonTsCorner8x8( const CodingUnit& cu, const bool lumaFlag = true, const bool chromaFlag = true );//没找到具体实现
bool isPredRegDiffFromTB(const CodingUnit& cu, const ComponentID compID);//?不懂
bool isFirstTBInPredReg(const CodingUnit& cu, const ComponentID compID, const CompArea &area);//是不是预测区域的第一个TB,但我不知道TB是什么,知道的评论我,蟹蟹
bool isMinWidthPredEnabledForBlkSize(const int w, const int h);//当前块大小是不是能预测的最小宽度
void adjustPredArea(CompArea &area);//将area.width调整为PRED_REG_MIN_WIDTH两者中较大的值
bool isBcwIdxCoded (const CodingUnit& cu);
uint8_t getValidBcwIdx (const CodingUnit& cu);
void setBcwIdx (CodingUnit& cu, uint8_t uh);
uint8_t deriveBcwIdx (uint8_t bcwLO, uint8_t bcwL1);//不知道什么是Bcw
bool bdpcmAllowed (const CodingUnit& cu, const ComponentID compID);//返回BDPCM是否润许,BDPCM可能是一种模式
bool isMTSAllowed (const CodingUnit& cu, const ComponentID compID);//同上,MTS可能是一种模式
bool divideTuInRows ( const CodingUnit &cu );
PartSplit getISPType ( const CodingUnit &cu, const ComponentID compID );
bool isISPLast ( const CodingUnit &cu, const CompArea &tuArea, const ComponentID compID );
bool isISPFirst ( const CodingUnit &cu, const CompArea &tuArea, const ComponentID compID );
bool canUseISP ( const CodingUnit &cu, const ComponentID compID );
bool canUseISP ( const int width, const int height, const int maxTrSize = MAX_TB_SIZEY );
bool canUseLfnstWithISP ( const CompArea& cuArea, const ISPType ispSplitType );
bool canUseLfnstWithISP ( const CodingUnit& cu, const ChannelType chType );
uint32_t getISPSplitDim ( const int width, const int height, const PartSplit ispType );
bool allLumaCBFsAreZero ( const CodingUnit& cu );
PUTraverser traversePUs ( CodingUnit& cu);//创建了一个PUTraverser对象并返回,类似于一个容器,由begin()和end()成员函数,返回一个迭代器;一下三个同理,不过返回的是常量迭代器
TUTraverser traverseTUs ( CodingUnit& cu);
cPUTraverser traversePUs (const CodingUnit& cu);
cTUTraverser traverseTUs (const CodingUnit& cu);
bool hasSubCUNonZeroMVd (const CodingUnit& cu);
bool hasSubCUNonZeroAffineMVd ( const CodingUnit& cu );
uint8_t getSbtInfo (uint8_t idx, uint8_t pos);
uint8_t getSbtIdx (const uint8_t sbtInfo);
uint8_t getSbtPos (const uint8_t sbtInfo);
uint8_t getSbtMode (const uint8_t sbtIdx, const uint8_t sbtPos);
uint8_t getSbtIdxFromSbtMode (const uint8_t sbtMode);
uint8_t getSbtPosFromSbtMode (const uint8_t sbtMode);
uint8_t targetSbtAllowed (uint8_t idx, uint8_t sbtAllowed);
uint8_t numSbtModeRdo (uint8_t sbtAllowed);
bool isSbtMode (const uint8_t sbtInfo);
bool isSameSbtSize (const uint8_t sbtInfo1, const uint8_t sbtInfo2);
bool getRprScaling ( const SPS* sps, const PPS* curPPS, Picture* refPic, int& xScale, int& yScale );
void checkConformanceILRP (Slice *slice);
}
后续的pu以tu会补上,有说的不对的地方也请大家指出,共同学习进步,拜拜~