From 43618a020f166fc35450e7e97dee557d7b325e38 Mon Sep 17 00:00:00 2001 From: sc29wg11 <zhangkai.video@bytedance.com> Date: Sat, 23 May 2020 18:58:24 -0700 Subject: [PATCH] Commit JVET-R0064 aspect 2 --- source/Lib/CommonLib/DepQuant.cpp | 10 ++++++++++ source/Lib/CommonLib/Quant.cpp | 23 +++++++++++++++++++++++ source/Lib/CommonLib/QuantRDOQ.cpp | 5 +++++ source/Lib/CommonLib/Slice.cpp | 5 +++++ source/Lib/CommonLib/Slice.h | 14 ++++++++++++++ source/Lib/CommonLib/TypeDef.h | 2 ++ source/Lib/DecoderLib/VLCReader.cpp | 8 ++++++++ source/Lib/EncoderLib/EncLib.cpp | 5 +++++ source/Lib/EncoderLib/VLCWriter.cpp | 7 +++++++ 9 files changed, 79 insertions(+) diff --git a/source/Lib/CommonLib/DepQuant.cpp b/source/Lib/CommonLib/DepQuant.cpp index 45ec89bc6..2bb92ba14 100644 --- a/source/Lib/CommonLib/DepQuant.cpp +++ b/source/Lib/CommonLib/DepQuant.cpp @@ -1591,7 +1591,12 @@ void DepQuant::quant( TransformUnit &tu, const ComponentID &compID, const CCoeff CHECK(scalingListType >= SCALING_LIST_NUM, "Invalid scaling list"); const uint32_t log2TrWidth = floorLog2(width); const uint32_t log2TrHeight = floorLog2(height); + +#if JVET_R0064 + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->slice->getSPS()->getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); #if JVET_R0380_SCALING_MATRIX_DISABLE_YCC_OR_RGB const bool disableSMForACT = tu.cs->slice->getSPS()->getScalingMatrixForAlternativeColourSpaceDisabledFlag() && (tu.cs->slice->getSPS()->getScalingMatrixDesignatedColourSpaceFlag() == tu.cu->colorTransform); @@ -1626,7 +1631,12 @@ void DepQuant::dequant( const TransformUnit &tu, CoeffBuf &dstCoeff, const Compo CHECK(scalingListType >= SCALING_LIST_NUM, "Invalid scaling list"); const uint32_t log2TrWidth = floorLog2(width); const uint32_t log2TrHeight = floorLog2(height); + +#if JVET_R0064 + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->slice->getSPS()->getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); #if JVET_R0380_SCALING_MATRIX_DISABLE_YCC_OR_RGB const bool disableSMForACT = tu.cs->slice->getSPS()->getScalingMatrixForAlternativeColourSpaceDisabledFlag() && (tu.cs->slice->getSPS()->getScalingMatrixDesignatedColourSpaceFlag() == tu.cu->colorTransform); diff --git a/source/Lib/CommonLib/Quant.cpp b/source/Lib/CommonLib/Quant.cpp index 0bc59f1e2..b95d60fb3 100644 --- a/source/Lib/CommonLib/Quant.cpp +++ b/source/Lib/CommonLib/Quant.cpp @@ -381,7 +381,12 @@ void Quant::dequant(const TransformUnit &tu, const TCoeff transformMinimum = -(1 << maxLog2TrDynamicRange); const TCoeff transformMaximum = (1 << maxLog2TrDynamicRange) - 1; const bool isTransformSkip = (tu.mtsIdx[compID] == MTS_SKIP); + +#if JVET_R0064 + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->slice->getSPS()->getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); #if JVET_R0380_SCALING_MATRIX_DISABLE_YCC_OR_RGB const bool disableSMForACT = tu.cs->slice->getSPS()->getScalingMatrixForAlternativeColourSpaceDisabledFlag() && (tu.cs->slice->getSPS()->getScalingMatrixDesignatedColourSpaceFlag() == tu.cu->colorTransform); @@ -1028,7 +1033,11 @@ void Quant::quant(TransformUnit &tu, const ComponentID &compID, const CCoeffBuf const uint32_t uiLog2TrWidth = floorLog2(uiWidth); const uint32_t uiLog2TrHeight = floorLog2(uiHeight); int *piQuantCoeff = getQuantCoeff(scalingListType, cQP.rem(useTransformSkip), uiLog2TrWidth, uiLog2TrHeight); +#if JVET_R0064 + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->slice->getSPS()->getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); #if JVET_R0380_SCALING_MATRIX_DISABLE_YCC_OR_RGB const bool disableSMForACT = tu.cs->slice->getSPS()->getScalingMatrixForAlternativeColourSpaceDisabledFlag() && (tu.cs->slice->getSPS()->getScalingMatrixDesignatedColourSpaceFlag() == tu.cu->colorTransform); @@ -1112,7 +1121,11 @@ bool Quant::xNeedRDOQ(TransformUnit &tu, const ComponentID &compID, const CCoeff const uint32_t uiLog2TrHeight = floorLog2(uiHeight); int *piQuantCoeff = getQuantCoeff(scalingListType, cQP.rem(useTransformSkip), uiLog2TrWidth, uiLog2TrHeight); +#if JVET_R0064 + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->slice->getSPS()->getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); #if JVET_R0380_SCALING_MATRIX_DISABLE_YCC_OR_RGB const bool disableSMForACT = tu.cs->slice->getSPS()->getScalingMatrixForAlternativeColourSpaceDisabledFlag() && (tu.cs->slice->getSPS()->getScalingMatrixDesignatedColourSpaceFlag() == tu.cu->colorTransform); @@ -1168,7 +1181,12 @@ void Quant::transformSkipQuantOneSample(TransformUnit &tu, const ComponentID &co const int channelBitDepth = sps.getBitDepth(toChannelType(compID)); const int iTransformShift = getTransformShift(channelBitDepth, rect.size(), maxLog2TrDynamicRange); const int scalingListType = getScalingListType(tu.cu->predMode, compID); + +#if JVET_R0064 + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->slice->getSPS()->getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); #if JVET_R0380_SCALING_MATRIX_DISABLE_YCC_OR_RGB const bool disableSMForACT = tu.cs->slice->getSPS()->getScalingMatrixForAlternativeColourSpaceDisabledFlag() && (tu.cs->slice->getSPS()->getScalingMatrixDesignatedColourSpaceFlag() == tu.cu->colorTransform); @@ -1233,7 +1251,12 @@ void Quant::invTrSkipDeQuantOneSample(TransformUnit &tu, const ComponentID &comp const int channelBitDepth = sps.getBitDepth(toChannelType(compID)); const int iTransformShift = getTransformShift(channelBitDepth, rect.size(), maxLog2TrDynamicRange); const int scalingListType = getScalingListType(tu.cu->predMode, compID); + +#if JVET_R0064 + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->slice->getSPS()->getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); #if JVET_R0380_SCALING_MATRIX_DISABLE_YCC_OR_RGB const bool disableSMForACT = tu.cs->slice->getSPS()->getScalingMatrixForAlternativeColourSpaceDisabledFlag() && (tu.cs->slice->getSPS()->getScalingMatrixDesignatedColourSpaceFlag() == tu.cu->colorTransform); diff --git a/source/Lib/CommonLib/QuantRDOQ.cpp b/source/Lib/CommonLib/QuantRDOQ.cpp index 9b4d0543a..23f3951d3 100644 --- a/source/Lib/CommonLib/QuantRDOQ.cpp +++ b/source/Lib/CommonLib/QuantRDOQ.cpp @@ -634,7 +634,12 @@ void QuantRDOQ::xRateDistOptQuant(TransformUnit &tu, const ComponentID &compID, const bool isTransformSkip = (tu.mtsIdx[compID] == MTS_SKIP); const double *const pdErrScale = xGetErrScaleCoeffSL(scalingListType, uiLog2BlockWidth, uiLog2BlockHeight, cQP.rem(isTransformSkip)); const int *const piQCoef = getQuantCoeff(scalingListType, cQP.rem(isTransformSkip), uiLog2BlockWidth, uiLog2BlockHeight); + +#if JVET_R0064 + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->slice->getSPS()->getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); #if JVET_R0380_SCALING_MATRIX_DISABLE_YCC_OR_RGB const bool disableSMForACT = tu.cs->slice->getSPS()->getScalingMatrixForAlternativeColourSpaceDisabledFlag() && (tu.cs->slice->getSPS()->getScalingMatrixDesignatedColourSpaceFlag() == tu.cu->colorTransform); diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index 4db41ba7b..c2c9c865e 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -2539,6 +2539,9 @@ SPS::SPS() , m_scalingMatrixAlternativeColourSpaceDisabledFlag( false ) , m_scalingMatrixDesignatedColourSpaceFlag( true ) #endif +#if JVET_R0064 +, m_disableScalingMatrixForLfnstBlks( true) +#endif { for(int ch=0; ch<MAX_NUM_CHANNEL_TYPE; ch++) { @@ -3383,7 +3386,9 @@ void ReferencePictureList::printRefPicInfo() const ScalingList::ScalingList() { +#if !JVET_R0064 m_disableScalingMatrixForLfnstBlks = true; +#endif m_chromaScalingListPresentFlag = true; for (uint32_t scalingListId = 0; scalingListId < 28; scalingListId++) { diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index c7f471ae7..3c6b66fb7 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -163,8 +163,11 @@ class ScalingList public: ScalingList(); virtual ~ScalingList() { } + +#if !JVET_R0064 bool getDisableScalingMatrixForLfnstBlks() const { return m_disableScalingMatrixForLfnstBlks;} void setDisableScalingMatrixForLfnstBlks(bool flag) { m_disableScalingMatrixForLfnstBlks = flag;} +#endif int* getScalingListAddress(uint32_t scalingListId) { return &(m_scalingListCoef[scalingListId][0]); } //!< get matrix coefficient const int* getScalingListAddress(uint32_t scalingListId) const { return &(m_scalingListCoef[scalingListId][0]); } //!< get matrix coefficient void checkPredMode(uint32_t scalingListId); @@ -226,7 +229,9 @@ public: private: void outputScalingLists(std::ostream &os) const; +#if !JVET_R0064 bool m_disableScalingMatrixForLfnstBlks; +#endif bool m_scalingListPredModeFlagIsCopy [30]; //!< reference list index int m_scalingListDC [30]; //!< the DC value of the matrix coefficient for 16x16 uint32_t m_refMatrixId [30]; //!< RefMatrixID @@ -1485,6 +1490,11 @@ private: bool m_scalingMatrixAlternativeColourSpaceDisabledFlag; bool m_scalingMatrixDesignatedColourSpaceFlag; #endif + +#if JVET_R0064 + bool m_disableScalingMatrixForLfnstBlks; +#endif + public: SPS(); @@ -1553,6 +1563,10 @@ public: void setSubPicTreatedAsPicFlag (const std::vector<bool> &v) { CHECK(v.size()!=m_numSubPics, "number of vector entries must be equal to numSubPics") ;m_subPicTreatedAsPicFlag = v; } void setLoopFilterAcrossSubpicEnabledFlag (const std::vector<bool> &v) { CHECK(v.size()!=m_numSubPics, "number of vector entries must be equal to numSubPics") ;m_loopFilterAcrossSubpicEnabledFlag = v; } +#if JVET_R0064 + bool getDisableScalingMatrixForLfnstBlks() const { return m_disableScalingMatrixForLfnstBlks; } + void setDisableScalingMatrixForLfnstBlks(bool flag) { m_disableScalingMatrixForLfnstBlks = flag; } +#endif void setSubPicIdMappingExplicitlySignalledFlag( bool b ) { m_subPicIdMappingExplicitlySignalledFlag = b; } bool getSubPicIdMappingExplicitlySignalledFlag() const { return m_subPicIdMappingExplicitlySignalledFlag; } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 9715ee901..97fad24f4 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -51,6 +51,8 @@ #include <cassert> //########### place macros to be removed in next cycle below this line ############### +#define JVET_R0064 1 // JVET-R0064, aspect 2: Move the flag scaling_matrix_for_lfnst_disabled_flag from the scaling_list_data( ) syntax to the SPS. + #define JVET_R0058 1 // JVET-R0058: the combination of RPR, subpictures, and scalability #define JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING 1 // JVET-R0078: disable chroma DBF offset signalling diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 4c5659142..6c6c2fba9 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -2171,6 +2171,11 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) pcSPS->setLog2ParallelMergeLevelMinus2(uiCode); #endif READ_FLAG(uiCode, "sps_explicit_scaling_list_enabled_flag"); pcSPS->setScalingListFlag(uiCode); + +#if JVET_R0064 + READ_FLAG(uiCode, "scaling_matrix_for_lfnst_disabled_flag"); pcSPS->setDisableScalingMatrixForLfnstBlks(uiCode ? true : false); +#endif + #if JVET_R0380_SCALING_MATRIX_DISABLE_YCC_OR_RGB if (pcSPS->getUseColorTrans() && pcSPS->getScalingListFlag()) { @@ -5431,7 +5436,10 @@ void HLSyntaxReader::parseScalingList(ScalingList* scalingList) { uint32_t code; bool scalingListCopyModeFlag; + +#if !JVET_R0064 READ_FLAG(code, "scaling_matrix_for_lfnst_disabled_flag"); scalingList->setDisableScalingMatrixForLfnstBlks(code ? true : false); +#endif READ_FLAG(code, "scaling_list_chroma_present_flag"); scalingList->setChromaScalingListPresentFlag(code ? true : false); for (int scalingListId = 0; scalingListId < 28; scalingListId++) diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index a1fa22624..0abebdbae 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -536,7 +536,12 @@ void EncLib::xInitScalingLists( SPS &sps, APS &aps ) getTrQuant( jId )->getQuant()->setUseScalingList( true ); } #endif + +#if JVET_R0064 + sps.setDisableScalingMatrixForLfnstBlks(getDisableScalingMatrixForLfnstBlks()); +#else aps.getScalingList().setDisableScalingMatrixForLfnstBlks(getDisableScalingMatrixForLfnstBlks()); +#endif } else { diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 1d312e738..aa47a6eee 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -1350,6 +1350,11 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) // KJS: remove scaling lists? WRITE_FLAG( pcSPS->getScalingListFlag() ? 1 : 0, "sps_scaling_list_enabled_flag" ); + +#if JVET_R0064 + WRITE_FLAG( pcSPS->getDisableScalingMatrixForLfnstBlks(), "scaling_matrix_for_lfnst_disabled_flag"); +#endif + #if JVET_R0380_SCALING_MATRIX_DISABLE_YCC_OR_RGB if (pcSPS->getUseColorTrans() && pcSPS->getScalingListFlag()) { @@ -3173,7 +3178,9 @@ void HLSWriter::xCodePredWeightTable(PicHeader *picHeader, const SPS *sps) void HLSWriter::codeScalingList( const ScalingList &scalingList ) { //for each size +#if !JVET_R0064 WRITE_FLAG(scalingList.getDisableScalingMatrixForLfnstBlks(), "scaling_matrix_for_lfnst_disabled_flag"); +#endif WRITE_FLAG(scalingList.getChromaScalingListPresentFlag(), "scaling_list_chroma_present_flag"); for (uint32_t scalingListId = 0; scalingListId < 28; scalingListId++) { -- GitLab