帧内预测函数
函数调用流程
Analysis::compressIntraCU
在该函数中,会对CTU进行回溯式的遍历,在不开启快速编码工具的情况下,会一直遍历到最深层的CU。关键代码如下:
uint64_t Analysis::compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp)
{
.......
bool mightSplit = !(cuGeom.flags & CUGeom::LEAF);//非叶节点即可划分
bool mightNotSplit = !(cuGeom.flags & CUGeom::SPLIT_MANDATORY);//跨CTU的边界CU需要强制划分
bool bAlreadyDecided = m_param->intraRefine != 4 && parentCTU.m_lumaIntraDir[cuGeom.absPartIdx] != (uint8_t)ALL_IDX && !(m_param->bAnalysisType == HEVC_INFO);
bool bDecidedDepth = m_param->intraRefine != 4 && parentCTU.m_cuDepth[cuGeom.absPartIdx] == depth;
int split = 0;
if (m_param->intraRefine && m_param->intraRefine != 4)//使用了分析数据
{
split = m_param->scaleFactor && bDecidedDepth && (!mightNotSplit ||
((cuGeom.log2CUSize == (uint32_t)(g_log2Size[m_param->minCUSize] + 1))));
if (cuGeom.log2CUSize == (uint32_t)(g_log2Size[m_param->minCUSize]) && !bDecidedDepth)
bAlreadyDecided = false;
}
if (bAlreadyDecided)//一般这里都跳过
{
if (bDecidedDepth && mightNotSplit)
{
......
checkIntra(mo