📄 mbdecoder.cpp
字号:
RNOK( rcMbDataAccess.getMbMotionData( LIST_1 ).setRefPicIdcs( rcMbDataAccess.getSH().getRefFrameList( rcMbDataAccess.getMbPicType(), LIST_1 ) ) );
return Err::m_nOK;
}
ErrVal
MbDecoder::calcMv( MbDataAccess& rcMbDataAccess,
MbDataAccess* pcMbDataAccessBaseMotion )
{
if( rcMbDataAccess.getMbData().getBLSkipFlag() )
{
return Err::m_nOK;
}
if( rcMbDataAccess.getMbData().getMbMode() == INTRA_4X4 )
{
//----- intra prediction -----
rcMbDataAccess.getMbMotionData( LIST_0 ).setRefIdx( BLOCK_NOT_PREDICTED );
rcMbDataAccess.getMbMotionData( LIST_0 ).setAllMv ( Mv::ZeroMv() );
rcMbDataAccess.getMbMotionData( LIST_1 ).setRefIdx( BLOCK_NOT_PREDICTED );
rcMbDataAccess.getMbMotionData( LIST_1 ).setAllMv ( Mv::ZeroMv() );
}
else
{
if( rcMbDataAccess.getMbData().getMbMode() == MODE_8x8 || rcMbDataAccess.getMbData().getMbMode() == MODE_8x8ref0 )
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
//----- motion compensated prediction -----
RNOK( m_pcMotionCompensation->calcMvSubMb( c8x8Idx, rcMbDataAccess, pcMbDataAccessBaseMotion ) );
}
}
else
{
//----- motion compensated prediction -----
RNOK( m_pcMotionCompensation->calcMvMb( rcMbDataAccess, pcMbDataAccessBaseMotion ) );
}
}
return Err::m_nOK;
}
ErrVal
MbDecoder::xDecodeMbPCM( MbDataAccess& rcMbDataAccess, YuvPicBuffer *pcRecYuvBuffer )
{
Pel* pucSrc = rcMbDataAccess.getMbTCoeffs().getPelBuffer();
XPel* pucDest = pcRecYuvBuffer->getMbLumAddr();
Int iStride = pcRecYuvBuffer->getLStride();
Int iDelta = 1;
Int n, m, n1, m1, dest;
for( n = 0; n < 16; n+=iDelta )
{
for( m = 0; m < 16; m+=iDelta )
{
dest = *pucSrc++;
for( n1=0; n1< +iDelta; n1++ )
for( m1=m; m1<m+iDelta; m1++ )
{
pucDest[m1+n1*iStride] = dest;
}
}
pucDest += iDelta*iStride;
}
pucDest = pcRecYuvBuffer->getMbCbAddr();
iStride = pcRecYuvBuffer->getCStride();
for( n = 0; n < 8; n+=iDelta )
{
for( m = 0; m < 8; m+=iDelta )
{
dest = *pucSrc++;
for( n1=0; n1< +iDelta; n1++ )
for( m1=m; m1<m+iDelta; m1++ )
{
pucDest[m1+n1*iStride] = dest;
}
}
pucDest += iDelta*iStride;
}
pucDest = pcRecYuvBuffer->getMbCrAddr();
for( n = 0; n < 8; n+=iDelta )
{
for( m = 0; m < 8; m+=iDelta )
{
dest = *pucSrc++;
for( n1=0; n1< +iDelta; n1++ )
for( m1=m; m1<m+iDelta; m1++ )
{
pucDest[m1+n1*iStride] = dest;
}
}
pucDest += iDelta*iStride;
}
return Err::m_nOK;
}
ErrVal
MbDecoder::xDecodeMbInter( MbDataAccess& rcMbDataAccess,
MbDataAccess* pcMbDataAccessBase,
YuvMbBuffer& rcPredBuffer,
YuvPicBuffer* pcRecYuvBuffer,
Frame* pcResidual,
Frame* pcBaseResidual,
RefFrameList& rcRefFrameList0,
RefFrameList& rcRefFrameList1,
Bool bReconstruct,
Frame* pcBaseLayerRec )
{
YuvMbBuffer cYuvMbBuffer; cYuvMbBuffer .setAllSamplesToZero();
YuvMbBuffer cYuvMbBufferResidual; cYuvMbBufferResidual.setAllSamplesToZero();
MbTransformCoeffs& rcCoeffs = m_cTCoeffs;
Bool bCalcMv = false;
Bool bFaultTolerant = true;
//===== derive motion vectors =====
calcMv( rcMbDataAccess, pcMbDataAccessBase );
#ifdef SHARP_AVC_REWRITE_OUTPUT
return Err::m_nOK;
#endif
//===== 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 ) );
}
if(pcBaseLayerRec)
{
RNOK(m_pcMotionCompensation->compensateMbBLSkipIntra(rcMbDataAccess, &cYuvMbBuffer, pcBaseLayerRec));
}
rcPredBuffer.loadLuma ( cYuvMbBuffer );
rcPredBuffer.loadChroma ( cYuvMbBuffer );
}
//===== add base layer residual =====
if( rcMbDataAccess.isSCoeffPred() )
{
rcCoeffs.add( &pcMbDataAccessBase->getMbData().getMbTCoeffs() );
rcMbDataAccess.getMbTCoeffs().copyFrom(rcCoeffs); // store the sum of the coefficients and base layer coefficients
}
else if( rcMbDataAccess.isTCoeffPred() )
{
pcMbDataAccessBase->getMbData().getMbTCoeffs().clearLumaLevels();
}
//===== reconstruct residual signal by using transform coefficients ======
m_pcTransform->setClipMode( false );
if( rcMbDataAccess.getMbData().isTransformSize8x8() )
{
for( B8x8Idx cIdx; cIdx.isLegal(); cIdx++ )
{
RNOK( m_pcTransform->invTransform8x8Blk( cYuvMbBufferResidual.getYBlk( cIdx ),
cYuvMbBufferResidual.getLStride(),
rcCoeffs.get8x8(cIdx) ) );
}
}
else
{
for( B4x4Idx cIdx; cIdx.isLegal(); 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 =====
YuvMbBuffer cBaseLayerResidual;
if( rcMbDataAccess.getMbData().getResidualPredFlag() )
{
if( rcMbDataAccess.isSCoeffPred() )
{
rcMbDataAccess.getMbDataAccessBase()->getMbTCoeffs().copyPredictionTo( cBaseLayerResidual );
}
else
{
cBaseLayerResidual.loadBuffer( pcBaseResidual->getFullPelYuvBuffer() );
}
}
else
{
cBaseLayerResidual.setAllSamplesToZero();
}
cYuvMbBufferResidual.add( cBaseLayerResidual );
//===== store spatially predicted residual =====
rcMbDataAccess.getMbTCoeffs().copyPredictionFrom( cBaseLayerResidual );
//===== 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;
}
ErrVal
MbDecoder::xDecodeMbIntra4x4( MbDataAccess& rcMbDataAccess,
YuvMbBuffer& cYuvMbBuffer,
YuvMbBuffer& rcPredBuffer )
{
#ifndef SHARP_AVC_REWRITE_OUTPUT //JV: not clean at all -> to remove compilation warnings
Int iStride = cYuvMbBuffer.getLStride();
MbTransformCoeffs& rcCoeffs = m_cTCoeffs;
#endif //JV: not clean at all -> to remove compilation warnings
for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
{
if( !rcMbDataAccess.getMbData().getBLSkipFlag() || !rcMbDataAccess.getSH().getTCoeffLevelPredictionFlag() )
rcMbDataAccess.getMbData().intraPredMode( cIdx ) = rcMbDataAccess.decodeIntraPredMode( cIdx );
#ifndef SHARP_AVC_REWRITE_OUTPUT
XPel* puc = cYuvMbBuffer.getYBlk( cIdx );
UInt uiPredMode = rcMbDataAccess.getMbData().intraPredMode( cIdx );
RNOK( m_pcIntraPrediction->predictLumaBlock( puc, iStride, uiPredMode, cIdx ) );
rcPredBuffer.loadLuma( cYuvMbBuffer, cIdx );
if( rcMbDataAccess.getMbData().is4x4BlkCoded( cIdx ) )
{
RNOK( m_pcTransform->invTransform4x4Blk( puc, iStride, rcCoeffs.get( cIdx ) ) );
}
#endif
}
UInt uiChromaCbp = rcMbDataAccess.getMbData().getCbpChroma4x4();
RNOK( xDecodeChroma( rcMbDataAccess, cYuvMbBuffer, rcPredBuffer, uiChromaCbp, true ) );
return Err::m_nOK;
}
ErrVal
MbDecoder::xDecodeMbIntra8x8( MbDataAccess& rcMbDataAccess,
YuvMbBuffer& cYuvMbBuffer,
YuvMbBuffer& rcPredBuffer )
{
#ifndef SHARP_AVC_REWRITE_OUTPUT //JV : Not clean at all -> to remove compilation warnings
Int iStride = cYuvMbBuffer.getLStride();
MbTransformCoeffs& rcCoeffs = m_cTCoeffs;
#endif //JV : Not clean at all
for( B8x8Idx cIdx; cIdx.isLegal(); cIdx++ )
{
if( !rcMbDataAccess.getMbData().getBLSkipFlag() || !rcMbDataAccess.getSH().getTCoeffLevelPredictionFlag() )
{
Int iPredMode = rcMbDataAccess.decodeIntraPredMode( cIdx );
for( S4x4Idx cIdx4x4( cIdx ); cIdx4x4.isLegal( cIdx ); cIdx4x4++ )
{
rcMbDataAccess.getMbData().intraPredMode( cIdx4x4 ) = iPredMode;
}
}
#ifndef SHARP_AVC_REWRITE_OUTPUT
XPel* puc = cYuvMbBuffer.getYBlk( cIdx );
const UInt uiPredMode = rcMbDataAccess.getMbData().intraPredMode( cIdx );
RNOK( m_pcIntraPrediction->predictLuma8x8Block( puc, iStride, uiPredMode, cIdx ) );
rcPredBuffer.loadLuma( cYuvMbBuffer, cIdx );
if( rcMbDataAccess.getMbData().is4x4BlkCoded( cIdx ) )
{
RNOK( m_pcTransform->invTransform8x8Blk( puc, iStride, rcCoeffs.get8x8( cIdx ) ) );
}
#endif
}
UInt uiChromaCbp = rcMbDataAccess.getMbData().getCbpChroma4x4();
RNOK( xDecodeChroma( rcMbDataAccess, cYuvMbBuffer, rcPredBuffer, uiChromaCbp, true ) );
return Err::m_nOK;
}
ErrVal
MbDecoder::xDecodeMbIntraBL( MbDataAccess& rcMbDataAccess,
YuvPicBuffer* pcRecYuvBuffer,
YuvMbBuffer& rcPredBuffer,
YuvPicBuffer* pcBaseYuvBuffer )
{
#ifdef SHARP_AVC_REWRITE_OUTPUT
return Err::m_nOK;
#endif
YuvMbBuffer cYuvMbBuffer;
MbTransformCoeffs& rcCoeffs = m_cTCoeffs;
Bool bAddBaseCoeffs = false;
if( rcMbDataAccess.getSH().getSCoeffResidualPredFlag() )
{
rcMbDataAccess.getMbDataAccessBase()->getMbTCoeffs().copyPredictionTo( cYuvMbBuffer );
bAddBaseCoeffs = rcMbDataAccess.getMbDataAccessBase()->getMbData().isIntraBL();
if( bAddBaseCoeffs )
{
rcCoeffs.add( &rcMbDataAccess.getMbDataAccessBase()->getMbTCoeffs(), true, false );
}
}
else
{
cYuvMbBuffer.loadBuffer ( pcBaseYuvBuffer );
}
rcPredBuffer.loadLuma ( cYuvMbBuffer );
rcPredBuffer.loadChroma ( cYuvMbBuffer );
if( rcMbDataAccess.getMbData().isTransformSize8x8() )
{
for( B8x8Idx cIdx; cIdx.isLegal(); cIdx++ )
{
RNOK( m_pcTransform->invTransform8x8Blk( cYuvMbBuffer.getYBlk( cIdx ),
cYuvMbBuffer.getLStride(),
rcCoeffs.get8x8(cIdx) ) );
}
}
else
{
for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -