ErrVal SliceEncoder::updateBaseLayerResidual( ControlData& rcControlData, UInt uiMbInRow ) { ROF( m_bInitDone ); SliceHeader& rcSliceHeader = *rcControlData.getSliceHeader (); MbDataCtrl* pcMbDataCtrl = rcControlData.getMbDataCtrl (); MbDataCtrl* pcBaseLayerCtrl = rcControlData.getBaseLayerCtrl (); Frame* pcBaseLayerSbb = rcControlData.getBaseLayerSbb (); UInt uiMbAddress = 0; UInt uiLastMbAddress = rcSliceHeader.getMbInPic() - 1; //====== initialization ====== RNOK( pcMbDataCtrl->initSlice( rcSliceHeader, DECODE_PROCESS, false, NULL ) ); for( ; uiMbAddress <= uiLastMbAddress; ) { UInt uiMbY = uiMbAddress / uiMbInRow; UInt uiMbX = uiMbAddress % uiMbInRow; MbDataAccess* pcMbDataAccess = 0; MbDataAccess* pcMbDataAccessBase = 0; RNOK( pcMbDataCtrl ->initMb ( pcMbDataAccess, uiMbY, uiMbX ) ); if( pcBaseLayerCtrl ) { RNOK( pcBaseLayerCtrl ->initMb ( pcMbDataAccessBase, uiMbY, uiMbX ) ); //pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase ); } // Update the state of the baselayer residual data -- it may be reused in subsequent layers - [email protected] if( !pcMbDataAccess->getMbData().getResidualPredFlag() ) { if( pcBaseLayerSbb && ( pcMbDataAccess->getMbData().isIntra() || ! pcMbDataAccess->getMbData().getResidualPredFlag() ) ) { YuvPicBuffer* pcBaseResidual = pcBaseLayerSbb->getFullPelYuvBuffer(); pcBaseResidual->getBufferCtrl().initMb( uiMbY, uiMbX, false); pcBaseResidual->clearCurrMb(); } } uiMbAddress++; } return Err::m_nOK; }
ErrVal MbDecoder::process( MbDataAccess& rcMbDataAccess, Bool bReconstructAll ) { ROF( m_bInitDone ); RNOK( xScaleTCoeffs( rcMbDataAccess ) ); YuvPicBuffer *pcRecYuvBuffer; RNOK( m_pcFrameMng->getRecYuvBuffer( pcRecYuvBuffer ) ); IntYuvMbBuffer cPredIntYuvMbBuffer; IntYuvMbBuffer cResIntYuvMbBuffer; YuvMbBuffer cYuvMbBuffer; 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 ) ); } } pcRecYuvBuffer->loadBuffer( &cYuvMbBuffer ); { B4x4Idx cdx; XPel* puc = cResIntYuvMbBuffer.getYBlk(cdx); for (int i = 0; i < 16; ++i) { for (int j = 0; j < 16; ++j) { printf("%4d", puc[i*24+j]); } printf("\n"); } printf("\n"); } return Err::m_nOK; }
ErrVal ReconstructionBypass::padRecFrame( Frame* pcFrame, const MbDataCtrl* pcMbDataCtrl, ResizeParameters* pcResizeParameters, UInt uiSliceId /* = MSYS_UINT_MAX */ ) { ROF( pcFrame ); ROF( pcMbDataCtrl ); ROF( pcResizeParameters ); RNOK( pcFrame->addFrameFieldBuffer() ); UInt uiFrmWidth = pcResizeParameters->m_iRefLayerFrmWidth >> 4; UInt uiFrmHeight = pcResizeParameters->m_iRefLayerFrmHeight >> ( pcResizeParameters->m_bRefLayerFieldPicFlag ? 5 : 4 ); Bool bMbAffFrame = ( ! pcResizeParameters->m_bRefLayerFrameMbsOnlyFlag && ! pcResizeParameters->m_bRefLayerFieldPicFlag ); PicType ePicType = ( pcResizeParameters->m_bRefLayerFieldPicFlag ? ( pcResizeParameters->m_bRefLayerBotFieldFlag ? BOT_FIELD : TOP_FIELD ) : FRAME ); UInt auiOutMask[9]; for( UInt uiMbY = 0; uiMbY < uiFrmHeight; uiMbY++ ) for( UInt uiMbX = 0; uiMbX < uiFrmWidth; uiMbX++ ) { UInt uiMask = 0; Bool bIntra = false; RNOK( pcFrame->getFullPelYuvBuffer()->getYuvBufferCtrl().initMb( uiMbY, uiMbX, bMbAffFrame ) ); if( ! bMbAffFrame ) { RNOK( pcMbDataCtrl->getBoundaryMask( uiMbY, uiMbX, bIntra, uiMask, uiSliceId ) ); if ( ! bIntra ) { YuvMbBufferExtension cBuffer; YuvPicBuffer* pcPicBuffer = pcFrame->getPic( ePicType )->getFullPelYuvBuffer(); cBuffer.setAllSamplesToZero (); if( uiMask ) { cBuffer.loadSurrounding ( pcPicBuffer ); RNOK( xPadRecMb ( &cBuffer, uiMask ) ); } pcPicBuffer->loadBuffer ( &cBuffer ); } } else { RNOK( pcMbDataCtrl->getBoundaryMask_MbAff( uiMbY, uiMbX, bIntra, uiMask, uiSliceId ) ); if ( ! bIntra ) { YuvMbBufferExtension cBuffer; PicType eMbPicType = ( uiMbY % 2 ? BOT_FIELD : TOP_FIELD ); YuvPicBuffer* pcPicBuffer = pcFrame->getPic( eMbPicType )->getFullPelYuvBuffer(); cBuffer.setAllSamplesToZero (); if( uiMask ) { cBuffer.loadSurrounding_MbAff ( pcPicBuffer, uiMask ); RNOK( xPadRecMb_MbAff ( &cBuffer, uiMask ) ); } pcPicBuffer->loadBuffer_MbAff ( &cBuffer, uiMask ); } } if( xRequiresOutsidePadding( uiMbX, uiMbY, uiFrmWidth, uiFrmHeight, bMbAffFrame, uiMask, auiOutMask ) ) { for( UInt uiDir = 0; uiDir < 9; uiDir++ ) { if( auiOutMask[uiDir] != MSYS_UINT_MAX ) { ROT( uiDir == 4 ); PicType eMbPicType = ( bMbAffFrame ? ( uiMbY % 2 ? BOT_FIELD : TOP_FIELD ) : ePicType ); YuvPicBuffer* pcPicBuffer = pcFrame->getPic( eMbPicType )->getFullPelYuvBuffer(); YuvMbBufferExtension cBuffer; cBuffer.setAllSamplesToZero(); if( !bMbAffFrame ) { if( auiOutMask[uiDir] ) { cBuffer.loadSurrounding( pcPicBuffer, g_D2XD[uiDir], g_D2YD[uiDir] ); RNOK( xPadRecMb ( &cBuffer, auiOutMask[uiDir] ) ); } pcPicBuffer->loadBuffer ( &cBuffer, g_D2XD[uiDir], g_D2YD[uiDir] ); } else { if( auiOutMask[uiDir] ) { cBuffer.loadSurrounding_MbAff( pcPicBuffer, auiOutMask[uiDir], g_D2XD[uiDir], g_D2YD[uiDir] ); RNOK( xPadRecMb_MbAff ( &cBuffer, auiOutMask[uiDir] ) ); } pcPicBuffer->loadBuffer ( &cBuffer, g_D2XD[uiDir], g_D2YD[uiDir] ); } } } } } return Err::m_nOK; }