ErrVal MbCoder::xWriteReferenceFrames( MbDataAccess& rcMbDataAccess, MbMode eMbMode, ListIdx eLstIdx ) { AOT_DBG( rcMbDataAccess.getMbData().isIntra() ); if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) ) { return Err::m_nOK; } Bool bPred = rcMbDataAccess.getSH().getAdaptivePredictionFlag(); MbMotionData& rcMot = rcMbDataAccess.getMbMotionData( eLstIdx ); switch( eMbMode ) { case MODE_SKIP: { break; } case MODE_16x16: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) && ( ! bPred || ! rcMot.getMotPredFlag() ) ) { RNOK( m_pcMbSymbolWriteIf->refFrame( rcMbDataAccess, eLstIdx ) ); } break; } case MODE_16x8: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) && ( ! bPred || ! rcMot.getMotPredFlag( PART_16x8_0 ) ) ) { RNOK( m_pcMbSymbolWriteIf->refFrame( rcMbDataAccess, eLstIdx, PART_16x8_0 ) ); } if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx) && ( ! bPred || ! rcMot.getMotPredFlag( PART_16x8_1 ) ) ) { RNOK( m_pcMbSymbolWriteIf->refFrame( rcMbDataAccess, eLstIdx, PART_16x8_1 ) ); } break; } case MODE_8x16: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) && ( ! bPred || ! rcMot.getMotPredFlag( PART_8x16_0 ) ) ) { RNOK( m_pcMbSymbolWriteIf->refFrame( rcMbDataAccess, eLstIdx, PART_8x16_0 ) ); } if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx) && ( ! bPred || ! rcMot.getMotPredFlag( PART_8x16_1 ) ) ) { RNOK( m_pcMbSymbolWriteIf->refFrame( rcMbDataAccess, eLstIdx, PART_8x16_1 ) ); } break; } case MODE_8x8: case MODE_8x8ref0: { for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ ) { if( BLK_SKIP != rcMbDataAccess.getMbData().getBlkMode( c8x8Idx.b8x8Index() ) && rcMbDataAccess.getMbData().isBlockFwdBwd( c8x8Idx.b8x8Index(), eLstIdx ) && ( ! bPred || ! rcMot.getMotPredFlag( c8x8Idx.b8x8() ) ) ) { RNOK( m_pcMbSymbolWriteIf->refFrame( rcMbDataAccess, eLstIdx, c8x8Idx.b8x8() ) ); } } break; } default: { AF(); return Err::m_nERR; } } return Err::m_nOK; }
ErrVal MbParser::xReadReferenceIndices( MbDataAccess& rcMbDataAccess, MbMode eMbMode, ListIdx eLstIdx ) { MbMotionData& rcMbMotionData = rcMbDataAccess.getMbMotionData( eLstIdx ); if( rcMbDataAccess.getMbData().isIntra() ) { rcMbMotionData.setRefIdx( -1 ); return Err::m_nOK; } switch( eMbMode ) { case MODE_SKIP: { break; } case MODE_16x16: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) ) { if( !rcMbMotionData.getMotPredFlag() ) { if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) ) { rcMbMotionData.setRefIdx( 1 ); } else { DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx ) ); } } } else { rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED ); } break; } case MODE_16x8: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) ) { if( !rcMbMotionData.getMotPredFlag(PART_16x8_0) ) { if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) ) { rcMbMotionData.setRefIdx( 1, PART_16x8_0 ); } else { DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx, PART_16x8_0 ) ); } } } else { rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED, PART_16x8_0 ); } if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx ) ) { if( !rcMbMotionData.getMotPredFlag(PART_16x8_1) ) { if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) ) { rcMbMotionData.setRefIdx( 1, PART_16x8_1 ); } else { DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx, PART_16x8_1 ) ); } } } else { rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED, PART_16x8_1 ); } break; } case MODE_8x16: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) ) { if( !rcMbMotionData.getMotPredFlag(PART_8x16_0) ) { if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) ) { rcMbMotionData.setRefIdx( 1, PART_8x16_0 ); } else { DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx, PART_8x16_0 ) ); } } } else { rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED, PART_8x16_0 ); } if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx ) ) { if( !rcMbMotionData.getMotPredFlag(PART_8x16_1) ) { if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) ) { rcMbMotionData.setRefIdx( 1, PART_8x16_1 ); } else { DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx, PART_8x16_1 ) ); } } } else { rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED, PART_8x16_1 ); } break; } case MODE_8x8: { for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ ) { if( BLK_SKIP != rcMbDataAccess.getMbData().getBlkMode( c8x8Idx.b8x8Index() ) ) { if( rcMbDataAccess.getMbData().isBlockFwdBwd( c8x8Idx.b8x8Index(), eLstIdx ) ) { if( !rcMbMotionData.getMotPredFlag(c8x8Idx.b8x8()) ) { if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) ) { rcMbMotionData.setRefIdx( 1, c8x8Idx.b8x8() ); } else { DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx, c8x8Idx.b8x8() ) ); } } } else { rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED, c8x8Idx.b8x8() ); } } } break; } case MODE_8x8ref0: { rcMbMotionData.setRefIdx( 1 ); break; } default: { AF(); return Err::m_nERR; } } return Err::m_nOK; }