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

📄 mbdataaccess.h

📁 JVT-S203 contains the JSVM 6 reference software. It corresponds to CVS tag “JSVM_5_12_1”. For obt
💻 H
📖 第 1 页 / 共 3 页
字号:
  xGetMvPredictor( rcMv, scRef, eListIdx, ePred, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+1 ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx )
{
  xGetMvPredictor( rcMv, scRef, eListIdx, MEDIAN, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+1 ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx8x4 eSParIdx )
{
  xGetMvPredictor( rcMv, scRef, eListIdx, MEDIAN, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx+1 ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x8 eSParIdx )
{
  xGetMvPredictor( rcMv, scRef, eListIdx, MEDIAN, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x4 eSParIdx )
{
  xGetMvPredictor( rcMv, scRef, eListIdx, MEDIAN, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx ) );
}


__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx )
{
  xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( 0 ), B4x4Idx( 3 ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx16x8 eParIdx )
{
  xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+3 ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx8x16 eParIdx )
{
  xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+1 ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx8x8 eParIdx )
{
  xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+1 ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx8x4 eSParIdx )
{
  xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx+1 ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x8 eSParIdx )
{
  xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x4 eSParIdx )
{
  xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx ) );
}




__inline SChar MbDataAccess::xGetRefIdxLeft( ListIdx eListIdx, ParIdx8x8 eParIdx ) const
{
  B4x4Idx       cIdx( eParIdx );
  const MbData& rcMbData  = xGetBlockLeft( cIdx );

#if INDEPENDENT_PARSING
  if( m_rcSliceHeader.getSPS().getIndependentParsing() )
  {
    if( rcMbData.getBLSkipFlag() || rcMbData.getBLQRefFlag() || rcMbData.getMbMotionData( eListIdx ).getMotPredFlag( ParIdx8x8( cIdx.b4x4() ) ) )
    {
      return BLOCK_NOT_AVAILABLE;
    }
  }
#endif
  if( m_rcSliceHeader.isInterB() )
  {
    if( rcMbData.getMbMode() == MODE_SKIP || ( rcMbData.getMbMode() == MODE_8x8 && rcMbData.getBlkMode( Par8x8( 2*(cIdx.y()/2) + cIdx.x()/2 ) ) == BLK_SKIP ) )
    return BLOCK_NOT_AVAILABLE;
  }

  SChar  scRefIdx  = rcMbData.getMbMotionData( eListIdx ).getRefIdx( ParIdx8x8( cIdx.b4x4() ) );
  return scRefIdx;
}

__inline SChar MbDataAccess::xGetRefIdxAbove( ListIdx eListIdx, ParIdx8x8 eParIdx ) const
{
  B4x4Idx       cIdx( eParIdx );
  const MbData& rcMbData  = xGetBlockAbove( cIdx );

#if INDEPENDENT_PARSING
  if( m_rcSliceHeader.getSPS().getIndependentParsing() )
  {
    if( rcMbData.getBLSkipFlag() || rcMbData.getBLQRefFlag() || rcMbData.getMbMotionData( eListIdx ).getMotPredFlag( ParIdx8x8( cIdx.b4x4() ) ) )
    {
      return BLOCK_NOT_AVAILABLE;
    }
  }
#endif
  if( m_rcSliceHeader.isInterB() )
  {
    if( rcMbData.getMbMode() == MODE_SKIP || ( rcMbData.getMbMode() == MODE_8x8 && rcMbData.getBlkMode( Par8x8( 2*(cIdx.y()/2) + cIdx.x()/2 ) ) == BLK_SKIP ) )
    return BLOCK_NOT_AVAILABLE;
  }

  SChar  scRefIdx  = rcMbData.getMbMotionData( eListIdx ).getRefIdx( ParIdx8x8( cIdx.b4x4() ) );
  return scRefIdx;
}



__inline Void MbDataAccess::getMvdLeft( Mv& rcMv, ListIdx eListIdx, LumaIdx cIdx ) const
{
  const MbData& rcMbData = xGetBlockLeft( cIdx );
  rcMv = rcMbData.getMbMvdData( eListIdx ).getMv( cIdx );
}

__inline Void MbDataAccess::getMvdAbove( Mv& rcMv, ListIdx eListIdx, LumaIdx cIdx ) const
{
  const MbData& rcMbData = xGetBlockAbove( cIdx );
  rcMv = rcMbData.getMbMvdData( eListIdx ).getMv( cIdx );
}




__inline UInt MbDataAccess::getCtxCoeffCount( LumaIdx cIdx )  const
{
  Bool bLeftAvailable = false;
  UInt uiCoeffCount   = 0;

  {
    B4x4Idx cIdxL( cIdx.b4x4() );
    const MbData& rcMbDataLeft = xGetBlockLeft( cIdxL );

    if( xIsAvailable( rcMbDataLeft ) )
    {
      bLeftAvailable = true;
      uiCoeffCount = rcMbDataLeft.getMbTCoeffs().getCoeffCount( cIdxL );
    }
  }

  const MbData& rcMbDataAbove = xGetBlockAbove( cIdx );
  if( xIsAvailable( rcMbDataAbove ) )
  {
    uiCoeffCount += rcMbDataAbove.getMbTCoeffs().getCoeffCount( cIdx );

    if( bLeftAvailable )
    {
      uiCoeffCount  += 1;
      uiCoeffCount >>= 1;
    }
  }

  if( 4 > uiCoeffCount )
  {
    uiCoeffCount >>= 1;
  }
  else
  {
    uiCoeffCount = ( 8 > uiCoeffCount) ? 2 : 3;
  }

  return uiCoeffCount;
}


__inline UInt MbDataAccess::getCtxCoeffCount( ChromaIdx cIdx )  const
{
  Bool bLeftAvailable = false;
  UInt uiCoeffCount     = 0;

  B4x4Idx       cLumIdx( m_aucChroma2LumaIdx[ cIdx ] );
  Int           iComp = ( cIdx >> 2) << 2;

  {
    B4x4Idx cLumIdxL = cLumIdx;
    const MbData& rcMbDataLeft = xGetBlockLeft( cLumIdxL );

    if( xIsAvailable( rcMbDataLeft ) )
    {
      bLeftAvailable = true;
      uiCoeffCount = rcMbDataLeft.getMbTCoeffs().getCoeffCount( CIdx( iComp + m_auc4x4Idx28x8Idx[ cLumIdxL.b4x4() ] ) );
    }
  }

  const MbData& rcMbDataAbove = xGetBlockAbove( cLumIdx );
  if( xIsAvailable( rcMbDataAbove ) )
  {
    uiCoeffCount += rcMbDataAbove.getMbTCoeffs().getCoeffCount( CIdx( iComp + m_auc4x4Idx28x8Idx[ cLumIdx.b4x4() ] ) );
    if( bLeftAvailable )
    {
      uiCoeffCount  += 1;
      uiCoeffCount >>= 1;
    }
  }

  if( 4 > uiCoeffCount )
  {
    uiCoeffCount >>= 1;
  }
  else
  {
    uiCoeffCount = ( 8 > uiCoeffCount) ? 2 : 3;
  }

  return uiCoeffCount;
}


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

  uiCtx  = ((xGetMbLeft ().getChromaPredMode() > 0) ? 1 : 0);
  uiCtx += ((xGetMbAbove().getChromaPredMode() > 0) ? 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::getCtxMbType() const
{
  UInt uiCtx = ( xGetMbLeft ().isSkiped() ? 0 : 1);
  uiCtx     += ( xGetMbAbove().isSkiped() ? 0 : 1);
#if INDEPENDENT_PARSING
  if( m_rcSliceHeader.getSPS().getIndependentParsing() )
  {
    const MbData& rcMbLeft   = xGetMbLeft ();
    const MbData& rcMbAbove  = xGetMbAbove();
    Bool bSkippedLeft  = ( !rcMbLeft .getBLSkipFlag() && !rcMbLeft .getBLQRefFlag() && rcMbLeft .isSkiped() );
    Bool bSkippedAbove = ( !rcMbAbove.getBLSkipFlag() && !rcMbAbove.getBLQRefFlag() && rcMbAbove.isSkiped() );
    uiCtx              = ( bSkippedLeft  ? 0 : 1 );
    uiCtx             += ( bSkippedAbove ? 0 : 1 );
  }
#endif
  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
{
  return getCtxMbType();
}


__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::getCtxBLQRefFlag() const
{
  const MbData& rcMbDataLeft  = xGetMbLeft  ();
  const MbData& rcMbDataAbove = xGetMbAbove ();

  UInt  uiCtx  = ( rcMbDataLeft .getBLQRefFlag() ? 0 : 1 );
  uiCtx       += ( rcMbDataAbove.getBLQRefFlag() ? 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
{
  UInt uiCtx;
  const MbData& rcMbDataLeft  = xGetMbLeft();
  const MbData& rcMbDataAbove = xGetMbAbove();

  uiCtx  = (( rcMbDataLeft.isIntra4x4() || ! xIsAvailable( rcMbDataLeft ) ) ? 0 : 1);
  uiCtx += ((rcMbDataAbove.isIntra4x4() || ! xIsAvailable( rcMbDataAbove ) ) ? 0 : 1);

#if INDEPENDENT_PARSING
  if( m_rcSliceHeader.getSPS().getIndependentParsing() )
  {
    Bool bIntraLeft  = ( !xIsAvailable( rcMbDataLeft  ) || ( !rcMbDataLeft .getBLSkipFlag() && !rcMbDataLeft .getBLQRefFlag() && rcMbDataLeft .isIntra4x4() ) );
    Bool bIntraAbove = ( !xIsAvailable( rcMbDataAbove ) || ( !rcMbDataAbove.getBLSkipFlag() && !rcMbDataAbove.getBLQRefFlag() && rcMbDataAbove.isIntra4x4() ) );
    uiCtx            = ( bIntraLeft  ? 0 : 1 );
    uiCtx           += ( bIntraAbove ? 0 : 1 );
  }
#endif

  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 )  const
{
  const MbData& rcMbData = xGetBlockLeft( cIdx );

  if( ! xIsAvailable( rcMbData ) )
  {
    return 1;
  }
#if INDEPENDENT_PARSING
  if( m_rcSliceHeader.getSPS().getIndependentParsing() )
  {
    if( !rcMbData.getBLSkipFlag() && !rcMbData.getBLQRefFlag() && rcMbData.isIntra16x16() )
    {
      return rcMbData.isAcCoded() ? 1 : 0;
    }
  }
  else
#endif
  if( rcMbData.isIntra16x16() )
  {
    return rcMbData.isAcCoded() ? 1 : 0;
  }
  return ( rcMbData.getMbCbp() >> m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] ) & 1;
}

__inline UInt MbDataAccess::getAboveLumaCbp( LumaIdx cIdx )  const
{
  const MbData& rcMbData = xGetBlockAbove( cIdx );

  if( ! xIsAvailable( rcMbData ) )
  {
    return 1;
  }
#if INDEPENDENT_PARSING
  if( m_rcSliceHeader.getSPS().getIndependentParsing() )
  {
    if( !rcMbData.getBLSkipFlag() && !rcMbData.getBLQRefFlag() && rcMbData.isIntra16x16() )
    {
      return rcMbData.isAcCoded() ? 1 : 0;
    }
  }
  else
#endif
  if( rcMbData.isIntra16x16() )
  {
    return rcMbData.isAcCoded() ? 1 : 0;
  }
  return ( rcMbData.getMbCbp() >> m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] ) & 1;
}

__inline UInt MbDataAccess::getLeftChromaCbp()  const
{
  const MbData& rcMbData = xGetMbLeft();

#if INDEPENDENT_PARSING
  if( m_rcSliceHeader.getSPS().getIndependentParsing() )
  {
    if( !rcMbData.getBLSkipFlag() && !rcMbData.getBLQRefFlag() && rcMbData.isIntra16x16() )
    {
      return rcMbData.getCbpChroma16x16();
    }
  }
  else

⌨️ 快捷键说明

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