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

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值