From 45b78dec7667b040c298f1b36747654cc14df354 Mon Sep 17 00:00:00 2001 From: Frank Bossen <fbossen@gmail.com> Date: Wed, 7 Feb 2024 16:59:43 -0500 Subject: [PATCH] Remove m_numRefLevels and rely on vector sizes instead --- source/Lib/CommonLib/SEI.cpp | 1 - source/Lib/CommonLib/SEI.h | 12 +++++++++--- source/Lib/DecoderLib/SEIread.cpp | 14 ++++++-------- source/Lib/EncoderLib/EncGOP.cpp | 2 +- source/Lib/EncoderLib/SEIEncoder.cpp | 15 +++++++-------- source/Lib/EncoderLib/SEIwrite.cpp | 13 +++---------- 6 files changed, 26 insertions(+), 31 deletions(-) diff --git a/source/Lib/CommonLib/SEI.cpp b/source/Lib/CommonLib/SEI.cpp index a4a7579063..1b8455ccf0 100644 --- a/source/Lib/CommonLib/SEI.cpp +++ b/source/Lib/CommonLib/SEI.cpp @@ -919,7 +919,6 @@ SEIContentColourVolume::SEIContentColourVolume(const SEIContentColourVolume& sei SEISubpictureLevelInfo::SEISubpictureLevelInfo(const SEISubpictureLevelInfo& sei) { - m_numRefLevels = sei.m_numRefLevels; m_explicitFractionPresentFlag = sei.m_explicitFractionPresentFlag; m_cbrConstraintFlag = sei.m_cbrConstraintFlag; m_numSubpics = sei.m_numSubpics; diff --git a/source/Lib/CommonLib/SEI.h b/source/Lib/CommonLib/SEI.h index 88a7fb601b..988df3aa91 100644 --- a/source/Lib/CommonLib/SEI.h +++ b/source/Lib/CommonLib/SEI.h @@ -1065,8 +1065,7 @@ class SEISubpictureLevelInfo : public SEI public: PayloadType payloadType() const { return PayloadType::SUBPICTURE_LEVEL_INFO; } SEISubpictureLevelInfo() - : m_numRefLevels(0) - , m_explicitFractionPresentFlag(false) + : m_explicitFractionPresentFlag(false) , m_cbrConstraintFlag(false) , m_numSubpics(0) , m_sliMaxSublayers(1) @@ -1075,7 +1074,6 @@ public: SEISubpictureLevelInfo(const SEISubpictureLevelInfo& sei); virtual ~SEISubpictureLevelInfo() {} - int m_numRefLevels; bool m_explicitFractionPresentFlag; bool m_cbrConstraintFlag; int m_numSubpics; @@ -1084,6 +1082,14 @@ public: std::vector<std::vector<int>> m_nonSubpicLayersFraction; std::vector<std::vector<Level::Name>> m_refLevelIdc; std::vector<std::vector<std::vector<int>>> m_refLevelFraction; + + void setNumRefLevels(const size_t n) + { + m_refLevelIdc.resize(n); + m_nonSubpicLayersFraction.resize(n); + m_refLevelFraction.resize(n); + } + uint32_t numRefLevels() const { return (uint32_t) m_refLevelIdc.size(); } }; class SEIManifest : public SEI diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp index 56a1000a6d..52f182b5de 100644 --- a/source/Lib/DecoderLib/SEIread.cpp +++ b/source/Lib/DecoderLib/SEIread.cpp @@ -2718,7 +2718,8 @@ void SEIReader::xParseSEISubpictureLevelInfo(SEISubpictureLevelInfo& sei, uint32 { output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize); uint32_t val; - sei_read_code( pDecodedMessageOutputStream, 3, val, "sli_num_ref_levels_minus1" ); sei.m_numRefLevels = val + 1; + sei_read_code(pDecodedMessageOutputStream, 3, val, "sli_num_ref_levels_minus1"); + sei.setNumRefLevels(val + 1); sei_read_flag( pDecodedMessageOutputStream, val, "sli_cbr_constraint_flag" ); sei.m_cbrConstraintFlag = val; sei_read_flag( pDecodedMessageOutputStream, val, "sli_explicit_fraction_present_flag" ); sei.m_explicitFractionPresentFlag = val; if (sei.m_explicitFractionPresentFlag) @@ -2732,10 +2733,8 @@ void SEIReader::xParseSEISubpictureLevelInfo(SEISubpictureLevelInfo& sei, uint32 } } - sei.m_refLevelIdc.resize(sei.m_numRefLevels); - sei.m_nonSubpicLayersFraction.resize(sei.m_numRefLevels); // sei parameters initialization - for (int i = 0; i < sei.m_numRefLevels; i++) + for (int i = 0; i < sei.numRefLevels(); i++) { sei.m_nonSubpicLayersFraction[i].resize(sei.m_sliMaxSublayers); sei.m_refLevelIdc[i].resize(sei.m_sliMaxSublayers); @@ -2746,8 +2745,7 @@ void SEIReader::xParseSEISubpictureLevelInfo(SEISubpictureLevelInfo& sei, uint32 } if (sei.m_explicitFractionPresentFlag) { - sei.m_refLevelFraction.resize(sei.m_numRefLevels); - for (int i = 0; i < sei.m_numRefLevels; i++) + for (int i = 0; i < sei.numRefLevels(); i++) { sei.m_refLevelFraction[i].resize(sei.m_numSubpics); for (int j = 0; j < sei.m_numSubpics; j++) @@ -2764,7 +2762,7 @@ void SEIReader::xParseSEISubpictureLevelInfo(SEISubpictureLevelInfo& sei, uint32 // parsing for (int k = sei.m_sliSublayerInfoPresentFlag ? 0 : sei.m_sliMaxSublayers - 1; k < sei.m_sliMaxSublayers; k++) { - for (int i = 0; i < sei.m_numRefLevels; i++) + for (int i = 0; i < sei.numRefLevels(); i++) { sei_read_code(pDecodedMessageOutputStream, 8, val, "sli_non_subpic_layers_fraction[i][k]"); sei.m_nonSubpicLayersFraction[i][k] = (Level::Name) val; sei_read_code(pDecodedMessageOutputStream, 8, val, "sli_ref_level_idc[i][k]"); sei.m_refLevelIdc[i][k] = (Level::Name) val; @@ -2784,7 +2782,7 @@ void SEIReader::xParseSEISubpictureLevelInfo(SEISubpictureLevelInfo& sei, uint32 { for (int k = sei.m_sliMaxSublayers - 2; k >= 0; k--) { - for (int i = 0; i < sei.m_numRefLevels; i++) + for (int i = 0; i < sei.numRefLevels(); i++) { sei.m_nonSubpicLayersFraction[i][k] = sei.m_nonSubpicLayersFraction[i][sei.m_sliMaxSublayers - 1]; sei.m_refLevelIdc[i][k] = sei.m_refLevelIdc[i][sei.m_sliMaxSublayers - 1]; diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index 55c5fe5b22..840894bfc6 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -1531,7 +1531,7 @@ static void validateMinCrRequirements(const ProfileTierLevelFeatures& plt, std:: const uint64_t maxLumaSr = plt.getTierLevelFeatures()->maxLumaSr; const double denomx1000x256 = 256 * plt.getMinCr() * pCfg->getFrameRate().getFloatVal() * 1000 * 256; - for (int i = 0; i < seiSubpic.m_numRefLevels; i++) + for (int i = 0; i < seiSubpic.numRefLevels(); i++) { Level::Name level = seiSubpic.m_refLevelIdc[i][layerId]; if (level != Level::LEVEL15_5) diff --git a/source/Lib/EncoderLib/SEIEncoder.cpp b/source/Lib/EncoderLib/SEIEncoder.cpp index 6544c906ad..14820a6b88 100644 --- a/source/Lib/EncoderLib/SEIEncoder.cpp +++ b/source/Lib/EncoderLib/SEIEncoder.cpp @@ -1287,14 +1287,14 @@ void SEIEncoder::initSEISubpictureLevelInfo(SEISubpictureLevelInfo* sei, const S sei->m_sliSublayerInfoPresentFlag = cfgSubPicLevel.m_sliSublayerInfoPresentFlag; sei->m_sliMaxSublayers = cfgSubPicLevel.m_sliMaxSublayers; - sei->m_numRefLevels = cfgSubPicLevel.m_sliSublayerInfoPresentFlag ? (int)cfgSubPicLevel.m_refLevels.size() / cfgSubPicLevel.m_sliMaxSublayers : (int)cfgSubPicLevel.m_refLevels.size(); + sei->setNumRefLevels(cfgSubPicLevel.m_sliSublayerInfoPresentFlag + ? (int) cfgSubPicLevel.m_refLevels.size() / cfgSubPicLevel.m_sliMaxSublayers + : (int) cfgSubPicLevel.m_refLevels.size()); sei->m_numSubpics = cfgSubPicLevel.m_numSubpictures; sei->m_explicitFractionPresentFlag = cfgSubPicLevel.m_explicitFraction; // sei parameters initialization - sei->m_nonSubpicLayersFraction.resize(sei->m_numRefLevels); - sei->m_refLevelIdc.resize(sei->m_numRefLevels); - for (int level = 0; level < sei->m_numRefLevels; level++) + for (int level = 0; level < sei->numRefLevels(); level++) { sei->m_nonSubpicLayersFraction[level].resize(sei->m_sliMaxSublayers); sei->m_refLevelIdc[level].resize(sei->m_sliMaxSublayers); @@ -1305,8 +1305,7 @@ void SEIEncoder::initSEISubpictureLevelInfo(SEISubpictureLevelInfo* sei, const S } if (sei->m_explicitFractionPresentFlag) { - sei->m_refLevelFraction.resize(sei->m_numRefLevels); - for (int level = 0; level < sei->m_numRefLevels; level++) + for (int level = 0; level < sei->numRefLevels(); level++) { sei->m_refLevelFraction[level].resize(sei->m_numSubpics); for (int subpic = 0; subpic < sei->m_numSubpics; subpic++) @@ -1323,7 +1322,7 @@ void SEIEncoder::initSEISubpictureLevelInfo(SEISubpictureLevelInfo* sei, const S // set sei parameters according to the configured values for (int sublayer = sei->m_sliSublayerInfoPresentFlag ? 0 : sei->m_sliMaxSublayers - 1, cnta = 0, cntb = 0; sublayer < sei->m_sliMaxSublayers; sublayer++) { - for (int level = 0; level < sei->m_numRefLevels; level++) + for (int level = 0; level < sei->numRefLevels(); level++) { sei->m_nonSubpicLayersFraction[level][sublayer] = cfgSubPicLevel.m_nonSubpicLayersFraction[cnta]; sei->m_refLevelIdc[level][sublayer] = cfgSubPicLevel.m_refLevels[cnta++]; @@ -1342,7 +1341,7 @@ void SEIEncoder::initSEISubpictureLevelInfo(SEISubpictureLevelInfo* sei, const S { for (int sublayer = sei->m_sliMaxSublayers - 2; sublayer >= 0; sublayer--) { - for (int level = 0; level < sei->m_numRefLevels; level++) + for (int level = 0; level < sei->numRefLevels(); level++) { sei->m_nonSubpicLayersFraction[level][sublayer] = sei->m_nonSubpicLayersFraction[level][sei->m_sliMaxSublayers - 1]; sei->m_refLevelIdc[level][sublayer] = sei->m_refLevelIdc[level][sei->m_sliMaxSublayers - 1]; diff --git a/source/Lib/EncoderLib/SEIwrite.cpp b/source/Lib/EncoderLib/SEIwrite.cpp index e51670dc28..8fd4cb5e5f 100644 --- a/source/Lib/EncoderLib/SEIwrite.cpp +++ b/source/Lib/EncoderLib/SEIwrite.cpp @@ -1329,15 +1329,8 @@ void SEIWriter::xWriteSEIDepthRepInfoElement( double f ) void SEIWriter::xWriteSEISubpictureLevelInfo(const SEISubpictureLevelInfo& sei) { - CHECK(sei.m_numRefLevels < 1, "SEISubpictureLevelInfo: numRefLevels must be greater than zero"); - CHECK(sei.m_numRefLevels != (int) sei.m_refLevelIdc.size(), - "SEISubpictureLevelInfo: numRefLevels must be equal to the number of levels"); - if (sei.m_explicitFractionPresentFlag) - { - CHECK(sei.m_numRefLevels != (int) sei.m_refLevelFraction.size(), - "SEISubpictureLevelInfo: numRefLevels must be equal to the number of fractions"); - } - xWriteCode( (uint32_t)sei.m_numRefLevels - 1, 3, "sli_num_ref_levels_minus1"); + CHECK(sei.numRefLevels() < 1, "SEISubpictureLevelInfo: numRefLevels must be greater than zero"); + xWriteCode((uint32_t) sei.numRefLevels() - 1, 3, "sli_num_ref_levels_minus1"); xWriteFlag( sei.m_cbrConstraintFlag, "sli_cbr_constraint_flag"); xWriteFlag( sei.m_explicitFractionPresentFlag, "sli_explicit_fraction_present_flag"); if (sei.m_explicitFractionPresentFlag) @@ -1353,7 +1346,7 @@ void SEIWriter::xWriteSEISubpictureLevelInfo(const SEISubpictureLevelInfo& sei) for (int k = sei.m_sliSublayerInfoPresentFlag ? 0 : sei.m_sliMaxSublayers - 1; k < sei.m_sliMaxSublayers; k++) { - for (int i = 0; i < sei.m_numRefLevels; i++) + for (int i = 0; i < sei.numRefLevels(); i++) { xWriteCode((uint32_t)sei.m_nonSubpicLayersFraction[i][k], 8, "sli_non_subpic_layers_fraction[i][k]"); xWriteCode((uint32_t)sei.m_refLevelIdc[i][k], 8, "sli_ref_level_idc[i][k]"); -- GitLab