From 151632a519acd6d9ef1c659e95b261992137d4a8 Mon Sep 17 00:00:00 2001 From: Hendry <fnu.hendry@huawei.com> Date: Fri, 6 Sep 2019 18:10:14 -0700 Subject: [PATCH] - Change NoRaslOutputFlag to NoIncorrectPicOutputFlag and apply it to GDR as well - CVS to start with GDR --- source/App/DecoderApp/DecApp.cpp | 4 +++ source/Lib/CommonLib/Slice.cpp | 4 +++ source/Lib/CommonLib/Slice.h | 9 ++++++ source/Lib/DecoderLib/DecLib.cpp | 49 ++++++++++++++++++++++++++++++++ source/Lib/DecoderLib/DecLib.h | 4 +++ source/Lib/EncoderLib/EncGOP.cpp | 14 +++++++++ 6 files changed, 84 insertions(+) diff --git a/source/App/DecoderApp/DecApp.cpp b/source/App/DecoderApp/DecApp.cpp index eb46b9bc5d..5a0a44b1dd 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 25ff505ec5..eccce0e693 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 84431823d5..d5d5476e7b 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 081fe1a5a3..ff3e18b8c4 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 737ae6db70..3646abb4a4 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 1ab5886f29..4a71c7412b 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); } -- GitLab