intyuvpicbuffer.cpp
来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 1,982 行 · 第 1/4 页
CPP
1,982 行
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 IntYuvPicBuffer::inverseUpdate( IntYuvPicBuffer* pcSrcYuvPicBuffer,
IntYuvPicBuffer* pcMCPYuvPicBuffer0,
IntYuvPicBuffer* 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;
}
//-- JVT-R091
ErrVal IntYuvPicBuffer::smoothMbInside()
{
Int y, x;
Int iStride;
XPel* pDes;
XPel iA;
XPel pTmp[16];
// ------------------------------------------------------------------------
// Luma
// ------------------------------------------------------------------------
iStride = getLStride ();
pDes = getMbLumAddr();
// Step #1: horizontal smoothing process
for( y = 0; y < 16; y++ )
{
for( x = 1; x < 15; x++ )
{
iA = ( pDes[x-1]+pDes[x]*2+pDes[x+1]+2 ) >> 2;
pTmp[x] = iA;
}
for( x = 1; x < 15; x++ ) pDes[x] = pTmp[x];
pDes += iStride;
}
// Step #2: vertical smoothing process
pDes = getMbLumAddr() + iStride;
for( y = 1; y < 15; y++ )
{
for( x = 0; x < 16; x++ )
{
iA = ( pDes[x-iStride]+pDes[x]*2+pDes[x+iStride]+2 ) >> 2;
pTmp[x] = iA;
}
for( x = 0; x < 16; x++ ) pDes[x] = pTmp[x];
pDes += iStride;
}
// ------------------------------------------------------------------------
// Chroma (Cb)
// ------------------------------------------------------------------------
iStride = getCStride ();
pDes = getMbCbAddr ();
// Step #1: horizontal smoothing process
for( y = 0; y < 8; y++ )
{
for( x = 1; x < 7; x++ )
{
iA = ( pDes[x-1]+pDes[x]*2+pDes[x+1]+2 ) >> 2;
pTmp[x] = iA;
}
for( x = 1; x < 7; x++ ) pDes[x] = pTmp[x];
pDes += iStride;
}
// Step #2: vertical smoothing process
pDes = getMbCbAddr() + iStride;
for( y = 1; y < 7; y++ )
{
for( x = 0; x < 8; x++ )
{
iA = ( pDes[x-iStride]+pDes[x]*2+pDes[x+iStride]+2 ) >> 2;
pTmp[x] = iA;
}
for( x = 0; x < 8; x++ ) pDes[x] = pTmp[x];
pDes += iStride;
}
// ------------------------------------------------------------------------
// Chroma (Cr)
// ------------------------------------------------------------------------
iStride = getCStride ();
pDes = getMbCrAddr ();
// Step #1: horizontal smoothing process
for( y = 0; y < 8; y++ )
{
for( x = 1; x < 7; x++ )
{
iA = ( pDes[x-1]+pDes[x]*2+pDes[x+1]+2 ) >> 2;
pTmp[x] = iA;
}
for( x = 1; x < 7; x++ ) pDes[x] = pTmp[x];
pDes += iStride;
}
// Step #2: vertical smoothing process
pDes = getMbCrAddr() + iStride;
for( y = 1; y < 7; y++ )
{
for( x = 0; x < 8; x++ )
{
iA = ( pDes[x-iStride]+pDes[x]*2+pDes[x+iStride]+2 ) >> 2;
pTmp[x] = iA;
}
for( x = 0; x < 8; x++ ) pDes[x] = pTmp[x];
pDes += iStride;
}
return Err::m_nOK;
}
ErrVal IntYuvPicBuffer::smoothMbTop ()
{
Int x;
Int iStride;
XPel* pDes;
XPel iA;
XPel pTmp[16];
// disable smoothing across MB boundary due to FMO
return Err::m_nOK;
// ------------------------------------------------------------------------
// Luma
// ------------------------------------------------------------------------
iStride = getLStride ();
pDes = getMbLumAddr();
for( x = 0; x < 16; x++ )
{
iA = ( pDes[x-iStride]+pDes[x+iStride]*2+pDes[x+iStride]+2 ) >> 2;
pTmp[x] = iA;
}
for( x = 0; x < 16; x++ ) pDes[x] = pTmp[x];
// ------------------------------------------------------------------------
// Chroma (Cb)
// ------------------------------------------------------------------------
iStride = getCStride ();
pDes = getMbCbAddr();
for( x = 0; x < 8; x++ )
{
iA = ( pDes[x-iStride]+pDes[x+iStride]*2+pDes[x+iStride]+2 ) >> 2;
pTmp[x] = iA;
}
for( x = 0; x < 8; x++ ) pDes[x] = pTmp[x];
// ------------------------------------------------------------------------
// Chroma (Cr)
// ------------------------------------------------------------------------
iStride = getCStride ();
pDes = getMbCrAddr();
for( x = 0; x < 8; x++ )
{
iA = ( pDes[x-iStride]+pDes[x+iStride]*2+pDes[x+iStride]+2 ) >> 2;
pTmp[x] = iA;
}
for( x = 0; x < 8; x++ ) pDes[x] = pTmp[x];
return Err::m_nOK;
}
ErrVal IntYuvPicBuffer::smoothMbLeft ()
{
Int y;
Int iStride;
XPel* pDes;
XPel iA;
XPel pTmp[16];
// disable smoothing across MB boundary due to FMO
return Err::m_nOK;
// ------------------------------------------------------------------------
// Luma
// ------------------------------------------------------------------------
iStride = getLStride();
pDes = getMbLumAddr();
for( y = 0; y < 16; y++ )
{
iA = ( pDes[-1]+pDes[0]*2+pDes[1]+2 ) >> 2;
pTmp[y] = iA;
pDes += iStride;
}
pDes = getMbLumAddr();
for( y = 0; y < 16; y++ )
{
pDes[0] = pTmp[y];
pDes += iStride;
}
// ------------------------------------------------------------------------
// Chroma (Cb)
// ------------------------------------------------------------------------
iStride = getCStride();
pDes = getMbCbAddr();
for( y = 0; y < 8; y++ )
{
iA = ( pDes[-1]+pDes[0]*2+pDes[1]+2 ) >> 2;
pTmp[y] = iA;
pDes += iStride;
}
pDes = getMbCbAddr();
for( y = 0; y < 8; y++ )
{
pDes[0] = pTmp[y];
pDes += iStride;
}
// ------------------------------------------------------------------------
// Chroma (Cr)
// ------------------------------------------------------------------------
iStride = getCStride();
pDes = getMbCrAddr();
for( y = 0; y < 8; y++ )
{
iA = ( pDes[-1]+pDes[0]*2+pDes[1]+2 ) >> 2;
pTmp[y] = iA;
pDes += iStride;
}
pDes = getMbCrAddr();
for( y = 0; y < 8; y++ )
{
pDes[0] = pTmp[y];
pDes += iStride;
}
return Err::m_nOK;
}
//--
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?