diff --git a/source/App/DecoderApp/DecApp.cpp b/source/App/DecoderApp/DecApp.cpp index d54fd79c5c89bfb9e82b1a3ec27166a99a3d3a84..6bee09b165c559fd55301f4f4ab55b5568eb475d 100644 --- a/source/App/DecoderApp/DecApp.cpp +++ b/source/App/DecoderApp/DecApp.cpp @@ -162,6 +162,9 @@ uint32_t DecApp::decode() { m_cDecLib.resetAccessUnitNals(); m_cDecLib.resetAccessUnitApsNals(); +#if JVET_P0101_POC_MULTILAYER + m_cDecLib.resetAccessUnitPicInfo(); +#endif } bPicSkipped = false; } @@ -261,6 +264,9 @@ uint32_t DecApp::decode() { m_cDecLib.resetAccessUnitNals(); m_cDecLib.resetAccessUnitApsNals(); +#if JVET_P0101_POC_MULTILAYER + m_cDecLib.resetAccessUnitPicInfo(); +#endif } } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index f11795e6022faac215168172c165583662ff4af7..92643b728ae37f737bc2474b5050942f55c86ff3 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -71,6 +71,9 @@ #define JVET_Q0042_VUI 1 // Modifications to VUI syntax #define JVET_Q0512_ENC_CHROMA_TS_ACT 1 // JVET-Q0512: encoder-side improvement on enabling chroma transform-skip for ACT + +#define JVET_P0101_POC_MULTILAYER 1 // POC derivation for pictures in dependent layers + #define JVET_Q0446_MIP_CONST_SHIFT_OFFSET 1 // JVET-Q0446: MIP with constant shift and offset #define JVET_Q0447_WP_PARAM_ESTIM 1 // JVET-Q0447: Add search iterations for method 2,3 and 4 diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index 0c8134558770634434c06f636ab07f32a64bc0e7..8761dbb4deac4b4735ef187a85a3e726bc4a2ca8 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -1355,6 +1355,39 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl #endif m_HLSReader.parseSliceHeader( m_apcSlicePilot, &m_picHeader, &m_parameterSetManager, m_prevTid0POC ); + +#if JVET_P0101_POC_MULTILAYER + PPS *pps = m_parameterSetManager.getPPS(m_picHeader.getPPSId()); + CHECK(pps == 0, "No PPS present"); + SPS *sps = m_parameterSetManager.getSPS(pps->getSPSId()); + CHECK(sps == 0, "No SPS present"); + VPS *vps = m_parameterSetManager.getVPS(sps->getVPSId()); + CHECK((sps->getVPSId() > 0) && (vps == 0), "Invalid VPS"); + if (vps != nullptr && (vps->getIndependentLayerFlag(nalu.m_nuhLayerId) == 0)) + { + bool pocIsSet = false; + for(auto auNALit=m_accessUnitPicInfo.begin(); auNALit != m_accessUnitPicInfo.end();auNALit++) + { + for (int iRefIdx = 0; iRefIdx < m_apcSlicePilot->getNumRefIdx(REF_PIC_LIST_0) && !pocIsSet; iRefIdx++) + { + if (m_apcSlicePilot->getRefPic(REF_PIC_LIST_0, iRefIdx)->getPOC() == (*auNALit).m_POC) + { + m_apcSlicePilot->setPOC(m_apcSlicePilot->getRefPic(REF_PIC_LIST_0, iRefIdx)->getPOC()); + pocIsSet = true; + } + } + for (int iRefIdx = 0; iRefIdx < m_apcSlicePilot->getNumRefIdx(REF_PIC_LIST_1) && !pocIsSet; iRefIdx++) + { + if (m_apcSlicePilot->getRefPic(REF_PIC_LIST_0, iRefIdx)->getPOC() == (*auNALit).m_POC) + { + m_apcSlicePilot->setPOC(m_apcSlicePilot->getRefPic(REF_PIC_LIST_0, iRefIdx)->getPOC()); + pocIsSet = true; + } + } + } + } +#endif + // update independent slice index uint32_t uiIndependentSliceIdx = 0; if (!m_bFirstSliceInPicture) @@ -1365,11 +1398,12 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl m_apcSlicePilot->setIndependentSliceIdx(uiIndependentSliceIdx); #if K0149_BLOCK_STATISTICS +#if !JVET_P0101_POC_MULTILAYER PPS *pps = m_parameterSetManager.getPPS(m_picHeader.getPPSId()); CHECK(pps == 0, "No PPS present"); SPS *sps = m_parameterSetManager.getSPS(pps->getSPSId()); CHECK(sps == 0, "No SPS present"); - +#endif writeBlockStatisticsHeader(sps); #endif @@ -1458,15 +1492,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) && m_lastNoIncorrectPicOutputFlag) //Reset POC MSB when CRA or GDR has NoIncorrectPicOutputFlag equal to 1 { +#if !JVET_P0101_POC_MULTILAYER PPS *pps = m_parameterSetManager.getPPS(m_picHeader.getPPSId()); CHECK(pps == 0, "No PPS present"); SPS *sps = m_parameterSetManager.getSPS(pps->getSPSId()); CHECK(sps == 0, "No SPS present"); +#endif int iMaxPOClsb = 1 << sps->getBitsForPOC(); m_apcSlicePilot->setPOC( m_apcSlicePilot->getPOC() & (iMaxPOClsb - 1) ); xUpdatePreviousTid0POC(m_apcSlicePilot); } +#if JVET_P0101_POC_MULTILAYER + AccessUnitPicInfo picInfo; + picInfo.m_nalUnitType = nalu.m_nalUnitType; + picInfo.m_nuhLayerId = nalu.m_nuhLayerId; + picInfo.m_temporalId = nalu.m_temporalId; + picInfo.m_POC = m_apcSlicePilot->getPOC(); + m_accessUnitPicInfo.push_back(picInfo); +#endif + // Skip pictures due to random access if (isRandomAccessSkipPicture(iSkipFrame, iPOCLastDisplay)) diff --git a/source/Lib/DecoderLib/DecLib.h b/source/Lib/DecoderLib/DecLib.h index b0c93682cc8c21016cb026687045bef084183182..5e8aef4978aed58794f72011d935bf6f67076a0c 100644 --- a/source/Lib/DecoderLib/DecLib.h +++ b/source/Lib/DecoderLib/DecLib.h @@ -131,6 +131,16 @@ private: int m_debugCTU; std::vector<std::pair<NalUnitType, int>> m_accessUnitNals; + #if JVET_P0101_POC_MULTILAYER + struct AccessUnitPicInfo + { + NalUnitType m_nalUnitType; ///< nal_unit_type + uint32_t m_temporalId; ///< temporal_id + uint32_t m_nuhLayerId; ///< nuh_layer_id + int m_POC; + }; + std::vector<AccessUnitPicInfo> m_accessUnitPicInfo; + #endif std::vector<int> m_accessUnitApsNals; VPS* m_vps; @@ -183,6 +193,9 @@ public: int getDebugPOC( ) const { return m_debugPOC; }; void setDebugPOC( int debugPOC ) { m_debugPOC = debugPOC; }; void resetAccessUnitNals() { m_accessUnitNals.clear(); } +#if JVET_P0101_POC_MULTILAYER + void resetAccessUnitPicInfo() { m_accessUnitPicInfo.clear(); } +#endif void resetAccessUnitApsNals() { m_accessUnitApsNals.clear(); } bool isSliceNaluFirstInAU( bool newPicture, InputNALUnit &nalu );