HEVC代码阅读- -predIntraGetPredValDC函数

函数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;
}

 

 
posted @ 2021-02-02 18:06  Keep_Silent  阅读(1)  评论(0编辑  收藏  举报