⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 distortion.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    }
    uiOffset1 += MB_BUFFER_WIDTH-8;
    uiOffset2 += iStride;
  }

  pucSrc1   = pcDSS->pVSearch;
  pucSrc2   = pcDSS->pVFix;
  pucOrg    = pcDSS->pVOrg;
  iRows     = pcDSS->iRows / 2;
  uiOffset1 = 0;
  uiOffset2 = 0;

  for( ; iRows != 0; iRows-- )
  {
    for( x = 8; x != 0; x-- )
    {
      uiSumV   += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
      uiOffset1++;
      uiOffset2++;
    }
    uiOffset1 += MB_BUFFER_WIDTH-8;
    uiOffset2 += iStride;
  }

  return uiSumY+uiSumU+uiSumV;
}



UInt XDistortion::xGetBiSAD8x( XDistSearchStruct* pcDSS )
{
  UInt  x;
  XPel* pucSrc1 = pcDSS->pYSearch;
  XPel* pucSrc2 = pcDSS->pYFix;
  XPel* pucOrg  = pcDSS->pYOrg;
  Int   iStride = pcDSS->iYStride;
  Int   iRows   = pcDSS->iRows;

  UInt  uiSum = 0;
  UInt  uiOffset1 = 0;
  UInt  uiOffset2 = 0;

  iStride -= 8;

  for( ; iRows != 0; iRows-- )
  {
    for( x = 8; x != 0; x-- )
    {
      uiSum += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
      uiOffset1++;
      uiOffset2++;
    }
    uiOffset1 += MB_BUFFER_WIDTH-8;
    uiOffset2 += iStride;
  }

  return uiSum;
}


UInt XDistortion::xGetBiYuvSAD8x( XDistSearchStruct* pcDSS )
{
  UInt  x;
  XPel* pucSrc1   = pcDSS->pYSearch;
  XPel* pucSrc2   = pcDSS->pYFix;
  XPel* pucOrg    = pcDSS->pYOrg;
  Int   iStride   = pcDSS->iYStride - 8;
  Int   iRows     = pcDSS->iRows;
  UInt  uiSumY    = 0;
  UInt  uiSumU    = 0;
  UInt  uiSumV    = 0;
  UInt  uiOffset1 = 0;
  UInt  uiOffset2 = 0;

  for( ; iRows != 0; iRows-- )
  {
    for( x = 8; x != 0; x-- )
    {
      uiSumY   += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
      uiOffset1++;
      uiOffset2++;
    }
    uiOffset1 += MB_BUFFER_WIDTH-8;
    uiOffset2 += iStride;
  }

  pucSrc1   = pcDSS->pUSearch;
  pucSrc2   = pcDSS->pUFix;
  pucOrg    = pcDSS->pUOrg;
  iStride   = pcDSS->iCStride - 4;
  iRows     = pcDSS->iRows / 2;
  uiOffset1 = 0;
  uiOffset2 = 0;

  for( ; iRows != 0; iRows-- )
  {
    for( x = 4; x != 0; x-- )
    {
      uiSumU   += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
      uiOffset1++;
      uiOffset2++;
    }
    uiOffset1 += MB_BUFFER_WIDTH-4;
    uiOffset2 += iStride;
  }

  pucSrc1   = pcDSS->pVSearch;
  pucSrc2   = pcDSS->pVFix;
  pucOrg    = pcDSS->pVOrg;
  iRows     = pcDSS->iRows / 2;
  uiOffset1 = 0;
  uiOffset2 = 0;

  for( ; iRows != 0; iRows-- )
  {
    for( x = 4; x != 0; x-- )
    {
      uiSumV   += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
      uiOffset1++;
      uiOffset2++;
    }
    uiOffset1 += MB_BUFFER_WIDTH-4;
    uiOffset2 += iStride;
  }

  return uiSumY+uiSumU+uiSumV;
}



UInt XDistortion::xGetBiSAD4x( XDistSearchStruct* pcDSS )
{
  XPel* pucSrc1 = pcDSS->pYSearch;
  XPel* pucSrc2 = pcDSS->pYFix;
  XPel* pucOrg  = pcDSS->pYOrg;
  Int   iStride = pcDSS->iYStride;
  Int   iRows   = pcDSS->iRows;

  UInt  x;
  UInt  uiSum = 0;
  UInt  uiOffset1 = 0;
  UInt  uiOffset2 = 0;

  iStride -= 4;

  for( ; iRows != 0; iRows-- )
  {
    for( x = 4; x != 0; x-- )
    {
      uiSum += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
      uiOffset1++;
      uiOffset2++;
    }
    uiOffset1 += MB_BUFFER_WIDTH-4;
    uiOffset2 += iStride;
  }

  return uiSum;
}



UInt XDistortion::xGetBiYuvSAD4x( XDistSearchStruct* pcDSS )
{
  UInt  x;
  XPel* pucSrc1   = pcDSS->pYSearch;
  XPel* pucSrc2   = pcDSS->pYFix;
  XPel* pucOrg    = pcDSS->pYOrg;
  Int   iStride   = pcDSS->iYStride - 4;
  Int   iRows     = pcDSS->iRows;
  UInt  uiSumY    = 0;
  UInt  uiSumU    = 0;
  UInt  uiSumV    = 0;
  UInt  uiOffset1 = 0;
  UInt  uiOffset2 = 0;

  for( ; iRows != 0; iRows-- )
  {
    for( x = 4; x != 0; x-- )
    {
      uiSumY   += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
      uiOffset1++;
      uiOffset2++;
    }
    uiOffset1 += MB_BUFFER_WIDTH-4;
    uiOffset2 += iStride;
  }

  pucSrc1   = pcDSS->pUSearch;
  pucSrc2   = pcDSS->pUFix;
  pucOrg    = pcDSS->pUOrg;
  iStride   = pcDSS->iCStride - 2;
  iRows     = pcDSS->iRows / 2;
  uiOffset1 = 0;
  uiOffset2 = 0;

  for( ; iRows != 0; iRows-- )
  {
    for( x = 2; x != 0; x-- )
    {
      uiSumU   += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
      uiOffset1++;
      uiOffset2++;
    }
    uiOffset1 += MB_BUFFER_WIDTH-2;
    uiOffset2 += iStride;
  }

  pucSrc1   = pcDSS->pVSearch;
  pucSrc2   = pcDSS->pVFix;
  pucOrg    = pcDSS->pVOrg;
  iRows     = pcDSS->iRows / 2;
  uiOffset1 = 0;
  uiOffset2 = 0;

  for( ; iRows != 0; iRows-- )
  {
    for( x = 2; x != 0; x-- )
    {
      uiSumV   += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
      uiOffset1++;
      uiOffset2++;
    }
    uiOffset1 += MB_BUFFER_WIDTH-2;
    uiOffset2 += iStride;
  }

  return uiSumY+uiSumU+uiSumV;
}



UInt XDistortion::xGetBiSSE16x( XDistSearchStruct* pcDSS )
{
  XPel* pucSrc1 = pcDSS->pYSearch;
  XPel* pucSrc2 = pcDSS->pYFix;
  XPel* pucOrg  = pcDSS->pYOrg;
  Int   iStride = pcDSS->iYStride;
  Int   iRows   = pcDSS->iRows;

  UInt  x;
  UInt  uiSum = 0;
  UInt  uiOffset1 = 0;
  UInt  uiOffset2 = 0;
  Int   iTemp;

  iStride -= 16;

  for( ; iRows != 0; iRows-- )
  {
    for( x = 16; x != 0; x-- )
    {
      iTemp = pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) ;
      uiSum += iTemp * iTemp;
      uiOffset1++;
      uiOffset2++;
    }
    uiOffset1 += MB_BUFFER_WIDTH-16;
    uiOffset2 += iStride;
  }

  return uiSum;
}


UInt XDistortion::xGetBiSSE8x( XDistSearchStruct* pcDSS )
{
  XPel* pucSrc1 = pcDSS->pYSearch;
  XPel* pucSrc2 = pcDSS->pYFix;
  XPel* pucOrg  = pcDSS->pYOrg;
  Int   iStride = pcDSS->iYStride;
  Int   iRows   = pcDSS->iRows;

  UInt  x;
  UInt  uiSum = 0;
  UInt  uiOffset1 = 0;
  UInt  uiOffset2 = 0;
  Int   iTemp;

  iStride -= 8;

  for( ; iRows != 0; iRows-- )
  {
    for( x = 8; x != 0; x-- )
    {
      iTemp = pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) ;
      uiSum += iTemp * iTemp;
      uiOffset1++;
      uiOffset2++;
    }
    uiOffset1 += MB_BUFFER_WIDTH-8;
    uiOffset2 += iStride;
  }

  return uiSum;
}


UInt XDistortion::xGetBiSSE4x( XDistSearchStruct* pcDSS )
{
  XPel* pucSrc1 = pcDSS->pYSearch;
  XPel* pucSrc2 = pcDSS->pYFix;
  XPel* pucOrg  = pcDSS->pYOrg;
  Int   iStride = pcDSS->iYStride;
  Int   iRows   = pcDSS->iRows;

  UInt  x;
  UInt  uiSum = 0;
  UInt  uiOffset1 = 0;
  UInt  uiOffset2 = 0;
  Int   iTemp;

  iStride -= 4;

  for( ; iRows != 0; iRows-- )
  {
    for( x = 4; x != 0; x-- )
    {
      iTemp = pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) ;
      uiSum += iTemp * iTemp;
      uiOffset1++;
      uiOffset2++;
    }
    uiOffset1 += MB_BUFFER_WIDTH-4;
    uiOffset2 += iStride;
  }

  return uiSum;
}



UInt XDistortion::xGetBiHAD16x ( XDistSearchStruct* pcDSS )
{
  XPel* pucCur  = pcDSS->pYSearch;
  XPel* pucFix  = pcDSS->pYFix;
  XPel* pucOrg  = pcDSS->pYOrg;
  Int   iStride = pcDSS->iYStride;
  Int   iRows   = pcDSS->iRows>>2;

  UInt uiSum = 0;

  for( ; iRows != 0; iRows-- )
  {
    uiSum += xCalcBiHadamard4x4( pucOrg+0x0, pucFix+0x0, pucCur+0x0, iStride );
    uiSum += xCalcBiHadamard4x4( pucOrg+0x4, pucFix+0x4, pucCur+0x4, iStride );
    uiSum += xCalcBiHadamard4x4( pucOrg+0x8, pucFix+0x8, pucCur+0x8, iStride );
    uiSum += xCalcBiHadamard4x4( pucOrg+0xc, pucFix+0xc, pucCur+0xc, iStride );
    pucOrg += 4*MB_BUFFER_WIDTH;
    pucCur += 4*iStride;
    pucFix += 4*MB_BUFFER_WIDTH;
  }
  return uiSum;
}


UInt XDistortion::xGetBiHAD8x  ( XDistSearchStruct* pcDSS )
{
  XPel* pucCur  = pcDSS->pYSearch;
  XPel* pucFix  = pcDSS->pYFix;
  XPel* pucOrg  = pcDSS->pYOrg;
  Int   iStride = pcDSS->iYStride;
  Int   iRows   = pcDSS->iRows>>2;

  UInt uiSum = 0;

  for( ; iRows != 0; iRows-- )
  {
    uiSum += xCalcBiHadamard4x4( pucOrg+0x0, pucFix+0x0, pucCur+0x0, iStride );
    uiSum += xCalcBiHadamard4x4( pucOrg+0x4, pucFix+0x4, pucCur+0x4, iStride );
    pucOrg += 4*MB_BUFFER_WIDTH;
    pucCur += 4*iStride;
    pucFix += 4*MB_BUFFER_WIDTH;
  }
  return uiSum;
}

UInt XDistortion::xGetBiHAD4x  ( XDistSearchStruct* pcDSS )
{
  XPel* pucCur  = pcDSS->pYSearch;
  XPel* pucFix  = pcDSS->pYFix;
  XPel* pucOrg  = pcDSS->pYOrg;
  Int   iStride = pcDSS->iYStride;
  Int   iRows   = pcDSS->iRows>>2;

  UInt uiSum = 0;

  for( ; iRows != 0; iRows-- )
  {
    uiSum += xCalcBiHadamard4x4( pucOrg+0x0, pucFix+0x0, pucCur+0x0, iStride );
    pucOrg += 4*MB_BUFFER_WIDTH;
    pucCur += 4*iStride;
    pucFix += 4*MB_BUFFER_WIDTH;
  }
  return uiSum;
}

//TMM_WP
Void XDistortion::xGetWeight(XPel *pucRef, XPel *pucOrg, const UInt uiStride,
                             const UInt uiHeight, const UInt uiWidth,
                             Double &dDCOrg, Double &dDCRef)
{
    /* get dc of org & ref frame */
    for (UInt y = 0; y < uiHeight; y++)
    {
        for (UInt x = 0; x < uiWidth; x++)
        {
            dDCOrg += (Double)pucOrg[x];
            dDCRef += (Double)pucRef[x];
        }

        pucOrg += uiStride;
        pucRef += uiStride;
    }
}



ErrVal XDistortion::getLumaWeight( YuvPicBuffer* pcOrgPicBuffer,
                                   YuvPicBuffer* pcRefPicBuffer, Double& rfWeight,
                                   UInt uiLumaLog2WeightDenom)
{
  ROT( NULL == pcRefPicBuffer );
  ROT( NULL == pcOrgPicBuffer );

  const Int iStride = pcRefPicBuffer->getLStride();
  const Int iHeight = pcRefPicBuffer->getLHeight();
  const Int iWidth  = pcRefPicBuffer->getLWidth();

  AOT_DBG( iStride != pcOrgPicBuffer->getLStride() );

  XPel* pucRef = pcRefPicBuffer->getLumOrigin();
  XPel* pucOrg = pcOrgPicBuffer->getLumOrigin();

  Double dDCOrg = 0;
  Double dDCRef = 0;
  xGetWeight( pucRef, pucOrg, iStride, iHeight, iWidth, dDCOrg, dDCRef);

  if(dDCRef)
  {
      rfWeight = (Int) (rfWeight * dDCOrg / dDCRef + 0.5);

      if(rfWeight < -64 || rfWeight > 127)
          rfWeight = 1 << uiLumaLog2WeightDenom;
  }

  return Err::m_nOK;
}


ErrVal XDistortion::getChromaWeight( YuvPicBuffer* pcOrgPicBuffer,
                                     YuvPicBuffer* pcRefPicBuffer,
                                     Double& rfWeight, UInt uiChromaLog2WeightDenom, Bool bCb )
{
  ROT( NULL == pcRefPicBuffer );
  ROT( NULL == pcOrgPicBuffer );

  /* no weights for chroma */
  rfWeight = 1 << uiChromaLog2WeightDenom;

  return Err::m_nOK;
}

ErrVal XDistortion::getLumaOffsets( YuvPicBuffer* pcOrgPicBuffer,
                                    YuvPicBuffer* pcRefPicBuffer, Double& rfOffset )
{
  ROT( NULL == pcRefPicBuffer );
  ROT( NULL == pcOrgPicBuffer );

  const Int iStride = pcRefPicBuffer->getLStride();
  const Int iHeight = pcRefPicBuffer->getLHeight();
  const Int iWidth  = pcRefPicBuffer->getLWidth();

  AOT_DBG( iStride != pcOrgPicBuffer->getLStride() );

  XPel* pucRef = pcRefPicBuffer->getLumOrigin();
  XPel* pucOrg = pcOrgPicBuffer->getLumOrigin();

  Double dDCOrg = 0;
  Double dDCRef = 0;
  xGetWeight( pucRef, pucOrg, iStride, iHeight, iWidth, dDCOrg, dDCRef);

  rfOffset = (Int) ( ( (dDCOrg - dDCRef)/ (iHeight * iWidth) ) + 0.5);

  rfOffset = (rfOffset < -128) ? -128 : (rfOffset > 127 ? 127 : rfOffset);

  return Err::m_nOK;
}


ErrVal XDistortion::getChromaOffsets( YuvPicBuffer* pcOrgPicBuffer,
                                      YuvPicBuffer* pcRefPicBuffer,
                                      Double& rfOffset, Bool bCb )
{
  ROT( NULL == pcRefPicBuffer );
  ROT( NULL == pcOrgPicBuffer );

  /* no offsets for chroma */
  rfOffset = 0;

  return Err::m_nOK;
}
//TMM_WP



H264AVC_NAMESPACE_END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -