yuvmbbuffer.cpp

来自「SVC最新更新代码」· C++ 代码 · 共 934 行 · 第 1/2 页

CPP
934
字号
    ::memset( pPel, 0x00, 8 * sizeof(XPel) );
    pPel += iStride;
  }

  pPel    = getMbCrAddr();

  for( y = 0; y < 8; y++ )
  {
    ::memset( pPel, 0x00, 8 * sizeof(XPel) );
    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;
  Bool  bTopIntra     = ( ( uiMask & 0x020 ) != 0 );
  Bool  bBotIntra     = ( ( uiMask & 0x040 ) != 0 );
  Int   iYSizeLuma    = ( bTopIntra || bBotIntra ? 8 : 16 );
  Int   iYSizeChroma  = iYSizeLuma >> 1;

  Int   iSrcStride    = pcSrcBuffer->getLStride();
  Int   iDesStride    = getLStride();
  XPel* pSrc          = pcSrcBuffer->getMbLumAddr() + ( bTopIntra ? iYSizeLuma * iSrcStride : 0 );
  XPel* pDes          = getMbLumAddr()              + ( bTopIntra ? iYSizeLuma * iDesStride : 0 );

  for( x = 0; x < 18; x++ )
  {
    pDes[x-iDesStride-1] = pSrc[x-iSrcStride-1];
  }
  for( y = 0; y < iYSizeLuma; 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];
  }

  iSrcStride  = pcSrcBuffer->getCStride();
  iDesStride  = getCStride();
  pSrc        = pcSrcBuffer->getMbCbAddr() + ( bTopIntra ? iYSizeChroma * iSrcStride : 0 );
  pDes        = getMbCbAddr()              + ( bTopIntra ? iYSizeChroma * iDesStride : 0 );
   
  for( x = 0; x < 10; x++ )
  {
    pDes[x-iDesStride-1] = pSrc[x-iSrcStride-1];
  }
  for( y = 0; y < iYSizeChroma; 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() + ( bTopIntra ? iYSizeChroma * iSrcStride : 0 );
  pDes  = getMbCrAddr()              + ( bTopIntra ? iYSizeChroma * iDesStride : 0 );

  for( x = 0; x < 10; x++ )
  {
    pDes[x-iDesStride-1] = pSrc[x-iSrcStride-1];
  }
  for( y = 0; y < iYSizeChroma; 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 bCornerMbPresent, Bool bHalfYSize )
{
  XPel  pPelH[9];
  XPel  pPelV[9];
  Int   iXSize  = iSize;
  Int   iYSize  = ( bHalfYSize ? iSize >> 1 : iSize );
  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 <= iXSize; x++ )
  {
    pPelH[x] = puc[(x-1)*iAdd - iStride];
  }	
  for( y = 0; y <= iYSize; y++ )
  {
    pPelV[y] = puc[(y-1)*iStride - iAdd];
  }	

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

  for( y = 0; y < iYSize; y++, puc += iStride )
  {
    for( xo = 0, x = 0; x < iXSize; 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, Bool bHalfYSize )
{
  xMerge(  1,  1, 8, getYBlk( cIdx ), getLStride(), bCornerMbPresent, bHalfYSize );
  xMerge(  1,  1, 4, getUBlk( cIdx ), getCStride(), bCornerMbPresent, bHalfYSize );
  xMerge(  1,  1, 4, getVBlk( cIdx ), getCStride(), bCornerMbPresent, bHalfYSize );
}

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

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

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

Void YuvMbBufferExtension::copyFromBelow      ( LumaIdx cIdx, Bool bHalfYSize )
{
  Int   iYSize  = ( bHalfYSize ? 4 : 8 );
  XPel* pPel    = getYBlk( cIdx );
  Int   iStride = getLStride();
  Int   y;

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

  pPel    = getUBlk( cIdx );
  iStride = getCStride();
  iYSize  = iYSize >> 1;

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

  pPel    = getVBlk( cIdx );

  pPel += 4*iStride;
  for( y = 0; y < iYSize; 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, Bool bHalfYSize )
{
  Int   iYSize  = ( bHalfYSize ? 4 : 8 );
  XPel* pPel    = getYBlk( cIdx );
  Int   iStride = getLStride();
  Int   y;

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

  pPel    = getUBlk( cIdx );
  iStride = getCStride();
  iYSize  = iYSize >> 1;

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

  pPel    = getVBlk( cIdx );

  for( y = 0; y < iYSize; 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, Bool bHalfYSize, Bool bLowerHalf )
{
  AOT( !bHalfYSize && bLowerHalf );
  Int   iYSize  = ( bHalfYSize ? 4 : 8 );
  Int   iStride = getLStride();
  XPel* pPel    = getYBlk( cIdx ) + ( bLowerHalf ? 4*iStride : 0 );
  Int   x, y;

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

  iYSize  = ( bHalfYSize ? 2 : 4 );
  iStride = getCStride();
  pPel    = getUBlk( cIdx ) + ( bLowerHalf ? 2*iStride : 0 );

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

  pPel    = getVBlk( cIdx ) + ( bLowerHalf ? 2*iStride : 0 );

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

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

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

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

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

Void YuvMbBufferExtension::copyFromLeftBelow  ( LumaIdx cIdx, Bool bHalfYSize )
{
  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, bHalfYSize, bHalfYSize );
}

Void YuvMbBufferExtension::copyFromRightBelow ( LumaIdx cIdx, Bool bHalfYSize )
{
  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, bHalfYSize, bHalfYSize );
}



H264AVC_NAMESPACE_END

⌨️ 快捷键说明

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