intyuvpicbuffer.cpp
来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 1,982 行 · 第 1/4 页
CPP
1,982 行
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;
}
//TMM_EC {{
ErrVal IntYuvPicBuffer::copy( YuvPicBuffer* pcSrcYuvPicBuffer )
{
pcSrcYuvPicBuffer->m_rcYuvBufferCtrl.initMb();
m_rcYuvBufferCtrl.initMb();
Pel* 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++ )
{
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;
}
//TMM_EC }}
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;
}
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;
}
Void IntYuvPicBuffer::xFillPlaneMargin( XPel *pucDest, Int iHeight, Int iWidth, Int iStride, Int iXMargin, Int iYMargin )
{
XPel* puc;
Int n, m;
// left and right borders at once
puc = pucDest;
for( n = 0; n < iHeight; n++)
{
// left border lum
//::memset( puc - iXMargin, puc[0], iXMargin*sizeof(XPel) );
for( m = -iXMargin; m < 0; m++ ) puc[m] = puc[0];
// right border lum
//::memset( puc + iWidth, puc[iWidth - 1], iXMargin*sizeof(XPel) );
for( m = iWidth; m<iWidth+iXMargin; m++ ) puc[m] = puc[iWidth-1];
puc += iStride;
}
// bot border lum
puc = pucDest - iXMargin + iStride * iHeight;
UInt uiSize = iWidth + 2*iXMargin;
for( n = 0; n < iYMargin; n++)
{
::memcpy( puc, puc - iStride, uiSize*sizeof(XPel) );
puc += iStride;
}
// top border lum
puc = pucDest - iXMargin;
for( n = 0; n < iYMargin; n++)
{
::memcpy( puc - iStride, puc, uiSize*sizeof(XPel) );
puc -= iStride;
}
}
Void IntYuvPicBuffer::setZero()
{
Int n;
XPel* p;
m_rcYuvBufferCtrl.initMb();
for(n=0,p=getMbLumAddr();n<getLHeight();n++){::memset(p,0x00,getLWidth()*sizeof(XPel) );p+=getLStride();}
for(n=0,p=getMbCbAddr ();n<getCHeight();n++){::memset(p,0x00,getCWidth()*sizeof(XPel) );p+=getCStride();}
for(n=0,p=getMbCrAddr ();n<getCHeight();n++){::memset(p,0x00,getCWidth()*sizeof(XPel) );p+=getCStride();}
}
ErrVal IntYuvPicBuffer::update( IntYuvPicBuffer* pcSrcYuvPicBuffer,
IntYuvPicBuffer* pcMCPYuvPicBuffer0,
IntYuvPicBuffer* pcMCPYuvPicBuffer1 )
{
pcSrcYuvPicBuffer ->m_rcYuvBufferCtrl.initMb();
pcMCPYuvPicBuffer0->m_rcYuvBufferCtrl.initMb();
pcMCPYuvPicBuffer1->m_rcYuvBufferCtrl.initMb();
m_rcYuvBufferCtrl.initMb();
XPel* pSrcAnchor = pcSrcYuvPicBuffer ->getMbLumAddr();
XPel* pMCP0Anchor = pcMCPYuvPicBuffer0->getMbLumAddr();
XPel* pMCP1Anchor = pcMCPYuvPicBuffer1->getMbLumAddr();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?