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 + -
显示快捷键?