📄 yuvmbbuffer.cpp
字号:
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;
Int iDesStride = getLStride();
Int iSrcStride = pcSrcBuffer->getLStride();
XPel* pSrc = pcSrcBuffer->getMbLumAddr();
XPel* pDes = getMbLumAddr();
Int ysize = 16;
Int ysizecr = 8;
Bool bTopIntra = 0 != (uiMask & 0x01000);
Bool bBotIntra = 0 != (uiMask & 0x02000);
if(bTopIntra)
{
pSrc+=8*iSrcStride;
pDes+=8*iDesStride;
ysize=8;
ysizecr=4;
}
else
if (bBotIntra)
{
ysize=8;
ysizecr=4;
}
for( x = 0; x < 18; x++ )
{
pDes[x-iDesStride-1] = pSrc[x-iSrcStride-1];
}
for( y = 0; y < ysize; 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();
if(bTopIntra)
{
pSrc+=4*iSrcStride;
pDes+=4*iDesStride;
}
for( x = 0; x < 10; x++ )
{
pDes[x-iDesStride-1] = pSrc[x-iSrcStride-1];
}
for( y = 0; y < ysizecr; 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();
if(bTopIntra)
{
pSrc+=4*iSrcStride;
pDes+=4*iDesStride;
}
for( x = 0; x < 10; x++ )
{
pDes[x-iDesStride-1] = pSrc[x-iSrcStride-1];
}
for( y = 0; y < ysizecr; 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 bPresent )
{
XPel pPelH[9];
XPel pPelV[9];
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 <= iSize; x++ )
{
pPelH[x] = puc[(x-1)*iAdd - iStride];
}
for( y = 0; y <= iSize; y++ )
{
pPelV[y] = puc[(y-1)*iStride - iAdd];
}
if( ! bPresent )
{
pPelV[0] = pPelH[0] = (pPelH[1] + pPelV[1] + 1)>>1;
}
for( y = 0; y < iSize; y++, puc += iStride )
{
for( xo = 0, x = 0; x < iSize; 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 )
{
xMerge( 1, 1, 8, getYBlk( cIdx ), getLStride(), bCornerMbPresent );
xMerge( 1, 1, 4, getUBlk( cIdx ), getCStride(), bCornerMbPresent );
xMerge( 1, 1, 4, getVBlk( cIdx ), getCStride(), bCornerMbPresent );
}
Void YuvMbBufferExtension::mergeRightBelow ( LumaIdx cIdx, Bool bCornerMbPresent )
{
xMerge( -1, -1, 8, getYBlk( cIdx ), getLStride(), bCornerMbPresent );
xMerge( -1, -1, 4, getUBlk( cIdx ), getCStride(), bCornerMbPresent );
xMerge( -1, -1, 4, getVBlk( cIdx ), getCStride(), bCornerMbPresent );
}
Void YuvMbBufferExtension::mergeFromRightAbove( LumaIdx cIdx, Bool bCornerMbPresent )
{
xMerge( -1, 1, 8, getYBlk( cIdx ), getLStride(), bCornerMbPresent );
xMerge( -1, 1, 4, getUBlk( cIdx ), getCStride(), bCornerMbPresent );
xMerge( -1, 1, 4, getVBlk( cIdx ), getCStride(), bCornerMbPresent );
}
Void YuvMbBufferExtension::mergeLeftBelow ( LumaIdx cIdx, Bool bCornerMbPresent )
{
xMerge( 1, -1, 8, getYBlk( cIdx ), getLStride(), bCornerMbPresent );
xMerge( 1, -1, 4, getUBlk( cIdx ), getCStride(), bCornerMbPresent );
xMerge( 1, -1, 4, getVBlk( cIdx ), getCStride(), bCornerMbPresent );
}
Void YuvMbBufferExtension::copyFromBelow ( LumaIdx cIdx )
{
XPel* pPel = getYBlk( cIdx );
Int iStride = getLStride();
Int y;
pPel += 8*iStride;
for( y = 0; y < 8; y++ )
{
::memcpy( pPel-iStride, pPel, 8 * sizeof(XPel) );
pPel -= iStride;
}
pPel = getUBlk( cIdx );
iStride = getCStride();
pPel += 4*iStride;
for( y = 0; y < 4; y++ )
{
::memcpy( pPel-iStride, pPel, 4 * sizeof(XPel) );
pPel -= iStride;
}
pPel = getVBlk( cIdx );
pPel += 4*iStride;
for( y = 0; y < 4; 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 )
{
XPel* pPel = getYBlk( cIdx );
Int iStride = getLStride();
Int y;
for( y = 0; y < 8; y++ )
{
::memcpy( pPel, pPel-iStride, 8 * sizeof(XPel) );
pPel += iStride;
}
pPel = getUBlk( cIdx );
iStride = getCStride();
for( y = 0; y < 4; y++ )
{
::memcpy( pPel, pPel-iStride, 4 * sizeof(XPel) );
pPel += iStride;
}
pPel = getVBlk( cIdx );
for( y = 0; y < 4; 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 )
{
XPel* pPel = getYBlk( cIdx );
Int iStride = getLStride();
Int x, y;
for( y = 0; y < 8; y++ )
{
for( x = 0; x < 8; x++ )
{
pPel[x] = cY;
}
pPel += iStride;
}
pPel = getUBlk( cIdx );
iStride = getCStride();
for( y = 0; y < 4; y++ )
{
for( x = 0; x < 4; x++ )
{
pPel[x] = cU;
}
pPel += iStride;
}
pPel = getVBlk( cIdx );
for( y = 0; y < 4; y++ )
{
for( x = 0; x < 4; x++ )
{
pPel[x] = cV;
}
pPel += iStride;
}
}
Void YuvMbBufferExtension::copyFromLeftAbove ( LumaIdx cIdx )
{
XPel cY = *(getYBlk( cIdx ) - 1 - getLStride());
XPel cU = *(getUBlk( cIdx ) - 1 - getCStride());
XPel cV = *(getVBlk( cIdx ) - 1 - getCStride());
xFill( cIdx, cY, cU, cV );
}
Void YuvMbBufferExtension::copyFromRightAbove ( LumaIdx cIdx )
{
XPel cY = *(getYBlk( cIdx ) + 8 - getLStride());
XPel cU = *(getUBlk( cIdx ) + 4 - getCStride());
XPel cV = *(getVBlk( cIdx ) + 4 - getCStride());
xFill( cIdx, cY, cU, cV );
}
Void YuvMbBufferExtension::copyFromLeftBelow ( LumaIdx cIdx )
{
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 );
}
Void YuvMbBufferExtension::copyFromRightBelow ( LumaIdx cIdx )
{
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 );
}
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -