函数功能: 为当前CTU找到最佳的Y分量最佳SAO_TYPE。saoComponentParamDist
for (typeIdx=0; typeIdx<MAX_NUM_SAO_TYPE; typeIdx++)
//遍历所有的SAO_TYPE,EO_0 , EO_1 , EO_2, EO_3, BO, MAX_NUM_SAO_TYPE.
{
estDist = estSaoTypeDist(yCbCr, typeIdx, shift, lambda, currentDistortionTableBo, currentRdCostTableBo); //得到当前滤波类型的失真值deltaD,以及offset
//SAO_MAX_BO_CLASSES=32 SAO_BO_LEN=4,蓝色代码部分参考文章JCTVC-H0406
if( typeIdx == SAO_BO )
{
for(Int i=0; i< SAO_MAX_BO_CLASSES -SAO_BO_LEN +1; i++)
{
currentRDCost = 0.0;
for(UInt uj = i; uj < i+SAO_BO_LEN; uj++)
{
currentRDCost += currentRdCostTableBo[uj];
}
if( currentRDCost < bestRDCostTableBo)
{
bestRDCostTableBo = currentRDCost;
bestClassTableBo = i;
}
}
estDist = 0;
for(classIdx = bestClassTableBo; classIdx < bestClassTableBo+SAO_BO_LEN; classIdx++)
{
estDist += currentDistortionTableBo[classIdx];
}
}
if(m_dCost[yCbCr][typeIdx] < dCostPartBest) //得到RDcost最小的SAO_TYPE
{
dCostPartBest = m_dCost[yCbCr][typeIdx];
copySaoUnit(saoLcuParam, &saoLcuParamRdo );
bestDist = estDist;
}
// merge left or merge up 计算merge 上面CTU,和左边的CTU时的deltaD.
for (Int idxNeighbor=0;idxNeighbor<2;idxNeighbor++) //idxNeighbor=0,为判断左边CTU,=1,判断上边CTU。
{......
for(classIdx = 0; classIdx < m_iNumClass[typeIdx]; classIdx++)
{
merge_iOffset = saoLcuParamNeighbor->offset[classIdx];//获得上CTU或者左CTU的offset.
estDist += estSaoDist(m_iCount [yCbCr][typeIdx][classIdx+mergeBandPosition+1], merge_iOffset, m_iOffsetOrg[yCbCr][typeIdx][classIdx+mergeBandPosition+1], shift);
//计算当使用Merge 上CTU或者左CTU时的deltaD.
}
compDistortion[idxNeighbor+1] += ((Double)estDist/lambda);
}
}