📄 yuvpicbuffer.cpp
字号:
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;
}
ErrVal YuvPicBuffer::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 YuvPicBuffer::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 YuvPicBuffer::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 YuvPicBuffer::loadBuffer( YuvPicBuffer *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 YuvPicBuffer::loadBufferAndFillMargin( YuvPicBuffer *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 YuvPicBuffer::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 YuvPicBuffer::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 YuvPicBuffer::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 YuvPicBuffer::update( YuvPicBuffer* pcSrcYuvPicBuffer,
YuvPicBuffer* pcMCPYuvPicBuffer0,
YuvPicBuffer* 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();
XPel* pDesAnchor = getMbLumAddr();
Int iSrcStride = pcSrcYuvPicBuffer ->getLStride();
Int iMCP0Stride = pcMCPYuvPicBuffer0->getLStride();
Int iMCP1Stride = pcMCPYuvPicBuffer1->getLStride();
Int iDesStride = getLStride();
UInt uiHeight = getLHeight();
UInt uiWidth = getLWidth ();
UInt y, x;
//===== luminance =====
for( y = 0; y < uiHeight; y++ )
{
XPel* pSrc = pSrcAnchor + y * iSrcStride;
XPel* pMCP0 = pMCP0Anchor + y * iMCP0Stride;
XPel* pMCP1 = pMCP1Anchor + y * iMCP1Stride;
XPel* pDes = pDesAnchor + y * iDesStride;
for( x = 0; x < uiWidth; x++ )
{
pDes[x] = gClip( pSrc[x] + ( ( pMCP0[x] + pMCP1[x] + 1 ) >> 2 ) );
}
}
//===== chrominance U =====
iSrcStride >>= 1;
iMCP0Stride >>= 1;
iMCP1Stride >>= 1;
iDesStride >>= 1;
uiHeight >>= 1;
uiWidth >>= 1;
pSrcAnchor = pcSrcYuvPicBuffer ->getMbCbAddr();
pMCP0Anchor = pcMCPYuvPicBuffer0->getMbCbAddr();
pMCP1Anchor = pcMCPYuvPicBuffer1->getMbCbAddr();
pDesAnchor = getMbCbAddr();
for( y = 0; y < uiHeight; y++ )
{
XPel* pSrc = pSrcAnchor + y * iSrcStride;
XPel* pMCP0 = pMCP0Anchor + y * iMCP0Stride;
XPel* pMCP1 = pMCP1Anchor + y * iMCP1Stride;
XPel* pDes = pDesAnchor + y * iDesStride;
for( x = 0; x < uiWidth; x++ )
{
pDes[x] = gClip( pSrc[x] + ( ( pMCP0[x] + pMCP1[x] + 1 ) >> 2 ) );
}
}
//===== chrominance V =====
pSrcAnchor = pcSrcYuvPicBuffer ->getMbCrAddr();
pMCP0Anchor = pcMCPYuvPicBuffer0->getMbCrAddr();
pMCP1Anchor = pcMCPYuvPicBuffer1->getMbCrAddr();
pDesAnchor = getMbCrAddr();
for( y = 0; y < uiHeight; y++ )
{
XPel* pSrc = pSrcAnchor + y * iSrcStride;
XPel* pMCP0 = pMCP0Anchor + y * iMCP0Stride;
XPel* pMCP1 = pMCP1Anchor + y * iMCP1Stride;
XPel* pDes = pDesAnchor + y * iDesStride;
for( x = 0; x < uiWidth; x++ )
{
pDes[x] = gClip( pSrc[x] + ( ( pMCP0[x] + pMCP1[x] + 1 ) >> 2 ) );
}
}
return Err::m_nOK;
}
ErrVal YuvPicBuffer::inverseUpdate( YuvPicBuffer* pcSrcYuvPicBuffer,
YuvPicBuffer* pcMCPYuvPicBuffer0,
YuvPicBuffer* pcMCPYuvPicBuffer1 )
{
pcSrcYuvPicBuffer ->m_rcYuvBufferCtrl.initMb();
if (pcMCPYuvPicBuffer0)
pcMCPYuvPicBuffer0->m_rcYuvBufferCtrl.initMb();
if (pcMCPYuvPicBuffer1)
pcMCPYuvPicBuffer1->m_rcYuvBufferCtrl.initMb();
m_rcYuvBufferCtrl.initMb();
if (pcMCPYuvPicBuffer0 && pcMCPYuvPicBuffer1)
{
XPel* pSrcAnchor = pcSrcYuvPicBuffer ->getMbLumAddr();
XPel* pMCP0Anchor = pcMCPYuvPicBuffer0->getMbLumAddr();
XPel* pMCP1Anchor = pcMCPYuvPicBuffer1->getMbLumAddr();
XPel* pDesAnchor = getMbLumAddr();
Int iSrcStride = pcSrcYuvPicBuffer ->getLStride();
Int iMCP0Stride = pcMCPYuvPicBuffer0->getLStride();
Int iMCP1Stride = pcMCPYuvPicBuffer1->getLStride();
Int iDesStride = getLStride();
UInt uiHeight = getLHeight();
UInt uiWidth = getLWidth ();
UInt y, x;
//===== luminance =====
for( y = 0; y < uiHeight; y++ )
{
XPel* pSrc = pSrcAnchor + y * iSrcStride;
XPel* pMCP0 = pMCP0Anchor + y * iMCP0Stride;
XPel* pMCP1 = pMCP1Anchor + y * iMCP1Stride;
XPel* pDes = pDesAnchor + y * iDesStride;
for( x = 0; x < uiWidth; x++ )
{
pDes[x] = gClip( pSrc[x] - ( ( pMCP0[x] + pMCP1[x] + 1 ) >> 2 ) );
}
}
//===== chrominance U =====
iSrcStride >>= 1;
iMCP0Stride >>= 1;
iMCP1Stride >>= 1;
iDesStride >>= 1;
uiHeight >>= 1;
uiWidth >>= 1;
pSrcAnchor = pcSrcYuvPicBuffer ->getMbCbAddr();
pMCP0Anchor = pcMCPYuvPicBuffer0->getMbCbAddr();
pMCP1Anchor = pcMCPYuvPicBuffer1->getMbCbAddr();
pDesAnchor = getMbCbAddr();
for( y = 0; y < uiHeight; y++ )
{
XPel* pSrc = pSrcAnchor + y * iSrcStride;
XPel* pMCP0 = pMCP0Anchor + y * iMCP0Stride;
XPel* pMCP1 = pMCP1Anchor + y * iMCP1Stride;
XPel* pDes = pDesAnchor + y * iDesStride;
for( x = 0; x < uiWidth; x++ )
{
pDes[x] = gClip( pSrc[x] - ( ( pMCP0[x] + pMCP1[x] + 1 ) >> 2 ) );
}
}
//===== chrominance V =====
pSrcAnchor = pcSrcYuvPicBuffer ->getMbCrAddr();
pMCP0Anchor = pcMCPYuvPicBuffer0->getMbCrAddr();
pMCP1Anchor = pcMCPYuvPicBuffer1->getMbCrAddr();
pDesAnchor = getMbCrAddr();
for( y = 0; y < uiHeight; y++ )
{
XPel* pSrc = pSrcAnchor + y * iSrcStride;
XPel* pMCP0 = pMCP0Anchor + y * iMCP0Stride;
XPel* pMCP1 = pMCP1Anchor + y * iMCP1Stride;
XPel* pDes = pDesAnchor + y * iDesStride;
for( x = 0; x < uiWidth; x++ )
{
pDes[x] = gClip( pSrc[x] - ( ( pMCP0[x] + pMCP1[x] + 1 ) >> 2 ) );
}
}
}
else
{
XPel* pSrcAnchor = pcSrcYuvPicBuffer ->getMbLumAddr();
XPel* pMCAnchor ;
XPel* pDesAnchor = getMbLumAddr();
Int iSrcStride = pcSrcYuvPicBuffer ->getLStride();
Int iMCStride;
Int iDesStride = getLStride();
UInt uiHeight = getLHeight();
UInt uiWidth = getLWidth ();
UInt y, x;
if (pcMCPYuvPicBuffer0)
{
pMCAnchor = pcMCPYuvPicBuffer0->getMbLumAddr();
iMCStride = pcMCPYuvPicBuffer0->getLStride();
}
else
{
pMCAnchor = pcMCPYuvPicBuffer1->getMbLumAddr();
iMCStride = pcMCPYuvPicBuffer1->getLStride();
}
//===== luminance =====
for( y = 0; y < uiHeight; y++ )
{
XPel* pSrc = pSrcAnchor + y * iSrcStride;
XPel* pMC = pMCAnchor + y * iMCStride;
XPel* pDes = pDesAnchor + y * iDesStride;
for( x = 0; x < uiWidth; x++ )
{
pDes[x] = gClip( pSrc[x] - ( ( pMC[x] + 1 ) >> 2 ) );
}
}
//===== chrominance U =====
iSrcStride >>= 1;
iMCStride >>= 1;
iDesStride >>= 1;
uiHeight >>= 1;
uiWidth >>= 1;
pSrcAnchor = pcSrcYuvPicBuffer ->getMbCbAddr();
if (pcMCPYuvPicBuffer0)
{
pMCAnchor = pcMCPYuvPicBuffer0->getMbCbAddr();
}
else
{
pMCAnchor = pcMCPYuvPicBuffer1->getMbCbAddr();
}
pDesAnchor = getMbCbAddr();
for( y = 0; y < uiHeight; y++ )
{
XPel* pSrc = pSrcAnchor + y * iSrcStride;
XPel* pMC = pMCAnchor + y * iMCStride;
XPel* pDes = pDesAnchor + y * iDesStride;
for( x = 0; x < uiWidth; x++ )
{
pDes[x] = gClip( pSrc[x] - ( ( pMC[x] + 1 ) >> 2 ) );
}
}
//===== chrominance V =====
pSrcAnchor = pcSrcYuvPicBuffer ->getMbCrAddr();
if (pcMCPYuvPicBuffer0)
{
pMCAnchor = pcMCPYuvPicBuffer0->getMbCbAddr();
}
else
{
pMCAnchor = pcMCPYuvPicBuffer1->getMbCbAddr();
}
pDesAnchor = getMbCrAddr();
for( y = 0; y < uiHeight; y++ )
{
XPel* pSrc = pSrcAnchor + y * iSrcStride;
XPel* pMC = pMCAnchor + y * iMCStride;
XPel* pDes = pDesAnchor + y * iDesStride;
for( x = 0; x < uiWidth; x++ )
{
pDes[x] = gClip( pSrc[x] - ( ( pMC[x] + 1 ) >> 2 ) );
}
}
}
return Err::m_nOK;
}
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -