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

📄 quarterpelfilter.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        pucDesHP[x+iDesStrideHP] = xClip( ( iTemp + 512) / 1024);
      }
      pucDesHP += iDesStrideHP<<1;
      ps     += iStride;
    }
  }

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

// ********************** V090 begins ************************************
Void QuarterPelFilter::filterBlock4Tap( XPel* pDes, XPel* pSrc, Int iSrcStride, UInt uiXSize, UInt uiYSize, UInt uiFilter )
{
  Int l[20], c[20], r[20], * p;
  UInt y, x;
  XPel * pS, * pD;

  for( x = 0; x < uiXSize; x++, pSrc += 2 )
  {
    if( uiFilter == 0 ) // vertical full-sample, horizontal full-sample
    {
	  pS = pSrc - 4 * iSrcStride, pD = pDes + x;
	  for(y = 0; y < 4 + uiYSize; y ++, pS += 2 * iSrcStride)
	  {
        l[y] = 4 * pS[-2] + 14 * pS[0] - pS[-4] - pS[2];
		c[y] = pS[0];
		r[y] = 14 * pS[0] + 4 * pS[2] - pS[-2] - pS[4];

		if(y >= 4){
			p = l + y - 4;
			pD[0x000] = xClip((4 * p[1] + 14 * p[2] - p[0] - p[3] + 128) >> 8);
			pD[0x300] = xClip((p[2] + 8) >> 4);
			pD[0x600] = xClip((14 * p[2] + 4 * p[3] - p[1] - p[4] + 128) >> 8);

			p = c + y - 4;
			pD[0x100] = xClip((4 * p[1] + 14 * p[2] - p[0] - p[3] + 8) >> 4);
			pD[0x700] = xClip((14 * p[2] + 4 * p[3] - p[1] - p[4] + 8) >> 4);

			p = r + y - 4;
			pD[0x200] = xClip((4 * p[1] + 14 * p[2] - p[0] - p[3] + 128) >> 8);
			pD[0x500] = xClip((p[2] + 8) >> 4);
			pD[0x800] = xClip((14 * p[2] + 4 * p[3] - p[1] - p[4] + 128) >> 8);

			pD += 16;
		}
	  }
	}
    else if( uiFilter == 1 ) // vertical half-sample, horizontal full-sample
    {
	  pS = pSrc - 4 * iSrcStride - 1, pD = pDes + x;
	  for(y = 0; y < 4 + uiYSize; y ++, pS += 2 * iSrcStride)
	  {
        l[y] = 14 * pS[0] + 4 * pS[2] - pS[-2] - pS[4];
		c[y] = 9 * (pS[0] + pS[2]) - pS[-2] - pS[4];
		r[y] = 4 * pS[0] + 14 * pS[2] - pS[-2] - pS[4];

		if(y >= 4){
			p = l + y - 4;
			pD[0x000] = xClip((4 * p[1] + 14 * p[2] - p[0] - p[3] + 128) >> 8);
			pD[0x300] = xClip((p[2] + 8) >> 4);
			pD[0x600] = xClip((14 * p[2] + 4 * p[3] - p[1] - p[4] + 128) >> 8);

			p = c + y - 4;
			pD[0x100] = xClip((4 * p[1] + 14 * p[2] - p[0] - p[3] + 128) >> 8);
			pD[0x700] = xClip((14 * p[2] + 4 * p[3] - p[1] - p[4] + 128) >> 8);

			p = r + y - 4;
			pD[0x200] = xClip((4 * p[1] + 14 * p[2] - p[0] - p[3] + 128) >> 8);
			pD[0x500] = xClip((p[2] + 8) >> 4);
			pD[0x800] = xClip((14 * p[2] + 4 * p[3] - p[1] - p[4] + 128) >> 8);

			pD += 16;
		}
	  }
	}
    else if( uiFilter == 2 ) // vertical full-sample, horizontal half-sample
    {
	  pS = pSrc - 3 * iSrcStride, pD = pDes + x;
	  for(y = 0; y < 3 + uiYSize; y ++, pS += 2 * iSrcStride)
	  {
        l[y] = 4 * pS[-2] + 14 * pS[0] - pS[-4] - pS[2];
		c[y] = pS[0];
		r[y] = 14 * pS[0] + 4 * pS[2] - pS[-2] - pS[4];

		if(y >= 3){
			p = l + y - 3;
			pD[0x000] = xClip((14 * p[1] + 4 * p[2] - p[0] - p[3] + 128) >> 8);
			pD[0x300] = xClip((9 * (p[1] + p[2]) - p[0] - p[3] + 128) >> 8);
			pD[0x600] = xClip((4 * p[1] + 14 * p[2] - p[0] - p[3] + 128) >> 8);

			p = c + y - 3;
			pD[0x100] = xClip((14 * p[1] + 4 * p[2] - p[0] - p[3] + 8) >> 4);
			pD[0x700] = xClip((4 * p[1] + 14 * p[2] - p[0] - p[3] + 8) >> 4);

			p = r + y - 3;
			pD[0x200] = xClip((14 * p[1] + 4 * p[2] - p[0] - p[3] + 128) >> 8);
			pD[0x500] = xClip((9 * (p[1] + p[2]) - p[0] - p[3] + 128) >> 8);
			pD[0x800] = xClip((4 * p[1] + 14 * p[2] - p[0] - p[3] + 128) >> 8);

			pD += 16;
		}
	  }
	}
    else // vertical half-sample, horizontal half-sample
    {
	  pS = pSrc - 3 * iSrcStride - 1, pD = pDes + x;
	  for(y = 0; y < 3 + uiYSize; y ++, pS += 2 * iSrcStride)
	  {
        l[y] = 14 * pS[0] + 4 * pS[2] - pS[-2] - pS[4];
		c[y] = 9 * (pS[0] + pS[2]) - pS[-2] - pS[4];
		r[y] = 4 * pS[0] + 14 * pS[2] - pS[-2] - pS[4];

		if(y >= 3){
			p = l + y - 3;
			pD[0x000] = xClip((14 * p[1] + 4 * p[2] - p[0] - p[3] + 128) >> 8);
			pD[0x300] = xClip((9 * (p[1] + p[2]) - p[0] - p[3] + 128) >> 8);
			pD[0x600] = xClip((4 * p[1] + 14 * p[2] - p[0] - p[3] + 128) >> 8);

			p = c + y - 3;
			pD[0x100] = xClip((14 * p[1] + 4 * p[2] - p[0] - p[3] + 128) >> 8);
			pD[0x700] = xClip((4 * p[1] + 14 * p[2] - p[0] - p[3] + 128) >> 8);

			p = r + y - 3;
			pD[0x200] = xClip((14 * p[1] + 4 * p[2] - p[0] - p[3] + 128) >> 8);
			pD[0x500] = xClip((9 * (p[1] + p[2]) - p[0] - p[3] + 128) >> 8);
			pD[0x800] = xClip((4 * p[1] + 14 * p[2] - p[0] - p[3] + 128) >> 8);

			pD += 16;
		}
	  }
	}
  }
}

Void QuarterPelFilter::predBlk4TapD( IntYuvMbBuffer* pcDesBuffer, IntYuvPicBuffer* pcSrcBuffer, LumaIdx cIdx, Mv cMv, Int iSizeY, Int iSizeX)
{
  XPel* pucDes    = pcDesBuffer->getYBlk( cIdx );
  XPel* pucSrc    = pcSrcBuffer->getYBlk( cIdx );
  Int iDesStride  = pcDesBuffer->getLStride();
  Int iSrcStride  = pcSrcBuffer->getLStride();
  Int iOffset     = (cMv.getHor() >> 2) + (cMv.getVer() >> 2) * iSrcStride;
  Int iTemp1[4], iTemp2, x, y;
  int i, j;
  Int iDx = cMv.getHor() & 3;
  Int iDy = cMv.getVer() & 3;
  static int f4tap[4][4] = {
    { 0, 16,  0,  0}, 
    {-1, 14,  4, -1},
    {-1, 9, 9, -1},
    {-1,  4, 14, -1}
  };

  pucSrc += iOffset;

  for( y = 0; y < iSizeY; y++)
  {
    for( x = 0; x < iSizeX; x++ )
    {
      for( i = 0; i < 4; i++ )
      {
        iTemp1[i] = 0;
        for( j = 0; j < 4; j++ )
          iTemp1[i] += pucSrc[x + (i - 1) * iSrcStride + j - 1] * f4tap[iDx][j];
      }

      iTemp2 = 0;
      for(j=0;j<4;j++)
        iTemp2 += iTemp1[j] * f4tap[iDy][j];

      if( m_bClip )
        pucDes[x] = xClip( (iTemp2 + 128) >> 8 );
      else
        pucDes[x] = (iTemp2 >= 0) ? ( (iTemp2 + 128) >> 8 ) : -( (-iTemp2 + 128) >> 8 );
    }

    pucDes += iDesStride;
    pucSrc += iSrcStride;
  }
}

Void QuarterPelFilter::predBlk4TapD( YuvMbBuffer* pcDesBuffer, YuvPicBuffer* pcSrcBuffer, LumaIdx cIdx, Mv cMv, Int iSizeY, Int iSizeX)
{
  Pel* pucDes     = pcDesBuffer->getYBlk( cIdx );
  Pel* pucSrc     = pcSrcBuffer->getYBlk( cIdx );
  Int iDesStride  = pcDesBuffer->getLStride();
  Int iSrcStride  = pcSrcBuffer->getLStride();
  Int iOffset     = (cMv.getHor() >> 2) + (cMv.getVer() >> 2) * iSrcStride;
  Int iTemp1[4], iTemp2, x, y;
  Int iDx = cMv.getHor() & 3;
  Int iDy = cMv.getVer() & 3;
  int i, j;
  static int f4tap[4][4] = {
    { 0, 16,  0,  0}, 
    {-1, 14,  4, -1},
    {-1, 9, 9, -1},
    {-1,  4, 14, -1}
  };

  pucSrc += iOffset;

  for( y = 0; y < iSizeY; y++)
  {
    for( x = 0; x < iSizeX; x++ )
    {
      for( i = 0; i < 4; i++ )
      {
        iTemp1[i] = 0;
        for( j = 0; j < 4; j++ )
          iTemp1[i] += pucSrc[x + (i - 1) * iSrcStride + j - 1] * f4tap[iDx][j];
      }

      iTemp2 = 0;
      for(j=0;j<4;j++)
        iTemp2 += iTemp1[j] * f4tap[iDy][j];

      if( m_bClip )
        pucDes[x] = xClip( (iTemp2 + 128) >> 8 );
      else
        pucDes[x] = (iTemp2 >= 0) ? ( (iTemp2 + 128) >> 8 ) : -( (-iTemp2 + 128) >> 8 );
    }

    pucDes += iDesStride;
    pucSrc += iSrcStride;
  }
}
// ********************** V090 ends ************************************

Void QuarterPelFilter::filterBlockRCDO( XPel* pDes, XPel* pSrc, Int iSrcStride, UInt uiXSize, UInt uiYSize, UInt uiFilter )
{
  UInt y, x;

  if( uiFilter == 0 ) // vertical full-sample, horizontal full-sample
  {
    for( y = 0; y < uiYSize; y++ )
    {
      for( x = 0; x < uiXSize; x++ )
      {
        XPel a = pSrc[-iSrcStride], b = pSrc[-1], o = pSrc[0], c = pSrc[1], d = pSrc[iSrcStride];

        pDes[0x000] = (a + b + 1) >> 1;
        pDes[0x100] = (a + o + 1) >> 1;
        pDes[0x200] = (a + c + 1) >> 1;
        pDes[0x300] = (b + o + 1) >> 1;
        pDes[0x500] = (o + c + 1) >> 1;
        pDes[0x600] = (b + d + 1) >> 1;
        pDes[0x700] = (o + d + 1) >> 1;
        pDes[0x800] = (c + d + 1) >> 1;
        pSrc += 2;
        pDes++;
      }
      pSrc += 2*(iSrcStride - uiXSize);
      pDes += 16 - uiXSize;
    }
  }
  else if( uiFilter == 1 ) // vertical full-sample, horizontal half-sample
  {
    for( y = 0; y < uiYSize; y++ )
    {
      for( x = 0; x < uiXSize; x++ )
      {
        pDes[0x000] = ( pSrc[ 0] + pSrc[-iSrcStride - 1] + 1 ) >> 1;
        pDes[0x100] = ( pSrc[ 1] + pSrc[-iSrcStride - 1] + 1 ) >> 1;
        pDes[0x200] = ( pSrc[ 0] + pSrc[-iSrcStride + 1] + 1 ) >> 1;
        pDes[0x300] = ( pSrc[ 0] + pSrc[            - 1] + 1 ) >> 1;
        pDes[0x500] = ( pSrc[ 0] + pSrc[              1] + 1 ) >> 1;
        pDes[0x600] = ( pSrc[ 0] + pSrc[ iSrcStride - 1] + 1 ) >> 1;
        pDes[0x700] = ( pSrc[-1] + pSrc[ iSrcStride + 1] + 1 ) >> 1;
        pDes[0x800] = ( pSrc[ 0] + pSrc[ iSrcStride + 1] + 1 ) >> 1;
        pSrc += 2;
        pDes++;
      }
      pSrc += 2*(iSrcStride - uiXSize);
      pDes += 16 - uiXSize;
    }
  }
  else if( uiFilter == 2 ) // vertical half-sample, horizontal full-sample
  {
    for( y = 0; y < uiYSize; y++ )
    {
      for( x = 0; x < uiXSize; x++ )
      {
        pDes[0x000] = ( pSrc[0]            + pSrc[-iSrcStride-1] + 1 ) >> 1;
        pDes[0x100] = ( pSrc[0]            + pSrc[-iSrcStride  ] + 1 ) >> 1;
        pDes[0x200] = ( pSrc[0]            + pSrc[-iSrcStride+1] + 1 ) >> 1;
        pDes[0x300] = ( pSrc[iSrcStride-1] + pSrc[-iSrcStride  ] + 1 ) >> 1;
        pDes[0x500] = ( pSrc[iSrcStride]   + pSrc[-iSrcStride+1] + 1 ) >> 1;
        pDes[0x600] = ( pSrc[0]            + pSrc[ iSrcStride-1] + 1 ) >> 1;
        pDes[0x700] = ( pSrc[0]            + pSrc[ iSrcStride  ] + 1 ) >> 1;
        pDes[0x800] = ( pSrc[0]            + pSrc[ iSrcStride+1] + 1 ) >> 1;
        pSrc += 2;
        pDes++;
      }
      pSrc += 2*(iSrcStride - uiXSize);
      pDes += 16 - uiXSize;
    }
  }
  else  // vertical half-sample, horizontal half-sample
  {
    for( y = 0; y < uiYSize; y++ )
    {
      for( x = 0; x < uiXSize; x++ )
      {
        pDes[0x000] = ( pSrc[-1]            + pSrc[-iSrcStride  ] + 1 ) >> 1;
        pDes[0x100] = ( pSrc[ 1]            + pSrc[-iSrcStride-1] + 1 ) >> 1;
        pDes[0x200] = ( pSrc[ 1]            + pSrc[-iSrcStride  ] + 1 ) >> 1;
        pDes[0x300] = ( pSrc[ iSrcStride-1] + pSrc[-iSrcStride  ] + 1 ) >> 1;
        pDes[0x500] = ( pSrc[-iSrcStride+1] + pSrc[ iSrcStride  ] + 1 ) >> 1;
        pDes[0x600] = ( pSrc[-1]            + pSrc[ iSrcStride  ] + 1 ) >> 1;
        pDes[0x700] = ( pSrc[-1]            + pSrc[ iSrcStride+1] + 1 ) >> 1;
        pDes[0x800] = ( pSrc[ 1]            + pSrc[ iSrcStride  ] + 1 ) >> 1;
        pSrc += 2;
        pDes++;
      }
      pSrc += 2*(iSrcStride - uiXSize);
      pDes += 16 - uiXSize;
    }
  }
}

Void QuarterPelFilter::predBlkRCDO( IntYuvMbBuffer* pcDesBuffer, IntYuvPicBuffer* pcSrcBuffer, LumaIdx cIdx, Mv cMv, Int iSizeY, Int iSizeX)
{
  XPel* pucDes    = pcDesBuffer->getYBlk( cIdx );
  XPel* pucSrc    = pcSrcBuffer->getYBlk( cIdx );
  Int iDesStride  = pcDesBuffer->getLStride();
  Int iSrcStride  = pcSrcBuffer->getLStride();
  Int iOffset     = (cMv.getHor() >> 2) + (cMv.getVer() >> 2) * iSrcStride;

  pucSrc += iOffset;

  Int iDx = cMv.getHor() & 3;
  Int iDy = cMv.getVer() & 3;

  for( Int y = 0; y < iSizeY; y++)
  {
    for( Int x = 0; x < iSizeX; x++ )
    {
      XPel  A = pucSrc[x];
      XPel  B = pucSrc[x+1];
      XPel  C = pucSrc[x+iSrcStride];
      XPel  D = pucSrc[x+iSrcStride+1];
      XPel* p = pucSrc+x;
      XPel  b, h, j, m, s;

      j = (B + C) >> 1;
      b = xClip( ( (p[0]+p[1])*20 - (p[-1]+p[2])* 5 +(p[-2]+p[3]) + 6 ) >> 5 );
      h = xClip( ( (p[0]+p[iSrcStride])*5 - (p[-iSrcStride]+p[2*iSrcStride]) + 1 ) >> 3);
      p = pucSrc+x+iSrcStride;
      s = xClip( ( (p[0]+p[1])*20 - (p[-1]+p[2])* 5 +(p[-2]+p[3]) + 6 ) >> 5 );
      p = pucSrc+x+1;
      m = xClip( ( (p[0]+p[iSrcStride])*5 - (p[-iSrcStride]+p[2*iSrcStride]) + 1 ) >> 3);

      if( iDy == 0 )
      {
        pucDes[x] = ( iDx == 0 ?  A               : ( iDx == 1 ? (A + b + 1) >> 1 : ( iDx == 2 ?  b               : (B + b + 1) >> 1 ) ) );
      }
      else if( iDy == 1 )
      {
        pucDes[x] = ( iDx == 0 ? (A + h + 1) >> 1 : ( iDx == 1 ? (b + h + 1) >> 1 : ( iDx == 2 ? (A + m + 1) >> 1 : (b + m + 1) >> 1 ) ) );
      }
      else if( iDy == 2 )
      {
        pucDes[x] = ( iDx == 0 ?  h               : ( iDx == 1 ? (C + b + 1) >> 1 : ( iDx == 2 ?  j               : (B + s + 1) >> 1 ) ) );
      }
      else
      {
        pucDes[x] = ( iDx == 0 ? (C + h + 1) >> 1 : ( iDx == 1 ? (h + s + 1) >> 1 : ( iDx == 2 ? (D + h + 1) >> 1 : (m + s + 1) >> 1 ) ) );
      }
    }

    pucDes += iDesStride;
    pucSrc += iSrcStride;
  }
}

Void QuarterPelFilter::predBlkRCDO( YuvMbBuffer* pcDesBuffer, YuvPicBuffer* pcSrcBuffer, LumaIdx cIdx, Mv cMv, Int iSizeY, Int iSizeX)
{
  Pel* pucDes     = pcDesBuffer->getYBlk( cIdx );
  Pel* pucSrc     = pcSrcBuffer->getYBlk( cIdx );
  Int  iDesStride = pcDesBuffer->getLStride();
  Int  iSrcStride = pcSrcBuffer->getLStride();
  Int  iOffset    = (cMv.getHor() >> 2) + (cMv.getVer() >> 2) * iSrcStride;

  pucSrc += iOffset;

  Int iDx = cMv.getHor() & 3;
  Int iDy = cMv.getVer() & 3;

  for( Int y = 0; y < iSizeY; y++)
  {
    for( Int x = 0; x < iSizeX; x++ )
    {
      Pel  A = pucSrc[x];
      Pel  B = pucSrc[x+1];
      Pel  C = pucSrc[x+iSrcStride];
      Pel  D = pucSrc[x+iSrcStride+1];
      Pel* p = pucSrc+x;
      Pel  b, h, j, m, s;

      j = (B + C) >> 1;
      b = xClip( ( (p[0]+p[1])*20 - (p[-1]+p[2])* 5 +(p[-2]+p[3]) + 6 ) >> 5 );
      h = xClip( ( (p[0]+p[iSrcStride])*5 - (p[-iSrcStride]+p[2*iSrcStride]) + 1 ) >> 3);
      p = pucSrc+x+iSrcStride;
      s = xClip( ( (p[0]+p[1])*20 - (p[-1]+p[2])* 5 +(p[-2]+p[3]) + 6 ) >> 5 );
      p = pucSrc+x+1;
      m = xClip( ( (p[0]+p[iSrcStride])*5 - (p[-iSrcStride]+p[2*iSrcStride]) + 1 ) >> 3);

      if( iDy == 0 )
      {
        pucDes[x] = ( iDx == 0 ?  A               : ( iDx == 1 ? (A + b + 1) >> 1 : ( iDx == 2 ?  b               : (B + b + 1) >> 1 ) ) );
      }
      else if( iDy == 1 )
      {
        pucDes[x] = ( iDx == 0 ? (A + h + 1) >> 1 : ( iDx == 1 ? (b + h + 1) >> 1 : ( iDx == 2 ? (A + m + 1) >> 1 : (b + m + 1) >> 1 ) ) );
      }
      else if( iDy == 2 )
      {
        pucDes[x] = ( iDx == 0 ?  h               : ( iDx == 1 ? (C + b + 1) >> 1 : ( iDx == 2 ?  j               : (B + s + 1) >> 1 ) ) );
      }
      else
      {
        pucDes[x] = ( iDx == 0 ? (C + h + 1) >> 1 : ( iDx == 1 ? (h + s + 1) >> 1 : ( iDx == 2 ? (D + h + 1) >> 1 : (m + s + 1) >> 1 ) ) );
      }
    }

    pucDes += iDesStride;
    pucSrc += iSrcStride;
  }
}




Void QuarterPelFilter::xFilter1( Pel* pDes, Pel* pSrc, Int iSrcStride, UInt uiXSize, UInt uiYSize )
{
  UInt y, x;
  for( y = 0; y < uiYSize; y++ )
  {
    for( x = 0; x < uiXSize; x++ )
    {
      Int a = pSrc[-1];
      Int b = pSrc[-iSrcStride];
      Int c = pSrc[+1];
      Int d = pSrc[iSrcStride];
      Int o = pSrc[0];

      pDes[0x000] = (a + b + 1) >> 1;
      pDes[0x100] = (b + o + 1) >> 1;
      pDes[0x200] = (b + c + 1) >> 1;
      pDes[0x300] = (a + o + 1) >> 1;

⌨️ 快捷键说明

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