Coverage Report

Created: 2026-04-01 07:49

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