diff --git a/source/Lib/CommonLib/DepQuant.cpp b/source/Lib/CommonLib/DepQuant.cpp index 96bf315ea65f216df939c1829844f3028fcfbff9..7d2903c8ddc10018c4bb52fc622379910b00c83d 100644 --- a/source/Lib/CommonLib/DepQuant.cpp +++ b/source/Lib/CommonLib/DepQuant.cpp @@ -1586,7 +1586,11 @@ 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_Q0346_SCALING_LIST_USED_IN_SH + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif #if JVET_Q0784_LFNST_COMBINATION const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); const bool enableScalingLists = getUseScalingList(width, height, (tu.mtsIdx[compID] == MTS_SKIP), isLfnstApplied, disableSMForLFNST); @@ -1615,7 +1619,11 @@ 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_Q0346_SCALING_LIST_USED_IN_SH + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif #if JVET_Q0784_LFNST_COMBINATION const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); const bool enableScalingLists = getUseScalingList(width, height, (tu.mtsIdx[compID] == MTS_SKIP), isLfnstApplied, disableSMForLFNST); diff --git a/source/Lib/CommonLib/Quant.cpp b/source/Lib/CommonLib/Quant.cpp index de7b73323a85638b4d4f4fcc27a4d4199a06b26e..87fa5aa7c0524a99e863fdb29d878a3f77924668 100644 --- a/source/Lib/CommonLib/Quant.cpp +++ b/source/Lib/CommonLib/Quant.cpp @@ -381,8 +381,11 @@ 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_Q0346_SCALING_LIST_USED_IN_SH + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif #if JVET_Q0784_LFNST_COMBINATION const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); const bool enableScalingLists = getUseScalingList(uiWidth, uiHeight, isTransformSkip, isLfnstApplied, disableSMForLFNST); @@ -999,8 +1002,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_Q0346_SCALING_LIST_USED_IN_SH + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif #if JVET_Q0784_LFNST_COMBINATION const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); const bool enableScalingLists = getUseScalingList(uiWidth, uiHeight, useTransformSkip, isLfnstApplied, disableSMForLFNST); @@ -1079,7 +1085,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_Q0346_SCALING_LIST_USED_IN_SH + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif #if JVET_Q0784_LFNST_COMBINATION const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); const bool enableScalingLists = getUseScalingList(uiWidth, uiHeight, (useTransformSkip != 0), isLfnstApplied, disableSMForLFNST); @@ -1134,7 +1144,11 @@ 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_Q0346_SCALING_LIST_USED_IN_SH + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif #if JVET_Q0784_LFNST_COMBINATION const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); const bool enableScalingLists = getUseScalingList(uiWidth, uiHeight, true, isLfnstApplied, disableSMForLFNST); @@ -1198,7 +1212,11 @@ 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_Q0346_SCALING_LIST_USED_IN_SH + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif #if JVET_Q0784_LFNST_COMBINATION const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); const bool enableScalingLists = getUseScalingList(uiWidth, uiHeight, true, isLfnstApplied, disableSMForLFNST); diff --git a/source/Lib/CommonLib/QuantRDOQ.cpp b/source/Lib/CommonLib/QuantRDOQ.cpp index a258d7665c4bdd540568094d750326530d65aa75..a811c59b29f0ee05db5adef222ffabcdbed06a9d 100644 --- a/source/Lib/CommonLib/QuantRDOQ.cpp +++ b/source/Lib/CommonLib/QuantRDOQ.cpp @@ -629,7 +629,11 @@ 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_Q0346_SCALING_LIST_USED_IN_SH + const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#else const bool disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false; +#endif #if JVET_Q0784_LFNST_COMBINATION const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID)); const bool enableScalingLists = getUseScalingList(uiWidth, uiHeight, isTransformSkip, isLfnstApplied, disableSMForLFNST); diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index 9bcec39dc8a690887525c26f98664c571a42a21e..c1e6b92cad2b60f6a982cbfdbcda967ffea1e822 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -66,6 +66,9 @@ Slice::Slice() #if JVET_Q0346_LMCS_ENABLE_IN_SH , m_lmcsEnabledFlag ( 0 ) #endif +#if JVET_Q0346_SCALING_LIST_USED_IN_SH +, m_explicitScalingListUsed ( 0 ) +#endif , m_deblockingFilterDisable ( false ) , m_deblockingFilterOverrideFlag ( false ) , m_deblockingFilterBetaOffsetDiv2( 0 ) @@ -179,6 +182,9 @@ void Slice::initSlice() m_colRefIdx = 0; #if JVET_Q0346_LMCS_ENABLE_IN_SH m_lmcsEnabledFlag = 0; +#endif +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + m_explicitScalingListUsed = 0; #endif initEqualRef(); @@ -1047,6 +1053,10 @@ void Slice::copySliceInfo(Slice *pSrc, bool cpyAlmostAll) #if JVET_Q0346_LMCS_ENABLE_IN_SH m_lmcsEnabledFlag = pSrc->m_lmcsEnabledFlag; #endif +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + m_explicitScalingListUsed = pSrc->m_explicitScalingListUsed; +#endif + m_pendingRasInit = pSrc->m_pendingRasInit; for ( uint32_t e=0 ; e<NUM_REF_PIC_LIST_01 ; e++ ) @@ -2304,7 +2314,11 @@ PicHeader::PicHeader() , m_lmcsApsId ( -1 ) , m_lmcsAps ( nullptr ) , m_lmcsChromaResidualScaleFlag ( 0 ) +#if JVET_Q0346_SCALING_LIST_USED_IN_SH +, m_explicitScalingListEnabledFlag ( 0 ) +#else , m_scalingListPresentFlag ( 0 ) +#endif , m_scalingListApsId ( -1 ) , m_scalingListAps ( nullptr ) #if JVET_Q0819_PH_CHANGES @@ -2437,7 +2451,11 @@ void PicHeader::initPicHeader() m_lmcsApsId = -1; m_lmcsAps = nullptr; m_lmcsChromaResidualScaleFlag = 0; +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + m_explicitScalingListEnabledFlag = 0; +#else m_scalingListPresentFlag = 0; +#endif m_scalingListApsId = -1; m_scalingListAps = nullptr; #if JVET_Q0819_PH_CHANGES diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index 57bcfb5dda2d4852d07db8ad2f3f5cfc2646a39c..f9aebb6599c0f75d51275c9c745be64adde7a9a4 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -2548,7 +2548,11 @@ private: int m_lmcsApsId; //!< lmcs APS ID APS* m_lmcsAps; //!< lmcs APS bool m_lmcsChromaResidualScaleFlag; //!< lmcs chroma residual scale flag +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + bool m_explicitScalingListEnabledFlag; //!< explicit quantization scaling list enabled +#else bool m_scalingListPresentFlag; //!< quantization scaling lists present +#endif int m_scalingListApsId; //!< quantization scaling list APS ID APS* m_scalingListAps; //!< quantization scaling list APS unsigned m_minQT[3]; //!< minimum quad-tree size 0: I slice luma; 1: P/B slice; 2: I slice chroma @@ -2770,10 +2774,16 @@ public: APS* getScalingListAPS() const { return m_scalingListAps; } void setScalingListAPSId( int id ) { m_scalingListApsId = id; } int getScalingListAPSId() const { return m_scalingListApsId; } +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + void setExplicitScalingListEnabledFlag( bool b ) { m_explicitScalingListEnabledFlag = b; } + bool getExplicitScalingListEnabledFlag() { return m_explicitScalingListEnabledFlag; } + const bool getExplicitScalingListEnabledFlag() const { return m_explicitScalingListEnabledFlag; } +#else void setScalingListPresentFlag( bool b ) { m_scalingListPresentFlag = b; } bool getScalingListPresentFlag() { return m_scalingListPresentFlag; } const bool getScalingListPresentFlag() const { return m_scalingListPresentFlag; } - +#endif + unsigned* getMinQTSizes() const { return (unsigned *)m_minQT; } unsigned* getMaxMTTHierarchyDepths() const { return (unsigned *)m_maxMTTHierarchyDepth; } unsigned* getMaxBTSizes() const { return (unsigned *)m_maxBTSize; } @@ -2867,6 +2877,9 @@ private: bool m_ChromaQpAdjEnabled; #if JVET_Q0346_LMCS_ENABLE_IN_SH bool m_lmcsEnabledFlag; +#endif +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + bool m_explicitScalingListUsed; #endif bool m_deblockingFilterDisable; bool m_deblockingFilterOverrideFlag; //< offsets for deblocking filter inherit from PPS @@ -3037,6 +3050,11 @@ public: const bool getLmcsEnabledFlag() const { return m_lmcsEnabledFlag; } #endif +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + void setExplicitScalingListUsed(bool b) { m_explicitScalingListUsed = b; } + bool getExplicitScalingListUsed() { return m_explicitScalingListUsed; } +#endif + int getNumRefIdx( RefPicList e ) const { return m_aiNumRefIdx[e]; } Picture* getPic() { return m_pcPic; } const Picture* getPic() const { return m_pcPic; } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 24122063e80be1b7d591a10cd543eff38c1c9ac6..bb84d197851dcaf05f2df02898fd39501e175295 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -211,6 +211,10 @@ #define JVET_Q0346_LMCS_ENABLE_IN_SH 1 // JVET-Q0346 aspect 1: LMCS enabled flag in SH +#if JVET_Q0819_PH_CHANGES +#define JVET_Q0346_SCALING_LIST_USED_IN_SH 1 // JVET-Q0346 aspect 2: Scaling list used flag in SH +#endif + #define JVET_Q0267_RESET_CHROMA_QP_OFFSET 1 // JVET-Q0267: Reset chroma QP offsets at the start of each chroma QP offset group #define JVET_Q0293_REMOVAL_PDPC_CHROMA_NX2 1 // JVET-Q0293: Removal of chroma Nx2 blocks in PDPC diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index bcc6ada10fc8faf30fee5c6f279b2be8bd601b6f..7435af695d14a0e8f607c5aada14e7984ce0f1f8 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -480,9 +480,10 @@ DecLib::DecLib() , m_debugPOC( -1 ) , m_debugCTU( -1 ) , m_vps( nullptr ) +#if !JVET_Q0346_SCALING_LIST_USED_IN_SH , m_scalingListUpdateFlag(true) , m_PreScalingListAPSId(-1) - +#endif #if JVET_Q0044_SLICE_IDX_WITH_SUBPICS , m_maxDecSubPicIdx(0) , m_maxDecSliceAddrInSubPic(-1) @@ -1174,7 +1175,11 @@ void activateAPS(PicHeader* picHeader, Slice* pSlice, ParameterSetManager& param } picHeader->setLmcsAPS(lmcsAPS); +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + if( picHeader->getExplicitScalingListEnabledFlag() && scalingListAPS == nullptr) +#else if( picHeader->getScalingListPresentFlag() && scalingListAPS == nullptr) +#endif { scalingListAPS = parameterSetManager.getAPS( picHeader->getScalingListAPSId(), SCALING_LIST_APS ); CHECK( scalingListAPS == nullptr, "No SCALING LIST APS present" ); @@ -2278,6 +2283,15 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl Quant *quant = m_cTrQuant.getQuant(); +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + if (pcSlice->getExplicitScalingListUsed()) + { + APS* scalingListAPS = pcSlice->getPicHeader()->getScalingListAPS(); + ScalingList scalingList = scalingListAPS->getScalingList(); + quant->setScalingListDec(scalingList); + quant->setUseScalingList(true); + } +#else if( pcSlice->getSPS()->getScalingListFlag() ) { ScalingList scalingList; @@ -2299,12 +2313,12 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl } quant->setUseScalingList( true ); } +#endif else { quant->setUseScalingList( false ); } - if (pcSlice->getSPS()->getUseLmcs()) { if (m_bFirstSliceInPicture) @@ -2480,10 +2494,12 @@ void DecLib::xDecodeAPS(InputNALUnit& nalu) aps->setTemporalId(nalu.m_temporalId); aps->setLayerId( nalu.m_nuhLayerId ); m_parameterSetManager.checkAuApsContent( aps, m_accessUnitApsNals ); +#if !JVET_Q0346_SCALING_LIST_USED_IN_SH if (aps->getAPSType() == SCALING_LIST_APS) { setScalingListUpdateFlag(true); } +#endif // aps will be deleted if it was already stored (and did not changed), // thus, storing it must be last action. diff --git a/source/Lib/DecoderLib/DecLib.h b/source/Lib/DecoderLib/DecLib.h index f2cbeb66440b1b1bc6e2b47ca0a5607030544cf1..c9cc7f40e0785f8ba306a1f54afb18be81718b56 100644 --- a/source/Lib/DecoderLib/DecLib.h +++ b/source/Lib/DecoderLib/DecLib.h @@ -169,8 +169,10 @@ private: std::vector<std::tuple<NalUnitType, int, SEI::PayloadType>> m_accessUnitSeiPayLoadTypes; #endif VPS* m_vps; +#if !JVET_Q0346_SCALING_LIST_USED_IN_SH bool m_scalingListUpdateFlag; int m_PreScalingListAPSId; +#endif #if JVET_Q0044_SLICE_IDX_WITH_SUBPICS int m_maxDecSubPicIdx; int m_maxDecSliceAddrInSubPic; @@ -257,10 +259,12 @@ public: { m_cTrQuantScalingList.init(nullptr, MAX_TB_SIZEY, false, false, false, false); } +#if !JVET_Q0346_SCALING_LIST_USED_IN_SH bool getScalingListUpdateFlag() { return m_scalingListUpdateFlag; } void setScalingListUpdateFlag(bool b) { m_scalingListUpdateFlag = b; } int getPreScalingListAPSId() { return m_PreScalingListAPSId; } void setPreScalingListAPSId(int id) { m_PreScalingListAPSId = id; } +#endif protected: void xUpdateRasInit(Slice* slice); diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 73c418c2eb62f74de6691b8eb5a144fc7625d8c6..72e756250eb1793e929e153be4b0f61d30b972a5 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -2212,7 +2212,11 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) pcSPS->setLog2ParallelMergeLevelMinus2(uiCode); #endif +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + READ_FLAG(uiCode, "sps_explicit_scaling_list_enabled_flag"); pcSPS->setScalingListFlag(uiCode); +#else READ_FLAG( uiCode, "sps_scaling_list_enabled_flag" ); pcSPS->setScalingListFlag ( uiCode ); +#endif #if JVET_Q0246_VIRTUAL_BOUNDARY_ENABLE_FLAG READ_FLAG( uiCode, "sps_virtual_boundaries_enabled_flag" ); pcSPS->setVirtualBoundariesEnabledFlag( uiCode != 0 ); @@ -2870,9 +2874,15 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag // quantization scaling lists if (sps->getScalingListFlag()) { +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + READ_FLAG(uiCode, "ph_explicit_scaling_list_enabled_flag"); + picHeader->setExplicitScalingListEnabledFlag(uiCode); + if (picHeader->getExplicitScalingListEnabledFlag()) +#else READ_FLAG(uiCode, "ph_scaling_list_present_flag"); picHeader->setScalingListPresentFlag(uiCode); if (picHeader->getScalingListPresentFlag()) +#endif { READ_CODE(3, uiCode, "ph_scaling_list_aps_id"); picHeader->setScalingListAPSId(uiCode); @@ -2880,7 +2890,11 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag } else { +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + picHeader->setExplicitScalingListEnabledFlag(false); +#else picHeader->setScalingListPresentFlag(false); +#endif } #endif @@ -4927,7 +4941,17 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, PicHeader* picHeader, Par pcSlice->setLmcsEnabledFlag(false); } #endif - +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + if (picHeader->getExplicitScalingListEnabledFlag()) + { + READ_FLAG(uiCode, "slice_explicit_scaling_list_used_flag"); + pcSlice->setExplicitScalingListUsed(uiCode); + } + else + { + pcSlice->setExplicitScalingListUsed(false); + } +#endif if( pcSlice->getFirstCtuRsAddrInSlice() == 0 ) { pcSlice->setDefaultClpRng( *sps ); diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index 777172787f3f829dcd60d88df381713a1d42598c..fc22c67b1a21a07ba4b83c64ba6c20f1131c32eb 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -2780,7 +2780,12 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, if( pcSlice->getSPS()->getScalingListFlag() && m_pcCfg->getUseScalingListId() == SCALING_LIST_FILE_READ ) { +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + picHeader->setExplicitScalingListEnabledFlag( true ); + pcSlice->setExplicitScalingListUsed( true ); +#else picHeader->setScalingListPresentFlag( true ); +#endif int apsId = std::min<int>( 7, m_pcEncLib->getVPS() == nullptr ? 0 : m_pcEncLib->getVPS()->getGeneralLayerIdx( m_pcEncLib->getLayerId() ) ); picHeader->setScalingListAPSId( apsId ); @@ -2894,7 +2899,12 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, if( pcSlice->getSPS()->getScalingListFlag() && m_pcCfg->getUseScalingListId() == SCALING_LIST_FILE_READ ) { +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + picHeader->setExplicitScalingListEnabledFlag(true); + pcSlice->setExplicitScalingListUsed(true); +#else picHeader->setScalingListPresentFlag(true); +#endif int apsId = 0; picHeader->setScalingListAPSId( apsId ); } diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 0d71dc38bf02baf42c8859c39dd340411db97b13..75ca2b7935470df740d884cea1e96ecba4582d53 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -1964,15 +1964,24 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader ) // quantization scaling lists if( sps->getScalingListFlag() ) { +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + WRITE_FLAG( picHeader->getExplicitScalingListEnabledFlag(), "ph_scaling_list_present_flag" ); + if( picHeader->getExplicitScalingListEnabledFlag() ) +#else WRITE_FLAG( picHeader->getScalingListPresentFlag(), "ph_scaling_list_present_flag" ); if( picHeader->getScalingListPresentFlag() ) +#endif { WRITE_CODE( picHeader->getScalingListAPSId(), 3, "ph_scaling_list_aps_id" ); } } else { +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + picHeader->setExplicitScalingListEnabledFlag( false ); +#else picHeader->setScalingListPresentFlag( false ); +#endif } #endif @@ -3291,6 +3300,13 @@ void HLSWriter::codeSliceHeader ( Slice* pcSlice ) } #endif +#if JVET_Q0346_SCALING_LIST_USED_IN_SH + if (picHeader->getExplicitScalingListEnabledFlag()) + { + WRITE_FLAG(pcSlice->getExplicitScalingListUsed(), "slice_explicit_scaling_list_used_flag"); + } +#endif + if(pcSlice->getPPS()->getSliceHeaderExtensionPresentFlag()) { WRITE_UVLC(0,"slice_segment_header_extension_length");