Skip to content
Snippets Groups Projects
Slice.h 171 KiB
Newer Older
  • Learn to ignore specific revisions
  • /* The copyright in this software is being made available under the BSD
     * License, included below. This software may be subject to other third party
     * and contributor rights, including patent rights, and no such rights are
     * granted under this license.
     *
    
     * Copyright (c) 2010-2019, ITU/ISO/IEC
    
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions are met:
     *
     *  * Redistributions of source code must retain the above copyright notice,
     *    this list of conditions and the following disclaimer.
     *  * Redistributions in binary form must reproduce the above copyright notice,
     *    this list of conditions and the following disclaimer in the documentation
     *    and/or other materials provided with the distribution.
     *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
     *    be used to endorse or promote products derived from this software without
     *    specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
     * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     * THE POSSIBILITY OF SUCH DAMAGE.
     */
    
    /** \file     Slice.h
        \brief    slice header and SPS class (header)
    */
    
    #ifndef __SLICE__
    #define __SLICE__
    
    #include <cstring>
    #include <list>
    #include <map>
    #include <vector>
    #include "CommonDef.h"
    #include "Rom.h"
    #include "ChromaFormat.h"
    #include "Common.h"
    
    #include "CommonLib/MotionInfo.h"
    struct MotionInfo;
    
    
    
    struct Picture;
    class Pic;
    class TrQuant;
    // ====================================================================================================================
    // Constants
    // ====================================================================================================================
    class PreCalcValues;
    static const uint32_t REF_PIC_LIST_NUM_IDX=32;
    
    typedef std::list<Picture*> PicList;
    
    // ====================================================================================================================
    // Class definition
    // ====================================================================================================================
    
    /// Reference Picture Set class
    class ReferencePictureSet
    {
    private:
      int  m_numberOfPictures;
      int  m_numberOfNegativePictures;
      int  m_numberOfPositivePictures;
      int  m_numberOfLongtermPictures;
      int  m_deltaPOC[MAX_NUM_REF_PICS];
      int  m_POC[MAX_NUM_REF_PICS];
      bool m_used[MAX_NUM_REF_PICS];
      bool m_interRPSPrediction;
      int  m_deltaRIdxMinus1;
      int  m_deltaRPS;
      int  m_numRefIdc;
      int  m_refIdc[MAX_NUM_REF_PICS+1];
      bool m_bCheckLTMSB[MAX_NUM_REF_PICS];
      int  m_pocLSBLT[MAX_NUM_REF_PICS];
      int  m_deltaPOCMSBCycleLT[MAX_NUM_REF_PICS];
      bool m_deltaPocMSBPresentFlag[MAX_NUM_REF_PICS];
    
    public:
              ReferencePictureSet();
      virtual ~ReferencePictureSet();
      int     getPocLSBLT(int i) const                     { return m_pocLSBLT[i];               }
      void    setPocLSBLT(int i, int x)                    { m_pocLSBLT[i] = x;                  }
      int     getDeltaPocMSBCycleLT(int i) const           { return m_deltaPOCMSBCycleLT[i];     }
      void    setDeltaPocMSBCycleLT(int i, int x)          { m_deltaPOCMSBCycleLT[i] = x;        }
      bool    getDeltaPocMSBPresentFlag(int i) const       { return m_deltaPocMSBPresentFlag[i]; }
      void    setDeltaPocMSBPresentFlag(int i, bool x)     { m_deltaPocMSBPresentFlag[i] = x;    }
      void    setUsed(int bufferNum, bool used);
      void    setDeltaPOC(int bufferNum, int deltaPOC);
      void    setPOC(int bufferNum, int deltaPOC);
      void    setNumberOfPictures(int numberOfPictures);
      void    setCheckLTMSBPresent(int bufferNum, bool b );
      bool    getCheckLTMSBPresent(int bufferNum) const;
    
      int     getUsed(int bufferNum) const;
      int     getDeltaPOC(int bufferNum) const;
      int     getPOC(int bufferNum) const;
      int     getNumberOfPictures() const;
    
      void    setNumberOfNegativePictures(int number)      { m_numberOfNegativePictures = number; }
      int     getNumberOfNegativePictures() const          { return m_numberOfNegativePictures;   }
      void    setNumberOfPositivePictures(int number)      { m_numberOfPositivePictures = number; }
      int     getNumberOfPositivePictures() const          { return m_numberOfPositivePictures;   }
      void    setNumberOfLongtermPictures(int number)      { m_numberOfLongtermPictures = number; }
      int     getNumberOfLongtermPictures() const          { return m_numberOfLongtermPictures;   }
    
      void    setInterRPSPrediction(bool flag)             { m_interRPSPrediction = flag;         }
      bool    getInterRPSPrediction() const                { return m_interRPSPrediction;         }
      void    setDeltaRIdxMinus1(int x)                    { m_deltaRIdxMinus1 = x;               }
      int     getDeltaRIdxMinus1() const                   { return m_deltaRIdxMinus1;            }
      void    setDeltaRPS(int x)                           { m_deltaRPS = x;                      }
      int     getDeltaRPS() const                          { return m_deltaRPS;                   }
      void    setNumRefIdc(int x)                          { m_numRefIdc = x;                     }
      int     getNumRefIdc() const                         { return m_numRefIdc;                  }
    
      void    setRefIdc(int bufferNum, int refIdc);
      int     getRefIdc(int bufferNum) const ;
    
      void    sortDeltaPOC();
      void    printDeltaPOC() const;
    };
    
    /// Reference Picture Set set class
    class RPSList
    {
    private:
      std::vector<ReferencePictureSet> m_referencePictureSets;
    
    public:
                                     RPSList()                                            { }
      virtual                        ~RPSList()                                           { }
    
      void                           create  (int numberOfEntries)                            { m_referencePictureSets.resize(numberOfEntries);         }
      void                           destroy ()                                               { }
    
    
      ReferencePictureSet*       getReferencePictureSet(int referencePictureSetNum)       { return &m_referencePictureSets[referencePictureSetNum]; }
      const ReferencePictureSet* getReferencePictureSet(int referencePictureSetNum) const { return &m_referencePictureSets[referencePictureSetNum]; }
    
      int                            getNumberOfReferencePictureSets() const                  { return int(m_referencePictureSets.size());              }
    };
    
    #if HEVC_USE_SCALING_LISTS
    /// SCALING_LIST class
    class ScalingList
    {
    public:
                 ScalingList();
      virtual    ~ScalingList()                                                 { }
      int*       getScalingListAddress(uint32_t sizeId, uint32_t listId)                    { return &(m_scalingListCoef[sizeId][listId][0]);            } //!< get matrix coefficient
      const int* getScalingListAddress(uint32_t sizeId, uint32_t listId) const              { return &(m_scalingListCoef[sizeId][listId][0]);            } //!< get matrix coefficient
      void       checkPredMode(uint32_t sizeId, uint32_t listId);
    
      void       setRefMatrixId(uint32_t sizeId, uint32_t listId, uint32_t u)                   { m_refMatrixId[sizeId][listId] = u;                         } //!< set reference matrix ID
      uint32_t       getRefMatrixId(uint32_t sizeId, uint32_t listId) const                     { return m_refMatrixId[sizeId][listId];                      } //!< get reference matrix ID
    
      const int* getScalingListDefaultAddress(uint32_t sizeId, uint32_t listId);                                                                           //!< get default matrix coefficient
      void       processDefaultMatrix(uint32_t sizeId, uint32_t listId);
    
      void       setScalingListDC(uint32_t sizeId, uint32_t listId, uint32_t u)                 { m_scalingListDC[sizeId][listId] = u;                       } //!< set DC value
      int        getScalingListDC(uint32_t sizeId, uint32_t listId) const                   { return m_scalingListDC[sizeId][listId];                    } //!< get DC value
    
      void       setScalingListPredModeFlag(uint32_t sizeId, uint32_t listId, bool bIsDPCM) { m_scalingListPredModeFlagIsDPCM[sizeId][listId] = bIsDPCM; }
      bool       getScalingListPredModeFlag(uint32_t sizeId, uint32_t listId) const         { return m_scalingListPredModeFlagIsDPCM[sizeId][listId];    }
    
      void       checkDcOfMatrix();
      void       processRefMatrix(uint32_t sizeId, uint32_t listId , uint32_t refListId );
      bool       xParseScalingList(const std::string &fileName);
      void       setDefaultScalingList();
      bool       checkDefaultScalingList();
    
    private:
      void       outputScalingLists(std::ostream &os) const;
      bool             m_scalingListPredModeFlagIsDPCM [SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM]; //!< reference list index
      int              m_scalingListDC                 [SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM]; //!< the DC value of the matrix coefficient for 16x16
      uint32_t             m_refMatrixId                   [SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM]; //!< RefMatrixID
      std::vector<int> m_scalingListCoef               [SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM]; //!< quantization matrix
    };
    #endif
    
    
    #if JVET_M0101_HLS
    class ConstraintInfo
    {
      bool              m_progressiveSourceFlag;
      bool              m_interlacedSourceFlag;
      bool              m_nonPackedConstraintFlag;
      bool              m_frameOnlyConstraintFlag;
      bool              m_intraOnlyConstraintFlag;
      uint32_t          m_maxBitDepthConstraintIdc;
      ChromaFormat      m_maxChromaFormatConstraintIdc;
      bool              m_onePictureOnlyConstraintFlag;
      bool              m_lowerBitRateConstraintFlag;
    
      bool              m_noQtbttDualTreeIntraConstraintFlag;
      bool              m_noSaoConstraintFlag;
      bool              m_noAlfConstraintFlag;
      bool              m_noPcmConstraintFlag;
      bool              m_noRefWraparoundConstraintFlag;
      bool              m_noTemporalMvpConstraintFlag;
      bool              m_noSbtmvpConstraintFlag;
      bool              m_noAmvrConstraintFlag;
      bool              m_noBdofConstraintFlag;
      bool              m_noCclmConstraintFlag;
      bool              m_noMtsConstraintFlag;
      bool              m_noAffineMotionConstraintFlag;
      bool              m_noGbiConstraintFlag;
      bool              m_noMhIntraConstraintFlag;
      bool              m_noTriangleConstraintFlag;
      bool              m_noLadfConstraintFlag;
      bool              m_noCurrPicRefConstraintFlag;
      bool              m_noQpDeltaConstraintFlag;
      bool              m_noDepQuantConstraintFlag;
      bool              m_noSignDataHidingConstraintFlag;
    
    public:
      ConstraintInfo()
        : m_progressiveSourceFlag (false)
        , m_interlacedSourceFlag (false)
        , m_nonPackedConstraintFlag (false)
        , m_frameOnlyConstraintFlag  (false)
        , m_intraOnlyConstraintFlag  (false)
        , m_maxBitDepthConstraintIdc  (  0)
        , m_maxChromaFormatConstraintIdc(CHROMA_420)
        , m_noQtbttDualTreeIntraConstraintFlag(false)
        , m_noSaoConstraintFlag      (false)
        , m_noAlfConstraintFlag      (false)
        , m_noPcmConstraintFlag      (false)
        , m_noRefWraparoundConstraintFlag(false)
        , m_noTemporalMvpConstraintFlag(false)
    
        , m_noSbtmvpConstraintFlag   (false)
        , m_noAmvrConstraintFlag     (false)
        , m_noBdofConstraintFlag     (false)
        , m_noCclmConstraintFlag     (false)
        , m_noMtsConstraintFlag      (false)
    
        , m_noAffineMotionConstraintFlag(false)
    
        , m_noGbiConstraintFlag      (false)
        , m_noMhIntraConstraintFlag  (false)
        , m_noTriangleConstraintFlag (false)
        , m_noLadfConstraintFlag     (false)
    
        , m_noCurrPicRefConstraintFlag(false)
    
        , m_noQpDeltaConstraintFlag  (false)
    
        , m_noDepQuantConstraintFlag (false)
        , m_noSignDataHidingConstraintFlag(false)
      {}
    
      bool          getProgressiveSourceFlag() const { return m_progressiveSourceFlag; }
      void          setProgressiveSourceFlag(bool b) { m_progressiveSourceFlag = b; }
    
      bool          getInterlacedSourceFlag() const { return m_interlacedSourceFlag; }
      void          setInterlacedSourceFlag(bool b) { m_interlacedSourceFlag = b; }
    
      bool          getNonPackedConstraintFlag() const { return m_nonPackedConstraintFlag; }
      void          setNonPackedConstraintFlag(bool b) { m_nonPackedConstraintFlag = b; }
    
      bool          getFrameOnlyConstraintFlag() const { return m_frameOnlyConstraintFlag; }
      void          setFrameOnlyConstraintFlag(bool b) { m_frameOnlyConstraintFlag = b; }
    
      uint32_t      getMaxBitDepthConstraintIdc() const { return m_maxBitDepthConstraintIdc; }
      void          setMaxBitDepthConstraintIdc(uint32_t bitDepth) { m_maxBitDepthConstraintIdc = bitDepth; }
    
      ChromaFormat  getMaxChromaFormatConstraintIdc() const { return m_maxChromaFormatConstraintIdc; }
      void          setMaxChromaFormatConstraintIdc(ChromaFormat fmt) { m_maxChromaFormatConstraintIdc = fmt; }
    
      bool          getIntraOnlyConstraintFlag() const { return m_intraOnlyConstraintFlag; }
      void          setIntraOnlyConstraintFlag(bool b) { m_intraOnlyConstraintFlag = b; }
    
      bool          getOnePictureOnlyConstraintFlag() const { return m_onePictureOnlyConstraintFlag; }
      void          setOnePictureOnlyConstraintFlag(bool b) { m_onePictureOnlyConstraintFlag = b; }
    
      bool          getLowerBitRateConstraintFlag() const { return m_lowerBitRateConstraintFlag; }
      void          setLowerBitRateConstraintFlag(bool b) { m_lowerBitRateConstraintFlag = b; }
    
      bool          getNoQtbttDualTreeIntraConstraintFlag() const { return m_noQtbttDualTreeIntraConstraintFlag; }
      void          setNoQtbttDualTreeIntraConstraintFlag(bool bVal) { m_noQtbttDualTreeIntraConstraintFlag = bVal; }
      bool          getNoSaoConstraintFlag() const { return m_noSaoConstraintFlag; }
      void          setNoSaoConstraintFlag(bool bVal) { m_noSaoConstraintFlag = bVal; }
      bool          getNoAlfConstraintFlag() const { return m_noAlfConstraintFlag; }
      void          setNoAlfConstraintFlag(bool bVal) { m_noAlfConstraintFlag = bVal; }
      bool          getNoPcmConstraintFlag() const { return m_noPcmConstraintFlag; }
      void          setNoPcmConstraintFlag(bool bVal) { m_noPcmConstraintFlag = bVal; }
      bool          getNoRefWraparoundConstraintFlag() const { return m_noRefWraparoundConstraintFlag; }
      void          setNoRefWraparoundConstraintFlag(bool bVal) { m_noRefWraparoundConstraintFlag = bVal; }
      bool          getNoTemporalMvpConstraintFlag() const { return m_noTemporalMvpConstraintFlag; }
      void          setNoTemporalMvpConstraintFlag(bool bVal) { m_noTemporalMvpConstraintFlag = bVal; }
      bool          getNoSbtmvpConstraintFlag() const { return m_noSbtmvpConstraintFlag; }
      void          setNoSbtmvpConstraintFlag(bool bVal) { m_noSbtmvpConstraintFlag = bVal; }
      bool          getNoAmvrConstraintFlag() const { return m_noAmvrConstraintFlag; }
      void          setNoAmvrConstraintFlag(bool bVal) { m_noAmvrConstraintFlag = bVal; }
      bool          getNoBdofConstraintFlag() const { return m_noBdofConstraintFlag; }
      void          setNoBdofConstraintFlag(bool bVal) { m_noBdofConstraintFlag = bVal; }
      bool          getNoCclmConstraintFlag() const { return m_noCclmConstraintFlag; }
      void          setNoCclmConstraintFlag(bool bVal) { m_noCclmConstraintFlag = bVal; }
      bool          getNoMtsConstraintFlag() const { return m_noMtsConstraintFlag; }
      void          setNoMtsConstraintFlag(bool bVal) { m_noMtsConstraintFlag = bVal; }
      bool          getNoAffineMotionConstraintFlag() const { return m_noAffineMotionConstraintFlag; }
      void          setNoAffineMotionConstraintFlag(bool bVal) { m_noAffineMotionConstraintFlag = bVal; }
      bool          getNoGbiConstraintFlag() const { return m_noGbiConstraintFlag; }
      void          setNoGbiConstraintFlag(bool bVal) { m_noGbiConstraintFlag = bVal; }
      bool          getNoMhIntraConstraintFlag() const { return m_noMhIntraConstraintFlag; }
      void          setNoMhIntraConstraintFlag(bool bVal) { m_noMhIntraConstraintFlag = bVal; }
      bool          getNoTriangleConstraintFlag() const { return m_noTriangleConstraintFlag; }
      void          setNoTriangleConstraintFlag(bool bVal) { m_noTriangleConstraintFlag = bVal; }
      bool          getNoLadfConstraintFlag() const { return m_noLadfConstraintFlag; }
      void          setNoLadfConstraintFlag(bool bVal) { m_noLadfConstraintFlag = bVal; }
      bool          getNoCurrPicRefConstraintFlag() const { return m_noCurrPicRefConstraintFlag; }
      void          setNoCurrPicRefConstraintFlag(bool bVal) { m_noCurrPicRefConstraintFlag = bVal; }
      bool          getNoQpDeltaConstraintFlag() const { return m_noQpDeltaConstraintFlag; }
      void          setNoQpDeltaConstraintFlag(bool bVal) { m_noQpDeltaConstraintFlag = bVal; }
      bool          getNoDepQuantConstraintFlag() const { return m_noDepQuantConstraintFlag; }
      void          setNoDepQuantConstraintFlag(bool bVal) { m_noDepQuantConstraintFlag = bVal; }
      bool          getNoSignDataHidingConstraintFlag() const { return m_noSignDataHidingConstraintFlag; }
      void          setNoSignDataHidingConstraintFlag(bool bVal) { m_noSignDataHidingConstraintFlag = bVal; }
    };
    #endif
    
    
    #if !JVET_M0101_HLS
    
      Level::Tier       m_tierFlag;
      Profile::Name     m_profileIdc;
    
    #if !JVET_M0101_HLS
    
    #if !JVET_M0101_HLS
    
      bool              m_progressiveSourceFlag;
      bool              m_interlacedSourceFlag;
      bool              m_nonPackedConstraintFlag;
      bool              m_frameOnlyConstraintFlag;
      uint32_t              m_bitDepthConstraintValue;
      ChromaFormat      m_chromaFormatConstraintValue;
      bool              m_intraConstraintFlag;
      bool              m_onePictureOnlyConstraintFlag;
      bool              m_lowerBitRateConstraintFlag;
    
    #else
      ConstraintInfo    m_constraintInfo;
      bool              m_subLayerLevelPresentFlag[MAX_TLAYER - 1];
      Level::Name       m_subLayerLevelIdc[MAX_TLAYER - 1];
    #endif
    
    #if !JVET_M0101_HLS
    
      int           getProfileSpace() const                     { return m_profileSpace;                }
      void          setProfileSpace(int x)                      { m_profileSpace = x;                   }
    
    
      Level::Tier   getTierFlag() const                         { return m_tierFlag;                    }
      void          setTierFlag(Level::Tier x)                  { m_tierFlag = x;                       }
    
      Profile::Name getProfileIdc() const                       { return m_profileIdc;                  }
      void          setProfileIdc(Profile::Name x)              { m_profileIdc = x;                     }
    
    
    #if !JVET_M0101_HLS
    
      bool          getProfileCompatibilityFlag(int i) const    { return m_profileCompatibilityFlag[i]; }
      void          setProfileCompatibilityFlag(int i, bool x)  { m_profileCompatibilityFlag[i] = x;    }
    
    
      Level::Name   getLevelIdc() const                         { return m_levelIdc;                    }
      void          setLevelIdc(Level::Name x)                  { m_levelIdc = x;                       }
    
    
    #if !JVET_M0101_HLS
    
      bool          getProgressiveSourceFlag() const            { return m_progressiveSourceFlag;       }
      void          setProgressiveSourceFlag(bool b)            { m_progressiveSourceFlag = b;          }
    
      bool          getInterlacedSourceFlag() const             { return m_interlacedSourceFlag;        }
      void          setInterlacedSourceFlag(bool b)             { m_interlacedSourceFlag = b;           }
    
      bool          getNonPackedConstraintFlag() const          { return m_nonPackedConstraintFlag;     }
      void          setNonPackedConstraintFlag(bool b)          { m_nonPackedConstraintFlag = b;        }
    
      bool          getFrameOnlyConstraintFlag() const          { return m_frameOnlyConstraintFlag;     }
      void          setFrameOnlyConstraintFlag(bool b)          { m_frameOnlyConstraintFlag = b;        }
    
      uint32_t          getBitDepthConstraint() const               { return m_bitDepthConstraintValue;     }
      void          setBitDepthConstraint(uint32_t bitDepth)        { m_bitDepthConstraintValue=bitDepth;   }
    
      ChromaFormat  getChromaFormatConstraint() const           { return m_chromaFormatConstraintValue; }
      void          setChromaFormatConstraint(ChromaFormat fmt) { m_chromaFormatConstraintValue=fmt;    }
    
      bool          getIntraConstraintFlag() const              { return m_intraConstraintFlag;         }
      void          setIntraConstraintFlag(bool b)              { m_intraConstraintFlag = b;            }
    
      bool          getOnePictureOnlyConstraintFlag() const     { return m_onePictureOnlyConstraintFlag;}
      void          setOnePictureOnlyConstraintFlag(bool b)     { m_onePictureOnlyConstraintFlag = b;   }
    
      bool          getLowerBitRateConstraintFlag() const       { return m_lowerBitRateConstraintFlag;  }
      void          setLowerBitRateConstraintFlag(bool b)       { m_lowerBitRateConstraintFlag = b;     }
    
    #endif
    
    #if JVET_M0101_HLS
      ConstraintInfo*         getConstraintInfo()              { return &m_constraintInfo; }
      const ConstraintInfo*   getConstraintInfo() const        { return &m_constraintInfo; }
    
      bool                    getSubLayerLevelPresentFlag(int i) const     { return m_subLayerLevelPresentFlag[i];   }
      void                    setSubLayerLevelPresentFlag(int i, bool x)   { m_subLayerLevelPresentFlag[i] = x;      }
    
      Level::Name             getSubLayerLevelIdc(int i) const             { return m_subLayerLevelIdc[i];   }
      void                    setSubLayerLevelIdc(int i, Level::Name x)    { m_subLayerLevelIdc[i] = x;      }
    #endif
    
    
    #if !JVET_M0101_HLS
    
    class PTL
    {
      ProfileTierLevel m_generalPTL;
      ProfileTierLevel m_subLayerPTL    [MAX_TLAYER-1];      // max. value of max_sub_layers_minus1 is MAX_TLAYER-1 (= 6)
      bool m_subLayerProfilePresentFlag [MAX_TLAYER-1];
      bool m_subLayerLevelPresentFlag   [MAX_TLAYER-1];
    
    public:
                              PTL();
      bool                    getSubLayerProfilePresentFlag(int i) const   { return m_subLayerProfilePresentFlag[i]; }
      void                    setSubLayerProfilePresentFlag(int i, bool x) { m_subLayerProfilePresentFlag[i] = x;    }
    
      bool                    getSubLayerLevelPresentFlag(int i) const     { return m_subLayerLevelPresentFlag[i];   }
      void                    setSubLayerLevelPresentFlag(int i, bool x)   { m_subLayerLevelPresentFlag[i] = x;      }
    
      ProfileTierLevel*       getGeneralPTL()                              { return &m_generalPTL;                   }
      const ProfileTierLevel* getGeneralPTL() const                        { return &m_generalPTL;                   }
      ProfileTierLevel*       getSubLayerPTL(int i)                        { return &m_subLayerPTL[i];               }
      const ProfileTierLevel* getSubLayerPTL(int i) const                  { return &m_subLayerPTL[i];               }
    };
    
    Taoran Lu's avatar
    Taoran Lu committed
    class SliceReshapeInfo
    
    Taoran Lu's avatar
    Taoran Lu committed
    {
    public:
    
    Taoran Lu's avatar
    Taoran Lu committed
      bool      sliceReshaperEnableFlag;
      bool      sliceReshaperModelPresentFlag;
      unsigned  enableChromaAdj;
      uint32_t  reshaperModelMinBinIdx;
      uint32_t  reshaperModelMaxBinIdx;
      int       reshaperModelBinCWDelta[PIC_CODE_CW_BINS];
    
    Taoran Lu's avatar
    Taoran Lu committed
      int       maxNbitsNeededDeltaCW;
    
    Taoran Lu's avatar
    Taoran Lu committed
      void      setUseSliceReshaper(bool b)                                { sliceReshaperEnableFlag = b;            }
      bool      getUseSliceReshaper() const                                { return sliceReshaperEnableFlag;         }
      void      setSliceReshapeModelPresentFlag(bool b)                    { sliceReshaperModelPresentFlag = b;      }
      bool      getSliceReshapeModelPresentFlag() const                    { return   sliceReshaperModelPresentFlag; }
      void      setSliceReshapeChromaAdj(unsigned adj)                     { enableChromaAdj = adj;                  }
      unsigned  getSliceReshapeChromaAdj() const                           { return enableChromaAdj;                 }
    
    Taoran Lu's avatar
    Taoran Lu committed
    };
    
    struct ReshapeCW
    {
    
    Taoran Lu's avatar
    Taoran Lu committed
      std::vector<uint32_t> binCW;
      int rspPicSize;
      int rspIntraPeriod;
      int rspFps;
      int rspBaseQP;
      int rspTid;
      int rspSliceQP;
      int rspFpsToIp;
    
    struct ChromaQpAdj
    {
      union
      {
        struct {
          int CbOffset;
          int CrOffset;
        } comp;
        int offset[2]; /* two chroma components */
      } u;
    };
    
    
    #if JVET_N0349_DPS
    
    class DPS
    {
    private:
      int m_decodingParameterSetId;
      int m_maxSubLayersMinus1;
      ProfileTierLevel m_profileTierLevel;
    
    public:
      DPS()
        : m_decodingParameterSetId(-1)
        , m_maxSubLayersMinus1 (0)
      {};
    
      virtual ~DPS() {};
    
      int  getDecodingParameterSetId() const { return m_decodingParameterSetId; }
      void setDecodingParameterSetId(int val) { m_decodingParameterSetId = val; }
      int  getMaxSubLayersMinus1() const { return m_maxSubLayersMinus1; }
      void setMaxSubLayersMinus1(int val) { m_maxSubLayersMinus1 = val; }
    
      void setProfileTierLevel(const ProfileTierLevel &val)          { m_profileTierLevel = val; }
      const ProfileTierLevel& getProfileTierLevel() const            { return m_profileTierLevel; }
    };
    
    #endif
    
    
    
    #if HEVC_VPS
    class VPS
    {
    private:
      int                   m_VPSId;
      uint32_t                  m_uiMaxTLayers;
      uint32_t                  m_uiMaxLayers;
      bool                  m_bTemporalIdNestingFlag;
    
      uint32_t                  m_numReorderPics[MAX_TLAYER];
      uint32_t                  m_uiMaxDecPicBuffering[MAX_TLAYER];
      uint32_t                  m_uiMaxLatencyIncrease[MAX_TLAYER]; // Really max latency increase plus 1 (value 0 expresses no limit)
    
      uint32_t                  m_numHrdParameters;
      uint32_t                  m_maxNuhReservedZeroLayerId;
    
      std::vector<HRDParameters> m_hrdParameters;
    
      std::vector<uint32_t>     m_hrdOpSetIdx;
      std::vector<bool>     m_cprmsPresentFlag;
      uint32_t                  m_numOpSets;
      bool                  m_layerIdIncludedFlag[MAX_VPS_OP_SETS_PLUS1][MAX_VPS_NUH_RESERVED_ZERO_LAYER_ID_PLUS1];
    
      PTL                   m_pcPTL;
      TimingInfo            m_timingInfo;
    
    public:
                        VPS();
    
      virtual           ~VPS();
    
      void              createHrdParamBuffer()
      {
        m_hrdParameters   .resize(getNumHrdParameters());
        m_hrdOpSetIdx     .resize(getNumHrdParameters());
        m_cprmsPresentFlag.resize(getNumHrdParameters());
      }
    
    
      HRDParameters*        getHrdParameters( uint32_t i )                           { return &m_hrdParameters[ i ];                                    }
      const HRDParameters*  getHrdParameters( uint32_t i ) const                     { return &m_hrdParameters[ i ];                                    }
    
      uint32_t              getHrdOpSetIdx( uint32_t i ) const                       { return m_hrdOpSetIdx[ i ];                                       }
      void              setHrdOpSetIdx( uint32_t val, uint32_t i )                   { m_hrdOpSetIdx[ i ] = val;                                        }
      bool              getCprmsPresentFlag( uint32_t i ) const                  { return m_cprmsPresentFlag[ i ];                                  }
      void              setCprmsPresentFlag( bool val, uint32_t i )              { m_cprmsPresentFlag[ i ] = val;                                   }
    
      int               getVPSId() const                                     { return m_VPSId;                                                  }
      void              setVPSId(int i)                                      { m_VPSId = i;                                                     }
    
      uint32_t              getMaxTLayers() const                                { return m_uiMaxTLayers;                                           }
      void              setMaxTLayers(uint32_t t)                                { m_uiMaxTLayers = t;                                              }
    
      uint32_t              getMaxLayers() const                                 { return m_uiMaxLayers;                                            }
      void              setMaxLayers(uint32_t l)                                 { m_uiMaxLayers = l;                                               }
    
      bool              getTemporalNestingFlag() const                       { return m_bTemporalIdNestingFlag;                                 }
      void              setTemporalNestingFlag(bool t)                       { m_bTemporalIdNestingFlag = t;                                    }
    
      void              setNumReorderPics(uint32_t v, uint32_t tLayer)               { m_numReorderPics[tLayer] = v;                                    }
      uint32_t              getNumReorderPics(uint32_t tLayer) const                 { return m_numReorderPics[tLayer];                                 }
    
      void              setMaxDecPicBuffering(uint32_t v, uint32_t tLayer)           { CHECK(tLayer >= MAX_TLAYER, "Invalid T-layer"); m_uiMaxDecPicBuffering[tLayer] = v; }
      uint32_t              getMaxDecPicBuffering(uint32_t tLayer) const             { return m_uiMaxDecPicBuffering[tLayer];                           }
    
      void              setMaxLatencyIncrease(uint32_t v, uint32_t tLayer)           { m_uiMaxLatencyIncrease[tLayer] = v;                              }
      uint32_t              getMaxLatencyIncrease(uint32_t tLayer) const             { return m_uiMaxLatencyIncrease[tLayer];                           }
    
      uint32_t              getNumHrdParameters() const                          { return m_numHrdParameters;                                       }
      void              setNumHrdParameters(uint32_t v)                          { m_numHrdParameters = v;                                          }
    
      uint32_t              getMaxNuhReservedZeroLayerId() const                 { return m_maxNuhReservedZeroLayerId;                              }
      void              setMaxNuhReservedZeroLayerId(uint32_t v)                 { m_maxNuhReservedZeroLayerId = v;                                 }
    
      uint32_t              getMaxOpSets() const                                 { return m_numOpSets;                                              }
      void              setMaxOpSets(uint32_t v)                                 { m_numOpSets = v;                                                 }
      bool              getLayerIdIncludedFlag(uint32_t opsIdx, uint32_t id) const   { return m_layerIdIncludedFlag[opsIdx][id];                        }
      void              setLayerIdIncludedFlag(bool v, uint32_t opsIdx, uint32_t id) { m_layerIdIncludedFlag[opsIdx][id] = v;                           }
    
      PTL*              getPTL()                                             { return &m_pcPTL;                                                 }
      const PTL*        getPTL() const                                       { return &m_pcPTL;                                                 }
      TimingInfo*       getTimingInfo()                                      { return &m_timingInfo;                                            }
      const TimingInfo* getTimingInfo() const                                { return &m_timingInfo;                                            }
    };
    #endif
    
    class Window
    {
    private:
      bool m_enabledFlag;
      int  m_winLeftOffset;
      int  m_winRightOffset;
      int  m_winTopOffset;
      int  m_winBottomOffset;
    public:
      Window()
      : m_enabledFlag    (false)
      , m_winLeftOffset  (0)
      , m_winRightOffset (0)
      , m_winTopOffset   (0)
      , m_winBottomOffset(0)
      { }
    
      bool getWindowEnabledFlag() const   { return m_enabledFlag;                          }
      int  getWindowLeftOffset() const    { return m_enabledFlag ? m_winLeftOffset : 0;    }
      void setWindowLeftOffset(int val)   { m_winLeftOffset = val; m_enabledFlag = true;   }
      int  getWindowRightOffset() const   { return m_enabledFlag ? m_winRightOffset : 0;   }
      void setWindowRightOffset(int val)  { m_winRightOffset = val; m_enabledFlag = true;  }
      int  getWindowTopOffset() const     { return m_enabledFlag ? m_winTopOffset : 0;     }
      void setWindowTopOffset(int val)    { m_winTopOffset = val; m_enabledFlag = true;    }
      int  getWindowBottomOffset() const  { return m_enabledFlag ? m_winBottomOffset: 0;   }
      void setWindowBottomOffset(int val) { m_winBottomOffset = val; m_enabledFlag = true; }
    
      void setWindow(int offsetLeft, int offsetLRight, int offsetLTop, int offsetLBottom)
      {
        m_enabledFlag     = true;
        m_winLeftOffset   = offsetLeft;
        m_winRightOffset  = offsetLRight;
        m_winTopOffset    = offsetLTop;
        m_winBottomOffset = offsetLBottom;
      }
    };
    
    
    class VUI
    {
    private:
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
    #if JVET_N0063_VUI
      bool       m_aspectRatioInfoPresentFlag;
      int        m_aspectRatioIdc;
      int        m_sarWidth;
      int        m_sarHeight;
      bool       m_colourDescriptionPresentFlag;
      int        m_colourPrimaries;
      int        m_transferCharacteristics;
      int        m_matrixCoefficients;
      bool       m_fieldSeqFlag;
      bool       m_chromaLocInfoPresentFlag;
      int        m_chromaSampleLocTypeTopField;
      int        m_chromaSampleLocTypeBottomField;
      int        m_chromaSampleLocType;
      bool       m_overscanInfoPresentFlag;
      bool       m_overscanAppropriateFlag;
      bool       m_videoSignalTypePresentFlag;
      bool       m_videoFullRangeFlag;
    #else
    
      bool       m_aspectRatioInfoPresentFlag;
      int        m_aspectRatioIdc;
      int        m_sarWidth;
      int        m_sarHeight;
      bool       m_overscanInfoPresentFlag;
      bool       m_overscanAppropriateFlag;
      bool       m_videoSignalTypePresentFlag;
      int        m_videoFormat;
      bool       m_videoFullRangeFlag;
      bool       m_colourDescriptionPresentFlag;
      int        m_colourPrimaries;
      int        m_transferCharacteristics;
      int        m_matrixCoefficients;
      bool       m_chromaLocInfoPresentFlag;
      int        m_chromaSampleLocTypeTopField;
      int        m_chromaSampleLocTypeBottomField;
      bool       m_neutralChromaIndicationFlag;
      bool       m_fieldSeqFlag;
      Window     m_defaultDisplayWindow;
      bool       m_frameFieldInfoPresentFlag;
      bool       m_hrdParametersPresentFlag;
      bool       m_bitstreamRestrictionFlag;
      bool       m_tilesFixedStructureFlag;
      bool       m_motionVectorsOverPicBoundariesFlag;
      bool       m_restrictedRefPicListsFlag;
      int        m_minSpatialSegmentationIdc;
      int        m_maxBytesPerPicDenom;
      int        m_maxBitsPerMinCuDenom;
      int        m_log2MaxMvLengthHorizontal;
      int        m_log2MaxMvLengthVertical;
    
      HRDParameters m_hrdParameters;
      TimingInfo    m_timingInfo;
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
    #endif
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
    #if JVET_N0063_VUI
      VUI()
        : m_aspectRatioInfoPresentFlag        (false) //TODO: This initialiser list contains magic numbers
        , m_aspectRatioIdc                    (0)
        , m_sarWidth                          (0)
        , m_sarHeight                         (0)
        , m_colourDescriptionPresentFlag      (false)
        , m_colourPrimaries                   (2)
        , m_transferCharacteristics           (2)
        , m_matrixCoefficients                (2)
        , m_fieldSeqFlag                      (false)
        , m_chromaLocInfoPresentFlag          (false)
        , m_chromaSampleLocTypeTopField       (0)
        , m_chromaSampleLocTypeBottomField    (0)
        , m_chromaSampleLocType               (0)
        , m_overscanInfoPresentFlag           (false)
        , m_overscanAppropriateFlag           (false)
        , m_videoSignalTypePresentFlag        (false)
        , m_videoFullRangeFlag                (false)
      {}
    #else
    
      VUI()
        : m_aspectRatioInfoPresentFlag        (false) //TODO: This initialiser list contains magic numbers
        , m_aspectRatioIdc                    (0)
        , m_sarWidth                          (0)
        , m_sarHeight                         (0)
        , m_overscanInfoPresentFlag           (false)
        , m_overscanAppropriateFlag           (false)
        , m_videoSignalTypePresentFlag        (false)
        , m_videoFormat                       (5)
        , m_videoFullRangeFlag                (false)
        , m_colourDescriptionPresentFlag      (false)
        , m_colourPrimaries                   (2)
        , m_transferCharacteristics           (2)
        , m_matrixCoefficients                (2)
        , m_chromaLocInfoPresentFlag          (false)
        , m_chromaSampleLocTypeTopField       (0)
        , m_chromaSampleLocTypeBottomField    (0)
        , m_neutralChromaIndicationFlag       (false)
        , m_fieldSeqFlag                      (false)
        , m_frameFieldInfoPresentFlag         (false)
        , m_hrdParametersPresentFlag          (false)
        , m_bitstreamRestrictionFlag          (false)
        , m_tilesFixedStructureFlag           (false)
        , m_motionVectorsOverPicBoundariesFlag(true)
        , m_restrictedRefPicListsFlag         (1)
        , m_minSpatialSegmentationIdc         (0)
        , m_maxBytesPerPicDenom               (2)
        , m_maxBitsPerMinCuDenom              (1)
        , m_log2MaxMvLengthHorizontal         (15)
        , m_log2MaxMvLengthVertical           (15)
      {}
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
    #endif
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
    #if JVET_N0063_VUI
      bool              getAspectRatioInfoPresentFlag() const                  { return m_aspectRatioInfoPresentFlag;           }
      void              setAspectRatioInfoPresentFlag(bool i)                  { m_aspectRatioInfoPresentFlag = i;              }
    
      int               getAspectRatioIdc() const                              { return m_aspectRatioIdc;                       }
      void              setAspectRatioIdc(int i)                               { m_aspectRatioIdc = i;                          }
    
      int               getSarWidth() const                                    { return m_sarWidth;                             }
      void              setSarWidth(int i)                                     { m_sarWidth = i;                                }
    
      int               getSarHeight() const                                   { return m_sarHeight;                            }
      void              setSarHeight(int i)                                    { m_sarHeight = i;                               }
    
      bool              getColourDescriptionPresentFlag() const                { return m_colourDescriptionPresentFlag;         }
      void              setColourDescriptionPresentFlag(bool i)                { m_colourDescriptionPresentFlag = i;            }
    
      int               getColourPrimaries() const                             { return m_colourPrimaries;                      }
      void              setColourPrimaries(int i)                              { m_colourPrimaries = i;                         }
    
      int               getTransferCharacteristics() const                     { return m_transferCharacteristics;              }
      void              setTransferCharacteristics(int i)                      { m_transferCharacteristics = i;                 }
    
      int               getMatrixCoefficients() const                          { return m_matrixCoefficients;                   }
      void              setMatrixCoefficients(int i)                           { m_matrixCoefficients = i;                      }
    
      bool              getFieldSeqFlag() const                                { return m_fieldSeqFlag;                         }
      void              setFieldSeqFlag(bool i)                                { m_fieldSeqFlag = i;                            }
    
      bool              getChromaLocInfoPresentFlag() const                    { return m_chromaLocInfoPresentFlag;             }
      void              setChromaLocInfoPresentFlag(bool i)                    { m_chromaLocInfoPresentFlag = i;                }
    
      int               getChromaSampleLocTypeTopField() const                 { return m_chromaSampleLocTypeTopField;          }
      void              setChromaSampleLocTypeTopField(int i)                  { m_chromaSampleLocTypeTopField = i;             }
    
      int               getChromaSampleLocTypeBottomField() const              { return m_chromaSampleLocTypeBottomField;       }
      void              setChromaSampleLocTypeBottomField(int i)               { m_chromaSampleLocTypeBottomField = i;          }
    
      int               getChromaSampleLocType() const                         { return m_chromaSampleLocType;          }
      void              setChromaSampleLocType(int i)                          { m_chromaSampleLocType = i;             }
    
      bool              getOverscanInfoPresentFlag() const                     { return m_overscanInfoPresentFlag;              }
      void              setOverscanInfoPresentFlag(bool i)                     { m_overscanInfoPresentFlag = i;                 }
    
      bool              getOverscanAppropriateFlag() const                     { return m_overscanAppropriateFlag;              }
      void              setOverscanAppropriateFlag(bool i)                     { m_overscanAppropriateFlag = i;                 }
    
      bool              getVideoSignalTypePresentFlag() const                  { return m_videoSignalTypePresentFlag;           }
      void              setVideoSignalTypePresentFlag(bool i)                  { m_videoSignalTypePresentFlag = i;              }
    
      bool              getVideoFullRangeFlag() const                          { return m_videoFullRangeFlag;                   }
      void              setVideoFullRangeFlag(bool i)                          { m_videoFullRangeFlag = i;                      }
    
    #else
    
      bool              getAspectRatioInfoPresentFlag() const                  { return m_aspectRatioInfoPresentFlag;           }
      void              setAspectRatioInfoPresentFlag(bool i)                  { m_aspectRatioInfoPresentFlag = i;              }
    
      int               getAspectRatioIdc() const                              { return m_aspectRatioIdc;                       }
      void              setAspectRatioIdc(int i)                               { m_aspectRatioIdc = i;                          }
    
      int               getSarWidth() const                                    { return m_sarWidth;                             }
      void              setSarWidth(int i)                                     { m_sarWidth = i;                                }
    
      int               getSarHeight() const                                   { return m_sarHeight;                            }
      void              setSarHeight(int i)                                    { m_sarHeight = i;                               }
    
      bool              getOverscanInfoPresentFlag() const                     { return m_overscanInfoPresentFlag;              }
      void              setOverscanInfoPresentFlag(bool i)                     { m_overscanInfoPresentFlag = i;                 }
    
      bool              getOverscanAppropriateFlag() const                     { return m_overscanAppropriateFlag;              }
      void              setOverscanAppropriateFlag(bool i)                     { m_overscanAppropriateFlag = i;                 }
    
      bool              getVideoSignalTypePresentFlag() const                  { return m_videoSignalTypePresentFlag;           }
      void              setVideoSignalTypePresentFlag(bool i)                  { m_videoSignalTypePresentFlag = i;              }
    
      int               getVideoFormat() const                                 { return m_videoFormat;                          }
      void              setVideoFormat(int i)                                  { m_videoFormat = i;                             }
    
      bool              getVideoFullRangeFlag() const                          { return m_videoFullRangeFlag;                   }
      void              setVideoFullRangeFlag(bool i)                          { m_videoFullRangeFlag = i;                      }
    
      bool              getColourDescriptionPresentFlag() const                { return m_colourDescriptionPresentFlag;         }
      void              setColourDescriptionPresentFlag(bool i)                { m_colourDescriptionPresentFlag = i;            }
    
      int               getColourPrimaries() const                             { return m_colourPrimaries;                      }
      void              setColourPrimaries(int i)                              { m_colourPrimaries = i;                         }
    
      int               getTransferCharacteristics() const                     { return m_transferCharacteristics;              }
      void              setTransferCharacteristics(int i)                      { m_transferCharacteristics = i;                 }
    
      int               getMatrixCoefficients() const                          { return m_matrixCoefficients;                   }
      void              setMatrixCoefficients(int i)                           { m_matrixCoefficients = i;                      }
    
      bool              getChromaLocInfoPresentFlag() const                    { return m_chromaLocInfoPresentFlag;             }
      void              setChromaLocInfoPresentFlag(bool i)                    { m_chromaLocInfoPresentFlag = i;                }
    
      int               getChromaSampleLocTypeTopField() const                 { return m_chromaSampleLocTypeTopField;          }
      void              setChromaSampleLocTypeTopField(int i)                  { m_chromaSampleLocTypeTopField = i;             }
    
      int               getChromaSampleLocTypeBottomField() const              { return m_chromaSampleLocTypeBottomField;       }
      void              setChromaSampleLocTypeBottomField(int i)               { m_chromaSampleLocTypeBottomField = i;          }
    
      bool              getNeutralChromaIndicationFlag() const                 { return m_neutralChromaIndicationFlag;          }
      void              setNeutralChromaIndicationFlag(bool i)                 { m_neutralChromaIndicationFlag = i;             }
    
      bool              getFieldSeqFlag() const                                { return m_fieldSeqFlag;                         }
      void              setFieldSeqFlag(bool i)                                { m_fieldSeqFlag = i;                            }
    
      bool              getFrameFieldInfoPresentFlag() const                   { return m_frameFieldInfoPresentFlag;            }
      void              setFrameFieldInfoPresentFlag(bool i)                   { m_frameFieldInfoPresentFlag = i;               }
    
      Window&           getDefaultDisplayWindow()                              { return m_defaultDisplayWindow;                 }
      const Window&     getDefaultDisplayWindow() const                        { return m_defaultDisplayWindow;                 }
      void              setDefaultDisplayWindow(Window& defaultDisplayWindow ) { m_defaultDisplayWindow = defaultDisplayWindow; }
    
      bool              getHrdParametersPresentFlag() const                    { return m_hrdParametersPresentFlag;             }
      void              setHrdParametersPresentFlag(bool i)                    { m_hrdParametersPresentFlag = i;                }
    
      bool              getBitstreamRestrictionFlag() const                    { return m_bitstreamRestrictionFlag;             }
      void              setBitstreamRestrictionFlag(bool i)                    { m_bitstreamRestrictionFlag = i;                }
    
      bool              getTilesFixedStructureFlag() const                     { return m_tilesFixedStructureFlag;              }
      void              setTilesFixedStructureFlag(bool i)                     { m_tilesFixedStructureFlag = i;                 }
    
      bool              getMotionVectorsOverPicBoundariesFlag() const          { return m_motionVectorsOverPicBoundariesFlag;   }
      void              setMotionVectorsOverPicBoundariesFlag(bool i)          { m_motionVectorsOverPicBoundariesFlag = i;      }
    
      bool              getRestrictedRefPicListsFlag() const                   { return m_restrictedRefPicListsFlag;            }
      void              setRestrictedRefPicListsFlag(bool b)                   { m_restrictedRefPicListsFlag = b;               }
    
      int               getMinSpatialSegmentationIdc() const                   { return m_minSpatialSegmentationIdc;            }
      void              setMinSpatialSegmentationIdc(int i)                    { m_minSpatialSegmentationIdc = i;               }
    
      int               getMaxBytesPerPicDenom() const                         { return m_maxBytesPerPicDenom;                  }
      void              setMaxBytesPerPicDenom(int i)                          { m_maxBytesPerPicDenom = i;                     }
    
      int               getMaxBitsPerMinCuDenom() const                        { return m_maxBitsPerMinCuDenom;                 }
      void              setMaxBitsPerMinCuDenom(int i)                         { m_maxBitsPerMinCuDenom = i;                    }
    
      int               getLog2MaxMvLengthHorizontal() const                   { return m_log2MaxMvLengthHorizontal;            }
      void              setLog2MaxMvLengthHorizontal(int i)                    { m_log2MaxMvLengthHorizontal = i;               }
    
      int               getLog2MaxMvLengthVertical() const                     { return m_log2MaxMvLengthVertical;              }
      void              setLog2MaxMvLengthVertical(int i)                      { m_log2MaxMvLengthVertical = i;                 }
    
    
      HRDParameters*       getHrdParameters()                                  { return &m_hrdParameters;                       }
      const HRDParameters* getHrdParameters()  const                           { return &m_hrdParameters;                       }
    
    
      TimingInfo*       getTimingInfo()                                        { return &m_timingInfo;                          }
      const TimingInfo* getTimingInfo() const                                  { return &m_timingInfo;                          }
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
    #endif
    
    };
    
    /// SPS RExt class
    class SPSRExt // Names aligned to text specification
    {
    private:
      bool             m_transformSkipRotationEnabledFlag;
      bool             m_transformSkipContextEnabledFlag;
      bool             m_rdpcmEnabledFlag[NUMBER_OF_RDPCM_SIGNALLING_MODES];
      bool             m_extendedPrecisionProcessingFlag;
      bool             m_intraSmoothingDisabledFlag;
      bool             m_highPrecisionOffsetsEnabledFlag;
      bool             m_persistentRiceAdaptationEnabledFlag;
      bool             m_cabacBypassAlignmentEnabledFlag;
    
    public:
      SPSRExt();
    
      bool settingsDifferFromDefaults() const
      {
        return getTransformSkipRotationEnabledFlag()
            || getTransformSkipContextEnabledFlag()
            || getRdpcmEnabledFlag(RDPCM_SIGNAL_IMPLICIT)
            || getRdpcmEnabledFlag(RDPCM_SIGNAL_EXPLICIT)
            || getExtendedPrecisionProcessingFlag()
            || getIntraSmoothingDisabledFlag()
            || getHighPrecisionOffsetsEnabledFlag()
            || getPersistentRiceAdaptationEnabledFlag()
            || getCabacBypassAlignmentEnabledFlag();
      }
    
    
      bool getTransformSkipRotationEnabledFlag() const                                     { return m_transformSkipRotationEnabledFlag;     }
      void setTransformSkipRotationEnabledFlag(const bool value)                           { m_transformSkipRotationEnabledFlag = value;    }
    
      bool getTransformSkipContextEnabledFlag() const                                      { return m_transformSkipContextEnabledFlag;      }
      void setTransformSkipContextEnabledFlag(const bool value)                            { m_transformSkipContextEnabledFlag = value;     }
    
      bool getRdpcmEnabledFlag(const RDPCMSignallingMode signallingMode) const             { return m_rdpcmEnabledFlag[signallingMode];     }
      void setRdpcmEnabledFlag(const RDPCMSignallingMode signallingMode, const bool value) { m_rdpcmEnabledFlag[signallingMode] = value;    }
    
      bool getExtendedPrecisionProcessingFlag() const                                      { return m_extendedPrecisionProcessingFlag;      }
      void setExtendedPrecisionProcessingFlag(bool value)                                  { m_extendedPrecisionProcessingFlag = value;     }
    
      bool getIntraSmoothingDisabledFlag() const                                           { return m_intraSmoothingDisabledFlag;           }
      void setIntraSmoothingDisabledFlag(bool bValue)                                      { m_intraSmoothingDisabledFlag=bValue;           }
    
      bool getHighPrecisionOffsetsEnabledFlag() const                                      { return m_highPrecisionOffsetsEnabledFlag;      }
      void setHighPrecisionOffsetsEnabledFlag(bool value)                                  { m_highPrecisionOffsetsEnabledFlag = value;     }
    
      bool getPersistentRiceAdaptationEnabledFlag() const                                  { return m_persistentRiceAdaptationEnabledFlag;  }
      void setPersistentRiceAdaptationEnabledFlag(const bool value)                        { m_persistentRiceAdaptationEnabledFlag = value; }
    
      bool getCabacBypassAlignmentEnabledFlag() const                                      { return m_cabacBypassAlignmentEnabledFlag;      }
      void setCabacBypassAlignmentEnabledFlag(const bool value)                            { m_cabacBypassAlignmentEnabledFlag = value;     }
    };
    
    
    /// SPS class
    class SPS
    {
    private:
      int               m_SPSId;
    
    #if JVET_N0349_DPS
      int               m_decodingParameterSetId;
    #endif
    
    #if !JVET_M0101_HLS
    
      bool              m_bIntraOnlyConstraintFlag;
      uint32_t          m_maxBitDepthConstraintIdc;
      uint32_t          m_maxChromaFormatConstraintIdc;
      bool              m_bFrameConstraintFlag;
      bool              m_bNoQtbttDualTreeIntraConstraintFlag;
      bool              m_bNoSaoConstraintFlag;
      bool              m_bNoAlfConstraintFlag;
      bool              m_bNoPcmConstraintFlag;
    
      bool              m_bNoRefWraparoundConstraintFlag;
    
      bool              m_bNoTemporalMvpConstraintFlag;
      bool              m_bNoSbtmvpConstraintFlag;
      bool              m_bNoAmvrConstraintFlag;
    
      bool              m_bNoBdofConstraintFlag;
      bool              m_bNoCclmConstraintFlag;
    
      bool              m_bNoAffineMotionConstraintFlag;
      bool              m_bNoGbiConstraintFlag;
      bool              m_bNoMhIntraConstraintFlag;
      bool              m_bNoTriangleConstraintFlag;
    
      bool              m_bNoCurrPicRefConstraintFlag;
      bool              m_bNoQpDeltaConstraintFlag;
    
      bool              m_bNoDepQuantConstraintFlag;
      bool              m_bNoSignDataHidingConstraintFlag;
    
      bool              m_affineAmvrEnabledFlag;
    
      bool              m_DMVR;
    
    #if JVET_N0127_MMVD_SPS_FLAG
    
    Seungsoo Jeong's avatar
    Seungsoo Jeong committed
      bool              m_MMVD;
    #endif
    
    #if INCLUDE_ISP_CFG_FLAG
      bool              m_ISP;