Skip to content
Snippets Groups Projects
Contexts.cpp 41.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • Frank Bossen's avatar
    Frank Bossen committed
      { 138, 46, },
      { 109, 42, },
    #else
    
    Frank Bossen's avatar
    Frank Bossen committed
    #endif
    
    });
    
    const CtxSet ContextSetCfg::TransquantBypassFlag = ContextSetCfg::addCtxSet
    ({
      {  154,},
      {  154,},
      {  154,},
    });
    
    const CtxSet ContextSetCfg::RdpcmFlag = ContextSetCfg::addCtxSet
    ({
      {  139, 139,},
      {  139, 139,},
      {  CNU, CNU,},
    });
    
    const CtxSet ContextSetCfg::RdpcmDir = ContextSetCfg::addCtxSet
    ({
      {  139, 139,},
      {  139, 139,},
      {  CNU, CNU,},
    });
    
    const CtxSet ContextSetCfg::EMTTuIndex = ContextSetCfg::addCtxSet
    ({
    
    Frank Bossen's avatar
    Frank Bossen committed
    #if TRAINED_CABAC_INIT_TABLES
      { 153, 138, CNU, CNU, },
      { 138, 167, CNU, CNU, },
      { 167, 123, CNU, CNU, },
    #else
    
      {  CNU, CNU, CNU, CNU,},
      {  CNU, CNU, CNU, CNU,},
      {  CNU, CNU, CNU, CNU,},
    
    Frank Bossen's avatar
    Frank Bossen committed
    #endif
    
    });
    
    const CtxSet ContextSetCfg::EMTCuFlag = ContextSetCfg::addCtxSet
    ({
    
    Frank Bossen's avatar
    Frank Bossen committed
    #if TRAINED_CABAC_INIT_TABLES
      { 155, 141, 155, 155, 140, CNU, },
      { 141, 141, 141, 126, 155, CNU, },
      { CNU, CNU, 140, 155, 155, CNU, },
    #else
    
      {  CNU, CNU, CNU, CNU, CNU, CNU,},
      {  CNU, CNU, CNU, CNU, CNU, CNU,},
      {  CNU, CNU, CNU, CNU, CNU, CNU,},
    
    Frank Bossen's avatar
    Frank Bossen committed
    #endif
    
    });
    
    const CtxSet ContextSetCfg::CrossCompPred = ContextSetCfg::addCtxSet
    ({
      {  154, 154, 154, 154, 154, 154, 154, 154, 154, 154,},
      {  154, 154, 154, 154, 154, 154, 154, 154, 154, 154,},
      {  154, 154, 154, 154, 154, 154, 154, 154, 154, 154,},
    });
    
    const CtxSet ContextSetCfg::ChromaQpAdjFlag = ContextSetCfg::addCtxSet
    ({
      {  154,},
      {  154,},
      {  154,},
    });
    
    const CtxSet ContextSetCfg::ChromaQpAdjIdc = ContextSetCfg::addCtxSet
    ({
      {  154,},
      {  154,},
      {  154,},
    });
    
    const CtxSet ContextSetCfg::ImvFlag = ContextSetCfg::addCtxSet
    ({
    
    Frank Bossen's avatar
    Frank Bossen committed
    #if TRAINED_CABAC_INIT_TABLES
      { 212, 214, 230, 182, },
      { 212, 214, 230, 182, },
      { CNU, CNU, CNU, CNU, },
    #else
    
      {  197, 185, 201, 185,},
      {  197, 185, 201, 185,},
      {  CNU, CNU, CNU, CNU,},
    
    Frank Bossen's avatar
    Frank Bossen committed
    #endif
    
    });
    
    const CtxSet ContextSetCfg::ctbAlfFlag =
    {
      ContextSetCfg::addCtxSet
      ( {
    
    Frank Bossen's avatar
    Frank Bossen committed
    #if TRAINED_CABAC_INIT_TABLES
        { 138, 141, 173, 122, 170, 203, 151, 170, 203, },
        { 153, 156, 188, 137, 185, 218, 152, 185, 218, },
        { 155, 205, 253, 168, 187, 234, 168, 187, 220, },
    #else
    
        { 100, 153, 200, 100, 153, 200, 100, 153, 200 },
        { 100, 153, 200, 100, 153, 200, 100, 153, 200 },
        { 100, 153, 200, 100, 153, 200, 100, 153, 200 },
    
    Frank Bossen's avatar
    Frank Bossen committed
    #endif
    
        { 100, 100, 100, 100, 100, 100, 100, 100, 100 },
        { 153, 153, 153, 153, 153, 153, 153, 153, 153 },
        { 200, 200, 200, 200, 200, 200, 200, 200, 200 },
    
    #if JVET_L0100_MULTI_HYPOTHESIS_INTRA
    const CtxSet ContextSetCfg::MHIntraFlag = ContextSetCfg::addCtxSet
    ({
    
    Frank Bossen's avatar
    Frank Bossen committed
    #if TRAINED_CABAC_INIT_TABLES
      { 226, },
      { 227, },
      { CNU, },
    #else
    
    Frank Bossen's avatar
    Frank Bossen committed
    #endif
    
    });
    
    const CtxSet ContextSetCfg::MHIntraPredMode = ContextSetCfg::addCtxSet
    ({
    
    Frank Bossen's avatar
    Frank Bossen committed
    #if TRAINED_CABAC_INIT_TABLES
      { 155, CNU, CNU, CNU, },
      { 141, CNU, CNU, CNU, },
      { CNU, CNU, CNU, CNU, },
    #else
    
      { 183, CNU, CNU, CNU, },
      { 154, CNU, CNU, CNU, },
      { 184, CNU, CNU, CNU, },
    
    Frank Bossen's avatar
    Frank Bossen committed
    #endif
    
    #if JVET_L0124_L0208_TRIANGLE
    const CtxSet ContextSetCfg::TriangleFlag = ContextSetCfg::addCtxSet
    ({
    
    Frank Bossen's avatar
    Frank Bossen committed
    #if TRAINED_CABAC_INIT_TABLES
      { 165, 137, 153, },
      { 106, 122, 138, },
      { CNU, CNU, CNU, },
    #else
    
      { 151, 137, 154, },
      { 151, 137, 154, },
      { CNU, CNU, CNU, },
    
    Frank Bossen's avatar
    Frank Bossen committed
    #endif
    
    });
    
    const CtxSet ContextSetCfg::TriangleIdx = ContextSetCfg::addCtxSet
    ({
    
    Frank Bossen's avatar
    Frank Bossen committed
    #if TRAINED_CABAC_INIT_TABLES
      { 155, },
      { 126, },
      { CNU, },
    #else
    
    Frank Bossen's avatar
    Frank Bossen committed
    #endif
    
    const unsigned ContextSetCfg::NumberOfContexts = (unsigned)ContextSetCfg::sm_InitTables[0].size();
    
    
    // combined sets
    const CtxSet ContextSetCfg::Sao = { ContextSetCfg::SaoMergeFlag, ContextSetCfg::SaoTypeIdx };
    
    
    
    template <class BinProbModel>
    CtxStore<BinProbModel>::CtxStore()
      : m_CtxBuffer ()
      , m_Ctx       ( nullptr )
    {}
    
    template <class BinProbModel>
    CtxStore<BinProbModel>::CtxStore( bool dummy )
      : m_CtxBuffer ( ContextSetCfg::NumberOfContexts )
      , m_Ctx       ( m_CtxBuffer.data() )
    {}
    
    template <class BinProbModel>
    CtxStore<BinProbModel>::CtxStore( const CtxStore<BinProbModel>& ctxStore )
      : m_CtxBuffer ( ctxStore.m_CtxBuffer )
      , m_Ctx       ( m_CtxBuffer.data() )
    {}
    
    template <class BinProbModel>
    void CtxStore<BinProbModel>::init( int qp, int initId )
    {
      const std::vector<uint8_t>& initTable = ContextSetCfg::getInitTable( initId );
      CHECK( m_CtxBuffer.size() != initTable.size(),
            "Size of init table (" << initTable.size() << ") does not match size of context buffer (" << m_CtxBuffer.size() << ")." );
    
      int clippedQP = Clip3( 0, MAX_QP, qp );
    
      for( std::size_t k = 0; k < m_CtxBuffer.size(); k++ )
      {
        m_CtxBuffer[k].init( clippedQP, initTable[k] );
      }
    }
    
    template <class BinProbModel>
    void CtxStore<BinProbModel>::setWinSizes( const std::vector<uint8_t>& log2WindowSizes )
    {
      CHECK( m_CtxBuffer.size() != log2WindowSizes.size(),
            "Size of window size table (" << log2WindowSizes.size() << ") does not match size of context buffer (" << m_CtxBuffer.size() << ")." );
      for( std::size_t k = 0; k < m_CtxBuffer.size(); k++ )
      {
        m_CtxBuffer[k].setLog2WindowSize( log2WindowSizes[k] );
      }
    }
    
    template <class BinProbModel>
    void CtxStore<BinProbModel>::loadPStates( const std::vector<uint16_t>& probStates )
    {
      CHECK( m_CtxBuffer.size() != probStates.size(),
            "Size of prob states table (" << probStates.size() << ") does not match size of context buffer (" << m_CtxBuffer.size() << ")." );
      for( std::size_t k = 0; k < m_CtxBuffer.size(); k++ )
      {
        m_CtxBuffer[k].setState( probStates[k] );
      }
    }
    
    template <class BinProbModel>
    void CtxStore<BinProbModel>::savePStates( std::vector<uint16_t>& probStates ) const
    {
      probStates.resize( m_CtxBuffer.size(), uint16_t(0) );
      for( std::size_t k = 0; k < m_CtxBuffer.size(); k++ )
      {
        probStates[k] = m_CtxBuffer[k].getState();
      }
    }
    
    
    
    
    
    template class CtxStore<BinProbModel_Std>;
    
    
    
    
    
    Ctx::Ctx()                                  : m_BPMType( BPM_Undefined )                        {}
    Ctx::Ctx( const BinProbModel_Std*   dummy ) : m_BPMType( BPM_Std   ), m_CtxStore_Std  ( true )  {}
    
    Ctx::Ctx( const Ctx& ctx )
      : m_BPMType         ( ctx.m_BPMType )
      , m_CtxStore_Std    ( ctx.m_CtxStore_Std    )
    {
      ::memcpy( m_GRAdaptStats, ctx.m_GRAdaptStats, sizeof( unsigned ) * RExt__GOLOMB_RICE_ADAPTATION_STATISTICS_SETS );
    }