/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 | | } |