diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index 0b607527abf8862924a2b6eefb7dddbe8c5d2f8d..f94e4718785e9da3d852e546ebb279cf8c874b88 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -1718,6 +1718,10 @@ void ChromaQpMappingTable::setParams(const ChromaQpMappingTableParams ¶ms, c { m_qpBdOffset = qpBdOffset; m_sameCQPTableForAllChromaFlag = params.m_sameCQPTableForAllChromaFlag; +#if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR + m_numQpTables = params.m_numQpTables; +#endif + for (int i = 0; i < MAX_NUM_CQP_MAPPING_TABLES; i++) { m_numPtsInCQPTableMinus1[i] = params.m_numPtsInCQPTableMinus1[i]; @@ -1727,7 +1731,11 @@ void ChromaQpMappingTable::setParams(const ChromaQpMappingTableParams ¶ms, c } void ChromaQpMappingTable::derivedChromaQPMappingTables() { +#if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR + for (int i = 0; i < getNumQpTables(); i++) +#else for (int i = 0; i < (getSameCQPTableForAllChromaFlag() ? 1 : 3); i++) +#endif { const int qpBdOffsetC = m_qpBdOffset; const int numPtsInCQPTableMinus1 = getNumPtsInCQPTableMinus1(i); diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index dc98597b86cd5268ee8e00872f37ebf0c746c6d8..2473763fcd0fd648df6c2529a6969bda07bff045 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -488,6 +488,9 @@ struct ChromaQpAdj struct ChromaQpMappingTableParams { int m_qpBdOffset; bool m_sameCQPTableForAllChromaFlag; +#if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR + int m_numQpTables; +#endif int m_numPtsInCQPTableMinus1[MAX_NUM_CQP_MAPPING_TABLES]; std::vector<int> m_deltaQpInValMinus1[MAX_NUM_CQP_MAPPING_TABLES]; std::vector<int> m_deltaQpOutVal[MAX_NUM_CQP_MAPPING_TABLES]; @@ -496,6 +499,9 @@ struct ChromaQpMappingTableParams { { m_qpBdOffset = 12; m_sameCQPTableForAllChromaFlag = true; +#if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR + m_numQpTables = 1; +#endif m_numPtsInCQPTableMinus1[0] = 0; m_deltaQpInValMinus1[0] = { 0 }; m_deltaQpOutVal[0] = { 0 }; @@ -503,6 +509,10 @@ struct ChromaQpMappingTableParams { void setSameCQPTableForAllChromaFlag(bool b) { m_sameCQPTableForAllChromaFlag = b; } bool getSameCQPTableForAllChromaFlag() const { return m_sameCQPTableForAllChromaFlag; } +#if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR + void setNumQpTables(int n) { m_numQpTables = n; } + int getNumQpTables() const { return m_numQpTables; } +#endif void setNumPtsInCQPTableMinus1(int tableIdx, int n) { m_numPtsInCQPTableMinus1[tableIdx] = n; } int getNumPtsInCQPTableMinus1(int tableIdx) const { return m_numPtsInCQPTableMinus1[tableIdx]; } void setDeltaQpInValMinus1(int tableIdx, std::vector<int> &inVals) { m_deltaQpInValMinus1[tableIdx] = inVals; } diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 4a220e1062f85b24323fa7ef82c3e1778c19732e..7cf5a6e66fad659eeec664eed66dec55aefcde2f 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -1367,8 +1367,9 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) ChromaQpMappingTableParams chromaQpMappingTableParams; READ_FLAG(uiCode, "same_qp_table_for_chroma"); chromaQpMappingTableParams.setSameCQPTableForAllChromaFlag(uiCode); #if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR - int numQPTables = chromaQpMappingTableParams.getSameCQPTableForAllChromaFlag() ? 1 : (pcSPS->getJointCbCrEnabledFlag() ? 3 : 2); - for (int i = 0; i < numQPTables; i++) + int numQpTables = chromaQpMappingTableParams.getSameCQPTableForAllChromaFlag() ? 1 : (pcSPS->getJointCbCrEnabledFlag() ? 3 : 2); + chromaQpMappingTableParams.setNumQpTables(numQpTables); + for (int i = 0; i < numQpTables; i++) #else for (int i = 0; i < (chromaQpMappingTableParams.getSameCQPTableForAllChromaFlag() ? 1 : 3); i++) #endif diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index 37a1184f733c7ffe5f8d5803c6fdba2d37c5bdae..172a190ed7352dd13083955a6de302b7538b95f1 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -1112,6 +1112,10 @@ void EncLib::xInitSPS(SPS &sps) sps.setLtRefPicPocLsbSps(k, 0); sps.setUsedByCurrPicLtSPSFlag(k, 0); } +#if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR + int numQpTables = m_chromaQpMappingTableParams.getSameCQPTableForAllChromaFlag() ? 1 : (sps.getJointCbCrEnabledFlag() ? 3 : 2); + m_chromaQpMappingTableParams.setNumQpTables(numQpTables); +#endif sps.setChromaQpMappingTableFromParams(m_chromaQpMappingTableParams, sps.getQpBDOffset(CHANNEL_TYPE_CHROMA)); sps.derivedChromaQPMappingTables(); diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index d5d10ce2706fb99d999f243a182079fd916e620c..0f8109952499dbf8bc610a80d6ac937a41e2d63f 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -816,8 +816,9 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) const ChromaQpMappingTable& chromaQpMappingTable = pcSPS->getChromaQpMappingTable(); WRITE_FLAG(chromaQpMappingTable.getSameCQPTableForAllChromaFlag(), "same_qp_table_for_chroma"); #if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR - int numQPTables = chromaQpMappingTable.getSameCQPTableForAllChromaFlag() ? 1 : (pcSPS->getJointCbCrEnabledFlag() ? 3 : 2); - for (int i = 0; i < numQPTables; i++) + int numQpTables = chromaQpMappingTable.getSameCQPTableForAllChromaFlag() ? 1 : (pcSPS->getJointCbCrEnabledFlag() ? 3 : 2); + CHECK(numQpTables != chromaQpMappingTable.getNumQpTables(), " numQpTables does not match at encoder side "); + for (int i = 0; i < numQpTables; i++) #else for (int i = 0; i < (chromaQpMappingTable.getSameCQPTableForAllChromaFlag() ? 1 : 3); i++) #endif