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

📄 intyuvpicbuffer.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  iSrcStride  >>= 1;
  iDesStride  >>= 1;
  uiHeight    >>= 1;
  uiWidth     >>= 1;
  pDes          = pcDesYuvPicBuffer->getMbCbAddr();
  pSrc          = getMbCbAddr();

  for( y = 0; y < uiHeight; y++ )
  {
    for( x = 0; x < uiWidth; x++ )
    {
      pDes[x] = (Pel)pSrc[x];
    }
    pSrc  += iSrcStride;
    pDes  += iDesStride;
  }

  //===== chrominance V =====
  pDes          = pcDesYuvPicBuffer->getMbCrAddr();
  pSrc          = getMbCrAddr();

  for( y = 0; y < uiHeight; y++ )
  {
    for( x = 0; x < uiWidth; x++ )
    {
      pDes[x] = (Pel)pSrc[x];
    }
    pSrc  += iSrcStride;
    pDes  += iDesStride;
  }

  return Err::m_nOK;
}



//JVT-U106 Behaviour at slice boundaries{
ErrVal IntYuvPicBuffer::copyMask ( IntYuvPicBuffer*  pcSrcYuvPicBuffer,Int**ppiMaskL,Int**ppiMaskC )
{
	pcSrcYuvPicBuffer->m_rcYuvBufferCtrl.initMb();
	m_rcYuvBufferCtrl.initMb();

	XPel* pSrc        = pcSrcYuvPicBuffer->getMbLumAddr();
	XPel* pDes        = getMbLumAddr();
	Int   iSrcStride  = pcSrcYuvPicBuffer->getLStride();
	Int   iDesStride  = getLStride();
	UInt  uiHeight    = pcSrcYuvPicBuffer->getLHeight();
	UInt  uiWidth     = pcSrcYuvPicBuffer->getLWidth ();
	UInt  y, x;

	//===== luminance =====
	for( y = 0; y < uiHeight; y++ )
	{
		for( x = 0; x < uiWidth; x++ )
		{
			if(ppiMaskL[y][x]==1)
				pDes[x] = pSrc[x];
		}
		pSrc  += iSrcStride;
		pDes  += iDesStride;
	}

	//===== chrominance U =====
	iSrcStride  >>= 1;
	iDesStride  >>= 1;
	uiHeight    >>= 1;
	uiWidth     >>= 1;
	pSrc          = pcSrcYuvPicBuffer->getMbCbAddr();
	pDes          = getMbCbAddr();

	for( y = 0; y < uiHeight; y++ )
	{
		for( x = 0; x < uiWidth; x++ )
		{
			if(ppiMaskC[y][x]==1)
				pDes[x] = pSrc[x];
		}
		pSrc  += iSrcStride;
		pDes  += iDesStride;
	}

	//===== chrominance V =====
	pSrc          = pcSrcYuvPicBuffer->getMbCrAddr();
	pDes          = getMbCrAddr();

	for( y = 0; y < uiHeight; y++ )
	{
		for( x = 0; x < uiWidth; x++ )
		{
			if(ppiMaskC[y][x]==1)
				pDes[x] = pSrc[x];
		}
		pSrc  += iSrcStride;
		pDes  += iDesStride;
	}

	return Err::m_nOK;
}

ErrVal IntYuvPicBuffer::copyPortion( IntYuvPicBuffer*  pcSrcYuvPicBuffer )
{
	pcSrcYuvPicBuffer->m_rcYuvBufferCtrl.initMb();
	m_rcYuvBufferCtrl.initMb();

	XPel* pSrc        = pcSrcYuvPicBuffer->getMbLumAddr();
	XPel* pDes        = getMbLumAddr();
	Int   iSrcStride  = pcSrcYuvPicBuffer->getLStride();
	Int   iDesStride  = getLStride();
	UInt  uiHeight    = getLHeight();
	UInt  uiWidth     = getLWidth ();
	UInt  y, x;

	//===== luminance =====
	for( y = 0; y < uiHeight; y++ )
	{
		for( x = 0; x < uiWidth; x++ )
		{
			pDes[x] = pSrc[x];
		}
		pSrc  += iSrcStride;
		pDes  += iDesStride;
	}

	//===== chrominance U =====
	iSrcStride  >>= 1;
	iDesStride  >>= 1;
	uiHeight    >>= 1;
	uiWidth     >>= 1;
	pSrc          = pcSrcYuvPicBuffer->getMbCbAddr();
	pDes          = getMbCbAddr();

	for( y = 0; y < uiHeight; y++ )
	{
		for( x = 0; x < uiWidth; x++ )
		{
			pDes[x] = pSrc[x];
		}
		pSrc  += iSrcStride;
		pDes  += iDesStride;
	}

	//===== chrominance V =====
	pSrc          = pcSrcYuvPicBuffer->getMbCrAddr();
	pDes          = getMbCrAddr();

	for( y = 0; y < uiHeight; y++ )
	{
		for( x = 0; x < uiWidth; x++ )
		{
			pDes[x] = pSrc[x];
		}
		pSrc  += iSrcStride;
		pDes  += iDesStride;
	}

	return Err::m_nOK;
}
//JVT-U106 Behaviour at slice boundaries}

ErrVal IntYuvPicBuffer::dumpLPS( FILE* pFile )
{
  UChar*  pChar     = new UChar [ getLWidth() ];
  ROF( pChar );

  m_rcYuvBufferCtrl.initMb();

  XPel*   pPel      = getMbLumAddr();
  Int     iStride   = getLStride();
  UInt    uiHeight  = getLHeight();
  UInt    uiWidth   = getLWidth ();
  UInt    y, x;

  //===== luminance =====
  for( y = 0; y < uiHeight; y++ )
  {
    for( x = 0; x < uiWidth; x++ )
    {
      pChar[x] = (UChar)( max( (Int)0, min( (Int)255, pPel[x] ) ) );
    }
    pPel += iStride;
    ::fwrite( pChar, sizeof(UChar), uiWidth, pFile );
  }

  //===== chrominance U =====
  iStride   >>= 1;
  uiHeight  >>= 1;
  uiWidth   >>= 1;
  pPel        = getMbCbAddr();

  for( y = 0; y < uiHeight; y++ )
  {
    for( x = 0; x < uiWidth; x++ )
    {
      pChar[x] = (UChar)( max( (Int)0, min( (Int)255, pPel[x] ) ) );
    }
    pPel += iStride;
    ::fwrite( pChar, sizeof(UChar), uiWidth, pFile );
  }

  //===== chrominance V =====
  pPel        = getMbCrAddr();

  for( y = 0; y < uiHeight; y++ )
  {
    for( x = 0; x < uiWidth; x++ )
    {
      pChar[x] = (UChar)( max( (Int)0, min( (Int)255, pPel[x] ) ) );
    }
    pPel += iStride;
    ::fwrite( pChar, sizeof(UChar), uiWidth, pFile );
  }

  delete [] pChar; // bug-fix by H. Schwarz / J. Reichel

  return Err::m_nOK;
}





ErrVal IntYuvPicBuffer::dumpHPS( FILE* pFile, MbDataCtrl* pcMbDataCtrl )
{
  Int     iNumMbY   = getLHeight() >> 4;
  Int     iNumMbX   = getLWidth () >> 4;
  UChar*  pucIntra  = new UChar[iNumMbX*iNumMbY];
  ROF( pucIntra );
  ::memset( pucIntra, 0x00, iNumMbX*iNumMbY*sizeof(UChar) );

  if( pcMbDataCtrl )
  {
    for( Int iMbY = 0; iMbY < iNumMbY; iMbY++ )
    for( Int iMbX = 0; iMbX < iNumMbX; iMbX++ )
    {
      if( pcMbDataCtrl->getMbData( iMbX, iMbY ).isIntra() )
      {
        pucIntra[iMbY*iNumMbX+iMbX] = 1;
      }
    }
  }


  UChar*  pChar     = new UChar [ getLWidth() ];
  ROF( pChar );

  m_rcYuvBufferCtrl.initMb();

  XPel*   pPel      = getMbLumAddr();
  Int     iStride   = getLStride();
  UInt    uiHeight  = getLHeight();
  UInt    uiWidth   = getLWidth ();
  UInt    y, x;

  //===== luminance =====
  for( y = 0; y < uiHeight; y++ )
  {
    for( x = 0; x < uiWidth; x++ )
    {
      if( pucIntra[(y>>4)*iNumMbX+(x>>4)] )
        pChar[x] = (UChar)( max( (Int)0, min( (Int)255,       pPel[x] ) ) );
      else
        pChar[x] = (UChar)( max( (Int)0, min( (Int)255, 127 + pPel[x] ) ) );
    }
    pPel += iStride;
    ::fwrite( pChar, sizeof(UChar), uiWidth, pFile );
  }

  //===== chrominance U =====
  iStride   >>= 1;
  uiHeight  >>= 1;
  uiWidth   >>= 1;
  pPel        = getMbCbAddr();

  for( y = 0; y < uiHeight; y++ )
  {
    for( x = 0; x < uiWidth; x++ )
    {
      if( pucIntra[(y>>3)*iNumMbX+(x>>3)] )
        pChar[x] = (UChar)( max( (Int)0, min( (Int)255,       pPel[x] ) ) );
      else
        pChar[x] = (UChar)( max( (Int)0, min( (Int)255, 127 + pPel[x] ) ) );
    }
    pPel += iStride;
    ::fwrite( pChar, sizeof(UChar), uiWidth, pFile );
  }

  //===== chrominance V =====
  pPel        = getMbCrAddr();

  for( y = 0; y < uiHeight; y++ )
  {
    for( x = 0; x < uiWidth; x++ )
    {
      if( pucIntra[(y>>3)*iNumMbX+(x>>3)] )
        pChar[x] = (UChar)( max( (Int)0, min( (Int)255,       pPel[x] ) ) );
      else
        pChar[x] = (UChar)( max( (Int)0, min( (Int)255, 127 + pPel[x] ) ) );
    }
    pPel += iStride;
    ::fwrite( pChar, sizeof(UChar), uiWidth, pFile );
  }


  delete [] pChar; // bug-fix by H. Schwarz / J. Reichel
  delete [] pucIntra; // bug-fix by H. Schwarz / J. Reichel

  return Err::m_nOK;
}

// Hanke@RWTH
Bool IntYuvPicBuffer::isCurr4x4BlkNotZero ( LumaIdx cIdx )
{
  XPel* pPel      = getMbLumAddr(); 
  Int   iStride   = getLStride();
   
  for( Int iY = 0; iY<4; ++iY ) {
    for( Int iX = 0; iX<4; ++iX )
    {
      if ( pPel [ (cIdx.y()*4+iY)*iStride + cIdx.x()*4+iX ] )
        return true;
    } 
  }
  return false;
}

Bool IntYuvPicBuffer::isLeft4x4BlkNotZero ( LumaIdx cIdx )
{
  XPel* pPel      = getMbLumAddr(); 
  Int   iStride   = getLStride();
     
  for( Int iY = 0; iY<4; ++iY ) 
  {
    for( Int iX = 0; iX<4; ++iX )
    {
      if ( pPel [ (cIdx.y()*4+iY)*iStride + cIdx.x()*4+iX - 16 ] )
        return true;
    } 
  }
  return false;
}

Bool IntYuvPicBuffer::isAbove4x4BlkNotZero ( LumaIdx cIdx )
{
  XPel* pPel      = getMbLumAddr(); 
  Int   iStride   = getLStride();
   
  for( Int iY = 0; iY<4; ++iY ) {
    for( Int iX = 0; iX<4; ++iX )
    {
      if ( pPel [ (cIdx.y()*4+iY - 16 )*iStride + cIdx.x()*4+iX ] )
        return true;
    } 
  }
  return false;
}

// TMM_ESS {
ErrVal IntYuvPicBuffer::upsampleResidual( DownConvert& rcDownConvert, ResizeParameters* pcParameters, MbDataCtrl* pcMbDataCtrl, Bool bClip )
{
  RNOK( m_rcYuvBufferCtrl.initMb() );

  XPel*   pPelY     = getMbLumAddr();
  XPel*   pPelU     = getMbCbAddr ();
  XPel*   pPelV     = getMbCrAddr ();
  Int     iStrideY  = getLStride  ();
  Int     iStrideC  = getCStride  ();

  rcDownConvert.upsampleResidual(pPelY, iStrideY,
                                 pPelU, iStrideC,
                                 pPelV, iStrideC,
                                 pcParameters,
                                 pcMbDataCtrl, bClip);
  return Err::m_nOK;
}

ErrVal IntYuvPicBuffer::upsample( DownConvert& rcDownConvert, ResizeParameters* pcParameters, Bool bClip )
{
  RNOK( m_rcYuvBufferCtrl.initMb() );

  XPel*   pPelY     = getMbLumAddr();
  XPel*   pPelU     = getMbCbAddr ();
  XPel*   pPelV     = getMbCrAddr ();
  Int     iStrideY  = getLStride  ();
  Int     iStrideC  = getCStride  ();

  rcDownConvert.upsample(pPelY, iStrideY,
                         pPelU, iStrideC,
                         pPelV, iStrideC,
                         pcParameters,
                         bClip);
  return Err::m_nOK;
}
// TMM_ESS }



ErrVal IntYuvPicBuffer::setNonZeroFlags( UShort* pusNonZeroFlags, UInt uiStride )
{
  m_rcYuvBufferCtrl.initMb();

  XPel* pData       = getMbLumAddr();
  Int   iDataStride = getLStride  ();
  UInt  uiHeight    = getLHeight  ();
  UInt  uiWidth     = getLWidth   ();
  UInt  y, x;

  //===== clear all flags =====
  for( y = 0; y < (uiHeight>>4); y++ )
  for( x = 0; x < (uiWidth >>4); x++ )
  {
    pusNonZeroFlags[y*uiStride+x] = 0;
  }

  //===== luma =====
  for( y = 0; y < uiHeight; y++ )
  {
    for( x = 0; x < uiWidth; x++ )
    {
      if( pData[x] )
      {
        UShort& usMbFlags   = pusNonZeroFlags[(y>>4)*uiStride+(x>>4)];
        UInt    uiFlagsPos  = ((y%16)>>2)*4+((x%16)>>2);
        usMbFlags |= ( 1 << uiFlagsPos );
      }
    }
    pData += iDataStride;
  }

  iDataStride >>= 1;
  uiHeight    >>= 1;
  uiWidth     >>= 1;
  pData = getMbCbAddr();

  //===== cb =====
  for( y = 0; y < uiHeight; y++ )
  {
    for( x = 0; x < uiWidth; x++ )
    {
      if( pData[x] )
      {
        UShort& usMbFlags   = pusNonZeroFlags[(y>>3)*uiStride+(x>>3)];
        UInt    uiFlagsPos  = ((y%8)>>1)*4+((x%8)>>1);
        usMbFlags |= ( 1 << uiFlagsPos );
      }
    }
    pData += iDataStride;
  }

  pData = getMbCrAddr();

  //===== cr =====
  for( y = 0; y < uiHeight; y++ )
  {
    for( x = 0; x < uiWidth; x++ )
    {
      if( pData[x] )
      {
        UShort& usMbFlags   = pusNonZeroFlags[(y>>3)*uiStride+(x>>3)];
        UInt    uiFlagsPos  = ((y%8)>>1)*4+((x%8)>>1);
        usMbFlags |= ( 1 << uiFlagsPos );
      }
    }
    pData += iDataStride;
  }

  return Err::m_nOK;
}

Void IntYuvPicBuffer::xCopyFillPlaneMargin( XPel *pucSrc, XPel *pucDest, Int iHeight, Int iWidth, Int iStride, Int iXMargin, Int iYMargin )
{
  XPel* puc;
  Int n;

  Int iOffset = -iXMargin;
  // rec area + left and right borders at once
  UInt uiSize = sizeof(XPel)*(iWidth + 2*iXMargin);
  for( n = 0; n < iHeight; n++ )
  {
    ::memcpy( pucDest + iOffset, pucSrc + iOffset, uiSize );
    iOffset += iStride;
  }

  // bot border lum
  puc = pucDest - iXMargin + iStride * iHeight;
  for( n = 0; n < iYMargin; n++ )
  {
    ::memcpy( puc, puc - iStride, uiSize );
    puc += iStride;
  }

  // top border lum
  puc = pucDest - iXMargin;
  for( n = 0; n < iYMargin; n++ )
  {
    ::memcpy( puc - iStride, puc, uiSize );
    puc -= iStride;
  }
}

Void IntYuvPicBuffer::xCopyPlane( XPel *pucSrc, XPel *pucDest, Int iHeight, Int iWidth, Int iStride )
{
  // don't copy if src and dest have the same address
  ROTVS( pucSrc == pucDest);

  const UInt uiSize = sizeof(XPel)*(iWidth );
  Int iOffset = 0;
  for( Int n = 0; n < iHeight; n++)
  {
    ::memcpy( pucDest + iOffset, pucSrc + iOffset, uiSize );
    iOffset += iStride;
  }
}

ErrVal IntYuvPicBuffer::loadBuffer( IntYuvPicBuffer *pcSrcYuvPicBuffer )
{
  m_rcYuvBufferCtrl.initMb();

  ROT( pcSrcYuvPicBuffer->getLHeight() * pcSrcYuvPicBuffer->getLStride() != getLHeight() * getLStride() );

 //TMM_INTERLACE
  Int iSrcOffset  = pcSrcYuvPicBuffer->m_ePicType == BOT_FIELD ? - pcSrcYuvPicBuffer->getCStride() : 0;
  iSrcOffset += m_ePicType == BOT_FIELD ? getCStride() : 0;

  xCopyPlane( iSrcOffset + pcSrcYuvPicBuffer->getMbLumAddr(), getMbLumAddr(), getLHeight(), getLWidth(), getLStride() );
  iSrcOffset >>= 1;
  xCopyPlane( iSrcOffset + pcSrcYuvPicBuffer->getMbCbAddr(),  getMbCbAddr(),  getCHeight(), getCWidth(), getCStride() );
  xCopyPlane( iSrcOffset + pcSrcYuvPicBuffer->getMbCrAddr(),  getMbCrAddr(),  getCHeight(), getCWidth(), getCStride() );

  return Err::m_nOK;
}

ErrVal IntYuvPicBuffer::loadBufferAndFillMargin( IntYuvPicBuffer *pcSrcYuvPicBuffer )
{
  m_rcYuvBufferCtrl.initMb();
  ROT( pcSrcYuvPicBuffer->getLHeight() * pcSrcYuvPicBuffer->getLStride() != getLHeight() * getLStride() );

  //TMM_INTERLACE
  Int iSrcOffset  = pcSrcYuvPicBuffer->m_ePicType == BOT_FIELD ? - pcSrcYuvPicBuffer->getCStride() : 0;
  iSrcOffset += m_ePicType == BOT_FIELD ? getCStride() : 0;

  xCopyFillPlaneMargin( iSrcOffset + pcSrcYuvPicBuffer->getMbLumAddr(), getMbLumAddr(), getLHeight(), getLWidth(), getLStride(), getLXMargin(), getLYMargin() );
  iSrcOffset >>= 1;
  xCopyFillPlaneMargin( iSrcOffset + pcSrcYuvPicBuffer->getMbCbAddr(),  getMbCbAddr(),  getCHeight(), getCWidth(), getCStride(), getCXMargin(), getCYMargin() );
  xCopyFillPlaneMargin( iSrcOffset + pcSrcYuvPicBuffer->getMbCrAddr(),  getMbCrAddr(),  getCHeight(), getCWidth(), getCStride(), getCXMargin(), getCYMargin() );

  return Err::m_nOK;
}

ErrVal IntYuvPicBuffer::fillMargin()
{
  m_rcYuvBufferCtrl.initMb();

  xFillPlaneMargin( getMbLumAddr(), getLHeight(), getLWidth(), getLStride(), getLXMargin(), getLYMargin() );
  xFillPlaneMargin( getMbCbAddr(),  getCHeight(), getCWidth(), getCStride(), getCXMargin(), getCYMargin() );
  xFillPlaneMargin( getMbCrAddr(),  getCHeight(), getCWidth(), getCStride(), getCXMargin(), getCYMargin() );

  return Err::m_nOK;
}



⌨️ 快捷键说明

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