From d0ab993976b4c8ee28c923cc368e29cf738478fe Mon Sep 17 00:00:00 2001 From: phil <cowanp@sharplabs.com> Date: Fri, 8 May 2020 14:51:09 -0700 Subject: [PATCH] JVET-R0107: Proposal 2 - VPS signaling change and updated inference rule --- source/Lib/CommonLib/TypeDef.h | 2 ++ source/Lib/DecoderLib/VLCReader.cpp | 31 +++++++++++++++++++++++++++++ source/Lib/EncoderLib/VLCWriter.cpp | 19 ++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index b62daf9ea..e7b31e0fb 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -171,6 +171,8 @@ #define JVET_R0108_DCI_SIGNALING 1 // JVET-R0108 Proposal 1 DCI signaling changes +#define JVET_R0107_VPS_SIGNALING 1 // JVET-R017: Proposal 2 VPS signaling change and updated inference rule + //########### place macros to be be kept below this line ############### #define JVET_R0164_MEAN_SCALED_SATD 1 // JVET-R0164: Use a mean scaled version of SATD in encoder decisions diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 81c41b921..ea76c02de 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -2249,15 +2249,26 @@ void HLSyntaxReader::parseVPS(VPS* pcVPS) } else pcVPS->setPtPresentFlag(0, 1); +#if JVET_R0107_VPS_SIGNALING + if (!pcVPS->getAllLayersSameNumSublayersFlag()) +#else if(pcVPS->getMaxSubLayers() > 1 && !pcVPS->getAllLayersSameNumSublayersFlag()) +#endif { READ_CODE(3, uiCode, "ptl_max_temporal_id"); pcVPS->setPtlMaxTemporalId(i, uiCode); } +#if JVET_R0107_VPS_SIGNALING + else + { + pcVPS->setPtlMaxTemporalId(i, pcVPS->getMaxSubLayers() - 1); + } +#else else if(pcVPS->getMaxSubLayers() > 1) pcVPS->setPtlMaxTemporalId(i, pcVPS->getMaxSubLayers() - 1); else pcVPS->setPtlMaxTemporalId(i, 0); +#endif } int cnt = 0; while (m_pcBitstream->getNumBitsUntilByteAligned()) @@ -2323,6 +2334,17 @@ void HLSyntaxReader::parseVPS(VPS* pcVPS) for( int i = 0; i < pcVPS->m_numDpbParams; i++ ) { +#if JVET_R0107_VPS_SIGNALING + if (!pcVPS->getAllLayersSameNumSublayersFlag()) + { + READ_CODE(3, uiCode, "dpb_max_temporal_id[i]"); + pcVPS->m_dpbMaxTemporalId.push_back(uiCode); + } + else + { + pcVPS->m_dpbMaxTemporalId.push_back(pcVPS->getMaxSubLayers() - 1); + } +#else if( pcVPS->getMaxSubLayers() == 1 ) { // When vps_max_sublayers_minus1 is equal to 0, the value of dpb_max_temporal_id[ i ] is inferred to be equal to 0. @@ -2340,6 +2362,7 @@ void HLSyntaxReader::parseVPS(VPS* pcVPS) READ_CODE( 3, uiCode, "dpb_max_temporal_id[i]" ); pcVPS->m_dpbMaxTemporalId.push_back( uiCode ); } } +#endif for( int j = ( pcVPS->m_sublayerDpbParamsPresentFlag ? 0 : pcVPS->m_dpbMaxTemporalId[i] ); j <= pcVPS->m_dpbMaxTemporalId[i]; j++ ) { @@ -2414,12 +2437,19 @@ void HLSyntaxReader::parseVPS(VPS* pcVPS) pcVPS->m_olsHrdParams.resize(pcVPS->getNumOlsHrdParamsMinus1(), std::vector<OlsHrdParams>(pcVPS->getMaxSubLayers())); for (int i = 0; i <= pcVPS->getNumOlsHrdParamsMinus1(); i++) { +#if JVET_R0107_VPS_SIGNALING + if (!pcVPS->getAllLayersSameNumSublayersFlag()) +#else if (((pcVPS->getMaxSubLayers() - 1) > 0) && (!pcVPS->getAllLayersSameNumSublayersFlag())) +#endif { READ_CODE(3, uiCode, "hrd_max_tid[i]"); pcVPS->setHrdMaxTid(i, uiCode); } else { +#if JVET_R0107_VPS_SIGNALING + pcVPS->setHrdMaxTid(i, pcVPS->getMaxSubLayers() - 1); +#else if (pcVPS->getMaxSubLayers() == 1) { pcVPS->setHrdMaxTid(i, 0); @@ -2428,6 +2458,7 @@ void HLSyntaxReader::parseVPS(VPS* pcVPS) { pcVPS->setHrdMaxTid(i, pcVPS->getMaxSubLayers()- 1); } +#endif } uint32_t firstSublayer = pcVPS->getVPSSublayerCpbParamsPresentFlag() ? 0 : pcVPS->getHrdMaxTid(i); diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index b03c45c8d..f1fa2baff 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -1429,7 +1429,11 @@ void HLSWriter::codeVPS(const VPS* pcVPS) { if(i > 0) WRITE_FLAG(pcVPS->getPtPresentFlag(i), "pt_present_flag"); +#if JVET_R0107_VPS_SIGNALING + if (!pcVPS->getAllLayersSameNumSublayersFlag()) +#else if(pcVPS->getMaxSubLayers() > 1 && !pcVPS->getAllLayersSameNumSublayersFlag()) +#endif WRITE_CODE(pcVPS->getPtlMaxTemporalId(i) ,3, "ptl_max_temporal_id"); } int cnt = 0; @@ -1465,6 +1469,16 @@ void HLSWriter::codeVPS(const VPS* pcVPS) for( int i = 0; i < pcVPS->m_numDpbParams; i++ ) { +#if JVET_R0107_VPS_SIGNALING + if (!pcVPS->getAllLayersSameNumSublayersFlag()) + { + WRITE_CODE(pcVPS->m_dpbMaxTemporalId[i], 3, "dpb_max_temporal_id[i]"); + } + else + { + CHECK(pcVPS->m_dpbMaxTemporalId[i] != pcVPS->getMaxSubLayers() - 1, "When vps_all_layers_same_num_sublayers_flag is equal to 1, the value of dpb_max_temporal_id[ i ] is inferred to be equal to vps_max_sublayers_minus1"); + } +#else if( pcVPS->getMaxSubLayers() == 1 ) { CHECK( pcVPS->m_dpbMaxTemporalId[i] != 0, "When vps_max_sublayers_minus1 is equal to 0, the value of dpb_max_temporal_id[ i ] is inferred to be equal to 0" ); @@ -1480,6 +1494,7 @@ void HLSWriter::codeVPS(const VPS* pcVPS) WRITE_CODE( pcVPS->m_dpbMaxTemporalId[i], 3, "dpb_max_temporal_id[i]" ); } } +#endif for( int j = ( pcVPS->m_sublayerDpbParamsPresentFlag ? 0 : pcVPS->m_dpbMaxTemporalId[i] ); j <= pcVPS->m_dpbMaxTemporalId[i]; j++ ) { @@ -1515,7 +1530,11 @@ void HLSWriter::codeVPS(const VPS* pcVPS) WRITE_UVLC(pcVPS->getNumOlsHrdParamsMinus1(), "num_ols_hrd_params_minus1"); for (int i = 0; i <= pcVPS->getNumOlsHrdParamsMinus1(); i++) { +#if JVET_R0107_VPS_SIGNALING + if (!pcVPS->getAllLayersSameNumSublayersFlag()) +#else if (((pcVPS->getMaxSubLayers()-1) > 0) && (!pcVPS->getAllLayersSameNumSublayersFlag())) +#endif { WRITE_CODE(pcVPS->getHrdMaxTid(i), 3, "hrd_max_tid[i]"); } -- GitLab