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 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 MbDecoder::xPredictionFromBaseLayer( MbDataAccess& rcMbDataAccess, MbDataAccess* pcMbDataAccessBase ) { MbData& rcMbData = rcMbDataAccess.getMbData(); if( rcMbData.getBLSkipFlag() ) { ROF( pcMbDataAccessBase ); Bool bBLSkipFlag = rcMbData.getBLSkipFlag(); rcMbData.copyMotion( pcMbDataAccessBase->getMbData() ); rcMbData.setBLSkipFlag( bBLSkipFlag ); if( rcMbData.isIntra() ) { rcMbData.setMbMode( INTRA_BL ); } } else { for( ListIdx eListIdx = LIST_0; eListIdx <= LIST_1; eListIdx = ListIdx( eListIdx + 1 ) ) { MbMotionData& rcMbMotionData = rcMbData.getMbMotionData( eListIdx ); switch( rcMbData.getMbMode() ) { case MODE_16x16: { if( rcMbData.isBlockFwdBwd( B_8x8_0, eListIdx ) && rcMbMotionData.getMotPredFlag() ) { rcMbMotionData.setRefIdx( pcMbDataAccessBase->getMbMotionData( eListIdx ).getRefIdx() ); } } break; case MODE_16x8: { if( rcMbData.isBlockFwdBwd( B_8x8_0, eListIdx ) && rcMbMotionData.getMotPredFlag( PART_16x8_0 ) ) { rcMbMotionData.setRefIdx( pcMbDataAccessBase->getMbMotionData( eListIdx ).getRefIdx( PART_16x8_0 ), PART_16x8_0 ); } if( rcMbData.isBlockFwdBwd( B_8x8_2, eListIdx ) && rcMbMotionData.getMotPredFlag( PART_16x8_1 ) ) { rcMbMotionData.setRefIdx( pcMbDataAccessBase->getMbMotionData( eListIdx ).getRefIdx( PART_16x8_1 ), PART_16x8_1 ); } } break; case MODE_8x16: { if( rcMbData.isBlockFwdBwd( B_8x8_0, eListIdx ) && rcMbMotionData.getMotPredFlag( PART_8x16_0 ) ) { rcMbMotionData.setRefIdx( pcMbDataAccessBase->getMbMotionData( eListIdx ).getRefIdx( PART_8x16_0 ), PART_8x16_0 ); } if( rcMbData.isBlockFwdBwd( B_8x8_1, eListIdx ) && rcMbMotionData.getMotPredFlag( PART_8x16_1 ) ) { rcMbMotionData.setRefIdx( pcMbDataAccessBase->getMbMotionData( eListIdx ).getRefIdx( PART_8x16_1 ), PART_8x16_1 ); } } break; case MODE_8x8: case MODE_8x8ref0: { for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ ) { if( rcMbData.getBlkMode( c8x8Idx.b8x8Index() ) != BLK_SKIP && rcMbData.isBlockFwdBwd( c8x8Idx.b8x8Index(), eListIdx ) && rcMbMotionData.getMotPredFlag( c8x8Idx.b8x8() ) ) { rcMbMotionData.setRefIdx( pcMbDataAccessBase->getMbMotionData( eListIdx ).getRefIdx( c8x8Idx.b8x8() ), c8x8Idx.b8x8() ); } } } break; default: break; } } } return Err::m_nOK; }