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

📄 cabacreader.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 3 页
字号:
  DTRACE_T( "BLSkipFlag" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE( uiSymbol );
  DTRACE_N;

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

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::mbMode( MbDataAccess& rcMbDataAccess )
{
  rcMbDataAccess.getMbData().setBCBPAll( 0 );

  UInt uiMbMode;
  UInt act_sym;
  UInt mod_sym;

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

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

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

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

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

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

    if( ! rcMbDataAccess.getSH().isBSlice() )
    {
      RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 4 ) ) );
      if( 0 != uiSymbol )
      {
        RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 7 ) ) );
        uiMbMode = ( 0 != uiSymbol ) ? 7 : 6;
      }
      else
      {
        RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 5 ) ) );
        if( 0 != uiSymbol )
        {
          RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 7 ) ) );
          uiMbMode = ( 0 != uiSymbol ) ? 2 : 3;
        }
        else
        {
          RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 6 ) ) );
          uiMbMode = ( 0 != uiSymbol ) ? 4 : 1;
        }
      }
    }
    else
    {
      RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, rcMbDataAccess.getCtxMbType() ) ) );
      if( 0 != uiSymbol )
      {
        RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 4 ) ) );
        if( 0 != uiSymbol )
        {
          RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 5 ) ) );
          if( 0 != uiSymbol )
          {
            uiMbMode = 12;
            RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
            uiMbMode += uiSymbol << 3;
            RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
            uiMbMode += uiSymbol << 2;
            RNOK( 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;
                }
                RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
                uiMbMode += uiSymbol;
              }
            }
          }
          else
          {
            uiMbMode = 3;
            RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
            uiMbMode += uiSymbol << 2;
            RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
            uiMbMode += uiSymbol << 1;
            RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
            uiMbMode += uiSymbol;
          }
        }
        else
        {
          RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
          uiMbMode = ( 0 != uiSymbol ) ? 2 : 1;
        }
      }
    }

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

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

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

  rcMbDataAccess.setConvertMbType( uiMbMode );

  DTRACE_T( "MbMode" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE( ( ! rcMbDataAccess.getSH().isIntraSlice()) ? 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;

  UInt uiSymbol;
  RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMvdCCModel.get( 0, uiLocalCtx ) ) );

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

  RNOK( CabaDecoder::getExGolombMvd( uiSymbol, &m_cMvdCCModel.get( 1, uiCtx ), 3 ) );
  uiSymbol++;

  UInt uiSign;
  RNOK( CabaDecoder::getEpSymbol( uiSign ) );

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

  return Err::m_nOK;
}


ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx )
{
  Mv cMv;
  DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(0), eLstIdx ) );
  rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv );
  return Err::m_nOK;
}

ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx16x8 eParIdx  )
{
  Mv cMv;
  DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx), eLstIdx ) );
  rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx );
  return Err::m_nOK;
}

ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x16 eParIdx  )
{
  Mv cMv;
  DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx), eLstIdx ) );
  rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx );
  return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8  eParIdx  )
{
  Mv cMv;
  DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx), eLstIdx ) );
  rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx );
  return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8  eParIdx, SParIdx8x4 eSParIdx )
{
  Mv cMv;
  DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx+eSParIdx), eLstIdx ) );
  rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx, eSParIdx );
  return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8  eParIdx, SParIdx4x8 eSParIdx )
{
  Mv cMv;
  DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx+eSParIdx), eLstIdx ) );
  rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx, eSParIdx );
  return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8  eParIdx, SParIdx4x4 eSParIdx )
{
  Mv cMv;
  DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx+eSParIdx), eLstIdx ) );
  rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx, eSParIdx );
  return Err::m_nOK;
}




ErrVal CabacReader::xGetMvd( MbDataAccess& rcMbDataAccess, Mv& rcMv, LumaIdx cIdx, ListIdx eLstIdx )
{
  Mv    cMvA;
  Mv    cMvB;
  Short sMvdComponent;

  rcMbDataAccess.getMvdAbove( cMvA, eLstIdx, cIdx );
  rcMbDataAccess.getMvdLeft ( cMvB, eLstIdx, cIdx );

  DECRNOK( xGetMvdComponent( sMvdComponent, cMvA.getAbsHor() + cMvB.getAbsHor(), 0 ) );
  rcMv.setHor( sMvdComponent );

  DTRACE_T( "Mvd: x" );
  DTRACE_TY( "ae(v)" );
  DTRACE_V( sMvdComponent );
  DTRACE_T( " above " );
  DTRACE_V( cMvA.getHor() );
  DTRACE_T( " left " );
  DTRACE_V( cMvB.getHor() );
  DTRACE_N;

  DECRNOK( xGetMvdComponent( sMvdComponent, cMvA.getAbsVer() + cMvB.getAbsVer(), 5 ) );
  rcMv.setVer( sMvdComponent );

  DTRACE_T( "Mvd: y" );
  DTRACE_TY( "ae(v)" );
  DTRACE_V( sMvdComponent );
  DTRACE_T( " above " );
  DTRACE_V( cMvA.getVer() );
  DTRACE_T( " left " );
  DTRACE_V( cMvB.getVer() );
  DTRACE_N;

  return Err::m_nOK;
}

ErrVal CabacReader::fieldFlag( MbDataAccess& rcMbDataAccess )
{
  UInt uiSymbol;
  RNOK( CabaDecoder::getSymbol( uiSymbol, m_cFieldFlagCCModel.get( 0, rcMbDataAccess.getCtxFieldFlag() ) ) );

  rcMbDataAccess.setFieldMode( uiSymbol != 0 );

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

  return Err::m_nOK;
}

ErrVal CabacReader::intraPredModeChroma( MbDataAccess& rcMbDataAccess )
{

  UInt uiSymbol;
  RNOK( CabaDecoder::getSymbol( uiSymbol, m_cChromaPredCCModel.get( 0, rcMbDataAccess.getCtxChromaPredMode() ) ) );

  if( uiSymbol )
  {
    RNOK( CabaDecoder::getUnaryMaxSymbol( uiSymbol, m_cChromaPredCCModel.get( 0 ) + 3, 0, 2 ) );
    uiSymbol++;
  }

  rcMbDataAccess.getMbData().setChromaPredMode( uiSymbol );
  DTRACE_T( "IntraPredModeChroma" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE( uiSymbol );
  DTRACE_N;

  return Err::m_nOK;
}



ErrVal CabacReader::intraPredModeLuma( MbDataAccess& rcMbDataAccess, LumaIdx cIdx )
{
  UInt uiSymbol;
  UInt uiIPredMode;

  RNOK( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 0 ) ) );

  if( ! uiSymbol )
  {
    RNOK( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
    uiIPredMode  = uiSymbol;
    RNOK( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
    uiIPredMode |= (uiSymbol << 1);
    RNOK( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
    rcMbDataAccess.getMbData().intraPredMode( cIdx ) = ( uiIPredMode | (uiSymbol << 2) );
  }
  else
  {
    rcMbDataAccess.getMbData().intraPredMode( cIdx ) = -1;
  }

  DTRACE_T( "IntraPredModeLuma" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE( rcMbDataAccess.getMbData().intraPredMode( cIdx ) );
  DTRACE_N;

  return Err::m_nOK;
}


ErrVal CabacReader::cbp( MbDataAccess& rcMbDataAccess, UInt uiStart, UInt uiStop )
{
  UInt uiCbp;
  UInt uiBit;
  UInt uiCtx = 0, a, b;

  a = rcMbDataAccess.getLeftLumaCbp ( B4x4Idx( 0 ), 0, 16 );
  b = rcMbDataAccess.getAboveLumaCbp( B4x4Idx( 0 ), 0, 16 ) << 1;

  RNOK( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
  uiCbp = uiBit;

  a = uiCbp & 1;
  b = rcMbDataAccess.getAboveLumaCbp( B4x4Idx( 2 ), 0, 16 ) << 1;

  RNOK( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
  uiCbp += uiBit << 1;

  a = rcMbDataAccess.getLeftLumaCbp ( B4x4Idx( 8 ), 0, 16 );
  b = (uiCbp  << 1) & 2;

  RNOK( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
  uiCbp += uiBit << 2;

  a = ( uiCbp >> 2 ) & 1;
  b = uiCbp & 2;

  RNOK( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
  uiCbp += uiBit << 3;

  uiCtx = 1;

  UInt  uiLeftChromaCbp   = rcMbDataAccess.getLeftChromaCbp ( 0, 16 );
  UInt  uiAboveChromaCbp  = rcMbDataAccess.getAboveChromaCbp( 0, 16 );

  a = uiLeftChromaCbp  > 0 ? 1 : 0;
  b = uiAboveChromaCbp > 0 ? 2 : 0;

  RNOK( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, a + b ) ) );

  if( uiBit )
  {
    a = uiLeftChromaCbp  > 1 ? 1 : 0;
    b = uiAboveChromaCbp > 1 ? 2 : 0;

    RNOK( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( ++uiCtx, a + b ) ) );
    uiCbp += (1 == uiBit) ? 32 : 16;
  }

  if( !uiCbp )
  {
    m_uiLastDQpNonZero = 0; // no DeltaQP for Macroblocks with zero Cbp
  }

  AOF_DBG( 48 >= uiCbp );

  DTRACE_T( "Cbp" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE( uiCbp );
  DTRACE_N;

  rcMbDataAccess.getMbData().setMbCbp( uiCbp );
  return Err::m_nOK;
}


ErrVal CabacReader::residualBlock( MbDataAccess&  rcMbDataAccess,
                                   LumaIdx        cIdx,
                                   ResidualMode   eResidualMode,
                                   UInt&          ruiMbExtCbp,
                                   UInt           uiStart,
                                   UInt           uiStop )
{
  const Bool bFrame    = ( FRAME == rcMbDataAccess.getMbPicType() );

⌨️ 快捷键说明

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