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

📄 mbdataaccess.h

📁 SVC最新更新代码
💻 H
📖 第 1 页 / 共 4 页
字号:
  const MbData& rcMbData = xGetBlockAbove( cIdx );
  rcMv = rcMbData.getMbMvdData( eListIdx ).getMv( cIdx );
  if( rcMbData.getFieldFlag() && ! m_rcMbCurr.getFieldFlag() )
  {
    rcMv.setVer( rcMv.getVer() * 2 );
  }
  else if( ! rcMbData.getFieldFlag() && m_rcMbCurr.getFieldFlag() )
  {
    rcMv.setVer( rcMv.getVer() / 2 );
  }
}


__inline UInt MbDataAccess::getCtxChromaPredMode() const
{
  UInt uiCtx;

  uiCtx  = ((xGetMbLeft ().getChromaPredMode() > 0) ? 1 : 0);
  uiCtx += ((xGetMbAbove().getChromaPredMode() > 0) ? 1 : 0);

  // Support independent parsing of layers
  // -- Current layer blocks will inherit the 
  // -- prediction modes from the lower layer.
  // -- However, this happens after parsing.
  if( getSH().getTCoeffLevelPredictionFlag() )
  {
	  uiCtx -= ( xGetMbLeft().getChromaPredMode() > 0 && xGetMbLeft().isIntraBL() ) ? 1 : 0;
	  uiCtx -= ( xGetMbAbove().getChromaPredMode() > 0 && xGetMbAbove().isIntraBL() ) ? 1 : 0;
  }

  return uiCtx;
}


__inline Int MbDataAccess::mostProbableIntraPredMode( LumaIdx cIdx )
{
  B4x4Idx cIdxL( cIdx.b4x4() );
  B4x4Idx cIdxA( cIdx.b4x4() );

  const MbData& rcMbDataLeft = xGetBlockLeft( cIdxL );
  Int iLeftPredMode  = ( xIsAvailableIntra( rcMbDataLeft ) ? rcMbDataLeft.intraPredMode( cIdxL ) : OUTSIDE);

  const MbData& rcMbDataAbove = xGetBlockAbove( cIdxA );
  Int iAbovePredMode = ( xIsAvailableIntra( rcMbDataAbove ) ? rcMbDataAbove.intraPredMode( cIdxA ) : OUTSIDE);
  Int iMostProbable  = min( iLeftPredMode, iAbovePredMode );

  return ( OUTSIDE == iMostProbable ) ? DC_PRED : iMostProbable;
}

__inline Int MbDataAccess::encodeIntraPredMode( LumaIdx cIdx )
{
  const Int iMostProbable   = mostProbableIntraPredMode( cIdx );
  const Int iIntraPredMode  = m_rcMbCurr.intraPredMode ( cIdx );
  ROTRS( iMostProbable == iIntraPredMode, -1 )

  return (iIntraPredMode < iMostProbable) ? iIntraPredMode : iIntraPredMode-1;
}

__inline Int MbDataAccess::decodeIntraPredMode( LumaIdx cIdx )
{
  const Int iMostProbable   = mostProbableIntraPredMode( cIdx );
  const Int iIntraPredMode  = m_rcMbCurr.intraPredMode ( cIdx );

  ROTRS( -1 == iIntraPredMode, iMostProbable )

  return (iIntraPredMode < iMostProbable) ? iIntraPredMode : iIntraPredMode+1;
}

__inline UInt MbDataAccess::getCtxFieldFlag()  const
{
  UInt uiCtx = (m_rcMbLeft.getFieldFlag() ? 1: 0);

  if( m_bMbAff && ! isTopMb() )
  {
    uiCtx += (m_rcMbAboveAbove.getFieldFlag() ? 1: 0);
  }
  else
  {
    uiCtx += (m_rcMbAbove.getFieldFlag() ? 1: 0);
  }

  return uiCtx;
}

__inline UInt MbDataAccess::getCtxMbType() const
{
  const MbData& rcMbLeft   = xGetMbLeft ();
  const MbData& rcMbAbove  = xGetMbAbove();
  Bool bSkippedLeft  = ( !rcMbLeft .getBLSkipFlag() && rcMbLeft .isSkiped() );
  Bool bSkippedAbove = ( !rcMbAbove.getBLSkipFlag() && rcMbAbove.isSkiped() );
  UInt uiCtx         = ( bSkippedLeft  ? 0 : 1 );
  uiCtx             += ( bSkippedAbove ? 0 : 1 );
  return uiCtx;
}


__inline UInt MbDataAccess::getCtx8x8Flag( UInt uiStart, UInt uiStop ) const
{
  const MbData &rcLeft  = xGetMbLeft();
  const MbData &rcAbove = xGetMbAbove();
  UInt uiCtx = 0;
  Bool bLeftTs8x8    = rcLeft.isTransformSize8x8();
  Bool bLeftIntra4x4 = rcLeft.isIntra4x4();
  Bool bLeftCoeff    = (rcLeft.calcMbCbp( uiStart, uiStop ) & 0x0F) != 0;
  if( bLeftTs8x8 && (bLeftIntra4x4 || bLeftCoeff) )
  {
    uiCtx++;
  }

  Bool bAboveTs8x8    = rcAbove.isTransformSize8x8();
  Bool bAboveIntra4x4 = rcAbove.isIntra4x4();
  Bool bAboveCoeff    = (rcAbove.calcMbCbp( uiStart, uiStop ) & 0x0F) != 0;
  if( bAboveTs8x8 && (bAboveIntra4x4 || bAboveCoeff) )
  {
    uiCtx++;
  }

  return uiCtx;
}



__inline UInt MbDataAccess::getCtx8x8Flag() const
{
  UInt uiCtx = ( xGetMbLeft ().isTransformSize8x8() ? 1 : 0);
  uiCtx     += ( xGetMbAbove().isTransformSize8x8() ? 1 : 0);
  return uiCtx;
}


__inline UInt MbDataAccess::getCtxMbSkipped() const
{
  const Bool bFieldFlag = m_rcMbCurr.getFieldFlag();

  if( m_bMbAff && ( isTopMb() || m_rcMbComplementary.getSkipFlag()  ) )
  {
    m_rcMbCurr.setFieldFlag( getDefaultFieldFlag() );
  }

  const MbData& rcMbDataLeft   = xGetMbLeft();
  const MbData& rcMbDataAbove   = xGetMbAbove();

  UInt uiCtx = (( rcMbDataLeft .getSkipFlag()) ? 0 : 1);
  uiCtx     += (( rcMbDataAbove.getSkipFlag()) ? 0 : 1);


  m_rcMbCurr.setFieldFlag( bFieldFlag );
  return uiCtx;
}


__inline UInt MbDataAccess::getCtxBLSkipFlag() const
{
  const MbData& rcMbDataLeft  = xGetMbLeft  ();
  const MbData& rcMbDataAbove = xGetMbAbove ();

  UInt  uiCtx  = ( rcMbDataLeft .getBLSkipFlag() ? 0 : 1 );
  uiCtx       += ( rcMbDataAbove.getBLSkipFlag() ? 0 : 1 );

  return uiCtx;
}


__inline UInt MbDataAccess::getCtxDirectMbWoCoeff() const
{
  const MbData& rcMbDataLeft   = xGetMbLeft();
  const MbData& rcMbDataAbove  = xGetMbAbove();

  UInt uiCtx = (( rcMbDataLeft .getSkipFlag()) ? 0 : 1);
  uiCtx     += (( rcMbDataAbove.getSkipFlag()) ? 0 : 1);

  return uiCtx;
}


__inline UInt MbDataAccess::getCtxMbIntra4x4() const
{
  const MbData& rcMbDataLeft  = xGetMbLeft();
  const MbData& rcMbDataAbove = xGetMbAbove();
  Bool bIntraLeft  = ( !xIsAvailable( rcMbDataLeft  ) || ( !rcMbDataLeft .getBLSkipFlag() && rcMbDataLeft .isIntra4x4() ) );
  Bool bIntraAbove = ( !xIsAvailable( rcMbDataAbove ) || ( !rcMbDataAbove.getBLSkipFlag() && rcMbDataAbove.isIntra4x4() ) );
  UInt uiCtx       = ( bIntraLeft  ? 0 : 1 );
  uiCtx           += ( bIntraAbove ? 0 : 1 );
  return uiCtx;
}

__inline UInt MbDataAccess::getCtxRefIdx( ListIdx eLstIdx, ParIdx8x8 eParIdx ) const
{
  UInt uiCtx;

  uiCtx  = xGetRefIdxAbove( eLstIdx, eParIdx ) > 1 ? 2 : 0;
  uiCtx += xGetRefIdxLeft ( eLstIdx, eParIdx ) > 1 ? 1 : 0;

  return uiCtx;
}

__inline UInt MbDataAccess::getLeftLumaCbp( LumaIdx cIdx, UInt uiStart, UInt uiStop, Bool bReCalc )  const
{
  const MbData& rcMbData = xGetBlockLeft( cIdx );

  if( ! xIsAvailable( rcMbData ) )
  {
    return 1;
  }
  if( !rcMbData.getBLSkipFlag() && rcMbData.isIntra16x16() )
  {
    return rcMbData.isAcCoded() ? 1 : 0;
  }
  if( rcMbData.isPCM() )
  {
    return 1;
  }
  if( bReCalc )
  {
    return ( rcMbData.calcMbCbp( uiStart, uiStop ) >> m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] ) & 1;
  }
  return ( rcMbData.getMbCbp() >> m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] ) & 1;
}

__inline UInt MbDataAccess::getAboveLumaCbp( LumaIdx cIdx, UInt uiStart, UInt uiStop, Bool bReCalc )  const
{
  const MbData& rcMbData = xGetBlockAbove( cIdx );

  if( ! xIsAvailable( rcMbData ) )
  {
    return 1;
  }
  if( !rcMbData.getBLSkipFlag() && rcMbData.isIntra16x16() )
  {
    return rcMbData.isAcCoded() ? 1 : 0;
  }
  if( rcMbData.isPCM() )
  {
    return 1;
  }
  if( bReCalc )
  {
    return ( rcMbData.calcMbCbp( uiStart, uiStop ) >> m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] ) & 1;
  }
  return ( rcMbData.getMbCbp() >> m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] ) & 1;
}

__inline UInt MbDataAccess::getLeftChromaCbp( UInt uiStart, UInt uiStop, Bool bReCalc )  const
{
  const MbData& rcMbData = xGetMbLeft();

  if( !rcMbData.getBLSkipFlag() && rcMbData.isIntra16x16() )
  {
    return rcMbData.getCbpChroma16x16();
  }
  if( rcMbData.isPCM() )
  {
    return 2;
  }
  if( bReCalc )
  {
    return rcMbData.calcMbCbp( uiStart, uiStop ) >> 4;
  }
  return rcMbData.getMbCbp() >> 4;
}

__inline UInt MbDataAccess::getAboveChromaCbp( UInt uiStart, UInt uiStop, Bool bReCalc )  const
{
  const MbData& rcMbData = xGetMbAbove();

  if( !rcMbData.getBLSkipFlag() && rcMbData.isIntra16x16() )
  {
    return rcMbData.getCbpChroma16x16();
  }
  if( rcMbData.isPCM() )
  {
    return 2;
  }
  if( bReCalc )
  {
    return rcMbData.calcMbCbp( uiStart, uiStop ) >> 4;
  }
  return rcMbData.getMbCbp() >> 4;
}



__inline UInt MbDataAccess::xGetLeftCodedBlockBit( UInt uiBit, UInt uiStart, UInt uiStop, Bool bReCalc )  const
{
  AOT( uiBit > 26 );

  if( uiBit >= 24 ) // macroblock based stuff
  {
    const MbData& rcMbData = xGetMbLeft();
    if( ! xIsAvailable( rcMbData ) )
    {
      return ( !m_rcMbCurr.getBLSkipFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
    }
    if( rcMbData.isPCM() )
    {
      return 1;
    }
    if( bReCalc )
    {
      return rcMbData.calcBCBP( uiStart, uiStop, uiBit );
    }
    return rcMbData.getBCBP( uiBit );
  }

  if( uiBit < 16 ) // luma block based
  {
    B4x4Idx       cIdx( uiBit );
    const MbData& rcMbData = xGetBlockLeft( cIdx );
    if( ! xIsAvailable( rcMbData ) )
    {
      return ( !m_rcMbCurr.getBLSkipFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
    }
    if( rcMbData.isPCM() )
    {
      return 1;
    }
    if( bReCalc )
    {
      return rcMbData.calcBCBP( uiStart, uiStop, cIdx.b4x4() );
    }
    return rcMbData.getBCBP( cIdx.b4x4() );
  }
  // chroma block based
  B4x4Idx       cIdx( m_aucChroma2LumaIdx[ uiBit - 16 ] );
  Int           iOffset   = ( uiBit >= 20 ? 20 : 16 );
  const MbData& rcMbData  = xGetBlockLeft( cIdx );
  if( ! xIsAvailable( rcMbData ) )
  {
    return ( !m_rcMbCurr.getBLSkipFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
  }
  if( rcMbData.isPCM() )
  {
    return 1;
  }
  if( bReCalc )
  {
    return rcMbData.calcBCBP( uiStart, uiStop, m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] + iOffset );
  }
  return rcMbData.getBCBP( m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] + iOffset );
}

__inline UInt MbDataAccess::xGetAboveCodedBlockBit( UInt uiBit, UInt uiStart, UInt uiStop, Bool bReCalc )  const
{
  AOT( uiBit > 26 );

  if( uiBit >= 24 ) // macroblock based stuff
  {
    const MbData& rcMbData = xGetMbAbove();
    if( ! xIsAvailable( rcMbData ) )
    {
      return ( !m_rcMbCurr.getBLSkipFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
    }
    if( rcMbData.isPCM() )
    {
      return 1;
    }
    if( bReCalc )
    {
      return rcMbData.calcBCBP( uiStart, uiStop, uiBit );
    }
    return rcMbData.getBCBP( uiBit );
  }
  if( uiBit < 16 ) // luma block based
  {
    B4x4Idx       cIdx( uiBit );
    const MbData& rcMbData = xGetBlockAbove( cIdx );

⌨️ 快捷键说明

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