📄 mbdecoder.cpp
字号:
YuvPicBuffer *pcRecYuvBuffer;
RNOK( m_pcFrameMng->getRecYuvBuffer( pcRecYuvBuffer ) );
IntYuvMbBuffer cPredIntYuvMbBuffer;
IntYuvMbBuffer cResIntYuvMbBuffer;
YuvMbBuffer cYuvMbBuffer;
#if JMVM_ONLY // JVT-W081
if ( rcMbDataAccess.getMbDataCurr().getMotionSkipFlag() && !rcMbDataAccess.getSH().getAVCFlag() )
{
RNOK( xCopyNeighborMotion( rcMbDataAccess, disparityL0, disparityL1 ) );
RNOK( xDecodeMbMotionSkip( rcMbDataAccess, cYuvMbBuffer, cPredIntYuvMbBuffer, cResIntYuvMbBuffer, bReconstructAll ) );
}
else
{
#endif // JVT-W081
if( rcMbDataAccess.getMbData().isPCM() )
{
RNOK( xDecodeMbPCM( rcMbDataAccess, cYuvMbBuffer ) );
cResIntYuvMbBuffer .setAllSamplesToZero();
cPredIntYuvMbBuffer.loadBuffer( &cYuvMbBuffer );
}
else
{
if( rcMbDataAccess.getMbData().isIntra() )
{
m_pcIntraPrediction->setAvailableMaskMb( rcMbDataAccess.getAvailableMask() );
cResIntYuvMbBuffer.loadIntraPredictors( pcRecYuvBuffer );
if( rcMbDataAccess.getMbData().isIntra4x4() )
{
if( rcMbDataAccess.getMbData().isTransformSize8x8() )
{
RNOK( xDecodeMbIntra8x8( rcMbDataAccess, cResIntYuvMbBuffer, cPredIntYuvMbBuffer ) );
}
else
{
RNOK( xDecodeMbIntra4x4( rcMbDataAccess, cResIntYuvMbBuffer, cPredIntYuvMbBuffer ) );
}
}
else
{
RNOK( xDecodeMbIntra16x16( rcMbDataAccess, cResIntYuvMbBuffer, cPredIntYuvMbBuffer ) );
}
cYuvMbBuffer.loadBuffer( &cResIntYuvMbBuffer );
}
else
{
RNOK( xDecodeMbInter( rcMbDataAccess, cYuvMbBuffer, cPredIntYuvMbBuffer, cResIntYuvMbBuffer, bReconstructAll ) );
}
}
#if JMVM_ONLY // JVT-W081
}
#endif // JVT-W081
pcRecYuvBuffer->loadBuffer( &cYuvMbBuffer );
// RNOK( m_pcFrameMng->getCurrentFrameUnit()->getResidual()->getFullPelYuvBuffer()->loadBuffer( &cResIntYuvMbBuffer ) );
// RNOK( m_pcFrameMng->getCurrentFrameUnit()->getFGSIntFrame()->getFullPelYuvBuffer()->loadBuffer( &cPredIntYuvMbBuffer ) );
return Err::m_nOK;
}
ErrVal MbDecoder::xDecodeMbPCM( MbDataAccess& rcMbDataAccess, YuvMbBuffer& rcRecYuvBuffer )
{
Pel* pucSrc = rcMbDataAccess.getMbTCoeffs().getPelBuffer();
Pel* pucDest = rcRecYuvBuffer.getMbLumAddr();
Int iStride = rcRecYuvBuffer.getLStride();
Int n;
for( n = 0; n < 16; n++ )
{
::memcpy( pucDest, pucSrc, 16 );
pucSrc += 16;
pucDest += iStride;
}
pucDest = rcRecYuvBuffer.getMbCbAddr();
iStride = rcRecYuvBuffer.getCStride();
for( n = 0; n < 8; n++ )
{
::memcpy( pucDest, pucSrc, 8 );
pucSrc += 8;
pucDest += iStride;
}
pucDest = rcRecYuvBuffer.getMbCrAddr();
for( n = 0; n < 8; n++ )
{
::memcpy( pucDest, pucSrc, 8 );
pucSrc += 8;
pucDest += iStride;
}
return Err::m_nOK;
}
ErrVal MbDecoder::xDecodeMbPCM( MbDataAccess& rcMbDataAccess, IntYuvPicBuffer *pcRecYuvBuffer )
{
Pel* pucSrc = rcMbDataAccess.getMbTCoeffs().getPelBuffer();
XPel* pucDest = pcRecYuvBuffer->getMbLumAddr();
Int iStride = pcRecYuvBuffer->getLStride();
UInt uiDelta = 1;
Int n, m, n1, m1, dest;
for( n = 0; n < 16; n+=uiDelta )
{
for( m = 0; m < 16; m+=uiDelta )
{
dest = *pucSrc++;
for( n1=0; n1< +(Int)uiDelta; n1++ )
for( m1=m; m1<m+(Int)uiDelta; m1++ )
{
pucDest[m1+n1*iStride] = dest;
}
}
pucDest += uiDelta*iStride;
}
pucDest = pcRecYuvBuffer->getMbCbAddr();
iStride = pcRecYuvBuffer->getCStride();
for( n = 0; n < 8; n+=uiDelta )
{
for( m = 0; m < 8; m+=uiDelta )
{
dest = *pucSrc++;
for( n1=0; n1< +(Int)uiDelta; n1++ )
for( m1=m; m1<m+(Int)uiDelta; m1++ )
{
pucDest[m1+n1*iStride] = dest;
}
}
pucDest += uiDelta*iStride;
}
pucDest = pcRecYuvBuffer->getMbCrAddr();
for( n = 0; n < 8; n+=uiDelta )
{
for( m = 0; m < 8; m+=uiDelta )
{
dest = *pucSrc++;
for( n1=0; n1< +(Int)uiDelta; n1++ )
for( m1=m; m1<m+(Int)uiDelta; m1++ )
{
pucDest[m1+n1*iStride] = dest;
}
}
pucDest += uiDelta*iStride;
}
return Err::m_nOK;
}
ErrVal MbDecoder::xDecodeMbInter( MbDataAccess& rcMbDataAccess,
YuvMbBuffer& rcRecYuvBuffer,
IntYuvMbBuffer& rcPredIntYuvMbBuffer,
IntYuvMbBuffer& rcResIntYuvMbBuffer,
Bool bReconstruct )
{
rcResIntYuvMbBuffer.setAllSamplesToZero();
if( ! bReconstruct )
{
RNOK( m_pcMotionCompensation->calculateMb ( rcMbDataAccess, true ) );
rcRecYuvBuffer.setZero();
}
else
{
RNOK( m_pcMotionCompensation->compensateMb( rcMbDataAccess, &rcRecYuvBuffer, true ) );
}
rcPredIntYuvMbBuffer.loadBuffer( &rcRecYuvBuffer );
MbTransformCoeffs& rcCoeffs = m_cTCoeffs;
m_pcTransform->setClipMode( false );
if( rcMbDataAccess.getMbData().isTransformSize8x8() )
{
for( B8x8Idx cIdx8x8; cIdx8x8.isLegal(); cIdx8x8++ )
{
if( rcMbDataAccess.getMbData().is4x4BlkCoded( cIdx8x8 ) )
{
RNOK( m_pcTransform->invTransform8x8Blk( rcResIntYuvMbBuffer.getYBlk( cIdx8x8 ),
rcResIntYuvMbBuffer.getLStride(),
rcCoeffs.get8x8(cIdx8x8) ) );
}
}
}
else
{
for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
{
if( rcMbDataAccess.getMbData().is4x4BlkCoded( cIdx ) )
{
RNOK( m_pcTransform->invTransform4x4Blk( rcResIntYuvMbBuffer.getYBlk( cIdx ),
rcResIntYuvMbBuffer.getLStride(),
rcCoeffs.get(cIdx) ) );
}
}
}
UInt uiChromaCbp = rcMbDataAccess.getMbData().getCbpChroma4x4();
IntYuvMbBuffer cPredBuffer;
RNOK( xDecodeChroma( rcMbDataAccess, rcResIntYuvMbBuffer, cPredBuffer, uiChromaCbp, false ) );
m_pcTransform->setClipMode( true );
IntYuvMbBuffer cIntYuvMbBuffer;
cIntYuvMbBuffer. loadLuma ( rcPredIntYuvMbBuffer );
cIntYuvMbBuffer. loadChroma ( rcPredIntYuvMbBuffer );
cIntYuvMbBuffer. add ( rcResIntYuvMbBuffer );
rcRecYuvBuffer. loadBufferClip( &cIntYuvMbBuffer );
return Err::m_nOK;
}
ErrVal MbDecoder::xDecodeMbInter( MbDataAccess& rcMbDataAccess,
MbDataAccess* pcMbDataAccessBase,
IntYuvMbBuffer& rcPredBuffer,
IntYuvPicBuffer* pcRecYuvBuffer,
IntFrame* pcResidual,
IntFrame* pcBaseResidual,
RefFrameList& rcRefFrameList0,
RefFrameList& rcRefFrameList1,
Bool bReconstruct )
{
IntYuvMbBuffer cYuvMbBuffer; cYuvMbBuffer .setAllSamplesToZero();
IntYuvMbBuffer cYuvMbBufferResidual; cYuvMbBufferResidual.setAllSamplesToZero();
MbTransformCoeffs& rcCoeffs = m_cTCoeffs;
Bool bCalcMv = false;
Bool bFaultTolerant = true;
//===== derive motion vectors =====
calcMv( rcMbDataAccess, pcMbDataAccessBase );
//===== get prediction signal when full reconstruction is requested =====
if( bReconstruct )
{
if( rcMbDataAccess.getMbData().getMbMode() == MODE_8x8 || rcMbDataAccess.getMbData().getMbMode() == MODE_8x8ref0 )
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
//----- motion compensated prediction -----
RNOK( m_pcMotionCompensation->compensateSubMb ( c8x8Idx,
rcMbDataAccess, rcRefFrameList0, rcRefFrameList1,
&cYuvMbBuffer, bCalcMv, bFaultTolerant ) );
}
}
else
{
//----- motion compensated prediction -----
RNOK( m_pcMotionCompensation->compensateMb ( rcMbDataAccess,
rcRefFrameList0,
rcRefFrameList1,
&cYuvMbBuffer,
bCalcMv ) );
}
rcPredBuffer.loadLuma ( cYuvMbBuffer );
rcPredBuffer.loadChroma ( cYuvMbBuffer );
}
//===== reconstruct residual signal by using transform coefficients ======
m_pcTransform->setClipMode( false );
if( rcMbDataAccess.getMbData().isTransformSize8x8() )
{
for( B8x8Idx cIdx; cIdx.isLegal(); cIdx++ )
{
if( rcMbDataAccess.getMbData().is4x4BlkCoded( cIdx ) )
{
RNOK( m_pcTransform->invTransform8x8Blk( cYuvMbBufferResidual.getYBlk( cIdx ),
cYuvMbBufferResidual.getLStride(),
rcCoeffs.get8x8(cIdx) ) );
}
}
}
else
{
for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
{
if( rcMbDataAccess.getMbData().is4x4BlkCoded( cIdx ) )
{
RNOK( m_pcTransform->invTransform4x4Blk( cYuvMbBufferResidual.getYBlk( cIdx ),
cYuvMbBufferResidual.getLStride(),
rcCoeffs.get(cIdx) ) );
}
}
}
UInt uiChromaCbp = rcMbDataAccess.getMbData().getCbpChroma4x4();
RNOK( xDecodeChroma( rcMbDataAccess, cYuvMbBufferResidual, rcPredBuffer, uiChromaCbp, false ) );
m_pcTransform->setClipMode( true );
//===== add base layer residual =====
if( rcMbDataAccess.getMbData().getResidualPredFlag( PART_16x16 ) )
{
IntYuvMbBuffer cBaseLayerBuffer;
cBaseLayerBuffer.loadBuffer( pcBaseResidual->getFullPelYuvBuffer() );
//-- JVT-R091
if ( bReconstruct && rcMbDataAccess.getMbData().getSmoothedRefFlag() )
{
IntYuvMbBuffer cMbBuffer;
// obtain P
cMbBuffer.loadLuma ( cYuvMbBuffer );
cMbBuffer.loadChroma( cYuvMbBuffer );
// P+Rb
cMbBuffer.add( cBaseLayerBuffer );
// S(P+Rb)
pcRecYuvBuffer->loadBuffer( &cMbBuffer );
pcRecYuvBuffer->smoothMbInside();
if ( rcMbDataAccess.isAboveMbExisting() )
{
pcRecYuvBuffer->smoothMbTop();
}
if ( rcMbDataAccess.isLeftMbExisting() )
{
pcRecYuvBuffer->smoothMbLeft();
}
// store new prediction
cYuvMbBuffer.loadBuffer ( pcRecYuvBuffer );
cYuvMbBuffer.subtract ( cBaseLayerBuffer );
// update rcPredBuffer
rcPredBuffer.loadLuma ( cYuvMbBuffer );
rcPredBuffer.loadChroma ( cYuvMbBuffer );
}
//--
cYuvMbBufferResidual.add( cBaseLayerBuffer );
//--- set CBP ---
rcMbDataAccess.getMbData().setMbExtCbp( rcMbDataAccess.getMbData().getMbExtCbp() | pcMbDataAccessBase->getMbData().getMbExtCbp() );
}
//===== reconstruct signal =====
if( bReconstruct )
{
cYuvMbBuffer.add( cYuvMbBufferResidual );
cYuvMbBuffer.clip();
}
//===== store reconstructed residual =====
if( pcResidual )
{
RNOK( pcResidual->getFullPelYuvBuffer()->loadBuffer( &cYuvMbBufferResidual ) );
}
//===== store reconstructed signal =====
if( pcRecYuvBuffer )
{
RNOK( pcRecYuvBuffer->loadBuffer( &cYuvMbBuffer ) );
}
return Err::m_nOK;
}
#if JMVM_ONLY // JVT-W081
ErrVal MbDecoder::xDecodeMbMotionSkip( MbDataAccess& rcMbDataAccess,
YuvMbBuffer& rcRecYuvBuffer,
IntYuvMbBuffer& rcPredIntYuvMbBuffer,
IntYuvMbBuffer& rcResIntYuvMbBuffer,
Bool bReconstruct )
{
rcResIntYuvMbBuffer.setAllSamplesToZero();
if( ! bReconstruct )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -