📄 yuvpicbuffer.cpp
字号:
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;
}
ErrVal YuvPicBuffer::addWeighted( YuvPicBuffer* pcSrcYuvPicBuffer,
Double dWeight )
{
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;
Int iWeightT, iWeightS;
iWeightS = (Int) (dWeight * 256 + 0.5);
iWeightT = 256 - iWeightS;
//===== luminance =====
for( y = 0; y < uiHeight; y++ )
{
for( x = 0; x < uiWidth; x++ )
{
pDes[x] = ( pDes[x] * iWeightT + pSrc[x] * iWeightS + 128) >> 8;
// 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] = ( pDes[x] * iWeightT + pSrc[x] * iWeightS + 128) >> 8;
// 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] = ( pDes[x] * iWeightT + pSrc[x] * iWeightS + 128) >> 8;
// pDes[x] += pSrc[x];
}
pSrc += iSrcStride;
pDes += iDesStride;
}
return Err::m_nOK;
}
ErrVal YuvPicBuffer::inverseUpdate( YuvPicBuffer* pcSrcYuvPicBuffer,
YuvPicBuffer* pcMCPYuvPicBuffer,
UInt uiShift )
{
pcSrcYuvPicBuffer->m_rcYuvBufferCtrl.initMb();
pcMCPYuvPicBuffer->m_rcYuvBufferCtrl.initMb();
m_rcYuvBufferCtrl.initMb();
XPel* pSrc = pcSrcYuvPicBuffer->getMbLumAddr();
XPel* pMCP = pcMCPYuvPicBuffer->getMbLumAddr();
XPel* pDes = getMbLumAddr();
Int iSrcStride = pcSrcYuvPicBuffer->getLStride();
Int iMCPStride = pcMCPYuvPicBuffer->getLStride();
Int iDesStride = getLStride();
UInt uiHeight = getLHeight();
UInt uiWidth = getLWidth ();
UInt y, x;
//UInt uiShift = 1;
XPel pAdd = 0;
//===== luminance =====
for( y = 0; y < uiHeight; y++ )
{
for( x = 0; x < uiWidth; x++ )
{
pDes[x] = gClip( pSrc[x] - ( ( pMCP[x] + pAdd ) >> uiShift ) );
}
pSrc += iSrcStride;
pMCP += iMCPStride;
pDes += iDesStride;
}
//===== chrominance U =====
iSrcStride >>= 1;
iMCPStride >>= 1;
iDesStride >>= 1;
uiHeight >>= 1;
uiWidth >>= 1;
pSrc = pcSrcYuvPicBuffer->getMbCbAddr();
pMCP = pcMCPYuvPicBuffer->getMbCbAddr();
pDes = getMbCbAddr();
for( y = 0; y < uiHeight; y++ )
{
for( x = 0; x < uiWidth; x++ )
{
pDes[x] = gClip( pSrc[x] - ( ( pMCP[x] + pAdd ) >> uiShift ) );
}
pSrc += iSrcStride;
pMCP += iMCPStride;
pDes += iDesStride;
}
//===== chrominance V =====
pSrc = pcSrcYuvPicBuffer->getMbCrAddr();
pMCP = pcMCPYuvPicBuffer->getMbCrAddr();
pDes = getMbCrAddr();
for( y = 0; y < uiHeight; y++ )
{
for( x = 0; x < uiWidth; x++ )
{
pDes[x] = gClip( pSrc[x] - ( ( pMCP[x] + pAdd ) >> uiShift ) );
}
pSrc += iSrcStride;
pMCP += iMCPStride;
pDes += iDesStride;
}
return Err::m_nOK;
}
ErrVal YuvPicBuffer::inversePrediction( YuvPicBuffer* pcSrcYuvPicBuffer,
YuvPicBuffer* pcMCPYuvPicBuffer )
{
pcSrcYuvPicBuffer->m_rcYuvBufferCtrl.initMb();
pcMCPYuvPicBuffer->m_rcYuvBufferCtrl.initMb();
m_rcYuvBufferCtrl.initMb();
XPel* pSrc = pcSrcYuvPicBuffer->getMbLumAddr();
XPel* pMCP = pcMCPYuvPicBuffer->getMbLumAddr();
XPel* pDes = getMbLumAddr();
Int iSrcStride = pcSrcYuvPicBuffer->getLStride();
Int iMCPStride = pcMCPYuvPicBuffer->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] = gClip( pSrc[x] + pMCP[x] );
}
pSrc += iSrcStride;
pMCP += iMCPStride;
pDes += iDesStride;
}
//===== chrominance U =====
iSrcStride >>= 1;
iMCPStride >>= 1;
iDesStride >>= 1;
uiHeight >>= 1;
uiWidth >>= 1;
pSrc = pcSrcYuvPicBuffer->getMbCbAddr();
pMCP = pcMCPYuvPicBuffer->getMbCbAddr();
pDes = getMbCbAddr();
for( y = 0; y < uiHeight; y++ )
{
for( x = 0; x < uiWidth; x++ )
{
pDes[x] = gClip( pSrc[x] + pMCP[x] );
}
pSrc += iSrcStride;
pMCP += iMCPStride;
pDes += iDesStride;
}
//===== chrominance V =====
pSrc = pcSrcYuvPicBuffer->getMbCrAddr();
pMCP = pcMCPYuvPicBuffer->getMbCrAddr();
pDes = getMbCrAddr();
for( y = 0; y < uiHeight; y++ )
{
for( x = 0; x < uiWidth; x++ )
{
pDes[x] = gClip( pSrc[x] + pMCP[x] );
}
pSrc += iSrcStride;
pMCP += iMCPStride;
pDes += iDesStride;
}
return Err::m_nOK;
}
ErrVal YuvPicBuffer::copy( YuvPicBuffer* pcSrcYuvPicBuffer )
{
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++ )
{
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;
}
ErrVal YuvPicBuffer::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 YuvPicBuffer::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 YuvPicBuffer::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 YuvPicBuffer::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 YuvPicBuffer::isAbove4x4BlkNotZero ( LumaIdx cIdx )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -