diff --git a/source/App/DecoderApp/DecApp.cpp b/source/App/DecoderApp/DecApp.cpp index eb46b9bc5d061a0783a066bde03ae87246c8a0e9..5a0a44b1dd52d16666896a3b6aa13969dccbc32b 100644 --- a/source/App/DecoderApp/DecApp.cpp +++ b/source/App/DecoderApp/DecApp.cpp @@ -230,7 +230,11 @@ uint32_t DecApp::decode() { xWriteOutput( pcListPic, nalu.m_temporalId ); } +#if JVET_N0865_NONSYNTAX + if ((bNewPicture || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_CRA || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_GDR) && m_cDecLib.getNoOutputPriorPicsFlag()) +#else if ( (bNewPicture || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_CRA) && m_cDecLib.getNoOutputPriorPicsFlag() ) +#endif { m_cDecLib.checkNoOutputPriorPics( pcListPic ); m_cDecLib.setNoOutputPriorPicsFlag (false); diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index 25ff505ec5ccf42d50c8005322f8b1f6fa369879..eccce0e69325f31fe6c80a800f9580c084e38cc3 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -76,7 +76,11 @@ Slice::Slice() , m_pcPic ( NULL ) , m_colFromL0Flag ( true ) , m_noOutputPriorPicsFlag ( false ) +#if JVET_N0865_NONSYNTAX +, m_noIncorrectPicOutputFlag ( false ) +#else , m_noRaslOutputFlag ( false ) +#endif , m_handleCraAsCvsStartFlag ( false ) , m_colRefIdx ( 0 ) , m_maxNumMergeCand ( 0 ) diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index 84431823d571299fce027ce46fdb615aa6bd6375..d5d5476e7bd884c723d433f8010dfc2df3404d43 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -1691,7 +1691,11 @@ private: bool m_colFromL0Flag; // collocated picture from List0 flag bool m_noOutputPriorPicsFlag; +#if JVET_N0865_NONSYNTAX + bool m_noIncorrectPicOutputFlag; +#else bool m_noRaslOutputFlag; +#endif bool m_handleCraAsCvsStartFlag; uint32_t m_colRefIdx; @@ -1985,8 +1989,13 @@ public: void setNoOutputPriorPicsFlag( bool val ) { m_noOutputPriorPicsFlag = val; } bool getNoOutputPriorPicsFlag() const { return m_noOutputPriorPicsFlag; } +#if JVET_N0865_NONSYNTAX + void setNoIncorrectPicOutputFlag(bool val) { m_noIncorrectPicOutputFlag = val; } + bool getNoIncorrectPicOutputFlag() const { return m_noIncorrectPicOutputFlag; } +#else void setNoRaslOutputFlag( bool val ) { m_noRaslOutputFlag = val; } bool getNoRaslOutputFlag() const { return m_noRaslOutputFlag; } +#endif void setHandleCraAsCvsStartFlag( bool val ) { m_handleCraAsCvsStartFlag = val; } bool getHandleCraAsCvsStartFlag() const { return m_handleCraAsCvsStartFlag; } diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index 081fe1a5a3bba32f450d38a29f5b7ae94e52098f..ff3e18b8c48bca1de533493082a07c4908ad1701 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -406,7 +406,11 @@ DecLib::DecLib() , m_bFirstSliceInBitstream(true) , m_lastPOCNoOutputPriorPics(-1) , m_isNoOutputPriorPics(false) +#if JVET_N0865_NONSYNTAX + , m_lastNoIncorrectPicOutputFlag(false) +#else , m_craNoRaslOutputFlag(false) +#endif , m_pDecodedSEIOutputStream(NULL) , m_decodedPictureHashSEIEnabled(false) , m_numberOfChecksumErrorsDetected(0) @@ -1170,14 +1174,38 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl m_apcSlicePilot->setAssociatedIRAPType(m_associatedIRAPType); //For inference of NoOutputOfPriorPicsFlag +#if JVET_N0865_NONSYNTAX + if (m_apcSlicePilot->getRapPicFlag() || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR) +#else if (m_apcSlicePilot->getRapPicFlag()) +#endif { +#if JVET_N0865_NONSYNTAX + if ((m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA && m_bFirstSliceInSequence) || + (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA && m_apcSlicePilot->getHandleCraAsCvsStartFlag()) || + (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR && m_bFirstSliceInSequence)) + { + m_apcSlicePilot->setNoIncorrectPicOutputFlag(true); + } +#else if ((m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA && m_bFirstSliceInSequence) || (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA && m_apcSlicePilot->getHandleCraAsCvsStartFlag())) { m_apcSlicePilot->setNoRaslOutputFlag(true); } +#endif //the inference for NoOutputPriorPicsFlag +#if JVET_N0865_NONSYNTAX + 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) + { + m_apcSlicePilot->setNoOutputPriorPicsFlag(true); + } + } +#else if (!m_bFirstSliceInBitstream && m_apcSlicePilot->getRapPicFlag() && m_apcSlicePilot->getNoRaslOutputFlag()) { if (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA) @@ -1185,17 +1213,29 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl m_apcSlicePilot->setNoOutputPriorPicsFlag(true); } } +#endif else { m_apcSlicePilot->setNoOutputPriorPicsFlag(false); } +#if JVET_N0865_NONSYNTAX + if (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR) + { + m_lastNoIncorrectPicOutputFlag = m_apcSlicePilot->getNoIncorrectPicOutputFlag(); + } +#else if(m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA) { m_craNoRaslOutputFlag = m_apcSlicePilot->getNoRaslOutputFlag(); } +#endif } +#if JVET_N0865_NONSYNTAX + if ((m_apcSlicePilot->getRapPicFlag() || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_GDR) && m_apcSlicePilot->getNoOutputPriorPicsFlag()) +#else if (m_apcSlicePilot->getRapPicFlag() && m_apcSlicePilot->getNoOutputPriorPicsFlag()) +#endif { m_lastPOCNoOutputPriorPics = m_apcSlicePilot->getPOC(); m_isNoOutputPriorPics = true; @@ -1208,13 +1248,22 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl //For inference of PicOutputFlag if (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL) { +#if JVET_N0865_NONSYNTAX + if (m_lastNoIncorrectPicOutputFlag) +#else if ( m_craNoRaslOutputFlag ) +#endif { m_apcSlicePilot->setPicOutputFlag(false); } } +#if JVET_N0865_NONSYNTAX + 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 +#else if (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA && m_craNoRaslOutputFlag) //Reset POC MSB when CRA has NoRaslOutputFlag equal to 1 +#endif { PPS *pps = m_parameterSetManager.getPPS(m_apcSlicePilot->getPPSId()); CHECK(pps == 0, "No PPS present"); diff --git a/source/Lib/DecoderLib/DecLib.h b/source/Lib/DecoderLib/DecLib.h index 737ae6db70f7d495c2a48c4d4b97eacf46c43b83..3646abb4a4d25b599349db9c1071d514f2a27094 100644 --- a/source/Lib/DecoderLib/DecLib.h +++ b/source/Lib/DecoderLib/DecLib.h @@ -117,7 +117,11 @@ private: bool m_bFirstSliceInBitstream; int m_lastPOCNoOutputPriorPics; bool m_isNoOutputPriorPics; +#if JVET_N0865_NONSYNTAX + bool m_lastNoIncorrectPicOutputFlag; //value of variable NoIncorrectPicOutputFlag of the last CRA / GDR pic +#else bool m_craNoRaslOutputFlag; //value of variable NoRaslOutputFlag of the last CRA pic +#endif std::ostream *m_pDecodedSEIOutputStream; int m_decodedPictureHashSEIEnabled; ///< Checksum(3)/CRC(2)/MD5(1)/disable(0) acting on decoded picture hash SEI message diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index 1ab5886f29c0f2dca424b5fc16d0486ead538114..4a71c7412bc9bcc510f5f1c2853764485c82ae03 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -2943,18 +2943,32 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, OutputNALUnit nalu( pcSlice->getNalUnitType(), pcSlice->getTLayer() ); m_HLSWriter->setBitstream( &nalu.m_Bitstream ); +#if JVET_N0865_NONSYNTAX + pcSlice->setNoIncorrectPicOutputFlag(false); +#else pcSlice->setNoRaslOutputFlag(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 JVET_N0865_NONSYNTAX + pcSlice->setNoIncorrectPicOutputFlag(true); +#else pcSlice->setNoRaslOutputFlag(true); +#endif } //the inference for NoOutputPriorPicsFlag // KJS: This cannot happen at the encoder +#if JVET_N0865_NONSYNTAX + if (!m_bFirst && (pcSlice->isIRAP() || pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_GDR) && pcSlice->getNoIncorrectPicOutputFlag()) + { + if (pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA || pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_GDR) +#else if (!m_bFirst && pcSlice->isIRAP() && pcSlice->getNoRaslOutputFlag()) { if (pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA) +#endif { pcSlice->setNoOutputPriorPicsFlag(true); }