1 /* -----------------------------------------------------------------------------
2 The copyright in this software is being made available under the BSD
3 License, included below. No patent rights, trademark rights and/or
4 other Intellectual Property Rights other than the copyrights concerning
5 the Software are granted under this license.
6 
7 For any license concerning other Intellectual Property rights than the software,
8 especially patent licenses, a separate Agreement needs to be closed.
9 For more information please contact:
10 
11 Fraunhofer Heinrich Hertz Institute
12 Einsteinufer 37
13 10587 Berlin, Germany
14 www.hhi.fraunhofer.de/vvc
15 vvc@hhi.fraunhofer.de
16 
17 Copyright (c) 2018-2021, Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
18 All rights reserved.
19 
20 Redistribution and use in source and binary forms, with or without
21 modification, are permitted provided that the following conditions are met:
22 
23  * Redistributions of source code must retain the above copyright notice,
24    this list of conditions and the following disclaimer.
25  * Redistributions in binary form must reproduce the above copyright notice,
26    this list of conditions and the following disclaimer in the documentation
27    and/or other materials provided with the distribution.
28  * Neither the name of Fraunhofer nor the names of its contributors may
29    be used to endorse or promote products derived from this software without
30    specific prior written permission.
31 
32 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
33 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
34 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
35 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
36 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
37 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
38 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
39 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
40 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
42 THE POSSIBILITY OF SUCH DAMAGE.
43 
44 
45 ------------------------------------------------------------------------------------------- */
46 
47 /** \file     Slice.h
48     \brief    slice header and SPS class (header)
49 */
50 
51 #pragma once
52 
53 #include "CommonDef.h"
54 #include "Rom.h"
55 #include "ChromaFormat.h"
56 #include "Common.h"
57 #include "MotionInfo.h"
58 #include "BitStream.h"
59 #include "PicListManager.h"
60 #include "SEI_internal.h"
61 
62 #include "Utilities/ThreadPool.h"
63 
64 #include <cstring>
65 #include <list>
66 #include <map>
67 #include <vector>
68 #include <chrono>
69 #include <future>
70 
71 namespace vvdec
72 {
73 
74 // ====================================================================================================================
75 // Constants
76 // ====================================================================================================================
77 class PreCalcValues;
78 class ParameterSetManager;
79 static const uint32_t REF_PIC_LIST_NUM_IDX=32;
80 
81 
82 // ====================================================================================================================
83 // Class definition
84 // ====================================================================================================================
85 
86 struct DpbParameters
87 {
88   int m_maxDecPicBuffering[MAX_TLAYER] = { 0 };
89   int m_numReorderPics[MAX_TLAYER] = { 0 };
90   int m_maxLatencyIncreasePlus1[MAX_TLAYER] = { 0 };
91 };
92 
93 class ReferencePictureList
94 {
95 private:
96   int   m_numberOfShorttermPictures = 0;
97   int   m_numberOfLongtermPictures  = 0;
98   int   m_isLongtermRefPic      [MAX_NUM_REF_PICS];
99   int   m_refPicIdentifier      [MAX_NUM_REF_PICS];   // This can be delta POC for STRP or POC LSB for LTRP
100   int   m_POC                   [MAX_NUM_REF_PICS];
101   int   m_deltaPOCMSBCycleLT    [MAX_NUM_REF_PICS];
102   bool  m_deltaPocMSBPresentFlag[MAX_NUM_REF_PICS];
103   bool  m_ltrp_in_slice_header_flag = false;
104   bool  m_interLayerPresentFlag = false;
105   bool  m_isInterLayerRefPic[MAX_NUM_REF_PICS];
106   int   m_interLayerRefPicIdx[MAX_NUM_REF_PICS];
107   int   m_numberOfInterLayerPictures = 0;
108 public:
109   ReferencePictureList();
110   void clear();
111 
112   void    setRefPicIdentifier( int idx, int identifier, bool isLongterm, bool isInterLayerRefPic, int interLayerIdx );
113   int     getRefPicIdentifier(int idx) const;
114   bool    isRefPicLongterm(int idx) const;
115 
116   void    setRefPicLongterm(int idx,bool isLongterm);
117 
118   void    setNumberOfShorttermPictures(int numberOfStrp);
119   int     getNumberOfShorttermPictures() const;
120 
121   void    setNumberOfLongtermPictures(int numberOfLtrp);
122   int     getNumberOfLongtermPictures() const;
123 
setLtrpInSliceHeaderFlag(bool flag)124   void    setLtrpInSliceHeaderFlag(bool flag) { m_ltrp_in_slice_header_flag = flag; }
getLtrpInSliceHeaderFlag()125   bool    getLtrpInSliceHeaderFlag() const { return m_ltrp_in_slice_header_flag; }
126 
setNumberOfInterLayerPictures(const int numberOfIlrp)127   void    setNumberOfInterLayerPictures( const int numberOfIlrp ) { m_numberOfInterLayerPictures = numberOfIlrp; }
getNumberOfInterLayerPictures()128   int     getNumberOfInterLayerPictures() const { return m_numberOfInterLayerPictures; }
129 
getNumRefEntries()130   int     getNumRefEntries() const { return m_numberOfShorttermPictures + m_numberOfLongtermPictures; }
131 
132   void    setPOC(int idx, int POC);
133   int     getPOC(int idx) const;
134 
getDeltaPocMSBCycleLT(int i)135   int     getDeltaPocMSBCycleLT(int i) const       { return m_deltaPOCMSBCycleLT[i]; }
136   void    setDeltaPocMSBCycleLT(int i, int x);
getDeltaPocMSBPresentFlag(int i)137   bool    getDeltaPocMSBPresentFlag(int i) const   { return m_deltaPocMSBPresentFlag[i]; }
138   void    setDeltaPocMSBPresentFlag(int i, bool x);
139 
140   void      printRefPicInfo() const;
getInterLayerPresentFlag()141   bool      getInterLayerPresentFlag()                   const { return m_interLayerPresentFlag; }
setInterLayerPresentFlag(bool b)142   void      setInterLayerPresentFlag( bool b )                 { m_interLayerPresentFlag = b; }
isInterLayerRefPic(int idx)143   bool      isInterLayerRefPic( int idx )                const { return m_isInterLayerRefPic[idx]; }
getInterLayerRefPicIdx(int idx)144   int       getInterLayerRefPicIdx( int idx )            const { return m_interLayerRefPicIdx[idx]; }
145   void      setInterLayerRefPicIdx( int idx, int layerIdc );
146 
147   static int calcLTRefPOC( int currPoc, int bitsForPoc, int refPicIdentifier, bool pocMSBPresent, int deltaPocMSBCycle );
148          int calcLTRefPOC( int currPoc, int bitsForPoc, int refPicIdx ) const;
149 };
150 
151 bool isLTPocEqual( int poc1, int poc2, int bitsForPoc, bool msbPresent );
152 
153 /// Reference Picture List set class
154 
155 typedef std::vector<ReferencePictureList> RPLList;
156 
157 
158 /// SCALING_LIST class
159 class ScalingList
160 {
161 public:
162   ScalingList();
163   ~ScalingList() = default;
getScalingListAddress(uint32_t scalingListId)164   int*       getScalingListAddress(uint32_t scalingListId)                    { return &(m_scalingListCoef[scalingListId][0]);            } //!< get matrix coefficient
getScalingListAddress(uint32_t scalingListId)165   const int* getScalingListAddress(uint32_t scalingListId) const              { return &(m_scalingListCoef[scalingListId][0]);            } //!< get matrix coefficient
166 
setRefMatrixId(uint32_t scalingListId,uint32_t u)167   void       setRefMatrixId(uint32_t scalingListId, uint32_t u)               { m_refMatrixId[scalingListId] = u;                         } //!< set reference matrix ID
getRefMatrixId(uint32_t scalingListId)168   uint32_t       getRefMatrixId(uint32_t scalingListId) const                 { return m_refMatrixId[scalingListId];                      } //!< get reference matrix ID
169 
170   static const int* getScalingListDefaultAddress(uint32_t scalinListId);                                                                           //!< get default matrix coefficient
171   void       processDefaultMatrix(uint32_t scalinListId);
172 
setScalingListDC(uint32_t scalinListId,uint32_t u)173   void       setScalingListDC(uint32_t scalinListId, uint32_t u)              { m_scalingListDC[scalinListId] = u;                        } //!< set DC value
getScalingListDC(uint32_t scalinListId)174   int        getScalingListDC(uint32_t scalinListId) const                    { return m_scalingListDC[scalinListId];                     } //!< get DC value
175 
setScalingListCopyModeFlag(uint32_t scalinListId,bool bIsCopy)176   void       setScalingListCopyModeFlag(uint32_t scalinListId, bool bIsCopy)  { m_scalingListPredModeFlagIsCopy[scalinListId] = bIsCopy;  }
getScalingListCopyModeFlag(uint32_t scalinListId)177   bool       getScalingListCopyModeFlag(uint32_t scalinListId) const          { return m_scalingListPredModeFlagIsCopy[scalinListId];     } //getScalingListPredModeFlag
178   void       processRefMatrix(uint32_t scalingListId, uint32_t refListId);
179 
180   int        lengthUvlc(int uiCode);
181   int        lengthSvlc(int uiCode);
setScalingListPreditorModeFlag(uint32_t scalingListId,bool bIsPred)182   void       setScalingListPreditorModeFlag(uint32_t scalingListId, bool bIsPred) { m_scalingListPreditorModeFlag[scalingListId] = bIsPred; }
getScalingListPreditorModeFlag(uint32_t scalingListId)183   bool       getScalingListPreditorModeFlag(uint32_t scalingListId) const { return m_scalingListPreditorModeFlag[scalingListId]; }
getChromaScalingListPresentFlag()184   bool       getChromaScalingListPresentFlag() const {return m_chromaScalingListPresentFlag;}
setChromaScalingListPresentFlag(bool flag)185   void       setChromaScalingListPresentFlag( bool flag) { m_chromaScalingListPresentFlag = flag;}
186   bool       isLumaScalingList( int scalingListId) const;
187   void       setDefaultScalingList();
188 
189 private:
190   bool             m_scalingListPredModeFlagIsCopy [30]; //!< reference list index
191   int              m_scalingListDC                 [30]; //!< the DC value of the matrix coefficient for 16x16
192   uint32_t         m_refMatrixId                   [30]; //!< RefMatrixID
193   bool             m_scalingListPreditorModeFlag   [30]; //!< reference list index
194   std::vector<int> m_scalingListCoef               [30]; //!< quantization matrix
195   bool             m_chromaScalingListPresentFlag = true;
196 };
197 
198 class ConstraintInfo
199 {
200   bool         m_gciPresentFlag                               = false;
201   bool         m_noRprConstraintFlag                          = false;
202   bool         m_noResChangeInClvsConstraintFlag              = false;
203   bool         m_oneTilePerPicConstraintFlag                  = false;
204   bool         m_picHeaderInSliceHeaderConstraintFlag         = false;
205   bool         m_oneSlicePerPicConstraintFlag                 = false;
206   bool         m_noIdrRplConstraintFlag                       = false;
207   bool         m_noRectSliceConstraintFlag                    = false;
208   bool         m_oneSlicePerSubpicConstraintFlag              = false;
209   bool         m_noSubpicInfoConstraintFlag                   = false;
210   bool         m_intraOnlyConstraintFlag                      = false;
211   uint32_t     m_maxBitDepthConstraintIdc                     = 16;
212   ChromaFormat m_maxChromaFormatConstraintIdc                 = CHROMA_444;
213   bool         m_onePictureOnlyConstraintFlag                 = false;
214   bool         m_lowerBitRateConstraintFlag                   = false;
215 
216   bool         m_allLayersIndependentConstraintFlag           = false;
217   bool         m_noMrlConstraintFlag                          = false;
218   bool         m_noIspConstraintFlag                          = false;
219   bool         m_noMipConstraintFlag                          = false;
220   bool         m_noLfnstConstraintFlag                        = false;
221   bool         m_noMmvdConstraintFlag                         = false;
222   bool         m_noSmvdConstraintFlag                         = false;
223   bool         m_noProfConstraintFlag                         = false;
224   bool         m_noPaletteConstraintFlag                      = false;
225   bool         m_noActConstraintFlag                          = false;
226   bool         m_noLmcsConstraintFlag                         = false;
227 
228   bool         m_noExplicitScaleListConstraintFlag            = false;
229   bool         m_noVirtualBoundaryConstraintFlag              = false;
230   bool         m_noMttConstraintFlag                          = false;
231   bool         m_noChromaQpOffsetConstraintFlag               = false;
232   bool         m_noQtbttDualTreeIntraConstraintFlag           = false;
233   int          m_maxLog2CtuSizeConstraintIdc                  = 8;
234   bool         m_noPartitionConstraintsOverrideConstraintFlag = false;
235   bool         m_noSaoConstraintFlag                          = false;
236   bool         m_noAlfConstraintFlag                          = false;
237   bool         m_noCCAlfConstraintFlag                        = false;
238   bool         m_noWeightedPredictionConstraintFlag           = false;
239   bool         m_noRefWraparoundConstraintFlag                = false;
240   bool         m_noTemporalMvpConstraintFlag                  = false;
241   bool         m_noSbtmvpConstraintFlag                       = false;
242   bool         m_noAmvrConstraintFlag                         = false;
243   bool         m_noBdofConstraintFlag                         = false;
244   bool         m_noDmvrConstraintFlag                         = false;
245   bool         m_noCclmConstraintFlag                         = false;
246   bool         m_noMtsConstraintFlag                          = false;
247   bool         m_noSbtConstraintFlag                          = false;
248   bool         m_noAffineMotionConstraintFlag                 = false;
249   bool         m_noBcwConstraintFlag                          = false;
250   bool         m_noIbcConstraintFlag                          = false;
251   bool         m_noCiipConstraintFlag                         = false;
252   bool         m_noGeoConstraintFlag                          = false;
253   bool         m_noLadfConstraintFlag                         = false;
254   bool         m_noTransformSkipConstraintFlag                = false;
255   bool         m_noLumaTransformSize64ConstraintFlag          = false;
256   bool         m_noBDPCMConstraintFlag                        = false;
257   bool         m_noJointCbCrConstraintFlag                    = false;
258   bool         m_noQpDeltaConstraintFlag                      = false;
259   bool         m_noDepQuantConstraintFlag                     = false;
260   bool         m_noSignDataHidingConstraintFlag               = false;
261   bool         m_noMixedNaluTypesInPicConstraintFlag          = false;
262   bool         m_noTrailConstraintFlag                        = false;
263   bool         m_noStsaConstraintFlag                         = false;
264   bool         m_noRaslConstraintFlag                         = false;
265   bool         m_noRadlConstraintFlag                         = false;
266   bool         m_noIdrConstraintFlag                          = false;
267   bool         m_noCraConstraintFlag                          = false;
268   bool         m_noGdrConstraintFlag                          = false;
269   bool         m_noApsConstraintFlag                          = false;
270 
271 public:
272 
273 
getGciPresentFlag()274   bool          getGciPresentFlag() const { return m_gciPresentFlag; }
setGciPresentFlag(bool b)275   void          setGciPresentFlag(bool b) { m_gciPresentFlag = b; }
276 
getMaxBitDepthConstraintIdc()277   uint32_t      getMaxBitDepthConstraintIdc() const { return m_maxBitDepthConstraintIdc; }
setMaxBitDepthConstraintIdc(uint32_t bitDepth)278   void          setMaxBitDepthConstraintIdc(uint32_t bitDepth) { m_maxBitDepthConstraintIdc = bitDepth; }
279 
getMaxChromaFormatConstraintIdc()280   ChromaFormat  getMaxChromaFormatConstraintIdc() const { return m_maxChromaFormatConstraintIdc; }
setMaxChromaFormatConstraintIdc(ChromaFormat fmt)281   void          setMaxChromaFormatConstraintIdc(ChromaFormat fmt) { m_maxChromaFormatConstraintIdc = fmt; }
282 
getNoRprConstraintFlag()283   bool          getNoRprConstraintFlag() const { return m_noRprConstraintFlag; }
setNoRprConstraintFlag(bool b)284   void          setNoRprConstraintFlag(bool b) { m_noRprConstraintFlag = b; }
285 
getNoResChangeInClvsConstraintFlag()286   bool          getNoResChangeInClvsConstraintFlag() const { return m_noResChangeInClvsConstraintFlag; }
setNoResChangeInClvsConstraintFlag(bool b)287   void          setNoResChangeInClvsConstraintFlag(bool b) { m_noResChangeInClvsConstraintFlag = b; }
288 
getOneTilePerPicConstraintFlag()289   bool          getOneTilePerPicConstraintFlag() const { return m_oneTilePerPicConstraintFlag; }
setOneTilePerPicConstraintFlag(bool b)290   void          setOneTilePerPicConstraintFlag(bool b) { m_oneTilePerPicConstraintFlag = b; }
291 
getPicHeaderInSliceHeaderConstraintFlag()292   bool          getPicHeaderInSliceHeaderConstraintFlag() const { return m_picHeaderInSliceHeaderConstraintFlag; }
setPicHeaderInSliceHeaderConstraintFlag(bool b)293   void          setPicHeaderInSliceHeaderConstraintFlag(bool b) { m_picHeaderInSliceHeaderConstraintFlag = b; }
getOneSlicePerPicConstraintFlag()294   bool          getOneSlicePerPicConstraintFlag() const { return m_oneSlicePerPicConstraintFlag; }
setOneSlicePerPicConstraintFlag(bool b)295   void          setOneSlicePerPicConstraintFlag(bool b) { m_oneSlicePerPicConstraintFlag = b; }
296 
getNoIdrRplConstraintFlag()297   bool          getNoIdrRplConstraintFlag() const          { return m_noIdrRplConstraintFlag; }
setNoIdrRplConstraintFlag(bool b)298   void          setNoIdrRplConstraintFlag(bool b)          { m_noIdrRplConstraintFlag = b; }
299 
getNoRectSliceConstraintFlag()300   bool          getNoRectSliceConstraintFlag() const       { return m_noRectSliceConstraintFlag; }
setNoRectSliceConstraintFlag(bool b)301   void          setNoRectSliceConstraintFlag(bool b)       { m_noRectSliceConstraintFlag = b; }
302 
getOneSlicePerSubpicConstraintFlag()303   bool          getOneSlicePerSubpicConstraintFlag() const { return m_oneSlicePerSubpicConstraintFlag; }
setOneSlicePerSubpicConstraintFlag(bool b)304   void          setOneSlicePerSubpicConstraintFlag(bool b) { m_oneSlicePerSubpicConstraintFlag = b; }
305 
getNoSubpicInfoConstraintFlag()306   bool          getNoSubpicInfoConstraintFlag() const      { return m_noSubpicInfoConstraintFlag; }
setNoSubpicInfoConstraintFlag(bool b)307   void          setNoSubpicInfoConstraintFlag(bool b)      { m_noSubpicInfoConstraintFlag = b; }
308 
getIntraOnlyConstraintFlag()309   bool          getIntraOnlyConstraintFlag() const { return m_intraOnlyConstraintFlag; }
setIntraOnlyConstraintFlag(bool b)310   void          setIntraOnlyConstraintFlag(bool b) { m_intraOnlyConstraintFlag = b; }
311 
getOnePictureOnlyConstraintFlag()312   bool          getOnePictureOnlyConstraintFlag() const { return m_onePictureOnlyConstraintFlag; }
setOnePictureOnlyConstraintFlag(bool b)313   void          setOnePictureOnlyConstraintFlag(bool b) { m_onePictureOnlyConstraintFlag = b; }
314 
getLowerBitRateConstraintFlag()315   bool          getLowerBitRateConstraintFlag() const { return m_lowerBitRateConstraintFlag; }
setLowerBitRateConstraintFlag(bool b)316   void          setLowerBitRateConstraintFlag(bool b) { m_lowerBitRateConstraintFlag = b; }
getAllLayersIndependentConstraintFlag()317   bool          getAllLayersIndependentConstraintFlag() const { return m_allLayersIndependentConstraintFlag; }
setAllLayersIndependentConstraintFlag(bool b)318   void          setAllLayersIndependentConstraintFlag(bool b) { m_allLayersIndependentConstraintFlag = b; }
getNoMrlConstraintFlag()319   bool          getNoMrlConstraintFlag() const { return m_noMrlConstraintFlag; }
setNoMrlConstraintFlag(bool b)320   void          setNoMrlConstraintFlag(bool b) { m_noMrlConstraintFlag = b; }
getNoIspConstraintFlag()321   bool          getNoIspConstraintFlag() const { return m_noIspConstraintFlag; }
setNoIspConstraintFlag(bool b)322   void          setNoIspConstraintFlag(bool b) { m_noIspConstraintFlag = b; }
getNoMipConstraintFlag()323   bool          getNoMipConstraintFlag() const { return m_noMipConstraintFlag; }
setNoMipConstraintFlag(bool b)324   void          setNoMipConstraintFlag(bool b) { m_noMipConstraintFlag = b; }
getNoLfnstConstraintFlag()325   bool          getNoLfnstConstraintFlag() const { return m_noLfnstConstraintFlag; }
setNoLfnstConstraintFlag(bool b)326   void          setNoLfnstConstraintFlag(bool b) { m_noLfnstConstraintFlag = b; }
getNoMmvdConstraintFlag()327   bool          getNoMmvdConstraintFlag() const { return m_noMmvdConstraintFlag; }
setNoMmvdConstraintFlag(bool b)328   void          setNoMmvdConstraintFlag(bool b) { m_noMmvdConstraintFlag = b; }
getNoSmvdConstraintFlag()329   bool          getNoSmvdConstraintFlag() const { return m_noSmvdConstraintFlag; }
setNoSmvdConstraintFlag(bool b)330   void          setNoSmvdConstraintFlag(bool b) { m_noSmvdConstraintFlag = b; }
getNoProfConstraintFlag()331   bool          getNoProfConstraintFlag() const { return m_noProfConstraintFlag; }
setNoProfConstraintFlag(bool b)332   void          setNoProfConstraintFlag(bool b) { m_noProfConstraintFlag = b; }
getNoPaletteConstraintFlag()333   bool          getNoPaletteConstraintFlag() const { return m_noPaletteConstraintFlag; }
setNoPaletteConstraintFlag(bool b)334   void          setNoPaletteConstraintFlag(bool b) { m_noPaletteConstraintFlag = b; }
getNoActConstraintFlag()335   bool          getNoActConstraintFlag() const { return m_noActConstraintFlag; }
setNoActConstraintFlag(bool b)336   void          setNoActConstraintFlag(bool b) { m_noActConstraintFlag = b; }
getNoLmcsConstraintFlag()337   bool          getNoLmcsConstraintFlag() const { return m_noLmcsConstraintFlag; }
setNoLmcsConstraintFlag(bool b)338   void          setNoLmcsConstraintFlag(bool b) { m_noLmcsConstraintFlag = b; }
getNoExplicitScaleListConstraintFlag()339   bool          getNoExplicitScaleListConstraintFlag() const { return m_noExplicitScaleListConstraintFlag; }
setNoExplicitScaleListConstraintFlag(bool b)340   void          setNoExplicitScaleListConstraintFlag(bool b) { m_noExplicitScaleListConstraintFlag = b; }
getNoVirtualBoundaryConstraintFlag()341   bool          getNoVirtualBoundaryConstraintFlag() const { return m_noVirtualBoundaryConstraintFlag; }
setNoVirtualBoundaryConstraintFlag(bool b)342   void          setNoVirtualBoundaryConstraintFlag(bool b) { m_noVirtualBoundaryConstraintFlag = b; }
getNoMttConstraintFlag()343   bool          getNoMttConstraintFlag() const { return m_noMttConstraintFlag; }
setNoMttConstraintFlag(bool bVal)344   void          setNoMttConstraintFlag(bool bVal) { m_noMttConstraintFlag = bVal; }
getNoChromaQpOffsetConstraintFlag()345   bool          getNoChromaQpOffsetConstraintFlag() const { return m_noChromaQpOffsetConstraintFlag; }
setNoChromaQpOffsetConstraintFlag(bool b)346   void          setNoChromaQpOffsetConstraintFlag(bool b) { m_noChromaQpOffsetConstraintFlag = b; }
getNoQtbttDualTreeIntraConstraintFlag()347   bool          getNoQtbttDualTreeIntraConstraintFlag() const { return m_noQtbttDualTreeIntraConstraintFlag; }
setNoQtbttDualTreeIntraConstraintFlag(bool bVal)348   void          setNoQtbttDualTreeIntraConstraintFlag(bool bVal) { m_noQtbttDualTreeIntraConstraintFlag = bVal; }
getMaxLog2CtuSizeConstraintIdc()349   int           getMaxLog2CtuSizeConstraintIdc() const { return m_maxLog2CtuSizeConstraintIdc; }
setMaxLog2CtuSizeConstraintIdc(int idc)350   void          setMaxLog2CtuSizeConstraintIdc(int idc) { m_maxLog2CtuSizeConstraintIdc = idc; }
getNoPartitionConstraintsOverrideConstraintFlag()351   bool          getNoPartitionConstraintsOverrideConstraintFlag() const { return m_noPartitionConstraintsOverrideConstraintFlag; }
setNoPartitionConstraintsOverrideConstraintFlag(bool bVal)352   void          setNoPartitionConstraintsOverrideConstraintFlag(bool bVal) { m_noPartitionConstraintsOverrideConstraintFlag = bVal; }
getNoSaoConstraintFlag()353   bool          getNoSaoConstraintFlag() const { return m_noSaoConstraintFlag; }
setNoSaoConstraintFlag(bool bVal)354   void          setNoSaoConstraintFlag(bool bVal) { m_noSaoConstraintFlag = bVal; }
getNoAlfConstraintFlag()355   bool          getNoAlfConstraintFlag() const { return m_noAlfConstraintFlag; }
setNoAlfConstraintFlag(bool bVal)356   void          setNoAlfConstraintFlag(bool bVal) { m_noAlfConstraintFlag = bVal; }
getNoCCAlfConstraintFlag()357   bool          getNoCCAlfConstraintFlag() const { return m_noCCAlfConstraintFlag; }
setNoCCAlfConstraintFlag(bool val)358   void          setNoCCAlfConstraintFlag(bool val) { m_noCCAlfConstraintFlag = val; }
getNoJointCbCrConstraintFlag()359   bool          getNoJointCbCrConstraintFlag() const { return m_noJointCbCrConstraintFlag; }
setNoJointCbCrConstraintFlag(bool bVal)360   void          setNoJointCbCrConstraintFlag(bool bVal) { m_noJointCbCrConstraintFlag = bVal; }
getNoWeightedPredictionConstraintFlag()361   bool          getNoWeightedPredictionConstraintFlag() const { return m_noWeightedPredictionConstraintFlag; }
setNoWeightedPredictionConstraintFlag(bool bVal)362   void          setNoWeightedPredictionConstraintFlag(bool bVal) { m_noWeightedPredictionConstraintFlag = bVal; }
getNoRefWraparoundConstraintFlag()363   bool          getNoRefWraparoundConstraintFlag() const { return m_noRefWraparoundConstraintFlag; }
setNoRefWraparoundConstraintFlag(bool bVal)364   void          setNoRefWraparoundConstraintFlag(bool bVal) { m_noRefWraparoundConstraintFlag = bVal; }
getNoTemporalMvpConstraintFlag()365   bool          getNoTemporalMvpConstraintFlag() const { return m_noTemporalMvpConstraintFlag; }
setNoTemporalMvpConstraintFlag(bool bVal)366   void          setNoTemporalMvpConstraintFlag(bool bVal) { m_noTemporalMvpConstraintFlag = bVal; }
getNoSbtmvpConstraintFlag()367   bool          getNoSbtmvpConstraintFlag() const { return m_noSbtmvpConstraintFlag; }
setNoSbtmvpConstraintFlag(bool bVal)368   void          setNoSbtmvpConstraintFlag(bool bVal) { m_noSbtmvpConstraintFlag = bVal; }
getNoAmvrConstraintFlag()369   bool          getNoAmvrConstraintFlag() const { return m_noAmvrConstraintFlag; }
setNoAmvrConstraintFlag(bool bVal)370   void          setNoAmvrConstraintFlag(bool bVal) { m_noAmvrConstraintFlag = bVal; }
getNoBdofConstraintFlag()371   bool          getNoBdofConstraintFlag() const { return m_noBdofConstraintFlag; }
setNoBdofConstraintFlag(bool bVal)372   void          setNoBdofConstraintFlag(bool bVal) { m_noBdofConstraintFlag = bVal; }
getNoDmvrConstraintFlag()373   bool          getNoDmvrConstraintFlag() const { return m_noDmvrConstraintFlag; }
setNoDmvrConstraintFlag(bool bVal)374   void          setNoDmvrConstraintFlag(bool bVal) { m_noDmvrConstraintFlag = bVal; }
getNoCclmConstraintFlag()375   bool          getNoCclmConstraintFlag() const { return m_noCclmConstraintFlag; }
setNoCclmConstraintFlag(bool bVal)376   void          setNoCclmConstraintFlag(bool bVal) { m_noCclmConstraintFlag = bVal; }
getNoMtsConstraintFlag()377   bool          getNoMtsConstraintFlag() const { return m_noMtsConstraintFlag; }
setNoMtsConstraintFlag(bool bVal)378   void          setNoMtsConstraintFlag(bool bVal) { m_noMtsConstraintFlag = bVal; }
getNoSbtConstraintFlag()379   bool          getNoSbtConstraintFlag() const { return m_noSbtConstraintFlag; }
setNoSbtConstraintFlag(bool bVal)380   void          setNoSbtConstraintFlag(bool bVal) { m_noSbtConstraintFlag = bVal; }
getNoAffineMotionConstraintFlag()381   bool          getNoAffineMotionConstraintFlag() const { return m_noAffineMotionConstraintFlag; }
setNoAffineMotionConstraintFlag(bool bVal)382   void          setNoAffineMotionConstraintFlag(bool bVal) { m_noAffineMotionConstraintFlag = bVal; }
getNoBcwConstraintFlag()383   bool          getNoBcwConstraintFlag() const { return m_noBcwConstraintFlag; }
setNoBcwConstraintFlag(bool bVal)384   void          setNoBcwConstraintFlag(bool bVal) { m_noBcwConstraintFlag = bVal; }
getNoIbcConstraintFlag()385   bool          getNoIbcConstraintFlag() const { return m_noIbcConstraintFlag; }
setNoIbcConstraintFlag(bool bVal)386   void          setNoIbcConstraintFlag(bool bVal) { m_noIbcConstraintFlag = bVal; }
getNoCiipConstraintFlag()387   bool          getNoCiipConstraintFlag() const { return m_noCiipConstraintFlag; }
setNoCiipConstraintFlag(bool bVal)388   void          setNoCiipConstraintFlag(bool bVal) { m_noCiipConstraintFlag = bVal; }
getNoGeoConstraintFlag()389   bool          getNoGeoConstraintFlag() const { return m_noGeoConstraintFlag; }
setNoGeoConstraintFlag(bool bVal)390   void          setNoGeoConstraintFlag(bool bVal) { m_noGeoConstraintFlag = bVal; }
getNoLadfConstraintFlag()391   bool          getNoLadfConstraintFlag() const { return m_noLadfConstraintFlag; }
setNoLadfConstraintFlag(bool bVal)392   void          setNoLadfConstraintFlag(bool bVal) { m_noLadfConstraintFlag = bVal; }
getNoTransformSkipConstraintFlag()393   bool          getNoTransformSkipConstraintFlag() const { return m_noTransformSkipConstraintFlag; }
setNoTransformSkipConstraintFlag(bool bVal)394   void          setNoTransformSkipConstraintFlag(bool bVal) { m_noTransformSkipConstraintFlag = bVal; }
getNoLumaTransformSize64ConstraintFlag()395   bool          getNoLumaTransformSize64ConstraintFlag() const { return m_noLumaTransformSize64ConstraintFlag; }
setNoLumaTransformSize64ConstraintFlag(bool bVal)396   void          setNoLumaTransformSize64ConstraintFlag(bool bVal) { m_noLumaTransformSize64ConstraintFlag = bVal; }
getNoBDPCMConstraintFlag()397   bool          getNoBDPCMConstraintFlag() const { return m_noBDPCMConstraintFlag; }
setNoBDPCMConstraintFlag(bool bVal)398   void          setNoBDPCMConstraintFlag(bool bVal) { m_noBDPCMConstraintFlag = bVal; }
getNoQpDeltaConstraintFlag()399   bool          getNoQpDeltaConstraintFlag() const { return m_noQpDeltaConstraintFlag; }
setNoQpDeltaConstraintFlag(bool bVal)400   void          setNoQpDeltaConstraintFlag(bool bVal) { m_noQpDeltaConstraintFlag = bVal; }
getNoDepQuantConstraintFlag()401   bool          getNoDepQuantConstraintFlag() const { return m_noDepQuantConstraintFlag; }
setNoDepQuantConstraintFlag(bool bVal)402   void          setNoDepQuantConstraintFlag(bool bVal) { m_noDepQuantConstraintFlag = bVal; }
getNoSignDataHidingConstraintFlag()403   bool          getNoSignDataHidingConstraintFlag() const { return m_noSignDataHidingConstraintFlag; }
setNoSignDataHidingConstraintFlag(bool bVal)404   void          setNoSignDataHidingConstraintFlag(bool bVal) { m_noSignDataHidingConstraintFlag = bVal; }
getNoMixedNaluTypesInPicConstraintFlag()405   bool          getNoMixedNaluTypesInPicConstraintFlag() const    { return m_noMixedNaluTypesInPicConstraintFlag; }
setNoMixedNaluTypesInPicConstraintFlag(bool bVal)406   void          setNoMixedNaluTypesInPicConstraintFlag(bool bVal) { m_noMixedNaluTypesInPicConstraintFlag = bVal; }
getNoTrailConstraintFlag()407   bool          getNoTrailConstraintFlag() const { return m_noTrailConstraintFlag; }
setNoTrailConstraintFlag(bool bVal)408   void          setNoTrailConstraintFlag(bool bVal) { m_noTrailConstraintFlag = bVal; }
getNoStsaConstraintFlag()409   bool          getNoStsaConstraintFlag() const { return m_noStsaConstraintFlag; }
setNoStsaConstraintFlag(bool bVal)410   void          setNoStsaConstraintFlag(bool bVal) { m_noStsaConstraintFlag = bVal; }
getNoRaslConstraintFlag()411   bool          getNoRaslConstraintFlag() const { return m_noRaslConstraintFlag; }
setNoRaslConstraintFlag(bool bVal)412   void          setNoRaslConstraintFlag(bool bVal) { m_noRaslConstraintFlag = bVal; }
getNoRadlConstraintFlag()413   bool          getNoRadlConstraintFlag() const { return m_noRadlConstraintFlag; }
setNoRadlConstraintFlag(bool bVal)414   void          setNoRadlConstraintFlag(bool bVal) { m_noRadlConstraintFlag = bVal; }
getNoIdrConstraintFlag()415   bool          getNoIdrConstraintFlag() const { return m_noIdrConstraintFlag; }
setNoIdrConstraintFlag(bool bVal)416   void          setNoIdrConstraintFlag(bool bVal) { m_noIdrConstraintFlag = bVal; }
getNoCraConstraintFlag()417   bool          getNoCraConstraintFlag() const { return m_noCraConstraintFlag; }
setNoCraConstraintFlag(bool bVal)418   void          setNoCraConstraintFlag(bool bVal) { m_noCraConstraintFlag = bVal; }
getNoGdrConstraintFlag()419   bool          getNoGdrConstraintFlag() const { return m_noGdrConstraintFlag; }
setNoGdrConstraintFlag(bool bVal)420   void          setNoGdrConstraintFlag(bool bVal) { m_noGdrConstraintFlag = bVal; }
getNoApsConstraintFlag()421   bool          getNoApsConstraintFlag() const { return m_noApsConstraintFlag; }
setNoApsConstraintFlag(bool bVal)422   void          setNoApsConstraintFlag(bool bVal) { m_noApsConstraintFlag = bVal; }
423 
424   friend bool             operator == (const ConstraintInfo& op1, const ConstraintInfo& op2);
425   friend bool             operator != (const ConstraintInfo& op1, const ConstraintInfo& op2);
426 };
427 
428 class ProfileTierLevel
429 {
430   Tier                  m_tierFlag      = Tier::MAIN;
431   Profile::Name         m_profileIdc    = Profile::NONE;
432   uint8_t               m_numSubProfile = 0;
433   std::vector<uint32_t> m_subProfileIdc;
434   vvdecLevel            m_levelIdc                = vvdecLevel::VVDEC_LEVEL_NONE;
435   bool                  m_frameOnlyConstraintFlag = true;
436   bool                  m_multiLayerEnabledFlag   = false;
437   ConstraintInfo        m_constraintInfo;
438   bool                  m_subLayerLevelPresentFlag[MAX_TLAYER - 1];   // init in constructor
439   vvdecLevel            m_subLayerLevelIdc[MAX_TLAYER];               // init in constructor
440 
441 public:
ProfileTierLevel()442   ProfileTierLevel()
443   {
444     ::memset( m_subLayerLevelPresentFlag, 0, sizeof( m_subLayerLevelPresentFlag ) );
445     ::memset( m_subLayerLevelIdc, vvdecLevel::VVDEC_LEVEL_NONE, sizeof( m_subLayerLevelIdc ) );
446   }
447 
getTierFlag()448   Tier                    getTierFlag() const                         { return m_tierFlag;                    }
setTierFlag(Tier x)449   void                    setTierFlag(Tier x)                         { m_tierFlag = x;                       }
450 
getProfileIdc()451   Profile::Name           getProfileIdc() const                       { return m_profileIdc;                  }
setProfileIdc(Profile::Name x)452   void                    setProfileIdc(Profile::Name x)              { m_profileIdc = x;                     }
453 
getNumSubProfile()454   uint8_t                 getNumSubProfile() const                    { return m_numSubProfile; }
setNumSubProfile(uint8_t x)455   void                    setNumSubProfile(uint8_t x)                 { m_numSubProfile = x; m_subProfileIdc.resize(m_numSubProfile); }
456 
getSubProfileIdc(int i)457   uint32_t                getSubProfileIdc(int i) const               { return m_subProfileIdc[i]; }
setSubProfileIdc(int i,uint32_t x)458   void                    setSubProfileIdc(int i, uint32_t x)         { m_subProfileIdc[i] = x; }
459 
getLevelIdc()460   vvdecLevel              getLevelIdc() const                         { return m_levelIdc;                    }
setLevelIdc(vvdecLevel x)461   void                    setLevelIdc(vvdecLevel x)                   { m_levelIdc = x;                       }
462 
getFrameOnlyConstraintFlag()463   bool                    getFrameOnlyConstraintFlag() const          { return m_frameOnlyConstraintFlag; }
setFrameOnlyConstraintFlag(bool x)464   void                    setFrameOnlyConstraintFlag(bool x)          { m_frameOnlyConstraintFlag = x;    }
465 
getMultiLayerEnabledFlag()466   bool                    getMultiLayerEnabledFlag() const           { return m_multiLayerEnabledFlag; }
setMultiLayerEnabledFlag(bool x)467   void                    setMultiLayerEnabledFlag(bool x)           { m_multiLayerEnabledFlag = x;    }
468 
getConstraintInfo()469   ConstraintInfo*         getConstraintInfo()                        { return &m_constraintInfo; }
getConstraintInfo()470   const ConstraintInfo*   getConstraintInfo() const                  { return &m_constraintInfo; }
471 
getSubLayerLevelPresentFlag(int i)472   bool                    getSubLayerLevelPresentFlag(int i) const   { return m_subLayerLevelPresentFlag[i];   }
setSubLayerLevelPresentFlag(int i,bool x)473   void                    setSubLayerLevelPresentFlag(int i, bool x) { m_subLayerLevelPresentFlag[i] = x;      }
474 
getSubLayerLevelIdc(int i)475   vvdecLevel              getSubLayerLevelIdc(int i) const           { return m_subLayerLevelIdc[i];   }
setSubLayerLevelIdc(int i,vvdecLevel x)476   void                    setSubLayerLevelIdc(int i, vvdecLevel x)   { m_subLayerLevelIdc[i] = x;      }
477 
478   friend bool             operator == (const ProfileTierLevel& op1, const ProfileTierLevel& op2);
479   friend bool             operator != (const ProfileTierLevel& op1, const ProfileTierLevel& op2);
480 };
481 
482 struct HrdSubLayerInfo
483 {
484   bool fixedPicRateFlag;
485   bool fixedPicRateWithinCvsFlag;
486   uint32_t picDurationInTcMinus1;
487   bool lowDelayHrdFlag;
488   uint32_t cpbCntMinus1;
489   uint32_t bitRateValueMinus1[MAX_CPB_CNT][2];
490   uint32_t cpbSizeValue      [MAX_CPB_CNT][2];
491   uint32_t ducpbSizeValue    [MAX_CPB_CNT][2];
492   bool     cbrFlag           [MAX_CPB_CNT][2];
493   uint32_t duBitRateValue    [MAX_CPB_CNT][2];
494 };
495 
496 class SliceReshapeInfo
497 {
498 public:
499   bool      sliceReshaperEnableFlag;
500   bool      sliceReshaperModelPresentFlag;
501   unsigned  enableChromaAdj;
502   uint32_t  reshaperModelMinBinIdx;
503   uint32_t  reshaperModelMaxBinIdx;
504   int       reshaperModelBinCWDelta[PIC_CODE_CW_BINS];
505   int       maxNbitsNeededDeltaCW;
506   int       chrResScalingOffset;
507 };
508 
509 struct ReshapeCW
510 {
511   std::vector<uint32_t> binCW;
512   int rspPicSize;
513   int rspIntraPeriod;
514   int rspFps;
515   int rspBaseQP;
516   int rspTid;
517   int rspSliceQP;
518   int rspFpsToIp;
519 };
520 
521 template<class T>
522 struct BasePS: public std::enable_shared_from_this<T>
523 {
getSharedPtrBasePS524   std::shared_ptr<T> getSharedPtr()
525   {
526     return (static_cast<T*>(this))->shared_from_this();
527   }
getSharedPtrBasePS528   std::shared_ptr<const T> getSharedPtr() const
529   {
530     return (static_cast<const T*>(this))->shared_from_this();
531   }
532 
clearChangedFlagBasePS533   void clearChangedFlag()
534   {
535     m_changedFlag = false;
536   }
537 
getChangedFlagBasePS538   bool getChangedFlag() const
539   {
540     return m_changedFlag;
541   }
542 
543   bool             m_changedFlag = false;
544 
545   template<class Tf, int MAX_ID> friend class ParameterSetMap;
546 };
547 
548 class DCI
549 {
550 private:
551   int m_maxSubLayersMinus1;
552   std::vector<ProfileTierLevel> m_profileTierLevel;
553 
554 public:
DCI()555   DCI()
556     : m_maxSubLayersMinus1(0)
557   {};
558 
~DCI()559   virtual ~DCI() {};
560 
getMaxSubLayersMinus1()561   int  getMaxSubLayersMinus1() const { return m_maxSubLayersMinus1; }
setMaxSubLayersMinus1(int val)562   void setMaxSubLayersMinus1(int val) { m_maxSubLayersMinus1 = val; }
563 
getNumPTLs()564   size_t getNumPTLs() const { return m_profileTierLevel.size(); }
setProfileTierLevel(const std::vector<ProfileTierLevel> & val)565   void  setProfileTierLevel(const std::vector<ProfileTierLevel>& val) { m_profileTierLevel = val; }
getProfileTierLevel(int idx)566   const ProfileTierLevel& getProfileTierLevel(int idx) const { return m_profileTierLevel[idx]; }
IsIndenticalDCI(const DCI & comparedDCI)567   bool  IsIndenticalDCI(const DCI& comparedDCI) const
568   {
569     if(m_maxSubLayersMinus1 != comparedDCI.m_maxSubLayersMinus1) return false;
570     if(m_profileTierLevel != comparedDCI.m_profileTierLevel) return false;
571     return true;
572   }
573 };
574 
575 class OlsHrdParams
576 {
577 private:
578   bool     m_fixedPicRateGeneralFlag   = false;
579   bool     m_fixedPicRateWithinCvsFlag = false;
580   uint32_t m_elementDurationInTcMinus1 = false;
581   bool     m_lowDelayHrdFlag           = false;
582 
583   uint32_t m_bitRateValueMinus1[MAX_CPB_CNT][2];
584   uint32_t m_cpbSizeValueMinus1[MAX_CPB_CNT][2];
585   uint32_t m_ducpbSizeValueMinus1[MAX_CPB_CNT][2];
586   uint32_t m_duBitRateValueMinus1[MAX_CPB_CNT][2];
587   bool     m_cbrFlag[MAX_CPB_CNT][2];
588 public:
589 //  OlsHrdParams();
590 //  virtual ~OlsHrdParams();
591 
setFixedPicRateGeneralFlag(bool flag)592   void      setFixedPicRateGeneralFlag(bool flag) { m_fixedPicRateGeneralFlag = flag; }
getFixedPicRateGeneralFlag()593   bool      getFixedPicRateGeneralFlag() const { return m_fixedPicRateGeneralFlag; }
setFixedPicRateWithinCvsFlag(bool flag)594   void      setFixedPicRateWithinCvsFlag(bool flag) { m_fixedPicRateWithinCvsFlag = flag; }
getFixedPicRateWithinCvsFlag()595   bool      getFixedPicRateWithinCvsFlag() const { return m_fixedPicRateWithinCvsFlag; }
setElementDurationInTcMinus1(uint32_t value)596   void      setElementDurationInTcMinus1(uint32_t value) { m_elementDurationInTcMinus1 = value; }
getElementDurationInTcMinus1()597   uint32_t  getElementDurationInTcMinus1() const { return m_elementDurationInTcMinus1; }
setLowDelayHrdFlag(bool flag)598   void      setLowDelayHrdFlag(bool flag) { m_lowDelayHrdFlag = flag; }
getLowDelayHrdFlag()599   bool      getLowDelayHrdFlag() const { return m_lowDelayHrdFlag; }
setBitRateValueMinus1(int cpbcnt,int nalOrVcl,uint32_t value)600   void      setBitRateValueMinus1(int cpbcnt, int nalOrVcl, uint32_t value) { m_bitRateValueMinus1[cpbcnt][nalOrVcl] = value; }
getBitRateValueMinus1(int cpbcnt,int nalOrVcl)601   uint32_t  getBitRateValueMinus1(int cpbcnt, int nalOrVcl) const { return m_bitRateValueMinus1[cpbcnt][nalOrVcl]; }
602 
setCpbSizeValueMinus1(int cpbcnt,int nalOrVcl,uint32_t value)603   void      setCpbSizeValueMinus1(int cpbcnt, int nalOrVcl, uint32_t value) { m_cpbSizeValueMinus1[cpbcnt][nalOrVcl] = value; }
getCpbSizeValueMinus1(int cpbcnt,int nalOrVcl)604   uint32_t  getCpbSizeValueMinus1(int cpbcnt, int nalOrVcl) const { return m_cpbSizeValueMinus1[cpbcnt][nalOrVcl]; }
setDuCpbSizeValueMinus1(int cpbcnt,int nalOrVcl,uint32_t value)605   void      setDuCpbSizeValueMinus1(int cpbcnt, int nalOrVcl, uint32_t value) { m_ducpbSizeValueMinus1[cpbcnt][nalOrVcl] = value; }
getDuCpbSizeValueMinus1(int cpbcnt,int nalOrVcl)606   uint32_t  getDuCpbSizeValueMinus1(int cpbcnt, int nalOrVcl) const { return m_ducpbSizeValueMinus1[cpbcnt][nalOrVcl]; }
setDuBitRateValueMinus1(int cpbcnt,int nalOrVcl,uint32_t value)607   void      setDuBitRateValueMinus1(int cpbcnt, int nalOrVcl, uint32_t value) { m_duBitRateValueMinus1[cpbcnt][nalOrVcl] = value; }
getDuBitRateValueMinus1(int cpbcnt,int nalOrVcl)608   uint32_t  getDuBitRateValueMinus1(int cpbcnt, int nalOrVcl) const { return m_duBitRateValueMinus1[cpbcnt][nalOrVcl]; }
setCbrFlag(int cpbcnt,int nalOrVcl,bool value)609   void      setCbrFlag(int cpbcnt, int nalOrVcl, bool value) { m_cbrFlag[cpbcnt][nalOrVcl] = value; }
getCbrFlag(int cpbcnt,int nalOrVcl)610   bool      getCbrFlag(int cpbcnt, int nalOrVcl) const { return m_cbrFlag[cpbcnt][nalOrVcl]; }
611 };
612 
613 class GeneralHrdParams
614 {
615 private:
616   uint32_t m_numUnitsInTick                          = 0;
617   uint32_t m_timeScale                               = 0;
618   bool     m_generalNalHrdParamsPresentFlag          = 0;
619   bool     m_generalVclHrdParamsPresentFlag          = 0;
620   bool     m_generalSamePicTimingInAllOlsFlag        = false;
621   uint32_t m_tickDivisorMinus2                       = 0;
622   bool     m_generalDecodingUnitHrdParamsPresentFlag = false;
623   uint32_t m_bitRateScale                            = 0;
624   uint32_t m_cpbSizeScale                            = 0;
625   uint32_t m_cpbSizeDuScale                          = 0;
626   uint32_t m_hrdCpbCntMinus1                         = 0;
627 
628 public:
629 //  GeneralHrdParams()
630 //    :m_generalNalHrdParamsPresentFlag(false)
631 //    ,m_generalVclHrdParamsPresentFlag(false)
632 //    ,m_generalSamePicTimingInAllOlsFlag(true)
633 //    ,m_tickDivisorMinus2                 (0)
634 //    ,m_generalDecodingUnitHrdParamsPresentFlag  (false)
635 //    ,m_bitRateScale                      (0)
636 //    ,m_cpbSizeScale                      (0)
637 //    ,m_cpbSizeDuScale                    (0)
638 //    ,m_hrdCpbCntMinus1(0)
639 //  {}
640   bool operator==(const GeneralHrdParams& other) const
641   {
642     return (m_numUnitsInTick == other.m_numUnitsInTick
643       && m_timeScale == other.m_timeScale
644       && m_generalNalHrdParamsPresentFlag == other.m_generalNalHrdParamsPresentFlag
645       && m_generalVclHrdParamsPresentFlag == other.m_generalVclHrdParamsPresentFlag
646       && m_generalSamePicTimingInAllOlsFlag == other.m_generalSamePicTimingInAllOlsFlag
647       && m_generalDecodingUnitHrdParamsPresentFlag == other.m_generalDecodingUnitHrdParamsPresentFlag
648       && (m_generalDecodingUnitHrdParamsPresentFlag ? (m_tickDivisorMinus2 == other.m_tickDivisorMinus2): 1)
649       && m_bitRateScale == other.m_bitRateScale
650       && m_cpbSizeScale == other.m_cpbSizeScale
651       && (m_generalDecodingUnitHrdParamsPresentFlag ? (m_cpbSizeDuScale == other.m_cpbSizeDuScale) : 1)
652       && m_hrdCpbCntMinus1 == other.m_hrdCpbCntMinus1
653       );
654   }
655 
656   GeneralHrdParams& operator=(const GeneralHrdParams& input)
657   {
658     m_numUnitsInTick = input.m_numUnitsInTick;
659     m_timeScale = input.m_timeScale;
660     m_generalNalHrdParamsPresentFlag = input.m_generalNalHrdParamsPresentFlag;
661     m_generalVclHrdParamsPresentFlag = input.m_generalVclHrdParamsPresentFlag;
662     m_generalSamePicTimingInAllOlsFlag = input.m_generalSamePicTimingInAllOlsFlag;
663     m_generalDecodingUnitHrdParamsPresentFlag = input.m_generalDecodingUnitHrdParamsPresentFlag;
664     if (input.m_generalDecodingUnitHrdParamsPresentFlag)
665     {
666       m_tickDivisorMinus2 = input.m_tickDivisorMinus2;
667     }
668     m_bitRateScale = input.m_bitRateScale;
669     m_cpbSizeScale = input.m_cpbSizeScale;
670     if (input.m_generalDecodingUnitHrdParamsPresentFlag)
671     {
672       m_cpbSizeDuScale = input.m_cpbSizeDuScale;
673     }
674     m_hrdCpbCntMinus1 = input.m_hrdCpbCntMinus1;
675     return *this;
676   }
677 //  virtual ~GeneralHrdParams() {}
setNumUnitsInTick(uint32_t value)678   void      setNumUnitsInTick(uint32_t value) { m_numUnitsInTick = value; }
getNumUnitsInTick()679   uint32_t  getNumUnitsInTick() const { return m_numUnitsInTick; }
680 
setTimeScale(uint32_t value)681   void      setTimeScale(uint32_t value) { m_timeScale = value; }
getTimeScale()682   uint32_t  getTimeScale() const { return m_timeScale; }
683 
setGeneralNalHrdParametersPresentFlag(bool flag)684   void      setGeneralNalHrdParametersPresentFlag(bool flag) { m_generalNalHrdParamsPresentFlag = flag; }
getGeneralNalHrdParametersPresentFlag()685   bool      getGeneralNalHrdParametersPresentFlag() const { return m_generalNalHrdParamsPresentFlag; }
686 
setGeneralVclHrdParametersPresentFlag(bool flag)687   void      setGeneralVclHrdParametersPresentFlag(bool flag) { m_generalVclHrdParamsPresentFlag = flag; }
getGeneralVclHrdParametersPresentFlag()688   bool      getGeneralVclHrdParametersPresentFlag() const { return m_generalVclHrdParamsPresentFlag; }
689 
setGeneralSamePicTimingInAllOlsFlag(bool flag)690   void      setGeneralSamePicTimingInAllOlsFlag(bool flag) { m_generalSamePicTimingInAllOlsFlag = flag; }
getGeneralSamePicTimingInAllOlsFlag()691   bool      getGeneralSamePicTimingInAllOlsFlag() const { return m_generalSamePicTimingInAllOlsFlag; }
692 
693 
setTickDivisorMinus2(uint32_t value)694   void      setTickDivisorMinus2( uint32_t value )                                     { m_tickDivisorMinus2 = value;                               }
getTickDivisorMinus2()695   uint32_t  getTickDivisorMinus2( ) const                                              { return m_tickDivisorMinus2;                                }
696 
697 
setGeneralDecodingUnitHrdParamsPresentFlag(bool flag)698   void      setGeneralDecodingUnitHrdParamsPresentFlag( bool flag)                     { m_generalDecodingUnitHrdParamsPresentFlag = flag;                 }
getGeneralDecodingUnitHrdParamsPresentFlag()699   bool      getGeneralDecodingUnitHrdParamsPresentFlag( ) const                        { return m_generalDecodingUnitHrdParamsPresentFlag;                 }
700 
setBitRateScale(uint32_t value)701   void      setBitRateScale( uint32_t value )                                          { m_bitRateScale = value;                                    }
getBitRateScale()702   uint32_t  getBitRateScale( ) const                                                   { return m_bitRateScale;                                     }
703 
setCpbSizeScale(uint32_t value)704   void      setCpbSizeScale( uint32_t value )                                          { m_cpbSizeScale = value;                                    }
getCpbSizeScale()705   uint32_t  getCpbSizeScale( ) const                                                   { return m_cpbSizeScale;                                     }
setCpbSizeDuScale(uint32_t value)706   void      setCpbSizeDuScale( uint32_t value )                                        { m_cpbSizeDuScale = value;                                  }
getCpbSizeDuScale()707   uint32_t  getCpbSizeDuScale( ) const                                                 { return m_cpbSizeDuScale;                                   }
708 
setHrdCpbCntMinus1(uint32_t value)709   void      setHrdCpbCntMinus1(uint32_t value) { m_hrdCpbCntMinus1 = value; }
getHrdCpbCntMinus1()710   uint32_t  getHrdCpbCntMinus1() const { return m_hrdCpbCntMinus1; }
711 };
712 
713 class HRD
714 {
715 public:
HRD()716   HRD()
717   :m_bufferingPeriodInitialized (false)
718   , m_pictureTimingAvailable    (false)
719   {};
720 
~HRD()721   virtual ~HRD()
722   {};
setGeneralHrdParameters(GeneralHrdParams & generalHrdParam)723   void                    setGeneralHrdParameters(GeneralHrdParams &generalHrdParam) { m_generalHrdParams = generalHrdParam; }
getGeneralHrdParameters()724   GeneralHrdParams        getGeneralHrdParameters() const { return m_generalHrdParams; }
getGeneralHrdParameters()725   const GeneralHrdParams& getGeneralHrdParameters() { return m_generalHrdParams; }
726 
setOlsHrdParameters(int tLayter,OlsHrdParams & olsHrdParam)727   void                setOlsHrdParameters(int tLayter, OlsHrdParams &olsHrdParam) { m_olsHrdParams[tLayter] = olsHrdParam; }
getOlsHrdParameters()728   OlsHrdParams        getOlsHrdParameters() { return m_olsHrdParams[0]; }
getOlsHrdParametersAddr()729   OlsHrdParams*       getOlsHrdParametersAddr() { return &m_olsHrdParams[0]; }
getOlsHrdParameters()730   const OlsHrdParams& getOlsHrdParameters() const { return m_olsHrdParams[0]; }
731 
732 
setBufferingPeriodSEI(const vvdecSEIBufferingPeriod * bp)733   void                           setBufferingPeriodSEI(const vvdecSEIBufferingPeriod* bp)  { m_bufferingPeriodSEI = *bp; m_bufferingPeriodInitialized = true; }
getBufferingPeriodSEI()734   const vvdecSEIBufferingPeriod* getBufferingPeriodSEI() const                        { return m_bufferingPeriodInitialized ? &m_bufferingPeriodSEI : nullptr; }
735 
setPictureTimingSEI(const vvdecSEIPictureTiming * pt)736   void                           setPictureTimingSEI(const vvdecSEIPictureTiming* pt)  { m_pictureTimingSEI = *pt; m_pictureTimingAvailable = true; }
getPictureTimingSEI()737   const vvdecSEIPictureTiming*   getPictureTimingSEI() const                      { return m_pictureTimingAvailable ? &m_pictureTimingSEI : nullptr; }
738 
739 protected:
740   GeneralHrdParams             m_generalHrdParams;
741   OlsHrdParams                 m_olsHrdParams[MAX_TLAYER];
742   bool                         m_bufferingPeriodInitialized;
743   vvdecSEIBufferingPeriod      m_bufferingPeriodSEI;
744   bool                         m_pictureTimingAvailable;
745   vvdecSEIPictureTiming        m_pictureTimingSEI;
746 
747 };
748 
749 
750 class TimingInfo
751 {
752   bool m_timingInfoPresentFlag       = false;
753   uint32_t m_numUnitsInTick          = 1001;
754   uint32_t m_timeScale               = 60000;
755   bool m_pocProportionalToTimingFlag = false;
756   int  m_numTicksPocDiffOneMinus1    = 0;
757 public:
758 
setTimingInfoPresentFlag(bool flag)759   void     setTimingInfoPresentFlag( bool flag )   { m_timingInfoPresentFlag = flag;       }
getTimingInfoPresentFlag()760   bool     getTimingInfoPresentFlag( ) const       { return m_timingInfoPresentFlag;       }
761 
setNumUnitsInTick(uint32_t value)762   void     setNumUnitsInTick( uint32_t value )     { m_numUnitsInTick = value;             }
getNumUnitsInTick()763   uint32_t getNumUnitsInTick( ) const              { return m_numUnitsInTick;              }
764 
setTimeScale(uint32_t value)765   void     setTimeScale( uint32_t value )          { m_timeScale = value;                  }
getTimeScale()766   uint32_t getTimeScale( ) const                   { return m_timeScale;                   }
767 
setPocProportionalToTimingFlag(bool x)768   void     setPocProportionalToTimingFlag(bool x)  { m_pocProportionalToTimingFlag = x;    }
getPocProportionalToTimingFlag()769   bool     getPocProportionalToTimingFlag( ) const { return m_pocProportionalToTimingFlag; }
770 
setNumTicksPocDiffOneMinus1(int x)771   void     setNumTicksPocDiffOneMinus1(int x)      { m_numTicksPocDiffOneMinus1 = x;       }
getNumTicksPocDiffOneMinus1()772   int      getNumTicksPocDiffOneMinus1( ) const    { return m_numTicksPocDiffOneMinus1;    }
773 };
774 
775 struct ChromaQpAdj
776 {
777   union
778   {
779     struct {
780       int CbOffset;
781       int CrOffset;
782       int JointCbCrOffset;
783     } comp;
784     int offset[3];
785   } u;
786 };
787 
788 struct ChromaQpMappingTableParams {
789   int               m_qpBdOffset;
790   bool              m_sameCQPTableForAllChromaFlag;
791   int               m_numQpTables;
792   int               m_qpTableStartMinus26[MAX_NUM_CQP_MAPPING_TABLES];
793   int               m_numPtsInCQPTableMinus1[MAX_NUM_CQP_MAPPING_TABLES];
794   std::vector<int>  m_deltaQpInValMinus1[MAX_NUM_CQP_MAPPING_TABLES];
795   std::vector<int>  m_deltaQpOutVal[MAX_NUM_CQP_MAPPING_TABLES];
796 
ChromaQpMappingTableParamsChromaQpMappingTableParams797   ChromaQpMappingTableParams()
798   {
799     m_qpBdOffset = 12;
800     m_sameCQPTableForAllChromaFlag = true;
801     m_numQpTables = 1;
802     m_numPtsInCQPTableMinus1[0] = 0;
803     m_qpTableStartMinus26[0] = 0;
804     m_deltaQpInValMinus1[0] = { 0 };
805     m_deltaQpOutVal[0] = { 0 };
806   }
807 
setSameCQPTableForAllChromaFlagChromaQpMappingTableParams808   void      setSameCQPTableForAllChromaFlag(bool b)                             { m_sameCQPTableForAllChromaFlag = b; }
getSameCQPTableForAllChromaFlagChromaQpMappingTableParams809   bool      getSameCQPTableForAllChromaFlag()                             const { return m_sameCQPTableForAllChromaFlag; }
setNumQpTablesChromaQpMappingTableParams810   void      setNumQpTables(int n)                                     { m_numQpTables = n; }
getNumQpTablesChromaQpMappingTableParams811   int       getNumQpTables()                                     const { return m_numQpTables; }
setQpTableStartMinus26ChromaQpMappingTableParams812   void      setQpTableStartMinus26(int tableIdx, int n)                         { m_qpTableStartMinus26[tableIdx] = n; }
getQpTableStartMinus26ChromaQpMappingTableParams813   int       getQpTableStartMinus26(int tableIdx)                          const { return m_qpTableStartMinus26[tableIdx]; }
setNumPtsInCQPTableMinus1ChromaQpMappingTableParams814   void      setNumPtsInCQPTableMinus1(int tableIdx, int n)                      { m_numPtsInCQPTableMinus1[tableIdx] = n; }
getNumPtsInCQPTableMinus1ChromaQpMappingTableParams815   int       getNumPtsInCQPTableMinus1(int tableIdx)                       const { return m_numPtsInCQPTableMinus1[tableIdx]; }
setDeltaQpInValMinus1ChromaQpMappingTableParams816   void      setDeltaQpInValMinus1(int tableIdx, std::vector<int> &inVals)       { m_deltaQpInValMinus1[tableIdx] = inVals; }
setDeltaQpInValMinus1ChromaQpMappingTableParams817   void      setDeltaQpInValMinus1(int tableIdx, int idx, int n)                 { m_deltaQpInValMinus1[tableIdx][idx] = n; }
getDeltaQpInValMinus1ChromaQpMappingTableParams818   int       getDeltaQpInValMinus1(int tableIdx, int idx)                  const { return m_deltaQpInValMinus1[tableIdx][idx]; }
setDeltaQpOutValChromaQpMappingTableParams819   void      setDeltaQpOutVal(int tableIdx, std::vector<int> &outVals)           { m_deltaQpOutVal[tableIdx] = outVals; }
setDeltaQpOutValChromaQpMappingTableParams820   void      setDeltaQpOutVal(int tableIdx, int idx, int n)                      { m_deltaQpOutVal[tableIdx][idx] = n; }
getDeltaQpOutValChromaQpMappingTableParams821   int       getDeltaQpOutVal(int tableIdx, int idx)                       const { return m_deltaQpOutVal[tableIdx][idx]; }
822 };
823 struct ChromaQpMappingTable : ChromaQpMappingTableParams
824 {
825   std::vector<int> m_chromaQpMappingTables[MAX_NUM_CQP_MAPPING_TABLES];
826 
getMappedChromaQpValueChromaQpMappingTable827   int       getMappedChromaQpValue(ComponentID compID, const int qpVal)  const { return m_chromaQpMappingTables[m_sameCQPTableForAllChromaFlag ? 0 : (int)compID - 1].at(qpVal + m_qpBdOffset); }
828   void      derivedChromaQPMappingTables();
829   void      setParams(const ChromaQpMappingTableParams &params, const int qpBdOffset);
830 };
831 
832 class SliceMap
833 {
834 private:
835   uint32_t               m_sliceID         = 0;               //!< slice identifier (slice index for rectangular slices, slice address for raser-scan slices)
836   uint32_t               m_numTilesInSlice = 0;               //!< number of tiles in slice (raster-scan slices only)
837   uint32_t               m_numCtuInSlice   = 0;               //!< number of CTUs in the slice
838   std::vector<uint32_t>  m_ctuAddrInSlice;                    //!< raster-scan addresses of all the CTUs in the slice
839 
840 public:
841   SliceMap();
842   virtual ~SliceMap();
843 
setSliceID(uint32_t u)844   void                   setSliceID( uint32_t u )             { m_sliceID = u;            }
getSliceID()845   uint32_t               getSliceID() const                   { return m_sliceID;         }
setNumTilesInSlice(uint32_t u)846   void                   setNumTilesInSlice( uint32_t u )     { m_numTilesInSlice = u;    }
getNumTilesInSlice()847   uint32_t               getNumTilesInSlice() const           { return m_numTilesInSlice; }
setNumCtuInSlice(uint32_t u)848   void                   setNumCtuInSlice( uint32_t u )       { m_numCtuInSlice = u;      }
getNumCtuInSlice()849   uint32_t               getNumCtuInSlice() const             { return m_numCtuInSlice;   }
getCtuAddrList()850   std::vector<uint32_t>  getCtuAddrList( ) const              { return m_ctuAddrInSlice;  }
getCtuAddrInSlice(int idx)851   uint32_t               getCtuAddrInSlice( int idx ) const   { CHECK(idx >= m_ctuAddrInSlice.size(), "CTU index exceeds number of CTUs in slice."); return m_ctuAddrInSlice[idx]; }
pushToCtuAddrInSlice(uint32_t u)852   void                   pushToCtuAddrInSlice( uint32_t u )   { m_ctuAddrInSlice.push_back(u); m_numCtuInSlice++;}
853 
initSliceMap()854   void  initSliceMap()
855   {
856     m_sliceID         = 0;
857     m_numTilesInSlice = 0;
858     m_numCtuInSlice   = 0;
859     m_ctuAddrInSlice.clear();
860   }
861 
addCtusToSlice(uint32_t startX,uint32_t stopX,uint32_t startY,uint32_t stopY,uint32_t picWidthInCtbsY)862   void  addCtusToSlice( uint32_t startX, uint32_t stopX, uint32_t startY, uint32_t stopY, uint32_t picWidthInCtbsY )
863   {
864     CHECK( startX >= stopX || startY >= stopY, "Invalid slice definition");
865     for( uint32_t ctbY = startY; ctbY < stopY; ctbY++ )
866     {
867       for( uint32_t ctbX = startX; ctbX < stopX; ctbX++ )
868       {
869         m_ctuAddrInSlice.push_back( ctbY * picWidthInCtbsY + ctbX );
870         m_numCtuInSlice++;
871       }
872     }
873   }
874 };
875 
876 class RectSlice
877 {
878 private:
879   uint32_t         m_tileIdx            = 0;                //!< tile index corresponding to the first CTU in the slice
880   uint32_t         m_sliceWidthInTiles  = 0;                //!< slice width in units of tiles
881   uint32_t         m_sliceHeightInTiles = 0;                //!< slice height in units of tiles
882   uint32_t         m_numSlicesInTile    = 0;                //!< number of slices in current tile for the special case of multiple slices inside a single tile
883   uint32_t         m_sliceHeightInCtu   = 0;                //!< slice height in units of CTUs for the special case of multiple slices inside a single tile
884 
885 public:
886   RectSlice() = default;
887   ~RectSlice() = default;
888 
setSliceWidthInTiles(uint32_t u)889   void             setSliceWidthInTiles( uint32_t u )   { m_sliceWidthInTiles = u;      }
getSliceWidthInTiles()890   uint32_t         getSliceWidthInTiles( ) const        { return  m_sliceWidthInTiles;  }
setSliceHeightInTiles(uint32_t u)891   void             setSliceHeightInTiles( uint32_t u )  { m_sliceHeightInTiles = u;     }
getSliceHeightInTiles()892   uint32_t         getSliceHeightInTiles( ) const       { return  m_sliceHeightInTiles; }
setNumSlicesInTile(uint32_t u)893   void             setNumSlicesInTile( uint32_t u )     { m_numSlicesInTile = u;        }
getNumSlicesInTile()894   uint32_t         getNumSlicesInTile( ) const          { return  m_numSlicesInTile;    }
setSliceHeightInCtu(uint32_t u)895   void             setSliceHeightInCtu( uint32_t u )    { m_sliceHeightInCtu = u;       }
getSliceHeightInCtu()896   uint32_t         getSliceHeightInCtu( ) const         { return  m_sliceHeightInCtu;   }
setTileIdx(uint32_t u)897   void             setTileIdx( uint32_t u )             { m_tileIdx = u;                }
getTileIdx()898   uint32_t         getTileIdx( ) const                  { return  m_tileIdx;            }
899 };
900 
901 class SubPic
902 {
903 private:
904   uint32_t         m_subPicID                          = 0;      //!< ID of subpicture
905   uint32_t         m_subPicIdx                         = 0;      //!< Index of subpicture
906   uint32_t         m_numCTUsInSubPic                   = 0;      //!< number of CTUs contained in this sub-picture
907   uint32_t         m_subPicCtuTopLeftX                 = 0;      //!< horizontal position of top left CTU of the subpicture in unit of CTU
908   uint32_t         m_subPicCtuTopLeftY                 = 0;      //!< vertical position of top left CTU of the subpicture in unit of CTU
909   uint32_t         m_subPicWidth                       = 0;      //!< the width of subpicture in units of CTU
910   uint32_t         m_subPicHeight                      = 0;      //!< the height of subpicture in units of CTU
911   uint32_t         m_subPicWidthInLumaSample           = 0;      //!< the width of subpicture in units of luma sample
912   uint32_t         m_subPicHeightInLumaSample          = 0;      //!< the height of subpicture in units of luma sample
913   uint32_t         m_firstCtuInSubPic                  = 0;      //!< the raster scan index of the first CTU in a subpicture
914   uint32_t         m_lastCtuInSubPic                   = 0;      //!< the raster scan index of the last CTU in a subpicture
915   uint32_t         m_subPicLeft                        = 0;      //!< the position of left boundary
916   uint32_t         m_subPicRight                       = 0;      //!< the position of right boundary
917   uint32_t         m_subPicTop                         = 0;      //!< the position of top boundary
918   uint32_t         m_subPicBottom                      = 0;      //!< the position of bottom boundary
919   std::vector<uint32_t> m_ctuAddrInSubPic;                       //!< raster scan addresses of all the CTUs in the slice
920 
921   bool             m_treatedAsPicFlag                  = false;  //!< whether the subpicture is treated as a picture in the decoding process excluding in-loop filtering operations
922   bool             m_loopFilterAcrossSubPicEnabledFlag = false;  //!< whether in-loop filtering operations may be performed across the boundaries of the subpicture
923   uint32_t         m_numSlicesInSubPic                 = 0;      //!< Number of slices contained in this subpicture
924 
925 public:
926   SubPic() = default;
927   ~SubPic() = default;
928 
setSubPicID(uint32_t u)929   void             setSubPicID (uint32_t u)                {         m_subPicID = u;       }
getSubPicID()930   uint32_t         getSubPicID   ()                  const { return  m_subPicID;           }
setSubPicIdx(uint32_t u)931   void             setSubPicIdx (uint32_t u)               {         m_subPicIdx = u;      }
getSubPicIdx()932   uint32_t         getSubPicIdx ()                   const { return  m_subPicIdx;          }
setNumCTUsInSubPic(uint32_t u)933   void             setNumCTUsInSubPic   (uint32_t u)       {         m_numCTUsInSubPic = u;       }
getNumCTUsInSubPic()934   uint32_t         getNumCTUsInSubPic   ()           const { return  m_numCTUsInSubPic;           }
setSubPicCtuTopLeftX(uint32_t u)935   void             setSubPicCtuTopLeftX (uint32_t u)       {         m_subPicCtuTopLeftX = u;     }
getSubPicCtuTopLeftX()936   uint32_t         getSubPicCtuTopLeftX ()           const { return  m_subPicCtuTopLeftX;         }
setSubPicCtuTopLeftY(uint32_t u)937   void             setSubPicCtuTopLeftY (uint32_t u)       {         m_subPicCtuTopLeftY = u;     }
getSubPicCtuTopLeftY()938   uint32_t         getSubPicCtuTopLeftY ()           const { return  m_subPicCtuTopLeftY;         }
setSubPicWidthInCTUs(uint32_t u)939   void             setSubPicWidthInCTUs (uint32_t u)       {         m_subPicWidth = u;           }
getSubPicWidthInCTUs()940   uint32_t         getSubPicWidthInCTUs ()           const { return  m_subPicWidth;               }
setSubPicHeightInCTUs(uint32_t u)941   void             setSubPicHeightInCTUs(uint32_t u)       {         m_subPicHeight = u;          }
getSubPicHeightInCTUs()942   uint32_t         getSubPicHeightInCTUs()           const { return  m_subPicHeight;              }
setFirstCTUInSubPic(uint32_t u)943   void             setFirstCTUInSubPic  (uint32_t u)       {         m_firstCtuInSubPic = u;      }
getFirstCTUInSubPic()944   uint32_t         getFirstCTUInSubPic  ()           const { return  m_firstCtuInSubPic;          }
setLastCTUInSubPic(uint32_t u)945   void             setLastCTUInSubPic   (uint32_t u)       {         m_lastCtuInSubPic = u;       }
getLastCTUInSubPic()946   uint32_t         getLastCTUInSubPic   ()           const { return  m_lastCtuInSubPic;           }
setSubPicLeft(uint32_t u)947   void             setSubPicLeft        (uint32_t u)       {         m_subPicLeft = u;            }
getSubPicLeft()948   uint32_t         getSubPicLeft        ()           const { return  m_subPicLeft;                }
setSubPicRight(uint32_t u)949   void             setSubPicRight       (uint32_t u)       {         m_subPicRight = u;           }
getSubPicRight()950   uint32_t         getSubPicRight       ()           const { return  m_subPicRight;               }
setSubPicTop(uint32_t u)951   void             setSubPicTop         (uint32_t u)       {         m_subPicTop = u;             }
getSubPicTop()952   uint32_t         getSubPicTop         ()           const { return  m_subPicTop;                 }
setSubPicBottom(uint32_t u)953   void             setSubPicBottom      (uint32_t u)       {         m_subPicBottom = u;          }
getSubPicBottom()954   uint32_t         getSubPicBottom      ()           const { return  m_subPicBottom;              }
955 
setSubPicWidthInLumaSample(uint32_t u)956   void             setSubPicWidthInLumaSample (uint32_t u) {         m_subPicWidthInLumaSample = u;   }
getSubPicWidthInLumaSample()957   uint32_t         getSubPicWidthInLumaSample()      const { return  m_subPicWidthInLumaSample;       }
setSubPicHeightInLumaSample(uint32_t u)958   void             setSubPicHeightInLumaSample(uint32_t u) {         m_subPicHeightInLumaSample = u;  }
getSubPicHeightInLumaSample()959   uint32_t         getSubPicHeightInLumaSample()     const { return  m_subPicHeightInLumaSample;      }
960 
getArea()961   Area             getArea()                         const { return Area( m_subPicLeft, m_subPicTop, m_subPicWidth,             m_subPicHeight );             }
getLumaArea()962   Area             getLumaArea()                     const { return Area( m_subPicLeft, m_subPicTop, m_subPicWidthInLumaSample, m_subPicHeightInLumaSample ); }
963 
getCtuAddrList()964   std::vector<uint32_t> getCtuAddrList  ()           const { return  m_ctuAddrInSubPic;           }
clearCTUAddrList()965   void                  clearCTUAddrList()                 { m_ctuAddrInSubPic.clear(); }
addCTUsToSubPic(std::vector<uint32_t> ctuAddrInSlice)966   void                  addCTUsToSubPic(std::vector<uint32_t> ctuAddrInSlice)
967   {
968     for (auto ctu:ctuAddrInSlice)
969       m_ctuAddrInSubPic.push_back(ctu);
970   }
addAllCtusInPicToSubPic(uint32_t startX,uint32_t stopX,uint32_t startY,uint32_t stopY,uint32_t picWidthInCtbsY)971   void  addAllCtusInPicToSubPic(uint32_t startX, uint32_t stopX, uint32_t startY, uint32_t stopY, uint32_t picWidthInCtbsY)
972   {
973     CHECK(startX >= stopX || startY >= stopY, "Invalid slice definition");
974     for (uint32_t ctbY = startY; ctbY < stopY; ctbY++)
975     {
976       for (uint32_t ctbX = startX; ctbX < stopX; ctbX++)
977       {
978         m_ctuAddrInSubPic.push_back(ctbY * picWidthInCtbsY + ctbX);
979       }
980     }
981   }
isContainingPos(const Position & pos)982   bool                 isContainingPos(const Position& pos) const
983   {
984     return pos.x >= m_subPicLeft && pos.x <= m_subPicRight && pos.y >= m_subPicTop  && pos.y <= m_subPicBottom;
985   }
setTreatedAsPicFlag(bool u)986   void             setTreatedAsPicFlag                 (bool u)  {         m_treatedAsPicFlag = u;   }
getTreatedAsPicFlag()987   bool             getTreatedAsPicFlag                 ()  const { return  m_treatedAsPicFlag;       }
setloopFilterAcrossSubPicEnabledFlag(bool u)988   void             setloopFilterAcrossSubPicEnabledFlag(bool u)  {         m_loopFilterAcrossSubPicEnabledFlag = u; }
getloopFilterAcrossSubPicEnabledFlag()989   bool             getloopFilterAcrossSubPicEnabledFlag()  const { return  m_loopFilterAcrossSubPicEnabledFlag;     }
990 
isFirstCTUinSubPic(uint32_t ctuAddr)991   bool             isFirstCTUinSubPic(uint32_t ctuAddr)    { return  ctuAddr == m_firstCtuInSubPic;  }
isLastCTUinSubPic(uint32_t ctuAddr)992   bool             isLastCTUinSubPic(uint32_t ctuAddr)     { return  ctuAddr == m_lastCtuInSubPic;   }
setNumSlicesInSubPic(uint32_t val)993   void             setNumSlicesInSubPic( uint32_t val )    { m_numSlicesInSubPic = val; }
getNumSlicesInSubPic()994   uint32_t         getNumSlicesInSubPic() const            { return m_numSlicesInSubPic; }
containsCtu(const Position & pos)995   bool             containsCtu(const Position& pos) const
996   {
997     return pos.x >= m_subPicCtuTopLeftX && pos.x < m_subPicCtuTopLeftX + m_subPicWidth &&
998            pos.y >= m_subPicCtuTopLeftY && pos.y < m_subPicCtuTopLeftY + m_subPicHeight;
999   }
1000 };
1001 
1002 
1003 class VPS : public BasePS<VPS>
1004 {
1005 private:
1006   int                   m_VPSId            = 0;
1007   uint32_t              m_uiMaxLayers      = 1;
1008 
1009   uint32_t              m_vpsMaxSubLayers                  = 1;
1010   uint32_t              m_vpsLayerId[MAX_VPS_LAYERS];
1011   bool                  m_vpsAllLayersSameNumSubLayersFlag = true;
1012   bool                  m_vpsAllIndependentLayersFlag      = true;
1013   uint32_t              m_vpsCfgPredDirection[MAX_VPS_SUBLAYERS];
1014   bool                  m_vpsIndependentLayerFlag[MAX_VPS_LAYERS];
1015   bool                  m_vpsDirectRefLayerFlag[MAX_VPS_LAYERS][MAX_VPS_LAYERS];
1016   uint32_t              m_vpsMaxTidIlRefPicsPlus1[MAX_VPS_LAYERS];
1017   bool                  m_vpsEachLayerIsAnOlsFlag          = true;
1018   uint32_t              m_vpsOlsModeIdc                    = 0;
1019   uint32_t              m_vpsNumOutputLayerSets            = 0;
1020   bool                  m_vpsOlsOutputLayerFlag[MAX_NUM_OLSS][MAX_VPS_LAYERS];
1021   uint32_t              m_directRefLayerIdx[MAX_VPS_LAYERS][MAX_VPS_LAYERS];
1022   uint32_t              m_generalLayerIdx[MAX_VPS_LAYERS];
1023   uint32_t              m_vpsNumPtls                       = 1;
1024   bool                  m_ptPresentFlag[MAX_NUM_OLSS];
1025   uint32_t              m_ptlMaxTemporalId[MAX_NUM_OLSS];
1026   std::vector<ProfileTierLevel> m_vpsProfileTierLevel;
1027   uint32_t              m_olsPtlIdx[MAX_NUM_OLSS];
1028   uint32_t              m_interLayerRefIdx[MAX_VPS_LAYERS][MAX_VPS_LAYERS];
1029   bool                  m_vpsExtensionFlag = false;
1030   bool                  m_vpsGeneralHrdParamsPresentFlag   = 0;
1031   bool                  m_vpsSublayerCpbParamsPresentFlag  = false;
1032   uint32_t              m_numOlsHrdParamsMinus1            = 0;
1033   uint32_t              m_hrdMaxTid[MAX_NUM_OLSS];
1034   uint32_t              m_olsHrdIdx[MAX_NUM_OLSS];
1035   GeneralHrdParams      m_generalHrdParams;
1036 
1037   std::vector<int> m_multiLayerOlsIdxToOlsIdx; // mapping from multi-layer OLS index to OLS index. Initialized in deriveOutputLayerSets()
1038                                                // m_multiLayerOlsIdxToOlsIdx[n] is the OLSidx of the n-th multi-layer OLS.
1039 
1040   std::vector<Size>             m_olsDpbPicSize;
1041   std::vector<int>              m_olsDpbParamsIdx;
1042   std::vector<std::vector<int>> m_outputLayerIdInOls;
1043 public:
1044   std::vector<std::vector<OlsHrdParams>> m_olsHrdParams;
1045   int                           m_totalNumOLSs                 = 0;
1046   int                           m_numMultiLayeredOlss          = 0;
1047   uint32_t                      m_multiLayerOlsIdx[MAX_NUM_OLSS];
1048   int                           m_numDpbParams                 = 0;
1049   std::vector<DpbParameters>    m_dpbParameters;
1050   bool                          m_sublayerDpbParamsPresentFlag = false;
1051   std::vector<int>              m_dpbMaxTemporalId;
1052   std::vector<int>              m_targetOutputLayerIdSet;          ///< set of LayerIds to be outputted
1053   std::vector<int>              m_targetLayerIdSet;                ///< set of LayerIds to be included in the sub-bitstream extraction process.
1054   int                           m_iTargetLayer                 = -1;
1055   std::vector<int>              m_numOutputLayersInOls;
1056   std::vector<int>              m_numLayersInOls;
1057   std::vector<std::vector<int>> m_layerIdInOls;
1058   std::vector<int>              m_olsDpbChromaFormatIdc;
1059   std::vector<int>              m_olsDpbBitDepthMinus8;
1060 
1061 public:
VPS()1062   VPS()
1063   {
1064     memset( m_vpsCfgPredDirection, 0, sizeof( m_vpsCfgPredDirection ) );
1065   }
1066   ~VPS() = default;
1067 
getVPSId()1068   int               getVPSId() const                                     { return m_VPSId;                     }
setVPSId(int i)1069   void              setVPSId(int i)                                      { m_VPSId = i;                        }
1070 
getMaxLayers()1071   uint32_t          getMaxLayers() const                                 { return m_uiMaxLayers;               }
setMaxLayers(uint32_t l)1072   void              setMaxLayers(uint32_t l)                             { m_uiMaxLayers = l;                  }
1073 
getVPSExtensionFlag()1074   bool              getVPSExtensionFlag() const                          { return m_vpsExtensionFlag;          }
setVPSExtensionFlag(bool t)1075   void              setVPSExtensionFlag(bool t)                          { m_vpsExtensionFlag = t;             }
1076 
getPredDirection(uint32_t tmplayer)1077   uint32_t          getPredDirection(uint32_t tmplayer) const            { return m_vpsCfgPredDirection[tmplayer]; }
setPredDirection(uint32_t tmplayer,uint32_t t)1078   void              setPredDirection(uint32_t tmplayer, uint32_t t)      { m_vpsCfgPredDirection[tmplayer] = t; }
1079 
getMaxSubLayers()1080   uint32_t          getMaxSubLayers() const                              { return m_vpsMaxSubLayers;           }
setMaxSubLayers(uint32_t value)1081   void              setMaxSubLayers(uint32_t value)                      { m_vpsMaxSubLayers = value;          }
getAllLayersSameNumSublayersFlag()1082   bool              getAllLayersSameNumSublayersFlag() const             { return m_vpsAllLayersSameNumSubLayersFlag; }
setAllLayersSameNumSublayersFlag(bool t)1083   void              setAllLayersSameNumSublayersFlag(bool t)             { m_vpsAllLayersSameNumSubLayersFlag = t;    }
1084 
getLayerId(uint32_t layerIdx)1085   uint32_t          getLayerId(uint32_t layerIdx) const                  { return m_vpsLayerId[layerIdx];    }
setLayerId(uint32_t layerIdx,uint32_t layerId)1086   void              setLayerId(uint32_t layerIdx, uint32_t layerId)      { m_vpsLayerId[layerIdx] = layerId; }
1087 
getAllIndependentLayersFlag()1088   bool              getAllIndependentLayersFlag() const                  { return m_vpsAllIndependentLayersFlag; }
setAllIndependentLayersFlag(bool t)1089   void              setAllIndependentLayersFlag(bool t)                  { m_vpsAllIndependentLayersFlag = t;    }
1090 
getIndependentLayerFlag(uint32_t layerIdx)1091   bool              getIndependentLayerFlag(uint32_t layerIdx) const { return m_vpsIndependentLayerFlag[layerIdx]; }
setIndependentLayerFlag(uint32_t layerIdx,bool t)1092   void              setIndependentLayerFlag(uint32_t layerIdx, bool t) { m_vpsIndependentLayerFlag[layerIdx] = t; }
1093 
getMaxTidIlRefPicsPlus1(uint32_t layerIdx)1094   uint32_t          getMaxTidIlRefPicsPlus1(uint32_t layerIdx) const { return m_vpsMaxTidIlRefPicsPlus1[layerIdx]; }
setMaxTidIlRefPicsPlus1(uint32_t layerIdx,uint32_t i)1095   void              setMaxTidIlRefPicsPlus1(uint32_t layerIdx, uint32_t i) { m_vpsMaxTidIlRefPicsPlus1[layerIdx] = i; }
1096 
getDirectRefLayerFlag(uint32_t layerIdx,uint32_t refLayerIdx)1097   bool              getDirectRefLayerFlag(uint32_t layerIdx, uint32_t refLayerIdx) const   { return m_vpsDirectRefLayerFlag[layerIdx][refLayerIdx]; }
setDirectRefLayerFlag(uint32_t layerIdx,uint32_t refLayerIdx,bool t)1098   void              setDirectRefLayerFlag(uint32_t layerIdx, uint32_t refLayerIdx, bool t) { m_vpsDirectRefLayerFlag[layerIdx][refLayerIdx] = t;    }
1099 
getDirectRefLayerIdx(uint32_t layerIdx,uint32_t refLayerIdc)1100   uint32_t          getDirectRefLayerIdx( uint32_t layerIdx, uint32_t refLayerIdc ) const { return m_directRefLayerIdx[layerIdx][refLayerIdc]; }
setDirectRefLayerIdx(uint32_t layerIdx,uint32_t refLayerIdc,uint32_t refLayerIdx)1101   void              setDirectRefLayerIdx( uint32_t layerIdx, uint32_t refLayerIdc, uint32_t refLayerIdx ) { m_directRefLayerIdx[layerIdx][refLayerIdc] = refLayerIdx; }
1102 
getInterLayerRefIdc(uint32_t layerIdx,uint32_t refLayerIdx)1103   uint32_t          getInterLayerRefIdc( uint32_t layerIdx, uint32_t refLayerIdx ) const { return m_interLayerRefIdx[layerIdx][refLayerIdx]; }
setInterLayerRefIdc(uint32_t layerIdx,uint32_t refLayerIdx,uint32_t refLayerIdc)1104   void              setInterLayerRefIdc( uint32_t layerIdx, uint32_t refLayerIdx, uint32_t refLayerIdc ) { m_interLayerRefIdx[layerIdx][refLayerIdx] = refLayerIdc; }
1105 
getEachLayerIsAnOlsFlag()1106   bool              getEachLayerIsAnOlsFlag() const                      { return m_vpsEachLayerIsAnOlsFlag; }
setEachLayerIsAnOlsFlag(bool t)1107   void              setEachLayerIsAnOlsFlag(bool t)                      { m_vpsEachLayerIsAnOlsFlag = t;    }
1108 
getOlsModeIdc()1109   uint32_t          getOlsModeIdc() const                                { return m_vpsOlsModeIdc; }
setOlsModeIdc(uint32_t t)1110   void              setOlsModeIdc(uint32_t t)                            { m_vpsOlsModeIdc = t;    }
1111 
getNumOutputLayerSets()1112   uint32_t          getNumOutputLayerSets() const                        { return m_vpsNumOutputLayerSets; }
setNumOutputLayerSets(uint8_t t)1113   void              setNumOutputLayerSets(uint8_t t)                     { m_vpsNumOutputLayerSets = t;    }
1114 
getOlsOutputLayerFlag(uint32_t ols,uint32_t layer)1115   bool              getOlsOutputLayerFlag(uint32_t ols, uint32_t layer) const   { return m_vpsOlsOutputLayerFlag[ols][layer]; }
setOlsOutputLayerFlag(uint32_t ols,uint32_t layer,bool t)1116   void              setOlsOutputLayerFlag(uint32_t ols, uint32_t layer, bool t) { m_vpsOlsOutputLayerFlag[ols][layer] = t;    }
1117 
getGeneralLayerIdx(uint32_t layerId)1118   uint32_t          getGeneralLayerIdx(uint32_t layerId) const { return m_generalLayerIdx[layerId]; }
setGeneralLayerIdx(uint32_t layerId,uint32_t layerIdc)1119   void              setGeneralLayerIdx(uint32_t layerId, uint32_t layerIdc) { m_generalLayerIdx[layerId] = layerIdc; }
1120 
getNumPtls()1121   uint32_t          getNumPtls()                                   const { return m_vpsNumPtls; }
setNumPtls(uint32_t val)1122   void              setNumPtls(uint32_t val)                             { m_vpsNumPtls = val;  }
1123 
getPtPresentFlag(int idx)1124   bool              getPtPresentFlag(int idx)                      const { return m_ptPresentFlag[idx]; }
setPtPresentFlag(int idx,bool val)1125   void              setPtPresentFlag(int idx, bool val)                  { m_ptPresentFlag[idx] = val;  }
1126 
getPtlMaxTemporalId(int idx)1127   uint32_t          getPtlMaxTemporalId(int idx)                   const { return m_ptlMaxTemporalId[idx]; }
setPtlMaxTemporalId(int idx,uint32_t val)1128   void              setPtlMaxTemporalId(int idx, uint32_t val)           { m_ptlMaxTemporalId[idx] = val;  }
1129 
setProfileTierLevel(const std::vector<ProfileTierLevel> & val)1130   void              setProfileTierLevel(const std::vector<ProfileTierLevel> &val)   { m_vpsProfileTierLevel = val; }
getProfileTierLevel(int idx)1131   const ProfileTierLevel& getProfileTierLevel(int idx)             const { return m_vpsProfileTierLevel[idx];      }
1132 
getOlsPtlIdx(int idx)1133   uint32_t          getOlsPtlIdx(int idx)                          const { return m_olsPtlIdx[idx]; }
setOlsPtlIdx(int idx,uint32_t val)1134   void              setOlsPtlIdx(int idx, uint32_t val)                  { m_olsPtlIdx[idx] = val;  }
getVPSGeneralHrdParamsPresentFlag()1135   bool              getVPSGeneralHrdParamsPresentFlag()            const { return m_vpsGeneralHrdParamsPresentFlag; }
setVPSGeneralHrdParamsPresentFlag(bool t)1136   void              setVPSGeneralHrdParamsPresentFlag(bool t)            { m_vpsGeneralHrdParamsPresentFlag = t; }
getVPSSublayerCpbParamsPresentFlag()1137   bool              getVPSSublayerCpbParamsPresentFlag()           const { return m_vpsSublayerCpbParamsPresentFlag; }
setVPSSublayerCpbParamsPresentFlag(bool t)1138   void              setVPSSublayerCpbParamsPresentFlag(bool t)           { m_vpsSublayerCpbParamsPresentFlag = t; }
getNumOlsHrdParamsMinus1()1139   uint32_t          getNumOlsHrdParamsMinus1()                     const { return m_numOlsHrdParamsMinus1; }
setNumOlsHrdParamsMinus1(uint32_t val)1140   void              setNumOlsHrdParamsMinus1(uint32_t val)               { m_numOlsHrdParamsMinus1 = val; }
1141 
getHrdMaxTid(int olsIdx)1142   uint32_t          getHrdMaxTid(int olsIdx)                       const { return m_hrdMaxTid[olsIdx]; }
setHrdMaxTid(int olsIdx,uint32_t val)1143   void              setHrdMaxTid(int olsIdx, uint32_t val)               { m_hrdMaxTid[olsIdx] = val; }
getOlsHrdIdx(int olsIdx)1144   uint32_t          getOlsHrdIdx(int olsIdx)                       const { return m_olsHrdIdx[olsIdx]; }
setOlsHrdIdx(int olsIdx,uint32_t val)1145   void              setOlsHrdIdx(int olsIdx, uint32_t val)               { m_olsHrdIdx[olsIdx] = val; }
1146 
getOlsHrdParameters(int olsIdx)1147   OlsHrdParams*            getOlsHrdParameters(int olsIdx)               { return &m_olsHrdParams[olsIdx][0]; }
getOlsHrdParameters(int olsIdx)1148   const OlsHrdParams*      getOlsHrdParameters(int olsIdx)         const { return &m_olsHrdParams[olsIdx][0]; }
1149 
getGeneralHrdParameters()1150   GeneralHrdParams*        getGeneralHrdParameters()                     { return &m_generalHrdParams; }
getGeneralHrdParameters()1151   const GeneralHrdParams*  getGeneralHrdParameters()               const { return &m_generalHrdParams; }
1152 
getTargetLayer()1153   int                      getTargetLayer()                              { return m_iTargetLayer;              }
setTargetLayer(uint32_t t)1154   void                     setTargetLayer(uint32_t t)                    { m_iTargetLayer = t;                 }
1155 
getMaxDecPicBuffering(int temporalId)1156   int               getMaxDecPicBuffering( int temporalId ) const        { return m_dpbParameters[m_olsDpbParamsIdx[m_iTargetLayer]].m_maxDecPicBuffering[temporalId]; }
getNumReorderPics(int temporalId)1157   int               getNumReorderPics( int temporalId ) const            { return m_dpbParameters[m_olsDpbParamsIdx[m_iTargetLayer]].m_numReorderPics[temporalId];     }
getTotalNumOLSs()1158   int               getTotalNumOLSs() const                              { return m_totalNumOLSs; }
getNumMultiLayeredOlss()1159   int               getNumMultiLayeredOlss() const                       { return m_numMultiLayeredOlss; }
getOlsDpbPicSize(int olsIdx)1160   Size              getOlsDpbPicSize( int olsIdx ) const                 { return m_olsDpbPicSize[olsIdx];          }
setOlsDpbPicSize(int olsIdx,Size size)1161   void              setOlsDpbPicSize( int olsIdx, Size size )            { m_olsDpbPicSize[olsIdx] = size;          }
setOlsDpbPicWidth(int olsIdx,int width)1162   void              setOlsDpbPicWidth( int olsIdx, int width )           { m_olsDpbPicSize[olsIdx].width = width;   }
setOlsDpbPicHeight(int olsIdx,int height)1163   void              setOlsDpbPicHeight( int olsIdx, int height )         { m_olsDpbPicSize[olsIdx].height = height; }
getOlsDpbChromaFormatIdc(int olsIdx)1164   int               getOlsDpbChromaFormatIdc(int olsIdx) const           { return m_olsDpbChromaFormatIdc[olsIdx];  }
getOlsDpbBitDepthMinus8(int olsIdx)1165   int               getOlsDpbBitDepthMinus8(int olsIdx) const            { return m_olsDpbBitDepthMinus8[olsIdx];   }
setOlsDpbChromaFormatIdc(int olsIdx,int chromaFormatIdc)1166   void              setOlsDpbChromaFormatIdc(int olsIdx, int chromaFormatIdc)  { m_olsDpbChromaFormatIdc[olsIdx] = chromaFormatIdc; }
setOlsDpbBitDepthMinus8(int olsIdx,int bitDepthMinus8)1167   void              setOlsDpbBitDepthMinus8(int olsIdx, int bitDepthMinus8) { m_olsDpbBitDepthMinus8[olsIdx] = bitDepthMinus8; }
1168 
getOlsDpbParamsIdx(int olsIdx)1169   int               getOlsDpbParamsIdx( int olsIdx ) const               { return m_olsDpbParamsIdx[olsIdx];        }
setOlsDpbParamsIdx(int olsIdx,int paramIdx)1170   void              setOlsDpbParamsIdx( int olsIdx, int paramIdx )       { m_olsDpbParamsIdx[olsIdx] = paramIdx;    }
1171 
1172   void              deriveOutputLayerSets();
1173   void              deriveTargetOutputLayerSet( int targetOlsIdx );
1174   void              checkVPS();
1175 
setNumLayersInOls(int olsIdx,int numLayers)1176   void              setNumLayersInOls(int olsIdx, int numLayers)         { m_numLayersInOls[olsIdx]  = numLayers; }
getNumLayersInOls(int olsIdx)1177   int               getNumLayersInOls(int olsIdx)      const             { return m_numLayersInOls[olsIdx]; }
1178 
setLayerIdInOls(int olsIdx,int layerIdx,int layerId)1179   void              setLayerIdInOls  (int olsIdx, int layerIdx, int layerId)    { m_layerIdInOls[olsIdx][layerIdx] = layerId; }
getLayerIdInOls(int olsIdx,int layerIdx)1180   uint32_t          getLayerIdInOls  (int olsIdx, int layerIdx) const           { return m_layerIdInOls[olsIdx][layerIdx]   ; }
getLayerIdsInOls(int targetOlsIdx)1181   std::vector<int>  getLayerIdsInOls(int targetOlsIdx)                    { return m_layerIdInOls[targetOlsIdx];     }
1182 };
1183 
1184 class Window
1185 {
1186 private:
1187   bool m_enabledFlag     = false;
1188   int  m_winLeftOffset   = 0;
1189   int  m_winRightOffset  = 0;
1190   int  m_winTopOffset    = 0;
1191   int  m_winBottomOffset = 0;
1192 
1193 public:
getWindowEnabledFlag()1194   bool getWindowEnabledFlag() const   { return m_enabledFlag;                          }
getWindowLeftOffset()1195   int  getWindowLeftOffset() const    { return m_enabledFlag ? m_winLeftOffset : 0;    }
setWindowLeftOffset(int val)1196   void setWindowLeftOffset(int val)   { m_winLeftOffset = val; m_enabledFlag = true;   }
getWindowRightOffset()1197   int  getWindowRightOffset() const   { return m_enabledFlag ? m_winRightOffset : 0;   }
setWindowRightOffset(int val)1198   void setWindowRightOffset(int val)  { m_winRightOffset = val; m_enabledFlag = true;  }
getWindowTopOffset()1199   int  getWindowTopOffset() const     { return m_enabledFlag ? m_winTopOffset : 0;     }
setWindowTopOffset(int val)1200   void setWindowTopOffset(int val)    { m_winTopOffset = val; m_enabledFlag = true;    }
getWindowBottomOffset()1201   int  getWindowBottomOffset() const  { return m_enabledFlag ? m_winBottomOffset: 0;   }
setWindowBottomOffset(int val)1202   void setWindowBottomOffset(int val) { m_winBottomOffset = val; m_enabledFlag = true; }
1203 
setWindow(int offsetLeft,int offsetLRight,int offsetLTop,int offsetLBottom)1204   void setWindow(int offsetLeft, int offsetLRight, int offsetLTop, int offsetLBottom)
1205   {
1206     m_enabledFlag     = true;
1207     m_winLeftOffset   = offsetLeft;
1208     m_winRightOffset  = offsetLRight;
1209     m_winTopOffset    = offsetLTop;
1210     m_winBottomOffset = offsetLBottom;
1211   }
1212 };
1213 
1214 
1215 class VUI
1216 {
1217 private:
1218   bool       m_aspectRatioInfoPresentFlag     = false; //TODO: This initialiser list contains magic numbers
1219   bool       m_aspectRatioConstantFlag       = false;
1220   bool       m_nonPackedFlag                 = false;
1221   bool       m_nonProjectedFlag               = false;
1222   int        m_aspectRatioIdc                 = 0;
1223   int        m_sarWidth                       = 0;
1224   int        m_sarHeight                      = 0;
1225   bool       m_colourDescriptionPresentFlag   = false;
1226   int        m_colourPrimaries                = 2;
1227   int        m_transferCharacteristics        = 2;
1228   int        m_matrixCoefficients             = 2;
1229   bool       m_progressiveSourceFlag          = false;
1230   bool       m_interlacedSourceFlag           = false;
1231   bool       m_chromaLocInfoPresentFlag       = false;
1232   int        m_chromaSampleLocTypeTopField    = 6;
1233   int        m_chromaSampleLocTypeBottomField = 6;
1234   int        m_chromaSampleLocType            = 6;
1235   bool       m_overscanInfoPresentFlag        = false;
1236   bool       m_overscanAppropriateFlag        = false;
1237   bool       m_videoSignalTypePresentFlag     = false;
1238   bool       m_videoFullRangeFlag             = false;
1239 
1240 public:
1241 
getAspectRatioInfoPresentFlag()1242   bool              getAspectRatioInfoPresentFlag() const                  { return m_aspectRatioInfoPresentFlag;           }
setAspectRatioInfoPresentFlag(bool i)1243   void              setAspectRatioInfoPresentFlag(bool i)                  { m_aspectRatioInfoPresentFlag = i;              }
getAspectRatioConstantFlag()1244   bool              getAspectRatioConstantFlag() const                     { return m_aspectRatioConstantFlag;           }
setAspectRatioConstantFlag(bool b)1245   void              setAspectRatioConstantFlag(bool b)                     { m_aspectRatioConstantFlag = b;              }
getAspectRatioIdc()1246   int               getAspectRatioIdc() const                              { return m_aspectRatioIdc;                       }
setAspectRatioIdc(int i)1247   void              setAspectRatioIdc(int i)                               { m_aspectRatioIdc = i;                          }
1248 
getSarWidth()1249   int               getSarWidth() const                                    { return m_sarWidth;                             }
setSarWidth(int i)1250   void              setSarWidth(int i)                                     { m_sarWidth = i;                                }
1251 
getSarHeight()1252   int               getSarHeight() const                                   { return m_sarHeight;                            }
setSarHeight(int i)1253   void              setSarHeight(int i)                                    { m_sarHeight = i;                               }
1254 
getColourDescriptionPresentFlag()1255   bool              getColourDescriptionPresentFlag() const                { return m_colourDescriptionPresentFlag;         }
setColourDescriptionPresentFlag(bool i)1256   void              setColourDescriptionPresentFlag(bool i)                { m_colourDescriptionPresentFlag = i;            }
1257 
getColourPrimaries()1258   int               getColourPrimaries() const                             { return m_colourPrimaries;                      }
setColourPrimaries(int i)1259   void              setColourPrimaries(int i)                              { m_colourPrimaries = i;                         }
1260 
getTransferCharacteristics()1261   int               getTransferCharacteristics() const                     { return m_transferCharacteristics;              }
setTransferCharacteristics(int i)1262   void              setTransferCharacteristics(int i)                      { m_transferCharacteristics = i;                 }
1263 
getMatrixCoefficients()1264   int               getMatrixCoefficients() const                          { return m_matrixCoefficients;                   }
setMatrixCoefficients(int i)1265   void              setMatrixCoefficients(int i)                           { m_matrixCoefficients = i;                      }
1266 
getProgressiveSourceFlag()1267   bool              getProgressiveSourceFlag() const                       { return m_progressiveSourceFlag; }
setProgressiveSourceFlag(bool b)1268   void              setProgressiveSourceFlag(bool b)                       { m_progressiveSourceFlag = b; }
1269 
getInterlacedSourceFlag()1270   bool              getInterlacedSourceFlag() const                        { return m_interlacedSourceFlag; }
setInterlacedSourceFlag(bool b)1271   void              setInterlacedSourceFlag(bool b)                        { m_interlacedSourceFlag = b; }
1272 
getNonPackedFlag()1273   bool              getNonPackedFlag() const                               { return m_nonPackedFlag; }
setNonPackedFlag(bool b)1274   void              setNonPackedFlag(bool b)                               { m_nonPackedFlag = b; }
1275 
getNonProjectedFlag()1276   bool              getNonProjectedFlag() const                            { return m_nonProjectedFlag; }
setNonProjectedFlag(bool b)1277   void              setNonProjectedFlag(bool b)                            { m_nonProjectedFlag = b; }
1278 
getChromaLocInfoPresentFlag()1279   bool              getChromaLocInfoPresentFlag() const                    { return m_chromaLocInfoPresentFlag;             }
setChromaLocInfoPresentFlag(bool i)1280   void              setChromaLocInfoPresentFlag(bool i)                    { m_chromaLocInfoPresentFlag = i;                }
1281 
getChromaSampleLocTypeTopField()1282   int               getChromaSampleLocTypeTopField() const                 { return m_chromaSampleLocTypeTopField;          }
setChromaSampleLocTypeTopField(int i)1283   void              setChromaSampleLocTypeTopField(int i)                  { m_chromaSampleLocTypeTopField = i;             }
1284 
getChromaSampleLocTypeBottomField()1285   int               getChromaSampleLocTypeBottomField() const              { return m_chromaSampleLocTypeBottomField;       }
setChromaSampleLocTypeBottomField(int i)1286   void              setChromaSampleLocTypeBottomField(int i)               { m_chromaSampleLocTypeBottomField = i;          }
1287 
getChromaSampleLocType()1288   int               getChromaSampleLocType() const                         { return m_chromaSampleLocType;                  }
setChromaSampleLocType(int i)1289   void              setChromaSampleLocType(int i)                          { m_chromaSampleLocType = i;                     }
1290 
getOverscanInfoPresentFlag()1291   bool              getOverscanInfoPresentFlag() const                     { return m_overscanInfoPresentFlag;              }
setOverscanInfoPresentFlag(bool i)1292   void              setOverscanInfoPresentFlag(bool i)                     { m_overscanInfoPresentFlag = i;                 }
1293 
getOverscanAppropriateFlag()1294   bool              getOverscanAppropriateFlag() const                     { return m_overscanAppropriateFlag;              }
setOverscanAppropriateFlag(bool i)1295   void              setOverscanAppropriateFlag(bool i)                     { m_overscanAppropriateFlag = i;                 }
1296 
getVideoSignalTypePresentFlag()1297   bool              getVideoSignalTypePresentFlag() const                  { return m_videoSignalTypePresentFlag;           }
setVideoSignalTypePresentFlag(bool i)1298   void              setVideoSignalTypePresentFlag(bool i)                  { m_videoSignalTypePresentFlag = i;              }
1299 
getVideoFullRangeFlag()1300   bool              getVideoFullRangeFlag() const                          { return m_videoFullRangeFlag;                   }
setVideoFullRangeFlag(bool i)1301   void              setVideoFullRangeFlag(bool i)                          { m_videoFullRangeFlag = i;                      }
1302 
1303 };
1304 
1305 ///// SPS RExt class
1306 //class SPSRExt // Names aligned to text specification
1307 //{
1308 //private:
1309 //  bool m_transformSkipRotationEnabledFlag = false;
1310 //  bool m_transformSkipContextEnabledFlag  = false;
1311 //  bool m_rdpcmEnabledFlag[NUMBER_OF_RDPCM_SIGNALLING_MODES];
1312 //  bool m_extendedPrecisionProcessingFlag     = false;
1313 //  bool m_intraSmoothingDisabledFlag          = false;
1314 //  bool m_highPrecisionOffsetsEnabledFlag     = false;
1315 //  bool m_persistentRiceAdaptationEnabledFlag = false;
1316 //  bool m_cabacBypassAlignmentEnabledFlag     = false;
1317 //
1318 //public:
1319 //  SPSRExt()
1320 //  {
1321 //    for (uint32_t signallingModeIndex = 0; signallingModeIndex < NUMBER_OF_RDPCM_SIGNALLING_MODES; signallingModeIndex++)
1322 //    {
1323 //      m_rdpcmEnabledFlag[signallingModeIndex] = false;
1324 //    }
1325 //  }
1326 //
1327 //  bool settingsDifferFromDefaults() const
1328 //  {
1329 //    return getTransformSkipRotationEnabledFlag()
1330 //        || getTransformSkipContextEnabledFlag()
1331 //        || getRdpcmEnabledFlag(RDPCM_SIGNAL_IMPLICIT)
1332 //        || getRdpcmEnabledFlag(RDPCM_SIGNAL_EXPLICIT)
1333 //        || getExtendedPrecisionProcessingFlag()
1334 //        || getIntraSmoothingDisabledFlag()
1335 //        || getHighPrecisionOffsetsEnabledFlag()
1336 //        || getPersistentRiceAdaptationEnabledFlag()
1337 //        || getCabacBypassAlignmentEnabledFlag();
1338 //  }
1339 //
1340 //
1341 //  bool getTransformSkipRotationEnabledFlag() const                                     { return m_transformSkipRotationEnabledFlag;     }
1342 //  void setTransformSkipRotationEnabledFlag(const bool value)                           { m_transformSkipRotationEnabledFlag = value;    }
1343 //
1344 //  bool getTransformSkipContextEnabledFlag() const                                      { return m_transformSkipContextEnabledFlag;      }
1345 //  void setTransformSkipContextEnabledFlag(const bool value)                            { m_transformSkipContextEnabledFlag = value;     }
1346 //
1347 //  bool getRdpcmEnabledFlag(const RDPCMSignallingMode signallingMode) const             { return m_rdpcmEnabledFlag[signallingMode];     }
1348 //  void setRdpcmEnabledFlag(const RDPCMSignallingMode signallingMode, const bool value) { m_rdpcmEnabledFlag[signallingMode] = value;    }
1349 //
1350 //  bool getExtendedPrecisionProcessingFlag() const                                      { return m_extendedPrecisionProcessingFlag;      }
1351 //  void setExtendedPrecisionProcessingFlag(bool value)                                  { m_extendedPrecisionProcessingFlag = value;     }
1352 //
1353 //  bool getIntraSmoothingDisabledFlag() const                                           { return m_intraSmoothingDisabledFlag;           }
1354 //  void setIntraSmoothingDisabledFlag(bool bValue)                                      { m_intraSmoothingDisabledFlag=bValue;           }
1355 //
1356 //  bool getHighPrecisionOffsetsEnabledFlag() const                                      { return m_highPrecisionOffsetsEnabledFlag;      }
1357 //  void setHighPrecisionOffsetsEnabledFlag(bool value)                                  { m_highPrecisionOffsetsEnabledFlag = value;     }
1358 //
1359 //  bool getPersistentRiceAdaptationEnabledFlag() const                                  { return m_persistentRiceAdaptationEnabledFlag;  }
1360 //  void setPersistentRiceAdaptationEnabledFlag(const bool value)                        { m_persistentRiceAdaptationEnabledFlag = value; }
1361 //
1362 //  bool getCabacBypassAlignmentEnabledFlag() const                                      { return m_cabacBypassAlignmentEnabledFlag;      }
1363 //  void setCabacBypassAlignmentEnabledFlag(const bool value)                            { m_cabacBypassAlignmentEnabledFlag = value;     }
1364 //};
1365 //
1366 
1367 /// SPS class
1368 class SPS : public BasePS<SPS>
1369 {
1370 private:
1371   int               m_SPSId                              = 0;
1372   int               m_decodingParameterSetId             = 0;
1373   int               m_VPSId                              = 0;
1374   int               m_layerId                            = 0;
1375   bool              m_affineAmvrEnabledFlag              = false;
1376   bool              m_fpelMmvdEnabledFlag                = false;
1377   bool              m_DMVR                               = false;
1378   bool              m_MMVD                               = false;
1379   bool              m_SBT                                = false;
1380   bool              m_ISP                                = false;
1381   ChromaFormat      m_chromaFormatIdc                    = CHROMA_420;
1382   uint32_t          m_uiMaxTLayers                       = 1;            // maximum number of temporal layers
1383   bool              m_BdofControlPresentFlag             = false;
1384   bool              m_DmvrControlPresentFlag             = false;
1385   bool              m_ProfControlPresentFlag             = false;
1386   bool              m_ptlDpbHrdParamsPresentFlag         = true;
1387   bool              m_SubLayerDpbParamsFlag              = false;
1388 
1389   // Structure
1390   uint32_t          m_maxWidthInLumaSamples              = 0;
1391   uint32_t          m_maxHeightInLumaSamples             = 0;
1392 
1393   bool              m_subPicInfoPresentFlag              = false;                // indicates the presence of sub-picture info
1394   uint8_t           m_numSubPics                         = 1;                        //!< number of sub-pictures used
1395   uint32_t          m_subPicCtuTopLeftX[MAX_NUM_SUB_PICS];
1396   uint32_t          m_subPicCtuTopLeftY[MAX_NUM_SUB_PICS];
1397   uint32_t          m_SubPicWidth[MAX_NUM_SUB_PICS];
1398   uint32_t          m_SubPicHeight[MAX_NUM_SUB_PICS];
1399   bool              m_subPicTreatedAsPicFlag[MAX_NUM_SUB_PICS];
1400   bool              m_loopFilterAcrossSubpicEnabledFlag[MAX_NUM_SUB_PICS];
1401   bool              m_subPicIdMappingExplicitlySignalledFlag = false;
1402   bool              m_subPicIdMappingInSpsFlag           = false;
1403   uint32_t          m_subPicIdLen                        = 16;                       //!< sub-picture ID length in bits
1404   uint16_t          m_subPicId[MAX_NUM_SUB_PICS];        //!< sub-picture ID for each sub-picture in the sequence
1405   int               m_log2MinCodingBlockSize             = 0;
1406   unsigned          m_CTUSize                            = 0;
1407   unsigned          m_partitionOverrideEnalbed           = 0;            // enable partition constraints override function
1408   unsigned          m_minQT[3]                           = { 0, 0, 0 };    // 0: I slice luma; 1: P/B slice; 2: I slice chroma
1409   unsigned          m_maxBTDepth[3]                      = { 0, 0, 0 };
1410   unsigned          m_maxBTSize[3]                       = { 0, 0, 0 };
1411   unsigned          m_maxTTSize[3]                       = { 0, 0, 0 };
1412   bool              m_idrRefParamList                    = false;
1413   unsigned          m_dualITree                          = 0;
1414   uint32_t          m_uiMaxCUWidth                       = 32;
1415   uint32_t          m_uiMaxCUHeight                      = 32;
1416   bool              m_conformanceWindowPresentFlag       = false;
1417   Window            m_conformanceWindow;
1418   bool              m_independentSubPicsFlag             = false;
1419   bool              m_subPicSameSizeFlag                 = false;
1420 
1421   RPLList           m_RPLList0;
1422   RPLList           m_RPLList1;
1423   uint32_t          m_numRPL0                            = 0;
1424   uint32_t          m_numRPL1                            = 0;
1425 
1426   bool              m_rpl1CopyFromRpl0Flag               = false;
1427   bool              m_rpl1IdxPresentFlag                 = false;
1428   bool              m_allRplEntriesHasSameSignFlag       = true;
1429   bool              m_bLongTermRefsPresent               = false;
1430   bool              m_SPSTemporalMVPEnabledFlag          = false;
1431   int               m_numReorderPics[MAX_TLAYER]; // init in constructor
1432 
1433   // Tool list
1434   uint32_t          m_uiQuadtreeTULog2MaxSize            = 0;
1435   uint32_t          m_uiQuadtreeTULog2MinSize            = 0;
1436   uint32_t          m_uiQuadtreeTUMaxDepthInter          = 0;
1437   uint32_t          m_uiQuadtreeTUMaxDepthIntra          = 0;
1438   bool              m_useAMP                             = false;
1439 
1440   bool              m_transformSkipEnabledFlag           = false;
1441   int               m_log2MaxTransformSkipBlockSize      = 2;
1442   bool              m_BDPCMEnabledFlag                   = false;
1443   bool              m_JointCbCrEnabledFlag               = false;
1444   // Parameter
1445   BitDepths         m_bitDepths;
1446   bool              m_entropyCodingSyncEnabledFlag       = false;              //!< Flag for enabling WPP
1447   bool              m_entryPointPresentFlag              = false;              //!< Flag for indicating the presence of entry points
1448   int               m_qpBDOffset  [MAX_NUM_CHANNEL_TYPE] = { 0, 0 };
1449   int               m_internalMinusInputBitDepth[MAX_NUM_CHANNEL_TYPE] = {0, 0 }; //  max(0, internal bitdepth - input bitdepth);                                          }
1450   bool              m_sbtmvpEnabledFlag                  = false;
1451   bool              m_disFracMmvdEnabledFlag             = false;
1452 
1453   uint32_t          m_uiBitsForPOC                       =  8;
1454   bool              m_pocMsbFlag                         = false;
1455   uint32_t          m_pocMsbLen                          = 0;
1456   uint32_t          m_numLongTermRefPicSPS               =  0;
1457   uint32_t          m_ltRefPicPocLsbSps     [MAX_NUM_LONG_TERM_REF_PICS]; // init in constructor
1458   bool              m_usedByCurrPicLtSPSFlag[MAX_NUM_LONG_TERM_REF_PICS]; // init in constructor
1459   int               m_numExtraPHBitsBytes                 = 0;
1460   int               m_numExtraSHBitsBytes                 = 0;
1461   std::vector<bool> m_extraPHBitPresentFlag;
1462   std::vector<bool> m_extraSHBitPresentFlag;
1463   uint32_t          m_log2MaxTbSize                       = 6;
1464 
1465   bool             m_useWeightPred                       = false; //!< Use of Weighting Prediction (P_SLICE)
1466   bool             m_useWeightedBiPred                   = false; //!< Use of Weighting Bi-Prediction (B_SLICE)
1467   // Max physical transform size
1468   bool              m_bUseSAO                            = false;
1469 
1470   bool              m_bTemporalIdNestingFlag             = false;          // temporal_id_nesting_flag
1471 
1472   bool              m_scalingListEnabledFlag             = false;
1473   bool              m_scalingListPresentFlag             = false;
1474   ScalingList       m_scalingList;
1475   bool              m_depQuantEnabledFlag                = false;            //!< dependent quantization enabled flag
1476   bool              m_signDataHidingEnabledFlag          = false;      //!< sign data hiding enabled flag
1477   bool              m_virtualBoundariesEnabledFlag       = false;   //!< Enable virtual boundaries tool
1478   bool              m_virtualBoundariesPresentFlag       = false;   //!< disable loop filtering across virtual boundaries
1479   unsigned          m_numVerVirtualBoundaries            = 0;                         //!< number of vertical virtual boundaries
1480   unsigned          m_numHorVirtualBoundaries            = 0;                         //!< number of horizontal virtual boundaries
1481   unsigned          m_virtualBoundariesPosX[3];                        //!< horizontal position of each vertical virtual boundary
1482   unsigned          m_virtualBoundariesPosY[3];                        //!< vertical position of each horizontal virtual boundary
1483   uint32_t          m_uiMaxDecPicBuffering     [MAX_TLAYER];  // init in constructor
1484   uint32_t          m_uiMaxLatencyIncreasePlus1[MAX_TLAYER];  // init in constructor
1485 
1486   uint32_t          m_maxNumMergeCand                    = 0;
1487   uint32_t          m_maxNumAffineMergeCand              = 0;
1488   uint32_t          m_maxNumIBCMergeCand                 = 0;
1489   uint32_t          m_maxNumGeoCand                      = 0;
1490 
1491   bool              m_generalHrdParametersPresentFlag;
1492   GeneralHrdParams m_generalHrdParams;
1493   OlsHrdParams     m_olsHrdParams[MAX_TLAYER];
1494 
1495   bool              m_fieldSeqFlag                       = false;
1496   bool              m_vuiParametersPresentFlag           = false;
1497   unsigned          m_vuiPayloadSize                     = 0;
1498   VUI               m_vuiParameters;
1499 
1500   //SPSRExt           m_spsRangeExtension;
1501   static const      int m_winUnitX[NUM_CHROMA_FORMAT];
1502   static const      int m_winUnitY[NUM_CHROMA_FORMAT];
1503   ProfileTierLevel  m_profileTierLevel;
1504 
1505   bool              m_useALF                             = false;
1506   bool              m_useCCALF                           = false;
1507 
1508   bool              m_useWrapAround                      = false;
1509   unsigned          m_IBCFlag                            = 0;
1510   bool              m_useColorTrans                      = false;
1511   bool              m_lumaReshapeEnable                  = false;
1512   bool              m_AMVREnabledFlag                    = false;
1513   bool              m_LMChroma                           = false;
1514   bool              m_horCollocatedChromaFlag            = false;
1515   bool              m_verCollocatedChromaFlag            = false;
1516   bool              m_MTS                                = false;
1517   bool              m_IntraMTS                           = false;                // 18
1518   bool              m_InterMTS                           = false;                // 19
1519   bool              m_LFNST                              = false;
1520   bool              m_SMVD                               = false;
1521   bool              m_Affine                             = false;
1522   bool              m_AffineType                         = false;
1523  bool               m_PROF                               = false;
1524   bool              m_BIO                                = false;
1525   bool              m_bcw                                = false;                        //
1526   bool              m_ciip                               = false;
1527   bool              m_MRL                                = false;
1528   bool              m_Geo                                = false;
1529 
1530 #if LUMA_ADAPTIVE_DEBLOCKING_FILTER_QP_OFFSET
1531   bool              m_LadfEnabled                        = false;
1532   int               m_LadfNumIntervals                   = 0;
1533   int               m_LadfQpOffset          [MAX_LADF_INTERVALS]; // init in constructor
1534   int               m_LadfIntervalLowerBound[MAX_LADF_INTERVALS]; // init in constructor
1535 #endif
1536   bool              m_MIP                                = false;
1537   ChromaQpMappingTable m_chromaQpMappingTable;
1538   bool              m_GDREnabledFlag                     = false;
1539   bool              m_SubLayerCbpParametersPresentFlag   = false;
1540   bool              m_rprEnabledFlag                     = false;
1541   bool              m_resChangeInClvsEnabledFlag         = false;
1542   bool              m_interLayerPresentFlag              = false;
1543   uint32_t          m_log2ParallelMergeLevelMinus2       = 0;
1544   bool              m_ppsValidFlag[64];
1545   Size              m_scalingWindowSizeInPPS[64];
1546   bool              m_scalingMatrixAlternativeColourSpaceDisabledFlag = false;
1547   bool              m_scalingMatrixDesignatedColourSpaceFlag          = true;
1548   bool              m_disableScalingMatrixForLfnstBlks                = true;
1549 public:
1550 
SPS()1551   SPS()
1552   {
1553     for ( int i = 0; i < MAX_TLAYER; i++ )
1554     {
1555       m_uiMaxDecPicBuffering[i]      = 1;
1556       m_uiMaxLatencyIncreasePlus1[i] = 0;
1557       m_numReorderPics[i]            = 0;
1558     }
1559 
1560     memset( m_ltRefPicPocLsbSps,      0, sizeof( m_ltRefPicPocLsbSps ) );
1561     memset( m_usedByCurrPicLtSPSFlag, 0, sizeof( m_usedByCurrPicLtSPSFlag ) );
1562     memset( m_LadfQpOffset,           0, sizeof( m_LadfQpOffset ) );
1563     memset( m_LadfIntervalLowerBound, 0, sizeof( m_LadfQpOffset ) );
1564   }
1565 
1566   ~SPS() = default;
1567 
getSPSId()1568   int                     getSPSId() const                                                                { return m_SPSId;                                                      }
setSPSId(int i)1569   void                    setSPSId(int i)                                                                 { m_SPSId = i;                                                         }
setDecodingParameterSetId(int val)1570   void                    setDecodingParameterSetId(int val)                                              { m_decodingParameterSetId = val;                                      }
getDecodingParameterSetId()1571   int                     getDecodingParameterSetId() const                                               { return m_decodingParameterSetId;                                     }
getVPSId()1572   int                     getVPSId() const                                                                { return m_VPSId; }
setVPSId(int i)1573   void                    setVPSId(int i)                                                                 { m_VPSId = i; }
setLayerId(int i)1574   void                    setLayerId( int i )                                                             { m_layerId = i;                                                       }
getLayerId()1575   int                     getLayerId() const                                                              { return m_layerId;                                                    }
getChromaFormatIdc()1576   ChromaFormat            getChromaFormatIdc () const                                                     { return m_chromaFormatIdc;                                            }
setChromaFormatIdc(ChromaFormat i)1577   void                    setChromaFormatIdc (ChromaFormat i)                                             { m_chromaFormatIdc = i;                                               }
1578 
getWinUnitX(int chromaFormatIdc)1579   static int              getWinUnitX (int chromaFormatIdc)                                               { CHECK(chromaFormatIdc < 0 || chromaFormatIdc >= NUM_CHROMA_FORMAT, "Invalid chroma format parameter"); return m_winUnitX[chromaFormatIdc]; }
getWinUnitY(int chromaFormatIdc)1580   static int              getWinUnitY (int chromaFormatIdc)                                               { CHECK(chromaFormatIdc < 0 || chromaFormatIdc >= NUM_CHROMA_FORMAT, "Invalid chroma format parameter"); return m_winUnitY[chromaFormatIdc]; }
1581 
1582   // structure
setMaxPicWidthInLumaSamples(uint32_t u)1583   void                    setMaxPicWidthInLumaSamples( uint32_t u )                                       { m_maxWidthInLumaSamples = u; }
getMaxPicWidthInLumaSamples()1584   uint32_t                getMaxPicWidthInLumaSamples() const                                             { return  m_maxWidthInLumaSamples; }
setMaxPicHeightInLumaSamples(uint32_t u)1585   void                    setMaxPicHeightInLumaSamples( uint32_t u )                                      { m_maxHeightInLumaSamples = u; }
getMaxPicHeightInLumaSamples()1586   uint32_t                getMaxPicHeightInLumaSamples() const                                            { return  m_maxHeightInLumaSamples; }
setConformanceWindowPresentFlag(bool b)1587   void                    setConformanceWindowPresentFlag(bool b)                                         { m_conformanceWindowPresentFlag = b;           }
getConformanceWindowPresentFlag()1588   bool                    getConformanceWindowPresentFlag() const                                         { return m_conformanceWindowPresentFlag;        }
getConformanceWindow()1589   Window&                 getConformanceWindow()                                                          { return  m_conformanceWindow;                                         }
getConformanceWindow()1590   const Window&           getConformanceWindow() const                                                    { return  m_conformanceWindow;                                         }
setConformanceWindow(Window & conformanceWindow)1591   void                    setConformanceWindow(Window& conformanceWindow )                                { m_conformanceWindow = conformanceWindow;                             }
1592 
setSubPicInfoPresentFlag(bool b)1593   void                    setSubPicInfoPresentFlag(bool b)                                                { m_subPicInfoPresentFlag = b;            }
getSubPicInfoPresentFlag()1594   bool                    getSubPicInfoPresentFlag() const                                                { return m_subPicInfoPresentFlag;         }
1595 
setNumSubPics(uint8_t u)1596   void                    setNumSubPics( uint8_t u )                                                      { m_numSubPics = u;                           }
setIndependentSubPicsFlag(bool b)1597   void                    setIndependentSubPicsFlag(bool b)                                               { m_independentSubPicsFlag = b;                    }
getIndependentSubPicsFlag()1598   bool                    getIndependentSubPicsFlag() const                                               { return m_independentSubPicsFlag;                 }
setSubPicSameSizeFlag(bool b)1599   void                    setSubPicSameSizeFlag(bool b)                                                   { m_subPicSameSizeFlag = b;                       }
getSubPicSameSizeFlag()1600   bool                    getSubPicSameSizeFlag() const                                                   { return m_subPicSameSizeFlag;                    }
getNumSubPics()1601   uint8_t                 getNumSubPics( ) const                                                          { return  m_numSubPics;            }
setSubPicCtuTopLeftX(int i,uint32_t u)1602   void                    setSubPicCtuTopLeftX( int i, uint32_t u )                                       { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); m_subPicCtuTopLeftX[i] = u;                     }
getSubPicCtuTopLeftX(int i)1603   uint32_t                getSubPicCtuTopLeftX( int i ) const                                             { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); return  m_subPicCtuTopLeftX[i];                 }
setSubPicCtuTopLeftY(int i,uint32_t u)1604   void                    setSubPicCtuTopLeftY( int i, uint32_t u )                                       { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); m_subPicCtuTopLeftY[i] = u;                     }
getSubPicCtuTopLeftY(int i)1605   uint32_t                getSubPicCtuTopLeftY( int i ) const                                             { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); return  m_subPicCtuTopLeftY[i];                 }
setSubPicWidth(int i,uint32_t u)1606   void                    setSubPicWidth( int i, uint32_t u )                                             { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); m_SubPicWidth[i] = u;                           }
getSubPicWidth(int i)1607   uint32_t                getSubPicWidth( int i ) const                                                   { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); return  m_SubPicWidth[i];                       }
setSubPicHeight(int i,uint32_t u)1608   void                    setSubPicHeight( int i, uint32_t u )                                            { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); m_SubPicHeight[i] = u;                          }
getSubPicHeight(int i)1609   uint32_t                getSubPicHeight( int i ) const                                                  { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); return  m_SubPicHeight[i];                      }
setSubPicTreatedAsPicFlag(int i,bool u)1610   void                    setSubPicTreatedAsPicFlag( int i, bool u )                                      { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); m_subPicTreatedAsPicFlag[i] = u;                }
getSubPicTreatedAsPicFlag(int i)1611   bool                    getSubPicTreatedAsPicFlag( int i ) const                                        { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); return  m_subPicTreatedAsPicFlag[i];            }
setLoopFilterAcrossSubpicEnabledFlag(int i,bool u)1612   void                    setLoopFilterAcrossSubpicEnabledFlag( int i, bool u )                           { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); m_loopFilterAcrossSubpicEnabledFlag[i] = u;     }
getLoopFilterAcrossSubpicEnabledFlag(int i)1613   bool                    getLoopFilterAcrossSubpicEnabledFlag( int i ) const                             { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); return  m_loopFilterAcrossSubpicEnabledFlag[i]; }
setSubPicIdMappingExplicitlySignalledFlag(bool b)1614   void                    setSubPicIdMappingExplicitlySignalledFlag( bool b )                             { m_subPicIdMappingExplicitlySignalledFlag = b;    }
getSubPicIdMappingExplicitlySignalledFlag()1615   bool                    getSubPicIdMappingExplicitlySignalledFlag() const                               { return m_subPicIdMappingExplicitlySignalledFlag; }
setSubPicIdMappingInSpsFlag(bool b)1616   void                    setSubPicIdMappingInSpsFlag( bool b )                                           { m_subPicIdMappingInSpsFlag = b;                  }
getSubPicIdMappingInSpsFlag()1617   bool                    getSubPicIdMappingInSpsFlag() const                                             { return  m_subPicIdMappingInSpsFlag;              }
setSubPicIdLen(uint32_t u)1618   void                    setSubPicIdLen( uint32_t u )                                                    { CHECK( u > 16, "Sub-Picture id length exeeds valid range" ); m_subPicIdLen = u;                 }
getSubPicIdLen()1619   uint32_t                getSubPicIdLen() const                                                          { return  m_subPicIdLen;                                                                          }
setSubPicId(int i,uint16_t u)1620   void                    setSubPicId( int i, uint16_t u )                                                { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); m_subPicId[i] = u;     }
getSubPicId(int i)1621   uint16_t                getSubPicId( int i ) const                                                      { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); return  m_subPicId[i]; }
1622 
getNumLongTermRefPicSPS()1623   uint32_t                getNumLongTermRefPicSPS() const                                                 { return m_numLongTermRefPicSPS;                                       }
setNumLongTermRefPicSPS(uint32_t val)1624   void                    setNumLongTermRefPicSPS(uint32_t val)                                           { m_numLongTermRefPicSPS = val;                                        }
1625 
getLtRefPicPocLsbSps(uint32_t index)1626   uint32_t                getLtRefPicPocLsbSps(uint32_t index) const                                  { CHECK( index >= MAX_NUM_LONG_TERM_REF_PICS, "Index exceeds boundary" ); return m_ltRefPicPocLsbSps[index]; }
setLtRefPicPocLsbSps(uint32_t index,uint32_t val)1627   void                    setLtRefPicPocLsbSps(uint32_t index, uint32_t val)                              { CHECK( index >= MAX_NUM_LONG_TERM_REF_PICS, "Index exceeds boundary" ); m_ltRefPicPocLsbSps[index] = val;  }
1628 
getUsedByCurrPicLtSPSFlag(int i)1629   bool                    getUsedByCurrPicLtSPSFlag(int i) const                                          { CHECK( i >= MAX_NUM_LONG_TERM_REF_PICS, "Index exceeds boundary" ); return m_usedByCurrPicLtSPSFlag[i];    }
setUsedByCurrPicLtSPSFlag(int i,bool x)1630   void                    setUsedByCurrPicLtSPSFlag(int i, bool x)                                        { CHECK( i >= MAX_NUM_LONG_TERM_REF_PICS, "Index exceeds boundary" ); m_usedByCurrPicLtSPSFlag[i] = x;       }
1631 
getLog2MinCodingBlockSize()1632   int                     getLog2MinCodingBlockSize() const                                               { return m_log2MinCodingBlockSize;                                     }
setLog2MinCodingBlockSize(int val)1633   void                    setLog2MinCodingBlockSize(int val)                                              { m_log2MinCodingBlockSize = val;                                      }
setCTUSize(unsigned ctuSize)1634   void                    setCTUSize(unsigned    ctuSize)                                                 { m_CTUSize = ctuSize; }
getCTUSize()1635   unsigned                getCTUSize()                                                              const { return  m_CTUSize; }
setSplitConsOverrideEnabledFlag(bool b)1636   void                    setSplitConsOverrideEnabledFlag(bool b)                                         { m_partitionOverrideEnalbed = b; }
getSplitConsOverrideEnabledFlag()1637   bool                    getSplitConsOverrideEnabledFlag()                                         const { return m_partitionOverrideEnalbed; }
setMinQTSizes(unsigned * minQT)1638   void                    setMinQTSizes(unsigned*   minQT)                                                { m_minQT[0] = minQT[0]; m_minQT[1] = minQT[1]; m_minQT[2] = minQT[2]; }
1639   unsigned                getMinQTSize(SliceType   slicetype,
1640                                        ChannelType chType = CHANNEL_TYPE_LUMA)
1641                                                                                                     const { return slicetype == I_SLICE ? (chType == CHANNEL_TYPE_LUMA ? m_minQT[0] : m_minQT[2]) : m_minQT[1]; }
setMaxBTDepth(unsigned maxBTDepth,unsigned maxBTDepthI,unsigned maxBTDepthIChroma)1642   void                    setMaxBTDepth(unsigned    maxBTDepth,
1643                                         unsigned    maxBTDepthI,
1644                                         unsigned    maxBTDepthIChroma)
1645                                                                                                           { m_maxBTDepth[1] = maxBTDepth; m_maxBTDepth[0] = maxBTDepthI; m_maxBTDepth[2] = maxBTDepthIChroma; }
getMaxBTDepth()1646   unsigned                getMaxBTDepth()                                                           const { return m_maxBTDepth[1]; }
getMaxBTDepthI()1647   unsigned                getMaxBTDepthI()                                                          const { return m_maxBTDepth[0]; }
getMaxBTDepthIChroma()1648   unsigned                getMaxBTDepthIChroma()                                                    const { return m_maxBTDepth[2]; }
setMaxBTSize(unsigned maxBTSize,unsigned maxBTSizeI,unsigned maxBTSizeC)1649   void                    setMaxBTSize(unsigned    maxBTSize,
1650                                        unsigned    maxBTSizeI,
1651                                        unsigned    maxBTSizeC)
1652                                                                                                           { m_maxBTSize[1] = maxBTSize; m_maxBTSize[0] = maxBTSizeI; m_maxBTSize[2] = maxBTSizeC; }
getMaxBTSize()1653   unsigned                getMaxBTSize()                                                            const { return m_maxBTSize[1]; }
getMaxBTSizeI()1654   unsigned                getMaxBTSizeI()                                                           const { return m_maxBTSize[0]; }
getMaxBTSizeIChroma()1655   unsigned                getMaxBTSizeIChroma()                                                     const { return m_maxBTSize[2]; }
setMaxTTSize(unsigned maxTTSize,unsigned maxTTSizeI,unsigned maxTTSizeC)1656   void                    setMaxTTSize(unsigned    maxTTSize,
1657                                        unsigned    maxTTSizeI,
1658                                        unsigned    maxTTSizeC)
1659                                                                                                           { m_maxTTSize[1] = maxTTSize; m_maxTTSize[0] = maxTTSizeI; m_maxTTSize[2] = maxTTSizeC; }
getMaxTTSize()1660   unsigned                getMaxTTSize()                                                            const { return m_maxTTSize[1]; }
getMaxTTSizeI()1661   unsigned                getMaxTTSizeI()                                                           const { return m_maxTTSize[0]; }
getMaxTTSizeIChroma()1662   unsigned                getMaxTTSizeIChroma()                                                     const { return m_maxTTSize[2]; }
getMinQTSizes()1663   unsigned*               getMinQTSizes()                                                          const { return (unsigned *)m_minQT;                }
1664 //  unsigned*               getMaxMTTHierarchyDepths()                                               const { return (unsigned *)m_maxMTTHierarchyDepth; }
getMaxBTSizes()1665   unsigned*               getMaxBTSizes()                                                          const { return (unsigned *)m_maxBTSize;            }
getMaxTTSizes()1666   unsigned*               getMaxTTSizes()                                                          const { return (unsigned *)m_maxTTSize;            }
setIDRRefParamListPresent(bool b)1667   void                    setIDRRefParamListPresent(bool b)                                               { m_idrRefParamList = b; }
getIDRRefParamListPresent()1668   bool                    getIDRRefParamListPresent()                                               const { return m_idrRefParamList; }
setUseDualITree(bool b)1669   void                    setUseDualITree(bool b) { m_dualITree = b; }
getUseDualITree()1670   bool                    getUseDualITree()                                                         const { return m_dualITree; }
1671 
setMaxCUWidth(uint32_t u)1672   void                    setMaxCUWidth( uint32_t u )                                                     { m_uiMaxCUWidth = u;                                                  }
getMaxCUWidth()1673   uint32_t                getMaxCUWidth() const                                                           { return  m_uiMaxCUWidth;                                              }
setMaxCUHeight(uint32_t u)1674   void                    setMaxCUHeight( uint32_t u )                                                    { m_uiMaxCUHeight = u;                                                 }
getMaxCUHeight()1675   uint32_t                getMaxCUHeight() const                                                          { return  m_uiMaxCUHeight;                                             }
getTransformSkipEnabledFlag()1676   bool                    getTransformSkipEnabledFlag() const                                             { return m_transformSkipEnabledFlag;                                   }
setTransformSkipEnabledFlag(bool b)1677   void                    setTransformSkipEnabledFlag( bool b )                                           { m_transformSkipEnabledFlag = b;                                      }
getLog2MaxTransformSkipBlockSize()1678   uint32_t                getLog2MaxTransformSkipBlockSize() const                                            { return m_log2MaxTransformSkipBlockSize;                              }
setLog2MaxTransformSkipBlockSize(uint32_t u)1679   void                    setLog2MaxTransformSkipBlockSize(uint32_t u)                                        { m_log2MaxTransformSkipBlockSize = u;                                 }
getBDPCMEnabledFlag()1680   bool                    getBDPCMEnabledFlag() const                                                         { return m_BDPCMEnabledFlag;                                           }
setBDPCMEnabledFlag(bool b)1681   void                    setBDPCMEnabledFlag( bool b )                                                       { m_BDPCMEnabledFlag = b;                                              }
setBitsForPOC(uint32_t u)1682   void                    setBitsForPOC( uint32_t u )                                                     { m_uiBitsForPOC = u;                                                  }
getBitsForPOC()1683   uint32_t                getBitsForPOC() const                                                           { return m_uiBitsForPOC;                                               }
setPocMsbFlag(bool b)1684   void                    setPocMsbFlag(bool b)                                                               { m_pocMsbFlag = b;                                                    }
getPocMsbFlag()1685   bool                    getPocMsbFlag() const                                                               { return m_pocMsbFlag;                                                 }
setPocMsbLen(uint32_t u)1686   void                    setPocMsbLen(uint32_t u)                                                            { m_pocMsbLen = u;                                                     }
getPocMsbLen()1687   uint32_t                getPocMsbLen() const                                                                { return m_pocMsbLen;                                                  }
setNumExtraPHBitsBytes(int i)1688   void                    setNumExtraPHBitsBytes(int i)                                                       { m_numExtraPHBitsBytes = i;                                           }
getNumExtraPHBitsBytes()1689   int                     getNumExtraPHBitsBytes() const                                                      { return m_numExtraPHBitsBytes;                                        }
setNumExtraSHBitsBytes(int i)1690   void                    setNumExtraSHBitsBytes(int i)                                                       { m_numExtraSHBitsBytes = i;                                           }
getNumExtraSHBitsBytes()1691   int                     getNumExtraSHBitsBytes() const                                                      { return m_numExtraSHBitsBytes;                                        }
setExtraPHBitPresentFlags(const std::vector<bool> & b)1692   void                    setExtraPHBitPresentFlags(const std::vector<bool> &b)                               { m_extraPHBitPresentFlag = b;                                         }
getExtraPHBitPresentFlags()1693   const std::vector<bool> getExtraPHBitPresentFlags() const                                                   { return m_extraPHBitPresentFlag;                                      }
setExtraSHBitPresentFlags(const std::vector<bool> & b)1694   void                    setExtraSHBitPresentFlags(const std::vector<bool> &b)                               { m_extraSHBitPresentFlag = b;                                         }
getExtraSHBitPresentFlags()1695   const std::vector<bool> getExtraSHBitPresentFlags() const                                                   { return m_extraSHBitPresentFlag;                                      }
getUseAMP()1696   bool                    getUseAMP() const                                                               { return m_useAMP;                                                     }
setUseAMP(bool b)1697   void                    setUseAMP( bool b )                                                             { m_useAMP = b;                                                        }
setQuadtreeTULog2MaxSize(uint32_t u)1698   void                    setQuadtreeTULog2MaxSize( uint32_t u )                                          { m_uiQuadtreeTULog2MaxSize = u;                                       }
getQuadtreeTULog2MaxSize()1699   uint32_t                getQuadtreeTULog2MaxSize() const                                                { return m_uiQuadtreeTULog2MaxSize;                                    }
setQuadtreeTULog2MinSize(uint32_t u)1700   void                    setQuadtreeTULog2MinSize( uint32_t u )                                          { m_uiQuadtreeTULog2MinSize = u;                                       }
getQuadtreeTULog2MinSize()1701   uint32_t                getQuadtreeTULog2MinSize() const                                                { return m_uiQuadtreeTULog2MinSize;                                    }
setQuadtreeTUMaxDepthInter(uint32_t u)1702   void                    setQuadtreeTUMaxDepthInter( uint32_t u )                                        { m_uiQuadtreeTUMaxDepthInter = u;                                     }
setQuadtreeTUMaxDepthIntra(uint32_t u)1703   void                    setQuadtreeTUMaxDepthIntra( uint32_t u )                                        { m_uiQuadtreeTUMaxDepthIntra = u;                                     }
getQuadtreeTUMaxDepthInter()1704   uint32_t                getQuadtreeTUMaxDepthInter() const                                              { return m_uiQuadtreeTUMaxDepthInter;                                  }
getQuadtreeTUMaxDepthIntra()1705   uint32_t                getQuadtreeTUMaxDepthIntra() const                                              { return m_uiQuadtreeTUMaxDepthIntra;                                  }
setNumReorderPics(int i,uint32_t tlayer)1706   void                    setNumReorderPics(int i, uint32_t tlayer)                                       { m_numReorderPics[tlayer] = i;                                        }
getNumReorderPics(uint32_t tlayer)1707   int                     getNumReorderPics(uint32_t tlayer) const                                        { return m_numReorderPics[tlayer];                                     }
1708   void                    createRPLList0(int numRPL);
1709   void                    createRPLList1(int numRPL);
getRPLList(bool b)1710   const RPLList&          getRPLList( bool b ) const                                                      { return b==1 ? m_RPLList1 : m_RPLList0;                               }
getRPLList(bool b)1711   RPLList&                getRPLList( bool b )                                                            { return b==1 ? m_RPLList1 : m_RPLList0;                               }
getNumRPL(bool b)1712   uint32_t                getNumRPL( bool b ) const                                                       { return b==1 ? m_numRPL1   : m_numRPL0;                               }
getRPLList0()1713   const RPLList&          getRPLList0() const                                                             { return m_RPLList0;                                                   }
getRPLList0()1714         RPLList&          getRPLList0()                                                                   { return m_RPLList0;                                                   }
getRPLList1()1715   const RPLList&          getRPLList1() const                                                             { return m_RPLList1;                                                   }
getRPLList1()1716         RPLList&          getRPLList1()                                                                   { return m_RPLList1;                                                   }
getNumRPL0()1717   uint32_t                getNumRPL0() const                                                              { return m_numRPL0;                                                    }
getNumRPL1()1718   uint32_t                getNumRPL1() const                                                              { return m_numRPL1;                                                    }
setRPL1CopyFromRPL0Flag(bool isCopy)1719   void                    setRPL1CopyFromRPL0Flag(bool isCopy)                                            { m_rpl1CopyFromRpl0Flag = isCopy;                                     }
getRPL1CopyFromRPL0Flag()1720   bool                    getRPL1CopyFromRPL0Flag() const                                                 { return m_rpl1CopyFromRpl0Flag;                                       }
getRPL1IdxPresentFlag()1721   bool                    getRPL1IdxPresentFlag() const                                                   { return m_rpl1IdxPresentFlag;                                         }
setAllActiveRplEntriesHasSameSignFlag(bool isAllSame)1722   void                    setAllActiveRplEntriesHasSameSignFlag(bool isAllSame)                           { m_allRplEntriesHasSameSignFlag = isAllSame;                          }
getAllActiveRplEntriesHasSameSignFlag()1723   bool                    getAllActiveRplEntriesHasSameSignFlag() const                                   { return m_allRplEntriesHasSameSignFlag;                               }
getLongTermRefsPresent()1724   bool                    getLongTermRefsPresent() const                                                  { return m_bLongTermRefsPresent;                                       }
setLongTermRefsPresent(bool b)1725   void                    setLongTermRefsPresent(bool b)                                                  { m_bLongTermRefsPresent=b;                                            }
getSPSTemporalMVPEnabledFlag()1726   bool                    getSPSTemporalMVPEnabledFlag() const                                            { return m_SPSTemporalMVPEnabledFlag;                                  }
setSPSTemporalMVPEnabledFlag(bool b)1727   void                    setSPSTemporalMVPEnabledFlag(bool b)                                            { m_SPSTemporalMVPEnabledFlag=b;                                       }
setLog2MaxTbSize(uint32_t u)1728   void                    setLog2MaxTbSize( uint32_t u )                                                  { m_log2MaxTbSize = u;                                                 }
getLog2MaxTbSize()1729   uint32_t                getLog2MaxTbSize() const                                                        { return  m_log2MaxTbSize;                                             }
getMaxTbSize()1730   uint32_t                getMaxTbSize() const                                                            { return  1 << m_log2MaxTbSize;                                        }
1731   // Bit-depth
getBitDepth(ChannelType type)1732   int                     getBitDepth(ChannelType type) const                                             { return m_bitDepths.recon[type];                                      }
setBitDepth(ChannelType type,int u)1733   void                    setBitDepth(ChannelType type, int u )                                           { m_bitDepths.recon[type] = u;                                         }
getBitDepths()1734   const BitDepths&        getBitDepths() const                                                            { return m_bitDepths;                                                  }
1735 
getEntropyCodingSyncEnabledFlag()1736   bool                    getEntropyCodingSyncEnabledFlag() const                                         { return m_entropyCodingSyncEnabledFlag;                               }
setEntropyCodingSyncEnabledFlag(bool val)1737   void                    setEntropyCodingSyncEnabledFlag(bool val)                                       { m_entropyCodingSyncEnabledFlag = val;                                }
getEntryPointsPresentFlag()1738   bool                    getEntryPointsPresentFlag() const                                               { return m_entryPointPresentFlag;                                      }
setEntryPointsPresentFlag(bool val)1739   void                    setEntryPointsPresentFlag(bool val)                                             { m_entryPointPresentFlag = val;                                       }
1740 
getMaxLog2TrDynamicRange(ChannelType channelType)1741   static constexpr int    getMaxLog2TrDynamicRange(ChannelType channelType) 			          { return 15; }
1742 
getDifferentialLumaChromaBitDepth()1743   int                     getDifferentialLumaChromaBitDepth() const                                       { return int(m_bitDepths.recon[CHANNEL_TYPE_LUMA]) - int(m_bitDepths.recon[CHANNEL_TYPE_CHROMA]); }
getQpBDOffset(ChannelType type)1744   int                     getQpBDOffset(ChannelType type) const                                           { return m_qpBDOffset[type];                                           }
setQpBDOffset(ChannelType type,int i)1745   void                    setQpBDOffset(ChannelType type, int i)                                          { m_qpBDOffset[type] = i;                                              }
getInternalMinusInputBitDepth(ChannelType type)1746   int                     getInternalMinusInputBitDepth(ChannelType type) const                           { return m_internalMinusInputBitDepth[type];                                           }
setInternalMinusInputBitDepth(ChannelType type,int i)1747   void                    setInternalMinusInputBitDepth(ChannelType type, int i)                          { m_internalMinusInputBitDepth[type] = i;                                              }
setUseSAO(bool bVal)1748   void                    setUseSAO(bool bVal)                                                            { m_bUseSAO = bVal;                                                    }
getUseSAO()1749   bool                    getUseSAO() const                                                               { return m_bUseSAO;                                                    }
1750 
setJointCbCrEnabledFlag(bool bVal)1751   void                    setJointCbCrEnabledFlag(bool bVal)                                              { m_JointCbCrEnabledFlag = bVal; }
getJointCbCrEnabledFlag()1752   bool                    getJointCbCrEnabledFlag() const                                                 { return m_JointCbCrEnabledFlag; }
1753 
getSBTMVPEnabledFlag()1754   bool                    getSBTMVPEnabledFlag() const                                                    { return m_sbtmvpEnabledFlag; }
setSBTMVPEnabledFlag(bool b)1755   void                    setSBTMVPEnabledFlag(bool b)                                                    { m_sbtmvpEnabledFlag = b; }
1756 
getDisFracMmvdEnabledFlag()1757   bool                    getDisFracMmvdEnabledFlag() const                                               { return m_disFracMmvdEnabledFlag; }
setDisFracMmvdEnabledFlag(bool b)1758   void                    setDisFracMmvdEnabledFlag( bool b )                                             { m_disFracMmvdEnabledFlag = b;    }
1759 
getFpelMmvdEnabledFlag()1760   bool                    getFpelMmvdEnabledFlag() const                                                  { return m_fpelMmvdEnabledFlag; }
setFpelMmvdEnabledFlag(bool b)1761   void                    setFpelMmvdEnabledFlag( bool b )                                                { m_fpelMmvdEnabledFlag = b;    }
getUseDMVR()1762   bool                    getUseDMVR()const                                                               { return m_DMVR; }
setUseDMVR(bool b)1763   void                    setUseDMVR(bool b)                                                              { m_DMVR = b;    }
getUseMMVD()1764   bool                    getUseMMVD()const                                                               { return m_MMVD; }
setUseMMVD(bool b)1765   void                    setUseMMVD(bool b)                                                              { m_MMVD = b;    }
getBdofControlPresentFlag()1766   bool                    getBdofControlPresentFlag()const                                                { return m_BdofControlPresentFlag; }
setBdofControlPresentFlag(bool b)1767   void                    setBdofControlPresentFlag(bool b)                                               { m_BdofControlPresentFlag = b;    }
1768 
getDmvrControlPresentFlag()1769   bool                    getDmvrControlPresentFlag()const                                                { return m_DmvrControlPresentFlag; }
setDmvrControlPresentFlag(bool b)1770   void                    setDmvrControlPresentFlag(bool b)                                               { m_DmvrControlPresentFlag = b;    }
1771 
getProfControlPresentFlag()1772   bool                    getProfControlPresentFlag()const                                                { return m_ProfControlPresentFlag; }
setProfControlPresentFlag(bool b)1773   void                    setProfControlPresentFlag(bool b)                                               { m_ProfControlPresentFlag = b;    }
getMaxTLayers()1774   uint32_t                getMaxTLayers() const                                                           { return m_uiMaxTLayers; }
setMaxTLayers(uint32_t uiMaxTLayers)1775   void                    setMaxTLayers( uint32_t uiMaxTLayers )                                          { CHECK( uiMaxTLayers > MAX_TLAYER, "Invalid number T-layers" ); m_uiMaxTLayers = uiMaxTLayers; }
1776 
getPtlDpbHrdParamsPresentFlag()1777   bool                    getPtlDpbHrdParamsPresentFlag()  const                                          { return m_ptlDpbHrdParamsPresentFlag;     }
setPtlDpbHrdParamsPresentFlag(bool b)1778   void                    setPtlDpbHrdParamsPresentFlag(bool b)                                           {        m_ptlDpbHrdParamsPresentFlag = b; }
getSubLayerDpbParamsFlag()1779   bool                    getSubLayerDpbParamsFlag()  const                                               { return m_SubLayerDpbParamsFlag;          }
setSubLayerDpbParamsFlag(bool b)1780   void                    setSubLayerDpbParamsFlag(bool b)                                                {        m_SubLayerDpbParamsFlag = b;      }
getTemporalIdNestingFlag()1781   bool                    getTemporalIdNestingFlag() const                                                { return m_bTemporalIdNestingFlag;                                     }
setTemporalIdNestingFlag(bool bValue)1782   void                    setTemporalIdNestingFlag( bool bValue )                                         { m_bTemporalIdNestingFlag = bValue;                                   }
1783 
getScalingListFlag()1784   bool                    getScalingListFlag() const                                                      { return m_scalingListEnabledFlag;                                     }
setScalingListFlag(bool b)1785   void                    setScalingListFlag( bool b )                                                    { m_scalingListEnabledFlag  = b;                                       }
getScalingListPresentFlag()1786   bool                    getScalingListPresentFlag() const                                               { return m_scalingListPresentFlag;                                     }
setScalingListPresentFlag(bool b)1787   void                    setScalingListPresentFlag( bool b )                                             { m_scalingListPresentFlag  = b;                                       }
getScalingList()1788   ScalingList&            getScalingList()                                                                { return m_scalingList; }
getScalingList()1789   const ScalingList&      getScalingList() const                                                          { return m_scalingList; }
setDepQuantEnabledFlag(bool b)1790   void                    setDepQuantEnabledFlag(bool b)                                                  { m_depQuantEnabledFlag = b; }
getDepQuantEnabledFlag()1791   bool                    getDepQuantEnabledFlag() const                                                  { return m_depQuantEnabledFlag; }
setSignDataHidingEnabledFlag(bool b)1792   void                    setSignDataHidingEnabledFlag(bool b)                                            { m_signDataHidingEnabledFlag = b; }
getSignDataHidingEnabledFlag()1793   bool                    getSignDataHidingEnabledFlag() const                                            { return m_signDataHidingEnabledFlag; }
setVirtualBoundariesEnabledFlag(bool b)1794   void                    setVirtualBoundariesEnabledFlag( bool b )                                       { m_virtualBoundariesEnabledFlag = b;                                  }
getVirtualBoundariesEnabledFlag()1795   bool                    getVirtualBoundariesEnabledFlag() const                                         { return m_virtualBoundariesEnabledFlag;                               }
setVirtualBoundariesPresentFlag(bool b)1796   void                    setVirtualBoundariesPresentFlag( bool b )                                       { m_virtualBoundariesPresentFlag = b; }
getVirtualBoundariesPresentFlag()1797   bool                    getVirtualBoundariesPresentFlag() const                                         { return m_virtualBoundariesPresentFlag; }
setNumVerVirtualBoundaries(unsigned u)1798   void                    setNumVerVirtualBoundaries(unsigned u)                                          { m_numVerVirtualBoundaries = u;                                       }
getNumVerVirtualBoundaries()1799   unsigned                getNumVerVirtualBoundaries() const                                              { return m_numVerVirtualBoundaries;                                    }
setNumHorVirtualBoundaries(unsigned u)1800   void                    setNumHorVirtualBoundaries(unsigned u)                                          { m_numHorVirtualBoundaries = u;                                       }
getNumHorVirtualBoundaries()1801   unsigned                getNumHorVirtualBoundaries() const                                              { return m_numHorVirtualBoundaries;                                    }
setVirtualBoundariesPosX(unsigned u,unsigned idx)1802   void                    setVirtualBoundariesPosX(unsigned u, unsigned idx)                              { CHECK( idx >= 3, "vitrual boundary index exceeds valid range" ); m_virtualBoundariesPosX[idx] = u;    }
getVirtualBoundariesPosX(unsigned idx)1803   unsigned                getVirtualBoundariesPosX(unsigned idx) const                                    { CHECK( idx >= 3, "vitrual boundary index exceeds valid range" ); return m_virtualBoundariesPosX[idx]; }
setVirtualBoundariesPosY(unsigned u,unsigned idx)1804   void                    setVirtualBoundariesPosY(unsigned u, unsigned idx)                              { CHECK( idx >= 3, "vitrual boundary index exceeds valid range" ); m_virtualBoundariesPosY[idx] = u;    }
getVirtualBoundariesPosY(unsigned idx)1805   unsigned                getVirtualBoundariesPosY(unsigned idx) const                                    { CHECK( idx >= 3, "vitrual boundary index exceeds valid range" ); return m_virtualBoundariesPosY[idx]; }
1806 
getMaxDecPicBuffering(uint32_t tlayer)1807   uint32_t                getMaxDecPicBuffering(uint32_t tlayer) const                                    { return m_uiMaxDecPicBuffering[tlayer];                               }
setMaxDecPicBuffering(uint32_t ui,uint32_t tlayer)1808   void                    setMaxDecPicBuffering( uint32_t ui, uint32_t tlayer )                           { CHECK(tlayer >= MAX_TLAYER, "Invalid T-layer"); m_uiMaxDecPicBuffering[tlayer] = ui;    }
getMaxLatencyIncreasePlus1(uint32_t tlayer)1809   uint32_t                getMaxLatencyIncreasePlus1(uint32_t tlayer) const                               { return m_uiMaxLatencyIncreasePlus1[tlayer];                          }
setMaxLatencyIncreasePlus1(uint32_t ui,uint32_t tlayer)1810   void                    setMaxLatencyIncreasePlus1( uint32_t ui , uint32_t tlayer)                      { m_uiMaxLatencyIncreasePlus1[tlayer] = ui;                            }
1811 
getMaxNumMergeCand()1812   uint32_t                getMaxNumMergeCand() const                                                      { return m_maxNumMergeCand; }
setMaxNumMergeCand(uint32_t u)1813   void                    setMaxNumMergeCand(uint32_t u)                                                  { m_maxNumMergeCand = u; }
getMaxNumAffineMergeCand()1814   uint32_t                getMaxNumAffineMergeCand() const                                                { return m_maxNumAffineMergeCand; }
setMaxNumAffineMergeCand(uint32_t u)1815   void                    setMaxNumAffineMergeCand(uint32_t u)                                            { m_maxNumAffineMergeCand = u; }
getMaxNumIBCMergeCand()1816   uint32_t                getMaxNumIBCMergeCand() const                                                   { return m_maxNumIBCMergeCand; }
setMaxNumIBCMergeCand(uint32_t u)1817   void                    setMaxNumIBCMergeCand(uint32_t u)                                               { m_maxNumIBCMergeCand = u; }
getMaxNumGeoCand()1818   uint32_t                getMaxNumGeoCand() const                                                        { return m_maxNumGeoCand; }
setMaxNumGeoCand(uint32_t u)1819   void                    setMaxNumGeoCand(uint32_t u)                                                    { m_maxNumGeoCand = u; }
1820 
setAffineAmvrEnabledFlag(bool val)1821   void                    setAffineAmvrEnabledFlag( bool val )                                            { m_affineAmvrEnabledFlag = val;                                       }
getAffineAmvrEnabledFlag()1822   bool                    getAffineAmvrEnabledFlag() const                                                { return m_affineAmvrEnabledFlag;                                      }
getGeneralHrdParametersPresentFlag()1823   bool                    getGeneralHrdParametersPresentFlag() const { return m_generalHrdParametersPresentFlag; }
setGeneralHrdParametersPresentFlag(bool b)1824   void                    setGeneralHrdParametersPresentFlag(bool b) { m_generalHrdParametersPresentFlag = b; }
getOlsHrdParameters()1825   OlsHrdParams*           getOlsHrdParameters() { return &m_olsHrdParams[0]; }
getOlsHrdParameters()1826   const OlsHrdParams*     getOlsHrdParameters() const { return &m_olsHrdParams[0]; }
1827 
getGeneralHrdParameters()1828   GeneralHrdParams*       getGeneralHrdParameters() { return &m_generalHrdParams; }
getGeneralHrdParameters()1829   const GeneralHrdParams* getGeneralHrdParameters() const { return &m_generalHrdParams; }
getFieldSeqFlag()1830   bool                    getFieldSeqFlag() const                                                         { return m_fieldSeqFlag;                         }
setFieldSeqFlag(bool i)1831   void                    setFieldSeqFlag(bool i)                                                         { m_fieldSeqFlag = i;                            }
getVuiParametersPresentFlag()1832   bool                    getVuiParametersPresentFlag() const                                             { return m_vuiParametersPresentFlag;                                   }
setVuiParametersPresentFlag(bool b)1833   void                    setVuiParametersPresentFlag(bool b)                                             { m_vuiParametersPresentFlag = b;                                      }
getVuiPayloadSize()1834   unsigned                getVuiPayloadSize() const                                                       { return m_vuiPayloadSize; }
setVuiPayloadSize(unsigned i)1835   void                    setVuiPayloadSize(unsigned i)                                                   { m_vuiPayloadSize = i; }
getVuiParameters()1836   VUI*                    getVuiParameters()                                                              { return &m_vuiParameters;                                             }
getVuiParameters()1837   const VUI*              getVuiParameters() const                                                        { return &m_vuiParameters;                                             }
getProfileTierLevel()1838   const ProfileTierLevel* getProfileTierLevel() const                                                     { return &m_profileTierLevel; }
getProfileTierLevel()1839   ProfileTierLevel*       getProfileTierLevel()                                                           { return &m_profileTierLevel; }
1840 
1841   //const SPSRExt&          getSpsRangeExtension() const                                                    { return m_spsRangeExtension;                                          }
1842   //SPSRExt&                getSpsRangeExtension()                                                          { return m_spsRangeExtension;                                          }
1843 
1844 
getUseALF()1845   bool                    getUseALF() const                                                               { return m_useALF;                                                     }
setUseALF(bool b)1846   void                    setUseALF( bool b )                                                             { m_useALF = b;                                                        }
getUseCCALF()1847   bool                    getUseCCALF() const                                                             { return m_useCCALF; }
setUseCCALF(bool b)1848   void                    setUseCCALF( bool b )                                                           { m_useCCALF = b; }
1849 
setUseWrapAround(bool b)1850   void                    setUseWrapAround(bool b)                                                        { m_useWrapAround = b;                                                 }
getUseWrapAround()1851   bool                    getUseWrapAround() const                                                        { return m_useWrapAround;                                              }
setUseReshaper(bool b)1852   void                    setUseReshaper(bool b)                                                          { m_lumaReshapeEnable = b;                                                   }
getUseReshaper()1853   bool                    getUseReshaper() const                                                          { return m_lumaReshapeEnable;                                                }
setIBCFlag(unsigned IBCFlag)1854   void                    setIBCFlag(unsigned IBCFlag)                                                    { m_IBCFlag = IBCFlag; }
getIBCFlag()1855   unsigned                getIBCFlag() const                                                              { return m_IBCFlag; }
setUseColorTrans(bool value)1856   void                    setUseColorTrans(bool value)                                                    { m_useColorTrans = value; }
getUseColorTrans()1857   bool                    getUseColorTrans() const                                                        { return m_useColorTrans; }
setUseSBT(bool b)1858   void                    setUseSBT( bool b )                                                             { m_SBT = b; }
getUseSBT()1859   bool                    getUseSBT() const                                                               { return m_SBT; }
setUseISP(bool b)1860   void                    setUseISP( bool b )                                                             { m_ISP = b; }
getUseISP()1861   bool                    getUseISP() const                                                               { return m_ISP; }
1862 
setAMVREnabledFlag(bool b)1863   void      setAMVREnabledFlag    ( bool b )                                        { m_AMVREnabledFlag = b; }
getAMVREnabledFlag()1864   bool      getAMVREnabledFlag    ()                                      const     { return m_AMVREnabledFlag; }
1865 
setUseAffine(bool b)1866   void      setUseAffine          ( bool b )                                        { m_Affine = b; }
getUseAffine()1867   bool      getUseAffine          ()                                      const     { return m_Affine; }
setUseAffineType(bool b)1868   void      setUseAffineType      ( bool b )                                        { m_AffineType = b; }
getUseAffineType()1869   bool      getUseAffineType      ()                                      const     { return m_AffineType; }
setUsePROF(bool b)1870   void      setUsePROF            ( bool b )                                        { m_PROF = b; }
getUsePROF()1871   bool      getUsePROF            ()                                      const     { return m_PROF; }
setUseBcw(bool b)1872   void      setUseBcw             ( bool b )                                        { m_bcw = b; }
getUseBcw()1873   bool      getUseBcw             ()                                      const     { return m_bcw; }
setUseCiip(bool b)1874   void      setUseCiip            ( bool b )                                        { m_ciip = b; }
getUseCiip()1875   bool      getUseCiip            ()                                      const     { return m_ciip; }
setUseBIO(bool b)1876   void      setUseBIO(bool b)                                                       { m_BIO = b; }
getUseBIO()1877   bool      getUseBIO()                                                   const     { return m_BIO; }
1878 
setUseLMChroma(bool b)1879   void      setUseLMChroma        ( bool b )                                        { m_LMChroma = b; }
getUseLMChroma()1880   bool      getUseLMChroma        ()                                      const     { return m_LMChroma; }
setHorCollocatedChromaFlag(bool b)1881   void      setHorCollocatedChromaFlag( bool b )                                    { m_horCollocatedChromaFlag = b;    }
getHorCollocatedChromaFlag()1882   bool      getHorCollocatedChromaFlag()                                  const     { return m_horCollocatedChromaFlag; }
setVerCollocatedChromaFlag(bool b)1883   void      setVerCollocatedChromaFlag( bool b )                                    { m_verCollocatedChromaFlag = b;    }
getVerCollocatedChromaFlag()1884   bool      getVerCollocatedChromaFlag()                                  const     { return m_verCollocatedChromaFlag; }
getCclmCollocatedChromaFlag()1885   bool      getCclmCollocatedChromaFlag()                                 const     { return m_verCollocatedChromaFlag; }
setUseMTS(bool b)1886   void      setUseMTS             ( bool b )                                        { m_MTS = b; }
getUseMTS()1887   bool      getUseMTS             ()                                      const     { return m_MTS; }
getUseImplicitMTS()1888   bool      getUseImplicitMTS     ()                                      const     { return m_MTS && !m_IntraMTS; }
setUseIntraMTS(bool b)1889   void      setUseIntraMTS        ( bool b )                                        { m_IntraMTS = b; }
getUseIntraMTS()1890   bool      getUseIntraMTS        ()                                      const     { return m_IntraMTS; }
setUseInterMTS(bool b)1891   void      setUseInterMTS        ( bool b )                                        { m_InterMTS = b; }
getUseInterMTS()1892   bool      getUseInterMTS        ()                                      const     { return m_InterMTS; }
setUseLFNST(bool b)1893   void      setUseLFNST           ( bool b )                                        { m_LFNST = b; }
getUseLFNST()1894   bool      getUseLFNST           ()                                      const     { return m_LFNST; }
setUseSMVD(bool b)1895   void      setUseSMVD(bool b)                                                      { m_SMVD = b; }
getUseSMVD()1896   bool      getUseSMVD()                                                  const     { return m_SMVD; }
1897 #if LUMA_ADAPTIVE_DEBLOCKING_FILTER_QP_OFFSET
setLadfEnabled(bool b)1898   void      setLadfEnabled        ( bool b )                                        { m_LadfEnabled = b; }
getLadfEnabled()1899   bool      getLadfEnabled        ()                                      const     { return m_LadfEnabled; }
setLadfNumIntervals(int i)1900   void      setLadfNumIntervals   ( int i )                                         { m_LadfNumIntervals = i; }
getLadfNumIntervals()1901   int       getLadfNumIntervals   ()                                      const     { return m_LadfNumIntervals; }
setLadfQpOffset(int value,int idx)1902   void      setLadfQpOffset       ( int value, int idx )                            { m_LadfQpOffset[ idx ] = value; }
getLadfQpOffset(int idx)1903   int       getLadfQpOffset       ( int idx )                             const     { return m_LadfQpOffset[ idx ]; }
setLadfIntervalLowerBound(int value,int idx)1904   void      setLadfIntervalLowerBound( int value, int idx )                         { m_LadfIntervalLowerBound[ idx ] = value; }
getLadfIntervalLowerBound(int idx)1905   int       getLadfIntervalLowerBound( int idx )                          const     { return m_LadfIntervalLowerBound[ idx ]; }
1906 #endif
setUseMRL(bool b)1907   void      setUseMRL             ( bool b )                                        { m_MRL = b; }
getUseMRL()1908   bool      getUseMRL             ()                                      const     { return m_MRL; }
setUseGeo(bool b)1909   void      setUseGeo             ( bool b )                                        { m_Geo = b; }
getUseGeo()1910   bool      getUseGeo             ()                                      const     { return m_Geo; }
setUseMIP(bool b)1911   void      setUseMIP             ( bool b )                                        { m_MIP = b; }
getUseMIP()1912   bool      getUseMIP             ()                                      const     { return m_MIP; }
1913 
getUseWP()1914   bool      getUseWP              ()                                      const     { return m_useWeightPred; }
getUseWPBiPred()1915   bool      getUseWPBiPred        ()                                      const     { return m_useWeightedBiPred; }
setUseWP(bool b)1916   void      setUseWP              ( bool b )                                        { m_useWeightPred = b; }
setUseWPBiPred(bool b)1917   void      setUseWPBiPred        ( bool b )                                        { m_useWeightedBiPred = b; }
setChromaQpMappingTableFromParams(const ChromaQpMappingTableParams & params,const int qpBdOffset)1918   void      setChromaQpMappingTableFromParams(const ChromaQpMappingTableParams &params, const int qpBdOffset)   { m_chromaQpMappingTable.setParams(params, qpBdOffset); }
derivedChromaQPMappingTables()1919   void      derivedChromaQPMappingTables()                                          { m_chromaQpMappingTable.derivedChromaQPMappingTables(); }
getChromaQpMappingTable()1920   const ChromaQpMappingTable& getChromaQpMappingTable()                   const     { return m_chromaQpMappingTable;}
getMappedChromaQpValue(ComponentID compID,int qpVal)1921   int       getMappedChromaQpValue(ComponentID compID, int qpVal)         const     { return m_chromaQpMappingTable.getMappedChromaQpValue(compID, qpVal); }
setGDREnabledFlag(bool b)1922   void      setGDREnabledFlag     ( bool b )                                        { m_GDREnabledFlag = b;    }
getGDREnabledFlag()1923   bool      getGDREnabledFlag()                                           const     { return m_GDREnabledFlag; }
setSubLayerParametersPresentFlag(bool flag)1924   void      setSubLayerParametersPresentFlag(bool flag)                             { m_SubLayerCbpParametersPresentFlag = flag; }
getSubLayerParametersPresentFlag()1925   bool      getSubLayerParametersPresentFlag()                            const     { return m_SubLayerCbpParametersPresentFlag;  }
getRprEnabledFlag()1926   bool      getRprEnabledFlag()                                           const     { return m_rprEnabledFlag; }
setRprEnabledFlag(bool flag)1927   void      setRprEnabledFlag( bool flag )                                          { m_rprEnabledFlag = flag; }
getInterLayerPresentFlag()1928   bool      getInterLayerPresentFlag()                                    const     { return m_interLayerPresentFlag; }
setInterLayerPresentFlag(bool b)1929   void      setInterLayerPresentFlag( bool b )                                      { m_interLayerPresentFlag = b; }
getResChangeInClvsEnabledFlag()1930   bool      getResChangeInClvsEnabledFlag()                               const     { return m_resChangeInClvsEnabledFlag; }
setResChangeInClvsEnabledFlag(bool flag)1931   void      setResChangeInClvsEnabledFlag(bool flag)                                { m_resChangeInClvsEnabledFlag = flag; }
1932 
getLog2ParallelMergeLevelMinus2()1933   uint32_t  getLog2ParallelMergeLevelMinus2() const { return m_log2ParallelMergeLevelMinus2; }
setLog2ParallelMergeLevelMinus2(uint32_t mrgLevel)1934   void      setLog2ParallelMergeLevelMinus2(uint32_t mrgLevel) { m_log2ParallelMergeLevelMinus2 = mrgLevel; }
setPPSValidFlag(int i,bool b)1935   void          setPPSValidFlag(int i, bool b) { m_ppsValidFlag[i] = b; }
getPPSValidFlag(int i)1936   bool          getPPSValidFlag(int i)         { return m_ppsValidFlag[i]; }
setScalingWindowSizeInPPS(int i,int scWidth,int scHeight)1937   void          setScalingWindowSizeInPPS(int i, int scWidth, int scHeight) { m_scalingWindowSizeInPPS[i].width = scWidth; m_scalingWindowSizeInPPS[i].height = scHeight;}
getScalingWindowSizeInPPS(int i)1938   const Size&   getScalingWindowSizeInPPS(int i)                            { return m_scalingWindowSizeInPPS[i]; }
setScalingMatrixForAlternativeColourSpaceDisabledFlag(bool b)1939   void      setScalingMatrixForAlternativeColourSpaceDisabledFlag(bool b)           { m_scalingMatrixAlternativeColourSpaceDisabledFlag = b; }
getScalingMatrixForAlternativeColourSpaceDisabledFlag()1940   bool      getScalingMatrixForAlternativeColourSpaceDisabledFlag()           const { return m_scalingMatrixAlternativeColourSpaceDisabledFlag; }
setScalingMatrixDesignatedColourSpaceFlag(bool b)1941   void      setScalingMatrixDesignatedColourSpaceFlag(bool b)                       { m_scalingMatrixDesignatedColourSpaceFlag = b; }
getScalingMatrixDesignatedColourSpaceFlag()1942   bool      getScalingMatrixDesignatedColourSpaceFlag()                       const { return m_scalingMatrixDesignatedColourSpaceFlag; }
getDisableScalingMatrixForLfnstBlks()1943   bool       getDisableScalingMatrixForLfnstBlks()                            const { return m_disableScalingMatrixForLfnstBlks; }
setDisableScalingMatrixForLfnstBlks(bool flag)1944   void       setDisableScalingMatrixForLfnstBlks(bool flag)                         { m_disableScalingMatrixForLfnstBlks = flag; }
1945 };
1946 
1947 
1948 /// Reference Picture Lists class
1949 
1950 struct CodingUnit;
1951 
1952 /// PPS class
1953 class PPS : public BasePS<PPS>
1954 {
1955 private:
1956   int              m_PPSId                             = 0;       // pic_parameter_set_id
1957   int              m_SPSId                             = 0;       // seq_parameter_set_id
1958   int              m_layerId                           = 0;
1959   int              m_picInitQPMinus26                  = 0;
1960   bool             m_useDQP                            = false;
1961   bool             m_usePPSChromaTool                  = false;
1962   bool             m_bConstrainedIntraPred             = false;   // constrained_intra_pred_flag
1963   bool             m_bSliceChromaQpFlag                = false;   // slicelevel_chroma_qp_flag
1964 
1965   // access channel
1966 
1967   int              m_chromaCbQpOffset                  = 0;
1968   int              m_chromaCrQpOffset                  = 0;
1969   bool             m_chromaJointCbCrQpOffsetPresentFlag = false;
1970   int              m_chromaCbCrQpOffset                = 0;
1971 
1972   // Chroma QP Adjustments
1973   int              m_chromaQpOffsetListLen; // size (excludes the null entry used in the following array).
1974   ChromaQpAdj      m_ChromaQpAdjTableIncludingNullEntry[1+MAX_QP_OFFSET_LIST_SIZE]; //!< Array includes entry [0] for the null offset used when cu_chroma_qp_offset_flag=0, and entries [cu_chroma_qp_offset_idx+1...] otherwise
1975 
1976   uint32_t         m_numRefIdxL0DefaultActive          = 1;
1977   uint32_t         m_numRefIdxL1DefaultActive          = 1;
1978 
1979   bool             m_rpl1IdxPresentFlag                = false;
1980 
1981   bool             m_bUseWeightPred                    = false;   //!< Use of Weighting Prediction (P_SLICE)
1982   bool             m_useWeightedBiPred                 = false;   //!< Use of Weighting Bi-Prediction (B_SLICE)
1983   bool             m_OutputFlagPresentFlag             = false;   //!< Indicates the presence of output_flag in slice header
1984   uint8_t          m_numSubPics                        = 1;                        //!< number of sub-pictures used - must match SPS
1985   bool             m_subPicIdMappingInPpsFlag          = false;
1986   uint32_t         m_subPicIdLen                       = 0;                       //!< sub-picture ID length in bits
1987   uint16_t         m_subPicId[MAX_NUM_SUB_PICS];        //!< sub-picture ID for each sub-picture in the sequence
1988   bool             m_noPicPartitionFlag                = false;                //!< no picture partitioning flag - single slice, single tile
1989   uint8_t          m_log2CtuSize                       = 0;                       //!< log2 of the CTU size - required to match corresponding value in SPS
1990   uint8_t          m_ctuSize                           = 0;                           //!< CTU size
1991   uint32_t         m_picWidthInCtu                     = 0;                     //!< picture width in units of CTUs
1992   uint32_t         m_picHeightInCtu                    = 0;                    //!< picture height in units of CTUs
1993   uint32_t         m_numExpTileCols                    = 0;                    //!< number of explicitly specified tile columns
1994   uint32_t         m_numExpTileRows                    = 0;                    //!< number of explicitly specified tile rows
1995   uint32_t         m_numTileCols                       = 0;                       //!< number of tile columns
1996   uint32_t         m_numTileRows                       = 0;                       //!< number of tile rows
1997   std::vector<int> m_tileColumnWidth;
1998   std::vector<int> m_tileRowHeight;
1999 
2000   bool                          m_rectSliceFlag             = true;
2001   bool                          m_singleSlicePerSubPicFlag  = false;          //!< single slice per sub-picture flag
2002   uint32_t                      m_numSlicesInPic            = 1;                    //!< number of rectangular slices in the picture (raster-scan slice specified at slice level)
2003   bool                          m_tileIdxDeltaPresentFlag   = false;           //!< tile index delta present flag
2004   std::vector<uint32_t>         m_tileColBd;                    //!< tile column left-boundaries in units of CTUs
2005   std::vector<uint32_t>         m_tileRowBd;                    //!< tile row top-boundaries in units of CTUs
2006   std::vector<uint32_t>         m_ctuToTileCol;                 //!< mapping between CTU horizontal address and tile column index
2007   std::vector<uint32_t>         m_ctuToTileRow;                 //!< mapping between CTU vertical address and tile row index
2008   std::vector<RectSlice>        m_rectSlices;                  //!< list of rectangular slice signalling parameters
2009   std::vector<SliceMap>         m_sliceMap;                    //!< list of CTU maps for each slice in the picture
2010   std::vector<SubPic>           m_subPics;                   //!< list of subpictures in the picture
2011 
2012   bool             m_cabacInitPresentFlag                = false;
2013 
2014   bool             m_pictureHeaderExtensionPresentFlag   = false;   //< picture header extension flags present in picture headers or not
2015   bool             m_sliceHeaderExtensionPresentFlag     = false;
2016   bool             m_loopFilterAcrossTilesEnabledFlag    = false;  //!< loop filtering applied across tiles flag
2017   bool             m_loopFilterAcrossSlicesEnabledFlag   = false;
2018   bool             m_deblockingFilterControlPresentFlag  = false;
2019   bool             m_deblockingFilterOverrideEnabledFlag = false;
2020   bool             m_ppsDeblockingFilterDisabledFlag     = false;
2021   int              m_deblockingFilterBetaOffsetDiv2      = 0;   //< beta offset for deblocking filter
2022   int              m_deblockingFilterTcOffsetDiv2        = 0;   //< tc offset for deblocking filter
2023   int              m_deblockingFilterCbBetaOffsetDiv2    = 0;    //< beta offset for Cb deblocking filter
2024   int              m_deblockingFilterCbTcOffsetDiv2      = 0;      //< tc offset for Cb deblocking filter
2025   int              m_deblockingFilterCrBetaOffsetDiv2    = 0;    //< beta offset for Cr deblocking filter
2026   int              m_deblockingFilterCrTcOffsetDiv2      = 0;      //< tc offset for Cr deblocking filter
2027   bool             m_listsModificationPresentFlag        = false;
2028   int              m_numExtraSliceHeaderBits             = 0;
2029 
2030   bool             m_rplInfoInPhFlag                     = false;
2031   bool             m_dbfInfoInPhFlag                     = false;
2032   bool             m_saoInfoInPhFlag                     = false;
2033   bool             m_alfInfoInPhFlag                     = false;
2034   bool             m_wpInfoInPhFlag                      = false;
2035   bool             m_qpDeltaInfoInPhFlag                 = false;
2036   bool             m_mixedNaluTypesInPicFlag             = false;
2037   bool             m_partitioningInitialized             = false;
2038 
2039   bool             m_scalingListPresentFlag              = false;;
2040   ScalingList      m_scalingList;                       //!< ScalingList class
2041   uint32_t         m_picWidthInLumaSamples;
2042   uint32_t         m_picHeightInLumaSamples;
2043   bool             m_conformanceWindowPresentFlag        = false;
2044   Window           m_conformanceWindow;
2045   Window           m_scalingWindow;
2046 
2047   bool             m_useWrapAround                       = false;               //< reference wrap around enabled or not
2048   unsigned         m_picWidthMinusWrapAroundOffset       = 0;          // <pic_width_in_minCbSizeY - wraparound_offset_in_minCbSizeY
2049   unsigned         m_wrapAroundOffset                    = 0;                    //< reference wrap around offset in luma samples
2050 
2051 public:
2052   std::unique_ptr<PreCalcValues> pcv;
2053 
2054   PPS()  = default;
2055   ~PPS() = default;
2056 
getPPSId()2057   int                    getPPSId() const                                                 { return m_PPSId;                               }
setPPSId(int i)2058   void                   setPPSId(int i)                                                  { m_PPSId = i;                                  }
getSPSId()2059   int                    getSPSId() const                                                 { return m_SPSId;                               }
setSPSId(int i)2060   void                   setSPSId(int i)                                                  { m_SPSId = i;                                  }
setLayerId(int i)2061   void                   setLayerId( int i )                                              { m_layerId = i;                                }
getLayerId()2062   int                    getLayerId()                                               const { return m_layerId;                             }
getPicInitQPMinus26()2063   int                    getPicInitQPMinus26() const                                      { return  m_picInitQPMinus26;                   }
setPicInitQPMinus26(int i)2064   void                   setPicInitQPMinus26( int i )                                     { m_picInitQPMinus26 = i;                       }
getUseDQP()2065   bool                   getUseDQP() const                                                { return m_useDQP;                              }
setUseDQP(bool b)2066   void                   setUseDQP( bool b )                                              { m_useDQP   = b;                               }
getPPSChromaToolFlag()2067   bool                   getPPSChromaToolFlag()                                     const { return  m_usePPSChromaTool;                   }
setPPSChromaToolFlag(bool b)2068   void                   setPPSChromaToolFlag(bool b)                                     { m_usePPSChromaTool = b;                       }
getConstrainedIntraPred()2069   bool                   getConstrainedIntraPred() const                                  { return  m_bConstrainedIntraPred;              }
setConstrainedIntraPred(bool b)2070   void                   setConstrainedIntraPred( bool b )                                { m_bConstrainedIntraPred = b;                  }
getSliceChromaQpFlag()2071   bool                   getSliceChromaQpFlag() const                                     { return  m_bSliceChromaQpFlag;                 }
setSliceChromaQpFlag(bool b)2072   void                   setSliceChromaQpFlag( bool b )                                   { m_bSliceChromaQpFlag = b;                     }
2073 
2074 
getJointCbCrQpOffsetPresentFlag()2075   bool                   getJointCbCrQpOffsetPresentFlag() const                          { return m_chromaJointCbCrQpOffsetPresentFlag;   }
setJointCbCrQpOffsetPresentFlag(bool b)2076   void                   setJointCbCrQpOffsetPresentFlag(bool b)                          { m_chromaJointCbCrQpOffsetPresentFlag = b;      }
2077 
setQpOffset(ComponentID compID,int i)2078   void                   setQpOffset(ComponentID compID, int i )
2079   {
2080     if      (compID==COMPONENT_Cb)
2081     {
2082       m_chromaCbQpOffset = i;
2083     }
2084     else if (compID==COMPONENT_Cr)
2085     {
2086       m_chromaCrQpOffset = i;
2087     }
2088     else if (compID==JOINT_CbCr)
2089     {
2090       m_chromaCbCrQpOffset = i;
2091     }
2092     else
2093     {
2094       THROW( "Invalid chroma QP offset" );
2095     }
2096   }
getQpOffset(ComponentID compID)2097   int                    getQpOffset(ComponentID compID) const
2098   {
2099     return (compID==COMPONENT_Y) ? 0 : (compID==COMPONENT_Cb ? m_chromaCbQpOffset : compID==COMPONENT_Cr ? m_chromaCrQpOffset : m_chromaCbCrQpOffset );
2100   }
2101 
getCuChromaQpOffsetEnabledFlag()2102   bool                   getCuChromaQpOffsetEnabledFlag() const                           { return getChromaQpOffsetListLen()>0;            }
getChromaQpOffsetListLen()2103   int                    getChromaQpOffsetListLen() const                                 { return m_chromaQpOffsetListLen;                 }
clearChromaQpOffsetList()2104   void                   clearChromaQpOffsetList()                                        { m_chromaQpOffsetListLen = 0;                    }
2105 
getChromaQpOffsetListEntry(int cuChromaQpOffsetIdxPlus1)2106   const ChromaQpAdj&     getChromaQpOffsetListEntry( int cuChromaQpOffsetIdxPlus1 ) const
2107   {
2108     CHECK(cuChromaQpOffsetIdxPlus1 >= m_chromaQpOffsetListLen+1, "Invalid chroma QP offset");
2109     return m_ChromaQpAdjTableIncludingNullEntry[cuChromaQpOffsetIdxPlus1]; // Array includes entry [0] for the null offset used when cu_chroma_qp_offset_flag=0, and entries [cu_chroma_qp_offset_idx+1...] otherwise
2110   }
2111 
setChromaQpOffsetListEntry(int cuChromaQpOffsetIdxPlus1,int cbOffset,int crOffset,int jointCbCrOffset)2112   void                   setChromaQpOffsetListEntry( int cuChromaQpOffsetIdxPlus1, int cbOffset, int crOffset, int jointCbCrOffset )
2113   {
2114     CHECK(cuChromaQpOffsetIdxPlus1 == 0 || cuChromaQpOffsetIdxPlus1 > MAX_QP_OFFSET_LIST_SIZE, "Invalid chroma QP offset");
2115     m_ChromaQpAdjTableIncludingNullEntry[cuChromaQpOffsetIdxPlus1].u.comp.CbOffset = cbOffset; // Array includes entry [0] for the null offset used when cu_chroma_qp_offset_flag=0, and entries [cu_chroma_qp_offset_idx+1...] otherwise
2116     m_ChromaQpAdjTableIncludingNullEntry[cuChromaQpOffsetIdxPlus1].u.comp.CrOffset = crOffset;
2117     m_ChromaQpAdjTableIncludingNullEntry[cuChromaQpOffsetIdxPlus1].u.comp.JointCbCrOffset = jointCbCrOffset;
2118     m_chromaQpOffsetListLen = std::max(m_chromaQpOffsetListLen, cuChromaQpOffsetIdxPlus1);
2119   }
2120 
setNumRefIdxL0DefaultActive(uint32_t ui)2121   void                   setNumRefIdxL0DefaultActive(uint32_t ui)                         { m_numRefIdxL0DefaultActive=ui;                }
getNumRefIdxL0DefaultActive()2122   uint32_t               getNumRefIdxL0DefaultActive() const                              { return m_numRefIdxL0DefaultActive;            }
setNumRefIdxL1DefaultActive(uint32_t ui)2123   void                   setNumRefIdxL1DefaultActive(uint32_t ui)                         { m_numRefIdxL1DefaultActive=ui;                }
getNumRefIdxL1DefaultActive()2124   uint32_t               getNumRefIdxL1DefaultActive() const                              { return m_numRefIdxL1DefaultActive;            }
2125 
setRpl1IdxPresentFlag(bool isPresent)2126   void                   setRpl1IdxPresentFlag(bool isPresent)                            { m_rpl1IdxPresentFlag = isPresent;             }
getRpl1IdxPresentFlag()2127   uint32_t               getRpl1IdxPresentFlag() const                                    { return m_rpl1IdxPresentFlag;                  }
2128 
getUseWP()2129   bool                   getUseWP() const                                                 { return m_bUseWeightPred;                      }
getWPBiPred()2130   bool                   getWPBiPred() const                                              { return m_useWeightedBiPred;                   }
setUseWP(bool b)2131   void                   setUseWP( bool b )                                               { m_bUseWeightPred = b;                         }
setWPBiPred(bool b)2132   void                   setWPBiPred( bool b )                                            { m_useWeightedBiPred = b;                      }
2133 
setUseWrapAround(bool b)2134   void                   setUseWrapAround(bool b)                                         { m_useWrapAround = b;                          }
getUseWrapAround()2135   bool                   getUseWrapAround() const                                         { return m_useWrapAround;                       }
setPicWidthMinusWrapAroundOffset(unsigned offset)2136   void                   setPicWidthMinusWrapAroundOffset(unsigned offset)                { m_picWidthMinusWrapAroundOffset = offset;     }
getPicWidthMinusWrapAroundOffset()2137   unsigned               getPicWidthMinusWrapAroundOffset() const                         { return m_picWidthMinusWrapAroundOffset;       }
setWrapAroundOffset(unsigned offset)2138   void                   setWrapAroundOffset(unsigned offset)                             { m_wrapAroundOffset = offset;                  }
getWrapAroundOffset()2139   unsigned               getWrapAroundOffset() const                                      { return m_wrapAroundOffset;                    }
setOutputFlagPresentFlag(bool b)2140   void                   setOutputFlagPresentFlag( bool b )                               { m_OutputFlagPresentFlag = b;                  }
getOutputFlagPresentFlag()2141   bool                   getOutputFlagPresentFlag() const                                 { return m_OutputFlagPresentFlag;               }
setNumSubPics(uint8_t u)2142   void                   setNumSubPics( uint8_t u )                                       { m_numSubPics = u;                             }
getNumSubPics()2143   uint8_t                getNumSubPics( ) const                                           { return  m_numSubPics;                         }
setSubPicIdMappingInPpsFlag(bool b)2144   void                   setSubPicIdMappingInPpsFlag( bool b )                            { m_subPicIdMappingInPpsFlag = b;               }
getSubPicIdMappingInPpsFlag()2145   bool                   getSubPicIdMappingInPpsFlag() const                              { return m_subPicIdMappingInPpsFlag;            }
setSubPicIdLen(uint32_t u)2146   void                   setSubPicIdLen( uint32_t u )                                     { CHECK( u > 16, "Sub-picture id len exceeds valid range" ); m_subPicIdLen = u;                   }
getSubPicIdLen()2147   uint32_t               getSubPicIdLen() const                                           { return  m_subPicIdLen;                                                                          }
setSubPicId(int i,uint16_t u)2148   void                   setSubPicId( int i, uint16_t u )                                 { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); m_subPicId[i] = u;     }
getSubPicId(int i)2149   uint16_t               getSubPicId( int i ) const                                       { CHECK( i >= MAX_NUM_SUB_PICS, "Sub-picture index exceeds valid range" ); return  m_subPicId[i]; }
2150   uint32_t               getSubPicIdxFromSubPicId( uint32_t subPicId ) const;
setNoPicPartitionFlag(bool b)2151   void                   setNoPicPartitionFlag( bool b )                                  { m_noPicPartitionFlag = b;                     }
getNoPicPartitionFlag()2152   bool                   getNoPicPartitionFlag( ) const                                   { return  m_noPicPartitionFlag;                 }
setLog2CtuSize(uint8_t u)2153   void                   setLog2CtuSize( uint8_t u )                                      { m_log2CtuSize = u; m_ctuSize = 1 << m_log2CtuSize;
2154                                                                                             m_picWidthInCtu = (m_picWidthInLumaSamples  + m_ctuSize - 1) / m_ctuSize;
2155                                                                                             m_picHeightInCtu = (m_picHeightInLumaSamples  + m_ctuSize - 1) / m_ctuSize; }
getLog2CtuSize()2156   uint8_t                getLog2CtuSize( ) const                                          { return  m_log2CtuSize;                        }
getCtuSize()2157   uint8_t                getCtuSize( ) const                                              { return  m_ctuSize;                            }
getPicWidthInCtu()2158   uint8_t                getPicWidthInCtu( ) const                                        { return  m_picWidthInCtu;                      }
getPicHeightInCtu()2159   uint8_t                getPicHeightInCtu( ) const                                       { return  m_picHeightInCtu;                     }
setNumExpTileColumns(uint32_t u)2160   void                   setNumExpTileColumns( uint32_t u )                               { m_numExpTileCols = u;                         }
getNumExpTileColumns()2161   uint32_t               getNumExpTileColumns( ) const                                    { return  m_numExpTileCols;                     }
setNumExpTileRows(uint32_t u)2162   void                   setNumExpTileRows( uint32_t u )                                  { m_numExpTileRows = u;                         }
getNumExpTileRows()2163   uint32_t               getNumExpTileRows( ) const                                       { return  m_numExpTileRows;                     }
setNumTileColumns(uint32_t u)2164   void                   setNumTileColumns( uint32_t u )                                  { m_numTileCols = u;                            }
getNumTileColumns()2165   uint32_t               getNumTileColumns( ) const                                       { return  m_numTileCols;                        }
setNumTileRows(uint32_t u)2166   void                   setNumTileRows( uint32_t u )                                     { m_numTileRows = u;                            }
getNumTileRows()2167   uint32_t               getNumTileRows( ) const                                          { return  m_numTileRows;                        }
addTileColumnWidth(uint32_t u)2168   void                   addTileColumnWidth( uint32_t u )                                 { CHECK( m_tileColumnWidth.size()  >= MAX_TILE_COLS, "Number of tile columns exceeds valid range" ); m_tileColumnWidth.push_back(u);    }
addTileRowHeight(uint32_t u)2169   void                   addTileRowHeight( uint32_t u )                                   { m_tileRowHeight.push_back(u);   }
2170 
setTileColumnWidth(const std::vector<int> & columnWidth)2171   void                   setTileColumnWidth(const std::vector<int>& columnWidth )         { m_tileColumnWidth = columnWidth;              }
getTileColumnWidth(uint32_t columnIdx)2172   uint32_t               getTileColumnWidth(uint32_t columnIdx) const                     { return  m_tileColumnWidth[columnIdx];         }
setTileRowHeight(const std::vector<int> & rowHeight)2173   void                   setTileRowHeight(const std::vector<int>& rowHeight)              { m_tileRowHeight = rowHeight;                  }
getTileRowHeight(uint32_t rowIdx)2174   uint32_t               getTileRowHeight(uint32_t rowIdx) const                          { return m_tileRowHeight[rowIdx];               }
getNumTiles()2175   uint32_t               getNumTiles() const                                              { return m_numTileCols * m_numTileRows;        }
ctuToTileCol(int ctuX)2176   uint32_t               ctuToTileCol( int ctuX ) const                                   { CHECK( ctuX >= m_ctuToTileCol.size(), "CTU address index exceeds valid range" ); return  m_ctuToTileCol[ctuX];                  }
ctuToTileRow(int ctuY)2177   uint32_t               ctuToTileRow( int ctuY ) const                                   { CHECK( ctuY >= m_ctuToTileRow.size(), "CTU address index exceeds valid range" ); return  m_ctuToTileRow[ctuY];                  }
ctuToTileColBd(int ctuX)2178   uint32_t               ctuToTileColBd( int ctuX ) const                                 { return  getTileColumnBd(ctuToTileCol( ctuX ));                                                                                  }
ctuToTileRowBd(int ctuY)2179   uint32_t               ctuToTileRowBd( int ctuY ) const                                 { return  getTileRowBd(ctuToTileRow( ctuY ));                                                                                     }
ctuIsTileColBd(int ctuX)2180   bool                   ctuIsTileColBd( int ctuX ) const                                 { return  ctuX == ctuToTileColBd( ctuX );                                                                                         }
ctuIsTileRowBd(int ctuY)2181   bool                   ctuIsTileRowBd( int ctuY ) const                                 { return  ctuY == ctuToTileRowBd( ctuY );                                                                                         }
getTileIdx(uint32_t ctuX,uint32_t ctuY)2182   uint32_t               getTileIdx( uint32_t ctuX, uint32_t ctuY ) const                 { return (ctuToTileRow( ctuY ) * getNumTileColumns()) + ctuToTileCol( ctuX );                                                     }
getTileIdx(uint32_t ctuRsAddr)2183   uint32_t               getTileIdx( uint32_t ctuRsAddr) const                            { return getTileIdx( ctuRsAddr % m_picWidthInCtu,  ctuRsAddr / m_picWidthInCtu );                                                 }
getTileIdx(const Position & pos)2184   uint32_t               getTileIdx( const Position& pos ) const                          { return getTileIdx( pos.x / m_ctuSize, pos.y / m_ctuSize );                                                                      }
getRectSliceFlag()2185   bool                   getRectSliceFlag() const                                         { return m_rectSliceFlag;                       }
setRectSliceFlag(bool val)2186   void                   setRectSliceFlag(bool val)                                       { m_rectSliceFlag = val;                        }
setSingleSlicePerSubPicFlag(bool b)2187   void                   setSingleSlicePerSubPicFlag( bool b )                            { m_singleSlicePerSubPicFlag = b;                                                                                                 }
getSingleSlicePerSubPicFlag()2188   bool                   getSingleSlicePerSubPicFlag( ) const                             { return  m_singleSlicePerSubPicFlag;                                                                                             }
setNumSlicesInPic(uint32_t u)2189   void                   setNumSlicesInPic( uint32_t u )                                  { CHECK( u > MAX_SLICES, "Number of slices in picture exceeds valid range" ); m_numSlicesInPic = u;                               }
getNumSlicesInPic()2190   uint32_t               getNumSlicesInPic( ) const                                       { return  m_numSlicesInPic;                                                                                                       }
setTileIdxDeltaPresentFlag(bool b)2191   void                   setTileIdxDeltaPresentFlag( bool b )                             { m_tileIdxDeltaPresentFlag = b;                                                                                                  }
getTileIdxDeltaPresentFlag()2192   bool                   getTileIdxDeltaPresentFlag( ) const                              { return  m_tileIdxDeltaPresentFlag;                                                                                              }
getTileColumnBd(int idx)2193   uint32_t               getTileColumnBd( int idx ) const                                 { CHECK( idx >= m_tileColBd.size(), "Tile column index exceeds valid range" );                    return  m_tileColBd[idx];       }
getTileRowBd(int idx)2194   uint32_t               getTileRowBd( int idx ) const                                    { CHECK( idx >= m_tileRowBd.size(), "Tile row index exceeds valid range" );                       return  m_tileRowBd[idx];       }
setSliceWidthInTiles(int idx,uint32_t u)2195   void                   setSliceWidthInTiles( int idx, uint32_t u )                      { CHECK( idx >= m_numSlicesInPic, "Slice index exceeds valid range" );    m_rectSlices[idx].setSliceWidthInTiles( u );            }
getSliceWidthInTiles(int idx)2196   uint32_t               getSliceWidthInTiles( int idx ) const                            { CHECK( idx >= m_numSlicesInPic, "Slice index exceeds valid range" );    return  m_rectSlices[idx].getSliceWidthInTiles( );      }
setSliceHeightInTiles(int idx,uint32_t u)2197   void                   setSliceHeightInTiles( int idx, uint32_t u )                     { CHECK( idx >= m_numSlicesInPic, "Slice index exceeds valid range" );    m_rectSlices[idx].setSliceHeightInTiles( u );           }
getSliceHeightInTiles(int idx)2198   uint32_t               getSliceHeightInTiles( int idx ) const                           { CHECK( idx >= m_numSlicesInPic, "Slice index exceeds valid range" );    return  m_rectSlices[idx].getSliceHeightInTiles( );     }
setNumSlicesInTile(int idx,uint32_t u)2199   void                   setNumSlicesInTile( int idx, uint32_t u )                        { CHECK( idx >= m_numSlicesInPic, "Slice index exceeds valid range" );    m_rectSlices[idx].setNumSlicesInTile( u );              }
getNumSlicesInTile(int idx)2200   uint32_t               getNumSlicesInTile( int idx ) const                              { CHECK( idx >= m_numSlicesInPic, "Slice index exceeds valid range" );    return  m_rectSlices[idx].getNumSlicesInTile( );        }
setSliceHeightInCtu(int idx,uint32_t u)2201   void                   setSliceHeightInCtu( int idx, uint32_t u )                       { CHECK( idx >= m_numSlicesInPic, "Slice index exceeds valid range" );    m_rectSlices[idx].setSliceHeightInCtu( u );             }
getSliceHeightInCtu(int idx)2202   uint32_t               getSliceHeightInCtu( int idx ) const                             { CHECK( idx >= m_numSlicesInPic, "Slice index exceeds valid range" );    return  m_rectSlices[idx].getSliceHeightInCtu( );       }
setSliceTileIdx(int idx,uint32_t u)2203   void                   setSliceTileIdx(  int idx, uint32_t u )                          { CHECK( idx >= m_numSlicesInPic, "Slice index exceeds valid range" );    m_rectSlices[idx].setTileIdx( u );                      }
getSliceTileIdx(int idx)2204   uint32_t               getSliceTileIdx( int idx ) const                                 { CHECK( idx >= m_numSlicesInPic, "Slice index exceeds valid range" );    return  m_rectSlices[idx].getTileIdx( );                }
2205   void                   resetTileSliceInfo();
2206   void                   initTiles();
2207   void                   initRectSlices();
2208   void                   initRectSliceMap(const SPS *sps);
getSubPics()2209   std::vector<SubPic>    getSubPics()  const                                              { return m_subPics;      }
getSubPic(uint32_t idx)2210   const SubPic&          getSubPic(uint32_t idx) const                                    { return m_subPics[idx]; }
2211   void                   initSubPic(const SPS &sps);
2212   const SubPic&          getSubPicFromPos(const Position& pos)  const;
2213   const SubPic&          getSubPicFromCU (const CodingUnit& cu) const;
2214   void                   checkSliceMap();
2215 
getSliceMap(int idx)2216   SliceMap               getSliceMap( int idx ) const                                     { CHECK( idx >= m_numSlicesInPic, "Slice index exceeds valid range" );    return m_sliceMap[idx];                             }
2217 
setCabacInitPresentFlag(bool flag)2218   void                   setCabacInitPresentFlag( bool flag )                             { m_cabacInitPresentFlag = flag;                }
getCabacInitPresentFlag()2219   bool                   getCabacInitPresentFlag() const                                  { return m_cabacInitPresentFlag;                }
setDeblockingFilterControlPresentFlag(bool val)2220   void                   setDeblockingFilterControlPresentFlag( bool val )                { m_deblockingFilterControlPresentFlag = val;   }
getDeblockingFilterControlPresentFlag()2221   bool                   getDeblockingFilterControlPresentFlag() const                    { return m_deblockingFilterControlPresentFlag;  }
setDeblockingFilterOverrideEnabledFlag(bool val)2222   void                   setDeblockingFilterOverrideEnabledFlag( bool val )               { m_deblockingFilterOverrideEnabledFlag = val;  }
getDeblockingFilterOverrideEnabledFlag()2223   bool                   getDeblockingFilterOverrideEnabledFlag() const                   { return m_deblockingFilterOverrideEnabledFlag; }
setPPSDeblockingFilterDisabledFlag(bool val)2224   void                   setPPSDeblockingFilterDisabledFlag(bool val)                     { m_ppsDeblockingFilterDisabledFlag = val;      } //!< set offset for deblocking filter disabled
getPPSDeblockingFilterDisabledFlag()2225   bool                   getPPSDeblockingFilterDisabledFlag() const                       { return m_ppsDeblockingFilterDisabledFlag;     } //!< get offset for deblocking filter disabled
setDeblockingFilterBetaOffsetDiv2(int val)2226   void                   setDeblockingFilterBetaOffsetDiv2(int val)                       { m_deblockingFilterBetaOffsetDiv2 = val;       } //!< set beta offset for deblocking filter
getDeblockingFilterBetaOffsetDiv2()2227   int                    getDeblockingFilterBetaOffsetDiv2() const                        { return m_deblockingFilterBetaOffsetDiv2;      } //!< get beta offset for deblocking filter
setDeblockingFilterTcOffsetDiv2(int val)2228   void                   setDeblockingFilterTcOffsetDiv2(int val)                         { m_deblockingFilterTcOffsetDiv2 = val;         } //!< set tc offset for deblocking filter
getDeblockingFilterTcOffsetDiv2()2229   int                    getDeblockingFilterTcOffsetDiv2() const                          { return m_deblockingFilterTcOffsetDiv2;        } //!< get tc offset for deblocking filter
setDeblockingFilterCbBetaOffsetDiv2(int val)2230   void                   setDeblockingFilterCbBetaOffsetDiv2(int val)                     { m_deblockingFilterCbBetaOffsetDiv2 = val;     } //!< set beta offset for Cb deblocking filter
getDeblockingFilterCbBetaOffsetDiv2()2231   int                    getDeblockingFilterCbBetaOffsetDiv2() const                      { return m_deblockingFilterCbBetaOffsetDiv2;    } //!< get beta offset for Cb deblocking filter
setDeblockingFilterCbTcOffsetDiv2(int val)2232   void                   setDeblockingFilterCbTcOffsetDiv2(int val)                       { m_deblockingFilterCbTcOffsetDiv2 = val;       } //!< set tc offset for Cb deblocking filter
getDeblockingFilterCbTcOffsetDiv2()2233   int                    getDeblockingFilterCbTcOffsetDiv2() const                        { return m_deblockingFilterCbTcOffsetDiv2;      } //!< get tc offset for Cb deblocking filter
setDeblockingFilterCrBetaOffsetDiv2(int val)2234   void                   setDeblockingFilterCrBetaOffsetDiv2(int val)                     { m_deblockingFilterCrBetaOffsetDiv2 = val;     } //!< set beta offset for Cr deblocking filter
getDeblockingFilterCrBetaOffsetDiv2()2235   int                    getDeblockingFilterCrBetaOffsetDiv2() const                      { return m_deblockingFilterCrBetaOffsetDiv2;    } //!< get beta offset for Cr deblocking filter
setDeblockingFilterCrTcOffsetDiv2(int val)2236   void                   setDeblockingFilterCrTcOffsetDiv2(int val)                       { m_deblockingFilterCrTcOffsetDiv2 = val;       } //!< set tc offset for Cr deblocking filter
getDeblockingFilterCrTcOffsetDiv2()2237   int                    getDeblockingFilterCrTcOffsetDiv2() const                        { return m_deblockingFilterCrTcOffsetDiv2;      } //!< get tc offset for Cr deblocking filter
getListsModificationPresentFlag()2238   bool                   getListsModificationPresentFlag() const                          { return m_listsModificationPresentFlag;        }
setListsModificationPresentFlag(bool b)2239   void                   setListsModificationPresentFlag( bool b )                        { m_listsModificationPresentFlag = b;           }
getNumExtraSliceHeaderBits()2240   int                    getNumExtraSliceHeaderBits() const                               { return m_numExtraSliceHeaderBits;             }
setNumExtraSliceHeaderBits(int i)2241   void                   setNumExtraSliceHeaderBits(int i)                                { m_numExtraSliceHeaderBits = i;                }
setLoopFilterAcrossTilesEnabledFlag(bool b)2242   void                   setLoopFilterAcrossTilesEnabledFlag( bool b )                    { m_loopFilterAcrossTilesEnabledFlag = b;                                                                                         }
getLoopFilterAcrossTilesEnabledFlag()2243   bool                   getLoopFilterAcrossTilesEnabledFlag( ) const                     { return  m_loopFilterAcrossTilesEnabledFlag;                                                                                     }
setLoopFilterAcrossSlicesEnabledFlag(bool bValue)2244   void                   setLoopFilterAcrossSlicesEnabledFlag( bool bValue )              { m_loopFilterAcrossSlicesEnabledFlag = bValue; }
getLoopFilterAcrossSlicesEnabledFlag()2245   bool                   getLoopFilterAcrossSlicesEnabledFlag() const                     { return m_loopFilterAcrossSlicesEnabledFlag;   }
getPictureHeaderExtensionPresentFlag()2246   bool                   getPictureHeaderExtensionPresentFlag() const                     { return m_pictureHeaderExtensionPresentFlag;     }
setPictureHeaderExtensionPresentFlag(bool val)2247   void                   setPictureHeaderExtensionPresentFlag(bool val)                   { m_pictureHeaderExtensionPresentFlag = val;      }
getSliceHeaderExtensionPresentFlag()2248   bool                   getSliceHeaderExtensionPresentFlag() const                       { return m_sliceHeaderExtensionPresentFlag;     }
setSliceHeaderExtensionPresentFlag(bool val)2249   void                   setSliceHeaderExtensionPresentFlag(bool val)                     { m_sliceHeaderExtensionPresentFlag = val;      }
2250 
setRplInfoInPhFlag(bool flag)2251   void                   setRplInfoInPhFlag(bool flag)                                    { m_rplInfoInPhFlag = flag;                     }
getRplInfoInPhFlag()2252   bool                   getRplInfoInPhFlag() const                                       { return m_rplInfoInPhFlag;                     }
setDbfInfoInPhFlag(bool flag)2253   void                   setDbfInfoInPhFlag(bool flag)                                    { m_dbfInfoInPhFlag = flag;                     }
getDbfInfoInPhFlag()2254   bool                   getDbfInfoInPhFlag() const                                       { return m_dbfInfoInPhFlag;                     }
setSaoInfoInPhFlag(bool flag)2255   void                   setSaoInfoInPhFlag(bool flag)                                    { m_saoInfoInPhFlag = flag;                     }
getSaoInfoInPhFlag()2256   bool                   getSaoInfoInPhFlag() const                                       { return m_saoInfoInPhFlag;                     }
setAlfInfoInPhFlag(bool flag)2257   void                   setAlfInfoInPhFlag(bool flag)                                    { m_alfInfoInPhFlag = flag;                     }
getAlfInfoInPhFlag()2258   bool                   getAlfInfoInPhFlag() const                                       { return m_alfInfoInPhFlag;                     }
setWpInfoInPhFlag(bool flag)2259   void                   setWpInfoInPhFlag(bool flag)                                     { m_wpInfoInPhFlag = flag;                      }
getWpInfoInPhFlag()2260   bool                   getWpInfoInPhFlag() const                                        { return m_wpInfoInPhFlag;                      }
setQpDeltaInfoInPhFlag(bool flag)2261   void                   setQpDeltaInfoInPhFlag(bool flag)                                { m_qpDeltaInfoInPhFlag = flag;                 }
getQpDeltaInfoInPhFlag()2262   bool                   getQpDeltaInfoInPhFlag() const                                   { return m_qpDeltaInfoInPhFlag; }
2263 
getScalingListPresentFlag()2264   bool                   getScalingListPresentFlag() const                                { return m_scalingListPresentFlag;              }
setScalingListPresentFlag(bool b)2265   void                   setScalingListPresentFlag( bool b )                              { m_scalingListPresentFlag  = b;                }
getScalingList()2266   ScalingList&           getScalingList()                                                 { return m_scalingList;                         }
getScalingList()2267   const ScalingList&     getScalingList() const                                           { return m_scalingList;                         }
2268 
setPicWidthInLumaSamples(uint32_t u)2269   void                    setPicWidthInLumaSamples( uint32_t u )                          { m_picWidthInLumaSamples = u; }
getPicWidthInLumaSamples()2270   uint32_t                getPicWidthInLumaSamples() const                                { return  m_picWidthInLumaSamples; }
setPicHeightInLumaSamples(uint32_t u)2271   void                    setPicHeightInLumaSamples( uint32_t u )                         { m_picHeightInLumaSamples = u; }
getPicHeightInLumaSamples()2272   uint32_t                getPicHeightInLumaSamples() const                               { return  m_picHeightInLumaSamples; }
2273 
setConformanceWindowPresentFlag(bool b)2274   void                    setConformanceWindowPresentFlag(bool b)                         { m_conformanceWindowPresentFlag = b;           }
getConformanceWindowPresentFlag()2275   bool                    getConformanceWindowPresentFlag() const                         { return m_conformanceWindowPresentFlag;        }
getConformanceWindow()2276   Window&                 getConformanceWindow()                                          { return  m_conformanceWindow; }
getConformanceWindow()2277   const Window&           getConformanceWindow() const                                    { return  m_conformanceWindow; }
setConformanceWindow(Window & conformanceWindow)2278   void                    setConformanceWindow( Window& conformanceWindow )               { m_conformanceWindow = conformanceWindow; }
getScalingWindow()2279   Window&                 getScalingWindow()                                              { return  m_scalingWindow; }
getScalingWindow()2280   const Window&           getScalingWindow()                                        const { return  m_scalingWindow; }
setScalingWindow(Window & scalingWindow)2281   void                    setScalingWindow( Window& scalingWindow )                       { m_scalingWindow = scalingWindow; }
getMixedNaluTypesInPicFlag()2282   int                     getMixedNaluTypesInPicFlag() const                              { return m_mixedNaluTypesInPicFlag; }
setMixedNaluTypesInPicFlag(const bool flag)2283   void                    setMixedNaluTypesInPicFlag( const bool flag )                   { m_mixedNaluTypesInPicFlag = flag; }
2284   void                    finalizePPSPartitioning( const SPS* pcSPS );
checkPPSPartitioningFinalized()2285   void                    checkPPSPartitioningFinalized() const                           { CHECK( !m_partitioningInitialized, "PPS partitioning info has not been finalized!" ); }
2286 };
2287 
2288 class APS: public BasePS<APS>
2289 {
2290 private:
2291   int                    m_APSId   = 0;              // adaptation_parameter_set_id
2292   int                    m_APSType = 0;              // aps_params_type
2293   int                    m_layerId = 0;
2294   AlfSliceParam          m_alfAPSParam;
2295   CcAlfFilterParam       m_ccAlfAPSParam;
2296   SliceReshapeInfo       m_reshapeAPSInfo;
2297   ScalingList            m_scalingListApsInfo;
2298   bool                   m_hasPrefixNalUnitType = false;
2299 
2300 public:
2301   APS()  = default;
2302   ~APS() = default;
2303 
getAPSId()2304   int                    getAPSId() const                                                 { return m_APSId;                               }
setAPSId(int i)2305   void                   setAPSId(int i)                                                  { m_APSId = i;                                  }
2306 
getAPSType()2307   int                    getAPSType() const                                               { return m_APSType;                             }
setAPSType(int type)2308   void                   setAPSType(int type)                                             { m_APSType = type;                             }
2309 
setAlfAPSParam(AlfSliceParam & alfAPSParam)2310   void                   setAlfAPSParam(AlfSliceParam& alfAPSParam)                       { m_alfAPSParam = alfAPSParam;                  }
getAlfAPSParam()2311         AlfSliceParam&   getAlfAPSParam()                                                 { return m_alfAPSParam;                         }
getAlfAPSParam()2312   const AlfSliceParam&   getAlfAPSParam() const                                           { return m_alfAPSParam;                         }
setCcAlfAPSParam(CcAlfFilterParam & ccAlfAPSParam)2313   void                   setCcAlfAPSParam(CcAlfFilterParam& ccAlfAPSParam)                { m_ccAlfAPSParam = ccAlfAPSParam;              }
getCcAlfAPSParam()2314   CcAlfFilterParam&      getCcAlfAPSParam()                                               { return m_ccAlfAPSParam;                       }
getCcAlfAPSParam()2315   const CcAlfFilterParam& getCcAlfAPSParam() const                                        { return m_ccAlfAPSParam;                       }
2316 
setTemporalId(int i)2317   void                   setTemporalId(int i)                                             { m_alfAPSParam.tLayer = i;                     }
getTemporalId()2318   int                    getTemporalId()                                                  { return m_alfAPSParam.tLayer;                  }
setLayerId(int i)2319   void                   setLayerId( int i )                                              { m_layerId = i;                                }
getLayerId()2320   int                    getLayerId()                                               const { return m_layerId;                             }
setReshaperAPSInfo(SliceReshapeInfo & reshapeAPSInfo)2321   void                   setReshaperAPSInfo(SliceReshapeInfo& reshapeAPSInfo)             { m_reshapeAPSInfo = reshapeAPSInfo;            }
getReshaperAPSInfo()2322   SliceReshapeInfo&      getReshaperAPSInfo()                                             { return m_reshapeAPSInfo;                      }
setScalingList(ScalingList & scalingListAPSInfo)2323   void                   setScalingList( ScalingList& scalingListAPSInfo )                { m_scalingListApsInfo = scalingListAPSInfo;    }
getScalingList()2324   ScalingList&           getScalingList()                                                 { return m_scalingListApsInfo;                  }
setHasPrefixNalUnitType(bool b)2325   void                   setHasPrefixNalUnitType( bool b )                                { m_hasPrefixNalUnitType = b;                   }
getHasPrefixNalUnitType()2326   bool                   getHasPrefixNalUnitType() const                                  { return m_hasPrefixNalUnitType;                }
2327   bool chromaPresentFlag =false;
2328 };
2329 
2330 struct WPScalingParam
2331 {
2332   // Explicit weighted prediction parameters parsed in slice header,
2333   // or Implicit weighted prediction parameters (8 bits depth values).
2334   bool     bPresentFlag;
2335   uint32_t uiLog2WeightDenom;
2336   int      iWeight;
2337   int      iOffset;
2338 
2339   // Weighted prediction scaling values built from above parameters (bitdepth scaled):
2340   int  w;
2341   int  o;
2342   int  offset;
2343   int  shift;
2344   int  round;
2345 
2346 };
2347 struct WPACDCParam
2348 {
2349   int64_t iAC = 0;
2350   int64_t iDC = 0;
2351 };
2352 
2353 // picture header class
2354 class PicHeader
2355 {
2356 private:
2357   bool                        m_valid                                         = false;   //!< picture header is valid yet or not
2358   Picture*                    m_pcPic                                         = nullptr; //!< pointer to picture structure
2359   int                         m_pocLsb                                        = -1;      //!< least significant bits of picture order count
2360   bool                        m_nonReferencePictureFlag                       = false;   //!< non-reference picture flag
2361   bool                        m_gdrOrIrapPicFlag                              = false;   //!< gdr or irap picture flag
2362   bool                        m_pocMsbPresentFlag                             = false;  //!< ph_poc_msb_present_flag
2363   int                         m_pocMsbVal                                     = 0;      //!< poc_msb_val
2364   bool                        m_gdrPicFlag                                    = false;   //!< gradual decoding refresh picture flag
2365   bool                        m_handleCraAsCvsStartFlag                       = false;                                //!< HandleCraAsCvsStartFlag
2366   bool                        m_handleGdrAsCvsStartFlag                       = false;                                //!< HandleGdrAsCvsStartFlag
2367   uint32_t                    m_recoveryPocCnt                                = 0;       //!< recovery POC count
2368   bool                        m_noOutputBeforeRecoveryFlag                    = false;                             //!< NoOutputBeforeRecoveryFlag
2369   int                         m_spsId                                         = -1;      //!< sequence parameter set ID
2370   int                         m_ppsId                                         = -1;      //!< picture parameter set ID
2371   bool                        m_virtualBoundariesPresentFlag                  = false;   //!< disable loop filtering across virtual boundaries
2372   unsigned                    m_numVerVirtualBoundaries                       = 0;       //!< number of vertical virtual boundaries
2373   unsigned                    m_numHorVirtualBoundaries                       = 0;       //!< number of horizontal virtual boundaries
2374   unsigned                    m_virtualBoundariesPosX[3]                      = { 0, 0, 0 }; //!< horizontal virtual boundary positions
2375   unsigned                    m_virtualBoundariesPosY[3]                      = { 0, 0, 0 }; //!< vertical virtual boundary positions
2376   bool                        m_picOutputFlag                                 = true;    //!< picture output flag
2377   ReferencePictureList        m_RPL[2];                                                  //!< RPL for L0/L1 when present in picture header
2378   int                         m_RPLIdx[2]                                     = { 0, 0 };//!< index of used RPL L0/L1 in the SPS or -1 for local RPL in the picture header
2379   bool                        m_picInterSliceAllowedFlag                      = false;  //!< inter slice allowed flag in PH
2380   bool                        m_picIntraSliceAllowedFlag                      = false;  //!< intra slice allowed flag in PH
2381   bool                        m_splitConsOverrideFlag                         = false;  //!< partitioning constraint override flag
2382   uint32_t                    m_cuQpDeltaSubdivIntra                          = 0;      //!< CU QP delta maximum subdivision for intra slices
2383   uint32_t                    m_cuQpDeltaSubdivInter                          = 0;      //!< CU QP delta maximum subdivision for inter slices
2384   uint32_t                    m_cuChromaQpOffsetSubdivIntra                   = 0;      //!< CU chroma QP offset maximum subdivision for intra slices
2385   uint32_t                    m_cuChromaQpOffsetSubdivInter                   = 0;      //!< CU chroma QP offset maximum subdivision for inter slices
2386   bool                        m_enableTMVPFlag                                = true;   //!< enable temporal motion vector prediction
2387   bool                        m_picColFromL0Flag                              = true;   //!< syntax element collocated_from_l0_flag
2388   uint32_t                    m_colRefIdx                                     = 0;
2389   bool                        m_mvdL1ZeroFlag                                 = false;  //!< L1 MVD set to zero flag
2390   uint32_t                    m_maxNumAffineMergeCand                         = AFFINE_MRG_MAX_NUM_CANDS; //!< max number of sub-block merge candidates
2391   bool                        m_disFracMMVD                                   = false;  //!< fractional MMVD offsets disabled flag
2392   bool                        m_disBdofFlag                                   = false;  //!< picture level BDOF disable flag
2393   bool                        m_disDmvrFlag                                   = false;  //!< picture level DMVR disable flag
2394   bool                        m_disProfFlag                                   = false;  //!< picture level PROF disable flag
2395   uint32_t                    m_maxNumGeoCand                                 = 0;      //!< max number of geometric merge candidates
2396   uint32_t                    m_maxNumIBCMergeCand                            = IBC_MRG_MAX_NUM_CANDS; //!< max number of IBC merge candidates
2397   bool                        m_jointCbCrSignFlag                             = false;  //!< joint Cb/Cr residual sign flag
2398   int                         m_qpDelta                                       = 0;      //!< value of Qp delta
2399   bool                        m_saoEnabledFlag[MAX_NUM_CHANNEL_TYPE]          = { false, false }; //!< sao enabled flags for each channel
2400   bool                        m_alfEnabledFlag[MAX_NUM_COMPONENT]             = { false, false, false }; //!< alf enabled flags for each component
2401   int                         m_numAlfAps                                     = 0;      //!< number of alf aps active for the picture
2402   std::vector<int>            m_alfApsId;                                               //!< list of alf aps for the picture
2403   bool                        m_ccalfEnabledFlag[MAX_NUM_COMPONENT]           = { false, false, false };
2404   int                         m_ccalfCbApsId                                  = 0;
2405   int                         m_ccalfCrApsId                                  = 0;
2406   int                         m_alfChromaApsId                                = 0;      //!< chroma alf aps ID
2407   bool                        m_deblockingFilterOverrideFlag                  = false;  //!< deblocking filter override controls enabled
2408   bool                        m_deblockingFilterDisable                       = false;  //!< deblocking filter disabled flag
2409   int                         m_deblockingFilterBetaOffsetDiv2                = 0;      //!< beta offset for deblocking filter
2410   int                         m_deblockingFilterTcOffsetDiv2                  = 0;      //!< tc offset for deblocking filter
2411   int                         m_deblockingFilterCbBetaOffsetDiv2              = 0;                       //!< beta offset for deblocking filter
2412   int                         m_deblockingFilterCbTcOffsetDiv2                = 0;                         //!< tc offset for deblocking filter
2413   int                         m_deblockingFilterCrBetaOffsetDiv2              = 0;                       //!< beta offset for deblocking filter
2414   int                         m_deblockingFilterCrTcOffsetDiv2                = 0;                         //!< tc offset for deblocking filter
2415   bool                        m_lmcsEnabledFlag                               = false;  //!< lmcs enabled flag
2416   int                         m_lmcsApsId                                     = -1;     //!< lmcs APS ID
2417   std::shared_ptr<APS>        m_lmcsAps                                       = nullptr; //!< lmcs APS
2418   bool                        m_lmcsChromaResidualScaleFlag                   = false;  //!< lmcs chroma residual scale flag
2419   bool                        m_explicitScalingListEnabledFlag                = false;  //!< explicit quantization scaling list enabled
2420   int                         m_scalingListApsId                              = -1;     //!< quantization scaling list APS ID
2421   std::shared_ptr<APS>        m_scalingListAps                                = nullptr; //!< quantization scaling list APS
2422   unsigned                    m_minQT[3]                                      = { 0, 0, 0 }; //!< minimum quad-tree size  0: I slice luma; 1: P/B slice; 2: I slice chroma
2423   unsigned                    m_maxMTTHierarchyDepth[3]                       = { 0, 0, 0 }; //!< maximum MTT depth
2424   unsigned                    m_maxBTSize[3]                                  = { 0, 0, 0 }; //!< maximum BT size
2425   unsigned                    m_maxTTSize[3]                                  = { 0, 0, 0 }; //!< maximum TT size
2426 
2427   WPScalingParam              m_weightPredTable[NUM_REF_PIC_LIST_01][MAX_NUM_REF][MAX_NUM_COMPONENT];   // [REF_PIC_LIST_0 or REF_PIC_LIST_1][refIdx][0:Y, 1:U, 2:V]
2428   int                         m_numL0Weights                                  = 0;  //!< number of weights for L0 list
2429   int                         m_numL1Weights                                  = 0;  //!< number of weights for L1 list
2430 
2431 public:
2432                               PicHeader() = default;
~PicHeader()2433                               ~PicHeader() { m_alfApsId.resize(0); }
2434 //  void                        initPicHeader();
isValid()2435   bool                        isValid() const                                           { return m_valid;                                                                              }
setValid()2436   void                        setValid()                                                { m_valid = true;                                                                              }
setPic(Picture * p)2437   void                        setPic( Picture* p )                                      { m_pcPic = p;                                                                                 }
getPic()2438   Picture*                    getPic()                                                  { return m_pcPic;                                                                              }
getPic()2439   const Picture*              getPic() const                                            { return m_pcPic;                                                                              }
setPocLsb(int i)2440   void                        setPocLsb(int i)                                          { m_pocLsb = i;                                                                                }
getPocLsb()2441   int                         getPocLsb() const                                         { return m_pocLsb;                                                                             }
setNonReferencePictureFlag(bool b)2442   void                        setNonReferencePictureFlag( bool b )                      { m_nonReferencePictureFlag = b;                                                               }
getNonReferencePictureFlag()2443   bool                        getNonReferencePictureFlag() const                        { return m_nonReferencePictureFlag;                                                            }
setGdrOrIrapPicFlag(bool b)2444   void                        setGdrOrIrapPicFlag( bool b )                             { m_gdrOrIrapPicFlag = b;                                                                      }
getGdrOrIrapPicFlag()2445   bool                        getGdrOrIrapPicFlag() const                               { return m_gdrOrIrapPicFlag;                                                                   }
setGdrPicFlag(bool b)2446   void                        setGdrPicFlag( bool b )                                   { m_gdrPicFlag = b;                                                                            }
getGdrPicFlag()2447   bool                        getGdrPicFlag() const                                     { return m_gdrPicFlag;                                                                         }
setRecoveryPocCnt(uint32_t u)2448   void                        setRecoveryPocCnt( uint32_t u )                           { m_recoveryPocCnt = u;                                                                        }
getRecoveryPocCnt()2449   uint32_t                    getRecoveryPocCnt() const                                 { return m_recoveryPocCnt;                                                                     }
setSPSId(uint32_t u)2450   void                        setSPSId( uint32_t u )                                    { m_spsId = u;                                                                                 }
getSPSId()2451   uint32_t                    getSPSId() const                                          { return m_spsId;                                                                              }
setPPSId(uint32_t u)2452   void                        setPPSId( uint32_t u )                                    { m_ppsId = u;                                                                                 }
getPPSId()2453   uint32_t                    getPPSId() const                                          { return m_ppsId;                                                                              }
setPocMsbPresentFlag(bool b)2454   void                        setPocMsbPresentFlag(bool b)                              { m_pocMsbPresentFlag = b;                                                                     }
getPocMsbPresentFlag()2455   bool                        getPocMsbPresentFlag() const                              { return m_pocMsbPresentFlag;                                                                  }
setPocMsbVal(int i)2456   void                        setPocMsbVal(int i)                                       { m_pocMsbVal = i;                                                                             }
getPocMsbVal()2457   int                         getPocMsbVal() const                                      { return m_pocMsbVal;                                                                          }
setVirtualBoundariesPresentFlag(bool b)2458   void                        setVirtualBoundariesPresentFlag( bool b )                 { m_virtualBoundariesPresentFlag = b;                                                          }
getVirtualBoundariesPresentFlag()2459   bool                        getVirtualBoundariesPresentFlag() const                   { return m_virtualBoundariesPresentFlag;                                                       }
setNumVerVirtualBoundaries(unsigned u)2460   void                        setNumVerVirtualBoundaries(unsigned u)                    { m_numVerVirtualBoundaries = u;                                                               }
getNumVerVirtualBoundaries()2461   unsigned                    getNumVerVirtualBoundaries() const                        { return m_numVerVirtualBoundaries;                                                            }
setNumHorVirtualBoundaries(unsigned u)2462   void                        setNumHorVirtualBoundaries(unsigned u)                    { m_numHorVirtualBoundaries = u;                                                               }
getNumHorVirtualBoundaries()2463   unsigned                    getNumHorVirtualBoundaries() const                        { return m_numHorVirtualBoundaries;                                                            }
setVirtualBoundariesPosX(unsigned u,unsigned idx)2464   void                        setVirtualBoundariesPosX(unsigned u, unsigned idx)        { CHECK( idx >= 3, "boundary index exceeds valid range" ); m_virtualBoundariesPosX[idx] = u;   }
getVirtualBoundariesPosX(unsigned idx)2465   unsigned                    getVirtualBoundariesPosX(unsigned idx) const              { CHECK( idx >= 3, "boundary index exceeds valid range" ); return m_virtualBoundariesPosX[idx];}
setVirtualBoundariesPosY(unsigned u,unsigned idx)2466   void                        setVirtualBoundariesPosY(unsigned u, unsigned idx)        { CHECK( idx >= 3, "boundary index exceeds valid range" ); m_virtualBoundariesPosY[idx] = u;   }
getVirtualBoundariesPosY(unsigned idx)2467   unsigned                    getVirtualBoundariesPosY(unsigned idx) const              { CHECK( idx >= 3, "boundary index exceeds valid range" ); return m_virtualBoundariesPosY[idx];}
setPicOutputFlag(bool b)2468   void                        setPicOutputFlag( bool b )                                { m_picOutputFlag = b;                                                                         }
getPicOutputFlag()2469   bool                        getPicOutputFlag() const                                  { return m_picOutputFlag;                                                                      }
clearRPL(RefPicList l)2470   void                        clearRPL( RefPicList l )                                  { m_RPL[l].clear();                                                                            }
setRPL(RefPicList l,const ReferencePictureList & rpl)2471   void                        setRPL( RefPicList l, const ReferencePictureList& rpl )   { m_RPL[l] = rpl;                                                                              }
getRPL(RefPicList l)2472   ReferencePictureList*       getRPL( RefPicList l )                                    { return &m_RPL[l];                                                                            }
setRPLIdx(RefPicList l,int RPLIdx)2473   void                        setRPLIdx( RefPicList l, int RPLIdx)                      { m_RPLIdx[l] = RPLIdx;                                                                        }
getRPLIdx(RefPicList l)2474   int                         getRPLIdx( RefPicList l ) const                           { return m_RPLIdx[l];                                                                          }
setPicInterSliceAllowedFlag(bool b)2475   void                        setPicInterSliceAllowedFlag(bool b)                       { m_picInterSliceAllowedFlag = b; }
getPicInterSliceAllowedFlag()2476   bool                        getPicInterSliceAllowedFlag() const                       { return m_picInterSliceAllowedFlag; }
setPicIntraSliceAllowedFlag(bool b)2477   void                        setPicIntraSliceAllowedFlag(bool b)                       { m_picIntraSliceAllowedFlag = b; }
getPicIntraSliceAllowedFlag()2478   bool                        getPicIntraSliceAllowedFlag() const                       { return m_picIntraSliceAllowedFlag; }
setSplitConsOverrideFlag(bool b)2479   void                        setSplitConsOverrideFlag( bool b )                        { m_splitConsOverrideFlag = b;                                                                 }
getSplitConsOverrideFlag()2480   bool                        getSplitConsOverrideFlag() const                          { return m_splitConsOverrideFlag;                                                              }
setCuQpDeltaSubdivIntra(uint32_t u)2481   void                        setCuQpDeltaSubdivIntra( uint32_t u )                     { m_cuQpDeltaSubdivIntra = u;                                                                  }
getCuQpDeltaSubdivIntra()2482   uint32_t                    getCuQpDeltaSubdivIntra() const                           { return m_cuQpDeltaSubdivIntra;                                                               }
setCuQpDeltaSubdivInter(uint32_t u)2483   void                        setCuQpDeltaSubdivInter( uint32_t u )                     { m_cuQpDeltaSubdivInter = u;                                                                  }
getCuQpDeltaSubdivInter()2484   uint32_t                    getCuQpDeltaSubdivInter() const                           { return m_cuQpDeltaSubdivInter;                                                               }
setCuChromaQpOffsetSubdivIntra(uint32_t u)2485   void                        setCuChromaQpOffsetSubdivIntra( uint32_t u )              { m_cuChromaQpOffsetSubdivIntra = u;                                                           }
getCuChromaQpOffsetSubdivIntra()2486   uint32_t                    getCuChromaQpOffsetSubdivIntra() const                    { return m_cuChromaQpOffsetSubdivIntra;                                                        }
setCuChromaQpOffsetSubdivInter(uint32_t u)2487   void                        setCuChromaQpOffsetSubdivInter( uint32_t u )              { m_cuChromaQpOffsetSubdivInter = u;                                                           }
getCuChromaQpOffsetSubdivInter()2488   uint32_t                    getCuChromaQpOffsetSubdivInter() const                    { return m_cuChromaQpOffsetSubdivInter;                                                        }
setEnableTMVPFlag(bool b)2489   void                        setEnableTMVPFlag( bool b )                               { m_enableTMVPFlag = b;                                                                        }
getEnableTMVPFlag()2490   bool                        getEnableTMVPFlag() const                                 { return m_enableTMVPFlag;                                                                     }
setPicColFromL0Flag(bool val)2491   void                        setPicColFromL0Flag(bool val)                             { m_picColFromL0Flag = val;                                                                    }
getPicColFromL0Flag()2492   bool                        getPicColFromL0Flag() const                               { return m_picColFromL0Flag;                                                                   }
setColRefIdx(uint32_t refIdx)2493   void                        setColRefIdx( uint32_t refIdx)                            { m_colRefIdx = refIdx;                                                                        }
getColRefIdx()2494   uint32_t                    getColRefIdx()                                            { return m_colRefIdx;                                                                          }
setMvdL1ZeroFlag(bool b)2495   void                        setMvdL1ZeroFlag( bool b )                                { m_mvdL1ZeroFlag = b;                                                                         }
getMvdL1ZeroFlag()2496   bool                        getMvdL1ZeroFlag() const                                  { return m_mvdL1ZeroFlag;                                                                      }
setMaxNumAffineMergeCand(uint32_t val)2497   void                        setMaxNumAffineMergeCand( uint32_t val )                  { m_maxNumAffineMergeCand = val;                                                               }
getMaxNumAffineMergeCand()2498   uint32_t                    getMaxNumAffineMergeCand() const                          { return m_maxNumAffineMergeCand;                                                              }
setDisFracMMVD(bool val)2499   void                        setDisFracMMVD( bool val )                                { m_disFracMMVD = val;                                                                         }
getDisFracMMVD()2500   bool                        getDisFracMMVD() const                                    { return m_disFracMMVD;                                                                        }
setDisBdofFlag(bool val)2501   void                        setDisBdofFlag( bool val )                                { m_disBdofFlag = val;                                                                         }
getDisBdofFlag()2502   bool                        getDisBdofFlag() const                                    { return m_disBdofFlag;                                                                        }
setDisDmvrFlag(bool val)2503   void                        setDisDmvrFlag( bool val )                                { m_disDmvrFlag = val;                                                                         }
getDisDmvrFlag()2504   bool                        getDisDmvrFlag() const                                    { return m_disDmvrFlag;                                                                        }
setDisProfFlag(bool val)2505   void                        setDisProfFlag( bool val )                                { m_disProfFlag = val;                                                                         }
getDisProfFlag()2506   bool                        getDisProfFlag() const                                    { return m_disProfFlag;                                                                        }
setMaxNumGeoCand(uint32_t b)2507   void                        setMaxNumGeoCand(uint32_t b)                              { m_maxNumGeoCand = b; }
getMaxNumGeoCand()2508   uint32_t                    getMaxNumGeoCand() const                                  { return m_maxNumGeoCand; }
setMaxNumIBCMergeCand(uint32_t b)2509   void                        setMaxNumIBCMergeCand( uint32_t b )                       { m_maxNumIBCMergeCand = b;                                                                    }
getMaxNumIBCMergeCand()2510   uint32_t                    getMaxNumIBCMergeCand() const                             { return m_maxNumIBCMergeCand;                                                                 }
setJointCbCrSignFlag(bool b)2511   void                        setJointCbCrSignFlag( bool b )                            { m_jointCbCrSignFlag = b;                                                                     }
getJointCbCrSignFlag()2512   bool                        getJointCbCrSignFlag() const                              { return m_jointCbCrSignFlag;                                                                  }
setQpDelta(int b)2513   void                        setQpDelta(int b)                                         { m_qpDelta = b;                                                                               }
getQpDelta()2514   int                         getQpDelta() const                                        { return m_qpDelta;                                                                            }
setSaoEnabledFlag(ChannelType chType,bool b)2515   void                        setSaoEnabledFlag(ChannelType chType, bool b)             { m_saoEnabledFlag[chType] = b;                                                                }
getSaoEnabledFlag(ChannelType chType)2516   bool                        getSaoEnabledFlag(ChannelType chType) const               { return m_saoEnabledFlag[chType];                                                             }
setAlfEnabledFlag(ComponentID compId,bool b)2517   void                        setAlfEnabledFlag(ComponentID compId, bool b)             { m_alfEnabledFlag[compId] = b;                                                                }
getAlfEnabledFlag(ComponentID compId)2518   bool                        getAlfEnabledFlag(ComponentID compId) const               { return m_alfEnabledFlag[compId];                                                             }
setNumAlfAps(int i)2519   void                        setNumAlfAps(int i)                                       { m_numAlfAps = i;                                                                             }
getNumAlfAps()2520   int                         getNumAlfAps() const                                      { return m_numAlfAps;                                                                          }
setAlfApsIdChroma(int i)2521   void                        setAlfApsIdChroma(int i)                                  { m_alfChromaApsId = i;                                                                        }
getAlfApsIdChroma()2522   int                         getAlfApsIdChroma() const                                 { return m_alfChromaApsId;                                                                     }
setCcAlfEnabledFlag(ComponentID compId,bool b)2523   void                        setCcAlfEnabledFlag(ComponentID compId, bool b)           { m_ccalfEnabledFlag[compId] = b; }
getCcAlfEnabledFlag(ComponentID compId)2524   bool                        getCcAlfEnabledFlag(ComponentID compId) const             { return m_ccalfEnabledFlag[compId]; }
2525 
setCcAlfCbApsId(int i)2526   void                        setCcAlfCbApsId(int i)                                    { m_ccalfCbApsId = i; }
getCcAlfCbApsId()2527   int                         getCcAlfCbApsId() const                                   { return m_ccalfCbApsId; }
setCcAlfCrApsId(int i)2528   void                        setCcAlfCrApsId(int i)                                    { m_ccalfCrApsId = i; }
getCcAlfCrApsId()2529   int                         getCcAlfCrApsId() const                                   { return m_ccalfCrApsId; }
setDeblockingFilterOverrideFlag(bool b)2530   void                        setDeblockingFilterOverrideFlag( bool b )                 { m_deblockingFilterOverrideFlag = b;                                                          }
getDeblockingFilterOverrideFlag()2531   bool                        getDeblockingFilterOverrideFlag() const                   { return m_deblockingFilterOverrideFlag;                                                       }
setDeblockingFilterDisable(bool b)2532   void                        setDeblockingFilterDisable( bool b )                      { m_deblockingFilterDisable= b;                                                                }
getDeblockingFilterDisable()2533   bool                        getDeblockingFilterDisable() const                        { return m_deblockingFilterDisable;                                                            }
setDeblockingFilterBetaOffsetDiv2(int i)2534   void                        setDeblockingFilterBetaOffsetDiv2( int i )                { m_deblockingFilterBetaOffsetDiv2 = i;                                                        }
getDeblockingFilterBetaOffsetDiv2()2535   int                         getDeblockingFilterBetaOffsetDiv2()const                  { return m_deblockingFilterBetaOffsetDiv2;                                                     }
setDeblockingFilterTcOffsetDiv2(int i)2536   void                        setDeblockingFilterTcOffsetDiv2( int i )                  { m_deblockingFilterTcOffsetDiv2 = i;                                                          }
getDeblockingFilterTcOffsetDiv2()2537   int                         getDeblockingFilterTcOffsetDiv2() const                   { return m_deblockingFilterTcOffsetDiv2;                                                       }
setDeblockingFilterCbBetaOffsetDiv2(int i)2538   void                        setDeblockingFilterCbBetaOffsetDiv2( int i )              { m_deblockingFilterCbBetaOffsetDiv2 = i;                                                      }
getDeblockingFilterCbBetaOffsetDiv2()2539   int                         getDeblockingFilterCbBetaOffsetDiv2()const                { return m_deblockingFilterCbBetaOffsetDiv2;                                                   }
setDeblockingFilterCbTcOffsetDiv2(int i)2540   void                        setDeblockingFilterCbTcOffsetDiv2( int i )                { m_deblockingFilterCbTcOffsetDiv2 = i;                                                        }
getDeblockingFilterCbTcOffsetDiv2()2541   int                         getDeblockingFilterCbTcOffsetDiv2() const                 { return m_deblockingFilterCbTcOffsetDiv2;                                                     }
setDeblockingFilterCrBetaOffsetDiv2(int i)2542   void                        setDeblockingFilterCrBetaOffsetDiv2( int i )              { m_deblockingFilterCrBetaOffsetDiv2 = i;                                                      }
getDeblockingFilterCrBetaOffsetDiv2()2543   int                         getDeblockingFilterCrBetaOffsetDiv2()const                { return m_deblockingFilterCrBetaOffsetDiv2;                                                   }
setDeblockingFilterCrTcOffsetDiv2(int i)2544   void                        setDeblockingFilterCrTcOffsetDiv2( int i )                { m_deblockingFilterCrTcOffsetDiv2 = i;                                                        }
getDeblockingFilterCrTcOffsetDiv2()2545   int                         getDeblockingFilterCrTcOffsetDiv2() const                 { return m_deblockingFilterCrTcOffsetDiv2;                                                     }
setLmcsEnabledFlag(bool b)2546   void                        setLmcsEnabledFlag(bool b)                                { m_lmcsEnabledFlag = b;                                                                       }
getLmcsEnabledFlag()2547   bool                        getLmcsEnabledFlag()                                      { return m_lmcsEnabledFlag;                                                                    }
getLmcsEnabledFlag()2548   const bool                  getLmcsEnabledFlag() const                                { return m_lmcsEnabledFlag;                                                                    }
setLmcsAPS(std::shared_ptr<APS> aps)2549   void                        setLmcsAPS(std::shared_ptr<APS> aps)                      { m_lmcsAps = aps; m_lmcsApsId = (aps) ? aps->getAPSId() : -1;                                 }
getLmcsAPS()2550   std::shared_ptr<APS>        getLmcsAPS() const                                        { return m_lmcsAps;                                                                            }
setLmcsAPSId(int id)2551   void                        setLmcsAPSId(int id)                                      { m_lmcsApsId = id;                                                                            }
getLmcsAPSId()2552   int                         getLmcsAPSId() const                                      { return m_lmcsApsId;                                                                          }
setLmcsChromaResidualScaleFlag(bool b)2553   void                        setLmcsChromaResidualScaleFlag(bool b)                    { m_lmcsChromaResidualScaleFlag = b;                                                           }
getLmcsChromaResidualScaleFlag()2554   bool                        getLmcsChromaResidualScaleFlag()                          { return m_lmcsChromaResidualScaleFlag;                                                        }
getLmcsChromaResidualScaleFlag()2555   const bool                  getLmcsChromaResidualScaleFlag() const                    { return m_lmcsChromaResidualScaleFlag;                                                        }
setScalingListAPS(std::shared_ptr<APS> aps)2556   void                        setScalingListAPS(std::shared_ptr<APS> aps)               { m_scalingListAps = aps; m_scalingListApsId = ( aps ) ? aps->getAPSId() : -1;                 }
getScalingListAPS()2557   std::shared_ptr<APS>        getScalingListAPS() const                                 { return m_scalingListAps;                                                                     }
setScalingListAPSId(int id)2558   void                        setScalingListAPSId( int id )                             { m_scalingListApsId = id;                                                                     }
getScalingListAPSId()2559   int                         getScalingListAPSId() const                               { return m_scalingListApsId;                                                                   }
setExplicitScalingListEnabledFlag(bool b)2560   void                        setExplicitScalingListEnabledFlag( bool b )               { m_explicitScalingListEnabledFlag = b;                                                        }
getExplicitScalingListEnabledFlag()2561   bool                        getExplicitScalingListEnabledFlag()                       { return m_explicitScalingListEnabledFlag;                                                     }
getExplicitScalingListEnabledFlag()2562   const bool                  getExplicitScalingListEnabledFlag() const                 { return m_explicitScalingListEnabledFlag;                                                     }
getMinQTSizes()2563   unsigned*                   getMinQTSizes() const                                     { return (unsigned *)m_minQT;                                                                  }
getMaxBTSizes()2564   unsigned*                   getMaxBTSizes() const                                     { return (unsigned *)m_maxBTSize;                                                              }
getMaxTTSizes()2565   unsigned*                   getMaxTTSizes() const                                     { return (unsigned *)m_maxTTSize;                                                              }
2566 
setMinQTSize(unsigned idx,unsigned minQT)2567   void                        setMinQTSize(unsigned idx, unsigned minQT)                { m_minQT[idx] = minQT;                                                                        }
setMaxMTTHierarchyDepth(unsigned idx,unsigned maxMTT)2568   void                        setMaxMTTHierarchyDepth(unsigned idx, unsigned maxMTT)    { m_maxMTTHierarchyDepth[idx] = maxMTT;                                                        }
setMaxBTSize(unsigned idx,unsigned maxBT)2569   void                        setMaxBTSize(unsigned idx, unsigned maxBT)                { m_maxBTSize[idx] = maxBT;                                                                    }
setMaxTTSize(unsigned idx,unsigned maxTT)2570   void                        setMaxTTSize(unsigned idx, unsigned maxTT)                { m_maxTTSize[idx] = maxTT;                                                                    }
2571 
setMinQTSizes(unsigned * minQT)2572   void                        setMinQTSizes(unsigned*   minQT)                          { m_minQT[0] = minQT[0]; m_minQT[1] = minQT[1]; m_minQT[2] = minQT[2];                                                 }
setMaxMTTHierarchyDepths(unsigned * maxMTT)2573   void                        setMaxMTTHierarchyDepths(unsigned*   maxMTT)              { m_maxMTTHierarchyDepth[0] = maxMTT[0]; m_maxMTTHierarchyDepth[1] = maxMTT[1]; m_maxMTTHierarchyDepth[2] = maxMTT[2]; }
setMaxBTSizes(unsigned * maxBT)2574   void                        setMaxBTSizes(unsigned*   maxBT)                          { m_maxBTSize[0] = maxBT[0]; m_maxBTSize[1] = maxBT[1]; m_maxBTSize[2] = maxBT[2];                                     }
setMaxTTSizes(unsigned * maxTT)2575   void                        setMaxTTSizes(unsigned*   maxTT)                          { m_maxTTSize[0] = maxTT[0]; m_maxTTSize[1] = maxTT[1]; m_maxTTSize[2] = maxTT[2];                                     }
2576 
2577   unsigned                    getMinQTSize(SliceType   slicetype,
2578                                        ChannelType chType = CHANNEL_TYPE_LUMA) const    { return slicetype == I_SLICE ? (chType == CHANNEL_TYPE_LUMA ? m_minQT[0] : m_minQT[2]) : m_minQT[1];                                              }
2579   unsigned                    getMaxMTTHierarchyDepth(SliceType   slicetype,
2580                                        ChannelType chType = CHANNEL_TYPE_LUMA) const    { return slicetype == I_SLICE ? (chType == CHANNEL_TYPE_LUMA ? m_maxMTTHierarchyDepth[0] : m_maxMTTHierarchyDepth[2]) : m_maxMTTHierarchyDepth[1]; }
2581   unsigned                    getMaxBTSize(SliceType   slicetype,
2582                                        ChannelType chType = CHANNEL_TYPE_LUMA) const    { return slicetype == I_SLICE ? (chType == CHANNEL_TYPE_LUMA ? m_maxBTSize[0] : m_maxBTSize[2]) : m_maxBTSize[1];                                  }
2583   unsigned                    getMaxTTSize(SliceType   slicetype,
2584                                        ChannelType chType = CHANNEL_TYPE_LUMA) const    { return slicetype == I_SLICE ? (chType == CHANNEL_TYPE_LUMA ? m_maxTTSize[0] : m_maxTTSize[2]) : m_maxTTSize[1];                                  }
2585 
setAlfAPSs(std::vector<int> apsIDs)2586   void                        setAlfAPSs(std::vector<int> apsIDs)                       { m_alfApsId.resize(m_numAlfAps);
2587                                                                                           for (int i = 0; i < m_numAlfAps; i++)
2588                                                                                           {
2589                                                                                             m_alfApsId[i] = apsIDs[i];
2590                                                                                           }
2591                                                                                         }
2592 
getAlfAPSs()2593   std::vector<int>            getAlfAPSs() const                                        { return m_alfApsId; }
2594 
setWpScaling(WPScalingParam * wp)2595   void                        setWpScaling(WPScalingParam *wp)
2596   {
2597     memcpy(m_weightPredTable, wp, sizeof(WPScalingParam) * NUM_REF_PIC_LIST_01 * MAX_NUM_REF * MAX_NUM_COMPONENT);
2598   }
2599   void                        getWpScaling(RefPicList e, int iRefIdx, WPScalingParam *&wp) const;
getWpScalingAll()2600   WPScalingParam*             getWpScalingAll()                                        { return (WPScalingParam *) m_weightPredTable; }
setNumL0Weights(int b)2601   void                        setNumL0Weights(int b)                                   { m_numL0Weights = b;                          }
getNumL0Weights()2602   int                         getNumL0Weights()                                        { return m_numL0Weights;                       }
setNumL1Weights(int b)2603   void                        setNumL1Weights(int b)                                   { m_numL1Weights = b;                          }
getNumL1Weights()2604   int                         getNumL1Weights()                                        { return m_numL1Weights;                       }
2605 
setNoOutputBeforeRecoveryFlag(bool val)2606   void                        setNoOutputBeforeRecoveryFlag( bool val )                { m_noOutputBeforeRecoveryFlag = val;  }
getNoOutputBeforeRecoveryFlag()2607   bool                        getNoOutputBeforeRecoveryFlag() const                    { return m_noOutputBeforeRecoveryFlag; }
setHandleCraAsCvsStartFlag(bool val)2608   void                        setHandleCraAsCvsStartFlag( bool val )                   { m_handleCraAsCvsStartFlag = val;     }
getHandleCraAsCvsStartFlag()2609   bool                        getHandleCraAsCvsStartFlag() const                       { return m_handleCraAsCvsStartFlag;    }
setHandleGdrAsCvsStartFlag(bool val)2610   void                        setHandleGdrAsCvsStartFlag( bool val )                   { m_handleGdrAsCvsStartFlag = val;     }
getHandleGdrAsCvsStartFlag()2611   bool                        getHandleGdrAsCvsStartFlag() const                       { return m_handleGdrAsCvsStartFlag;    }
2612 };
2613 
2614 /// slice header class
2615 class Slice
2616 {
2617 private:
2618   //  Bitstream writing
2619   bool                        m_saoEnabledFlag[MAX_NUM_CHANNEL_TYPE] = { false, false };
2620   int                         m_iPOC                                 = 0;
2621   int                         m_iLastIDR                             = 0;
2622   int                         m_iAssociatedIRAP                      = 0;
2623   NalUnitType                 m_iAssociatedIRAPType                  = NAL_UNIT_INVALID;
2624   ReferencePictureList        m_RPL[2];                                         //< RPL for L0/L1 when present in slice header
2625   int                         m_RPLIdx[2]                       = { -1, -1 };   //< index of used RPL in the SPS or -1 for local RPL in the slice header
2626   NalUnitType                m_eNalUnitType                     = NAL_UNIT_CODED_SLICE_IDR_W_RADL;   ///< Nal unit type for the slice
2627   bool                       m_pictureHeaderInSliceHeader       = false;
2628   uint32_t                   m_nuhLayerId                       = 0;           ///< Nal unit layer id
2629 #if TBC
2630   int                        m_prevGDRSubpicPOC                 = 0;
2631   int                        m_prevIRAPSubpicPOC                = 0;
2632   NalUnitType                m_prevIRAPSubpicType               = NAL_UNIT_INVALID;
2633 #endif
2634   SliceType                  m_eSliceType                       = I_SLICE;
2635   bool                       m_noOutputOfPriorPicsFlag          = false;           //!< no output of prior pictures flag
2636   int                        m_iSliceQp                         = 0;
2637   int                        m_iSliceQpBase                     = 0xFFFFF;
2638 
2639   bool                       m_ChromaQpAdjEnabled               = false;
2640   bool                       m_deblockingFilterDisable          = false;
2641   bool                       m_deblockingFilterOverrideFlag     = false;    //< offsets for deblocking filter inherit from PPS
2642   int                        m_deblockingFilterBetaOffsetDiv2   = 0;        //< beta offset for deblocking filter
2643   int                        m_deblockingFilterTcOffsetDiv2     = 0;        //< tc offset for deblocking filter
2644   int                        m_deblockingFilterCbBetaOffsetDiv2 = 0;  //< beta offset for deblocking filter
2645   int                        m_deblockingFilterCbTcOffsetDiv2   = 0;    //< tc offset for deblocking filter
2646   int                        m_deblockingFilterCrBetaOffsetDiv2 = 0;  //< beta offset for deblocking filter
2647   int                        m_deblockingFilterCrTcOffsetDiv2   = 0;    //< tc offset for deblocking filter
2648   bool                       m_depQuantEnabledFlag              = false;               //!< dependent quantization enabled flag
2649   bool                       m_signDataHidingEnabledFlag        = false;         //!< sign data hiding enabled flag
2650   bool                       m_tsResidualCodingDisabledFlag     = false;
2651   bool                       m_lmcsEnabledFlag;
2652   bool                       m_explicitScalingListUsed;
2653   int                        m_list1IdxToList0Idx[MAX_NUM_REF];
2654   int                        m_aiNumRefIdx[NUM_REF_PIC_LIST_01] = { 0, 0 }; //  for multiple reference of current slice
2655   bool                       m_pendingRasInit                   = false;
2656 
2657   bool                       m_bCheckLDC                        = false;
2658 
2659   bool                       m_biDirPred                        = false;
2660   int                        m_symRefIdx[2]                     = { -1, -1 };
2661 
2662   //  Data
2663   int                        m_iSliceQpDelta                    = 0;
2664   int                        m_iSliceChromaQpDelta[MAX_NUM_COMPONENT + 1] = { 0, 0, 0, 0 };
2665   Picture*                   m_apcRefPicList    [NUM_REF_PIC_LIST_01][MAX_NUM_REF + 1];   // entry 0 in m_apcRefPicList is nullptr!
2666   int                        m_aiRefPOCList     [NUM_REF_PIC_LIST_01][MAX_NUM_REF + 1];
2667   bool                       m_bIsUsedAsLongTerm[NUM_REF_PIC_LIST_01][MAX_NUM_REF + 1];
2668   Picture*                   m_scaledRefPicList[NUM_REF_PIC_LIST_01][MAX_NUM_REF + 1];
2669   Picture*                   m_savedRefPicList[NUM_REF_PIC_LIST_01][MAX_NUM_REF + 1];
2670   std::pair<int, int>        m_scalingRatio[NUM_REF_PIC_LIST_01][MAX_NUM_REF_PICS];
2671 
2672   // access channel
2673   const VPS*                 m_pcVPS                         = nullptr;
2674   const SPS*                 m_pcSPS                         = nullptr;
2675   const PPS*                 m_pcPPS                         = nullptr;
2676   Picture*                   m_pcPic                         = nullptr;
2677   PicHeader*                 m_pcPicHeader                   = nullptr;    //!< pointer to picture header structure
2678   bool                       m_colFromL0Flag                 = true;   // collocated picture from List0 flag
2679 
2680   uint32_t                   m_colRefIdx                     = 0;
2681   double                     m_lambdas[MAX_NUM_COMPONENT]    = { 0.0, 0.0, 0.0 };
2682   uint32_t                   m_maxNumIBCMergeCand            = 0;
2683   bool                       m_disBdofDmvrFlag               = false;
2684 
2685   uint32_t                   m_uiTLayer                      = false;
2686   bool                       m_bTLayerSwitchingFlag          = false;
2687 
2688   uint32_t                   m_independentSliceIdx           = 0;
2689 
2690   WPScalingParam             m_weightPredTable[NUM_REF_PIC_LIST_01][MAX_NUM_REF][MAX_NUM_COMPONENT];   // [REF_PIC_LIST_0 or REF_PIC_LIST_1][refIdx][0:Y, 1:U, 2:V]
2691   WPACDCParam                m_weightACDCParam[MAX_NUM_COMPONENT];
2692   ClpRngs                    m_clpRngs;
2693   std::vector<uint32_t>      m_substreamSizes;
2694   uint32_t                   m_numEntryPoints                = 0;
2695   bool                       m_cabacInitFlag                 = false;
2696   SliceMap                   m_sliceMap;                     //!< list of CTUs in current slice - raster scan CTU addresses
2697 
2698   uint32_t                   m_sliceSubPicId                 = false;
2699 
2700   int                        m_numCus                        = 0;
2701   int                        m_numIntraCus                   = 0;
2702 
2703   APS*                        m_alfApss[ALF_CTB_MAX_NUM_APS];
2704   bool                        m_tileGroupAlfEnabledFlag[MAX_NUM_COMPONENT] = { false, false, false };
2705   int                         m_tileGroupNumAps                            = 0;
2706   std::vector<int>            m_tileGroupLumaApsId;
2707   int                         m_tileGroupChromaApsId                       = -1;
2708   bool                        m_tileGroupCcAlfEnabledFlags[2]              = { false, false };
2709   int                         m_tileGroupCcAlfCbApsId                      = -1;
2710   int                         m_tileGroupCcAlfCrApsId                      = -1;
2711 
2712 public:
2713                               Slice();
2714   void                        initSlice();
2715   void                        inheritFromPicHeader( PicHeader *picHeader, const PPS *pps, const SPS *sps );
setPicHeader(PicHeader * pcPicHeader)2716   void                        setPicHeader( PicHeader* pcPicHeader )                 { m_pcPicHeader = pcPicHeader;                                  }
getPicHeader()2717   PicHeader*                  getPicHeader() const                                   { return m_pcPicHeader;                                         }
2718   int                         getRefIdx4MVPair( RefPicList eCurRefPicList, int nCurRefIdx );
2719 
setVPS(const VPS * pcVPS)2720   void                        setVPS( const VPS* pcVPS )                             { m_pcVPS = pcVPS;                                              }
getVPS()2721   const VPS*                  getVPS() const                                         { return m_pcVPS;                                               }
setSPS(const SPS * pcSPS)2722   void                        setSPS( const SPS* pcSPS )                             { m_pcSPS = pcSPS;                                              }
getSPS()2723   const SPS*                  getSPS() const                                         { return m_pcSPS;                                               }
2724 
setPPS(const PPS * pcPPS)2725   void                        setPPS( const PPS* pcPPS )                             { m_pcPPS = pcPPS;                                              }
getPPS()2726   const PPS*                  getPPS() const                                         { return m_pcPPS;                                               }
2727 
setAlfAPSs(std::shared_ptr<APS> apss[ALF_CTB_MAX_NUM_APS])2728   void                        setAlfAPSs( std::shared_ptr<APS> apss[ALF_CTB_MAX_NUM_APS] ) { for( int i=0; i<ALF_CTB_MAX_NUM_APS; ++i ) { m_alfApss[i] = apss[i].get(); }  }
clearAlfAPSs()2729   void                        clearAlfAPSs()                                         { memset( m_alfApss, 0, sizeof( m_alfApss ) );                  }
getAlfAPSs()2730   APS**                       getAlfAPSs()                                           { return m_alfApss;                                             }
getAlfAPSs()2731   const APS* const*           getAlfAPSs() const                                     { return m_alfApss;                                             }
setSaoEnabledFlag(ChannelType chType,bool s)2732   void                        setSaoEnabledFlag(ChannelType chType, bool s)          { m_saoEnabledFlag[chType] = s;                                 }
getSaoEnabledFlag(ChannelType chType)2733   bool                        getSaoEnabledFlag(ChannelType chType) const            { return m_saoEnabledFlag[chType];                              }
clearRPL(RefPicList l)2734   void                        clearRPL( RefPicList l )                               { m_RPL[l].clear();                                             }
setRPL(RefPicList l,const ReferencePictureList & rpl)2735   void                        setRPL( RefPicList l, const ReferencePictureList& rpl ){ m_RPL[l] = rpl;                                               }
getRPL(RefPicList l)2736   ReferencePictureList*       getRPL( RefPicList l )                                 { return &m_RPL[l];                                             }
getRPL0()2737   ReferencePictureList*       getRPL0()                                              { return &m_RPL[0];                                             }
getRPL1()2738   ReferencePictureList*       getRPL1()                                              { return &m_RPL[1];                                             }
getRPL0()2739   const ReferencePictureList* getRPL0()                                      const   { return &m_RPL[0];                                             }
getRPL1()2740   const ReferencePictureList* getRPL1()                                      const   { return &m_RPL[1];                                             }
setRPLIdx(RefPicList l,int RPLIdx)2741   void                        setRPLIdx( RefPicList l, int RPLIdx )                  { m_RPLIdx[l] = RPLIdx;                                         }
getRPLIdx(RefPicList l)2742   int                         getRPLIdx( RefPicList l ) const                        { return m_RPLIdx[l];                                           }
setLastIDR(int iIDRPOC)2743   void                        setLastIDR(int iIDRPOC)                                { m_iLastIDR = iIDRPOC;                                         }
getLastIDR()2744   int                         getLastIDR() const                                     { return m_iLastIDR;                                            }
setAssociatedIRAPPOC(int iAssociatedIRAPPOC)2745   void                        setAssociatedIRAPPOC(int iAssociatedIRAPPOC)           { m_iAssociatedIRAP = iAssociatedIRAPPOC;                       }
getAssociatedIRAPPOC()2746   int                         getAssociatedIRAPPOC() const                           { return m_iAssociatedIRAP;                                     }
setAssociatedIRAPType(NalUnitType associatedIRAPType)2747   void                        setAssociatedIRAPType(NalUnitType associatedIRAPType)  { m_iAssociatedIRAPType = associatedIRAPType;                   }
getAssociatedIRAPType()2748   NalUnitType                 getAssociatedIRAPType() const                          { return m_iAssociatedIRAPType;                                 }
2749 #if TBC
setPrevGDRSubpicPOC(int poc)2750   void                        setPrevGDRSubpicPOC(int poc)                           { m_prevGDRSubpicPOC = poc;                                     }
getPrevGDRSubpicPOC()2751   int                         getPrevGDRSubpicPOC() const                            { return m_prevGDRSubpicPOC;                                    }
setPrevIRAPSubpicPOC(int poc)2752   void                        setPrevIRAPSubpicPOC(int poc)                          { m_prevIRAPSubpicPOC = poc;                                    }
getPrevIRAPSubpicPOC()2753   int                         getPrevIRAPSubpicPOC() const                           { return m_prevIRAPSubpicPOC;                                   }
setPrevIRAPSubpicType(NalUnitType type)2754   void                        setPrevIRAPSubpicType(NalUnitType type)                { m_prevIRAPSubpicType = type;                                  }
getPrevIRAPSubpicType()2755   NalUnitType                 getPrevIRAPSubpicType() const                          { return m_prevIRAPSubpicType;                                  }
2756   void                        checkSubpicTypeConstraints(PicList& rcListPic, const ReferencePictureList* pRPL0, const ReferencePictureList* pRPL1, const int prevIRAPSubpicDecOrderNo);
2757 #endif
getSliceType()2758   SliceType                   getSliceType() const                                   { return m_eSliceType;                                          }
setNoOutputOfPriorPicsFlag(bool b)2759   void                        setNoOutputOfPriorPicsFlag(bool b)                     { m_noOutputOfPriorPicsFlag = b;                                }
getNoOutputOfPriorPicsFlag()2760   bool                        getNoOutputOfPriorPicsFlag() const                     { return m_noOutputOfPriorPicsFlag;                             }
getPOC()2761   int                         getPOC() const                                         { return m_iPOC;                                                }
getSliceQp()2762   int                         getSliceQp() const                                     { return m_iSliceQp;                                            }
getSliceQpDelta()2763   int                         getSliceQpDelta() const                                { return m_iSliceQpDelta;                                       }
getSliceChromaQpDelta(ComponentID compID)2764   int                         getSliceChromaQpDelta(ComponentID compID) const        { return isLuma(compID) ? 0 : m_iSliceChromaQpDelta[compID];    }
getUseChromaQpAdj()2765   bool                        getUseChromaQpAdj() const                              { return m_ChromaQpAdjEnabled;                                  }
getDeblockingFilterDisable()2766   bool                        getDeblockingFilterDisable() const                     { return m_deblockingFilterDisable;                             }
getDeblockingFilterOverrideFlag()2767   bool                        getDeblockingFilterOverrideFlag() const                { return m_deblockingFilterOverrideFlag;                        }
getDeblockingFilterBetaOffsetDiv2()2768   int                         getDeblockingFilterBetaOffsetDiv2()const               { return m_deblockingFilterBetaOffsetDiv2;                      }
getDeblockingFilterTcOffsetDiv2()2769   int                         getDeblockingFilterTcOffsetDiv2() const                { return m_deblockingFilterTcOffsetDiv2;                        }
getDeblockingFilterCbBetaOffsetDiv2()2770   int                         getDeblockingFilterCbBetaOffsetDiv2()const             { return m_deblockingFilterCbBetaOffsetDiv2;                    }
getDeblockingFilterCbTcOffsetDiv2()2771   int                         getDeblockingFilterCbTcOffsetDiv2() const              { return m_deblockingFilterCbTcOffsetDiv2;                      }
getDeblockingFilterCrBetaOffsetDiv2()2772   int                         getDeblockingFilterCrBetaOffsetDiv2()const             { return m_deblockingFilterCrBetaOffsetDiv2;                    }
getDeblockingFilterCrTcOffsetDiv2()2773   int                         getDeblockingFilterCrTcOffsetDiv2() const              { return m_deblockingFilterCrTcOffsetDiv2;                      }
getPendingRasInit()2774   bool                        getPendingRasInit() const                              { return m_pendingRasInit;                                      }
setPendingRasInit(bool val)2775   void                        setPendingRasInit( bool val )                          { m_pendingRasInit = val;                                       }
2776 
getNumRefIdx(RefPicList e)2777   int                         getNumRefIdx( RefPicList e ) const                     { return m_aiNumRefIdx[e];                                      }
getPic()2778   Picture*                    getPic()                                               { return m_pcPic;                                               }
getPic()2779   const Picture*              getPic() const                                         { return m_pcPic;                                               }
getNoConstRefPic(RefPicList e,int iRefIdx)2780         Picture*              getNoConstRefPic( RefPicList e, int iRefIdx) const     { return m_apcRefPicList[e][iRefIdx];                           }
getRefPic(RefPicList e,int iRefIdx)2781   const Picture*              getRefPic( RefPicList e, int iRefIdx) const            { return m_apcRefPicList[e][iRefIdx];                           }
getRefPOC(RefPicList e,int iRefIdx)2782   int                         getRefPOC( RefPicList e, int iRefIdx) const            { return m_aiRefPOCList[e][iRefIdx];                            }
getColFromL0Flag()2783   bool                        getColFromL0Flag() const                               { return m_colFromL0Flag;                                       }
getColRefIdx()2784   uint32_t                    getColRefIdx() const                                   { return m_colRefIdx;                                           }
2785   void                        checkColRefIdx(uint32_t curSliceSegmentIdx, const Picture* pic);
getIsUsedAsLongTerm(int i,int j)2786   bool                        getIsUsedAsLongTerm(int i, int j) const                { return m_bIsUsedAsLongTerm[i][j];                             }
setIsUsedAsLongTerm(int i,int j,bool value)2787   void                        setIsUsedAsLongTerm(int i, int j, bool value)          { m_bIsUsedAsLongTerm[i][j] = value;                            }
getCheckLDC()2788   bool                        getCheckLDC() const                                    { return m_bCheckLDC;                                           }
getList1IdxToList0Idx(int list1Idx)2789   int                         getList1IdxToList0Idx( int list1Idx ) const            { return m_list1IdxToList0Idx[list1Idx];                        }
setPOC(int i)2790   void                        setPOC( int i )                                        { m_iPOC              = i;                                      }
getPictureHeaderInSliceHeader()2791   bool                        getPictureHeaderInSliceHeader() const                  { return m_pictureHeaderInSliceHeader;                         }
setPictureHeaderInSliceHeader(bool e)2792   void                        setPictureHeaderInSliceHeader( bool e )                { m_pictureHeaderInSliceHeader = e;                            }
setNalUnitType(NalUnitType e)2793   void                        setNalUnitType( NalUnitType e )                        { m_eNalUnitType      = e;                                      }
getNalUnitType()2794   NalUnitType                 getNalUnitType() const                                 { return m_eNalUnitType;                                        }
setNalUnitLayerId(uint32_t i)2795   void                        setNalUnitLayerId( uint32_t i )                        { m_nuhLayerId = i;                                             }
getNalUnitLayerId()2796   uint32_t                    getNalUnitLayerId() const                              { return m_nuhLayerId;                                          }
2797   bool                        getRapPicFlag() const;
getIdrPicFlag()2798   bool                        getIdrPicFlag() const                                  { return getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL   || getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP;   }
isIRAP()2799   bool                        isIRAP() const                                         { return (getNalUnitType() >= NAL_UNIT_CODED_SLICE_IDR_W_RADL) && (getNalUnitType() <= NAL_UNIT_CODED_SLICE_CRA);      }
2800 #if GDR_ADJ
isClvssPu()2801   bool                        isClvssPu() const                                      { return m_eNalUnitType >= NAL_UNIT_CODED_SLICE_IDR_W_RADL && m_eNalUnitType <= NAL_UNIT_CODED_SLICE_GDR && !m_pcPPS->getMixedNaluTypesInPicFlag() && m_pcPicHeader->getNoOutputBeforeRecoveryFlag(); }
2802 #else
isClvssPu()2803   bool                        isClvssPu() const                                      { return m_eNalUnitType >= NAL_UNIT_CODED_SLICE_IDR_W_RADL && m_eNalUnitType <= NAL_UNIT_CODED_SLICE_GDR && !m_pcPPS->getMixedNaluTypesInPicFlag(); }
2804 #endif
isIDR()2805   bool                        isIDR() const                                          { return m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_W_RADL || m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_N_LP; }
isCRAorGDR()2806   bool                        isCRAorGDR() const                                     { return m_eNalUnitType == NAL_UNIT_CODED_SLICE_CRA || m_eNalUnitType == NAL_UNIT_CODED_SLICE_GDR; }
2807   void                        checkCRA( int& pocCRA, NalUnitType& associatedIRAPType, const PicListRange& rcListPic );
2808   void                        checkSTSA( const PicListRange& rcListPic );
2809   void                        checkRPL(const ReferencePictureList* pRPL0, const ReferencePictureList* pRPL1, const int associatedIRAPDecodingOrderNumber, const PicListRange& rcListPic);
setSliceType(SliceType e)2810   void                        setSliceType( SliceType e )                            { m_eSliceType        = e;                                      }
setSliceQp(int i)2811   void                        setSliceQp( int i )                                    { m_iSliceQp          = i;                                      }
setSliceQpDelta(int i)2812   void                        setSliceQpDelta( int i )                               { m_iSliceQpDelta     = i;                                      }
setSliceChromaQpDelta(ComponentID compID,int i)2813   void                        setSliceChromaQpDelta( ComponentID compID, int i )     { m_iSliceChromaQpDelta[compID] = isLuma(compID) ? 0 : i;       }
setUseChromaQpAdj(bool b)2814   void                        setUseChromaQpAdj( bool b )                            { m_ChromaQpAdjEnabled = b;                                     }
setDeblockingFilterDisable(bool b)2815   void                        setDeblockingFilterDisable( bool b )                   { m_deblockingFilterDisable= b;                                 }
setDeblockingFilterOverrideFlag(bool b)2816   void                        setDeblockingFilterOverrideFlag( bool b )              { m_deblockingFilterOverrideFlag = b;                           }
setDeblockingFilterBetaOffsetDiv2(int i)2817   void                        setDeblockingFilterBetaOffsetDiv2( int i )             { m_deblockingFilterBetaOffsetDiv2 = i;                         }
setDeblockingFilterTcOffsetDiv2(int i)2818   void                        setDeblockingFilterTcOffsetDiv2( int i )               { m_deblockingFilterTcOffsetDiv2 = i;                           }
setDeblockingFilterCbBetaOffsetDiv2(int i)2819   void                        setDeblockingFilterCbBetaOffsetDiv2( int i )           { m_deblockingFilterCbBetaOffsetDiv2 = i;                         }
setDeblockingFilterCbTcOffsetDiv2(int i)2820   void                        setDeblockingFilterCbTcOffsetDiv2( int i )             { m_deblockingFilterCbTcOffsetDiv2 = i;                           }
setDeblockingFilterCrBetaOffsetDiv2(int i)2821   void                        setDeblockingFilterCrBetaOffsetDiv2( int i )           { m_deblockingFilterCrBetaOffsetDiv2 = i;                         }
setDeblockingFilterCrTcOffsetDiv2(int i)2822   void                        setDeblockingFilterCrTcOffsetDiv2( int i )             { m_deblockingFilterCrTcOffsetDiv2 = i;                           }
setDepQuantEnabledFlag(bool b)2823   void                        setDepQuantEnabledFlag( bool b )                       { m_depQuantEnabledFlag = b;                                                                   }
getDepQuantEnabledFlag()2824   bool                        getDepQuantEnabledFlag() const                         { return m_depQuantEnabledFlag;                                                                }
setSignDataHidingEnabledFlag(bool b)2825   void                        setSignDataHidingEnabledFlag( bool b )                 { m_signDataHidingEnabledFlag = b;                                                             }
getSignDataHidingEnabledFlag()2826   bool                        getSignDataHidingEnabledFlag() const                   { return m_signDataHidingEnabledFlag;                                                          }
setTSResidualCodingDisabledFlag(bool b)2827   void                        setTSResidualCodingDisabledFlag(bool b)                { m_tsResidualCodingDisabledFlag = b; }
getTSResidualCodingDisabledFlag()2828   bool                        getTSResidualCodingDisabledFlag() const                { return m_tsResidualCodingDisabledFlag; }
setLmcsEnabledFlag(bool b)2829   void                        setLmcsEnabledFlag(bool b)                              { m_lmcsEnabledFlag = b;                                       }
getLmcsEnabledFlag()2830   bool                        getLmcsEnabledFlag()                                    { return m_lmcsEnabledFlag;                                    }
getLmcsEnabledFlag()2831   const bool                  getLmcsEnabledFlag() const                              { return m_lmcsEnabledFlag;                                    }
2832 
setExplicitScalingListUsed(bool b)2833   void                        setExplicitScalingListUsed(bool b)                      { m_explicitScalingListUsed = b;                               }
getExplicitScalingListUsed()2834   bool                        getExplicitScalingListUsed() const                      { return m_explicitScalingListUsed;                            }
setNumRefIdx(RefPicList e,int i)2835   void                        setNumRefIdx( RefPicList e, int i )                    { m_aiNumRefIdx[e]    = i;                                      }
setPic(Picture * p)2836   void                        setPic( Picture* p )                                   { m_pcPic             = p;                                      }
2837 
2838   void                        constructRefPicLists( const PicListRange& rcListPic );
2839   void                        constructSingleRefPicList( const PicListRange& rcListPic, RefPicList listId );
2840 
2841   void                        setRefPOCList();
2842 
setColFromL0Flag(bool colFromL0)2843   void                        setColFromL0Flag( bool colFromL0 )                     { m_colFromL0Flag = colFromL0;                                  }
setColRefIdx(uint32_t refIdx)2844   void                        setColRefIdx( uint32_t refIdx)                         { m_colRefIdx = refIdx;                                         }
setCheckLDC(bool b)2845   void                        setCheckLDC( bool b )                                  { m_bCheckLDC = b;                                              }
2846 
setBiDirPred(bool b,int refIdx0,int refIdx1)2847   void                        setBiDirPred( bool b, int refIdx0, int refIdx1 ) { m_biDirPred = b; m_symRefIdx[0] = refIdx0; m_symRefIdx[1] = refIdx1; }
getBiDirPred()2848   bool                        getBiDirPred() const { return m_biDirPred; }
getSymRefIdx(int refList)2849   int                         getSymRefIdx( int refList ) const { return m_symRefIdx[refList]; }
2850 
isIntra()2851   bool                        isIntra() const                                        { return m_eSliceType == I_SLICE;                               }
isInterB()2852   bool                        isInterB() const                                       { return m_eSliceType == B_SLICE;                               }
isInterP()2853   bool                        isInterP() const                                       { return m_eSliceType == P_SLICE;                               }
2854 
setLambdas(const double lambdas[MAX_NUM_COMPONENT])2855   void                        setLambdas( const double lambdas[MAX_NUM_COMPONENT] )  { for (int component = 0; component < MAX_NUM_COMPONENT; component++) m_lambdas[component] = lambdas[component]; }
getLambdas()2856   const double*               getLambdas() const                                     { return m_lambdas;                                             }
2857 
2858 
getCuQpDeltaSubdiv()2859   uint32_t                    getCuQpDeltaSubdiv() const                             { return this->isIntra() ? m_pcPicHeader->getCuQpDeltaSubdivIntra() : m_pcPicHeader->getCuQpDeltaSubdivInter(); }
getCuChromaQpOffsetSubdiv()2860   uint32_t                    getCuChromaQpOffsetSubdiv() const                      { return this->isIntra() ? m_pcPicHeader->getCuChromaQpOffsetSubdivIntra() : m_pcPicHeader->getCuChromaQpOffsetSubdivInter(); }
2861 
2862   void                        setList1IdxToList0Idx();
2863 
getTLayer()2864   uint32_t                    getTLayer() const                                      { return m_uiTLayer;                                            }
setTLayer(uint32_t uiTLayer)2865   void                        setTLayer( uint32_t uiTLayer )                         { m_uiTLayer = uiTLayer;                                        }
2866 
2867   void                        checkLeadingPictureRestrictions( const PicListRange & rcListPic ) const;
2868   bool                        checkThatAllRefPicsAreAvailable( const PicListRange&         rcListPic,
2869                                                                const ReferencePictureList* pRPL,
2870                                                                int                         numActiveRefPics,
2871                                                                int*                        missingPOC,
2872                                                                int*                        missingRefPicIndex ) const;
2873 
setSliceMap(SliceMap map)2874   void                        setSliceMap( SliceMap map )                            { m_sliceMap = map;                                                         }
getFirstCtuRsAddrInSlice()2875   uint32_t                    getFirstCtuRsAddrInSlice() const                       { return m_sliceMap.getCtuAddrInSlice(0);                                   }
setSliceID(uint32_t u)2876   void                        setSliceID( uint32_t u )                               { m_sliceMap.setSliceID( u );                                               }
getSliceID()2877   uint32_t                    getSliceID() const                                     { return m_sliceMap.getSliceID();                                           }
getNumCtuInSlice()2878   uint32_t                    getNumCtuInSlice() const                               { return m_sliceMap.getNumCtuInSlice();                                     }
getCtuAddrInSlice(int idx)2879   uint32_t                    getCtuAddrInSlice( int idx ) const                     { return m_sliceMap.getCtuAddrInSlice( idx );                               }
initSliceMap()2880   void                        initSliceMap()                                         { m_sliceMap.initSliceMap();                                                }
addCtusToSlice(uint32_t startX,uint32_t stopX,uint32_t startY,uint32_t stopY,uint32_t picWidthInCtbsY)2881   void                        addCtusToSlice( uint32_t startX, uint32_t stopX,
2882                                               uint32_t startY, uint32_t stopY,
2883                                               uint32_t picWidthInCtbsY )             { m_sliceMap.addCtusToSlice(startX, stopX, startY, stopY, picWidthInCtbsY); }
setIndependentSliceIdx(uint32_t i)2884   void                        setIndependentSliceIdx( uint32_t i)                    { m_independentSliceIdx = i;                                    }
getIndependentSliceIdx()2885   uint32_t                    getIndependentSliceIdx() const                         { return  m_independentSliceIdx;                                }
2886   void                        copySliceInfo(Slice *pcSliceSrc, bool cpyAlmostAll = true);
setWpScaling(WPScalingParam wp[NUM_REF_PIC_LIST_01][MAX_NUM_REF][MAX_NUM_COMPONENT])2887   void                        setWpScaling( WPScalingParam  wp[NUM_REF_PIC_LIST_01][MAX_NUM_REF][MAX_NUM_COMPONENT] )
2888   {
2889     memcpy(m_weightPredTable, wp, sizeof(WPScalingParam)*NUM_REF_PIC_LIST_01*MAX_NUM_REF*MAX_NUM_COMPONENT);
2890   }
setWpScaling(WPScalingParam * wp)2891   void                        setWpScaling(WPScalingParam *wp)
2892   {
2893     memcpy(m_weightPredTable, wp, sizeof(WPScalingParam) * NUM_REF_PIC_LIST_01 * MAX_NUM_REF * MAX_NUM_COMPONENT);
2894   }
getWpScalingAll()2895   WPScalingParam *            getWpScalingAll()                                      { return (WPScalingParam *) m_weightPredTable;                  }
2896   void                        getWpScaling( RefPicList e, int iRefIdx, WPScalingParam *&wp) const;
2897 
2898   void                        resetWpScaling();
2899   void                        initWpScaling(const SPS *sps);
2900 
setWpAcDcParam(WPACDCParam wp[MAX_NUM_COMPONENT])2901   void                        setWpAcDcParam( WPACDCParam wp[MAX_NUM_COMPONENT] )    { memcpy(m_weightACDCParam, wp, sizeof(WPACDCParam)*MAX_NUM_COMPONENT); }
2902 
2903   void                        getWpAcDcParam( const WPACDCParam *&wp ) const;
2904   void                        initWpAcDcParam();
2905 
clearSubstreamSizes()2906   void                        clearSubstreamSizes( )                                 { return m_substreamSizes.clear();                              }
getNumberOfSubstreamSizes()2907   uint32_t                    getNumberOfSubstreamSizes( )                           { return (uint32_t) m_substreamSizes.size();                    }
addSubstreamSize(uint32_t size)2908   void                        addSubstreamSize( uint32_t size )                      { m_substreamSizes.push_back(size);                             }
getSubstreamSize(uint32_t idx)2909   uint32_t                    getSubstreamSize( uint32_t idx )                       { CHECK(idx>=getNumberOfSubstreamSizes(),"Invalid index"); return m_substreamSizes[idx]; }
2910 
setCabacInitFlag(bool val)2911   void                        setCabacInitFlag( bool val )                           { m_cabacInitFlag = val;                                        } //!< set CABAC initial flag
getCabacInitFlag()2912   bool                        getCabacInitFlag()                               const { return m_cabacInitFlag;                                       } //!< get CABAC initial flag
setSliceSubPicId(int i)2913   void                        setSliceSubPicId(int i)                                { m_sliceSubPicId = i;   }
getSliceSubPicId()2914   uint32_t                    getSliceSubPicId() const                               { return m_sliceSubPicId; }
2915 
setSliceQpBase(int i)2916   void                        setSliceQpBase( int i )                                { m_iSliceQpBase = i;                                           }
getSliceQpBase()2917   int                         getSliceQpBase()                                 const { return m_iSliceQpBase;                                        }
2918 
2919   void                        setDefaultClpRng( const SPS& sps );
clpRngs()2920   const ClpRngs&              clpRngs()                                         const { return m_clpRngs; }
clpRng(ComponentID id)2921   const ClpRng&               clpRng( ComponentID id)                           const { return m_clpRngs; }
getClpRngs()2922   ClpRngs&                    getClpRngs()                                            { return m_clpRngs; }
2923   unsigned                    getMinPictureDistance()                           const ;
2924 
resetTileGroupAlfEnabledFlag()2925   void                        resetTileGroupAlfEnabledFlag()                          { memset(m_tileGroupAlfEnabledFlag, 0, sizeof(m_tileGroupAlfEnabledFlag)); }
getTileGroupAlfEnabledFlag(ComponentID compId)2926   bool                        getTileGroupAlfEnabledFlag(ComponentID compId)    const { return m_tileGroupAlfEnabledFlag[compId]; }
setTileGroupAlfEnabledFlag(ComponentID compId,bool b)2927   void                        setTileGroupAlfEnabledFlag(ComponentID compId, bool b)  { m_tileGroupAlfEnabledFlag[compId] = b; }
getTileGroupNumAps()2928   int                         getTileGroupNumAps()                              const { return m_tileGroupNumAps; }
setTileGroupNumAps(int i)2929   void                        setTileGroupNumAps(int i)                               { m_tileGroupNumAps = i; }
getTileGroupApsIdChroma()2930   int                         getTileGroupApsIdChroma()                         const { return m_tileGroupChromaApsId; }
setTileGroupApsIdChroma(int i)2931   void                        setTileGroupApsIdChroma(int i)                          { m_tileGroupChromaApsId = i; }
getTileGroupApsIdLuma()2932   std::vector<int32_t>        getTileGroupApsIdLuma()                           const { return m_tileGroupLumaApsId; }
setAlfAPSids(const std::vector<int> & ApsIDs)2933   void                        setAlfAPSids( const std::vector<int> & ApsIDs )
2934   {
2935     m_tileGroupLumaApsId.resize( m_tileGroupNumAps );
2936     m_tileGroupLumaApsId.assign( ApsIDs.begin(), ApsIDs.end() );
2937   }
resetTileGroupCcAlfEnabledFlags()2938   void                        resetTileGroupCcAlfEnabledFlags()                       { m_tileGroupCcAlfEnabledFlags[0] = false; m_tileGroupCcAlfEnabledFlags[1] = false; }
2939 
setTileGroupCcAlfCbEnabledFlag(bool b)2940   void                        setTileGroupCcAlfCbEnabledFlag(bool b)                  { m_tileGroupCcAlfEnabledFlags[0] = b; }
setTileGroupCcAlfCrEnabledFlag(bool b)2941   void                        setTileGroupCcAlfCrEnabledFlag(bool b)                  { m_tileGroupCcAlfEnabledFlags[1] = b; }
setTileGroupCcAlfCbApsId(int i)2942   void                        setTileGroupCcAlfCbApsId(int i)                         { m_tileGroupCcAlfCbApsId = i; }
setTileGroupCcAlfCrApsId(int i)2943   void                        setTileGroupCcAlfCrApsId(int i)                         { m_tileGroupCcAlfCrApsId = i; }
2944 
getTileGroupCcAlfEnabledFlag(int cmpntIdx)2945   bool                        getTileGroupCcAlfEnabledFlag(int cmpntIdx)       const  { return m_tileGroupCcAlfEnabledFlags[cmpntIdx]; }
2946 
getTileGroupCcAlfCbEnabledFlag()2947   bool                        getTileGroupCcAlfCbEnabledFlag()                 const  { return m_tileGroupCcAlfEnabledFlags[0]; }
getTileGroupCcAlfCrEnabledFlag()2948   bool                        getTileGroupCcAlfCrEnabledFlag()                 const  { return m_tileGroupCcAlfEnabledFlags[1]; }
getTileGroupCcAlfCbApsId()2949   int                         getTileGroupCcAlfCbApsId()                       const  { return m_tileGroupCcAlfCbApsId; }
getTileGroupCcAlfCrApsId()2950   int                         getTileGroupCcAlfCrApsId()                       const  { return m_tileGroupCcAlfCrApsId; }
2951 
2952 //  CcAlfFilterParam            m_ccAlfFilterParam;
2953 
2954   void                        scaleRefPicList( PicHeader *picHeader, APS** apss, APS* lmcsAps, APS* scalingListAps );
2955   bool                        checkRPR();
getScalingRatio(const RefPicList refPicList,const int refIdx)2956   const std::pair<int, int>&  getScalingRatio( const RefPicList refPicList, const int refIdx )  const { return m_scalingRatio[refPicList][refIdx]; }
2957   void                        setNumEntryPoints( const SPS *sps, const PPS *pps );
getNumEntryPoints()2958   uint32_t                    getNumEntryPoints( ) const { return m_numEntryPoints;  }
incNumCu()2959   void                        incNumCu()                                              { m_numCus++; }
incNumIntraCu()2960   void                        incNumIntraCu()                                         { m_numIntraCus++; }
getNumCu()2961   int                         getNumCu()                                        const { return m_numCus; }
getNumIntraCu()2962   int                         getNumIntraCu()                                   const { return m_numIntraCus; }
2963 
2964   struct ParseTaskParams
2965   {
initParseTaskParams2966     void init( class DecLibParser* dec, InputBitstream&& bits )
2967     {
2968       decLibParser = dec;
2969       bitstream.~InputBitstream();
2970       new(&bitstream) InputBitstream( std::move(bits) );
2971     }
2972 
2973     class DecLibParser* decLibParser = nullptr;
2974     InputBitstream      bitstream;
2975   } parseTaskParams;
2976 
2977   Barrier parseDone;
2978 
2979 protected:
2980   Picture*              xGetRefPic        ( const PicListRange & rcListPic, int poc, const int layerId );
2981   Picture*              xGetLongTermRefPic( const PicListRange & rcListPic, int poc, bool pocHasMsb, const int layerId );
2982 };   // END CLASS DEFINITION Slice
2983 
2984 
2985 class PreCalcValues
2986 {
2987 public:
PreCalcValues(const SPS & sps,const PPS & pps)2988   PreCalcValues( const SPS& sps, const PPS& pps )
2989     : chrFormat           ( sps.getChromaFormatIdc() )
2990     , maxCUWidth          ( sps.getMaxCUWidth() )
2991     , maxCUHeight         ( sps.getMaxCUHeight() )
2992     , maxCUWidthMask      ( maxCUWidth  - 1 )
2993     , maxCUHeightMask     ( maxCUHeight - 1 )
2994     , maxCUWidthLog2      ( getLog2( maxCUWidth  ) )
2995     , maxCUHeightLog2     ( getLog2( maxCUHeight ) )
2996     , minCUWidth          ( 1 << MIN_CU_LOG2 )
2997     , minCUHeight         ( 1 << MIN_CU_LOG2 )
2998     , minCUWidthLog2      ( getLog2( minCUWidth  ) )
2999     , minCUHeightLog2     ( getLog2( minCUHeight ) )
3000     , widthInCtus         ( (pps.getPicWidthInLumaSamples () + sps.getMaxCUWidth () - 1) / sps.getMaxCUWidth () )
3001     , heightInCtus        ( (pps.getPicHeightInLumaSamples() + sps.getMaxCUHeight() - 1) / sps.getMaxCUHeight() )
3002     , sizeInCtus          ( widthInCtus * heightInCtus )
3003     , lumaWidth           ( pps.getPicWidthInLumaSamples() )
3004     , lumaHeight          ( pps.getPicHeightInLumaSamples() )
3005   {}
3006 
isCorrect(const SPS & sps,const PPS & pps)3007   bool isCorrect( const SPS& sps, const PPS& pps )
3008   {
3009     if( chrFormat != sps.getChromaFormatIdc() )
3010       return false;
3011     if( maxCUWidth != sps.getMaxCUWidth() )
3012       return false;
3013     if( maxCUHeight != sps.getMaxCUHeight() )
3014       return false;
3015     if( chrFormat != sps.getChromaFormatIdc() )
3016       return false;
3017     if( lumaWidth != pps.getPicWidthInLumaSamples() )
3018       return false;
3019     if( lumaHeight != pps.getPicHeightInLumaSamples() )
3020       return false;
3021     return true;
3022   }
3023 
3024   const ChromaFormat chrFormat;
3025   const unsigned     maxCUWidth;
3026   const unsigned     maxCUHeight;
3027   // to get CTU position, use (x & maxCUWidthMask) rather than (x % maxCUWidth)
3028   const unsigned     maxCUWidthMask;
3029   const unsigned     maxCUHeightMask;
3030   const unsigned     maxCUWidthLog2;
3031   const unsigned     maxCUHeightLog2;
3032   const unsigned     minCUWidth;
3033   const unsigned     minCUHeight;
3034   const unsigned     minCUWidthLog2;
3035   const unsigned     minCUHeightLog2;
3036   const unsigned     widthInCtus;
3037   const unsigned     heightInCtus;
3038   const unsigned     sizeInCtus;
3039   const unsigned     lumaWidth;
3040   const unsigned     lumaHeight;
3041 };
3042 
3043 struct LevelTierFeatures
3044 {
3045   vvdecLevel  level;
3046   uint32_t    maxLumaPs;
3047   uint32_t    maxCpb[Tier::NUMBER_OF_TIERS];    // in units of CpbVclFactor or CpbNalFactor bits
3048   uint32_t    maxSlicesPerAu;
3049   uint32_t    maxTilesPerAu;
3050   uint32_t    maxTileCols;
3051   uint64_t    maxLumaSr;
3052   uint32_t    maxBr[Tier::NUMBER_OF_TIERS];     // in units of BrVclFactor or BrNalFactor bits/s
3053   uint32_t    minCrBase[Tier::NUMBER_OF_TIERS];
3054   uint32_t    getMaxPicWidthInLumaSamples()  const;
3055   uint32_t    getMaxPicHeightInLumaSamples() const;
3056 };
3057 
3058 
3059 struct ProfileFeatures
3060 {
3061   Profile::Name            profile;
3062   const char              *pNameString;
3063   uint32_t                 maxBitDepth;
3064   ChromaFormat             maxChromaFormat;
3065 
3066   bool                     canUseLevel15p5;
3067   uint32_t                 cpbVclFactor;
3068   uint32_t                 cpbNalFactor;
3069   uint32_t                 formatCapabilityFactorx1000;
3070   uint32_t                 minCrScaleFactorx100;
3071   const LevelTierFeatures *pLevelTiersListInfo;
3072   bool                     onePictureOnlyFlagMustBe1;
3073 
3074   static const ProfileFeatures *getProfileFeatures(const Profile::Name p);
3075 };
3076 
3077 
3078 class ProfileLevelTierFeatures
3079 {
3080   private:
3081     const ProfileFeatures   *m_pProfile;
3082     const LevelTierFeatures *m_pLevelTier;
3083     Tier                     m_tier;
3084   public:
ProfileLevelTierFeatures()3085     ProfileLevelTierFeatures() : m_pProfile(0), m_pLevelTier(0), m_tier(Tier::MAIN) { }
3086 
3087     void extractPTLInformation(const SPS &sps);
3088 
getProfileFeatures()3089     const ProfileFeatures     *getProfileFeatures()   const { return m_pProfile; }
getLevelTierFeatures()3090     const LevelTierFeatures   *getLevelTierFeatures() const { return m_pLevelTier; }
getTier()3091     Tier                       getTier()              const { return m_tier; }
3092     uint64_t getCpbSizeInBits()                       const;
3093     double getMinCr()                                 const;
3094     uint32_t getMaxDpbSize( uint32_t picSizeMaxInSamplesY ) const;
3095 };
3096 
3097 
3098 #if ENABLE_TRACING
3099 void xTraceVPSHeader();
3100 void xTraceDCIHeader();
3101 void xTraceSPSHeader();
3102 void xTracePPSHeader();
3103 void xTraceAPSHeader();
3104 void xTracePictureHeader();
3105 void xTraceSliceHeader();
3106 void xTraceAccessUnitDelimiter();
3107 #endif
3108 
3109 }
3110