Skip to content
Snippets Groups Projects
Commit 3d4a1e56 authored by Karsten Suehring's avatar Karsten Suehring
Browse files

Merge branch 'ks_kashyap/VVCSoftware_VTM-P0101_POC_MultiLayer'

parents 52fd2b26 75595033
No related branches found
No related tags found
No related merge requests found
...@@ -162,6 +162,9 @@ uint32_t DecApp::decode() ...@@ -162,6 +162,9 @@ uint32_t DecApp::decode()
{ {
m_cDecLib.resetAccessUnitNals(); m_cDecLib.resetAccessUnitNals();
m_cDecLib.resetAccessUnitApsNals(); m_cDecLib.resetAccessUnitApsNals();
#if JVET_P0101_POC_MULTILAYER
m_cDecLib.resetAccessUnitPicInfo();
#endif
} }
bPicSkipped = false; bPicSkipped = false;
} }
...@@ -261,6 +264,9 @@ uint32_t DecApp::decode() ...@@ -261,6 +264,9 @@ uint32_t DecApp::decode()
{ {
m_cDecLib.resetAccessUnitNals(); m_cDecLib.resetAccessUnitNals();
m_cDecLib.resetAccessUnitApsNals(); m_cDecLib.resetAccessUnitApsNals();
#if JVET_P0101_POC_MULTILAYER
m_cDecLib.resetAccessUnitPicInfo();
#endif
} }
} }
......
...@@ -71,6 +71,9 @@ ...@@ -71,6 +71,9 @@
#define JVET_Q0042_VUI 1 // Modifications to VUI syntax #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_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_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 #define JVET_Q0447_WP_PARAM_ESTIM 1 // JVET-Q0447: Add search iterations for method 2,3 and 4
......
...@@ -1355,6 +1355,39 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl ...@@ -1355,6 +1355,39 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl
#endif #endif
m_HLSReader.parseSliceHeader( m_apcSlicePilot, &m_picHeader, &m_parameterSetManager, m_prevTid0POC ); 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 // update independent slice index
uint32_t uiIndependentSliceIdx = 0; uint32_t uiIndependentSliceIdx = 0;
if (!m_bFirstSliceInPicture) if (!m_bFirstSliceInPicture)
...@@ -1365,11 +1398,12 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl ...@@ -1365,11 +1398,12 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl
m_apcSlicePilot->setIndependentSliceIdx(uiIndependentSliceIdx); m_apcSlicePilot->setIndependentSliceIdx(uiIndependentSliceIdx);
#if K0149_BLOCK_STATISTICS #if K0149_BLOCK_STATISTICS
#if !JVET_P0101_POC_MULTILAYER
PPS *pps = m_parameterSetManager.getPPS(m_picHeader.getPPSId()); PPS *pps = m_parameterSetManager.getPPS(m_picHeader.getPPSId());
CHECK(pps == 0, "No PPS present"); CHECK(pps == 0, "No PPS present");
SPS *sps = m_parameterSetManager.getSPS(pps->getSPSId()); SPS *sps = m_parameterSetManager.getSPS(pps->getSPSId());
CHECK(sps == 0, "No SPS present"); CHECK(sps == 0, "No SPS present");
#endif
writeBlockStatisticsHeader(sps); writeBlockStatisticsHeader(sps);
#endif #endif
...@@ -1458,15 +1492,26 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl ...@@ -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) && 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 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()); PPS *pps = m_parameterSetManager.getPPS(m_picHeader.getPPSId());
CHECK(pps == 0, "No PPS present"); CHECK(pps == 0, "No PPS present");
SPS *sps = m_parameterSetManager.getSPS(pps->getSPSId()); SPS *sps = m_parameterSetManager.getSPS(pps->getSPSId());
CHECK(sps == 0, "No SPS present"); CHECK(sps == 0, "No SPS present");
#endif
int iMaxPOClsb = 1 << sps->getBitsForPOC(); int iMaxPOClsb = 1 << sps->getBitsForPOC();
m_apcSlicePilot->setPOC( m_apcSlicePilot->getPOC() & (iMaxPOClsb - 1) ); m_apcSlicePilot->setPOC( m_apcSlicePilot->getPOC() & (iMaxPOClsb - 1) );
xUpdatePreviousTid0POC(m_apcSlicePilot); 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 // Skip pictures due to random access
if (isRandomAccessSkipPicture(iSkipFrame, iPOCLastDisplay)) if (isRandomAccessSkipPicture(iSkipFrame, iPOCLastDisplay))
......
...@@ -131,6 +131,16 @@ private: ...@@ -131,6 +131,16 @@ private:
int m_debugCTU; int m_debugCTU;
std::vector<std::pair<NalUnitType, int>> m_accessUnitNals; 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; std::vector<int> m_accessUnitApsNals;
VPS* m_vps; VPS* m_vps;
...@@ -183,6 +193,9 @@ public: ...@@ -183,6 +193,9 @@ public:
int getDebugPOC( ) const { return m_debugPOC; }; int getDebugPOC( ) const { return m_debugPOC; };
void setDebugPOC( int debugPOC ) { m_debugPOC = debugPOC; }; void setDebugPOC( int debugPOC ) { m_debugPOC = debugPOC; };
void resetAccessUnitNals() { m_accessUnitNals.clear(); } void resetAccessUnitNals() { m_accessUnitNals.clear(); }
#if JVET_P0101_POC_MULTILAYER
void resetAccessUnitPicInfo() { m_accessUnitPicInfo.clear(); }
#endif
void resetAccessUnitApsNals() { m_accessUnitApsNals.clear(); } void resetAccessUnitApsNals() { m_accessUnitApsNals.clear(); }
bool isSliceNaluFirstInAU( bool newPicture, InputNALUnit &nalu ); bool isSliceNaluFirstInAU( bool newPicture, InputNALUnit &nalu );
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment