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

📄 distortion.cpp

📁 JMVM MPEG MVC/3DAV 测试平台 国际通用标准
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  for( n = 0; n < 4; n++ )
  {
    aai[n][0] = pucOrg[0] - ((pucCur[0] + pPelFix[0] + 1)>>1);
    aai[n][1] = pucOrg[1] - ((pucCur[1] + pPelFix[1] + 1)>>1);
    aai[n][2] = pucOrg[2] - ((pucCur[2] + pPelFix[2] + 1)>>1);
    aai[n][3] = pucOrg[3] - ((pucCur[3] + pPelFix[3] + 1)>>1);
    pucCur += iStride;
    pucOrg  += MB_BUFFER_WIDTH;
    pPelFix += 24;
  }

  for( n = 0; n < 4; n++ )
  {
    ai[0] = aai[0][n] + aai[3][n];
    ai[1] = aai[1][n] + aai[2][n];
    ai[2] = aai[1][n] - aai[2][n];
    ai[3] = aai[0][n] - aai[3][n];

    aai[0][n] = ai[0] + ai[1];
    aai[2][n] = ai[0] - ai[1];
    aai[1][n] = ai[2] + ai[3];
    aai[3][n] = ai[3] - ai[2];
  }

  for( n = 0; n < 4; n++ )
  {
    ai[0] = aai[n][0] + aai[n][3];
    ai[1] = aai[n][1] + aai[n][2];
    ai[2] = aai[n][1] - aai[n][2];
    ai[3] = aai[n][0] - aai[n][3];

    uiSum += Abs( ai[0] + ai[1] );
    uiSum += Abs( ai[0] - ai[1] );
    uiSum += Abs( ai[2] + ai[3] );
    uiSum += Abs( ai[3] - ai[2] );
  }

  return uiSum/2;

}
#endif


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

  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 !=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;
    for(; iRows != 0; iRows-- )
    {
      uiSum  += Abs( pucOrg[0x0] - pucCur[0x0] - offset );
      uiSum  += Abs( pucOrg[0x1] - pucCur[0x1] - offset );
      uiSum  += Abs( pucOrg[0x2] - pucCur[0x2] - offset );
      uiSum  += Abs( pucOrg[0x3] - pucCur[0x3] - offset );
      uiSum  += Abs( pucOrg[0x4] - pucCur[0x4] - offset );
      uiSum  += Abs( pucOrg[0x5] - pucCur[0x5] - offset );
      uiSum  += Abs( pucOrg[0x6] - pucCur[0x6] - offset );
      uiSum  += Abs( pucOrg[0x7] - pucCur[0x7] - offset );
      uiSum  += Abs( pucOrg[0x8] - pucCur[0x8] - offset );
      uiSum  += Abs( pucOrg[0x9] - pucCur[0x9] - offset );
      uiSum  += Abs( pucOrg[0xa] - pucCur[0xa] - offset );
      uiSum  += Abs( pucOrg[0xb] - pucCur[0xb] - offset );
      uiSum  += Abs( pucOrg[0xc] - pucCur[0xc] - offset );
      uiSum  += Abs( pucOrg[0xd] - pucCur[0xd] - offset );
      uiSum  += Abs( pucOrg[0xe] - pucCur[0xe] - offset );
      uiSum  += Abs( pucOrg[0xf] - pucCur[0xf] - offset );

      pucOrg  += MB_BUFFER_WIDTH;
      pucCur  += iStride;
    }
  }
  else
  {
    for( ; iRows != 0; iRows-- )
    {
      uiSum += Abs( pucOrg[0x0] - pucCur[0x0] );
      uiSum += Abs( pucOrg[0x1] - pucCur[0x1] );
      uiSum += Abs( pucOrg[0x2] - pucCur[0x2] );
      uiSum += Abs( pucOrg[0x3] - pucCur[0x3] );
      uiSum += Abs( pucOrg[0x4] - pucCur[0x4] );
      uiSum += Abs( pucOrg[0x5] - pucCur[0x5] );
      uiSum += Abs( pucOrg[0x6] - pucCur[0x6] );
      uiSum += Abs( pucOrg[0x7] - pucCur[0x7] );
      uiSum += Abs( pucOrg[0x8] - pucCur[0x8] );
      uiSum += Abs( pucOrg[0x9] - pucCur[0x9] );
      uiSum += Abs( pucOrg[0xa] - pucCur[0xa] );
      uiSum += Abs( pucOrg[0xb] - pucCur[0xb] );
      uiSum += Abs( pucOrg[0xc] - pucCur[0xc] );
      uiSum += Abs( pucOrg[0xd] - pucCur[0xd] );
      uiSum += Abs( pucOrg[0xe] - pucCur[0xe] );
      uiSum += Abs( pucOrg[0xf] - pucCur[0xf] );
      pucOrg += MB_BUFFER_WIDTH;
      pucCur += iStride;
    }
  }

#else

  for( ; iRows != 0; iRows-- )
  {
    uiSum += Abs( pucOrg[0x0] - pucCur[0x0] );
    uiSum += Abs( pucOrg[0x1] - pucCur[0x1] );
    uiSum += Abs( pucOrg[0x2] - pucCur[0x2] );
    uiSum += Abs( pucOrg[0x3] - pucCur[0x3] );
    uiSum += Abs( pucOrg[0x4] - pucCur[0x4] );
    uiSum += Abs( pucOrg[0x5] - pucCur[0x5] );
    uiSum += Abs( pucOrg[0x6] - pucCur[0x6] );
    uiSum += Abs( pucOrg[0x7] - pucCur[0x7] );
    uiSum += Abs( pucOrg[0x8] - pucCur[0x8] );
    uiSum += Abs( pucOrg[0x9] - pucCur[0x9] );
    uiSum += Abs( pucOrg[0xa] - pucCur[0xa] );
    uiSum += Abs( pucOrg[0xb] - pucCur[0xb] );
    uiSum += Abs( pucOrg[0xc] - pucCur[0xc] );
    uiSum += Abs( pucOrg[0xd] - pucCur[0xd] );
    uiSum += Abs( pucOrg[0xe] - pucCur[0xe] );
    uiSum += Abs( pucOrg[0xf] - pucCur[0xf] );
    pucOrg += MB_BUFFER_WIDTH;
    pucCur += iStride;
  }
#endif

  return uiSum;
}





UInt XDistortion::xGetYuvSAD16x( 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;

#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 !=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;
    for(; iRows != 0; iRows-- )
    {
      uiSumY  += Abs( pucOrg[0x0] - pucCur[0x0] - offset );
      uiSumY  += Abs( pucOrg[0x1] - pucCur[0x1] - offset );
      uiSumY  += Abs( pucOrg[0x2] - pucCur[0x2] - offset );
      uiSumY  += Abs( pucOrg[0x3] - pucCur[0x3] - offset );
      uiSumY  += Abs( pucOrg[0x4] - pucCur[0x4] - offset );
      uiSumY  += Abs( pucOrg[0x5] - pucCur[0x5] - offset );
      uiSumY  += Abs( pucOrg[0x6] - pucCur[0x6] - offset );
      uiSumY  += Abs( pucOrg[0x7] - pucCur[0x7] - offset );
      uiSumY  += Abs( pucOrg[0x8] - pucCur[0x8] - offset );
      uiSumY  += Abs( pucOrg[0x9] - pucCur[0x9] - offset );
      uiSumY  += Abs( pucOrg[0xa] - pucCur[0xa] - offset );
      uiSumY  += Abs( pucOrg[0xb] - pucCur[0xb] - offset );
      uiSumY  += Abs( pucOrg[0xc] - pucCur[0xc] - offset );
      uiSumY  += Abs( pucOrg[0xd] - pucCur[0xd] - offset );
      uiSumY  += Abs( pucOrg[0xe] - pucCur[0xe] - offset );
      uiSumY  += Abs( pucOrg[0xf] - pucCur[0xf] - offset );

      pucOrg  += MB_BUFFER_WIDTH;
      pucCur  += iStride;
    }
  }
  else
  {
    for( ; iRows != 0; iRows-- )
    {
      uiSumY  += Abs( pucOrg[0x0] - pucCur[0x0] );
      uiSumY  += Abs( pucOrg[0x1] - pucCur[0x1] );
      uiSumY  += Abs( pucOrg[0x2] - pucCur[0x2] );
      uiSumY  += Abs( pucOrg[0x3] - pucCur[0x3] );
      uiSumY  += Abs( pucOrg[0x4] - pucCur[0x4] );
      uiSumY  += Abs( pucOrg[0x5] - pucCur[0x5] );
      uiSumY  += Abs( pucOrg[0x6] - pucCur[0x6] );
      uiSumY  += Abs( pucOrg[0x7] - pucCur[0x7] );
      uiSumY  += Abs( pucOrg[0x8] - pucCur[0x8] );
      uiSumY  += Abs( pucOrg[0x9] - pucCur[0x9] );
      uiSumY  += Abs( pucOrg[0xa] - pucCur[0xa] );
      uiSumY  += Abs( pucOrg[0xb] - pucCur[0xb] );
      uiSumY  += Abs( pucOrg[0xc] - pucCur[0xc] );
      uiSumY  += Abs( pucOrg[0xd] - pucCur[0xd] );
      uiSumY  += Abs( pucOrg[0xe] - pucCur[0xe] );
      uiSumY  += Abs( pucOrg[0xf] - pucCur[0xf] );
      pucOrg  += MB_BUFFER_WIDTH;
      pucCur  += iStride;
    }
  }

#else

  for( ; iRows != 0; iRows-- )
  {
    uiSumY  += Abs( pucOrg[0x0] - pucCur[0x0] );
    uiSumY  += Abs( pucOrg[0x1] - pucCur[0x1] );
    uiSumY  += Abs( pucOrg[0x2] - pucCur[0x2] );
    uiSumY  += Abs( pucOrg[0x3] - pucCur[0x3] );
    uiSumY  += Abs( pucOrg[0x4] - pucCur[0x4] );
    uiSumY  += Abs( pucOrg[0x5] - pucCur[0x5] );
    uiSumY  += Abs( pucOrg[0x6] - pucCur[0x6] );
    uiSumY  += Abs( pucOrg[0x7] - pucCur[0x7] );
    uiSumY  += Abs( pucOrg[0x8] - pucCur[0x8] );
    uiSumY  += Abs( pucOrg[0x9] - pucCur[0x9] );
    uiSumY  += Abs( pucOrg[0xa] - pucCur[0xa] );
    uiSumY  += Abs( pucOrg[0xb] - pucCur[0xb] );
    uiSumY  += Abs( pucOrg[0xc] - pucCur[0xc] );
    uiSumY  += Abs( pucOrg[0xd] - pucCur[0xd] );
    uiSumY  += Abs( pucOrg[0xe] - pucCur[0xe] );
    uiSumY  += Abs( pucOrg[0xf] - pucCur[0xf] );
    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[0x0] - pucCur[0x0] );
    uiSumU  += Abs( pucOrg[0x1] - pucCur[0x1] );
    uiSumU  += Abs( pucOrg[0x2] - pucCur[0x2] );
    uiSumU  += Abs( pucOrg[0x3] - pucCur[0x3] );
    uiSumU  += Abs( pucOrg[0x4] - pucCur[0x4] );
    uiSumU  += Abs( pucOrg[0x5] - pucCur[0x5] );
    uiSumU  += Abs( pucOrg[0x6] - pucCur[0x6] );
    uiSumU  += Abs( pucOrg[0x7] - pucCur[0x7] );
    pucOrg  += MB_BUFFER_WIDTH;
    pucCur  += iStride;
  }

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

  for( ; iRows != 0; iRows-- )
  {
    uiSumV  += Abs( pucOrg[0x0] - pucCur[0x0] );
    uiSumV  += Abs( pucOrg[0x1] - pucCur[0x1] );
    uiSumV  += Abs( pucOrg[0x2] - pucCur[0x2] );
    uiSumV  += Abs( pucOrg[0x3] - pucCur[0x3] );
    uiSumV  += Abs( pucOrg[0x4] - pucCur[0x4] );
    uiSumV  += Abs( pucOrg[0x5] - pucCur[0x5] );
    uiSumV  += Abs( pucOrg[0x6] - pucCur[0x6] );
    uiSumV  += Abs( pucOrg[0x7] - pucCur[0x7] );
    pucOrg  += MB_BUFFER_WIDTH;
    pucCur  += iStride;
  }

  return uiSumY+uiSumU+uiSumV;
}






UInt XDistortion::xGetSSE16x( 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[0x0] - pucCur[0x0];
    uiSum += iTemp * iTemp;
    iTemp = pucOrg[0x1] - pucCur[0x1];
    uiSum += iTemp * iTemp;
    iTemp = pucOrg[0x2] - pucCur[0x2];
    uiSum += iTemp * iTemp;
    iTemp = pucOrg[0x3] - pucCur[0x3];
    uiSum += iTemp * iTemp;
    iTemp = pucOrg[0x4] - pucCur[0x4];
    uiSum += iTemp * iTemp;
    iTemp = pucOrg[0x5] - pucCur[0x5];
    uiSum += iTemp * iTemp;
    iTemp = pucOrg[0x6] - pucCur[0x6];
    uiSum += iTemp * iTemp;
    iTemp = pucOrg[0x7] - pucCur[0x7];
    uiSum += iTemp * iTemp;
    iTemp = pucOrg[0x8] - pucCur[0x8];
    uiSum += iTemp * iTemp;
    iTemp = pucOrg[0x9] - pucCur[0x9];
    uiSum += iTemp * iTemp;
    iTemp = pucOrg[0xa] - pucCur[0xa];
    uiSum += iTemp * iTemp;
    iTemp = pucOrg[0xb] - pucCur[0xb];
    uiSum += iTemp * iTemp;
    iTemp = pucOrg[0xc] - pucCur[0xc];
    uiSum += iTemp * iTemp;
    iTemp = pucOrg[0xd] - pucCur[0xd];
    uiSum += iTemp * iTemp;
    iTemp = pucOrg[0xe] - pucCur[0xe];
    uiSum += iTemp * iTemp;
    iTemp = pucOrg[0xf] - pucCur[0xf];
    uiSum += iTemp * iTemp;
    pucOrg += MB_BUFFER_WIDTH;
    pucCur += iStride;
  }
  return uiSum;
}


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

  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 !=0; iRows--)
    {
      offset += pucOrg[0] - pucCur[0];
      offset += pucOrg[1] - pucCur[1];
      offset += pucOrg[2] - pucCur[2];
      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-- )
    {
      uiSum  += Abs( pucOrg[0] - pucCur[0] - offset );
      uiSum  += Abs( pucOrg[1] - pucCur[1] - offset );
      uiSum  += Abs( pucOrg[2] - pucCur[2] - offset );
      uiSum  += Abs( pucOrg[3] - pucCur[3] - offset );
      uiSum  += Abs( pucOrg[4] - pucCur[4] - offset );
      uiSum  += Abs( pucOrg[5] - pucCur[5] - offset );
      uiSum  += Abs( pucOrg[6] - pucCur[6] - offset );
      uiSum  += Abs( pucOrg[7] - pucCur[7] - offset );

      pucOrg  += MB_BUFFER_WIDTH;
      pucCur  += iStride;
    }
  }
  else
  {
    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] );
      uiSum += Abs( pucOrg[4] - pucCur[4] );
      uiSum += Abs( pucOrg[5] - pucCur[5] );
      uiSum += Abs( pucOrg[6] - pucCur[6] );
      uiSum += Abs( pucOrg[7] - pucCur[7] );
      pucOrg += MB_BUFFER_WIDTH;
      pucCur += iStride;
    }
  }

#else

  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] );
    uiSum += Abs( pucOrg[4] - pucCur[4] );
    uiSum += Abs( pucOrg[5] - pucCur[5] );
    uiSum += Abs( pucOrg[6] - pucCur[6] );
    uiSum += Abs( pucOrg[7] - pucCur[7] );
    pucOrg += MB_BUFFER_WIDTH;
    pucCur += iStride;
  }
#endif

  return uiSum;
}





UInt XDistortion::xGetYuvSAD8x( 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;

#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 !=0; iRows--)
    {
      offset += pucOrg[0] - pucCur[0];
      offset += pucOrg[1] - pucCur[1];
      offset += pucOrg[2] - pucCur[2];

⌨️ 快捷键说明

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