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

📄 quarterpelfilter.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    pucDest += iDestStride;
  }

}


Void QuarterPelFilter::xPredDx2Dy13( Pel* pucDest, Pel* pucSrc, Int iDestStride, Int iSrcStride, Int iDx, Int iDy, UInt uiSizeY, UInt uiSizeX )
{
  Short asTemp[16*(16+6)];
  Short* psTemp = asTemp;
  xPredDx2( asTemp, pucSrc, iSrcStride, uiSizeY, uiSizeX );

  iDy = (iDy == 1) ? 0 : 0x10;

  for( UInt y = 0; y < uiSizeY; y++)
  {
    for( UInt x = 0; x < uiSizeX; x++)
    {
      Int iIndex = x + 0x20;
      Int iTemp;
      iTemp  = psTemp[ 0x00 + iIndex];
      iTemp += psTemp[ 0x10 + iIndex];
      iTemp  = iTemp << 2;
      iTemp -= psTemp[-0x10 + iIndex];
      iTemp -= psTemp[ 0x20 + iIndex];
      iTemp += iTemp << 2;
      iTemp += psTemp[-0x20 + iIndex];
      iTemp += psTemp[ 0x30 + iIndex];
      iTemp = gClip( (iTemp + 512) / 1024 );
      pucDest[x] = (iTemp + gClip( (psTemp[iDy + iIndex] + 16) / 32 ) + 1) / 2;
    }
    psTemp  += 0x10;
    pucDest += iDestStride;
  }
}


Void QuarterPelFilter::xPredDy2Dx13( Pel* pucDest, Pel* pucSrc, Int iDestStride, Int iSrcStride, Int iDx, Int iDy, UInt uiSizeY, UInt uiSizeX )
{
  iDx = (iDx == 1) ? 2 : 3;
  for( UInt y = 0; y < uiSizeY; y++)
  {
    Int aiTemp[6+16];
    for( UInt n = 0; n < 6+uiSizeX; n++)
    {
      Pel* puc = pucSrc + n - 2;
      aiTemp[n]  = puc[ 0*iSrcStride];
      aiTemp[n] += puc[ 1*iSrcStride];
      aiTemp[n]  = aiTemp[n] << 2;
      aiTemp[n] -= puc[-1*iSrcStride];
      aiTemp[n] -= puc[ 2*iSrcStride];
      aiTemp[n] += aiTemp[n] << 2;
      aiTemp[n] += puc[-2*iSrcStride];
      aiTemp[n] += puc[ 3*iSrcStride];
    }

    for( UInt x = 0; x < uiSizeX; x++)
    {
      Int iTemp = 0;
      for( Int n = 0; n < 6; n++ )
      {
        iTemp += aiTemp[n+x]*g_aiTapCoeff[n];
      }
      iTemp = gClip( (iTemp + 512) / 1024 );
      pucDest[x] = (iTemp + gClip( (aiTemp[x+iDx] + 16) / 32 ) + 1) / 2;
    }
    pucDest += iDestStride;
    pucSrc  += iSrcStride;
  }
}



Void QuarterPelFilter::xPredElse( Pel* pucDest, Pel* pucSrc, Int iDestStride, Int iSrcStride, Int iDx, Int iDy, UInt uiSizeY, UInt uiSizeX )
{
  Pel* pucSrcX = pucSrc;
  Pel* pucSrcY = pucSrc;

  pucSrcY += (iDx == 1) ? 0 : 1;
  pucSrcX += (iDy == 1) ? 0 : iSrcStride;

  for( UInt y = 0; y < uiSizeY; y++)
  {
    for( UInt x = 0; x < uiSizeX; x++)
    {
      Int iTempX;
      iTempX  = pucSrcX[x - 0];
      iTempX += pucSrcX[x + 1];
      iTempX  = iTempX << 2;
      iTempX -= pucSrcX[x - 1];
      iTempX -= pucSrcX[x + 2];
      iTempX += iTempX << 2;
      iTempX += pucSrcX[x - 2];
      iTempX += pucSrcX[x + 3];
      iTempX = gClip( (iTempX + 16) / 32 );

      Int iTempY;
      iTempY  = pucSrcY[x - 0*iSrcStride];
      iTempY += pucSrcY[x + 1*iSrcStride];
      iTempY  = iTempY << 2;
      iTempY -= pucSrcY[x - 1*iSrcStride];
      iTempY -= pucSrcY[x + 2*iSrcStride];
      iTempY += iTempY << 2;
      iTempY += pucSrcY[x - 2*iSrcStride];
      iTempY += pucSrcY[x + 3*iSrcStride];
      iTempY = gClip( (iTempY + 16) / 32 );

      pucDest[x] = (iTempX + iTempY + 1) >> 1;
    }
    pucDest += iDestStride;
    pucSrcX += iSrcStride;
    pucSrcY += iSrcStride;
  }
}

ErrVal QuarterPelFilter::filterFrame( YuvPicBuffer *pcPelBuffer, YuvPicBuffer *pcHalfPelBuffer )
{
  ROT( NULL == pcPelBuffer );
  ROT( NULL == pcHalfPelBuffer );

  Pel*    pucSrc      = pcPelBuffer->getMbLumAddr ();
  Int     iHeight     = pcPelBuffer->getLHeight   ();
  Int     iWidth      = pcPelBuffer->getLWidth    ();
  Int     iStride     = pcPelBuffer->getLStride   ();
  Int     iMargin     = pcPelBuffer->getLXMargin  ();
  UInt    uiTmpXSize  = (iMargin + iWidth + iMargin) * 2;
  UInt    uiTmpYSize  = iMargin + iHeight + iMargin;
  Int     iMarginNew  = iMargin-4;
  Int     x, y;

  XPel*  psTemp      = new XPel[uiTmpXSize * uiTmpYSize];
  ::memset( psTemp, 0x00, (uiTmpXSize * uiTmpYSize)*sizeof(XPel) );

  ROT( NULL == psTemp )

  XPel*  ps          = &psTemp[ iMargin * uiTmpXSize + 2*iMargin ];

  if( m_b4Tap) // V090
  {
    for( y = 0; y < iHeight; y++ )
    {
      for( x = -iMarginNew; x < iWidth+iMarginNew; x++ )
      {
        Int iTemp;
        iTemp  = pucSrc[x - 0];
        iTemp += pucSrc[x + 1];
        iTemp += iTemp << 3;
        iTemp -= pucSrc[x - 1];
        iTemp -= pucSrc[x + 2];
        ps[2*x]    = pucSrc[x]<<4;
        ps[2*x+1]  = iTemp;
	  }
      ps     += uiTmpXSize;
      pucSrc += iStride;
	}
  }            // V090
  else if( m_bRCDO )
  {
    for( y = 0; y < iHeight; y++ )
    {
      for( x = -iMarginNew; x < iWidth+iMarginNew; x++ )
      {
        Int iTemp;
        iTemp  = pucSrc[x - 0];
        iTemp += pucSrc[x + 1];
        iTemp  = iTemp << 2;
        iTemp -= pucSrc[x - 1];
        iTemp -= pucSrc[x + 2];
        iTemp += iTemp << 2;
        iTemp += pucSrc[x - 2];
        iTemp += pucSrc[x + 3];
        ps[2*x]    = pucSrc[x];
        ps[2*x+1]  = (XPel)xClip((iTemp + 6) >> 5);
      }

      ps     += uiTmpXSize;
      pucSrc += iStride;
    }
  }
  else
  {
    for( y = 0; y < iHeight; y++ )
    {
      for( x = -iMarginNew; x < iWidth+iMarginNew; x++ )
      {
        Int iTemp;
        iTemp  = pucSrc[x - 0];
        iTemp += pucSrc[x + 1];
        iTemp  = iTemp << 2;
        iTemp -= pucSrc[x - 1];
        iTemp -= pucSrc[x + 2];
        iTemp += iTemp << 2;
        iTemp += pucSrc[x - 2];
        iTemp += pucSrc[x + 3];
        ps[2*x]    = pucSrc[x]<<5;
        ps[2*x+1]  = iTemp;
      }

      ps     += uiTmpXSize;
      pucSrc += iStride;
    }
  }

  // bot
  ps -= iMargin*2;
  for( y = 0; y < iMargin; y++ )
  {
    ::memcpy( &ps[y*uiTmpXSize], &ps[(y-1)*uiTmpXSize], uiTmpXSize*sizeof(XPel) );
  }

  //top
  ps = &psTemp[ iMargin * uiTmpXSize ];
  for( y = 0; y < iMargin; y++ )
  {
    ::memcpy( &ps[-(y+1)*uiTmpXSize], &ps[-y*uiTmpXSize], uiTmpXSize*sizeof(XPel) );
  }

  ps = &psTemp[ 4*uiTmpXSize + 2*iMargin ];
  iStride = uiTmpXSize;

  Int   iDesStrideHP  = pcHalfPelBuffer->getLStride();
  Pel* pucDesHP       = pcHalfPelBuffer->getMbLumAddr();
  pucDesHP -= (iMarginNew*iDesStrideHP)<<1;

  if( m_b4Tap)   // V090
  {
    for( y = -iMarginNew; y < iHeight+iMarginNew; y++ )
    {
      for( x = -2*iMarginNew; x < 2*(iWidth+iMarginNew); x++ )
      {
        Int iTemp;
        iTemp  = ps[x - 0*iStride];
        iTemp += ps[x + 1*iStride];
        iTemp += iTemp << 3;
        iTemp -= ps[x - 1*iStride];
        iTemp -= ps[x + 2*iStride];

        pucDesHP[x]              = xClip( ( ps[x] + 8) >> 4);
        pucDesHP[x+iDesStrideHP] = xClip( ( iTemp + 128) >> 8);
      }
      pucDesHP += iDesStrideHP<<1;
      ps     += iStride;
    }
  } // V090
  else if( m_bRCDO )
  {
    for( y = -iMarginNew; y < iHeight+iMarginNew; y++ )
    {
      for( x = -2*iMarginNew; x < 2*(iWidth+iMarginNew); x++ )
      {
        pucDesHP[x]                = (Pel)ps[x];
        if( ( x & 1 ) == 0 )
          pucDesHP[x+iDesStrideHP] = (Pel)xClip( ( (ps[x+iStride]+ps[x])*5 - ps[x+2*iStride] - ps[x-iStride] + 1 ) >> 3 );
        else
          pucDesHP[x+iDesStrideHP] = (Pel)( ps[x+iStride-1] + ps[x+1] ) >> 1;
      }
      pucDesHP += iDesStrideHP<<1;
      ps       += iStride;
    }
  }
  else
  {
    for( y = -iMarginNew; y < iHeight+iMarginNew; y++ )
    {
      for( x = -2*iMarginNew; x < 2*(iWidth+iMarginNew); x++ )
      {
        Int iTemp;
        iTemp  = ps[x - 0*iStride];
        iTemp += ps[x + 1*iStride];
        iTemp  = iTemp << 2;
        iTemp -= ps[x - 1*iStride];
        iTemp -= ps[x + 2*iStride];
        iTemp += iTemp << 2;
        iTemp += ps[x - 2*iStride];
        iTemp += ps[x + 3*iStride];

        pucDesHP[x]              = xClip( ( ps[x] + 16) / 32);
        pucDesHP[x+iDesStrideHP] = xClip( ( iTemp + 512) / 1024);
      }
      pucDesHP += iDesStrideHP<<1;
      ps     += iStride;
    }
  }

  delete [] psTemp;
  psTemp = NULL;
  return Err::m_nOK;
}

ErrVal QuarterPelFilter::filterFrame( IntYuvPicBuffer *pcPelBuffer, IntYuvPicBuffer *pcHalfPelBuffer )
{
  ROT( NULL == pcPelBuffer );
  ROT( NULL == pcHalfPelBuffer );

  XPel*   pucSrc      = pcPelBuffer->getMbLumAddr ();
  Int     iHeight     = pcPelBuffer->getLHeight   ();
  Int     iWidth      = pcPelBuffer->getLWidth    ();
  Int     iStride     = pcPelBuffer->getLStride   ();
  Int     iMargin     = pcPelBuffer->getLXMargin  ();
  UInt    uiTmpXSize  = (iMargin + iWidth + iMargin) * 2;
  UInt    uiTmpYSize  = iMargin + iHeight + iMargin;
  Int     iMarginNew  = iMargin-4;
  Int     x, y;

  XXPel*  psTemp      = new XXPel[uiTmpXSize * uiTmpYSize];
  ::memset( psTemp, 0x00, (uiTmpXSize * uiTmpYSize)*sizeof(XXPel) );

  ROT( NULL == psTemp )

  XXPel*  ps          = &psTemp[ iMargin * uiTmpXSize + 2*iMargin ]; // fix provided by Shijun Sun

  if( m_b4Tap) // V090
  {
    for( y = 0; y < iHeight; y++ )
    {
      for( x = -iMarginNew; x < iWidth+iMarginNew; x++ )
      {
        Int iTemp;
        iTemp  = pucSrc[x - 0];
        iTemp += pucSrc[x + 1];
        iTemp += iTemp << 3;
        iTemp -= pucSrc[x - 1];
        iTemp -= pucSrc[x + 2];
        ps[2*x]    = pucSrc[x]<<4;
        ps[2*x+1]  = iTemp;
	  }
      ps     += uiTmpXSize;
      pucSrc += iStride;
	}
  }            // V090
  else if( m_bRCDO )
  {
    for( y = 0; y < iHeight; y++ )
    {
      for( x = -iMarginNew; x < iWidth+iMarginNew; x++ )
      {
        Int iTemp;
        iTemp  = pucSrc[x - 0];
        iTemp += pucSrc[x + 1];
        iTemp  = iTemp << 2;
        iTemp -= pucSrc[x - 1];
        iTemp -= pucSrc[x + 2];
        iTemp += iTemp << 2;
        iTemp += pucSrc[x - 2];
        iTemp += pucSrc[x + 3];
        ps[2*x]    = pucSrc[x];
        ps[2*x+1]  = (XPel)xClip((iTemp + 6) >> 5);
      }

      ps     += uiTmpXSize;
      pucSrc += iStride;
    }
  }
  else
  {
    for( y = 0; y < iHeight; y++ )
    {
      for( x = -iMarginNew; x < iWidth+iMarginNew; x++ )
      {
        Int iTemp;
        iTemp  = pucSrc[x - 0];
        iTemp += pucSrc[x + 1];
        iTemp  = iTemp << 2;
        iTemp -= pucSrc[x - 1];
        iTemp -= pucSrc[x + 2];
        iTemp += iTemp << 2;
        iTemp += pucSrc[x - 2];
        iTemp += pucSrc[x + 3];
        ps[2*x]    = pucSrc[x]<<5;
        ps[2*x+1]  = iTemp;
      }

      ps     += uiTmpXSize;
      pucSrc += iStride;
    }
  }

  // bot
  ps -= iMargin*2;               // fix provided by Shijun Sun
  for( y = 0; y < iMargin; y++ ) // fix provided by Shijun Sun
  {
    ::memcpy( &ps[y*uiTmpXSize], &ps[(y-1)*uiTmpXSize], uiTmpXSize*sizeof(XXPel) );
  }

  //top
  ps = &psTemp[ iMargin * uiTmpXSize ]; // fix provided by Shijun Sun
  for( y = 0; y < iMargin; y++ )        // fix provided by Shijun Sun
  {
    ::memcpy( &ps[-(y+1)*uiTmpXSize], &ps[-y*uiTmpXSize], uiTmpXSize*sizeof(XXPel) );
  }

  ps = &psTemp[ 4*uiTmpXSize + 2*iMargin ]; // fix provided by Shijun Sun
  iStride = uiTmpXSize;

  Int   iDesStrideHP  = pcHalfPelBuffer->getLStride();
  XPel* pucDesHP      = pcHalfPelBuffer->getMbLumAddr();
  pucDesHP -= (iMarginNew*iDesStrideHP)<<1;

  if( m_b4Tap)   // V090
  {
    for( y = -iMarginNew; y < iHeight+iMarginNew; y++ )
    {
      for( x = -2*iMarginNew; x < 2*(iWidth+iMarginNew); x++ )
      {
        Int iTemp;
        iTemp  = ps[x - 0*iStride];
        iTemp += ps[x + 1*iStride];
        iTemp += iTemp << 3;
        iTemp -= ps[x - 1*iStride];
        iTemp -= ps[x + 2*iStride];

        pucDesHP[x]              = xClip( ( ps[x] + 8) >> 4);
        pucDesHP[x+iDesStrideHP] = xClip( ( iTemp + 128) >> 8);
      }
      pucDesHP += iDesStrideHP<<1;
      ps     += iStride;
    }
  } // V090
  else if( m_bRCDO )
  {
    for( y = -iMarginNew; y < iHeight+iMarginNew; y++ )
    {
      for( x = -2*iMarginNew; x < 2*(iWidth+iMarginNew); x++ )
      {
        pucDesHP[x]                = (XPel)ps[x];
        if( ( x & 1 ) == 0 )
          pucDesHP[x+iDesStrideHP] = (XPel)xClip( ( (ps[x+iStride]+ps[x])*5 - ps[x+2*iStride] - ps[x-iStride] + 1 ) >> 3 );
        else
          pucDesHP[x+iDesStrideHP] = (XPel)( ps[x+iStride-1] + ps[x+1] ) >> 1;
      }
      pucDesHP += iDesStrideHP<<1;
      ps       += iStride;
    }
  }
  else
  {
    for( y = -iMarginNew; y < iHeight+iMarginNew; y++ )
    {
      for( x = -2*iMarginNew; x < 2*(iWidth+iMarginNew); x++ )
      {
        Int iTemp;
        iTemp  = ps[x - 0*iStride];
        iTemp += ps[x + 1*iStride];
        iTemp  = iTemp << 2;
        iTemp -= ps[x - 1*iStride];
        iTemp -= ps[x + 2*iStride];
        iTemp += iTemp << 2;
        iTemp += ps[x - 2*iStride];
        iTemp += ps[x + 3*iStride];

        pucDesHP[x]              = xClip( ( ps[x] + 16) / 32);

⌨️ 快捷键说明

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