From 11cfea0049824c888b9a8f47d716189dd478dd33 Mon Sep 17 00:00:00 2001 From: hobingzhang <hobingzhang@tencent.com> Date: Mon, 3 Feb 2020 21:21:13 +0800 Subject: [PATCH] Q0505-Disabling chroma scaling list signaling for 400 color format --- source/Lib/CommonLib/Quant.cpp | 7 +++++++ source/Lib/CommonLib/Slice.cpp | 3 +++ source/Lib/CommonLib/Slice.h | 8 +++++++- source/Lib/CommonLib/TypeDef.h | 2 ++ source/Lib/DecoderLib/VLCReader.cpp | 15 +++++++++++++++ source/Lib/EncoderLib/EncLib.cpp | 9 +++++++++ source/Lib/EncoderLib/VLCWriter.cpp | 10 ++++++++++ 7 files changed, 53 insertions(+), 1 deletion(-) diff --git a/source/Lib/CommonLib/Quant.cpp b/source/Lib/CommonLib/Quant.cpp index 90c526ab9..f57a415a6 100644 --- a/source/Lib/CommonLib/Quant.cpp +++ b/source/Lib/CommonLib/Quant.cpp @@ -544,6 +544,13 @@ void Quant::setScalingList(ScalingList *scalingList, const int maxLog2TrDynamicR { if ((size == SCALING_LIST_2x2 && list < 4) || (size == SCALING_LIST_64x64 && list % (SCALING_LIST_NUM / SCALING_LIST_PRED_MODES) != 0)) // skip 2x2 luma continue; +#if JVET_Q0505_CHROAM_QM_SIGNALING_400 + if (!(scalingList->getChromaScalingListPresentFlag() || list % (SCALING_LIST_NUM / SCALING_LIST_PRED_MODES) == 0 || (size ==SCALING_LIST_64x64)))// skip chroma QM for 400 + { + scalingList->processDefaultMatrix(scalingListId); + scalingListId++; continue; + } +#endif for(int qp = minimumQp; qp < maximumQp; qp++) { xSetScalingListEnc(scalingList, list, size, qp, scalingListId); diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index ca189b08a..bfca6c174 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -2891,6 +2891,9 @@ void ReferencePictureList::printRefPicInfo() const ScalingList::ScalingList() { m_disableScalingMatrixForLfnstBlks = true; +#if JVET_Q0505_CHROAM_QM_SIGNALING_400 + m_chromaScalingListPresentFlag = true; +#endif for (uint32_t scalingListId = 0; scalingListId < 28; scalingListId++) { int matrixSize = (scalingListId < SCALING_LIST_1D_START_4x4) ? 2 : (scalingListId < SCALING_LIST_1D_START_8x8) ? 4 : 8; diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index 97025ddb4..44256e01f 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -191,7 +191,10 @@ public: void codeScalingList(int* scalingList, int scalingListDC, int scalinListId, int& bitsCost); void setScalingListPreditorModeFlag(uint32_t scalingListId, bool bIsPred) { m_scalingListPreditorModeFlag[scalingListId] = bIsPred; } bool getScalingListPreditorModeFlag(uint32_t scalingListId) const { return m_scalingListPreditorModeFlag[scalingListId]; } - +#if JVET_Q0505_CHROAM_QM_SIGNALING_400 + bool getChromaScalingListPresentFlag() const {return m_chromaScalingListPresentFlag;} + void setChromaScalingListPresentFlag( bool flag) { m_chromaScalingListPresentFlag = flag;} + #endif void checkDcOfMatrix(); bool xParseScalingList(const std::string &fileName); void setDefaultScalingList(); @@ -232,6 +235,9 @@ private: uint32_t m_refMatrixId [30]; //!< RefMatrixID bool m_scalingListPreditorModeFlag [30]; //!< reference list index std::vector<int> m_scalingListCoef [30]; //!< quantization matrix + #if JVET_Q0505_CHROAM_QM_SIGNALING_400 + bool m_chromaScalingListPresentFlag; + #endif }; class ConstraintInfo diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 4d4e3e183..16ba237c5 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -50,6 +50,8 @@ #include <assert.h> #include <cassert> +#define JVET_Q0505_CHROAM_QM_SIGNALING_400 1 //JVET-Q0505: Cleanup of chroma quantization matrix signaling for 400 color format + #define JVET_Q0468_Q0469_MIN_LUMA_CB_AND_MIN_QT_FIX 1 // JVET-Q0468: add support of min Luma coding block size; JVET-Q0469: fix for signaling of Intra Chroma Min QT size #define JVET_Q0210_UEK_REMOVAL 1 // JVET-Q0210 Aspect 8: Replace uek signalling in alf_data with ue(v). diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 850a5383c..b4d3044e7 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -4522,8 +4522,16 @@ void HLSyntaxReader::parseScalingList(ScalingList* scalingList) uint32_t code; bool scalingListCopyModeFlag; READ_FLAG(code, "scaling_matrix_for_lfnst_disabled_flag"); scalingList->setDisableScalingMatrixForLfnstBlks(code ? true : false); +#if JVET_Q0505_CHROAM_QM_SIGNALING_400 + READ_FLAG(code, "scaling_list_chroma_present_flag"); + scalingList->setChromaScalingListPresentFlag(code ? true : false); +#endif for (int scalingListId = 0; scalingListId < 28; scalingListId++) { +#if JVET_Q0505_CHROAM_QM_SIGNALING_400 + if(scalingList->getChromaScalingListPresentFlag()|| scalingListId % 3 == 2 || scalingListId == 27) + { +#endif READ_FLAG(code, "scaling_list_copy_mode_flag"); scalingListCopyModeFlag = (code) ? true : false; scalingList->setScalingListCopyModeFlag(scalingListId, scalingListCopyModeFlag); @@ -4558,6 +4566,13 @@ void HLSyntaxReader::parseScalingList(ScalingList* scalingList) { decodeScalingList(scalingList, scalingListId, scalingList->getScalingListPreditorModeFlag(scalingListId)); } +#if JVET_Q0505_CHROAM_QM_SIGNALING_400 + } + else + { + scalingList->processDefaultMatrix(scalingListId); + } +#endif } return; diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index bbadea5e4..8212adc02 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -573,6 +573,9 @@ void EncLib::xInitScalingLists( SPS &sps, APS &aps ) { setUseScalingListId( SCALING_LIST_DEFAULT ); } +#if JVET_Q0505_CHROAM_QM_SIGNALING_400 + aps.getScalingList().setChromaScalingListPresentFlag((sps.getChromaFormatIdc()!=CHROMA_400)); +#endif quant->setScalingList( &( aps.getScalingList() ), maxLog2TrDynamicRange, sps.getBitDepths() ); quant->setUseScalingList(true); #if ENABLE_SPLIT_PARALLELISM @@ -593,7 +596,13 @@ void EncLib::xInitScalingLists( SPS &sps, APS &aps ) // Prepare delta's: for (uint32_t scalingListId = 0; scalingListId < 28; scalingListId++) { +#if JVET_Q0505_CHROAM_QM_SIGNALING_400 + if (aps.getScalingList().getChromaScalingListPresentFlag()|| scalingListId % 3 == 2 || scalingListId == 27){ +#endif aps.getScalingList().checkPredMode(scalingListId); +#if JVET_Q0505_CHROAM_QM_SIGNALING_400 + } +#endif } } } diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index fdbb056f8..53cbcbc1c 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -3090,8 +3090,15 @@ void HLSWriter::codeScalingList( const ScalingList &scalingList ) { //for each size WRITE_FLAG(scalingList.getDisableScalingMatrixForLfnstBlks(), "scaling_matrix_for_lfnst_disabled_flag"); + #if JVET_Q0505_CHROAM_QM_SIGNALING_400 + WRITE_FLAG(scalingList.getChromaScalingListPresentFlag(), "scaling_list_chroma_present_flag"); + #endif for (uint32_t scalingListId = 0; scalingListId < 28; scalingListId++) { +#if JVET_Q0505_CHROAM_QM_SIGNALING_400 + if(scalingList.getChromaScalingListPresentFlag()|| scalingListId % 3 == 2 || scalingListId == 27) + { +#endif bool scalingListCopyModeFlag = scalingList.getScalingListCopyModeFlag(scalingListId); WRITE_FLAG(scalingListCopyModeFlag, "scaling_list_copy_mode_flag"); //copy mode if (!scalingListCopyModeFlag)// Copy Mode @@ -3107,6 +3114,9 @@ void HLSWriter::codeScalingList( const ScalingList &scalingList ) //DPCM xCodeScalingList(&scalingList, scalingListId, scalingList.getScalingListPreditorModeFlag(scalingListId)); } +#if JVET_Q0505_CHROAM_QM_SIGNALING_400 + } +#endif } return; } -- GitLab