1 /* ----------------------------------------------------------------------------- 2 The copyright in this software is being made available under the BSD 3 License, included below. No patent rights, trademark rights and/or 4 other Intellectual Property Rights other than the copyrights concerning 5 the Software are granted under this license. 6 7 For any license concerning other Intellectual Property rights than the software, 8 especially patent licenses, a separate Agreement needs to be closed. 9 For more information please contact: 10 11 Fraunhofer Heinrich Hertz Institute 12 Einsteinufer 37 13 10587 Berlin, Germany 14 www.hhi.fraunhofer.de/vvc 15 vvc@hhi.fraunhofer.de 16 17 Copyright (c) 2018-2021, Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. 18 All rights reserved. 19 20 Redistribution and use in source and binary forms, with or without 21 modification, are permitted provided that the following conditions are met: 22 23 * Redistributions of source code must retain the above copyright notice, 24 this list of conditions and the following disclaimer. 25 * Redistributions in binary form must reproduce the above copyright notice, 26 this list of conditions and the following disclaimer in the documentation 27 and/or other materials provided with the distribution. 28 * Neither the name of Fraunhofer nor the names of its contributors may 29 be used to endorse or promote products derived from this software without 30 specific prior written permission. 31 32 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 33 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 34 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 35 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS 36 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 37 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 38 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 39 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 40 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 41 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 42 THE POSSIBILITY OF SUCH DAMAGE. 43 44 45 ------------------------------------------------------------------------------------------- */ 46 47 /** \file Slice.h 48 \brief slice header and SPS class (header) 49 */ 50 51 #pragma once 52 53 #include "CommonDef.h" 54 #include "Rom.h" 55 #include "ChromaFormat.h" 56 #include "Common.h" 57 #include "MotionInfo.h" 58 #include "BitStream.h" 59 #include "PicListManager.h" 60 #include "SEI_internal.h" 61 62 #include "Utilities/ThreadPool.h" 63 64 #include <cstring> 65 #include <list> 66 #include <map> 67 #include <vector> 68 #include <chrono> 69 #include <future> 70 71 namespace vvdec 72 { 73 74 // ==================================================================================================================== 75 // Constants 76 // ==================================================================================================================== 77 class PreCalcValues; 78 class ParameterSetManager; 79 static const uint32_t REF_PIC_LIST_NUM_IDX=32; 80 81 82 // ==================================================================================================================== 83 // Class definition 84 // ==================================================================================================================== 85 86 struct DpbParameters 87 { 88 int m_maxDecPicBuffering[MAX_TLAYER] = { 0 }; 89 int m_numReorderPics[MAX_TLAYER] = { 0 }; 90 int m_maxLatencyIncreasePlus1[MAX_TLAYER] = { 0 }; 91 }; 92 93 class ReferencePictureList 94 { 95 private: 96 int m_numberOfShorttermPictures = 0; 97 int m_numberOfLongtermPictures = 0; 98 int m_isLongtermRefPic [MAX_NUM_REF_PICS]; 99 int m_refPicIdentifier [MAX_NUM_REF_PICS]; // This can be delta POC for STRP or POC LSB for LTRP 100 int m_POC [MAX_NUM_REF_PICS]; 101 int m_deltaPOCMSBCycleLT [MAX_NUM_REF_PICS]; 102 bool m_deltaPocMSBPresentFlag[MAX_NUM_REF_PICS]; 103 bool m_ltrp_in_slice_header_flag = false; 104 bool m_interLayerPresentFlag = false; 105 bool m_isInterLayerRefPic[MAX_NUM_REF_PICS]; 106 int m_interLayerRefPicIdx[MAX_NUM_REF_PICS]; 107 int m_numberOfInterLayerPictures = 0; 108 public: 109 ReferencePictureList(); 110 void clear(); 111 112 void setRefPicIdentifier( int idx, int identifier, bool isLongterm, bool isInterLayerRefPic, int interLayerIdx ); 113 int getRefPicIdentifier(int idx) const; 114 bool isRefPicLongterm(int idx) const; 115 116 void setRefPicLongterm(int idx,bool isLongterm); 117 118 void setNumberOfShorttermPictures(int numberOfStrp); 119 int getNumberOfShorttermPictures() const; 120 121 void setNumberOfLongtermPictures(int numberOfLtrp); 122 int getNumberOfLongtermPictures() const; 123 setLtrpInSliceHeaderFlag(bool flag)124 void setLtrpInSliceHeaderFlag(bool flag) { m_ltrp_in_slice_header_flag = flag; } getLtrpInSliceHeaderFlag()125 bool getLtrpInSliceHeaderFlag() const { return m_ltrp_in_slice_header_flag; } 126 setNumberOfInterLayerPictures(const int numberOfIlrp)127 void setNumberOfInterLayerPictures( const int numberOfIlrp ) { m_numberOfInterLayerPictures = numberOfIlrp; } getNumberOfInterLayerPictures()128 int getNumberOfInterLayerPictures() const { return m_numberOfInterLayerPictures; } 129 getNumRefEntries()130 int getNumRefEntries() const { return m_numberOfShorttermPictures + m_numberOfLongtermPictures; } 131 132 void setPOC(int idx, int POC); 133 int getPOC(int idx) const; 134 getDeltaPocMSBCycleLT(int i)135 int getDeltaPocMSBCycleLT(int i) const { return m_deltaPOCMSBCycleLT[i]; } 136 void setDeltaPocMSBCycleLT(int i, int x); getDeltaPocMSBPresentFlag(int i)137 bool getDeltaPocMSBPresentFlag(int i) const { return m_deltaPocMSBPresentFlag[i]; } 138 void setDeltaPocMSBPresentFlag(int i, bool x); 139 140 void printRefPicInfo() const; getInterLayerPresentFlag()141 bool getInterLayerPresentFlag() const { return m_interLayerPresentFlag; } setInterLayerPresentFlag(bool b)142 void setInterLayerPresentFlag( bool b ) { m_interLayerPresentFlag = b; } isInterLayerRefPic(int idx)143 bool isInterLayerRefPic( int idx ) const { return m_isInterLayerRefPic[idx]; } getInterLayerRefPicIdx(int idx)144 int getInterLayerRefPicIdx( int idx ) const { return m_interLayerRefPicIdx[idx]; } 145 void setInterLayerRefPicIdx( int idx, int layerIdc ); 146 147 static int calcLTRefPOC( int currPoc, int bitsForPoc, int refPicIdentifier, bool pocMSBPresent, int deltaPocMSBCycle ); 148 int calcLTRefPOC( int currPoc, int bitsForPoc, int refPicIdx ) const; 149 }; 150 151 bool isLTPocEqual( int poc1, int poc2, int bitsForPoc, bool msbPresent ); 152 153 /// Reference Picture List set class 154 155 typedef std::vector<ReferencePictureList> RPLList; 156 157 158 /// SCALING_LIST class 159 class ScalingList 160 { 161 public: 162 ScalingList(); 163 ~ScalingList() = default; getScalingListAddress(uint32_t scalingListId)164 int* getScalingListAddress(uint32_t scalingListId) { return &(m_scalingListCoef[scalingListId][0]); } //!< get matrix coefficient getScalingListAddress(uint32_t scalingListId)165 const int* getScalingListAddress(uint32_t scalingListId) const { return &(m_scalingListCoef[scalingListId][0]); } //!< get matrix coefficient 166 setRefMatrixId(uint32_t scalingListId,uint32_t u)167 void setRefMatrixId(uint32_t scalingListId, uint32_t u) { m_refMatrixId[scalingListId] = u; } //!< set reference matrix ID getRefMatrixId(uint32_t scalingListId)168 uint32_t getRefMatrixId(uint32_t scalingListId) const { return m_refMatrixId[scalingListId]; } //!< get reference matrix ID 169 170 static const int* getScalingListDefaultAddress(uint32_t scalinListId); //!< get default matrix coefficient 171 void processDefaultMatrix(uint32_t scalinListId); 172 setScalingListDC(uint32_t scalinListId,uint32_t u)173 void setScalingListDC(uint32_t scalinListId, uint32_t u) { m_scalingListDC[scalinListId] = u; } //!< set DC value getScalingListDC(uint32_t scalinListId)174 int getScalingListDC(uint32_t scalinListId) const { return m_scalingListDC[scalinListId]; } //!< get DC value 175 setScalingListCopyModeFlag(uint32_t scalinListId,bool bIsCopy)176 void setScalingListCopyModeFlag(uint32_t scalinListId, bool bIsCopy) { m_scalingListPredModeFlagIsCopy[scalinListId] = bIsCopy; } getScalingListCopyModeFlag(uint32_t scalinListId)177 bool getScalingListCopyModeFlag(uint32_t scalinListId) const { return m_scalingListPredModeFlagIsCopy[scalinListId]; } //getScalingListPredModeFlag 178 void processRefMatrix(uint32_t scalingListId, uint32_t refListId); 179 180 int lengthUvlc(int uiCode); 181 int lengthSvlc(int uiCode); setScalingListPreditorModeFlag(uint32_t scalingListId,bool bIsPred)182 void setScalingListPreditorModeFlag(uint32_t scalingListId, bool bIsPred) { m_scalingListPreditorModeFlag[scalingListId] = bIsPred; } getScalingListPreditorModeFlag(uint32_t scalingListId)183 bool getScalingListPreditorModeFlag(uint32_t scalingListId) const { return m_scalingListPreditorModeFlag[scalingListId]; } getChromaScalingListPresentFlag()184 bool getChromaScalingListPresentFlag() const {return m_chromaScalingListPresentFlag;} setChromaScalingListPresentFlag(bool flag)185 void setChromaScalingListPresentFlag( bool flag) { m_chromaScalingListPresentFlag = flag;} 186 bool isLumaScalingList( int scalingListId) const; 187 void setDefaultScalingList(); 188 189 private: 190 bool m_scalingListPredModeFlagIsCopy [30]; //!< reference list index 191 int m_scalingListDC [30]; //!< the DC value of the matrix coefficient for 16x16 192 uint32_t m_refMatrixId [30]; //!< RefMatrixID 193 bool m_scalingListPreditorModeFlag [30]; //!< reference list index 194 std::vector<int> m_scalingListCoef [30]; //!< quantization matrix 195 bool m_chromaScalingListPresentFlag = true; 196 }; 197 198 class ConstraintInfo 199 { 200 bool m_gciPresentFlag = false; 201 bool m_noRprConstraintFlag = false; 202 bool m_noResChangeInClvsConstraintFlag = false; 203 bool m_oneTilePerPicConstraintFlag = false; 204 bool m_picHeaderInSliceHeaderConstraintFlag = false; 205 bool m_oneSlicePerPicConstraintFlag = false; 206 bool m_noIdrRplConstraintFlag = false; 207 bool m_noRectSliceConstraintFlag = false; 208 bool m_oneSlicePerSubpicConstraintFlag = false; 209 bool m_noSubpicInfoConstraintFlag = false; 210 bool m_intraOnlyConstraintFlag = false; 211 uint32_t m_maxBitDepthConstraintIdc = 16; 212 ChromaFormat m_maxChromaFormatConstraintIdc = CHROMA_444; 213 bool m_onePictureOnlyConstraintFlag = false; 214 bool m_lowerBitRateConstraintFlag = false; 215 216 bool m_allLayersIndependentConstraintFlag = false; 217 bool m_noMrlConstraintFlag = false; 218 bool m_noIspConstraintFlag = false; 219 bool m_noMipConstraintFlag = false; 220 bool m_noLfnstConstraintFlag = false; 221 bool m_noMmvdConstraintFlag = false; 222 bool m_noSmvdConstraintFlag = false; 223 bool m_noProfConstraintFlag = false; 224 bool m_noPaletteConstraintFlag = false; 225 bool m_noActConstraintFlag = false; 226 bool m_noLmcsConstraintFlag = false; 227 228 bool m_noExplicitScaleListConstraintFlag = false; 229 bool m_noVirtualBoundaryConstraintFlag = false; 230 bool m_noMttConstraintFlag = false; 231 bool m_noChromaQpOffsetConstraintFlag = false; 232 bool m_noQtbttDualTreeIntraConstraintFlag = false; 233 int m_maxLog2CtuSizeConstraintIdc = 8; 234 bool m_noPartitionConstraintsOverrideConstraintFlag = false; 235 bool m_noSaoConstraintFlag = false; 236 bool m_noAlfConstraintFlag = false; 237 bool m_noCCAlfConstraintFlag = false; 238 bool m_noWeightedPredictionConstraintFlag = false; 239 bool m_noRefWraparoundConstraintFlag = false; 240 bool m_noTemporalMvpConstraintFlag = false; 241 bool m_noSbtmvpConstraintFlag = false; 242 bool m_noAmvrConstraintFlag = false; 243 bool m_noBdofConstraintFlag = false; 244 bool m_noDmvrConstraintFlag = false; 245 bool m_noCclmConstraintFlag = false; 246 bool m_noMtsConstraintFlag = false; 247 bool m_noSbtConstraintFlag = false; 248 bool m_noAffineMotionConstraintFlag = false; 249 bool m_noBcwConstraintFlag = false; 250 bool m_noIbcConstraintFlag = false; 251 bool m_noCiipConstraintFlag = false; 252 bool m_noGeoConstraintFlag = false; 253 bool m_noLadfConstraintFlag = false; 254 bool m_noTransformSkipConstraintFlag = false; 255 bool m_noLumaTransformSize64ConstraintFlag = false; 256 bool m_noBDPCMConstraintFlag = false; 257 bool m_noJointCbCrConstraintFlag = false; 258 bool m_noQpDeltaConstraintFlag = false; 259 bool m_noDepQuantConstraintFlag = false; 260 bool m_noSignDataHidingConstraintFlag = false; 261 bool m_noMixedNaluTypesInPicConstraintFlag = false; 262 bool m_noTrailConstraintFlag = false; 263 bool m_noStsaConstraintFlag = false; 264 bool m_noRaslConstraintFlag = false; 265 bool m_noRadlConstraintFlag = false; 266 bool m_noIdrConstraintFlag = false; 267 bool m_noCraConstraintFlag = false; 268 bool m_noGdrConstraintFlag = false; 269 bool m_noApsConstraintFlag = false; 270 271 public: 272 273 getGciPresentFlag()274 bool getGciPresentFlag() const { return m_gciPresentFlag; } setGciPresentFlag(bool b)275 void setGciPresentFlag(bool b) { m_gciPresentFlag = b; } 276 getMaxBitDepthConstraintIdc()277 uint32_t getMaxBitDepthConstraintIdc() const { return m_maxBitDepthConstraintIdc; } setMaxBitDepthConstraintIdc(uint32_t bitDepth)278 void setMaxBitDepthConstraintIdc(uint32_t bitDepth) { m_maxBitDepthConstraintIdc = bitDepth; } 279 getMaxChromaFormatConstraintIdc()280 ChromaFormat getMaxChromaFormatConstraintIdc() const { return m_maxChromaFormatConstraintIdc; } setMaxChromaFormatConstraintIdc(ChromaFormat fmt)281 void setMaxChromaFormatConstraintIdc(ChromaFormat fmt) { m_maxChromaFormatConstraintIdc = fmt; } 282 getNoRprConstraintFlag()283 bool getNoRprConstraintFlag() const { return m_noRprConstraintFlag; } setNoRprConstraintFlag(bool b)284 void setNoRprConstraintFlag(bool b) { m_noRprConstraintFlag = b; } 285 getNoResChangeInClvsConstraintFlag()286 bool getNoResChangeInClvsConstraintFlag() const { return m_noResChangeInClvsConstraintFlag; } setNoResChangeInClvsConstraintFlag(bool b)287 void setNoResChangeInClvsConstraintFlag(bool b) { m_noResChangeInClvsConstraintFlag = b; } 288 getOneTilePerPicConstraintFlag()289 bool getOneTilePerPicConstraintFlag() const { return m_oneTilePerPicConstraintFlag; } setOneTilePerPicConstraintFlag(bool b)290 void setOneTilePerPicConstraintFlag(bool b) { m_oneTilePerPicConstraintFlag = b; } 291 getPicHeaderInSliceHeaderConstraintFlag()292 bool getPicHeaderInSliceHeaderConstraintFlag() const { return m_picHeaderInSliceHeaderConstraintFlag; } setPicHeaderInSliceHeaderConstraintFlag(bool b)293 void setPicHeaderInSliceHeaderConstraintFlag(bool b) { m_picHeaderInSliceHeaderConstraintFlag = b; } getOneSlicePerPicConstraintFlag()294 bool getOneSlicePerPicConstraintFlag() const { return m_oneSlicePerPicConstraintFlag; } setOneSlicePerPicConstraintFlag(bool b)295 void setOneSlicePerPicConstraintFlag(bool b) { m_oneSlicePerPicConstraintFlag = b; } 296 getNoIdrRplConstraintFlag()297 bool getNoIdrRplConstraintFlag() const { return m_noIdrRplConstraintFlag; } setNoIdrRplConstraintFlag(bool b)298 void setNoIdrRplConstraintFlag(bool b) { m_noIdrRplConstraintFlag = b; } 299 getNoRectSliceConstraintFlag()300 bool getNoRectSliceConstraintFlag() const { return m_noRectSliceConstraintFlag; } setNoRectSliceConstraintFlag(bool b)301 void setNoRectSliceConstraintFlag(bool b) { m_noRectSliceConstraintFlag = b; } 302 getOneSlicePerSubpicConstraintFlag()303 bool getOneSlicePerSubpicConstraintFlag() const { return m_oneSlicePerSubpicConstraintFlag; } setOneSlicePerSubpicConstraintFlag(bool b)304 void setOneSlicePerSubpicConstraintFlag(bool b) { m_oneSlicePerSubpicConstraintFlag = b; } 305 getNoSubpicInfoConstraintFlag()306 bool getNoSubpicInfoConstraintFlag() const { return m_noSubpicInfoConstraintFlag; } setNoSubpicInfoConstraintFlag(bool b)307 void setNoSubpicInfoConstraintFlag(bool b) { m_noSubpicInfoConstraintFlag = b; } 308 getIntraOnlyConstraintFlag()309 bool getIntraOnlyConstraintFlag() const { return m_intraOnlyConstraintFlag; } setIntraOnlyConstraintFlag(bool b)310 void setIntraOnlyConstraintFlag(bool b) { m_intraOnlyConstraintFlag = b; } 311 getOnePictureOnlyConstraintFlag()312 bool getOnePictureOnlyConstraintFlag() const { return m_onePictureOnlyConstraintFlag; } setOnePictureOnlyConstraintFlag(bool b)313 void setOnePictureOnlyConstraintFlag(bool b) { m_onePictureOnlyConstraintFlag = b; } 314 getLowerBitRateConstraintFlag()315 bool getLowerBitRateConstraintFlag() const { return m_lowerBitRateConstraintFlag; } setLowerBitRateConstraintFlag(bool b)316 void setLowerBitRateConstraintFlag(bool b) { m_lowerBitRateConstraintFlag = b; } getAllLayersIndependentConstraintFlag()317 bool getAllLayersIndependentConstraintFlag() const { return m_allLayersIndependentConstraintFlag; } setAllLayersIndependentConstraintFlag(bool b)318 void setAllLayersIndependentConstraintFlag(bool b) { m_allLayersIndependentConstraintFlag = b; } getNoMrlConstraintFlag()319 bool getNoMrlConstraintFlag() const { return m_noMrlConstraintFlag; } setNoMrlConstraintFlag(bool b)320 void setNoMrlConstraintFlag(bool b) { m_noMrlConstraintFlag = b; } getNoIspConstraintFlag()321 bool getNoIspConstraintFlag() const { return m_noIspConstraintFlag; } setNoIspConstraintFlag(bool b)322 void setNoIspConstraintFlag(bool b) { m_noIspConstraintFlag = b; } getNoMipConstraintFlag()323 bool getNoMipConstraintFlag() const { return m_noMipConstraintFlag; } setNoMipConstraintFlag(bool b)324 void setNoMipConstraintFlag(bool b) { m_noMipConstraintFlag = b; } getNoLfnstConstraintFlag()325 bool getNoLfnstConstraintFlag() const { return m_noLfnstConstraintFlag; } setNoLfnstConstraintFlag(bool b)326 void setNoLfnstConstraintFlag(bool b) { m_noLfnstConstraintFlag = b; } getNoMmvdConstraintFlag()327 bool getNoMmvdConstraintFlag() const { return m_noMmvdConstraintFlag; } setNoMmvdConstraintFlag(bool b)328 void setNoMmvdConstraintFlag(bool b) { m_noMmvdConstraintFlag = b; } getNoSmvdConstraintFlag()329 bool getNoSmvdConstraintFlag() const { return m_noSmvdConstraintFlag; } setNoSmvdConstraintFlag(bool b)330 void setNoSmvdConstraintFlag(bool b) { m_noSmvdConstraintFlag = b; } getNoProfConstraintFlag()331 bool getNoProfConstraintFlag() const { return m_noProfConstraintFlag; } setNoProfConstraintFlag(bool b)332 void setNoProfConstraintFlag(bool b) { m_noProfConstraintFlag = b; } getNoPaletteConstraintFlag()333 bool getNoPaletteConstraintFlag() const { return m_noPaletteConstraintFlag; } setNoPaletteConstraintFlag(bool b)334 void setNoPaletteConstraintFlag(bool b) { m_noPaletteConstraintFlag = b; } getNoActConstraintFlag()335 bool getNoActConstraintFlag() const { return m_noActConstraintFlag; } setNoActConstraintFlag(bool b)336 void setNoActConstraintFlag(bool b) { m_noActConstraintFlag = b; } getNoLmcsConstraintFlag()337 bool getNoLmcsConstraintFlag() const { return m_noLmcsConstraintFlag; } setNoLmcsConstraintFlag(bool b)338 void setNoLmcsConstraintFlag(bool b) { m_noLmcsConstraintFlag = b; } getNoExplicitScaleListConstraintFlag()339 bool getNoExplicitScaleListConstraintFlag() const { return m_noExplicitScaleListConstraintFlag; } setNoExplicitScaleListConstraintFlag(bool b)340 void setNoExplicitScaleListConstraintFlag(bool b) { m_noExplicitScaleListConstraintFlag = b; } getNoVirtualBoundaryConstraintFlag()341 bool getNoVirtualBoundaryConstraintFlag() const { return m_noVirtualBoundaryConstraintFlag; } setNoVirtualBoundaryConstraintFlag(bool b)342 void setNoVirtualBoundaryConstraintFlag(bool b) { m_noVirtualBoundaryConstraintFlag = b; } getNoMttConstraintFlag()343 bool getNoMttConstraintFlag() const { return m_noMttConstraintFlag; } setNoMttConstraintFlag(bool bVal)344 void setNoMttConstraintFlag(bool bVal) { m_noMttConstraintFlag = bVal; } getNoChromaQpOffsetConstraintFlag()345 bool getNoChromaQpOffsetConstraintFlag() const { return m_noChromaQpOffsetConstraintFlag; } setNoChromaQpOffsetConstraintFlag(bool b)346 void setNoChromaQpOffsetConstraintFlag(bool b) { m_noChromaQpOffsetConstraintFlag = b; } getNoQtbttDualTreeIntraConstraintFlag()347 bool getNoQtbttDualTreeIntraConstraintFlag() const { return m_noQtbttDualTreeIntraConstraintFlag; } setNoQtbttDualTreeIntraConstraintFlag(bool bVal)348 void setNoQtbttDualTreeIntraConstraintFlag(bool bVal) { m_noQtbttDualTreeIntraConstraintFlag = bVal; } getMaxLog2CtuSizeConstraintIdc()349 int getMaxLog2CtuSizeConstraintIdc() const { return m_maxLog2CtuSizeConstraintIdc; } setMaxLog2CtuSizeConstraintIdc(int idc)350 void setMaxLog2CtuSizeConstraintIdc(int idc) { m_maxLog2CtuSizeConstraintIdc = idc; } getNoPartitionConstraintsOverrideConstraintFlag()351 bool getNoPartitionConstraintsOverrideConstraintFlag() const { return m_noPartitionConstraintsOverrideConstraintFlag; } setNoPartitionConstraintsOverrideConstraintFlag(bool bVal)352 void setNoPartitionConstraintsOverrideConstraintFlag(bool bVal) { m_noPartitionConstraintsOverrideConstraintFlag = bVal; } getNoSaoConstraintFlag()353 bool getNoSaoConstraintFlag() const { return m_noSaoConstraintFlag; } setNoSaoConstraintFlag(bool bVal)354 void setNoSaoConstraintFlag(bool bVal) { m_noSaoConstraintFlag = bVal; } getNoAlfConstraintFlag()355 bool getNoAlfConstraintFlag() const { return m_noAlfConstraintFlag; } setNoAlfConstraintFlag(bool bVal)356 void setNoAlfConstraintFlag(bool bVal) { m_noAlfConstraintFlag = bVal; } getNoCCAlfConstraintFlag()357 bool getNoCCAlfConstraintFlag() const { return m_noCCAlfConstraintFlag; } setNoCCAlfConstraintFlag(bool val)358 void setNoCCAlfConstraintFlag(bool val) { m_noCCAlfConstraintFlag = val; } getNoJointCbCrConstraintFlag()359 bool getNoJointCbCrConstraintFlag() const { return m_noJointCbCrConstraintFlag; } setNoJointCbCrConstraintFlag(bool bVal)360 void setNoJointCbCrConstraintFlag(bool bVal) { m_noJointCbCrConstraintFlag = bVal; } getNoWeightedPredictionConstraintFlag()361 bool getNoWeightedPredictionConstraintFlag() const { return m_noWeightedPredictionConstraintFlag; } setNoWeightedPredictionConstraintFlag(bool bVal)362 void setNoWeightedPredictionConstraintFlag(bool bVal) { m_noWeightedPredictionConstraintFlag = bVal; } getNoRefWraparoundConstraintFlag()363 bool getNoRefWraparoundConstraintFlag() const { return m_noRefWraparoundConstraintFlag; } setNoRefWraparoundConstraintFlag(bool bVal)364 void setNoRefWraparoundConstraintFlag(bool bVal) { m_noRefWraparoundConstraintFlag = bVal; } getNoTemporalMvpConstraintFlag()365 bool getNoTemporalMvpConstraintFlag() const { return m_noTemporalMvpConstraintFlag; } setNoTemporalMvpConstraintFlag(bool bVal)366 void setNoTemporalMvpConstraintFlag(bool bVal) { m_noTemporalMvpConstraintFlag = bVal; } getNoSbtmvpConstraintFlag()367 bool getNoSbtmvpConstraintFlag() const { return m_noSbtmvpConstraintFlag; } setNoSbtmvpConstraintFlag(bool bVal)368 void setNoSbtmvpConstraintFlag(bool bVal) { m_noSbtmvpConstraintFlag = bVal; } getNoAmvrConstraintFlag()369 bool getNoAmvrConstraintFlag() const { return m_noAmvrConstraintFlag; } setNoAmvrConstraintFlag(bool bVal)370 void setNoAmvrConstraintFlag(bool bVal) { m_noAmvrConstraintFlag = bVal; } getNoBdofConstraintFlag()371 bool getNoBdofConstraintFlag() const { return m_noBdofConstraintFlag; } setNoBdofConstraintFlag(bool bVal)372 void setNoBdofConstraintFlag(bool bVal) { m_noBdofConstraintFlag = bVal; } getNoDmvrConstraintFlag()373 bool getNoDmvrConstraintFlag() const { return m_noDmvrConstraintFlag; } setNoDmvrConstraintFlag(bool bVal)374 void setNoDmvrConstraintFlag(bool bVal) { m_noDmvrConstraintFlag = bVal; } getNoCclmConstraintFlag()375 bool getNoCclmConstraintFlag() const { return m_noCclmConstraintFlag; } setNoCclmConstraintFlag(bool bVal)376 void setNoCclmConstraintFlag(bool bVal) { m_noCclmConstraintFlag = bVal; } getNoMtsConstraintFlag()377 bool getNoMtsConstraintFlag() const { return m_noMtsConstraintFlag; } setNoMtsConstraintFlag(bool bVal)378 void setNoMtsConstraintFlag(bool bVal) { m_noMtsConstraintFlag = bVal; } getNoSbtConstraintFlag()379 bool getNoSbtConstraintFlag() const { return m_noSbtConstraintFlag; } setNoSbtConstraintFlag(bool bVal)380 void setNoSbtConstraintFlag(bool bVal) { m_noSbtConstraintFlag = bVal; } getNoAffineMotionConstraintFlag()381 bool getNoAffineMotionConstraintFlag() const { return m_noAffineMotionConstraintFlag; } setNoAffineMotionConstraintFlag(bool bVal)382 void setNoAffineMotionConstraintFlag(bool bVal) { m_noAffineMotionConstraintFlag = bVal; } getNoBcwConstraintFlag()383 bool getNoBcwConstraintFlag() const { return m_noBcwConstraintFlag; } setNoBcwConstraintFlag(bool bVal)384 void setNoBcwConstraintFlag(bool bVal) { m_noBcwConstraintFlag = bVal; } getNoIbcConstraintFlag()385 bool getNoIbcConstraintFlag() const { return m_noIbcConstraintFlag; } setNoIbcConstraintFlag(bool bVal)386 void setNoIbcConstraintFlag(bool bVal) { m_noIbcConstraintFlag = bVal; } getNoCiipConstraintFlag()387 bool getNoCiipConstraintFlag() const { return m_noCiipConstraintFlag; } setNoCiipConstraintFlag(bool bVal)388 void setNoCiipConstraintFlag(bool bVal) { m_noCiipConstraintFlag = bVal; } getNoGeoConstraintFlag()389 bool getNoGeoConstraintFlag() const { return m_noGeoConstraintFlag; } setNoGeoConstraintFlag(bool bVal)390 void setNoGeoConstraintFlag(bool bVal) { m_noGeoConstraintFlag = bVal; } getNoLadfConstraintFlag()391 bool getNoLadfConstraintFlag() const { return m_noLadfConstraintFlag; } setNoLadfConstraintFlag(bool bVal)392 void setNoLadfConstraintFlag(bool bVal) { m_noLadfConstraintFlag = bVal; } getNoTransformSkipConstraintFlag()393 bool getNoTransformSkipConstraintFlag() const { return m_noTransformSkipConstraintFlag; } setNoTransformSkipConstraintFlag(bool bVal)394 void setNoTransformSkipConstraintFlag(bool bVal) { m_noTransformSkipConstraintFlag = bVal; } getNoLumaTransformSize64ConstraintFlag()395 bool getNoLumaTransformSize64ConstraintFlag() const { return m_noLumaTransformSize64ConstraintFlag; } setNoLumaTransformSize64ConstraintFlag(bool bVal)396 void setNoLumaTransformSize64ConstraintFlag(bool bVal) { m_noLumaTransformSize64ConstraintFlag = bVal; } getNoBDPCMConstraintFlag()397 bool getNoBDPCMConstraintFlag() const { return m_noBDPCMConstraintFlag; } setNoBDPCMConstraintFlag(bool bVal)398 void setNoBDPCMConstraintFlag(bool bVal) { m_noBDPCMConstraintFlag = bVal; } getNoQpDeltaConstraintFlag()399 bool getNoQpDeltaConstraintFlag() const { return m_noQpDeltaConstraintFlag; } setNoQpDeltaConstraintFlag(bool bVal)400 void setNoQpDeltaConstraintFlag(bool bVal) { m_noQpDeltaConstraintFlag = bVal; } getNoDepQuantConstraintFlag()401 bool getNoDepQuantConstraintFlag() const { return m_noDepQuantConstraintFlag; } setNoDepQuantConstraintFlag(bool bVal)402 void setNoDepQuantConstraintFlag(bool bVal) { m_noDepQuantConstraintFlag = bVal; } getNoSignDataHidingConstraintFlag()403 bool getNoSignDataHidingConstraintFlag() const { return m_noSignDataHidingConstraintFlag; } setNoSignDataHidingConstraintFlag(bool bVal)404 void setNoSignDataHidingConstraintFlag(bool bVal) { m_noSignDataHidingConstraintFlag = bVal; } getNoMixedNaluTypesInPicConstraintFlag()405 bool getNoMixedNaluTypesInPicConstraintFlag() const { return m_noMixedNaluTypesInPicConstraintFlag; } setNoMixedNaluTypesInPicConstraintFlag(bool bVal)406 void setNoMixedNaluTypesInPicConstraintFlag(bool bVal) { m_noMixedNaluTypesInPicConstraintFlag = bVal; } getNoTrailConstraintFlag()407 bool getNoTrailConstraintFlag() const { return m_noTrailConstraintFlag; } setNoTrailConstraintFlag(bool bVal)408 void setNoTrailConstraintFlag(bool bVal) { m_noTrailConstraintFlag = bVal; } getNoStsaConstraintFlag()409 bool getNoStsaConstraintFlag() const { return m_noStsaConstraintFlag; } setNoStsaConstraintFlag(bool bVal)410 void setNoStsaConstraintFlag(bool bVal) { m_noStsaConstraintFlag = bVal; } getNoRaslConstraintFlag()411 bool getNoRaslConstraintFlag() const { return m_noRaslConstraintFlag; } setNoRaslConstraintFlag(bool bVal)412 void setNoRaslConstraintFlag(bool bVal) { m_noRaslConstraintFlag = bVal; } getNoRadlConstraintFlag()413 bool getNoRadlConstraintFlag() const { return m_noRadlConstraintFlag; } setNoRadlConstraintFlag(bool bVal)414 void setNoRadlConstraintFlag(bool bVal) { m_noRadlConstraintFlag = bVal; } getNoIdrConstraintFlag()415 bool getNoIdrConstraintFlag() const { return m_noIdrConstraintFlag; } setNoIdrConstraintFlag(bool bVal)416 void setNoIdrConstraintFlag(bool bVal) { m_noIdrConstraintFlag = bVal; } getNoCraConstraintFlag()417 bool getNoCraConstraintFlag() const { return m_noCraConstraintFlag; } setNoCraConstraintFlag(bool bVal)418 void setNoCraConstraintFlag(bool bVal) { m_noCraConstraintFlag = bVal; } getNoGdrConstraintFlag()419 bool getNoGdrConstraintFlag() const { return m_noGdrConstraintFlag; } setNoGdrConstraintFlag(bool bVal)420 void setNoGdrConstraintFlag(bool bVal) { m_noGdrConstraintFlag = bVal; } getNoApsConstraintFlag()421 bool getNoApsConstraintFlag() const { return m_noApsConstraintFlag; } setNoApsConstraintFlag(bool bVal)422 void setNoApsConstraintFlag(bool bVal) { m_noApsConstraintFlag = bVal; } 423 424 friend bool operator == (const ConstraintInfo& op1, const ConstraintInfo& op2); 425 friend bool operator != (const ConstraintInfo& op1, const ConstraintInfo& op2); 426 }; 427 428 class ProfileTierLevel 429 { 430 Tier m_tierFlag = Tier::MAIN; 431 Profile::Name m_profileIdc = Profile::NONE; 432 uint8_t m_numSubProfile = 0; 433 std::vector<uint32_t> m_subProfileIdc; 434 vvdecLevel m_levelIdc = vvdecLevel::VVDEC_LEVEL_NONE; 435 bool m_frameOnlyConstraintFlag = true; 436 bool m_multiLayerEnabledFlag = false; 437 ConstraintInfo m_constraintInfo; 438 bool m_subLayerLevelPresentFlag[MAX_TLAYER - 1]; // init in constructor 439 vvdecLevel m_subLayerLevelIdc[MAX_TLAYER]; // init in constructor 440 441 public: ProfileTierLevel()442 ProfileTierLevel() 443 { 444 ::memset( m_subLayerLevelPresentFlag, 0, sizeof( m_subLayerLevelPresentFlag ) ); 445 ::memset( m_subLayerLevelIdc, vvdecLevel::VVDEC_LEVEL_NONE, sizeof( m_subLayerLevelIdc ) ); 446 } 447 getTierFlag()448 Tier getTierFlag() const { return m_tierFlag; } setTierFlag(Tier x)449 void setTierFlag(Tier x) { m_tierFlag = x; } 450 getProfileIdc()451 Profile::Name getProfileIdc() const { return m_profileIdc; } setProfileIdc(Profile::Name x)452 void setProfileIdc(Profile::Name x) { m_profileIdc = x; } 453 getNumSubProfile()454 uint8_t getNumSubProfile() const { return m_numSubProfile; } setNumSubProfile(uint8_t x)455 void setNumSubProfile(uint8_t x) { m_numSubProfile = x; m_subProfileIdc.resize(m_numSubProfile); } 456 getSubProfileIdc(int i)457 uint32_t getSubProfileIdc(int i) const { return m_subProfileIdc[i]; } setSubProfileIdc(int i,uint32_t x)458 void setSubProfileIdc(int i, uint32_t x) { m_subProfileIdc[i] = x; } 459 getLevelIdc()460 vvdecLevel getLevelIdc() const { return m_levelIdc; } setLevelIdc(vvdecLevel x)461 void setLevelIdc(vvdecLevel x) { m_levelIdc = x; } 462 getFrameOnlyConstraintFlag()463 bool getFrameOnlyConstraintFlag() const { return m_frameOnlyConstraintFlag; } setFrameOnlyConstraintFlag(bool x)464 void setFrameOnlyConstraintFlag(bool x) { m_frameOnlyConstraintFlag = x; } 465 getMultiLayerEnabledFlag()466 bool getMultiLayerEnabledFlag() const { return m_multiLayerEnabledFlag; } setMultiLayerEnabledFlag(bool x)467 void setMultiLayerEnabledFlag(bool x) { m_multiLayerEnabledFlag = x; } 468 getConstraintInfo()469 ConstraintInfo* getConstraintInfo() { return &m_constraintInfo; } getConstraintInfo()470 const ConstraintInfo* getConstraintInfo() const { return &m_constraintInfo; } 471 getSubLayerLevelPresentFlag(int i)472 bool getSubLayerLevelPresentFlag(int i) const { return m_subLayerLevelPresentFlag[i]; } setSubLayerLevelPresentFlag(int i,bool x)473 void setSubLayerLevelPresentFlag(int i, bool x) { m_subLayerLevelPresentFlag[i] = x; } 474 getSubLayerLevelIdc(int i)475 vvdecLevel getSubLayerLevelIdc(int i) const { return m_subLayerLevelIdc[i]; } setSubLayerLevelIdc(int i,vvdecLevel x)476 void setSubLayerLevelIdc(int i, vvdecLevel x) { m_subLayerLevelIdc[i] = x; } 477 478 friend bool operator == (const ProfileTierLevel& op1, const ProfileTierLevel& op2); 479 friend bool operator != (const ProfileTierLevel& op1, const ProfileTierLevel& op2); 480 }; 481 482 struct HrdSubLayerInfo 483 { 484 bool fixedPicRateFlag; 485 bool fixedPicRateWithinCvsFlag; 486 uint32_t picDurationInTcMinus1; 487 bool lowDelayHrdFlag; 488 uint32_t cpbCntMinus1; 489 uint32_t bitRateValueMinus1[MAX_CPB_CNT][2]; 490 uint32_t cpbSizeValue [MAX_CPB_CNT][2]; 491 uint32_t ducpbSizeValue [MAX_CPB_CNT][2]; 492 bool cbrFlag [MAX_CPB_CNT][2]; 493 uint32_t duBitRateValue [MAX_CPB_CNT][2]; 494 }; 495 496 class SliceReshapeInfo 497 { 498 public: 499 bool sliceReshaperEnableFlag; 500 bool sliceReshaperModelPresentFlag; 501 unsigned enableChromaAdj; 502 uint32_t reshaperModelMinBinIdx; 503 uint32_t reshaperModelMaxBinIdx; 504 int reshaperModelBinCWDelta[PIC_CODE_CW_BINS]; 505 int maxNbitsNeededDeltaCW; 506 int chrResScalingOffset; 507 }; 508 509 struct ReshapeCW 510 { 511 std::vector<uint32_t> binCW; 512 int rspPicSize; 513 int rspIntraPeriod; 514 int rspFps; 515 int rspBaseQP; 516 int rspTid; 517 int rspSliceQP; 518 int rspFpsToIp; 519 }; 520 521 template<class T> 522 struct BasePS: public std::enable_shared_from_this<T> 523 { getSharedPtrBasePS524 std::shared_ptr<T> getSharedPtr() 525 { 526 return (static_cast<T*>(this))->shared_from_this(); 527 } getSharedPtrBasePS528 std::shared_ptr<const T> getSharedPtr() const 529 { 530 return (static_cast<const T*>(this))->shared_from_this(); 531 } 532 clearChangedFlagBasePS533 void clearChangedFlag() 534 { 535 m_changedFlag = false; 536 } 537 getChangedFlagBasePS538 bool getChangedFlag() const 539 { 540 return m_changedFlag; 541 } 542 543 bool m_changedFlag = false; 544 545 template<class Tf, int MAX_ID> friend class ParameterSetMap; 546 }; 547 548 class DCI 549 { 550 private: 551 int m_maxSubLayersMinus1; 552 std::vector<ProfileTierLevel> m_profileTierLevel; 553 554 public: DCI()555 DCI() 556 : m_maxSubLayersMinus1(0) 557 {}; 558 ~DCI()559 virtual ~DCI() {}; 560 getMaxSubLayersMinus1()561 int getMaxSubLayersMinus1() const { return m_maxSubLayersMinus1; } setMaxSubLayersMinus1(int val)562 void setMaxSubLayersMinus1(int val) { m_maxSubLayersMinus1 = val; } 563 getNumPTLs()564 size_t getNumPTLs() const { return m_profileTierLevel.size(); } setProfileTierLevel(const std::vector<ProfileTierLevel> & val)565 void setProfileTierLevel(const std::vector<ProfileTierLevel>& val) { m_profileTierLevel = val; } getProfileTierLevel(int idx)566 const ProfileTierLevel& getProfileTierLevel(int idx) const { return m_profileTierLevel[idx]; } IsIndenticalDCI(const DCI & comparedDCI)567 bool IsIndenticalDCI(const DCI& comparedDCI) const 568 { 569 if(m_maxSubLayersMinus1 != comparedDCI.m_maxSubLayersMinus1) return false; 570 if(m_profileTierLevel != comparedDCI.m_profileTierLevel) return false; 571 return true; 572 } 573 }; 574 575 class OlsHrdParams 576 { 577 private: 578 bool m_fixedPicRateGeneralFlag = false; 579 bool m_fixedPicRateWithinCvsFlag = false; 580 uint32_t m_elementDurationInTcMinus1 = false; 581 bool m_lowDelayHrdFlag = false; 582 583 uint32_t m_bitRateValueMinus1[MAX_CPB_CNT][2]; 584 uint32_t m_cpbSizeValueMinus1[MAX_CPB_CNT][2]; 585 uint32_t m_ducpbSizeValueMinus1[MAX_CPB_CNT][2]; 586 uint32_t m_duBitRateValueMinus1[MAX_CPB_CNT][2]; 587 bool m_cbrFlag[MAX_CPB_CNT][2]; 588 public: 589 // OlsHrdParams(); 590 // virtual ~OlsHrdParams(); 591 setFixedPicRateGeneralFlag(bool flag)592 void setFixedPicRateGeneralFlag(bool flag) { m_fixedPicRateGeneralFlag = flag; } getFixedPicRateGeneralFlag()593 bool getFixedPicRateGeneralFlag() const { return m_fixedPicRateGeneralFlag; } setFixedPicRateWithinCvsFlag(bool flag)594 void setFixedPicRateWithinCvsFlag(bool flag) { m_fixedPicRateWithinCvsFlag = flag; } getFixedPicRateWithinCvsFlag()595 bool getFixedPicRateWithinCvsFlag() const { return m_fixedPicRateWithinCvsFlag; } setElementDurationInTcMinus1(uint32_t value)596 void setElementDurationInTcMinus1(uint32_t value) { m_elementDurationInTcMinus1 = value; } getElementDurationInTcMinus1()597 uint32_t getElementDurationInTcMinus1() const { return m_elementDurationInTcMinus1; } setLowDelayHrdFlag(bool flag)598 void setLowDelayHrdFlag(bool flag) { m_lowDelayHrdFlag = flag; } getLowDelayHrdFlag()599 bool getLowDelayHrdFlag() const { return m_lowDelayHrdFlag; } setBitRateValueMinus1(int cpbcnt,int nalOrVcl,uint32_t value)600 void setBitRateValueMinus1(int cpbcnt, int nalOrVcl, uint32_t value) { m_bitRateValueMinus1[cpbcnt][nalOrVcl] = value; } getBitRateValueMinus1(int cpbcnt,int nalOrVcl)601 uint32_t getBitRateValueMinus1(int cpbcnt, int nalOrVcl) const { return m_bitRateValueMinus1[cpbcnt][nalOrVcl]; } 602 setCpbSizeValueMinus1(int cpbcnt,int nalOrVcl,uint32_t value)603 void setCpbSizeValueMinus1(int cpbcnt, int nalOrVcl, uint32_t value) { m_cpbSizeValueMinus1[cpbcnt][nalOrVcl] = value; } getCpbSizeValueMinus1(int cpbcnt,int nalOrVcl)604 uint32_t getCpbSizeValueMinus1(int cpbcnt, int nalOrVcl) const { return m_cpbSizeValueMinus1[cpbcnt][nalOrVcl]; } setDuCpbSizeValueMinus1(int cpbcnt,int nalOrVcl,uint32_t value)605 void setDuCpbSizeValueMinus1(int cpbcnt, int nalOrVcl, uint32_t value) { m_ducpbSizeValueMinus1[cpbcnt][nalOrVcl] = value; } getDuCpbSizeValueMinus1(int cpbcnt,int nalOrVcl)606 uint32_t getDuCpbSizeValueMinus1(int cpbcnt, int nalOrVcl) const { return m_ducpbSizeValueMinus1[cpbcnt][nalOrVcl]; } setDuBitRateValueMinus1(int cpbcnt,int nalOrVcl,uint32_t value)607 void setDuBitRateValueMinus1(int cpbcnt, int nalOrVcl, uint32_t value) { m_duBitRateValueMinus1[cpbcnt][nalOrVcl] = value; } getDuBitRateValueMinus1(int cpbcnt,int nalOrVcl)608 uint32_t getDuBitRateValueMinus1(int cpbcnt, int nalOrVcl) const { return m_duBitRateValueMinus1[cpbcnt][nalOrVcl]; } setCbrFlag(int cpbcnt,int nalOrVcl,bool value)609 void setCbrFlag(int cpbcnt, int nalOrVcl, bool value) { m_cbrFlag[cpbcnt][nalOrVcl] = value; } getCbrFlag(int cpbcnt,int nalOrVcl)610 bool getCbrFlag(int cpbcnt, int nalOrVcl) const { return m_cbrFlag[cpbcnt][nalOrVcl]; } 611 }; 612 613 class GeneralHrdParams 614 { 615 private: 616 uint32_t m_numUnitsInTick = 0; 617 uint32_t m_timeScale = 0; 618 bool m_generalNalHrdParamsPresentFlag = 0; 619 bool m_generalVclHrdParamsPresentFlag = 0; 620 bool m_generalSamePicTimingInAllOlsFlag = false; 621 uint32_t m_tickDivisorMinus2 = 0; 622 bool m_generalDecodingUnitHrdParamsPresentFlag = false; 623 uint32_t m_bitRateScale = 0; 624 uint32_t m_cpbSizeScale = 0; 625 uint32_t m_cpbSizeDuScale = 0; 626 uint32_t m_hrdCpbCntMinus1 = 0; 627 628 public: 629 // GeneralHrdParams() 630 // :m_generalNalHrdParamsPresentFlag(false) 631 // ,m_generalVclHrdParamsPresentFlag(false) 632 // ,m_generalSamePicTimingInAllOlsFlag(true) 633 // ,m_tickDivisorMinus2 (0) 634 // ,m_generalDecodingUnitHrdParamsPresentFlag (false) 635 // ,m_bitRateScale (0) 636 // ,m_cpbSizeScale (0) 637 // ,m_cpbSizeDuScale (0) 638 // ,m_hrdCpbCntMinus1(0) 639 // {} 640 bool operator==(const GeneralHrdParams& other) const 641 { 642 return (m_numUnitsInTick == other.m_numUnitsInTick 643 && m_timeScale == other.m_timeScale 644 && m_generalNalHrdParamsPresentFlag == other.m_generalNalHrdParamsPresentFlag 645 && m_generalVclHrdParamsPresentFlag == other.m_generalVclHrdParamsPresentFlag 646 && m_generalSamePicTimingInAllOlsFlag == other.m_generalSamePicTimingInAllOlsFlag 647 && m_generalDecodingUnitHrdParamsPresentFlag == other.m_generalDecodingUnitHrdParamsPresentFlag 648 && (m_generalDecodingUnitHrdParamsPresentFlag ? (m_tickDivisorMinus2 == other.m_tickDivisorMinus2): 1) 649 && m_bitRateScale == other.m_bitRateScale 650 && m_cpbSizeScale == other.m_cpbSizeScale 651 && (m_generalDecodingUnitHrdParamsPresentFlag ? (m_cpbSizeDuScale == other.m_cpbSizeDuScale) : 1) 652 && m_hrdCpbCntMinus1 == other.m_hrdCpbCntMinus1 653 ); 654 } 655 656 GeneralHrdParams& operator=(const GeneralHrdParams& input) 657 { 658 m_numUnitsInTick = input.m_numUnitsInTick; 659 m_timeScale = input.m_timeScale; 660 m_generalNalHrdParamsPresentFlag = input.m_generalNalHrdParamsPresentFlag; 661 m_generalVclHrdParamsPresentFlag = input.m_generalVclHrdParamsPresentFlag; 662 m_generalSamePicTimingInAllOlsFlag = input.m_generalSamePicTimingInAllOlsFlag; 663 m_generalDecodingUnitHrdParamsPresentFlag = input.m_generalDecodingUnitHrdParamsPresentFlag; 664 if (input.m_generalDecodingUnitHrdParamsPresentFlag) 665 { 666 m_tickDivisorMinus2 = input.m_tickDivisorMinus2; 667 } 668 m_bitRateScale = input.m_bitRateScale; 669 m_cpbSizeScale = input.m_cpbSizeScale; 670 if (input.m_generalDecodingUnitHrdParamsPresentFlag) 671 { 672 m_cpbSizeDuScale = input.m_cpbSizeDuScale; 673 } 674 m_hrdCpbCntMinus1 = input.m_hrdCpbCntMinus1; 675 return *this; 676 } 677 // virtual ~GeneralHrdParams() {} setNumUnitsInTick(uint32_t value)678 void setNumUnitsInTick(uint32_t value) { m_numUnitsInTick = value; } getNumUnitsInTick()679 uint32_t getNumUnitsInTick() const { return m_numUnitsInTick; } 680 setTimeScale(uint32_t value)681 void setTimeScale(uint32_t value) { m_timeScale = value; } getTimeScale()682 uint32_t getTimeScale() const { return m_timeScale; } 683 setGeneralNalHrdParametersPresentFlag(bool flag)684 void setGeneralNalHrdParametersPresentFlag(bool flag) { m_generalNalHrdParamsPresentFlag = flag; } getGeneralNalHrdParametersPresentFlag()685 bool getGeneralNalHrdParametersPresentFlag() const { return m_generalNalHrdParamsPresentFlag; } 686 setGeneralVclHrdParametersPresentFlag(bool flag)687 void setGeneralVclHrdParametersPresentFlag(bool flag) { m_generalVclHrdParamsPresentFlag = flag; } getGeneralVclHrdParametersPresentFlag()688 bool getGeneralVclHrdParametersPresentFlag() const { return m_generalVclHrdParamsPresentFlag; } 689 setGeneralSamePicTimingInAllOlsFlag(bool flag)690 void setGeneralSamePicTimingInAllOlsFlag(bool flag) { m_generalSamePicTimingInAllOlsFlag = flag; } getGeneralSamePicTimingInAllOlsFlag()691 bool getGeneralSamePicTimingInAllOlsFlag() const { return m_generalSamePicTimingInAllOlsFlag; } 692 693 setTickDivisorMinus2(uint32_t value)694 void setTickDivisorMinus2( uint32_t value ) { m_tickDivisorMinus2 = value; } getTickDivisorMinus2()695 uint32_t getTickDivisorMinus2( ) const { return m_tickDivisorMinus2; } 696 697 setGeneralDecodingUnitHrdParamsPresentFlag(bool flag)698 void setGeneralDecodingUnitHrdParamsPresentFlag( bool flag) { m_generalDecodingUnitHrdParamsPresentFlag = flag; } getGeneralDecodingUnitHrdParamsPresentFlag()699 bool getGeneralDecodingUnitHrdParamsPresentFlag( ) const { return m_generalDecodingUnitHrdParamsPresentFlag; } 700 setBitRateScale(uint32_t value)701 void setBitRateScale( uint32_t value ) { m_bitRateScale = value; } getBitRateScale()702 uint32_t getBitRateScale( ) const { return m_bitRateScale; } 703 setCpbSizeScale(uint32_t value)704 void setCpbSizeScale( uint32_t value ) { m_cpbSizeScale = value; } getCpbSizeScale()705 uint32_t getCpbSizeScale( ) const { return m_cpbSizeScale; } setCpbSizeDuScale(uint32_t value)706 void setCpbSizeDuScale( uint32_t value ) { m_cpbSizeDuScale = value; } getCpbSizeDuScale()707 uint32_t getCpbSizeDuScale( ) const { return m_cpbSizeDuScale; } 708 setHrdCpbCntMinus1(uint32_t value)709 void setHrdCpbCntMinus1(uint32_t value) { m_hrdCpbCntMinus1 = value; } getHrdCpbCntMinus1()710 uint32_t getHrdCpbCntMinus1() const { return m_hrdCpbCntMinus1; } 711 }; 712 713 class HRD 714 { 715 public: HRD()716 HRD() 717 :m_bufferingPeriodInitialized (false) 718 , m_pictureTimingAvailable (false) 719 {}; 720 ~HRD()721 virtual ~HRD() 722 {}; setGeneralHrdParameters(GeneralHrdParams & generalHrdParam)723 void setGeneralHrdParameters(GeneralHrdParams &generalHrdParam) { m_generalHrdParams = generalHrdParam; } getGeneralHrdParameters()724 GeneralHrdParams getGeneralHrdParameters() const { return m_generalHrdParams; } getGeneralHrdParameters()725 const GeneralHrdParams& getGeneralHrdParameters() { return m_generalHrdParams; } 726 setOlsHrdParameters(int tLayter,OlsHrdParams & olsHrdParam)727 void setOlsHrdParameters(int tLayter, OlsHrdParams &olsHrdParam) { m_olsHrdParams[tLayter] = olsHrdParam; } getOlsHrdParameters()728 OlsHrdParams getOlsHrdParameters() { return m_olsHrdParams[0]; } getOlsHrdParametersAddr()729 OlsHrdParams* getOlsHrdParametersAddr() { return &m_olsHrdParams[0]; } getOlsHrdParameters()730 const OlsHrdParams& getOlsHrdParameters() const { return m_olsHrdParams[0]; } 731 732 setBufferingPeriodSEI(const vvdecSEIBufferingPeriod * bp)733 void setBufferingPeriodSEI(const vvdecSEIBufferingPeriod* bp) { m_bufferingPeriodSEI = *bp; m_bufferingPeriodInitialized = true; } getBufferingPeriodSEI()734 const vvdecSEIBufferingPeriod* getBufferingPeriodSEI() const { return m_bufferingPeriodInitialized ? &m_bufferingPeriodSEI : nullptr; } 735 setPictureTimingSEI(const vvdecSEIPictureTiming * pt)736 void setPictureTimingSEI(const vvdecSEIPictureTiming* pt) { m_pictureTimingSEI = *pt; m_pictureTimingAvailable = true; } getPictureTimingSEI()737 const vvdecSEIPictureTiming* getPictureTimingSEI() const { return m_pictureTimingAvailable ? &m_pictureTimingSEI : nullptr; } 738 739 protected: 740 GeneralHrdParams m_generalHrdParams; 741 OlsHrdParams m_olsHrdParams[MAX_TLAYER]; 742 bool m_bufferingPeriodInitialized; 743 vvdecSEIBufferingPeriod m_bufferingPeriodSEI; 744 bool m_pictureTimingAvailable; 745 vvdecSEIPictureTiming m_pictureTimingSEI; 746 747 }; 748 749 750 class TimingInfo 751 { 752 bool m_timingInfoPresentFlag = false; 753 uint32_t m_numUnitsInTick = 1001; 754 uint32_t m_timeScale = 60000; 755 bool m_pocProportionalToTimingFlag = false; 756 int m_numTicksPocDiffOneMinus1 = 0; 757 public: 758 setTimingInfoPresentFlag(bool flag)759 void setTimingInfoPresentFlag( bool flag ) { m_timingInfoPresentFlag = flag; } getTimingInfoPresentFlag()760 bool getTimingInfoPresentFlag( ) const { return m_timingInfoPresentFlag; } 761 setNumUnitsInTick(uint32_t value)762 void setNumUnitsInTick( uint32_t value ) { m_numUnitsInTick = value; } getNumUnitsInTick()763 uint32_t getNumUnitsInTick( ) const { return m_numUnitsInTick; } 764 setTimeScale(uint32_t value)765 void setTimeScale( uint32_t value ) { m_timeScale = value; } getTimeScale()766 uint32_t getTimeScale( ) const { return m_timeScale; } 767 setPocProportionalToTimingFlag(bool x)768 void setPocProportionalToTimingFlag(bool x) { m_pocProportionalToTimingFlag = x; } getPocProportionalToTimingFlag()769 bool getPocProportionalToTimingFlag( ) const { return m_pocProportionalToTimingFlag; } 770 setNumTicksPocDiffOneMinus1(int x)771 void setNumTicksPocDiffOneMinus1(int x) { m_numTicksPocDiffOneMinus1 = x; } getNumTicksPocDiffOneMinus1()772 int getNumTicksPocDiffOneMinus1( ) const { return m_numTicksPocDiffOneMinus1; } 773 }; 774 775 struct ChromaQpAdj 776 { 777 union 778 { 779 struct { 780 int CbOffset; 781 int CrOffset; 782 int JointCbCrOffset; 783 } comp; 784 int offset[3]; 785 } u; 786 }; 787 788 struct ChromaQpMappingTableParams { 789 int m_qpBdOffset; 790 bool m_sameCQPTableForAllChromaFlag; 791 int m_numQpTables; 792 int m_qpTableStartMinus26[MAX_NUM_CQP_MAPPING_TABLES]; 793 int m_numPtsInCQPTableMinus1[MAX_NUM_CQP_MAPPING_TABLES]; 794 std::vector<int> m_deltaQpInValMinus1[MAX_NUM_CQP_MAPPING_TABLES]; 795 std::vector<int> m_deltaQpOutVal[MAX_NUM_CQP_MAPPING_TABLES]; 796 ChromaQpMappingTableParamsChromaQpMappingTableParams797 ChromaQpMappingTableParams() 798 { 799 m_qpBdOffset = 12; 800 m_sameCQPTableForAllChromaFlag = true; 801 m_numQpTables = 1; 802 m_numPtsInCQPTableMinus1[0] = 0; 803 m_qpTableStartMinus26[0] = 0; 804 m_deltaQpInValMinus1[0] = { 0 }; 805 m_deltaQpOutVal[0] = { 0 }; 806 } 807 setSameCQPTableForAllChromaFlagChromaQpMappingTableParams808 void setSameCQPTableForAllChromaFlag(bool b) { m_sameCQPTableForAllChromaFlag = b; } getSameCQPTableForAllChromaFlagChromaQpMappingTableParams809 bool getSameCQPTableForAllChromaFlag() const { return m_sameCQPTableForAllChromaFlag; } setNumQpTablesChromaQpMappingTableParams810 void setNumQpTables(int n) { m_numQpTables = n; } getNumQpTablesChromaQpMappingTableParams811 int getNumQpTables() const { return m_numQpTables; } setQpTableStartMinus26ChromaQpMappingTableParams812 void setQpTableStartMinus26(int tableIdx, int n) { m_qpTableStartMinus26[tableIdx] = n; } getQpTableStartMinus26ChromaQpMappingTableParams813 int getQpTableStartMinus26(int tableIdx) const { return m_qpTableStartMinus26[tableIdx]; } setNumPtsInCQPTableMinus1ChromaQpMappingTableParams814 void setNumPtsInCQPTableMinus1(int tableIdx, int n) { m_numPtsInCQPTableMinus1[tableIdx] = n; } getNumPtsInCQPTableMinus1ChromaQpMappingTableParams815 int getNumPtsInCQPTableMinus1(int tableIdx) const { return m_numPtsInCQPTableMinus1[tableIdx]; } setDeltaQpInValMinus1ChromaQpMappingTableParams816 void setDeltaQpInValMinus1(int tableIdx, std::vector<int> &inVals) { m_deltaQpInValMinus1[tableIdx] = inVals; } setDeltaQpInValMinus1ChromaQpMappingTableParams817 void setDeltaQpInValMinus1(int tableIdx, int idx, int n) { m_deltaQpInValMinus1[tableIdx][idx] = n; } getDeltaQpInValMinus1ChromaQpMappingTableParams818 int getDeltaQpInValMinus1(int tableIdx, int idx) const { return m_deltaQpInValMinus1[tableIdx][idx]; } setDeltaQpOutValChromaQpMappingTableParams819 void setDeltaQpOutVal(int tableIdx, std::vector<int> &outVals) { m_deltaQpOutVal[tableIdx] = outVals; } setDeltaQpOutValChromaQpMappingTableParams820 void setDeltaQpOutVal(int tableIdx, int idx, int n) { m_deltaQpOutVal[tableIdx][idx] = n; } getDeltaQpOutValChromaQpMappingTableParams821 int getDeltaQpOutVal(int tableIdx, int idx) const { return m_deltaQpOutVal[tableIdx][idx]; } 822 }; 823 struct ChromaQpMappingTable : ChromaQpMappingTableParams 824 { 825 std::vector<int> m_chromaQpMappingTables[MAX_NUM_CQP_MAPPING_TABLES]; 826 getMappedChromaQpValueChromaQpMappingTable827 int getMappedChromaQpValue(ComponentID compID, const int qpVal) const { return m_chromaQpMappingTables[m_sameCQPTableForAllChromaFlag ? 0 : (int)compID - 1].at(qpVal + m_qpBdOffset); } 828 void derivedChromaQPMappingTables(); 829 void setParams(const ChromaQpMappingTableParams ¶ms, const int qpBdOffset); 830 }; 831 832 class SliceMap 833 { 834 private: 835 uint32_t m_sliceID = 0; //!< slice identifier (slice index for rectangular slices, slice address for raser-scan slices) 836 uint32_t m_numTilesInSlice = 0; //!< number of tiles in slice (raster-scan slices only) 837 uint32_t m_numCtuInSlice = 0; //!< number of CTUs in the slice 838 std::vector<uint32_t> m_ctuAddrInSlice; //!< raster-scan addresses of all the CTUs in the slice 839 840 public: 841 SliceMap(); 842 virtual ~SliceMap(); 843 setSliceID(uint32_t u)844 void setSliceID( uint32_t u ) { m_sliceID = u; } getSliceID()845 uint32_t getSliceID() const { return m_sliceID; } setNumTilesInSlice(uint32_t u)846 void setNumTilesInSlice( uint32_t u ) { m_numTilesInSlice = u; } getNumTilesInSlice()847 uint32_t getNumTilesInSlice() const { return m_numTilesInSlice; } setNumCtuInSlice(uint32_t u)848 void setNumCtuInSlice( uint32_t u ) { m_numCtuInSlice = u; } getNumCtuInSlice()849 uint32_t getNumCtuInSlice() const { return m_numCtuInSlice; } getCtuAddrList()850 std::vector<uint32_t> getCtuAddrList( ) const { return m_ctuAddrInSlice; } getCtuAddrInSlice(int idx)851 uint32_t getCtuAddrInSlice( int idx ) const { CHECK(idx >= m_ctuAddrInSlice.size(), "CTU index exceeds number of CTUs in slice."); return m_ctuAddrInSlice[idx]; } pushToCtuAddrInSlice(uint32_t u)852 void pushToCtuAddrInSlice( uint32_t u ) { m_ctuAddrInSlice.push_back(u); m_numCtuInSlice++;} 853 initSliceMap()854 void initSliceMap() 855 { 856 m_sliceID = 0; 857 m_numTilesInSlice = 0; 858 m_numCtuInSlice = 0; 859 m_ctuAddrInSlice.clear(); 860 } 861 addCtusToSlice(uint32_t startX,uint32_t stopX,uint32_t startY,uint32_t stopY,uint32_t picWidthInCtbsY)862 void addCtusToSlice( uint32_t startX, uint32_t stopX, uint32_t startY, uint32_t stopY, uint32_t picWidthInCtbsY ) 863 { 864 CHECK( startX >= stopX || startY >= stopY, "Invalid slice definition"); 865 for( uint32_t ctbY = startY; ctbY < stopY; ctbY++ ) 866 { 867 for( uint32_t ctbX = startX; ctbX < stopX; ctbX++ ) 868 { 869 m_ctuAddrInSlice.push_back( ctbY * picWidthInCtbsY + ctbX ); 870 m_numCtuInSlice++; 871 } 872 } 873 } 874 }; 875 876 class RectSlice 877 { 878 private: 879 uint32_t m_tileIdx = 0; //!< tile index corresponding to the first CTU in the slice 880 uint32_t m_sliceWidthInTiles = 0; //!< slice width in units of tiles 881 uint32_t m_sliceHeightInTiles = 0; //!< slice height in units of tiles 882 uint32_t m_numSlicesInTile = 0; //!< number of slices in current tile for the special case of multiple slices inside a single tile 883 uint32_t m_sliceHeightInCtu = 0; //!< slice height in units of CTUs for the special case of multiple slices inside a single tile 884 885 public: 886 RectSlice() = default; 887 ~RectSlice() = default; 888 setSliceWidthInTiles(uint32_t u)889 void setSliceWidthInTiles( uint32_t u ) { m_sliceWidthInTiles = u; } getSliceWidthInTiles()890 uint32_t getSliceWidthInTiles( ) const { return m_sliceWidthInTiles; } setSliceHeightInTiles(uint32_t u)891 void setSliceHeightInTiles( uint32_t u ) { m_sliceHeightInTiles = u; } getSliceHeightInTiles()892 uint32_t getSliceHeightInTiles( ) const { return m_sliceHeightInTiles; } setNumSlicesInTile(uint32_t u)893 void setNumSlicesInTile( uint32_t u ) { m_numSlicesInTile = u; } getNumSlicesInTile()894 uint32_t getNumSlicesInTile( ) const { return m_numSlicesInTile; } setSliceHeightInCtu(uint32_t u)895 void setSliceHeightInCtu( uint32_t u ) { m_sliceHeightInCtu = u; } getSliceHeightInCtu()896 uint32_t getSliceHeightInCtu( ) const { return m_sliceHeightInCtu; } setTileIdx(uint32_t u)897 void setTileIdx( uint32_t u ) { m_tileIdx = u; } getTileIdx()898 uint32_t getTileIdx( ) const { return m_tileIdx; } 899 }; 900 901 class SubPic 902 { 903 private: 904 uint32_t m_subPicID = 0; //!< ID of subpicture 905 uint32_t m_subPicIdx = 0; //!< Index of subpicture 906 uint32_t m_numCTUsInSubPic = 0; //!< number of CTUs contained in this sub-picture 907 uint32_t m_subPicCtuTopLeftX = 0; //!< horizontal position of top left CTU of the subpicture in unit of CTU 908 uint32_t m_subPicCtuTopLeftY = 0; //!< vertical position of top left CTU of the subpicture in unit of CTU 909 uint32_t m_subPicWidth = 0; //!< the width of subpicture in units of CTU 910 uint32_t m_subPicHeight = 0; //!< the height of subpicture in units of CTU 911 uint32_t m_subPicWidthInLumaSample = 0; //!< the width of subpicture in units of luma sample 912 uint32_t m_subPicHeightInLumaSample = 0; //!< the height of subpicture in units of luma sample 913 uint32_t m_firstCtuInSubPic = 0; //!< the raster scan index of the first CTU in a subpicture 914 uint32_t m_lastCtuInSubPic = 0; //!< the raster scan index of the last CTU in a subpicture 915 uint32_t m_subPicLeft = 0; //!< the position of left boundary 916 uint32_t m_subPicRight = 0; //!< the position of right boundary 917 uint32_t m_subPicTop = 0; //!< the position of top boundary 918 uint32_t m_subPicBottom = 0; //!< the position of bottom boundary 919 std::vector<uint32_t> m_ctuAddrInSubPic; //!< raster scan addresses of all the CTUs in the slice 920 921 bool m_treatedAsPicFlag = false; //!< whether the subpicture is treated as a picture in the decoding process excluding in-loop filtering operations 922 bool m_loopFilterAcrossSubPicEnabledFlag = false; //!< whether in-loop filtering operations may be performed across the boundaries of the subpicture 923 uint32_t m_numSlicesInSubPic = 0; //!< Number of slices contained in this subpicture 924 925 public: 926 SubPic() = default; 927 ~SubPic() = default; 928 setSubPicID(uint32_t u)929 void setSubPicID (uint32_t u) { m_subPicID = u; } getSubPicID()930 uint32_t getSubPicID () const { return m_subPicID; } setSubPicIdx(uint32_t u)931 void setSubPicIdx (uint32_t u) { m_subPicIdx = u; } getSubPicIdx()932 uint32_t getSubPicIdx () const { return m_subPicIdx; } setNumCTUsInSubPic(uint32_t u)933 void setNumCTUsInSubPic (uint32_t u) { m_numCTUsInSubPic = u; } getNumCTUsInSubPic()934 uint32_t getNumCTUsInSubPic () const { return m_numCTUsInSubPic; } setSubPicCtuTopLeftX(uint32_t u)935 void setSubPicCtuTopLeftX (uint32_t u) { m_subPicCtuTopLeftX = u; } getSubPicCtuTopLeftX()936 uint32_t getSubPicCtuTopLeftX () const { return m_subPicCtuTopLeftX; } setSubPicCtuTopLeftY(uint32_t u)937 void setSubPicCtuTopLeftY (uint32_t u) { m_subPicCtuTopLeftY = u; } getSubPicCtuTopLeftY()938 uint32_t getSubPicCtuTopLeftY () const { return m_subPicCtuTopLeftY; } setSubPicWidthInCTUs(uint32_t u)939 void setSubPicWidthInCTUs (uint32_t u) { m_subPicWidth = u; } getSubPicWidthInCTUs()940 uint32_t getSubPicWidthInCTUs () const { return m_subPicWidth; } setSubPicHeightInCTUs(uint32_t u)941 void setSubPicHeightInCTUs(uint32_t u) { m_subPicHeight = u; } getSubPicHeightInCTUs()942 uint32_t getSubPicHeightInCTUs() const { return m_subPicHeight; } setFirstCTUInSubPic(uint32_t u)943 void setFirstCTUInSubPic (uint32_t u) { m_firstCtuInSubPic = u; } getFirstCTUInSubPic()944 uint32_t getFirstCTUInSubPic () const { return m_firstCtuInSubPic; } setLastCTUInSubPic(uint32_t u)945 void setLastCTUInSubPic (uint32_t u) { m_lastCtuInSubPic = u; } getLastCTUInSubPic()946 uint32_t getLastCTUInSubPic () const { return m_lastCtuInSubPic; } setSubPicLeft(uint32_t u)947 void setSubPicLeft (uint32_t u) { m_subPicLeft = u; } getSubPicLeft()948 uint32_t getSubPicLeft () const { return m_subPicLeft; } setSubPicRight(uint32_t u)949 void setSubPicRight (uint32_t u) { m_subPicRight = u; } getSubPicRight()950 uint32_t getSubPicRight () const { return m_subPicRight; } setSubPicTop(uint32_t u)951 void setSubPicTop (uint32_t u) { m_subPicTop = u; } getSubPicTop()952 uint32_t getSubPicTop () const { return m_subPicTop; } setSubPicBottom(uint32_t u)953 void setSubPicBottom (uint32_t u) { m_subPicBottom = u; } getSubPicBottom()954 uint32_t getSubPicBottom () const { return m_subPicBottom; } 955 setSubPicWidthInLumaSample(uint32_t u)956 void setSubPicWidthInLumaSample (uint32_t u) { m_subPicWidthInLumaSample = u; } getSubPicWidthInLumaSample()957 uint32_t getSubPicWidthInLumaSample() const { return m_subPicWidthInLumaSample; } setSubPicHeightInLumaSample(uint32_t u)958 void setSubPicHeightInLumaSample(uint32_t u) { m_subPicHeightInLumaSample = u; } getSubPicHeightInLumaSample()959 uint32_t getSubPicHeightInLumaSample() const { return m_subPicHeightInLumaSample; } 960 getArea()961 Area getArea() const { return Area( m_subPicLeft, m_subPicTop, m_subPicWidth, m_subPicHeight ); } getLumaArea()962