📄 mbdataaccess.cpp
字号:
else
{
uiCoeffCount = rcMbDataLeft.getMbTCoeffs().calcCoeffCount( CIdx( iComp + m_auc4x4Idx28x8Idx[ cLumIdxL.b4x4() ] ),
rcMbDataLeft.getFieldFlag() ? g_aucFieldScan : g_aucFrameScan,
uiStart,
uiStop );
}
}
}
const MbData& rcMbDataAbove = xGetBlockAbove( cLumIdx );
if( xIsAvailable( rcMbDataAbove ) )
{
if( uiStart == 0 && uiStop == 16 )
{
uiCoeffCount += rcMbDataAbove.getMbTCoeffs().getCoeffCount( CIdx( iComp + m_auc4x4Idx28x8Idx[ cLumIdx.b4x4() ] ) );
}
else
{
uiCoeffCount += rcMbDataAbove.getMbTCoeffs().calcCoeffCount( CIdx( iComp + m_auc4x4Idx28x8Idx[ cLumIdx.b4x4() ] ),
rcMbDataAbove.getFieldFlag() ? g_aucFieldScan : g_aucFrameScan,
uiStart,
uiStop );
}
if( bLeftAvailable )
{
uiCoeffCount += 1;
uiCoeffCount >>= 1;
}
}
if( 4 > uiCoeffCount )
{
uiCoeffCount >>= 1;
}
else
{
uiCoeffCount = ( 8 > uiCoeffCount) ? 2 : 3;
}
return uiCoeffCount;
}
Void MbDataAccess::xSetMvPredictorsBL( const Mv& rcMvPredBL, ListIdx eListIdx, LumaIdx cIdx, LumaIdx cIdxEnd )
{
const Bool bCurrentFieldFlag = m_rcMbCurr.getFieldFlag();
//===== set motion vector predictors: A, B, C =====
B4x4Idx cIdxA = cIdx .b4x4();
B4x4Idx cIdxB = cIdx .b4x4();
const MbData& rcMbDataA = xGetBlockLeft ( cIdxA );
const MbData& rcMbDataB = xGetBlockAbove ( cIdxB );
rcMbDataA.getMbMotionData( eListIdx ).getMv3DNeighbour( m_cMv3D_A, cIdxA, bCurrentFieldFlag );
rcMbDataB.getMbMotionData( eListIdx ).getMv3DNeighbour( m_cMv3D_B, cIdxB, bCurrentFieldFlag );
m_cMv3D_C.set( rcMvPredBL, 1 );
}
Void MbDataAccess::xSetNeighboursMvPredictor( ListIdx eListIdx, LumaIdx cIdx, LumaIdx cIdxEnd )
{
const Bool bCurrentFieldFlag = m_rcMbCurr.getFieldFlag();
//===== set motion vector predictors: A, B, C =====
B4x4Idx cIdxA = cIdx .b4x4();
B4x4Idx cIdxB = cIdx .b4x4();
B4x4Idx cIdxD = cIdx .b4x4();
B4x4Idx cIdxC = cIdxEnd.b4x4();
const MbData& rcMbDataA = xGetBlockLeft ( cIdxA );
const MbData& rcMbDataB = xGetBlockAbove ( cIdxB );
const MbData& rcMbDataC = xGetBlockAboveRight( cIdxC );
rcMbDataA.getMbMotionData( eListIdx ).getMv3DNeighbour( m_cMv3D_A, cIdxA, bCurrentFieldFlag );
rcMbDataB.getMbMotionData( eListIdx ).getMv3DNeighbour( m_cMv3D_B, cIdxB, bCurrentFieldFlag );
rcMbDataC.getMbMotionData( eListIdx ).getMv3DNeighbour( m_cMv3D_C, cIdxC, bCurrentFieldFlag );
if( m_cMv3D_C == BLOCK_NOT_AVAILABLE )
{
const MbData& rcMbDataD = xGetBlockAboveLeft ( cIdxD );
rcMbDataD.getMbMotionData( eListIdx ).getMv3DNeighbour( m_cMv3D_C, cIdxD, bCurrentFieldFlag );
}
}
Void MbDataAccess::xGetMvPredictorUseNeighbours( Mv& rcMvPred, SChar scRef, PredictionType ePredType )
{
//===== check directional prediction types =====
if( ( ePredType == PRED_A && m_cMv3D_A == scRef ) ||
( m_cMv3D_A == scRef && m_cMv3D_B != scRef && m_cMv3D_C != scRef ) ||
( m_cMv3D_B == BLOCK_NOT_AVAILABLE && m_cMv3D_C == BLOCK_NOT_AVAILABLE ) )
{
rcMvPred = m_cMv3D_A;
return;
}
if( ( ePredType == PRED_B && m_cMv3D_B == scRef ) ||
( m_cMv3D_A != scRef && m_cMv3D_B == scRef && m_cMv3D_C != scRef ) )
{
rcMvPred = m_cMv3D_B;
return;
}
if( ( ePredType == PRED_C && m_cMv3D_C == scRef ) ||
( m_cMv3D_A != scRef && m_cMv3D_B != scRef && m_cMv3D_C == scRef ) )
{
rcMvPred = m_cMv3D_C;
return;
}
#define MEDIAN(a,b,c) ((a)>(b)?(a)>(c)?(b)>(c)?(b):(c):(a):(b)>(c)?(a)>(c)?(a):(c):(b))
{
rcMvPred.setHor( MEDIAN( m_cMv3D_A.getHor(), m_cMv3D_B.getHor(), m_cMv3D_C.getHor() ) );
rcMvPred.setVer( MEDIAN( m_cMv3D_A.getVer(), m_cMv3D_B.getVer(), m_cMv3D_C.getVer() ) );
}
#undef MEDIAN
}
Void MbDataAccess::getMvPredictorSkipMode()
{
Mv cMvPred;
xGetMvPredictor( cMvPred, 1, LIST_0, MEDIAN, B4x4Idx(0), B4x4Idx(3) );
if( ( m_cMv3D_A.getRef()==BLOCK_NOT_AVAILABLE ||
m_cMv3D_B.getRef()==BLOCK_NOT_AVAILABLE ) ||
( m_cMv3D_A.getHor()==0 && m_cMv3D_A.getVer()==0 && m_cMv3D_A.getRef()==1 ) ||
( m_cMv3D_B.getHor()==0 && m_cMv3D_B.getVer()==0 && m_cMv3D_B.getRef()==1 ) )
{
cMvPred.setZero();
}
getMbMotionData( LIST_0 ).setRefIdx ( 1 );
getMbMotionData( LIST_0 ).setAllMv( cMvPred );
}
Void MbDataAccess::getMvPredictorSkipMode( Mv& rcMvPred )
{
xGetMvPredictor( rcMvPred, 1, LIST_0, MEDIAN, B4x4Idx(0), B4x4Idx(3) );
if( ( m_cMv3D_A.getRef()==BLOCK_NOT_AVAILABLE ||
m_cMv3D_B.getRef()==BLOCK_NOT_AVAILABLE ) ||
( m_cMv3D_A.getHor()==0 && m_cMv3D_A.getVer()==0 && m_cMv3D_A.getRef()==1 ) ||
( m_cMv3D_B.getHor()==0 && m_cMv3D_B.getVer()==0 && m_cMv3D_B.getRef()==1 ) )
{
rcMvPred.setZero();
}
}
Void MbDataAccess::getMvPredictors( Mv* pcMv ) const
{
pcMv[ 0 ] = m_cMv3D_A;
pcMv[ 1 ] = m_cMv3D_B;
pcMv[ 2 ] = m_cMv3D_C;
}
Void MbDataAccess::setAvailableMask()
{
B4x4Idx cIdx;
B4x4Idx cIdx0(0);
B4x4Idx cIdx3(3);
B4x4Idx cIdx8(8);
//===== get availability for upper half of the macroblock =====
UInt bAvailable0 = 0;
if( ! xIsAvailableIntra( xGetBlockLeft( ( cIdx = cIdx0 ) ) ) )
{
bAvailable0 |= NO_LEFT_REF;
}
if( ! xIsAvailableIntra( xGetBlockAbove( ( cIdx = cIdx0 ) ) ) )
{
bAvailable0 |= NO_ABOVE_REF;
}
if( ! xIsAvailableIntra( xGetBlockAboveLeft( ( cIdx = cIdx0 ) ) ) )
{
bAvailable0 |= NO_ABOVELEFT_REF;
}
if( ! xIsAvailableIntra( xGetBlockAboveRight( ( cIdx = cIdx3 ) ) ) )
{
bAvailable0 |= NO_ABOVERIGHT_REF;
}
//===== get availability for lower half of the macroblock =====
UInt bAvailable8 = NO_ABOVERIGHT_REF;
if( ! xIsAvailableIntra( xGetBlockLeft( ( cIdx = cIdx8 ) ) ) )
{
bAvailable8 |= NO_LEFT_REF;
}
if( ! xIsAvailableIntra( xGetBlockAboveLeft( ( cIdx = cIdx8 ) ) ) )
{
bAvailable8 |= NO_ABOVELEFT_REF;
}
if( ! getMbData().getFieldFlag() && m_rcMbLeft.getFieldFlag() )
{
if( ! ( bAvailable0 & NO_LEFT_REF ) )
{
if( ! xIsAvailableIntra( xGetBlockLeftBottom( cIdx = cIdx0 ) ) )
{
bAvailable0 |= NO_LEFT_REF;
}
}
if( ! ( bAvailable8 & NO_LEFT_REF ) )
{
if( ! xIsAvailableIntra( xGetBlockLeftBottom( cIdx = cIdx0 ) ) )
{
bAvailable8 |= NO_LEFT_REF;
}
}
}
m_uiAvailable = bAvailable0 + ( bAvailable8 << 4 );
}
UInt MbDataAccess::getConvertBlkMode( Par8x8 ePar8x8 )
{
const BlkMode eBlkMode = m_rcMbCurr.getBlkMode( ePar8x8 );
AOT_DBG( m_rcSliceHeader.isIntraSlice() );
ROTRS( ! m_rcSliceHeader.isBSlice(), eBlkMode - BLK_8x8 );
UInt uiCode;
UInt uiFwdBwd = m_rcMbCurr.getBlockFwdBwd( ePar8x8 );
switch( eBlkMode )
{
case BLK_SKIP:
{
uiCode = 0;
break;
}
case BLK_8x8:
{
uiCode = uiFwdBwd;
break;
}
case BLK_8x4:
{
uiCode = 2+2*uiFwdBwd;
break;
}
case BLK_4x8:
{
uiCode = 3+2*uiFwdBwd;
break;
}
case BLK_4x4:
{
uiCode = 9 + uiFwdBwd;
break;
}
default:
{
AF();
return MSYS_UINT_MAX;
}
}
return uiCode;
}
ErrVal MbDataAccess::setConvertBlkMode( Par8x8 ePar8x8, UInt uiBlockMode )
{
if( m_rcSliceHeader.isBSlice() )
{
ROT( uiBlockMode > 13 );
m_rcMbCurr.setBlkMode( ePar8x8, m_aucBMTabB0[uiBlockMode] );
m_rcMbCurr.addFwdBwd( ePar8x8, m_aucBMTabB1[uiBlockMode] );
return Err::m_nOK;
}
else
{
ROT( uiBlockMode >= 4 );
m_rcMbCurr.setBlkMode( ePar8x8, m_aucBMTabP[uiBlockMode] );
m_rcMbCurr.addFwdBwd( ePar8x8, 1 );
return Err::m_nOK;
}
return Err::m_nERR;
}
UInt MbDataAccess::getConvertMbType()
{
MbMode eMbMode = m_rcMbCurr.getMbMode();
ROTRS( m_rcSliceHeader.isPSlice(), eMbMode );
ROTRS( m_rcSliceHeader.isIntraSlice(), eMbMode - INTRA_4X4 );
if( m_rcSliceHeader.isBSlice() )
{
UInt uiMbType = 0;
switch( eMbMode )
{
case MODE_SKIP:
{
uiMbType = 1;
break;
}
case MODE_16x16:
{
uiMbType = 1 + m_rcMbCurr.getBlockFwdBwd( B_8x8_0 );
break;
}
case MODE_16x8:
{
UInt uiIndex = 3*m_rcMbCurr.getBlockFwdBwd( B_8x8_0 );
uiIndex -= m_rcMbCurr.getBlockFwdBwd( B_8x8_2 );
uiMbType = 1 + m_aucMbType1x2[uiIndex];
break;
}
case MODE_8x16:
{
UInt uiIndex = 3*m_rcMbCurr.getBlockFwdBwd( B_8x8_0 );
uiIndex -= m_rcMbCurr.getBlockFwdBwd( B_8x8_1 );
uiMbType = 1 + m_aucMbType2x1[uiIndex];
break;
}
case MODE_8x8:
{
uiMbType = 1 + 22;
break;
}
case MODE_PCM:
{
uiMbType = 1 + 48;
break;
}
default:
{
ROT( eMbMode < INTRA_4X4 );
uiMbType = 1 + (eMbMode - INTRA_4X4 + 23);
break;
}
}
return uiMbType;
}
AF();
return MSYS_UINT_MAX;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -