⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mbdataaccess.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 3 页
字号:
      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 + -