From 1748a535546f70c06a8ec55e34eb09070dfa07c4 Mon Sep 17 00:00:00 2001
From: Vadim Seregin <vseregin@qti.qualcomm.com>
Date: Fri, 28 Feb 2020 14:33:43 -0800
Subject: [PATCH] add derivation for NoOutputBeforeRecoveryFlag

---
 source/App/DecoderApp/DecApp.cpp |   7 +-
 source/Lib/CommonLib/Slice.cpp   |   9 ++-
 source/Lib/CommonLib/Slice.h     |  19 ++++--
 source/Lib/DecoderLib/DecLib.cpp | 112 ++++++++++++++++++++++++++++---
 source/Lib/DecoderLib/DecLib.h   |  20 +++++-
 source/Lib/EncoderLib/EncGOP.cpp |  12 ++++
 6 files changed, 161 insertions(+), 18 deletions(-)

diff --git a/source/App/DecoderApp/DecApp.cpp b/source/App/DecoderApp/DecApp.cpp
index 0c029914a..91674f0c8 100644
--- a/source/App/DecoderApp/DecApp.cpp
+++ b/source/App/DecoderApp/DecApp.cpp
@@ -207,7 +207,6 @@ uint32_t DecApp::decode()
       }
     }
 
-
     if ((bNewPicture || !bitstreamFile || nalu.m_nalUnitType == NAL_UNIT_EOS) && !m_cDecLib.getFirstSliceInSequence() && !bPicSkipped)
     {
       if (!loopFiltered || bitstreamFile)
@@ -219,6 +218,9 @@ uint32_t DecApp::decode()
       if (nalu.m_nalUnitType == NAL_UNIT_EOS)
       {
         m_cDecLib.setFirstSliceInSequence(true);
+#if SPS_ID_CHECK
+        std::memset( m_cDecLib.getFirstSliceInLayer(), true, sizeof( *m_cDecLib.getFirstSliceInLayer() ) * MAX_VPS_LAYERS );
+#endif
       }
 
     }
@@ -284,6 +286,9 @@ uint32_t DecApp::decode()
       {
         xWriteOutput( pcListPic, nalu.m_temporalId );
         m_cDecLib.setFirstSliceInPicture (false);
+#if SPS_ID_CHECK
+        std::memset( m_cDecLib.getFirstSliceInLayer(), false, sizeof( *m_cDecLib.getFirstSliceInLayer() ) * MAX_VPS_LAYERS );
+#endif
       }
       // write reconstruction to file -- for additional bumping as defined in C.5.2.3
       if (!bNewPicture && ((nalu.m_nalUnitType >= NAL_UNIT_CODED_SLICE_TRAIL && nalu.m_nalUnitType <= NAL_UNIT_RESERVED_IRAP_VCL_12)
diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp
index ada3d9423..a8644ebc3 100644
--- a/source/Lib/CommonLib/Slice.cpp
+++ b/source/Lib/CommonLib/Slice.cpp
@@ -87,8 +87,10 @@ Slice::Slice()
 , m_pcPic                         ( NULL )
 , m_pcPicHeader                   ( NULL )
 , m_colFromL0Flag                 ( true )
+#if !SPS_ID_CHECK
 , m_noIncorrectPicOutputFlag      ( false )
-, m_handleCraAsCvsStartFlag            ( false )
+, m_handleCraAsCvsStartFlag       ( false )
+#endif
 , m_colRefIdx                     ( 0 )
 , m_uiTLayer                      ( 0 )
 , m_bTLayerSwitchingFlag          ( false )
@@ -1799,6 +1801,11 @@ PicHeader::PicHeader()
 , m_gdrPicFlag                                    ( 0 )
 , m_noOutputOfPriorPicsFlag                       ( 0 )
 , m_recoveryPocCnt                                ( 0 )
+#if SPS_ID_CHECK
+, m_noOutputBeforeRecoveryFlag                    ( false )
+, m_handleCraAsCvsStartFlag                       ( false )
+, m_handleGdrAsCvsStartFlag                       ( false )
+#endif
 , m_spsId                                         ( -1 )
 , m_ppsId                                         ( -1 )
 #if JVET_P0116_POC_MSB
diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h
index 98d6b34b9..db5994b84 100644
--- a/source/Lib/CommonLib/Slice.h
+++ b/source/Lib/CommonLib/Slice.h
@@ -2301,6 +2301,8 @@ private:
   uint32_t                    m_recoveryPocCnt;                                         //!< recovery POC count
 #if SPS_ID_CHECK
   bool                        m_noOutputBeforeRecoveryFlag;                             //!< NoOutputBeforeRecoveryFlag
+  bool                        m_handleCraAsCvsStartFlag;                                //!< HandleCraAsCvsStartFlag
+  bool                        m_handleGdrAsCvsStartFlag;                                //!< HandleGdrAsCvsStartFlag
 #endif
   int                         m_spsId;                                                  //!< sequence parameter set ID
   int                         m_ppsId;                                                  //!< picture parameter set ID
@@ -2433,10 +2435,6 @@ public:
   bool                        getNoOutputOfPriorPicsFlag() const                        { return m_noOutputOfPriorPicsFlag;                                                            }
   void                        setRecoveryPocCnt( uint32_t u )                           { m_recoveryPocCnt = u;                                                                        }
   bool                        getRecoveryPocCnt() const                                 { return m_recoveryPocCnt;                                                                     }
-#if SPS_ID_CHECK
-  void                        setNoOutputBeforeRecoveryFlag( bool b )                   { m_noOutputBeforeRecoveryFlag = b;                                                            }
-  bool                        getNoOutputBeforeRecoveryFlag() const                     { return m_noOutputBeforeRecoveryFlag;                                                         }
-#endif
   void                        setSPSId( uint32_t u )                                    { m_spsId = u;                                                                                 }
   uint32_t                    getSPSId() const                                          { return m_spsId;                                                                              }
   void                        setPPSId( uint32_t u )                                    { m_ppsId = u;                                                                                 }
@@ -2654,6 +2652,15 @@ public:
   void                        setNumL1Weights(int b)                                   { m_numL1Weights = b;                          }
   int                         getNumL1Weights()                                        { return m_numL1Weights;                       }
 #endif
+
+#if SPS_ID_CHECK
+  void                        setNoOutputBeforeRecoveryFlag( bool val )                { m_noOutputBeforeRecoveryFlag = val;  }
+  bool                        getNoOutputBeforeRecoveryFlag() const                    { return m_noOutputBeforeRecoveryFlag; }
+  void                        setHandleCraAsCvsStartFlag( bool val )                   { m_handleCraAsCvsStartFlag = val;     }
+  bool                        getHandleCraAsCvsStartFlag() const                       { return m_handleCraAsCvsStartFlag;    }
+  void                        setHandleGdrAsCvsStartFlag( bool val )                   { m_handleGdrAsCvsStartFlag = val;     }
+  bool                        getHandleGdrAsCvsStartFlag() const                       { return m_handleGdrAsCvsStartFlag;    }
+#endif
 };
 
 /// slice header class
@@ -2731,8 +2738,10 @@ private:
   const PicHeader*           m_pcPicHeader;    //!< pointer to picture header structure
   bool                       m_colFromL0Flag;  // collocated picture from List0 flag
 
+#if !SPS_ID_CHECK
   bool                       m_noIncorrectPicOutputFlag;
   bool                       m_handleCraAsCvsStartFlag;
+#endif
 
   uint32_t                       m_colRefIdx;
   double                     m_lambdas[MAX_NUM_COMPONENT];
@@ -2971,11 +2980,13 @@ public:
   bool                        isTemporalLayerSwitchingPoint( PicList& rcListPic )                                           const;
   bool                        isStepwiseTemporalLayerSwitchingPointCandidate( PicList& rcListPic )                          const;
   int                         checkThatAllRefPicsAreAvailable(PicList& rcListPic, const ReferencePictureList *pRPL, int rplIdx, bool printErrors)                const;
+#if !SPS_ID_CHECK
   void                        setNoIncorrectPicOutputFlag(bool val)                  { m_noIncorrectPicOutputFlag = val;                             }
   bool                        getNoIncorrectPicOutputFlag() const                    { return m_noIncorrectPicOutputFlag;                                    }
 
   void                        setHandleCraAsCvsStartFlag( bool val )                 { m_handleCraAsCvsStartFlag = val;                                   }
   bool                        getHandleCraAsCvsStartFlag() const                     { return m_handleCraAsCvsStartFlag;                                  }
+#endif
 
   void                        setNumTilesInSlice( uint32_t u )                       { m_sliceMap.setNumTilesInSlice( u );                                       }
   uint32_t                    getNumTilesInSlice() const                             { return m_sliceMap.getNumTilesInSlice();                                   }
diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp
index 4543a7b64..c7c069061 100644
--- a/source/Lib/DecoderLib/DecLib.cpp
+++ b/source/Lib/DecoderLib/DecLib.cpp
@@ -348,6 +348,9 @@ bool tryDecodePicture( Picture* pcEncPic, const int expectedPoc, const std::stri
         if( nalu.m_nalUnitType == NAL_UNIT_EOS )
         {
           pcDecLib->setFirstSliceInSequence( true );
+#if SPS_ID_CHECK
+          std::memset( pcDecLib->getFirstSliceInLayer(), true, sizeof( *pcDecLib->getFirstSliceInLayer() ) * MAX_VPS_LAYERS );
+#endif
         }
 
       }
@@ -421,13 +424,21 @@ DecLib::DecLib()
   , m_prevPOC(MAX_INT)
   , m_prevTid0POC(0)
   , m_bFirstSliceInPicture(true)
+#if SPS_ID_CHECK
+  , m_firstSliceInSequence( true )
+#else
   , m_bFirstSliceInSequence(true)
+  , m_bFirstSliceInBitstream(true)
+#endif
   , m_prevSliceSkipped(false)
   , m_skippedPOC(0)
-  , m_bFirstSliceInBitstream(true)
   , m_lastPOCNoOutputPriorPics(-1)
   , m_isNoOutputPriorPics(false)
+#if SPS_ID_CHECK
+  , m_lastNoOutputBeforeRecoveryFlag( false )
+#else
   , m_lastNoIncorrectPicOutputFlag(false)
+#endif
   , m_sliceLmcsApsId(-1)
   , m_pDecodedSEIOutputStream(NULL)
   , m_decodedPictureHashSEIEnabled(false)
@@ -447,6 +458,9 @@ DecLib::DecLib()
 #if ENABLE_SIMD_OPT_BUFFER
   g_pelBufOP.initPelBufOpsX86();
 #endif
+#if SPS_ID_CHECK
+  std::memset( m_firstSliceInLayer, true, sizeof( m_firstSliceInLayer ) );
+#endif
 }
 
 DecLib::~DecLib()
@@ -1391,7 +1405,7 @@ void DecLib::xCheckParameterSetConstraints(const int layerId)
     int curLayerBitDepth = sps->getBitDepth(CHANNEL_TYPE_LUMA);
 
 #if SPS_ID_CHECK
-    if (slice->isClvssPu() && m_bFirstSliceInPicture)
+    if( slice->isClvssPu() && m_bFirstSliceInPicture )
 #else
     if (m_layerBitDepth[curLayerIdx] == 0)
 #endif
@@ -1618,8 +1632,32 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl
   m_apcSlicePilot->setAssociatedIRAPPOC(m_pocCRA);
   m_apcSlicePilot->setAssociatedIRAPType(m_associatedIRAPType);
 
+#if SPS_ID_CHECK
+  if( m_apcSlicePilot->getRapPicFlag() || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR )
+  {
+    // Derive NoOutputBeforeRecoveryFlag
+    if( !pps->getMixedNaluTypesInPicFlag() )
+    {
+      if( m_firstSliceInLayer[nalu.m_nuhLayerId] )
+      {
+        m_picHeader.setNoOutputBeforeRecoveryFlag( true );
+      }
+      else if( m_apcSlicePilot->getIdrPicFlag() )
+      {
+        m_picHeader.setNoOutputBeforeRecoveryFlag( true );
+      }
+      else if( m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA )
+      {
+        m_picHeader.setNoOutputBeforeRecoveryFlag( m_picHeader.getHandleCraAsCvsStartFlag() );
+      }
+      else if( m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR )
+      {
+        m_picHeader.setNoOutputBeforeRecoveryFlag( m_picHeader.getHandleGdrAsCvsStartFlag() );
+      }
+    }
+#else
   //For inference of NoOutputOfPriorPicsFlag
-  if (m_apcSlicePilot->getRapPicFlag() || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR)
+  if( m_apcSlicePilot->getRapPicFlag() || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR )
   {
     if ((m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA && m_bFirstSliceInSequence) ||
         (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA && m_apcSlicePilot->getHandleCraAsCvsStartFlag()) ||
@@ -1627,9 +1665,17 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl
     {
       m_apcSlicePilot->setNoIncorrectPicOutputFlag(true);
     }
-    //the inference for NoOutputPriorPicsFlag
-    if (!m_bFirstSliceInBitstream &&
-        (m_apcSlicePilot->getRapPicFlag() || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR) &&
+#endif
+
+    //the inference for NoOutputOfPriorPicsFlag
+#if SPS_ID_CHECK
+    if( !m_firstSliceInSequence && m_picHeader.getNoOutputBeforeRecoveryFlag() )
+    {
+      m_picHeader.setNoOutputOfPriorPicsFlag( true );
+    }
+#else
+    if( !m_bFirstSliceInBitstream &&
+        ( m_apcSlicePilot->getRapPicFlag() || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR ) &&
         m_apcSlicePilot->getNoIncorrectPicOutputFlag())
     {
       if (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR)
@@ -1637,6 +1683,7 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl
         m_picHeader.setNoOutputOfPriorPicsFlag(true);
       }
     }
+#endif
     else
     {
       m_picHeader.setNoOutputOfPriorPicsFlag(false);
@@ -1644,9 +1691,26 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl
 
     if (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR)
     {
+#if SPS_ID_CHECK
+      m_lastNoOutputBeforeRecoveryFlag = m_picHeader.getNoOutputBeforeRecoveryFlag();
+#else
       m_lastNoIncorrectPicOutputFlag = m_apcSlicePilot->getNoIncorrectPicOutputFlag();
+#endif
+    }
+#if SPS_ID_CHECK
+
+    if( m_picHeader.getNoOutputOfPriorPicsFlag() )
+    {
+      m_lastPOCNoOutputPriorPics = m_apcSlicePilot->getPOC();
+      m_isNoOutputPriorPics = true;
+    }
+    else
+    {
+      m_isNoOutputPriorPics = false;
     }
   }
+#else
+  }
   if ((m_apcSlicePilot->getRapPicFlag() || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR) && m_picHeader.getNoOutputOfPriorPicsFlag())
   {
     m_lastPOCNoOutputPriorPics = m_apcSlicePilot->getPOC();
@@ -1656,11 +1720,20 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl
   {
     m_isNoOutputPriorPics = false;
   }
+#endif
 
   //For inference of PicOutputFlag
+#if SPS_ID_CHECK
+  if( !pps->getMixedNaluTypesInPicFlag() && ( m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL ) )
+#else
   if (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL)
+#endif
   {
+#if SPS_ID_CHECK
+    if( m_lastNoOutputBeforeRecoveryFlag )
+#else
     if (m_lastNoIncorrectPicOutputFlag)
+#endif
     {
       m_picHeader.setPicOutputFlag(false);
     }
@@ -1684,8 +1757,13 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl
   }
 #endif
 
-  if ((m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR) &&
+#if SPS_ID_CHECK
+  //Reset POC MSB when CRA or GDR has NoOutputBeforeRecoveryFlag equal to 1
+  if( !pps->getMixedNaluTypesInPicFlag() && ( m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR ) && m_lastNoOutputBeforeRecoveryFlag )
+#else
+  if( ( m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR ) &&
       m_lastNoIncorrectPicOutputFlag)                     //Reset POC MSB when CRA or GDR has NoIncorrectPicOutputFlag equal to 1
+#endif
   {
 #if !JVET_P0101_POC_MULTILAYER
     PPS *pps = m_parameterSetManager.getPPS(m_picHeader.getPPSId());
@@ -1721,7 +1799,11 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl
   m_prevSliceSkipped = false;
 
   //we should only get a different poc for a new picture (with CTU address==0)
+#if SPS_ID_CHECK
+  if( m_apcSlicePilot->getPOC() != m_prevPOC && !m_firstSliceInLayer[nalu.m_nuhLayerId] && m_apcSlicePilot->getFirstCtuRsAddrInSlice() )
+#else
   if(m_apcSlicePilot->getPOC() != m_prevPOC && !m_bFirstSliceInSequence && (m_apcSlicePilot->getFirstCtuRsAddrInSlice() != 0))
+#endif
   {
     msg( WARNING, "Warning, the first slice of a picture might have been lost!\n");
   }
@@ -1749,7 +1831,11 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl
     int refPicIndex;
     while ((lostPoc = m_apcSlicePilot->checkThatAllRefPicsAreAvailable(m_cListPic, m_apcSlicePilot->getRPL0(), 0, true, &refPicIndex)) > 0)
     {
+#if SPS_ID_CHECK
+      if( !pps->getMixedNaluTypesInPicFlag() && ( m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA ) && m_picHeader.getNoOutputBeforeRecoveryFlag() )
+#else
       if ( ( (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR) || (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA) ) && m_apcSlicePilot->getNoIncorrectPicOutputFlag() )
+#endif
       {
         if (m_apcSlicePilot->getRPL0()->isInterLayerRefPic(refPicIndex) == 0)
         {
@@ -1763,7 +1849,11 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl
     }
     while ((lostPoc = m_apcSlicePilot->checkThatAllRefPicsAreAvailable(m_cListPic, m_apcSlicePilot->getRPL1(), 0, true, &refPicIndex)) > 0)
     {
+#if SPS_ID_CHECK
+      if( !pps->getMixedNaluTypesInPicFlag() && ( m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA ) && m_picHeader.getNoOutputBeforeRecoveryFlag() )
+#else
       if (((m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR) || (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA)) && m_apcSlicePilot->getNoIncorrectPicOutputFlag())
+#endif
       {
         if (m_apcSlicePilot->getRPL1()->isInterLayerRefPic(refPicIndex) == 0)
         {
@@ -1787,9 +1877,13 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl
   // actual decoding starts here
   xActivateParameterSets( nalu.m_nuhLayerId );
 
+#if SPS_ID_CHECK
+  m_firstSliceInLayer[nalu.m_nuhLayerId] = false;
+  m_firstSliceInSequence = false;
+#else
   m_bFirstSliceInSequence = false;
   m_bFirstSliceInBitstream  = false;
-
+#endif
 
   Slice* pcSlice = m_pcPic->slices[m_uiSliceSegmentIdx];
   pcSlice->setPic( m_pcPic );
@@ -1798,7 +1892,7 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl
   m_pcPic->referenced  = true;
   m_pcPic->layer       = nalu.m_temporalId;
   m_pcPic->layerId    = nalu.m_nuhLayerId;
-    m_pcPic->subLayerNonReferencePictureDueToSTSA = false;
+  m_pcPic->subLayerNonReferencePictureDueToSTSA = false;
 
 
   pcSlice->checkCRA(pcSlice->getRPL0(), pcSlice->getRPL1(), m_pocCRA, m_associatedIRAPType, m_cListPic);
diff --git a/source/Lib/DecoderLib/DecLib.h b/source/Lib/DecoderLib/DecLib.h
index 0a0dd9d5a..f8482b587 100644
--- a/source/Lib/DecoderLib/DecLib.h
+++ b/source/Lib/DecoderLib/DecLib.h
@@ -111,18 +111,23 @@ private:
   int                     m_prevPOC;
   int                     m_prevTid0POC;
   bool                    m_bFirstSliceInPicture;
+#if SPS_ID_CHECK
+  bool                    m_firstSliceInLayer[MAX_VPS_LAYERS];
+  bool                    m_firstSliceInSequence;
+#else
   bool                    m_bFirstSliceInSequence;
+  bool                    m_bFirstSliceInBitstream;
+#endif
   bool                    m_prevSliceSkipped;
   int                     m_skippedPOC;
-  bool                    m_bFirstSliceInBitstream;
   int                     m_lastPOCNoOutputPriorPics;
   bool                    m_isNoOutputPriorPics;
-  bool                    m_lastNoIncorrectPicOutputFlag;    //value of variable NoIncorrectPicOutputFlag of the last CRA / GDR pic
+  bool                    m_lastNoOutputBeforeRecoveryFlag;    //value of variable NoOutputBeforeRecoveryFlag  of the last CRA / GDR pic
   int                     m_sliceLmcsApsId;         //value of LmcsApsId, constraint is same id for all slices in one picture
   std::ostream           *m_pDecodedSEIOutputStream;
 
   int                     m_decodedPictureHashSEIEnabled;  ///< Checksum(3)/CRC(2)/MD5(1)/disable(0) acting on decoded picture hash SEI message
-  uint32_t                    m_numberOfChecksumErrorsDetected;
+  uint32_t                m_numberOfChecksumErrorsDetected;
 
   bool                    m_warningMessageSkipPicture;
 
@@ -187,8 +192,13 @@ public:
   void  setNoOutputPriorPicsFlag (bool val) { m_isNoOutputPriorPics = val; }
   void  setFirstSliceInPicture (bool val)  { m_bFirstSliceInPicture = val; }
   bool  getFirstSliceInPicture () const  { return m_bFirstSliceInPicture; }
+#if SPS_ID_CHECK
+  bool  getFirstSliceInSequence() const     { return m_firstSliceInSequence; }
+  void  setFirstSliceInSequence( bool val ) { m_firstSliceInSequence = val; }
+#else
   bool  getFirstSliceInSequence () const   { return m_bFirstSliceInSequence; }
   void  setFirstSliceInSequence (bool val) { m_bFirstSliceInSequence = val; }
+#endif
   void  setDecodedSEIMessageOutputStream(std::ostream *pOpStream) { m_pDecodedSEIOutputStream = pOpStream; }
   uint32_t  getNumberOfChecksumErrorsDetected() const { return m_numberOfChecksumErrorsDetected; }
 
@@ -217,6 +227,10 @@ public:
   int   getPreScalingListAPSId() { return m_PreScalingListAPSId; }
   void  setPreScalingListAPSId(int id) { m_PreScalingListAPSId = id; }
 
+#if SPS_ID_CHECK
+  bool* getFirstSliceInLayer()       { return m_firstSliceInLayer; }
+#endif
+
 protected:
   void  xUpdateRasInit(Slice* slice);
 
diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp
index 478933a55..3042ce2fa 100644
--- a/source/Lib/EncoderLib/EncGOP.cpp
+++ b/source/Lib/EncoderLib/EncGOP.cpp
@@ -3158,16 +3158,28 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic,
         pcSlice->setRPL0idx(pcPic->slices[0]->getRPL0idx());
         pcSlice->setRPL1idx(pcPic->slices[0]->getRPL1idx());
 
+#if SPS_ID_CHECK
+        picHeader->setNoOutputBeforeRecoveryFlag( false );
+#else
         pcSlice->setNoIncorrectPicOutputFlag(false);
+#endif
         if (pcSlice->isIRAP())
         {
           if (pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_IDR_W_RADL && pcSlice->getNalUnitType() <= NAL_UNIT_CODED_SLICE_IDR_N_LP)
           {
+#if SPS_ID_CHECK
+            picHeader->setNoOutputBeforeRecoveryFlag( true );
+#else
             pcSlice->setNoIncorrectPicOutputFlag(true);
+#endif
           }
           //the inference for NoOutputPriorPicsFlag
           // KJS: This cannot happen at the encoder
+#if SPS_ID_CHECK
+          if( !m_bFirst && ( pcSlice->isIRAP() || pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_GDR ) && picHeader->getNoOutputBeforeRecoveryFlag() )
+#else     
           if (!m_bFirst && (pcSlice->isIRAP() || pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_GDR) && pcSlice->getNoIncorrectPicOutputFlag())
+#endif
           {
             if (pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA || pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_GDR)
             {
-- 
GitLab