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

📄 cabacreader.cpp

📁 JMVM MPEG MVC/3DAV 测试平台 国际通用标准
💻 CPP
📖 第 1 页 / 共 5 页
字号:

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

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

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

  UInt uiSign;
  RNOKCABAC( 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;
}

#if JMVM_ONLY  // JVT-U052
ErrVal CabacReader::Icpd( MbDataAccess& rcMbDataAccess )
{
  UInt uiIcAct;
  Icp cIcp;

  DECRNOK( xGetIcAct( rcMbDataAccess, uiIcAct ) );
  cIcp.setIcAct( uiIcAct );

  if (uiIcAct)
  {
    DECRNOK( xGetIcpd( cIcp ) );
  }
  rcMbDataAccess.getMbData().getMbIcp().setAllIcp( cIcp );

  return Err::m_nOK;
}

ErrVal CabacReader::xGetIcAct( MbDataAccess& rcMbDataAccess, UInt& uiIcAct )
{
  UInt a, b;
  UInt act_ctx;

  const MbData& cMbDataA = rcMbDataAccess.getMbDataLeft();
  const MbData& cMbDataB = rcMbDataAccess.getMbDataAbove();
  MbMode cMbModeA = cMbDataA.getMbMode();
  MbMode cMbModeB = cMbDataB.getMbMode();

  bool   bIsIcA   = rcMbDataAccess.isAvailableLeft() &&
                    ( (cMbModeA==MODE_16x16) || 
					  (cMbModeA==MODE_SKIP && 
					   rcMbDataAccess.getSH().getSliceType()==B_SLICE && 
					   !cMbDataA.getSkipFlag()) ) &&  //JVT-W031
                    cMbDataA.getMbIcp().getIcAct();
  bool   bIsIcB   = rcMbDataAccess.isAvailableAbove() &&
                    ( (cMbModeB==MODE_16x16) || 
					  (cMbModeB==MODE_SKIP && rcMbDataAccess.getSH().getSliceType()==B_SLICE &&
  					   !cMbDataB.getSkipFlag()) ) &&  //JVT-W031
                    cMbDataB.getMbIcp().getIcAct();

  a               = bIsIcA ? 1 : 0;
  b               = bIsIcB ? 1 : 0;
  act_ctx = a + b;

  RNOK( CabacReader::getSymbol( uiIcAct, m_cIcActCCModel.get(0, act_ctx) ) );
  DTRACE_T( "IcAct" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE( uiIcAct );
  DTRACE_T( "   a" );
  DTRACE_V( a );
  DTRACE_T( "   b" );
  DTRACE_V( b );
  DTRACE_T( "   act_ctx" );
  DTRACE_V( act_ctx );
  DTRACE_N;

  return Err::m_nOK;

}


ErrVal CabacReader::xGetIcpd( Icp& cIcp )
{
  Short sSymOffset;
  
  xGetICSymbol( sSymOffset );
  cIcp.setSymbolOffset( sSymOffset );

  DTRACE_T( "Icpd: offsetSym" );
  DTRACE_TY( "ae(v)" );
  DTRACE_V( sSymOffset );
  DTRACE_T( " offset " );
  DTRACE_V( cIcp.getOffset() );
  DTRACE_T( " pred " );
  DTRACE_V( cIcp.getPredOffset() );
  DTRACE_N;

  return Err::m_nOK;

}


ErrVal CabacReader::xGetICSymbol( Short& rsOffset )
{
  rsOffset = 0;

  UInt uiSymbol;
  RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIcSymbolCCModel.get( 0, 0 ) ) );

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

  RNOKCABAC( CabaDecoder::getExGolombLevel( uiSymbol, m_cIcSymbolCCModel.get( 0, 1 ) ) );
  uiSymbol++;

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

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

  return Err::m_nOK;
}
#endif


ErrVal CabacReader::intraPredModeChroma( MbDataAccess& rcMbDataAccess )
{

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

  if( uiSymbol )
  {
    RNOKCABAC( 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;

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

  if( ! uiSymbol )
  {
    RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
    uiIPredMode  = uiSymbol;
    RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
    uiIPredMode |= (uiSymbol << 1);
    RNOKCABAC( 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 uiCbp;
  UInt uiBit;
  UInt uiCtx = 0, a, b;

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

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

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

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

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

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

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

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

  uiCtx = 1;

  UInt  uiLeftChromaCbp   = rcMbDataAccess.getLeftChromaCbp ();
  UInt  uiAboveChromaCbp  = rcMbDataAccess.getAboveChromaCbp();

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

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

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

    RNOKCABAC( 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 )
{
  const UChar* pucScan = ( eResidualMode==LUMA_I16_DC ? g_aucLumaFrameDCScan : g_aucFrameScan );

  Bool bCoded;

  DTRACE_T( "LUMA:" );
  DTRACE_V( cIdx );
  DTRACE_N;

  DECRNOK( xReadBCbp( rcMbDataAccess, bCoded, eResidualMode, cIdx ) );

  if( ! bCoded )
  {
    ruiMbExtCbp &= ~(1 << cIdx.b4x4() );
    return Err::m_nOK;
  }

  TCoeff*       piCoeff   = rcMbDataAccess.getMbTCoeffs().get( cIdx );

  DECRNOK( xReadCoeff( piCoeff, eResidualMode, pucScan ) );

  return Err::m_nOK;
}




ErrVal CabacReader::residualBlock( MbDataAccess&  rcMbDataAccess,
                                   ChromaIdx      cIdx,
                                   ResidualMode   eResidualMode
                                   )
{
  const UChar* pucScan = ( eResidualMode == CHROMA_DC ? g_aucIndexChromaDCScan : g_aucFrameScan );

  Bool bCoded;

  DTRACE_T( eResidualMode == CHROMA_DC ? "CHROMA_DC:" : "CHROMA_AC:" );

  DTRACE_V( cIdx );
  DTRACE_N;

  TCoeff*       piCoeff   = rcMbDataAccess.getMbTCoeffs().get( cIdx );

  DECRNOK( xReadBCbp( rcMbDataAccess, bCoded, eResidualMode, cIdx ) );

  ROTRS( ! bCoded, Err::m_nOK );

  DECRNOK( xReadCoeff( piCoeff, eResidualMode, pucScan ) );

  return Err::m_nOK;
}



ErrVal CabacReader::deltaQp( MbDataAccess& rcMbDataAccess )
{
  UInt uiDQp;
  Int iDQp = 0;
  UInt uiCtx = m_uiLastDQpNonZero;

  RNOKCABAC( CabaDecoder::getSymbol( uiDQp, m_cDeltaQpCCModel.get( 0, uiCtx ) ) );

  m_uiLastDQpNonZero = uiDQp;

  if( uiDQp )
  {
    RNOKCABAC( CabaDecoder::getUnarySymbol( uiDQp, &m_cDeltaQpCCModel.get( 0, 2 ), 1 ) );

    iDQp = (uiDQp + 2) / 2;

    if( uiDQp & 1 )
    {
      iDQp = -iDQp;
    }
  }

  DTRACE_T( "DQp" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE ( iDQp );
  DTRACE_N;

  rcMbDataAccess.addDeltaQp( iDQp );

  Quantizer::setQp( rcMbDataAccess, false );

  return Err::m_nOK;
}


Bool CabacReader::isEndOfSlice()
{
  UInt uiEOS;

  CabaDecoder::getTerminateBufferBit( uiEOS );

⌨️ 快捷键说明

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