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