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

📄 yuvmbbuffer.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    pPel += iStride;
  }
}


Void YuvMbBufferExtension::loadSurrounding( YuvPicBuffer* pcSrcBuffer )
{
  Int x, y;
  Int iDesStride = getLStride();
  Int iSrcStride = pcSrcBuffer->getLStride();
  XPel*     pSrc = pcSrcBuffer->getMbLumAddr();
  XPel*     pDes = getMbLumAddr();

  for( x = 0; x < 18; x++ )
  {
    pDes[x-iDesStride-1] = pSrc[x-iSrcStride-1];
  }
  for( y = 0; y < 16; y++ )
  {
    pDes[-1] = pSrc[-1];
    pDes[16] = pSrc[16];
    pDes += iDesStride;
    pSrc += iSrcStride;
  }
  for( x = 0; x < 18; x++ )
  {
    pDes[x-1] = pSrc[x-1];
  }

  iDesStride  = getCStride();
  iSrcStride  = pcSrcBuffer->getCStride();
  pSrc        = pcSrcBuffer->getMbCbAddr();
  pDes        = getMbCbAddr();

  for( x = 0; x < 10; x++ )
  {
    pDes[x-iDesStride-1] = pSrc[x-iSrcStride-1];
  }
  for( y = 0; y < 8; y++ )
  {
    pDes[-1] = pSrc[-1];
    pDes[8]  = pSrc[8];
    pDes += iDesStride;
    pSrc += iSrcStride;
  }
  for( x = 0; x < 10; x++ )
  {
    pDes[x-1] = pSrc[x-1];
  }

  pSrc        = pcSrcBuffer->getMbCrAddr();
  pDes        = getMbCrAddr();

  for( x = 0; x < 10; x++ )
  {
    pDes[x-iDesStride-1] = pSrc[x-iSrcStride-1];
  }
  for( y = 0; y < 8; y++ )
  {
    pDes[-1] = pSrc[-1];
    pDes[8]  = pSrc[8];
    pDes += iDesStride;
    pSrc += iSrcStride;
  }
  for( x = 0; x < 10; x++ )
  {
    pDes[x-1] = pSrc[x-1];
  }
}

//TMM_INTERLACE {
Void YuvMbBufferExtension::loadSurrounding_MbAff( YuvPicBuffer* pcSrcBuffer, UInt uiMask )
{
  Int x, y;
  Int iDesStride = getLStride();
  Int iSrcStride = pcSrcBuffer->getLStride();
  XPel*     pSrc = pcSrcBuffer->getMbLumAddr();
  XPel*     pDes = getMbLumAddr();
  Int ysize   = 16;
  Int ysizecr = 8;
  Bool bTopIntra   = 0 != (uiMask & 0x01000);
  Bool bBotIntra   = 0 != (uiMask & 0x02000);
  
  if(bTopIntra) 
  {
   pSrc+=8*iSrcStride;
   pDes+=8*iDesStride;
   ysize=8;
   ysizecr=4;
  }
  else
    if (bBotIntra)
    {
      ysize=8;
      ysizecr=4;
    }

  for( x = 0; x < 18; x++ )
  {
    pDes[x-iDesStride-1] = pSrc[x-iSrcStride-1];
  }

  for( y = 0; y < ysize; y++ )
  {
    pDes[-1] = pSrc[-1];
    pDes[16] = pSrc[16];
    pDes += iDesStride;
    pSrc += iSrcStride;
  }


   for( x = 0; x < 18; x++ )
  {
    pDes[x-1] = pSrc[x-1];
  }

  iDesStride  = getCStride();
  iSrcStride  = pcSrcBuffer->getCStride();
  pSrc        = pcSrcBuffer->getMbCbAddr();
  pDes        = getMbCbAddr();

  if(bTopIntra) 
  {
   pSrc+=4*iSrcStride;
   pDes+=4*iDesStride;
  }
   
   for( x = 0; x < 10; x++ )
  {
    pDes[x-iDesStride-1] = pSrc[x-iSrcStride-1];
  }
  for( y = 0; y < ysizecr; y++ )
  {
    pDes[-1] = pSrc[-1];
    pDes[8]  = pSrc[8];
    pDes += iDesStride;
    pSrc += iSrcStride;
  }
  
  for( x = 0; x < 10; x++ )
  {
    pDes[x-1] = pSrc[x-1];
  }

  pSrc        = pcSrcBuffer->getMbCrAddr();
  pDes        = getMbCrAddr();

   if(bTopIntra) 
  {
    pSrc+=4*iSrcStride;
    pDes+=4*iDesStride;
  }

  for( x = 0; x < 10; x++ )
  {
    pDes[x-iDesStride-1] = pSrc[x-iSrcStride-1];
  }
  for( y = 0; y < ysizecr; y++ )
  {
    pDes[-1] = pSrc[-1];
    pDes[8]  = pSrc[8];
    pDes += iDesStride;
    pSrc += iSrcStride;
  }
 for( x = 0; x < 10; x++ )
  {
    pDes[x-1] = pSrc[x-1];
  }
}

//TMM_INTERLACE }

Void YuvMbBufferExtension::xMerge( Int xDir, Int yDir, Int iSize, XPel *puc, Int iStride, Bool bPresent )
{
  XPel pPelH[9];
  XPel pPelV[9];
  Int  iAdd   =1;
  Int  x,y,xo;

  if( yDir < 0)	
  {
    puc    += iStride*(iSize-1);
    iStride = -iStride; 
  }

  if( xDir < 0)	
  {
    puc    += (iSize-1);
    iAdd   =-1;
  }

  for( x = 0; x <= iSize; x++ )
  {
    pPelH[x] = puc[(x-1)*iAdd - iStride];
  }	

   for( y = 0; y <= iSize; y++ )
  {
    pPelV[y] = puc[(y-1)*iStride - iAdd];
  }	

  if( ! bPresent )
  {
    pPelV[0] = pPelH[0] = (pPelH[1] + pPelV[1] + 1)>>1;
  }

    for( y = 0; y < iSize; y++, puc += iStride )
  {
    for( xo = 0, x = 0; x < iSize; x++, xo += iAdd )
    {
      const Int iOffset = x-y;
	    if( iOffset > 0 )
      {
        puc[xo] = (pPelH[ iOffset-1] + 2*pPelH[ iOffset] + pPelH[ iOffset+1] + 2)>>2;
      }
      else if( iOffset < 0 )
      {
        puc[xo] = (pPelV[-iOffset-1] + 2*pPelV[-iOffset] + pPelV[-iOffset+1] + 2)>>2;
      }
      else
      {
        puc[xo] = (pPelH[1] + 2*pPelV[0] + pPelV[1] + 2)>>2;
      }
    }
  }
}

Void YuvMbBufferExtension::mergeFromLeftAbove ( LumaIdx cIdx, Bool bCornerMbPresent )
{
  xMerge( 1, 1, 8, getYBlk( cIdx ), getLStride(), bCornerMbPresent );
  xMerge( 1, 1, 4, getUBlk( cIdx ), getCStride(), bCornerMbPresent );
  xMerge( 1, 1, 4, getVBlk( cIdx ), getCStride(), bCornerMbPresent );
}

Void YuvMbBufferExtension::mergeRightBelow    ( LumaIdx cIdx, Bool bCornerMbPresent )
{
  xMerge( -1, -1, 8, getYBlk( cIdx ), getLStride(), bCornerMbPresent );
  xMerge( -1, -1, 4, getUBlk( cIdx ), getCStride(), bCornerMbPresent );
  xMerge( -1, -1, 4, getVBlk( cIdx ), getCStride(), bCornerMbPresent );
}

Void YuvMbBufferExtension::mergeFromRightAbove( LumaIdx cIdx, Bool bCornerMbPresent )
{
  xMerge( -1, 1, 8, getYBlk( cIdx ), getLStride(), bCornerMbPresent );
  xMerge( -1, 1, 4, getUBlk( cIdx ), getCStride(), bCornerMbPresent );
  xMerge( -1, 1, 4, getVBlk( cIdx ), getCStride(), bCornerMbPresent );
}

Void YuvMbBufferExtension::mergeLeftBelow     ( LumaIdx cIdx, Bool bCornerMbPresent )
{
  xMerge( 1, -1, 8, getYBlk( cIdx ), getLStride(), bCornerMbPresent );
  xMerge( 1, -1, 4, getUBlk( cIdx ), getCStride(), bCornerMbPresent );
  xMerge( 1, -1, 4, getVBlk( cIdx ), getCStride(), bCornerMbPresent );
}

Void YuvMbBufferExtension::copyFromBelow      ( LumaIdx cIdx )
{
  XPel* pPel    = getYBlk( cIdx );
  Int   iStride = getLStride();
  Int   y;

  pPel += 8*iStride;
  for( y = 0; y < 8; y++ )
  {
    ::memcpy( pPel-iStride, pPel, 8 * sizeof(XPel) );
    pPel -= iStride;
  }

  pPel    = getUBlk( cIdx );
  iStride = getCStride();

  pPel += 4*iStride;
  for( y = 0; y < 4; y++ )
  {
    ::memcpy( pPel-iStride, pPel, 4 * sizeof(XPel) );
    pPel -= iStride;
  }

  pPel    = getVBlk( cIdx );

  pPel += 4*iStride;
  for( y = 0; y < 4; y++ )
  {
    ::memcpy( pPel-iStride, pPel, 4 * sizeof(XPel) );
    pPel -= iStride;
  }
}

Void YuvMbBufferExtension::copyFromLeft       ( LumaIdx cIdx )
{
  XPel* pPel    = getYBlk( cIdx );
  Int   iStride = getLStride();
  Int   x, y;

  for( y = 0; y < 8; y++ )
  {
    for( x = 0; x < 8; x++ )
    {
      pPel[x] = pPel[-1];
    }
    pPel += iStride;
  }

  pPel    = getUBlk( cIdx );
  iStride = getCStride();

  for( y = 0; y < 4; y++ )
  {
    for( x = 0; x < 4; x++ )
    {
      pPel[x] = pPel[-1];
    }
    pPel += iStride;
  }

  pPel    = getVBlk( cIdx );

  for( y = 0; y < 4; y++ )
  {
    for( x = 0; x < 4; x++ )
    {
      pPel[x] = pPel[-1];
    }
    pPel += iStride;
  }
}

Void YuvMbBufferExtension::copyFromAbove      ( LumaIdx cIdx )
{
  XPel* pPel    = getYBlk( cIdx );
  Int   iStride = getLStride();
  Int   y;

  for( y = 0; y < 8; y++ )
  {
    ::memcpy( pPel, pPel-iStride, 8 * sizeof(XPel) );
    pPel += iStride;
  }

  pPel    = getUBlk( cIdx );
  iStride = getCStride();

  for( y = 0; y < 4; y++ )
  {
    ::memcpy( pPel, pPel-iStride, 4 * sizeof(XPel) );
    pPel += iStride;
  }

  pPel    = getVBlk( cIdx );

  for( y = 0; y < 4; y++ )
  {
    ::memcpy( pPel, pPel-iStride, 4 * sizeof(XPel) );
    pPel += iStride;
  }
}

Void YuvMbBufferExtension::copyFromRight      ( LumaIdx cIdx )
{
  XPel* pPel    = getYBlk( cIdx );
  Int   iStride = getLStride();
  Int   y,x;

  for( y = 0; y < 8; y++ )
  {
    for( x = 0; x < 8; x++ )
    {
      pPel[x] = pPel[8];
    }
    pPel += iStride;
  }

  pPel    = getUBlk( cIdx );
  iStride = getCStride();

  for( y = 0; y < 4; y++ )
  {
    for( x = 0; x < 4; x++ )
    {
      pPel[x] = pPel[4];
    }
    pPel += iStride;
  }

  pPel    = getVBlk( cIdx );

  for( y = 0; y < 4; y++ )
  {
    for( x = 0; x < 4; x++ )
    {
      pPel[x] = pPel[4];
    }
    pPel += iStride;
  }
}

Void YuvMbBufferExtension::xFill( LumaIdx cIdx, XPel cY, XPel cU, XPel cV )
{
  XPel* pPel    = getYBlk( cIdx );
  Int   iStride = getLStride();
  Int   x, y;

  for( y = 0; y < 8; y++ )
  {
    for( x = 0; x < 8; x++ )
    {
      pPel[x] = cY;
    }
    pPel += iStride;
  }

  pPel    = getUBlk( cIdx );
  iStride = getCStride();

  for( y = 0; y < 4; y++ )
  {
    for( x = 0; x < 4; x++ )
    {
      pPel[x] = cU;
    }
    pPel += iStride;
  }

  pPel    = getVBlk( cIdx );

  for( y = 0; y < 4; y++ )
  {
    for( x = 0; x < 4; x++ )
    {
      pPel[x] = cV;
    }
    pPel += iStride;
  }
}

Void YuvMbBufferExtension::copyFromLeftAbove  ( LumaIdx cIdx )
{
  XPel cY = *(getYBlk( cIdx ) - 1 - getLStride());
  XPel cU = *(getUBlk( cIdx ) - 1 - getCStride());
  XPel cV = *(getVBlk( cIdx ) - 1 - getCStride());

  xFill( cIdx, cY, cU, cV );
}

Void YuvMbBufferExtension::copyFromRightAbove ( LumaIdx cIdx )
{
  XPel cY = *(getYBlk( cIdx ) + 8 - getLStride());
  XPel cU = *(getUBlk( cIdx ) + 4 - getCStride());
  XPel cV = *(getVBlk( cIdx ) + 4 - getCStride());

  xFill( cIdx, cY, cU, cV );
}

Void YuvMbBufferExtension::copyFromLeftBelow  ( LumaIdx cIdx )
{
  XPel cY = *(getYBlk( cIdx ) - 1 + 8 * getLStride());
  XPel cU = *(getUBlk( cIdx ) - 1 + 4 * getCStride());
  XPel cV = *(getVBlk( cIdx ) - 1 + 4 * getCStride());

  xFill( cIdx, cY, cU, cV );
}

Void YuvMbBufferExtension::copyFromRightBelow ( LumaIdx cIdx )
{
  XPel cY = *(getYBlk( cIdx ) + 8 + 8 * getLStride());
  XPel cU = *(getUBlk( cIdx ) + 4 + 4 * getCStride());
  XPel cV = *(getVBlk( cIdx ) + 4 + 4 * getCStride());

  xFill( cIdx, cY, cU, cV );
}


H264AVC_NAMESPACE_END

⌨️ 快捷键说明

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