ErrVal RecPicBuffer::xMMCO( SliceHeader* pcSliceHeader ) { ROF( pcSliceHeader ); MmcoOp eMmcoOp; const MmcoBuffer& rcMmcoBuffer = pcSliceHeader->getMmcoBuffer(); Int iIndex = 0; UInt uiVal1, uiVal2; while( MMCO_END != ( eMmcoOp = rcMmcoBuffer.get( iIndex++ ).getCommand( uiVal1, uiVal2 ) ) ) { switch( eMmcoOp ) { case MMCO_SHORT_TERM_UNUSED: RNOK( xMarkShortTermUnused( m_pcCurrRecPicBufUnit, uiVal1 ) ); break; case MMCO_RESET: case MMCO_MAX_LONG_TERM_IDX: case MMCO_ASSIGN_LONG_TERM: case MMCO_LONG_TERM_UNUSED: case MMCO_SET_LONG_TERM: default: RERR(); } } return Err::m_nOK; }
ErrVal RecPicBuffer::xCheckMissingPics( SliceHeader* pcSliceHeader, PicBufferList& rcOutputList, PicBufferList& rcUnusedList ) { ROTRS( pcSliceHeader->isIdrNalUnit(), Err::m_nOK ); ROTRS( ( ( m_uiLastRefFrameNum + 1 ) % m_uiMaxFrameNum ) == pcSliceHeader->getFrameNum(), Err::m_nOK ); UInt uiMissingFrames = pcSliceHeader->getFrameNum() - m_uiLastRefFrameNum - 1; if( pcSliceHeader->getFrameNum() <= m_uiLastRefFrameNum ) { uiMissingFrames += m_uiMaxFrameNum; } ROF( pcSliceHeader->getSPS().getRequiredFrameNumUpdateBehaviourFlag() ); for( UInt uiIndex = 1; uiIndex <= uiMissingFrames; uiIndex++ ) { Bool bTreatAsIdr = ( m_cUsedRecPicBufUnitList.empty() ); Int iPoc = ( bTreatAsIdr ? 0 : m_cUsedRecPicBufUnitList.back()->getPoc() ); UInt uiFrameNum = ( m_uiLastRefFrameNum + uiIndex ) % m_uiMaxFrameNum; RNOK( m_pcCurrRecPicBufUnit->initNonEx( iPoc, uiFrameNum ) ); RNOK( xStorePicture( m_pcCurrRecPicBufUnit, rcOutputList, rcUnusedList, pcSliceHeader, bTreatAsIdr ) ); } m_uiLastRefFrameNum = ( m_uiLastRefFrameNum + uiMissingFrames ) % m_uiMaxFrameNum; return Err::m_nOK; }
ErrVal RecPicBufUnit::markNonRef() { ROF( m_bNeededForReference ); m_bNeededForReference = false; return Err::m_nOK; }
ErrVal RecPicBuffer::create( RecPicBuffer*& rpcRecPicBuffer ) { rpcRecPicBuffer = new RecPicBuffer(); ROF( rpcRecPicBuffer ); return Err::m_nOK; }
ErrVal BitReadBuffer::create( BitReadBuffer*& rpcBitReadBuffer ) { rpcBitReadBuffer = new BitReadBuffer; ROF( rpcBitReadBuffer ); return Err::m_nOK; }
ErrVal RecPicBuffer::xStorePicture( RecPicBufUnit* pcRecPicBufUnit, PicBufferList& rcOutputList, PicBufferList& rcUnusedList, SliceHeader* pcSliceHeader, Bool bTreatAsIdr ) { ROF( pcRecPicBufUnit == m_pcCurrRecPicBufUnit ); if( bTreatAsIdr ) { RNOK( xClearOutputAll( rcOutputList, rcUnusedList ) ); m_cUsedRecPicBufUnitList.push_back( pcRecPicBufUnit ); } else { m_cUsedRecPicBufUnitList.push_back( pcRecPicBufUnit ); if( !pcSliceHeader->getInterViewRef()) // { RNOK( xUpdateMemory( pcSliceHeader ) ); } RNOK( xOutput( rcOutputList, rcUnusedList ) ); } RNOK( xDumpRecPicBuffer() ); m_pcCurrRecPicBufUnit = m_cFreeRecPicBufUnitList.popFront(); return Err::m_nOK; }
ErrVal SliceEncoder::updatePictureResTransform( ControlData& rcControlData, UInt uiMbInRow ) { ROF( m_bInitDone ); SliceHeader& rcSliceHeader = *rcControlData.getSliceHeader (); MbDataCtrl* pcMbDataCtrl = rcControlData.getMbDataCtrl (); MbDataCtrl* pcBaseLayerCtrl = rcControlData.getBaseLayerCtrl (); UInt uiMbAddress = 0; UInt uiLastMbAddress = rcSliceHeader.getMbInPic() - 1; //====== initialization ====== RNOK( pcMbDataCtrl->initSlice( rcSliceHeader, DECODE_PROCESS, false, NULL ) ); // Update the macroblock state // Must be done after the bit-stream has been constructed for( ; uiMbAddress <= uiLastMbAddress; ) { UInt uiMbY = 0; UInt uiMbX = 0; MbDataAccess* pcMbDataAccess = 0; MbDataAccess* pcMbDataAccessBase = 0; rcSliceHeader.getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress ); RNOK( pcMbDataCtrl ->initMb ( pcMbDataAccess, uiMbY, uiMbX ) ); if( pcBaseLayerCtrl ) { RNOK( pcBaseLayerCtrl ->initMb ( pcMbDataAccessBase, uiMbY, uiMbX ) ); pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase ); } // modify QP values (as specified in G.8.1.5.1.2) if( pcMbDataAccess->getMbData().getMbCbp() == 0 && ( pcMbDataAccess->getMbData().getMbMode() == INTRA_BL || pcMbDataAccess->getMbData().getResidualPredFlag() ) ) { pcMbDataAccess->getMbData().setQp ( pcMbDataAccessBase->getMbData().getQp() ); pcMbDataAccess->getMbData().setQp4LF( pcMbDataAccessBase->getMbData().getQp() ); } // if cbp==0, tranform size is not transmitted, in this case inherit the transform size from base layer if( ( pcMbDataAccess->getMbData().getResidualPredFlag() && ! pcMbDataAccess->getMbData().isIntra() && ! pcMbDataAccessBase->getMbData().isIntra() ) || ( pcMbDataAccess->getMbData().getMbMode() == INTRA_BL ) ) { if( ( pcMbDataAccess->getMbData().getMbCbp() & 0x0F ) == 0 ) { pcMbDataAccess->getMbData().setTransformSize8x8( pcMbDataAccessBase->getMbData().isTransformSize8x8() ); } } // set I_PCM mode (for deblocking) when CBP is 0, mbMode is I_BL, and base layer mbMode is I_PCM if( pcMbDataAccess->getMbData().getMbCbp() == 0 && pcMbDataAccess->getMbData().isIntraBL() && pcMbDataAccessBase->getMbData().isPCM() ) { pcMbDataAccess->getMbData().setMbMode( MODE_PCM ); } uiMbAddress++; } return Err::m_nOK; }
ErrVal MbDataCtrl::storeFgsBQLayerQpAndCbp() { ROF( m_pacFgsBQMbQP ); ROF( m_pauiFgsBQMbCbp ); ROF( m_pauiFgsBQBCBP ); ROF( m_pabFgsBQ8x8Trafo ); for( UInt uiMbIndex = 0; uiMbIndex < getSize(); uiMbIndex++ ) { m_pacFgsBQMbQP [uiMbIndex] = getMbData( uiMbIndex ).getQp(); m_pauiFgsBQMbCbp [uiMbIndex] = getMbData( uiMbIndex ).getMbExtCbp(); m_pauiFgsBQBCBP [uiMbIndex] = getMbData( uiMbIndex ).getBCBP(); m_pabFgsBQ8x8Trafo [uiMbIndex] = getMbData( uiMbIndex ).isTransformSize8x8(); } return Err::m_nOK; }
ErrVal InputPicBuffer::init() { ROF( m_cInputUnitList.empty() ); m_uiContFrameNumber = 0; m_bInit = true; return Err::m_nOK; }
ErrVal ControlMngH264AVCEncoder::initMbForFiltering( MbDataAccess*& rpcMbDataAccess, UInt uiMbY, UInt uiMbX, Bool bMbAff ) { ROF( m_uiCurrLayer < MAX_LAYERS ); // m_pcMbDataCtrl->initMb( rpcMbDataAccess, uiMbY, uiMbX );//test RNOK( m_apcYuvFullPelBufferCtrl[m_uiCurrLayer]->initMb( uiMbY, uiMbX, bMbAff ) ); return Err::m_nOK; }
ErrVal ControlData::storeBQLayerQpAndCbp() { ROF( m_pacBQMbQP ); ROF( m_pauiBQMbCbp ); ROF( m_pabBQ8x8Trafo ); for( UInt uiMbIndex = 0; uiMbIndex < m_pcMbDataCtrl->getSize(); uiMbIndex++ ) { m_pacBQMbQP [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getQp(); m_pauiBQMbCbp [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbExtCbp(); m_pabBQ8x8Trafo [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).isTransformSize8x8(); m_paeBQMbMode [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbMode(); m_pusBQFwdBwd [uiMbIndex] = m_pcMbDataCtrl->getMbData( uiMbIndex ).getFwdBwd(); m_paacBQMotionData[0][uiMbIndex].copyFrom( m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbMotionData( ListIdx( 0 ) ) ); m_paacBQMotionData[1][uiMbIndex].copyFrom( m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbMotionData( ListIdx( 1 ) ) ); } return Err::m_nOK; }
ErrVal MbParser::initSlice( MbSymbolReadIf* pcMbSymbolReadIf ) { ROF( pcMbSymbolReadIf ); m_pcMbSymbolReadIf = pcMbSymbolReadIf; m_bPrevIsSkipped = false; m_bInitDone = true; return Err::m_nOK; }
ErrVal ControlData::init( SliceHeader* pcSliceHeader, MbDataCtrl* pcMbDataCtrl, Double dLambda ) { ROF( pcSliceHeader ); ROF( pcMbDataCtrl ); m_pcSliceHeader = pcSliceHeader; m_pcMbDataCtrl = pcMbDataCtrl; m_dLambda = dLambda; m_pcBaseLayerRec = 0; m_pcBaseLayerSbb = 0; m_pcBaseLayerCtrl = 0; m_uiUseBLMotion = 0; return Err::m_nOK; }
ErrVal RecPicBuffer::init( YuvBufferCtrl* pcYuvBufferCtrlFullPel, YuvBufferCtrl* pcYuvBufferCtrlHalfPel ) { ROT( m_bInitDone ); ROF( pcYuvBufferCtrlFullPel ); ROF( pcYuvBufferCtrlHalfPel ); m_pcYuvBufferCtrlFullPel = pcYuvBufferCtrlFullPel; m_pcYuvBufferCtrlHalfPel = pcYuvBufferCtrlHalfPel; m_uiNumRefFrames = 0; m_uiMaxFrameNum = 0; m_uiLastRefFrameNum = MSYS_UINT_MAX; m_pcCurrRecPicBufUnit = NULL; m_bInitDone = true; m_codeAsVFrame = false; return Err::m_nOK; }
ErrVal MbMotionData::setRefPicIdcs( RefFrameList* pcRefFrameList ) { for( UInt ui = 0; ui < 4; ui++ ) { RefPicIdc cRefPicIdc; SChar scRefIdx = m_ascRefIdx[ui]; if( scRefIdx > 0 ) { ROF( pcRefFrameList ); ROF( scRefIdx <= (Int)pcRefFrameList->getActive() ); const Frame* pcFrame = (*pcRefFrameList)[ scRefIdx ]; ROF( pcFrame ); cRefPicIdc.set( pcFrame ); } m_acRefPicIdc[ui] = cRefPicIdc; } return Err::m_nOK; }
ErrVal RecPicBuffer::xClearOutputAll( PicBufferList& rcOutputList, PicBufferList& rcUnusedList ) { //===== create output list ===== RecPicBufUnitList cOutputList; Int iMinPoc = MSYS_INT_MAX; Int iMaxPoc = MSYS_INT_MIN; RecPicBufUnitList::iterator iter = m_cUsedRecPicBufUnitList.begin(); RecPicBufUnitList::iterator end = m_cUsedRecPicBufUnitList.end (); for( ; iter != end; iter++ ) { Bool bOutput = ( ! (*iter)->isOutputted() && (*iter)->isExisting() ); if( bOutput ) { cOutputList.push_back( *iter ); if( (*iter)->getPoc() < iMinPoc ) iMinPoc = (*iter)->getPoc(); if( (*iter)->getPoc() > iMaxPoc ) iMaxPoc = (*iter)->getPoc(); } } //===== real output ===== for( Int iPoc = iMinPoc; iPoc <= iMaxPoc; iPoc++ ) { iter = cOutputList.begin(); end = cOutputList.end (); for( ; iter != end; iter++ ) { if( (*iter)->getPoc() == iPoc ) { RecPicBufUnit* pcRecPicBufUnit = *iter; cOutputList.remove( pcRecPicBufUnit ); //--- output --- PicBuffer* pcPicBuffer = pcRecPicBufUnit->getPicBuffer(); ROF( pcPicBuffer ); pcRecPicBufUnit->getRecFrame()->store( pcPicBuffer ); rcOutputList.push_back( pcPicBuffer ); rcUnusedList.push_back( pcPicBuffer ); break; // only one picture per poc } } } ROT( cOutputList.size() ); //===== uninit all elements and move to free list ===== while( m_cUsedRecPicBufUnitList.size() ) { RecPicBufUnit* pcRecPicBufUnit = m_cUsedRecPicBufUnitList.popFront(); RNOK( pcRecPicBufUnit->uninit() ); m_cFreeRecPicBufUnitList.push_back( pcRecPicBufUnit ); } return Err::m_nOK; }
ErrVal InputPicBuffer::add( PicBuffer* pcInputPicBuffer ) { ROF( m_bInit ); //===== add to list ===== InputAccessUnit* pcInputAccessUnit = new InputAccessUnit( m_uiContFrameNumber++, pcInputPicBuffer ); m_cInputUnitList.push_back( pcInputAccessUnit ); return Err::m_nOK; }
ErrVal NalUnitParser::uninit() { ROF( m_bInitialized ); ROT( m_bNalUnitInitialized ); m_bInitialized = false; m_bNalUnitInitialized = false; m_pcBitReadBuffer = 0; m_pcHeaderSymbolReadIf = 0; return Err::m_nOK; }
ErrVal Frame::xUpdatePicParameters() { //===== set in associated frame or top and bot field ===== if( m_ePicType == FRAME ) { if( m_pcFrameTopField ) { m_pcFrameTopField->m_cPicParameters = m_cPicParameters; m_pcFrameTopField->m_cPicParametersBot = m_cPicParametersBot; } if( m_pcFrameBotField ) { m_pcFrameBotField->m_cPicParameters = m_cPicParameters; m_pcFrameBotField->m_cPicParametersBot = m_cPicParametersBot; } } else if( m_ePicType == TOP_FIELD ) { ROF( m_pcFrame ); m_pcFrame->m_cPicParameters = m_cPicParameters; m_pcFrame->m_cPicParametersBot = m_cPicParametersBot; if( m_pcFrame->m_pcFrameBotField ) { m_pcFrameBotField->m_cPicParameters = m_cPicParameters; m_pcFrameBotField->m_cPicParametersBot = m_cPicParametersBot; } } else if( m_ePicType == BOT_FIELD ) { ROF( m_pcFrame ); m_pcFrame->m_cPicParameters = m_cPicParameters; m_pcFrame->m_cPicParametersBot = m_cPicParametersBot; if( m_pcFrame->m_pcFrameTopField ) { m_pcFrameTopField->m_cPicParameters = m_cPicParameters; m_pcFrameTopField->m_cPicParametersBot = m_cPicParametersBot; } } return Err::m_nOK; }
ErrVal ControlData::switchBQLayerQpAndCbp() { ROF( m_pacBQMbQP ); ROF( m_pauiBQMbCbp ); ROF( m_pabBQ8x8Trafo ); for( UInt uiMbIndex = 0; uiMbIndex < m_pcMbDataCtrl->getSize(); uiMbIndex++ ) { UChar ucQP = m_pcMbDataCtrl->getMbData( uiMbIndex ).getQp(); UInt uiCbp = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbExtCbp(); Bool bT8x8 = m_pcMbDataCtrl->getMbData( uiMbIndex ).isTransformSize8x8(); m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setQp ( m_pacBQMbQP [uiMbIndex] ); m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setMbExtCbp ( m_pauiBQMbCbp [uiMbIndex] ); m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setTransformSize8x8 ( m_pabBQ8x8Trafo [uiMbIndex] ); m_pacBQMbQP [uiMbIndex] = ucQP; m_pauiBQMbCbp [uiMbIndex] = uiCbp; m_pabBQ8x8Trafo [uiMbIndex] = bT8x8; MbMode eMbMode = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbMode(); UShort usFwdBwd = m_pcMbDataCtrl->getMbData( uiMbIndex ).getFwdBwd(); m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setMbMode ( m_paeBQMbMode [uiMbIndex] ); m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setFwdBwd ( m_pusBQFwdBwd [uiMbIndex] ); m_paeBQMbMode [uiMbIndex] = eMbMode; m_pusBQFwdBwd [uiMbIndex] = usFwdBwd; for( UInt ui = 0; ui < 2; ui++ ) { MbMotionData cMbMotionData; cMbMotionData.copyFrom( m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbMotionData( ListIdx( ui ) ) ); m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).getMbMotionData( ListIdx( ui ) ).copyFrom( m_paacBQMotionData[ui][uiMbIndex] ); m_paacBQMotionData[ui][uiMbIndex].copyFrom( cMbMotionData ); } } return Err::m_nOK; }
ErrVal ControlMngH264AVCDecoder::initMbForFiltering( UInt uiMbIndex ) { ROF( m_uiCurrLayer < MAX_LAYERS ); UInt uiMbY, uiMbX; uiMbY = uiMbIndex / m_auiMbXinFrame[m_uiCurrLayer]; uiMbX = uiMbIndex - uiMbY * m_auiMbXinFrame[m_uiCurrLayer]; RNOK( m_apcYuvFullPelBufferCtrl[m_uiCurrLayer]->initMb( uiMbY, uiMbX ) ); return Err::m_nOK; }
ErrVal SliceEncoder::uninit() { ROF( m_bInitDone ); m_pcMbEncoder = NULL; m_pcMbCoder = NULL; m_pcControlMng = NULL; m_bInitDone = false; m_uiFrameCount = 0; m_eSliceType = I_SLICE; m_bTraceEnable = false; return Err::m_nOK; }
ErrVal RecPicBufUnit::create( RecPicBufUnit*& rpcRecPicBufUnit, YuvBufferCtrl& rcYuvBufferCtrlFullPel, YuvBufferCtrl& rcYuvBufferCtrlHalfPel, const SequenceParameterSet& rcSPS ) { rpcRecPicBufUnit = new RecPicBufUnit(); ROF( rpcRecPicBufUnit ); rpcRecPicBufUnit->m_pcReconstructedFrame = new IntFrame ( rcYuvBufferCtrlFullPel, rcYuvBufferCtrlHalfPel ); rpcRecPicBufUnit->m_pcMbDataCtrl = new MbDataCtrl(); ROF( rpcRecPicBufUnit->m_pcReconstructedFrame ); ROF( rpcRecPicBufUnit->m_pcMbDataCtrl ); RNOK( rpcRecPicBufUnit->m_pcReconstructedFrame ->init() ); RNOK( rpcRecPicBufUnit->m_pcMbDataCtrl ->init( rcSPS ) ); rpcRecPicBufUnit->m_pcReconstructedFrame->setRecPicBufUnit( rpcRecPicBufUnit ); return Err::m_nOK; }
ErrVal ControlData::switchFGSLayerQpAndCbp() { ROF( m_pacFGSMbQP ); ROF( m_pauiFGSMbCbp ); ROF( m_pabFGS8x8Trafo ); for( UInt uiMbIndex = 0; uiMbIndex < m_pcMbDataCtrl->getSize(); uiMbIndex++ ) { UChar ucQP = m_pcMbDataCtrl->getMbData( uiMbIndex ).getQp(); UInt uiCbp = m_pcMbDataCtrl->getMbData( uiMbIndex ).getMbExtCbp(); Bool bT8x8 = m_pcMbDataCtrl->getMbData( uiMbIndex ).isTransformSize8x8(); m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setQp ( m_pacFGSMbQP [uiMbIndex] ); m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setMbExtCbp ( m_pauiFGSMbCbp [uiMbIndex] ); m_pcMbDataCtrl->getMbDataByIndex( uiMbIndex ).setTransformSize8x8 ( m_pabFGS8x8Trafo [uiMbIndex] ); m_pacFGSMbQP [uiMbIndex] = ucQP; m_pauiFGSMbCbp [uiMbIndex] = uiCbp; m_pabFGS8x8Trafo [uiMbIndex] = bT8x8; } return Err::m_nOK; }
ErrVal ControlMngH264AVCDecoder::initMbForParsing( MbDataAccess*& rpcMbDataAccess, UInt uiMbIndex ) { ROF( m_uiCurrLayer < MAX_LAYERS ); UInt uiMbY, uiMbX; uiMbY = uiMbIndex / m_auiMbXinFrame[m_uiCurrLayer]; uiMbX = uiMbIndex - uiMbY * m_auiMbXinFrame[m_uiCurrLayer]; RNOK( m_pcMbDataCtrl ->initMb( rpcMbDataAccess, uiMbY, uiMbX ) ); RNOK( m_apcYuvFullPelBufferCtrl[m_uiCurrLayer]->initMb( uiMbY, uiMbX ) ); return Err::m_nOK; }
ErrVal RecPicBuffer::initCurrRecPicBufUnit( RecPicBufUnit*& rpcCurrRecPicBufUnit, PicBuffer* pcPicBuffer, SliceHeader* pcSliceHeader, PicBufferList& rcOutputList, PicBufferList& rcUnusedList, MultiviewReferenceDirection refDirection) { ROF( m_bInitDone ); ROF( pcPicBuffer ); ROF( pcSliceHeader ); //===== check for missing pictures ===== if (NOT_MULTIVIEW == refDirection) { // Do not check for missing pics if we are initializing for a // multiview reference because the frame numbers are not meaningful // for multiview references and errors will result. RNOK( xCheckMissingPics( pcSliceHeader, rcOutputList, rcUnusedList ) ); } //===== initialize current DPB unit ===== RNOK( m_pcCurrRecPicBufUnit->init( pcSliceHeader, pcPicBuffer ) ); //===== load picture ===== RNOK( m_pcCurrRecPicBufUnit->getRecFrame()->load( pcPicBuffer ) ); m_pcCurrRecPicBufUnit->SetMultiviewReferenceDirection(refDirection); // the set of refDirection to NOT_MULTIVIEW has been done too much times, many of them are unnecessary //===== set reference ===== rpcCurrRecPicBufUnit = m_pcCurrRecPicBufUnit; return Err::m_nOK; }
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 RecPicBuffer::uninit() { ROF( m_bInitDone ); RNOK( xDeleteData() ); m_pcYuvBufferCtrlFullPel = NULL; m_pcYuvBufferCtrlHalfPel = NULL; m_uiNumRefFrames = 0; m_uiMaxFrameNum = 0; m_uiLastRefFrameNum = MSYS_UINT_MAX; m_bInitDone = false; m_codeAsVFrame = false; return Err::m_nOK; }
ErrVal ControlMngH264AVCDecoder::initMbForParsing( MbDataAccess*& rpcMbDataAccess, UInt uiMbIndex ) { ROF( m_uiCurrLayer < MAX_LAYERS ); UInt uiMbY, uiMbX; uiMbY = uiMbIndex / m_auiMbXinFrame[m_uiCurrLayer]; uiMbX = uiMbIndex - uiMbY * m_auiMbXinFrame[m_uiCurrLayer]; RNOK( m_pcMbDataCtrl ->initMb( rpcMbDataAccess, uiMbY, uiMbX ) ); #ifdef LF_INTERLACE RNOK( m_apcYuvFullPelBufferCtrl[m_uiCurrLayer]->initMb( uiMbY, uiMbX, m_bMbAff ) ); // for future use #else //!LF_INTERLACE RNOK( m_apcYuvFullPelBufferCtrl[m_uiCurrLayer]->initMb( uiMbY, uiMbX ) ); #endif //LF_INTERLACE return Err::m_nOK; }
ErrVal RecPicBuffer::xCreateData( UInt uiMaxFramesInDPB, const SequenceParameterSet& rcSPS ) { ROF( m_bInitDone ); RNOK( xDeleteData() ); while( uiMaxFramesInDPB-- ) { RecPicBufUnit* pcRecPicBufUnit = 0; RNOK( RecPicBufUnit::create( pcRecPicBufUnit, *m_pcYuvBufferCtrlFullPel, *m_pcYuvBufferCtrlHalfPel, rcSPS ) ); m_cFreeRecPicBufUnitList.push_back( pcRecPicBufUnit ); } RNOK( RecPicBufUnit::create( m_pcCurrRecPicBufUnit, *m_pcYuvBufferCtrlFullPel, *m_pcYuvBufferCtrlHalfPel, rcSPS ) ); RNOK( m_pcCurrRecPicBufUnit->uninit() ); return Err::m_nOK; }