函数predIntraGetPredValDC
功能:生成DCValue
// 计算帧内预测DC模式中的平均值
Pel TComPrediction::predIntraGetPredValDC( Int* pSrc, Int iSrcStride, UInt iWidth, UInt iHeight, Bool bAbove, Bool bLeft )
{
Int iInd, iSum = 0;
Pel pDcVal;
if (bAbove)// 如果上方行可用,累加此行
{
for (iInd = 0;iInd < iWidth;iInd++)
{
// pSrc表示参考数组
// 这里会出现负数,是因为指针的指向位置发生了变化
iSum += pSrc[iInd-iSrcStride];
}
}
if (bLeft)// 如果左侧列可用,累加此列
{
for (iInd = 0;iInd < iHeight;iInd++)
{
iSum += pSrc[iInd*iSrcStride-1];
}
}
// 累加完成后,根据标志位情况进行DcValue值的计算
if (bAbove && bLeft)
{
pDcVal = (iSum + iWidth) / (iWidth + iHeight);
}
else if (bAbove)
{
pDcVal = (iSum + iWidth/2) / iWidth;
}
else if (bLeft)
{
pDcVal = (iSum + iHeight/2) / iHeight;
}
else
{//如果左侧、上方均不可用,则使用pSrc[-1]来替代
// 在参考像素的填充过程中(函数fillReferenceSamples)已经计算
// 部分相关代码如下:
/**
Int iDCValue = ( 1<<( g_uiBitDepth + g_uiBitIncrement - 1) );
if (iNumIntraNeighbor == 0)
{
// Fill border with DC value
for (i=0; i<uiWidth; i++)
{
piAdiTemp[i] = iDCValue;
}
for (i=1; i<uiHeight; i++)
{
piAdiTemp[i*uiWidth] = iDCValue;
}
}
*/
pDcVal = pSrc[-1];
}
return pDcVal;
}