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

📄 cabacreader.cpp

📁 JMVM MPEG MVC/3DAV 测试平台 国际通用标准
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
            if( 0 != uiSymbol )
            {
              uiBlockMode = 10;
              RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
              uiBlockMode += uiSymbol;
            }
            else
            {
              uiBlockMode = 6;
              RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
              uiBlockMode += uiSymbol << 1;
              RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
              uiBlockMode += uiSymbol;
            }
          }
          else
          {
            uiBlockMode = 2;
            RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
            uiBlockMode += uiSymbol << 1;
            RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
            uiBlockMode += uiSymbol;
          }
        }
        else
        {
          RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
          uiBlockMode = uiSymbol;
        }
        uiBlockMode++;
      }
    }

    DTRACE_T( "BlockMode" );
    DTRACE_TY( "ae(v)" );
    DTRACE_CODE(uiBlockMode);
    DTRACE_N;

    rcMbDataAccess.setConvertBlkMode( c8x8Idx.b8x8Index(), uiBlockMode );
  }

  return Err::m_nOK;
}

#if JMVM_ONLY //JVT-Z021
ErrVal  CabacReader::MotionSkipOffset( MbDataAccess& rcMbDataAccess )

{

	ListIdx eListIdx;

	eListIdx = (rcMbDataAccess.getMbData().m_pcMbImsm->m_iListXFlag == (Int)LIST_0) ? LIST_0 : LIST_1;



	Mv cMv;

	DECRNOK( xReadOffset( rcMbDataAccess, cMv, eListIdx ) );





	rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset = cMv;





	return Err::m_nOK;

}

ErrVal CabacReader::xReadOffset( MbDataAccess& rcMbDataAccess, Mv& cMv, ListIdx eLstIdx )

{

	Mv    cMvA;

	Mv    cMvB;



	rcMbDataAccess.getOffsetAbove( cMvA, eLstIdx );

	rcMbDataAccess.getOffsetLeft ( cMvB, eLstIdx );



	Short sHor = cMv.getHor();

	Short sVer = cMv.getVer();



	DECRNOK( xReadOffsetComponent( sHor, cMvA.getAbsHor() + cMvB.getAbsHor(), 0 ) );

	cMv.setHor(sHor);



	DTRACE_T( "Offset: x" );

	DTRACE_TY( "ae(v)" );

	DTRACE_V( sHor );

	DTRACE_T( " above " );

	DTRACE_V( cMvA.getHor() );

	DTRACE_T( " left " );

	DTRACE_V( cMvB.getHor() );

	DTRACE_N;



	DECRNOK( xReadOffsetComponent( sVer, cMvA.getAbsVer() + cMvB.getAbsVer(), 5 ) );

	cMv.setVer(sVer);



	DTRACE_T( "Offset: y" );

	DTRACE_TY( "ae(v)" );

	DTRACE_V( sVer );

	DTRACE_T( " above " );

	DTRACE_V( cMvA.getVer() );

	DTRACE_T( " left " );

	DTRACE_V( cMvB.getVer() );

	DTRACE_N;



	return Err::m_nOK;

}

ErrVal CabacReader::xReadOffsetComponent( Short& rsOffsetComp, UInt uiAbsSum, UInt uiCtx )

{

	UInt uiLocalCtx = uiCtx;



	if(uiAbsSum >= 3)

	{

		uiLocalCtx += ( uiAbsSum > 5) ? 3 : 2;

	}



	rsOffsetComp = 0;

	UInt uiSymbol;

	RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cOffsetCCModel.get( 0, uiLocalCtx ) ) );

	ROTRS( 0 == uiSymbol, Err::m_nOK );





	RNOKCABAC(CabaDecoder::getMSuOffset(uiSymbol,&m_cOffsetCCModel.get(1,uiCtx),0, 3));



	uiSymbol++;



	UInt uiSign;

	RNOKCABAC( CabaDecoder::getEpSymbol( uiSign ) );



	rsOffsetComp = ( 0 != uiSign ) ? -(Int)uiSymbol : (Int)uiSymbol;



	return Err::m_nOK;

}



ErrVal  CabacReader::MotionSkipListXFlag( MbDataAccess& rcMbDataAccess )

{

	UInt  uiSymbol = 0;

	UInt uiCtx    = rcMbDataAccess.getCtxMotionSkipListXFlag();



	CabaDecoder::getSymbol( uiSymbol, m_cMotionSkipListXFlagCCModel.get( 0, uiCtx ) );



	uiSymbol ^= rcMbDataAccess.getMbDataLeft().m_pcMbImsm->m_iListXFlag;





	DTRACE_T( "MotionSkipListXFlag" );

	DTRACE_TY( "ae(v)" );

	DTRACE_CODE( uiSymbol );

	DTRACE_N;



	rcMbDataAccess.getMbData().m_pcMbImsm->m_iListXFlag = uiSymbol;

	return Err::m_nOK;

}

#endif //JVT-Z021

Bool CabacReader::isMbSkipped( MbDataAccess& rcMbDataAccess )
{
  ROTRS( rcMbDataAccess.getSH().isIntra(), false );
  UInt uiSymbol;

  if( rcMbDataAccess.getSH().isInterB() )
  {
    CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 7 + rcMbDataAccess.getCtxDirectMbWoCoeff() ) );
    rcMbDataAccess.getMbData().setSkipFlag(0!=uiSymbol);
  }
  else
  {
    CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, rcMbDataAccess.getCtxMbSkipped() ) );
  }


  ROTRS( 0 == uiSymbol, false );
  m_uiLastDQpNonZero = 0; // no DeltaQP for Skipped Macroblock
  DTRACE_T( "MbMode" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE( 0 );
  DTRACE_N;
  return true;
}


Bool CabacReader::isBLSkipped( MbDataAccess& rcMbDataAccess )
{
  UInt uiSymbol = 0;
  UInt uiCtx    = rcMbDataAccess.getCtxBLSkipFlag();

  CabaDecoder::getSymbol( uiSymbol, m_cBLSkipCCModel.get( 0, uiCtx ) );

  DTRACE_T( "BLSkipFlag" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE( uiSymbol );
  DTRACE_N;

  rcMbDataAccess.getMbData().setBLSkipFlag( ( uiSymbol != 0 ) );
  return rcMbDataAccess.getMbData().getBLSkipFlag();
}

#if JMVM_ONLY  // JVT-W081
Bool CabacReader::isMotionSkipped( MbDataAccess& rcMbDataAccess )
{
  UInt uiSymbol = 0;
  UInt uiCtx    = rcMbDataAccess.getCtxMotionSkipFlag();

  CabaDecoder::getSymbol( uiSymbol, m_cMotionSkipCCModel.get( 0, uiCtx ) );

  DTRACE_T( "MotionSKipFlag" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE( uiSymbol );
  DTRACE_N;

  rcMbDataAccess.getMbData().setMotionSkipFlag(( uiSymbol != 0 ) );
  return rcMbDataAccess.getMbData().getMotionSkipFlag();
}
#endif  // JVT-W081

ErrVal CabacReader::resPredFlag( MbDataAccess& rcMbDataAccess )
{
  UInt  uiSymbol;
  UInt  uiCtx = ( rcMbDataAccess.getMbData().getBLSkipFlag() ? 0 : 1 );

  RNOK( CabaDecoder::getSymbol( uiSymbol, m_cResPredFlagCCModel.get( 0, uiCtx ) ) );
  rcMbDataAccess.getMbData().setResidualPredFlag( (uiSymbol!=0) );

  DTRACE_T( "ResidualPredFlag" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE( uiSymbol );
  DTRACE_N;

  return Err::m_nOK;
}

ErrVal CabacReader::resPredFlag_FGS( MbDataAccess& rcMbDataAccess, Bool bBaseCoeff )
{
  UInt  uiSymbol;
  UInt  uiCtx = ( bBaseCoeff ? 2 : 3 );

  RNOK( CabaDecoder::getSymbol( uiSymbol, m_cResPredFlagCCModel.get( 0, uiCtx ) ) );
  rcMbDataAccess.getMbData().setResidualPredFlag( (uiSymbol!=0) );

  DTRACE_T( "ResidualPredFlag" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE( uiSymbol );
  DTRACE_N;

  return Err::m_nOK;
}


//-- JVT-R091
ErrVal CabacReader::smoothedRefFlag( MbDataAccess& rcMbDataAccess )
{
  UInt uiSymbol;
  RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cSRFlagCCModel.get( 0, 0 ) ) );
  rcMbDataAccess.getMbData().setSmoothedRefFlag( (uiSymbol!=0) );

  DTRACE_T( "SmoothedRefFlag:" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE( uiSymbol );
  DTRACE_N;

  return Err::m_nOK;
}
//--

ErrVal CabacReader::mbMode( MbDataAccess& rcMbDataAccess )
{
  rcMbDataAccess.getMbData().setBCBPAll( 0 );

  UInt uiMbMode;
  UInt act_sym;
  UInt mod_sym;

  if( rcMbDataAccess.getSH().isIntra() )
  {
    RNOKCABAC( CabaDecoder::getSymbol( act_sym, m_cMbTypeCCModel.get( 0, rcMbDataAccess.getCtxMbIntra4x4() ) ) );

    if( 0 != act_sym )
    {
      RNOKCABAC( CabaDecoder::getTerminateBufferBit( act_sym ) )
      if( 0 != act_sym )
      {
        act_sym = 25;
      }
      else
      {
        RNOKCABAC( CabaDecoder::getSymbol( act_sym, m_cMbTypeCCModel.get( 0, 4 ) ) );
        act_sym = 12* act_sym + 1;

        RNOKCABAC( CabaDecoder::getSymbol( mod_sym, m_cMbTypeCCModel.get( 0, 5 ) ) );

        if( 0 != mod_sym )
        {
          RNOKCABAC( CabaDecoder::getSymbol( mod_sym, m_cMbTypeCCModel.get( 0, 6 ) ) );
          act_sym += ++mod_sym << 2;
        }

        RNOKCABAC( CabaDecoder::getSymbol( mod_sym, m_cMbTypeCCModel.get( 0, 7 ) ) );
        act_sym += mod_sym << 1;

        RNOKCABAC( CabaDecoder::getSymbol( mod_sym, m_cMbTypeCCModel.get( 0, 8 ) ) );
        act_sym += mod_sym;
      }
    }
    uiMbMode = act_sym;
  }
  else
  {
    uiMbMode = 0;
    UInt uiSymbol;

    if( ! rcMbDataAccess.getSH().isInterB() )
    {
      RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 4 ) ) );
      if( 0 != uiSymbol )
      {
        RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 7 ) ) );
        uiMbMode = ( 0 != uiSymbol ) ? 7 : 6;
      }
      else
      {
        RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 5 ) ) );
        if( 0 != uiSymbol )
        {
          RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 7 ) ) );
          uiMbMode = ( 0 != uiSymbol ) ? 2 : 3;
        }
        else
        {
          RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 6 ) ) );
          uiMbMode = ( 0 != uiSymbol ) ? 4 : 1;
        }
      }
    }
    else
    {
      RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, rcMbDataAccess.getCtxMbType() ) ) );
      if( 0 != uiSymbol )
      {
        RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 4 ) ) );
        if( 0 != uiSymbol )
        {
          RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 5 ) ) );
          if( 0 != uiSymbol )
          {
            uiMbMode = 12;
            RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
            uiMbMode += uiSymbol << 3;
            RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
            uiMbMode += uiSymbol << 2;
            RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
            uiMbMode += uiSymbol << 1;
            if( 24 == uiMbMode)
            {
              uiMbMode = 11;
            }
            else
            {
              if( 26 == uiMbMode)
              {
                uiMbMode = 22;
              }
              else
              {
                if( 22 == uiMbMode)
                {
                  uiMbMode = 23;
                }
                RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
                uiMbMode += uiSymbol;
              }
            }
          }
          else
          {
            uiMbMode = 3;
            RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
            uiMbMode += uiSymbol << 2;
            RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
            uiMbMode += uiSymbol << 1;
            RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
            uiMbMode += uiSymbol;
          }
        }
        else
        {
          RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
          uiMbMode = ( 0 != uiSymbol ) ? 2 : 1;
        }
      }
    }

    if( ! ( uiMbMode <= 6 || (rcMbDataAccess.getSH().isInterB() && uiMbMode <= 23) ) )
    {
      RNOKCABAC( CabaDecoder::getTerminateBufferBit( uiSymbol ) )
      if( 0 != uiSymbol )
      {
        uiMbMode += ( rcMbDataAccess.getSH().isInterB() ) ? 22 : 24;
      }
      else
      {
        RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 8 ) ) );
        uiMbMode += ( 0 != uiSymbol ) ? 12 : 0;

        RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 9 ) ) );
        if( 0 != uiSymbol )
        {
          RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 9 ) ) );
          uiMbMode += ( 0 != uiSymbol ) ? 8 : 4;
        }

        RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 10 ) ) );
        uiMbMode += uiSymbol << 1;
        RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 10 ) ) );
        uiMbMode += uiSymbol;
      }
    }
    if( ! rcMbDataAccess.getSH().isInterB() )
    {
      uiMbMode--;
    }
  }

  rcMbDataAccess.setConvertMbType( uiMbMode );

  DTRACE_T( "MbMode" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE( ( ! rcMbDataAccess.getSH().isIntra()) ? uiMbMode+1:uiMbMode );
  DTRACE_N;

  return Err::m_nOK;
}




ErrVal CabacReader::xGetMvdComponent( Short& rsMvdComp, UInt uiAbsSum, UInt uiCtx )
{

  UInt uiLocalCtx = uiCtx;

  if( uiAbsSum >= 3)
  {
    uiLocalCtx += ( uiAbsSum > 32) ? 3 : 2;
  }

  rsMvdComp = 0;

⌨️ 快捷键说明

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