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

📄 distortion.cpp

📁 JMVM MPEG MVC/3DAV 测试平台 国际通用标准
💻 CPP
📖 第 1 页 / 共 4 页
字号:
      offset += pucOrg[3] - pucCur[3];
      offset += pucOrg[4] - pucCur[4];
      offset += pucOrg[5] - pucCur[5];
      offset += pucOrg[6] - pucCur[6];
      offset += pucOrg[7] - pucCur[7];
      pucOrg  += MB_BUFFER_WIDTH;
      pucCur  += iStride;
    }

    offset >>= shifts;
    pcDSS->sIcpInMs.sOffset = offset;

    pucCur  = pcDSS->pYSearch;
    pucOrg  = pcDSS->pYOrg;
    iRows   = pcDSS->iRows;

    for(; iRows != 0; iRows-- )
    {
      uiSumY  += Abs( pucOrg[0] - pucCur[0] - offset );
      uiSumY  += Abs( pucOrg[1] - pucCur[1] - offset );
      uiSumY  += Abs( pucOrg[2] - pucCur[2] - offset );
      uiSumY  += Abs( pucOrg[3] - pucCur[3] - offset );
      uiSumY  += Abs( pucOrg[4] - pucCur[4] - offset );
      uiSumY  += Abs( pucOrg[5] - pucCur[5] - offset );
      uiSumY  += Abs( pucOrg[6] - pucCur[6] - offset );
      uiSumY  += Abs( pucOrg[7] - pucCur[7] - offset );

      pucOrg  += MB_BUFFER_WIDTH;
      pucCur  += iStride;
    }
  }
  else
  {
    for( ; iRows != 0; iRows-- )
    {
      uiSumY  += Abs( pucOrg[0] - pucCur[0] );
      uiSumY  += Abs( pucOrg[1] - pucCur[1] );
      uiSumY  += Abs( pucOrg[2] - pucCur[2] );
      uiSumY  += Abs( pucOrg[3] - pucCur[3] );
      uiSumY  += Abs( pucOrg[4] - pucCur[4] );
      uiSumY  += Abs( pucOrg[5] - pucCur[5] );
      uiSumY  += Abs( pucOrg[6] - pucCur[6] );
      uiSumY  += Abs( pucOrg[7] - pucCur[7] );
      pucOrg  += MB_BUFFER_WIDTH;
      pucCur  += iStride;
    }
  }

#else

  for( ; iRows != 0; iRows-- )
  {
    uiSumY  += Abs( pucOrg[0] - pucCur[0] );
    uiSumY  += Abs( pucOrg[1] - pucCur[1] );
    uiSumY  += Abs( pucOrg[2] - pucCur[2] );
    uiSumY  += Abs( pucOrg[3] - pucCur[3] );
    uiSumY  += Abs( pucOrg[4] - pucCur[4] );
    uiSumY  += Abs( pucOrg[5] - pucCur[5] );
    uiSumY  += Abs( pucOrg[6] - pucCur[6] );
    uiSumY  += Abs( pucOrg[7] - pucCur[7] );
    pucOrg  += MB_BUFFER_WIDTH;
    pucCur  += iStride;
  }
#endif

  pucCur  = pcDSS->pUSearch;
  pucOrg  = pcDSS->pUOrg;
  iStride = pcDSS->iCStride;
  iRows   = pcDSS->iRows / 2;

  for( ; iRows != 0; iRows-- )
  {
    uiSumU  += Abs( pucOrg[0] - pucCur[0] );
    uiSumU  += Abs( pucOrg[1] - pucCur[1] );
    uiSumU  += Abs( pucOrg[2] - pucCur[2] );
    uiSumU  += Abs( pucOrg[3] - pucCur[3] );
    pucOrg  += MB_BUFFER_WIDTH;
    pucCur  += iStride;
  }

  pucCur  = pcDSS->pVSearch;
  pucOrg  = pcDSS->pVOrg;
  iRows   = pcDSS->iRows / 2;

  for( ; iRows != 0; iRows-- )
  {
    uiSumV  += Abs( pucOrg[0] - pucCur[0] );
    uiSumV  += Abs( pucOrg[1] - pucCur[1] );
    uiSumV  += Abs( pucOrg[2] - pucCur[2] );
    uiSumV  += Abs( pucOrg[3] - pucCur[3] );
    pucOrg  += MB_BUFFER_WIDTH;
    pucCur  += iStride;
  }

  return uiSumY+uiSumU+uiSumV;
}





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

  UInt uiSum = 0;
  Int  iTemp;

  for( ; iRows != 0; iRows-- )
  {
    iTemp   = pucOrg[0] - pucCur[0];
    uiSum  += iTemp * iTemp;
    iTemp   = pucOrg[1] - pucCur[1];
    uiSum  += iTemp * iTemp;
    iTemp   = pucOrg[2] - pucCur[2];
    uiSum  += iTemp * iTemp;
    iTemp   = pucOrg[3] - pucCur[3];
    uiSum  += iTemp * iTemp;
    iTemp   = pucOrg[4] - pucCur[4];
    uiSum  += iTemp * iTemp;
    iTemp   = pucOrg[5] - pucCur[5];
    uiSum  += iTemp * iTemp;
    iTemp   = pucOrg[6] - pucCur[6];
    uiSum  += iTemp * iTemp;
    iTemp   = pucOrg[7] - pucCur[7];
    uiSum  += iTemp * iTemp;
    pucOrg += MB_BUFFER_WIDTH;
    pucCur += iStride;
  }

  return uiSum;
}




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

  UInt uiSum = 0;

  for( ; iRows != 0; iRows-- )
  {
    uiSum  += Abs( pucOrg[0] - pucCur[0] );
    uiSum  += Abs( pucOrg[1] - pucCur[1] );
    uiSum  += Abs( pucOrg[2] - pucCur[2] );
    uiSum  += Abs( pucOrg[3] - pucCur[3] );
    pucOrg += MB_BUFFER_WIDTH;
    pucCur += iStride;
  }

  return uiSum;
}






UInt XDistortion::xGetYuvSAD4x( XDistSearchStruct* pcDSS )
{
  XPel* pucCur  = pcDSS->pYSearch;
  XPel* pucOrg  = pcDSS->pYOrg;
  Int   iStride = pcDSS->iYStride;
  Int   iRows   = pcDSS->iRows;
  UInt  uiSumY  = 0;
  UInt  uiSumU  = 0;
  UInt  uiSumV  = 0;

  for( ; iRows != 0; iRows-- )
  {
    uiSumY += Abs( pucOrg[0] - pucCur[0] );
    uiSumY += Abs( pucOrg[1] - pucCur[1] );
    uiSumY += Abs( pucOrg[2] - pucCur[2] );
    uiSumY += Abs( pucOrg[3] - pucCur[3] );
    pucOrg += MB_BUFFER_WIDTH;
    pucCur += iStride;
  }

  pucCur  = pcDSS->pUSearch;
  pucOrg  = pcDSS->pUOrg;
  iStride = pcDSS->iCStride;
  iRows   = pcDSS->iRows / 2;

  for( ; iRows != 0; iRows-- )
  {
    uiSumU += Abs( pucOrg[0] - pucCur[0] );
    uiSumU += Abs( pucOrg[1] - pucCur[1] );
    pucOrg += MB_BUFFER_WIDTH;
    pucCur += iStride;
  }

  pucCur  = pcDSS->pVSearch;
  pucOrg  = pcDSS->pVOrg;
  iRows   = pcDSS->iRows / 2;

  for( ; iRows != 0; iRows-- )
  {
    uiSumV += Abs( pucOrg[0] - pucCur[0] );
    uiSumV += Abs( pucOrg[1] - pucCur[1] );
    pucOrg += MB_BUFFER_WIDTH;
    pucCur += iStride;
  }

  return uiSumY+uiSumU+uiSumV;
}




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

  UInt uiSum = 0;
  Int  iTemp;

  for( ; iRows != 0; iRows-- )
  {
    iTemp   = pucOrg[0] - pucCur[0];
    uiSum  += iTemp * iTemp;
    iTemp   = pucOrg[1] - pucCur[1];
    uiSum  += iTemp * iTemp;
    iTemp   = pucOrg[2] - pucCur[2];
    uiSum  += iTemp * iTemp;
    iTemp   = pucOrg[3] - pucCur[3];
    uiSum  += iTemp * iTemp;
    pucOrg += MB_BUFFER_WIDTH;
    pucCur += iStride;
  }

  return uiSum;
}



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

  UInt uiSum = 0;

#if JMVM_ONLY  // JVT-U052
  long offset = 0;
  const long shifts = ( pcDSS->iRows==16 ? 8 : ( pcDSS->iRows==8 ? 7 : 0 ) );

  if (pcDSS->sIcpInMs.sIcAct)
  {
    // FIND OFFSET
    // In this version, compensation for only luminance is considered
    for (iRows=pcDSS->iRows; iRows !=0; iRows--)
    {
      offset += pucOrg[0x0] - pucCur[0x0];
      offset += pucOrg[0x1] - pucCur[0x1];
      offset += pucOrg[0x2] - pucCur[0x2];
      offset += pucOrg[0x3] - pucCur[0x3];
      offset += pucOrg[0x4] - pucCur[0x4];
      offset += pucOrg[0x5] - pucCur[0x5];
      offset += pucOrg[0x6] - pucCur[0x6];
      offset += pucOrg[0x7] - pucCur[0x7];
      offset += pucOrg[0x8] - pucCur[0x8];
      offset += pucOrg[0x9] - pucCur[0x9];
      offset += pucOrg[0xa] - pucCur[0xa];
      offset += pucOrg[0xb] - pucCur[0xb];
      offset += pucOrg[0xc] - pucCur[0xc];
      offset += pucOrg[0xd] - pucCur[0xd];
      offset += pucOrg[0xe] - pucCur[0xe];
      offset += pucOrg[0xf] - pucCur[0xf];
      pucOrg  += MB_BUFFER_WIDTH;
      pucCur  += iStride;
    }

    offset >>= shifts;
    pcDSS->sIcpInMs.sOffset = offset;

    pucCur  = pcDSS->pYSearch;
    pucOrg  = pcDSS->pYOrg;
    iRows   = pcDSS->iRows>>2;
    for( ; iRows != 0; iRows-- )
    {
      uiSum += xCalcHadamard4x4( pcDSS->sIcpInMs, pucOrg+0x0, pucCur+0x0, iStride );
      uiSum += xCalcHadamard4x4( pcDSS->sIcpInMs, pucOrg+0x4, pucCur+0x4, iStride );
      uiSum += xCalcHadamard4x4( pcDSS->sIcpInMs, pucOrg+0x8, pucCur+0x8, iStride );
      uiSum += xCalcHadamard4x4( pcDSS->sIcpInMs, pucOrg+0xc, pucCur+0xc, iStride );
      pucOrg += 4*MB_BUFFER_WIDTH;
      pucCur += 4*iStride;
    }
  } else {
    for( ; iRows != 0; iRows-- )
    {
      uiSum += xCalcHadamard4x4( pucOrg+0x0, pucCur+0x0, iStride );
      uiSum += xCalcHadamard4x4( pucOrg+0x4, pucCur+0x4, iStride );
      uiSum += xCalcHadamard4x4( pucOrg+0x8, pucCur+0x8, iStride );
      uiSum += xCalcHadamard4x4( pucOrg+0xc, pucCur+0xc, iStride );
      pucOrg += 4*MB_BUFFER_WIDTH;
      pucCur += 4*iStride;
    }
  }

#else

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


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

  UInt uiSum = 0;

#if JMVM_ONLY  // JVT-U052
  long offset = 0;
  const long shifts = ( pcDSS->iRows==16 ? 7 : ( pcDSS->iRows==8 ? 6 : 0 ) );

  if (pcDSS->sIcpInMs.sIcAct)
  {
    // FIND OFFSET
    // In this version, compensation for only luminance is considered
    for (iRows=pcDSS->iRows; iRows !=0; iRows--)
    {
      offset += pucOrg[0x0] - pucCur[0x0];
      offset += pucOrg[0x1] - pucCur[0x1];
      offset += pucOrg[0x2] - pucCur[0x2];
      offset += pucOrg[0x3] - pucCur[0x3];
      offset += pucOrg[0x4] - pucCur[0x4];
      offset += pucOrg[0x5] - pucCur[0x5];
      offset += pucOrg[0x6] - pucCur[0x6];
      offset += pucOrg[0x7] - pucCur[0x7];
      pucOrg  += MB_BUFFER_WIDTH;
      pucCur  += iStride;
    }

    offset >>= shifts;
    pcDSS->sIcpInMs.sOffset = offset;

    pucCur  = pcDSS->pYSearch;
    pucOrg  = pcDSS->pYOrg;
    iRows   = pcDSS->iRows>>2;
    for( ; iRows != 0; iRows-- )
    {
      uiSum += xCalcHadamard4x4( pcDSS->sIcpInMs, pucOrg+0x0, pucCur+0x0, iStride );
      uiSum += xCalcHadamard4x4( pcDSS->sIcpInMs, pucOrg+0x4, pucCur+0x4, iStride );
      pucOrg += 4*MB_BUFFER_WIDTH;
      pucCur += 4*iStride;
    }
  }
  else
  {
    for( ; iRows != 0; iRows-- )
    {
      uiSum += xCalcHadamard4x4( pucOrg+0x0, pucCur+0x0, iStride );
      uiSum += xCalcHadamard4x4( pucOrg+0x4, pucCur+0x4, iStride );
      pucOrg += 4*MB_BUFFER_WIDTH;
      pucCur += 4*iStride;
    }
  }

#else

  for( ; iRows != 0; iRows-- )
  {
    uiSum += xCalcHadamard4x4( pucOrg+0x0, pucCur+0x0, iStride );
    uiSum += xCalcHadamard4x4( pucOrg+0x4, pucCur+0x4, iStride );
    pucOrg += 4*MB_BUFFER_WIDTH;
    pucCur += 4*iStride;
  }
#endif

  return uiSum;
}

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

  UInt uiSum = 0;

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



UInt XDistortion::xGetBiSAD16x( 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 -= 16;

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

  return uiSum;
}



UInt XDistortion::xGetBiYuvSAD16x( XDistSearchStruct* pcDSS )
{
  UInt  x;
  XPel* pucSrc1   = pcDSS->pYSearch;
  XPel* pucSrc2   = pcDSS->pYFix;
  XPel* pucOrg    = pcDSS->pYOrg;
  Int   iStride   = pcDSS->iYStride - 16;
  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 = 16; x != 0; x-- )
    {
      uiSumY   += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
      uiOffset1++;
      uiOffset2++;
    }
    uiOffset1 += MB_BUFFER_WIDTH-16;
    uiOffset2 += iStride;
  }

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

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

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

⌨️ 快捷键说明

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