?? mbcoder.cpp
字號:
{
RNOK( m_pcMbSymbolWriteIf->finishSlice() );
}
return Err::m_nOK;
}
ErrVal MbCoder::encodeMotion( MbDataAccess& rcMbDataAccess,
MbDataAccess* pcMbDataAccessBase )
{
ROT( rcMbDataAccess.getMbData().isIntra() );
//===== base mode flag =====
RNOK( m_pcMbSymbolWriteIf->BLSkipFlag( rcMbDataAccess ) );
ROTRS( rcMbDataAccess.getMbData().getBLSkipFlag(), Err::m_nOK );
//===== macroblock mode =====
RNOK( m_pcMbSymbolWriteIf->mbMode( rcMbDataAccess ) );
//===== BLOCK MODES =====
if( rcMbDataAccess.getMbData().isInter8x8() )
{
RNOK( m_pcMbSymbolWriteIf->blockModes( rcMbDataAccess ) );
}
//===== MOTION INFORMATION =====
MbMode eMbMode = rcMbDataAccess.getMbData().getMbMode();
if( rcMbDataAccess.getSH().isInterB() )
{
RNOK( xWriteMotionPredFlags_FGS ( rcMbDataAccess, pcMbDataAccessBase, eMbMode, LIST_0 ) );
RNOK( xWriteMotionPredFlags_FGS ( rcMbDataAccess, pcMbDataAccessBase, eMbMode, LIST_1 ) );
RNOK( xWriteReferenceFrames ( rcMbDataAccess, eMbMode, LIST_0 ) );
RNOK( xWriteReferenceFrames ( rcMbDataAccess, eMbMode, LIST_1 ) );
RNOK( xWriteMotionVectors ( rcMbDataAccess, eMbMode, LIST_0 ) );
RNOK( xWriteMotionVectors ( rcMbDataAccess, eMbMode, LIST_1 ) );
}
else
{
RNOK( xWriteMotionPredFlags_FGS ( rcMbDataAccess, pcMbDataAccessBase, eMbMode, LIST_0 ) );
RNOK( xWriteReferenceFrames ( rcMbDataAccess, eMbMode, LIST_0 ) );
RNOK( xWriteMotionVectors ( rcMbDataAccess, eMbMode, LIST_0 ) );
}
//===== residual prediction flag =====
Bool bBaseCoeff = ( pcMbDataAccessBase->getMbData().getMbCbp() != 0 );
RNOK( m_pcMbSymbolWriteIf->resPredFlag_FGS( rcMbDataAccess, bBaseCoeff ) );
return Err::m_nOK;
}
ErrVal MbCoder::xWriteIntraPredModes( MbDataAccess& rcMbDataAccess )
{
ROFRS( rcMbDataAccess.getMbData().isIntra(), Err::m_nOK );
if( rcMbDataAccess.getMbData().isIntra4x4() )
{
if( rcMbDataAccess.getSH().getPPS().getTransform8x8ModeFlag() )
{
RNOK( m_pcMbSymbolWriteIf->transformSize8x8Flag( rcMbDataAccess ) );
}
if( rcMbDataAccess.getMbData().isTransformSize8x8() )
{
for( B8x8Idx cIdx; cIdx.isLegal(); cIdx++ )
{
RNOK( m_pcMbSymbolWriteIf->intraPredModeLuma( rcMbDataAccess, cIdx ) );
}
}
else
{
for( S4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
{
RNOK( m_pcMbSymbolWriteIf->intraPredModeLuma( rcMbDataAccess, cIdx ) );
}
}
}
if( rcMbDataAccess.getMbData().isIntra4x4() || rcMbDataAccess.getMbData().isIntra16x16() )
{
RNOK( m_pcMbSymbolWriteIf->intraPredModeChroma( rcMbDataAccess ) );
}
return Err::m_nOK;
}
ErrVal MbCoder::xWriteBlockMv( MbDataAccess& rcMbDataAccess, B8x8Idx c8x8Idx, ListIdx eLstIdx )
{
BlkMode eBlkMode = rcMbDataAccess.getMbData().getBlkMode( c8x8Idx.b8x8Index() );
ParIdx8x8 eParIdx = c8x8Idx.b8x8();
switch( eBlkMode )
{
case BLK_8x8:
{
RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, eParIdx ) );
break;
}
case BLK_8x4:
{
RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_8x4_0 ) );
RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_8x4_1 ) );
break;
}
case BLK_4x8:
{
RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_4x8_0 ) );
RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_4x8_1 ) );
break;
}
case BLK_4x4:
{
RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_4x4_0 ) );
RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_4x4_1 ) );
RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_4x4_2 ) );
RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_4x4_3 ) );
break;
}
case BLK_SKIP:
{
break;
}
default:
{
AF();
return Err::m_nERR;
}
}
return Err::m_nOK;
}
ErrVal
MbCoder::xWriteMotionPredFlags_FGS( MbDataAccess& rcMbDataAccess,
MbDataAccess* pcMbDataAccessBase,
MbMode eMbMode,
ListIdx eLstIdx )
{
AOT_DBG( rcMbDataAccess.getMbData().isIntra() );
ROFRS ( rcMbDataAccess.getSH().getAdaptivePredictionFlag (), Err::m_nOK );
ROF ( pcMbDataAccessBase );
switch( eMbMode )
{
case MODE_SKIP:
{
break;
}
case MODE_16x16:
{
if( rcMbDataAccess .getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) &&
pcMbDataAccessBase->getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->motionPredFlag( rcMbDataAccess, eLstIdx ) );
}
break;
}
case MODE_16x8:
{
if( rcMbDataAccess .getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) &&
pcMbDataAccessBase->getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_16x8_0 ) );
}
if( rcMbDataAccess .getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx) &&
pcMbDataAccessBase->getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_16x8_1 ) );
}
break;
}
case MODE_8x16:
{
if( rcMbDataAccess .getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) &&
pcMbDataAccessBase->getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_8x16_0 ) );
}
if( rcMbDataAccess .getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx) &&
pcMbDataAccessBase->getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->motionPredFlag( 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) &&
pcMbDataAccessBase ->getMbData().isBlockFwdBwd( c8x8Idx.b8x8Index(), eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->motionPredFlag( rcMbDataAccess, eLstIdx, c8x8Idx.b8x8() ) );
}
}
break;
}
default:
{
AF();
return Err::m_nERR;
}
}
return Err::m_nOK;
}
ErrVal
MbCoder::xWriteMotionPredFlags( MbDataAccess& rcMbDataAccess,
MbMode eMbMode,
ListIdx eLstIdx )
{
AOT_DBG( rcMbDataAccess.getMbData().isIntra() );
ROFRS ( rcMbDataAccess.getSH().getAdaptivePredictionFlag (), Err::m_nOK );
switch( eMbMode )
{
case MODE_SKIP:
{
break;
}
case MODE_16x16:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->motionPredFlag( rcMbDataAccess, eLstIdx ) );
}
break;
}
case MODE_16x8:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_16x8_0 ) );
}
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_16x8_1 ) );
}
break;
}
case MODE_8x16:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_8x16_0 ) );
}
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->motionPredFlag( 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) )
{
RNOK( m_pcMbSymbolWriteIf->motionPredFlag( rcMbDataAccess, eLstIdx, c8x8Idx.b8x8() ) );
}
}
break;
}
default:
{
AF();
return Err::m_nERR;
}
}
return Err::m_nOK;
}
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 ) ) )
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -