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

📄 mbdataaccess.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 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();
  }

	const Frame* pcFrame = ( m_rcSliceHeader.getRefPic ( 1, getMbPicType(), LIST_0 ).getFrame() );
  getMbMotionData( LIST_0 ).setRefIdx ( 1 );
  getMbMotionData( LIST_0 ).setRefPic( pcFrame );
  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.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;
}


Bool MbDataAccess::getMvPredictorDirect( ParIdx8x8 eParIdx, 
                                         Bool& rbOneMv, 
                                         Bool bFaultTolerant, 
                                         RefFrameList* pcL0RefFrameList, 
                                         RefFrameList* pcL1RefFrameList )
{
  rbOneMv = getSH().getSPS().getDirect8x8InferenceFlag();

  if( getSH().getDirectSpatialMvPredFlag() )
  {
    return xSpatialDirectMode ( eParIdx, rbOneMv, pcL0RefFrameList, pcL1RefFrameList );
  }

  return xTemporalDirectMode( eParIdx, rbOneMv, bFaultTolerant );
}

//	TMM_EC
Bool MbDataAccess::getMvPredictorDirectVirtual( ParIdx8x8 eParIdx, 
                                                Bool& rbOneMv, 
                                                Bool bFaultTolerant, 
                                                RefFrameList& rcL0RefFrameList, 
                                                RefFrameList& rcL1RefFrameList )
{
  rbOneMv = getSH().getSPS().getDirect8x8InferenceFlag();
  return xTemporalDirectModeVirtual( eParIdx, rbOneMv, bFaultTolerant, rcL0RefFrameList, rcL1RefFrameList);
}
//	TMM_EC }}

Bool MbDataAccess::xSpatialDirectMode( ParIdx8x8 eParIdx, Bool b8x8, RefFrameList* pcL0RefFrameList, RefFrameList* pcL1RefFrameList )

{
  UInt          uiLstIdx;
  Bool          bDirectZeroPred   = false;
  Bool          bAllColNonZero    = false;
  Bool          bColZeroFlagBlk0  = false;
  Bool          bColZeroFlagBlk1  = false;
  Bool          bColZeroFlagBlk2  = false;
  Bool          bColZeroFlagBlk3  = false;

  //===== get reference indices and spatially predicted motion vectors =====
  Mv    acMvPred[2];
  SChar ascRefIdx[2];
  xSetNeighboursMvPredictor(LIST_0, B4x4Idx(0), B4x4Idx(3) );
  if( ( ascRefIdx[LIST_0] = m_cMv3D_A.minRefIdx( m_cMv3D_B ).minRefIdx( m_cMv3D_C ).getRef() ) > 0 )
  {
    xGetMvPredictorUseNeighbours( acMvPred[LIST_0], ascRefIdx[LIST_0], MEDIAN );
  }
  xSetNeighboursMvPredictor(LIST_1, B4x4Idx(0), B4x4Idx(3) );
  if( ( ascRefIdx[LIST_1] = m_cMv3D_A.minRefIdx( m_cMv3D_B ).minRefIdx( m_cMv3D_C ).getRef() ) > 0 )
  {
    xGetMvPredictorUseNeighbours( acMvPred[LIST_1], ascRefIdx[LIST_1], MEDIAN );
  }

  //===== check reference indices =====
  if( ascRefIdx[LIST_0] < 1 && ascRefIdx[LIST_1] < 1 )
  {
    ascRefIdx[LIST_0] = 1;
    ascRefIdx[LIST_1] = 1;
    bDirectZeroPred   = true;
    bAllColNonZero    = true;
  }

  //===== check co-located =====
  if( ! bAllColNonZero )
  {
    SChar   scRefIdxCol;
    Mv      acMvCol[4];

    if( ! bAllColNonZero )
    {
      if( NULL != pcL0RefFrameList && NULL != pcL1RefFrameList )
      {
        // no Long term support
        bAllColNonZero          = false;
      }
      else
      {
        const RefPic& rcRefPic  = m_rcSliceHeader.getRefPic( 1, getMbPicType(), LIST_1 );
        bAllColNonZero          = ( ! rcRefPic.getFrame()->isShortTerm() );
      }
    }

    if( ! bAllColNonZero )
    {
      if( b8x8 )
      {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -