mbdataaccess.cpp
来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 2,199 行 · 第 1/5 页
CPP
2,199 行
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();
}
#if JMVM_ONLY // JVT-U052
B4x4Idx cIdxA = B4x4Idx(0).b4x4();
B4x4Idx cIdxB = B4x4Idx(0).b4x4();
const MbData& rcMbDataA = xGetBlockLeft ( cIdxA );
const MbData& rcMbDataB = xGetBlockAbove ( cIdxB );
long lOffset = 0;
long iNumIcp = 0;
if ( rcMbDataA.getMbIcp().getIcAct() )
{
if (rcMbDataA.getMbMotionData(LIST_0).getRefIdx(ParIdx8x8(0))==1)
{
lOffset += rcMbDataA.getMbIcp().getIcp(ParIdx8x8(0)).getOffset(); iNumIcp++;
}
if (rcMbDataA.getMbMotionData(LIST_0).getRefIdx(ParIdx8x8(1))==1)
{
lOffset += rcMbDataA.getMbIcp().getIcp(ParIdx8x8(1)).getOffset(); iNumIcp++;
}
if (rcMbDataA.getMbMotionData(LIST_0).getRefIdx(ParIdx8x8(2))==1)
{
lOffset += rcMbDataA.getMbIcp().getIcp(ParIdx8x8(2)).getOffset(); iNumIcp++;
}
if (rcMbDataA.getMbMotionData(LIST_0).getRefIdx(ParIdx8x8(3))==1)
{
lOffset += rcMbDataA.getMbIcp().getIcp(ParIdx8x8(3)).getOffset(); iNumIcp++;
}
}
if ( rcMbDataB.getMbIcp().getIcAct() )
{
if (rcMbDataB.getMbMotionData(LIST_0).getRefIdx(ParIdx8x8(0))==1)
{
lOffset += rcMbDataB.getMbIcp().getIcp(ParIdx8x8(0)).getOffset(); iNumIcp++;
}
if (rcMbDataB.getMbMotionData(LIST_0).getRefIdx(ParIdx8x8(1))==1)
{
lOffset += rcMbDataB.getMbIcp().getIcp(ParIdx8x8(1)).getOffset(); iNumIcp++;
}
if (rcMbDataB.getMbMotionData(LIST_0).getRefIdx(ParIdx8x8(2))==1)
{
lOffset += rcMbDataB.getMbIcp().getIcp(ParIdx8x8(2)).getOffset(); iNumIcp++;
}
if (rcMbDataB.getMbMotionData(LIST_0).getRefIdx(ParIdx8x8(3))==1)
{
lOffset += rcMbDataB.getMbIcp().getIcp(ParIdx8x8(3)).getOffset(); iNumIcp++;
}
}
if( iNumIcp > 0 )
{
Icp cIcp;
//{{KHU (JVT-Y033)
if( (lOffset/iNumIcp) == 0 )
{
MbDataAccess::m_rcMbCurr.getMbIcp().setAllIcAct(false);
}
else
{
//}}
cIcp.setOffset( (short)(lOffset/iNumIcp) );
cIcp.setIcAct(1);
MbDataAccess::m_rcMbCurr.getMbIcp().setAllIcp(cIcp);
//{{KHU (JVT-Y033)
}
//}}
}
else
{
MbDataAccess::m_rcMbCurr.getMbIcp().setAllIcAct(false);
}
#endif
}
Void MbDataAccess::getMvPredictors( Mv* pcMv ) const
{
pcMv[ 0 ] = m_cMv3D_A;
pcMv[ 1 ] = m_cMv3D_B;
pcMv[ 2 ] = m_cMv3D_C;
}
Void MbDataAccess::xSetAvailableMask()
{
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;
}
m_uiAvailable = bAvailable0 + ( bAvailable8 << 4 );
}
UInt MbDataAccess::getConvertBlkMode( Par8x8 ePar8x8 )
{
const BlkMode eBlkMode = m_rcMbCurr.getBlkMode( ePar8x8 );
AOT_DBG( m_rcSliceHeader.isIntra() );
ROTRS( ! m_rcSliceHeader.isInterB(), 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.isInterB() )
{
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.isInterP(), eMbMode );
ROTRS( m_rcSliceHeader.isIntra(), eMbMode - INTRA_4X4 );
if( m_rcSliceHeader.isInterB() )
{
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;
}
ErrVal MbDataAccess::setConvertMbType( UInt uiMbType )
{
if( m_rcSliceHeader.isInterB() )
{
if( uiMbType < 23 )
{
m_rcMbCurr.setMbMode( m_aausInterBMbType0[ uiMbType ] );
m_rcMbCurr.setFwdBwd( m_aausInterBMbType1[ uiMbType ] );
return Err::m_nOK;
}
ROT( uiMbType > 25 + 23 );
m_rcMbCurr.setMbMode( MbMode(uiMbType-23+INTRA_4X4) );
m_rcMbCurr.setFwdBwd( 0 );
return Err::m_nOK;
}
if( m_rcSliceHeader.isIntra() )
{
ROT( uiMbType > 25 );
m_rcMbCurr.setMbMode( MbMode(uiMbType + INTRA_4X4) );
m_rcMbCurr.setFwdBwd( 0 );
return Err::m_nOK;
}
// inter P
m_rcMbCurr.setMbMode( MbMode(++uiMbType) );
m_rcMbCurr.setFwdBwd( (uiMbType < INTRA_4X4) ? 0x1111 : 0 );
ROT( uiMbType > 25 + 6 );
return Err::m_nOK;
}
#if JMVM_ONLY // JVT-W081
Bool MbDataAccess::getMvPredictorMotionSkip( ParIdx8x8 eParIdx, RefFrameList& rcList0, RefFrameList& rcList1, MBMotion* FMb)
{
SChar ascRefIdx[2] = { 1, 1 };
Mv aacMv[2][4];
Int offset;
switch (eParIdx)
{
case PART_8x8_0: offset = 0; break;
case PART_8x8_1: offset = 2; break;
case PART_8x8_2: offset = 8; break;
case PART_8x8_3: offset = 10; break;
default:
printf("probihited mapping\n");
}
Int reverseOffset;
switch (eParIdx)
{
case PART_8x8_0: reverseOffset = 0; break;
case PART_8x8_1: reverseOffset = 1; break;
case PART_8x8_2: reverseOffset = 2; break;
case PART_8x8_3: reverseOffset = 3; break;
default:
printf("probihited mapping\n");
}
bool availability = true;
if (FMb->m_iRefMultiViewL0[reverseOffset] == BLOCK_NOT_AVAILABLE)
{
ascRefIdx[LIST_0] = BLOCK_NOT_AVAILABLE;
return false;
}
else if (FMb->m_iRefMultiViewL0[reverseOffset] == BLOCK_NOT_PREDICTED)
{
ascRefIdx[LIST_0] = BLOCK_NOT_PREDICTED;
availability = false;
}
else
{
if (rcList0.getActive())
{
ascRefIdx[LIST_0] = FMb->m_iRefMultiViewL0[reverseOffset];
}
else
{
return false;
}
}
aacMv[0][0].m_sHor = FMb->m_iMvL0Hor[0 + offset];
aacMv[0][1].m_sHor = FMb->m_iMvL0Hor[1 + offset];
aacMv[0][2].m_sHor = FMb->m_iMvL0Hor[4 + offset];
aacMv[0][3].m_sHor = FMb->m_iMvL0Hor[5 + offset];
aacMv[0][0].m_sVer = FMb->m_iMvL0Ver[0 + offset];
aacMv[0][1].m_sVer = FMb->m_iMvL0Ver[1 + offset];
aacMv[0][2].m_sVer = FMb->m_iMvL0Ver[4 + offset];
aacMv[0][3].m_sVer = FMb->m_iMvL0Ver[5 + offset];
if (FMb->m_iRefMultiViewL1[reverseOffset] == BLOCK_NOT_AVAILABLE)
{
ascRefIdx[LIST_1] = BLOCK_NOT_AVAILABLE;
return false;
}
else if (FMb->m_iRefMultiViewL1[reverseOffset] == BLOCK_NOT_PREDICTED)
{
ascRefIdx[LIST_1] = BLOCK_NOT_PREDICTED;
if (availability==false)
{
return false;
}
}
else
{
if (rcList1.getActive())
{
ascRefIdx[LIST_1] = FMb->m_iRefMultiViewL1[reverseOffset];
}
else
{
return false;
}
}
aacMv[1][0].m_sHor = FMb->m_iMvL1Hor[0 + offset];
aacMv[1][1].m_sHor = FMb->m_iMvL1Hor[1 + offset];
aacMv[1][2].m_sHor = FMb->m_iMvL1Hor[4 + offset];
aacMv[1][3].m_sHor = FMb->m_iMvL1Hor[5 + offset];
aacMv[1][0].m_sVer = FMb->m_iMvL1Ver[0 + offset];
aacMv[1][1].m_sVer = FMb->m_iMvL1Ver[1 + offset];
aacMv[1][2].m_sVer = FMb->m_iMvL1Ver[4 + offset];
aacMv[1][3].m_sVer = FMb->m_iMvL1Ver[5 + offset];
for( UInt uiLstIdx = 0; uiLstIdx < 2; uiLstIdx++ )
{
ListIdx eListIdx = ListIdx( uiLstIdx );
MbMotionData& rcMbMotionDataLX = getMbMotionData( eListIdx );
MbMvData& rcMbMvdDataLX = getMbMvdData (eListIdx);
rcMbMotionDataLX.setRefIdx( ascRefIdx[eListIdx], eParIdx );
rcMbMotionDataLX.setAllMv ( aacMv[eListIdx][0], eParIdx, SPART_4x4_0 );
rcMbMotionDataLX.setAllMv ( aacMv[eListIdx][1], eParIdx, SPART_4x4_1 );
rcMbMotionDataLX.setAllMv ( aacMv[eListIdx][2], eParIdx, SPART_4x4_2 );
rcMbMotionDataLX.setAllMv ( aacMv[eListIdx][3], eParIdx, SPART_4x4_3 );
}
return true;
}
#endif // JVT-W081
Bool MbDataAccess::getMvPredictorDirect( ParIdx8x8 eParIdx, Bool& rbOneMv, Bool bFaultTolerant )
{
rbOneMv = getSH().getSPS().getDirect8x8InferenceFlag();
if( getSH().getDirectSpatialMvPredFlag() )
{
xSpatialDirectMode ( eParIdx, rbOneMv );
return true;
}
return xTemporalDirectMode( eParIdx, rbOneMv, bFaultTolerant );
}
// TMM_EC
Bool MbDataAccess::getMvPredictorDirectVirtual( ParIdx8x8 eParIdx, Bool& rbOneMv, Bool bFaultTolerant, RefFrameList& rcRefFrameListL0, RefFrameList& rcRefFrameListL1 )
{
rbOneMv = getSH().getSPS().getDirect8x8InferenceFlag();
return xTemporalDirectModeVirtual( eParIdx, rbOneMv, bFaultTolerant, rcRefFrameListL0, rcRefFrameListL1);
}
// TMM_EC }}
Void MbDataAccess::xSpatialDirectMode( ParIdx8x8 eParIdx, Bool b8x8 )
{
UInt uiLstIdx;
Bool bDirectZeroPred = false;
Bool bAllColNonZero = false;
Bool bColZeroFlagBlk0 = false;
Bool bColZeroFlagBlk1 = false;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?