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