Skip to content
Snippets Groups Projects
Slice.h 163 KiB
Newer Older
  • Learn to ignore specific revisions
  •   uint32_t                        getTLayer() const                                      { return m_uiTLayer;                                            }
      void                        setTLayer( uint32_t uiTLayer )                             { m_uiTLayer = uiTLayer;                                        }
    
      void                        checkLeadingPictureRestrictions( PicList& rcListPic )                                         const;
    
    Hendry's avatar
    Hendry committed
      void                        applyReferencePictureListBasedMarking( PicList& rcListPic, const ReferencePictureList *pRPL0, const ReferencePictureList *pRPL1 )  const;
    
      bool                        isTemporalLayerSwitchingPoint( PicList& rcListPic )                                           const;
      bool                        isStepwiseTemporalLayerSwitchingPointCandidate( PicList& rcListPic )                          const;
    
    Hendry's avatar
    Hendry committed
      int                         checkThatAllRefPicsAreAvailable(PicList& rcListPic, const ReferencePictureList *pRPL, int rplIdx, bool printErrors)                const;
      void                        createExplicitReferencePictureSetFromReference(PicList& rcListPic, const ReferencePictureList *pRPL0, const ReferencePictureList *pRPL1);
    
      void                        setMaxNumMergeCand(uint32_t val )                          { m_maxNumMergeCand = val;                                      }
    
      uint32_t                    getMaxNumMergeCand() const                             { return m_maxNumMergeCand;                                     }
    
      void                        setMaxNumAffineMergeCand( uint32_t val )               { m_maxNumAffineMergeCand = val;  }
      uint32_t                    getMaxNumAffineMergeCand() const                       { return m_maxNumAffineMergeCand; }
    
      void                        setMaxNumTriangleCand(uint32_t val)                    { m_maxNumTriangleCand = val;}
      uint32_t                    getMaxNumTriangleCand() const                          { return m_maxNumTriangleCand;}
    
    Yan Zhang's avatar
    Yan Zhang committed
    #if JVET_O0455_IBC_MAX_MERGE_NUM
      void                        setMaxNumIBCMergeCand( uint32_t val )                  { m_maxNumIBCMergeCand = val; }
      uint32_t                    getMaxNumIBCMergeCand() const                          { return m_maxNumIBCMergeCand; }
    #endif
    
      void                        setDisFracMMVD( bool val )                             { m_disFracMMVD = val;                                          }
      bool                        getDisFracMMVD() const                                 { return m_disFracMMVD;                                         }
    
    #if JVET_O1140_SLICE_DISABLE_BDOF_DMVR_FLAG
      void                        setDisBdofDmvrFlag(bool val)                           { m_disBdofDmvrFlag = val;                                          }
      bool                        getDisBdofDmvrFlag() const                             { return m_disBdofDmvrFlag;                                         }
    #endif
    
      void                        setNoOutputPriorPicsFlag( bool val )                   { m_noOutputPriorPicsFlag = val;                                }
      bool                        getNoOutputPriorPicsFlag() const                       { return m_noOutputPriorPicsFlag;                               }
    
    
    #if JVET_N0865_NONSYNTAX
      void                        setNoIncorrectPicOutputFlag(bool val)                  { m_noIncorrectPicOutputFlag = val;                             }
      bool                        getNoIncorrectPicOutputFlag() const                    { return m_noIncorrectPicOutputFlag;                                    }
    #else
    
      void                        setNoRaslOutputFlag( bool val )                        { m_noRaslOutputFlag = val;                                     }
      bool                        getNoRaslOutputFlag() const                            { return m_noRaslOutputFlag;                                    }
    
      void                        setHandleCraAsCvsStartFlag( bool val )                 { m_handleCraAsCvsStartFlag = val;                                   }
      bool                        getHandleCraAsCvsStartFlag() const                     { return m_handleCraAsCvsStartFlag;                                  }
    
    
      void                        setSliceMode( SliceConstraint mode )                   { m_sliceMode = mode;                                           }
      SliceConstraint             getSliceMode() const                                   { return m_sliceMode;                                           }
      void                        setSliceArgument( uint32_t uiArgument )                    { m_sliceArgument = uiArgument;                                 }
      uint32_t                        getSliceArgument() const                               { return m_sliceArgument;                                       }
      void                        setSliceCurStartCtuTsAddr( uint32_t ctuTsAddr )            { m_sliceCurStartCtuTsAddr = ctuTsAddr;                         } // CTU Tile-scan address (as opposed to raster-scan)
      uint32_t                        getSliceCurStartCtuTsAddr() const                      { return m_sliceCurStartCtuTsAddr;                              } // CTU Tile-scan address (as opposed to raster-scan)
      void                        setSliceCurEndCtuTsAddr( uint32_t ctuTsAddr )              { m_sliceCurEndCtuTsAddr = ctuTsAddr;                           } // CTU Tile-scan address (as opposed to raster-scan)
      uint32_t                        getSliceCurEndCtuTsAddr() const                        { return m_sliceCurEndCtuTsAddr;                                } // CTU Tile-scan address (as opposed to raster-scan)
      void                        setIndependentSliceIdx( uint32_t i)                        { m_independentSliceIdx = i;                                    }
      uint32_t                        getIndependentSliceIdx() const                         { return  m_independentSliceIdx;                                }
      void                        copySliceInfo(Slice *pcSliceSrc, bool cpyAlmostAll = true);
      void                        setSliceBits( uint32_t uiVal )                             { m_sliceBits = uiVal;                                          }
      uint32_t                        getSliceBits() const                                   { return m_sliceBits;                                           }
      void                        setFinalized( bool uiVal )                             { m_bFinalized = uiVal;                                         }
      bool                        getFinalized() const                                   { return m_bFinalized;                                          }
    
      void                        setSliceCurStartBrickIdx(uint32_t brickIdx)            { m_sliceCurStartBrickIdx = brickIdx;                           }
      uint32_t                    getSliceCurStartBrickIdx() const                       { return m_sliceCurStartBrickIdx;                               }
      void                        setSliceCurEndBrickIdx(uint32_t brickIdx)              { m_sliceCurEndBrickIdx = brickIdx;                             }
      uint32_t                    getSliceCurEndBrickIdx() const                         { return m_sliceCurEndBrickIdx;                                 }
      void                        setSliceNumBricks(uint32_t numBricks)                  { m_sliceNumBricks = numBricks;                                 }
      uint32_t                    getSliceNumBricks() const                              { return m_sliceNumBricks;                                      }
      void                        setSliceIndex(uint32_t idx)                            { m_sliceIdx = idx;                                             }
    
      uint32_t                    getSliceIndex() const                                  { return m_sliceIdx;                                            }
    
      bool                        testWeightPred( ) const                                { return m_bTestWeightPred;                                     }
      void                        setTestWeightPred( bool bValue )                       { m_bTestWeightPred = bValue;                                   }
      bool                        testWeightBiPred( ) const                              { return m_bTestWeightBiPred;                                   }
      void                        setTestWeightBiPred( bool bValue )                     { m_bTestWeightBiPred = bValue;                                 }
      void                        setWpScaling( WPScalingParam  wp[NUM_REF_PIC_LIST_01][MAX_NUM_REF][MAX_NUM_COMPONENT] )
      {
        memcpy(m_weightPredTable, wp, sizeof(WPScalingParam)*NUM_REF_PIC_LIST_01*MAX_NUM_REF*MAX_NUM_COMPONENT);
      }
    
      void                        getWpScaling( RefPicList e, int iRefIdx, WPScalingParam *&wp) const;
    
      void                        resetWpScaling();
      void                        initWpScaling(const SPS *sps);
    
      void                        setWpAcDcParam( WPACDCParam wp[MAX_NUM_COMPONENT] )    { memcpy(m_weightACDCParam, wp, sizeof(WPACDCParam)*MAX_NUM_COMPONENT); }
    
      void                        getWpAcDcParam( const WPACDCParam *&wp ) const;
      void                        initWpAcDcParam();
    
      void                        clearSubstreamSizes( )                                 { return m_substreamSizes.clear();                              }
      uint32_t                        getNumberOfSubstreamSizes( )                           { return (uint32_t) m_substreamSizes.size();                        }
      void                        addSubstreamSize( uint32_t size )                          { m_substreamSizes.push_back(size);                             }
      uint32_t                        getSubstreamSize( uint32_t idx )                           { CHECK(idx>=getNumberOfSubstreamSizes(),"Invalid index"); return m_substreamSizes[idx]; }
    
      void                        setCabacInitFlag( bool val )                           { m_cabacInitFlag = val;                                        } //!< set CABAC initial flag
      bool                        getCabacInitFlag()                               const { return m_cabacInitFlag;                                       } //!< get CABAC initial flag
    
    
    #if JVET_O0105_ICT
      void                        setJointCbCrSignFlag( bool b )                         { m_jointCbCrSignFlag = b; }
      bool                        getJointCbCrSignFlag()                           const { return m_jointCbCrSignFlag; }
    #endif
    
    
      void                        setLFCrossSliceBoundaryFlag( bool   val )              { m_LFCrossSliceBoundaryFlag = val;                             }
      bool                        getLFCrossSliceBoundaryFlag()                    const { return m_LFCrossSliceBoundaryFlag;                            }
    
      void                        setEnableTMVPFlag( bool   b )                          { m_enableTMVPFlag = b;                                         }
      bool                        getEnableTMVPFlag() const                              { return m_enableTMVPFlag;                                      }
    
      void                        setEncCABACTableIdx( SliceType idx )                   { m_encCABACTableIdx = idx;                                     }
      SliceType                   getEncCABACTableIdx() const                            { return m_encCABACTableIdx;                                    }
    
    
      void                        setSliceQpBase( int i )                                { m_iSliceQpBase = i;                                           }
      int                         getSliceQpBase()                                 const { return m_iSliceQpBase;                                        }
    
      void                        setDefaultClpRng( const SPS& sps );
      const ClpRngs&              clpRngs()                                         const { return m_clpRngs;}
      const ClpRng&               clpRng( ComponentID id)                           const { return m_clpRngs.comp[id];}
      ClpRngs&                    getClpRngs()                                            { return m_clpRngs;}
      unsigned                    getMinPictureDistance()                           const ;
      void startProcessingTimer();
      void stopProcessingTimer();
      void resetProcessingTime()       { m_dProcessingTime = m_iProcessingStartTime = 0; }
      double getProcessingTime() const { return m_dProcessingTime; }
    
    
      void                        resetTileGroupAlfEnabledFlag() { memset(m_tileGroupAlfEnabledFlag, 0, sizeof(m_tileGroupAlfEnabledFlag)); }
      bool                        getTileGroupAlfEnabledFlag(ComponentID compId) const { return m_tileGroupAlfEnabledFlag[compId]; }
      void                        setTileGroupAlfEnabledFlag(ComponentID compId, bool b) { m_tileGroupAlfEnabledFlag[compId] = b; }
      int                         getTileGroupNumAps() const { return m_tileGroupNumAps; }
      void                        setTileGroupNumAps(int i) { m_tileGroupNumAps = i; }
      int                         getTileGroupApsIdChroma() const { return m_tileGroupChromaApsId; }
      void                        setTileGroupApsIdChroma(int i) { m_tileGroupChromaApsId = i; }
      std::vector<int32_t>        getTileGroupApsIdLuma() const { return m_tileGroupLumaApsId; }
    
      void                        setAlfAPSs(std::vector<int> ApsIDs)
    
      {
        m_tileGroupLumaApsId.resize(m_tileGroupNumAps);
        for (int i = 0; i < m_tileGroupNumAps; i++)
        {
          m_tileGroupLumaApsId[i] = ApsIDs[i];
        }
      }
    
      void                        setDisableSATDForRD(bool b) { m_disableSATDForRd = b; }
      bool                        getDisableSATDForRD() { return m_disableSATDForRd; }
    
      void                        scaleRefPicList( Picture *scaledRefPic[ ], APS** apss, APS* lmcsAps, APS* scalingListAps, const bool isDecoder );
    
      void                        scaleRefPicList( Picture *scaledRefPic[], APS** apss, APS& lmcsAps, const bool isDecoder );
    
      void                        freeScaledRefPicList( Picture *scaledRefPic[] );
      bool                        checkRPR();
    
      const std::pair<int, int>&  getScalingRatio( const RefPicList refPicList, const int refIdx )  const { return m_scalingRatio[refPicList][refIdx]; }
    
    #if JVET_N0865_SYNTAX
      void                        setRecoveryPocCnt(int value) { m_recoveryPocCnt = value; }
      int                         getRecoveryPocCnt() const { return m_recoveryPocCnt; }
      void                        setRpPicOrderCntVal(int value) { m_rpPicOrderCntVal = value; }
      int                         getRpPicOrderCntVal() const { return m_rpPicOrderCntVal; }
    #endif
    
    #if JVET_O0181
      void                        setNonRefPictFlag(bool value) { m_nonReferencePicFlag = value; }
      bool                        getNonRefPictFlag() const { return m_nonReferencePicFlag;  }
    #endif
    
    protected:
      Picture*              xGetRefPic        (PicList& rcListPic, int poc);
      Picture*              xGetLongTermRefPic(PicList& rcListPic, int poc, bool pocHasMsb);
    
      std::unordered_map< Position, std::unordered_map< Size, double> > m_mapPltCost;
    
    };// END CLASS DEFINITION Slice
    
    void calculateParameterSetChangedFlag(bool &bChanged, const std::vector<uint8_t> *pOldData, const std::vector<uint8_t> *pNewData);
    
    template <class T> class ParameterSetMap
    {
    public:
      template <class Tm>
      struct MapData
      {
        bool                  bChanged;
        std::vector<uint8_t>   *pNaluData; // Can be null
        Tm*                   parameterSet;
      };
    
      ParameterSetMap(int maxId)
      :m_maxId (maxId)
      ,m_lastActiveParameterSet(NULL)
    
    
      ~ParameterSetMap()
      {
        for (typename std::map<int,MapData<T> >::iterator i = m_paramsetMap.begin(); i!= m_paramsetMap.end(); i++)
        {
          delete (*i).second.pNaluData;
          delete (*i).second.parameterSet;
        }
        delete m_lastActiveParameterSet; m_lastActiveParameterSet = NULL;
      }
    
      T *allocatePS(const int psId)
      {
        CHECK( psId >= m_maxId, "Invalid PS id" );
        if ( m_paramsetMap.find(psId) == m_paramsetMap.end() )
        {
          m_paramsetMap[psId].bChanged = true;
          m_paramsetMap[psId].pNaluData=0;
          m_paramsetMap[psId].parameterSet = new T;
          setID(m_paramsetMap[psId].parameterSet, psId);
        }
        return m_paramsetMap[psId].parameterSet;
      }
    
    
      void storePS(int psId, T *ps, const std::vector<uint8_t> *pNaluData)
      {
        CHECK( psId >= m_maxId, "Invalid PS id" );
        if ( m_paramsetMap.find(psId) != m_paramsetMap.end() )
        {
          MapData<T> &mapData=m_paramsetMap[psId];
    
          // work out changed flag
          calculateParameterSetChangedFlag(mapData.bChanged, mapData.pNaluData, pNaluData);
    
          if( ! mapData.bChanged )
          {
            // just keep the old one
            delete ps;
            return;
          }
    
    
          if (find(m_activePsId.begin(), m_activePsId.end(), psId) != m_activePsId.end())
    
          {
            std::swap( m_paramsetMap[psId].parameterSet, m_lastActiveParameterSet );
          }
          delete m_paramsetMap[psId].pNaluData;
          delete m_paramsetMap[psId].parameterSet;
    
          m_paramsetMap[psId].parameterSet = ps;
        }
        else
        {
          m_paramsetMap[psId].parameterSet = ps;
          m_paramsetMap[psId].bChanged = false;
        }
        if (pNaluData != 0)
        {
          m_paramsetMap[psId].pNaluData=new std::vector<uint8_t>;
          *(m_paramsetMap[psId].pNaluData) = *pNaluData;
        }
        else
        {
          m_paramsetMap[psId].pNaluData=0;
        }
      }
    
      void setChangedFlag(int psId, bool bChanged=true)
      {
        if ( m_paramsetMap.find(psId) != m_paramsetMap.end() )
        {
          m_paramsetMap[psId].bChanged=bChanged;
        }
      }
    
      void clearChangedFlag(int psId)
      {
        if ( m_paramsetMap.find(psId) != m_paramsetMap.end() )
        {
          m_paramsetMap[psId].bChanged=false;
        }
      }
    
      bool getChangedFlag(int psId) const
      {
        const typename std::map<int,MapData<T> >::const_iterator constit=m_paramsetMap.find(psId);
        if ( constit != m_paramsetMap.end() )
        {
          return constit->second.bChanged;
        }
        return false;
      }
    
      T* getPS(int psId)
      {
        typename std::map<int,MapData<T> >::iterator it=m_paramsetMap.find(psId);
        return ( it == m_paramsetMap.end() ) ? NULL : (it)->second.parameterSet;
      }
    
      const T* getPS(int psId) const
      {
        typename std::map<int,MapData<T> >::const_iterator it=m_paramsetMap.find(psId);
        return ( it == m_paramsetMap.end() ) ? NULL : (it)->second.parameterSet;
      }
    
      T* getFirstPS()
      {
        return (m_paramsetMap.begin() == m_paramsetMap.end() ) ? NULL : m_paramsetMap.begin()->second.parameterSet;
      }
    
    
      void setActive(int psId) { m_activePsId.push_back(psId); }
      void clear() { m_activePsId.clear(); }
    
    
    private:
      std::map<int,MapData<T> > m_paramsetMap;
      int                       m_maxId;
    
      T*                        m_lastActiveParameterSet;
      static void setID(T* parameterSet, const int psId);
    };
    
    class ParameterSetManager
    {
    public:
                     ParameterSetManager();
      virtual        ~ParameterSetManager();
    
    
    
      void           storeDPS(DPS *dps, const std::vector<uint8_t> &naluData)    { m_dpsMap.storePS( dps->getDecodingParameterSetId(), dps, &naluData); };
      //! get pointer to existing video parameter set
      DPS*           getDPS(int dpsId)                                           { return m_dpsMap.getPS(dpsId); };
      bool           getDPSChangedFlag(int dpsId) const                          { return m_dpsMap.getChangedFlag(dpsId); }
      void           clearDPSChangedFlag(int dpsId)                              { m_dpsMap.clearChangedFlag(dpsId); }
      DPS*           getFirstDPS()                                               { return m_dpsMap.getFirstPS(); };
    
      //! store sequence parameter set and take ownership of it
      void           storeSPS(SPS *sps, const std::vector<uint8_t> &naluData) { m_spsMap.storePS( sps->getSPSId(), sps, &naluData); };
      //! get pointer to existing sequence parameter set
      SPS*           getSPS(int spsId)                                           { return m_spsMap.getPS(spsId); };
      bool           getSPSChangedFlag(int spsId) const                          { return m_spsMap.getChangedFlag(spsId); }
      void           clearSPSChangedFlag(int spsId)                              { m_spsMap.clearChangedFlag(spsId); }
      SPS*           getFirstSPS()                                               { return m_spsMap.getFirstPS(); };
    
      //! store picture parameter set and take ownership of it
      void           storePPS(PPS *pps, const std::vector<uint8_t> &naluData) { m_ppsMap.storePS( pps->getPPSId(), pps, &naluData); };
      //! get pointer to existing picture parameter set
      PPS*           getPPS(int ppsId)                                           { return m_ppsMap.getPS(ppsId); };
      bool           getPPSChangedFlag(int ppsId) const                          { return m_ppsMap.getChangedFlag(ppsId); }
      void           clearPPSChangedFlag(int ppsId)                              { m_ppsMap.clearChangedFlag(ppsId); }
      PPS*           getFirstPPS()                                               { return m_ppsMap.getFirstPS(); };
    
      //! activate a SPS from a active parameter sets SEI message
      //! \returns true, if activation is successful
      // bool           activateSPSWithSEI(int SPSId);
    
      //! activate a PPS and depending on isIDR parameter also SPS
      //! \returns true, if activation is successful
      bool           activatePPS(int ppsId, bool isIRAP);
    
      APS**          getAPSs() { return &m_apss[0]; }
      ParameterSetMap<APS>* getApsMap() { return &m_apsMap; }
    
      void           storeAPS(APS *aps, const std::vector<uint8_t> &naluData)    { m_apsMap.storePS((aps->getAPSId() << NUM_APS_TYPE_LEN) + aps->getAPSType(), aps, &naluData); };
      APS*           getAPS(int apsId, int apsType)                              { return m_apsMap.getPS((apsId << NUM_APS_TYPE_LEN) + apsType); };
      bool           getAPSChangedFlag(int apsId, int apsType) const             { return m_apsMap.getChangedFlag((apsId << NUM_APS_TYPE_LEN) + apsType); }
      void           clearAPSChangedFlag(int apsId, int apsType)                 { m_apsMap.clearChangedFlag((apsId << NUM_APS_TYPE_LEN) + apsType); }
      APS*           getFirstAPS()                                               { return m_apsMap.getFirstPS(); };
      bool           activateAPS(int apsId, int apsType);
    
      const SPS*     getActiveSPS()const                                         { return m_spsMap.getPS(m_activeSPSId); };
    
      const DPS*     getActiveDPS()const                                         { return m_dpsMap.getPS(m_activeDPSId); };
    
    
    protected:
      ParameterSetMap<SPS> m_spsMap;
      ParameterSetMap<PPS> m_ppsMap;
    
    Hendry's avatar
    Hendry committed
      ParameterSetMap<APS> m_apsMap;
    
      ParameterSetMap<DPS> m_dpsMap;
    
    #if JVET_O_MAX_NUM_ALF_APS_8
      APS* m_apss[ALF_CTB_MAX_NUM_APS];
    #else
    
      int m_activeDPSId; // -1 for nothing active
    
      int m_activeSPSId; // -1 for nothing active
    };
    
    class PreCalcValues
    {
    public:
      PreCalcValues( const SPS& sps, const PPS& pps, bool _isEncoder )
        : chrFormat           ( sps.getChromaFormatIdc() )
    
    Karsten Suehring's avatar
    Karsten Suehring committed
        , multiBlock422       ( false )
    
        , maxCUWidth          ( sps.getMaxCUWidth() )
        , maxCUHeight         ( sps.getMaxCUHeight() )
        , maxCUWidthMask      ( maxCUWidth  - 1 )
        , maxCUHeightMask     ( maxCUHeight - 1 )
    
        , maxCUWidthLog2      ( floorLog2( maxCUWidth  ) )
        , maxCUHeightLog2     ( floorLog2( maxCUHeight ) )
    
        , minCUWidth          ( sps.getMaxCUWidth()  >> sps.getMaxCodingDepth() )
        , minCUHeight         ( sps.getMaxCUHeight() >> sps.getMaxCodingDepth() )
    
        , minCUWidthLog2      ( floorLog2( minCUWidth  ) )
        , minCUHeightLog2     ( floorLog2( minCUHeight ) )
    
        , partsInCtuWidth     ( 1 << sps.getMaxCodingDepth() )
        , partsInCtuHeight    ( 1 << sps.getMaxCodingDepth() )
        , partsInCtu          ( 1 << (sps.getMaxCodingDepth() << 1) )
    
    #if JVET_O1164_PS
        , widthInCtus         ( (pps.getPicWidthInLumaSamples () + sps.getMaxCUWidth () - 1) / sps.getMaxCUWidth () )
        , heightInCtus        ( (pps.getPicHeightInLumaSamples() + sps.getMaxCUHeight() - 1) / sps.getMaxCUHeight() )
    #else
    
        , widthInCtus         ( (sps.getPicWidthInLumaSamples () + sps.getMaxCUWidth () - 1) / sps.getMaxCUWidth () )
        , heightInCtus        ( (sps.getPicHeightInLumaSamples() + sps.getMaxCUHeight() - 1) / sps.getMaxCUHeight() )
    
    #if JVET_O1164_PS
        , lumaWidth           ( pps.getPicWidthInLumaSamples() )
        , lumaHeight          ( pps.getPicHeightInLumaSamples() )
    #else
    
        , lumaWidth           ( sps.getPicWidthInLumaSamples() )
        , lumaHeight          ( sps.getPicHeightInLumaSamples() )
    
        , fastDeltaQPCuMaxSize( Clip3(sps.getMaxCUHeight() >> (sps.getLog2DiffMaxMinCodingBlockSize()), sps.getMaxCUHeight(), 32u) )
    
    Karsten Suehring's avatar
    Karsten Suehring committed
        , noChroma2x2         (  false )
    
        , ISingleTree         ( !sps.getUseDualITree() )
    
    Remy Foray's avatar
    Remy Foray committed
        , maxBtDepth          { sps.getMaxMTTHierarchyDepthI(), sps.getMaxMTTHierarchyDepth(), sps.getMaxMTTHierarchyDepthIChroma() }
    
        , minBtSize           { 1u << sps.getLog2MinCodingBlockSize(), 1u << sps.getLog2MinCodingBlockSize(), 1u << sps.getLog2MinCodingBlockSize() }
    
        , maxBtSize           { sps.getMaxBTSizeI(), sps.getMaxBTSize(), sps.getMaxBTSizeIChroma() }
    
        , minTtSize           { 1u << sps.getLog2MinCodingBlockSize(), 1u << sps.getLog2MinCodingBlockSize(), 1u << sps.getLog2MinCodingBlockSize() }
    
        , maxTtSize           { sps.getMaxTTSizeI(), sps.getMaxTTSize(), sps.getMaxTTSizeIChroma() }
        , minQtSize           { sps.getMinQTSize(I_SLICE, CHANNEL_TYPE_LUMA), sps.getMinQTSize(B_SLICE, CHANNEL_TYPE_LUMA), sps.getMinQTSize(I_SLICE, CHANNEL_TYPE_CHROMA) }
    
      {}
    
      const ChromaFormat chrFormat;
      const bool         multiBlock422;
      const unsigned     maxCUWidth;
      const unsigned     maxCUHeight;
      // to get CTU position, use (x & maxCUWidthMask) rather than (x % maxCUWidth)
      const unsigned     maxCUWidthMask;
      const unsigned     maxCUHeightMask;
      const unsigned     maxCUWidthLog2;
      const unsigned     maxCUHeightLog2;
      const unsigned     minCUWidth;
      const unsigned     minCUHeight;
      const unsigned     minCUWidthLog2;
      const unsigned     minCUHeightLog2;
      const unsigned     partsInCtuWidth;
      const unsigned     partsInCtuHeight;
      const unsigned     partsInCtu;
      const unsigned     widthInCtus;
      const unsigned     heightInCtus;
      const unsigned     sizeInCtus;
      const unsigned     lumaWidth;
      const unsigned     lumaHeight;
      const unsigned     fastDeltaQPCuMaxSize;
      const bool         noChroma2x2;
      const bool         isEncoder;
      const bool         ISingleTree;
    
    private:
      const unsigned     maxBtDepth[3];
      const unsigned     minBtSize [3];
      const unsigned     maxBtSize [3];
      const unsigned     minTtSize [3];
      const unsigned     maxTtSize [3];
      const unsigned     minQtSize [3];
    
      unsigned getValIdx    ( const Slice &slice, const ChannelType chType ) const;
    
    public:
      unsigned getMaxBtDepth( const Slice &slice, const ChannelType chType ) const;
      unsigned getMinBtSize ( const Slice &slice, const ChannelType chType ) const;
      unsigned getMaxBtSize ( const Slice &slice, const ChannelType chType ) const;
      unsigned getMinTtSize ( const Slice &slice, const ChannelType chType ) const;
      unsigned getMaxTtSize ( const Slice &slice, const ChannelType chType ) const;
      unsigned getMinQtSize ( const Slice &slice, const ChannelType chType ) const;
    };
    
    #if ENABLE_TRACING
    void xTraceVPSHeader();
    
    void xTraceDPSHeader();
    
    void xTraceAPSHeader();
    
    void xTraceSliceHeader();
    void xTraceAccessUnitDelimiter();
    #endif
    
    #endif // __SLICE__