diff --git a/source/Lib/CommonLib/CodingStructure.cpp b/source/Lib/CommonLib/CodingStructure.cpp index 93faa5f5aa835f8999ec34adb1347573a1b00000..2df5fd5627f5da1b1e4d9891815ce039e1f06ecb 100644 --- a/source/Lib/CommonLib/CodingStructure.cpp +++ b/source/Lib/CommonLib/CodingStructure.cpp @@ -1026,6 +1026,9 @@ void CodingStructure::initSubStructure( CodingStructure& subStruct, const Channe memcpy(subStruct.alfApss, alfApss, sizeof(alfApss)); subStruct.lmcsAps = lmcsAps; +#if JVET_O0299_APS_SCALINGLIST + subStruct.scalinglistAps = scalinglistAps; +#endif subStruct.slice = slice; subStruct.baseQP = baseQP; diff --git a/source/Lib/CommonLib/CodingStructure.h b/source/Lib/CommonLib/CodingStructure.h index 082238419a4671ccf786babbbfef835a64416ac7..d3c5c248f2dec86ff408a37a40628f2ba71131dd 100644 --- a/source/Lib/CommonLib/CodingStructure.h +++ b/source/Lib/CommonLib/CodingStructure.h @@ -107,6 +107,9 @@ public: APS* alfApss[MAX_NUM_APS]; #endif APS * lmcsAps; +#if JVET_O0299_APS_SCALINGLIST + APS * scalinglistAps; +#endif const VPS *vps; const PreCalcValues* pcv; diff --git a/source/Lib/CommonLib/Picture.cpp b/source/Lib/CommonLib/Picture.cpp index 776b2fa95636aee15a75726fd28371b574b2d3bf..73d3e108ad13f618e51398a21b628945bba69c67 100644 --- a/source/Lib/CommonLib/Picture.cpp +++ b/source/Lib/CommonLib/Picture.cpp @@ -886,7 +886,11 @@ const CPelUnitBuf Picture::getRecoBuf(const UnitArea &unit, bool wrap) const PelUnitBuf Picture::getRecoBuf(bool wrap) { return M_BUFS(scheduler.getSplitPicId(), wrap ? PIC_RECON_WRAP : PIC_RECONSTRUCTION); } const CPelUnitBuf Picture::getRecoBuf(bool wrap) const { return M_BUFS(scheduler.getSplitPicId(), wrap ? PIC_RECON_WRAP : PIC_RECONSTRUCTION); } +#if JVET_O0299_APS_SCALINGLIST +void Picture::finalInit( const SPS& sps, const PPS& pps, APS** alfApss, APS& lmcsAps, APS& scalingListAps ) +#else void Picture::finalInit(const SPS& sps, const PPS& pps, APS** alfApss, APS& lmcsAps) +#endif { for( auto &sei : SEIs ) { @@ -927,6 +931,9 @@ void Picture::finalInit(const SPS& sps, const PPS& pps, APS** alfApss, APS& lmcs cs->pps = &pps; memcpy(cs->alfApss, alfApss, sizeof(cs->alfApss)); cs->lmcsAps = &lmcsAps; +#if JVET_O0299_APS_SCALINGLIST + cs->scalinglistAps = &scalingListAps; +#endif cs->pcv = pps.pcv; @@ -947,6 +954,9 @@ void Picture::allocateNewSlice() memcpy(slice.getAlfAPSs(), cs->alfApss, sizeof(cs->alfApss)); slice.setLmcsAPS(cs->lmcsAps); +#if JVET_O0299_APS_SCALINGLIST + slice.setscalingListAPS( cs->scalinglistAps ); +#endif slice.setPPS( cs->pps); slice.setSPS( cs->sps); @@ -964,6 +974,9 @@ Slice *Picture::swapSliceObject(Slice * p, uint32_t i) p->setAlfAPSs(cs->alfApss); p->setLmcsAPS(cs->lmcsAps); +#if JVET_O0299_APS_SCALINGLIST + p->setscalingListAPS( cs->scalinglistAps ); +#endif Slice * pTmp = slices[i]; slices[i] = p; @@ -976,6 +989,9 @@ Slice *Picture::swapSliceObject(Slice * p, uint32_t i) #endif pTmp->setLmcsAPS(0); +#if JVET_O0299_APS_SCALINGLIST + pTmp->setscalingListAPS( 0 ); +#endif return pTmp; } diff --git a/source/Lib/CommonLib/Picture.h b/source/Lib/CommonLib/Picture.h index ae97b1d9174026682db293db9bb955ccc1627bee..f8e62a92c0e57b15a22b68acc3fc5b7126213f17 100644 --- a/source/Lib/CommonLib/Picture.h +++ b/source/Lib/CommonLib/Picture.h @@ -237,7 +237,11 @@ struct Picture : public UnitArea const CPelUnitBuf getBuf(const UnitArea &unit, const PictureType &type) const; void extendPicBorder(); +#if JVET_O0299_APS_SCALINGLIST + void finalInit( const SPS& sps, const PPS& pps, APS** alfApss, APS& lmcsAps, APS& scalingListAps ); +#else void finalInit(const SPS& sps, const PPS& pps, APS** alfApss, APS& lmcsAps); +#endif int getPOC() const { return poc; } void setBorderExtension( bool bFlag) { m_bIsBorderExtended = bFlag;} diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index 85a0ffba912488528bb5755f688e22c0cdfeb76d..07786dad7e1b72114d91efe75fdd4520931aac3c 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -125,6 +125,11 @@ Slice::Slice() , m_lmcsAps (nullptr) , m_tileGroupLmcsEnabledFlag (false) , m_tileGroupLmcsChromaResidualScaleFlag (false) +#if JVET_O0299_APS_SCALINGLIST +, m_scalingListApsId ( -1 ) +, m_scalingListAps ( nullptr ) +, m_tileGroupscalingListPresentFlag ( false ) +#endif { for(uint32_t i=0; i<NUM_REF_PIC_LIST_01; i++) { @@ -734,6 +739,12 @@ void Slice::copySliceInfo(Slice *pSrc, bool cpyAlmostAll) m_tileGroupLmcsChromaResidualScaleFlag = pSrc->m_tileGroupLmcsChromaResidualScaleFlag; m_lmcsAps = pSrc->m_lmcsAps; m_lmcsApsId = pSrc->m_lmcsApsId; + +#if JVET_O0299_APS_SCALINGLIST + m_tileGroupscalingListPresentFlag = pSrc->m_tileGroupscalingListPresentFlag; + m_scalingListAps = pSrc->m_scalingListAps; + m_scalingListApsId = pSrc->m_scalingListApsId; +#endif } @@ -2319,7 +2330,11 @@ uint32_t PreCalcValues::getMinQtSize( const Slice &slice, const ChannelType chTy } #if JVET_O1164_RPR +#if JVET_O0299_APS_SCALINGLIST +void Slice::scaleRefPicList( Picture *scaledRefPic[ ], APS** apss, APS& lmcsAps, APS& scalingListAps, const bool isDecoder ) +#else void Slice::scaleRefPicList( Picture *scaledRefPic[], APS** apss, APS& lmcsAps, const bool isDecoder ) +#endif { int i; const SPS* sps = getSPS(); @@ -2394,7 +2409,11 @@ void Slice::scaleRefPicList( Picture *scaledRefPic[], APS** apss, APS& lmcsAps, scaledRefPic[j]->reconstructed = false; scaledRefPic[j]->referenced = true; +#if JVET_O0299_APS_SCALINGLIST + scaledRefPic[ j ]->finalInit( *sps, *pps, apss, lmcsAps, scalingListAps ); +#else scaledRefPic[j]->finalInit( *sps, *pps, apss, lmcsAps ); +#endif scaledRefPic[j]->poc = -1; diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index b08aa2f7eae55620b40d4ea39573ef5fc870e150..f3e0f5031a17eb897ab8673a31fff94fa3efe39f 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -839,8 +839,10 @@ private: bool m_bTemporalIdNestingFlag; // temporal_id_nesting_flag bool m_scalingListEnabledFlag; +#if !JVET_O0299_APS_SCALINGLIST bool m_scalingListPresentFlag; ScalingList m_scalingList; +#endif uint32_t m_uiMaxDecPicBuffering[MAX_TLAYER]; uint32_t m_uiMaxLatencyIncreasePlus1[MAX_TLAYER]; @@ -1074,10 +1076,12 @@ public: bool getScalingListFlag() const { return m_scalingListEnabledFlag; } void setScalingListFlag( bool b ) { m_scalingListEnabledFlag = b; } +#if !JVET_O0299_APS_SCALINGLIST // remove from SPS bool getScalingListPresentFlag() const { return m_scalingListPresentFlag; } void setScalingListPresentFlag( bool b ) { m_scalingListPresentFlag = b; } ScalingList& getScalingList() { return m_scalingList; } const ScalingList& getScalingList() const { return m_scalingList; } +#endif uint32_t getMaxDecPicBuffering(uint32_t tlayer) const { return m_uiMaxDecPicBuffering[tlayer]; } void setMaxDecPicBuffering( uint32_t ui, uint32_t tlayer ) { CHECK(tlayer >= MAX_TLAYER, "Invalid T-layer"); m_uiMaxDecPicBuffering[tlayer] = ui; } uint32_t getMaxLatencyIncreasePlus1(uint32_t tlayer) const { return m_uiMaxLatencyIncreasePlus1[tlayer]; } @@ -1337,8 +1341,10 @@ private: bool m_ppsDeblockingFilterDisabledFlag; int m_deblockingFilterBetaOffsetDiv2; //< beta offset for deblocking filter int m_deblockingFilterTcOffsetDiv2; //< tc offset for deblocking filter +#if !JVET_O0299_APS_SCALINGLIST // PPS bool m_scalingListPresentFlag; ScalingList m_scalingList; //!< ScalingList class +#endif bool m_listsModificationPresentFlag; uint32_t m_log2ParallelMergeLevelMinus2; int m_numExtraSliceHeaderBits; @@ -1518,10 +1524,12 @@ public: int getDeblockingFilterBetaOffsetDiv2() const { return m_deblockingFilterBetaOffsetDiv2; } //!< get beta offset for deblocking filter void setDeblockingFilterTcOffsetDiv2(int val) { m_deblockingFilterTcOffsetDiv2 = val; } //!< set tc offset for deblocking filter int getDeblockingFilterTcOffsetDiv2() const { return m_deblockingFilterTcOffsetDiv2; } //!< get tc offset for deblocking filter +#if! JVET_O0299_APS_SCALINGLIST // PPS bool getScalingListPresentFlag() const { return m_scalingListPresentFlag; } void setScalingListPresentFlag( bool b ) { m_scalingListPresentFlag = b; } ScalingList& getScalingList() { return m_scalingList; } const ScalingList& getScalingList() const { return m_scalingList; } +#endif bool getListsModificationPresentFlag() const { return m_listsModificationPresentFlag; } void setListsModificationPresentFlag( bool b ) { m_listsModificationPresentFlag = b; } uint32_t getLog2ParallelMergeLevelMinus2() const { return m_log2ParallelMergeLevelMinus2; } @@ -1566,6 +1574,9 @@ private: int m_APSType; // aps_params_type AlfParam m_alfAPSParam; SliceReshapeInfo m_reshapeAPSInfo; +#if JVET_O0299_APS_SCALINGLIST + ScalingList m_scalingListApsInfo; +#endif public: APS(); @@ -1584,6 +1595,10 @@ public: void setReshaperAPSInfo(SliceReshapeInfo& reshapeAPSInfo) { m_reshapeAPSInfo = reshapeAPSInfo; } SliceReshapeInfo& getReshaperAPSInfo() { return m_reshapeAPSInfo; } +#if JVET_O0299_APS_SCALINGLIST + void setScalingList( ScalingList& scalingListAPSInfo ) { m_scalingListApsInfo = scalingListAPSInfo; } + ScalingList& getScalingList() { return m_scalingListApsInfo; } +#endif }; struct WPScalingParam { @@ -1751,6 +1766,11 @@ private: APS* m_lmcsAps; bool m_tileGroupLmcsEnabledFlag; bool m_tileGroupLmcsChromaResidualScaleFlag; +#if JVET_O0299_APS_SCALINGLIST + int m_scalingListApsId; + APS* m_scalingListAps; + bool m_tileGroupscalingListPresentFlag; +#endif public: Slice(); virtual ~Slice(); @@ -1779,6 +1799,15 @@ public: void setLmcsChromaResidualScaleFlag(bool b) { m_tileGroupLmcsChromaResidualScaleFlag = b; } bool getLmcsChromaResidualScaleFlag() { return m_tileGroupLmcsChromaResidualScaleFlag; } const bool getLmcsChromaResidualScaleFlag() const { return m_tileGroupLmcsChromaResidualScaleFlag; } +#if JVET_O0299_APS_SCALINGLIST + void setscalingListAPS( APS* scalingListAps ) { m_scalingListAps = scalingListAps; m_scalingListApsId = ( scalingListAps ) ? scalingListAps->getAPSId() : -1; } + APS* getscalingListAPS() { return m_scalingListAps; } + void setscalingListAPSId( int scalingListApsId ) { m_scalingListApsId = scalingListApsId; } + int getscalingListAPSId() const { return m_scalingListApsId; } + void setscalingListPresentFlag( bool b ) { m_tileGroupscalingListPresentFlag = b; } + bool getscalingListPresentFlag() { return m_tileGroupscalingListPresentFlag; } + const bool getscalingListPresentFlag() const { return m_tileGroupLmcsEnabledFlag; } +#endif void setPicOutputFlag( bool b ) { m_PicOutputFlag = b; } bool getPicOutputFlag() const { return m_PicOutputFlag; } void setSaoEnabledFlag(ChannelType chType, bool s) {m_saoEnabledFlag[chType] =s; } @@ -2048,7 +2077,11 @@ public: void setDisableSATDForRD(bool b) { m_disableSATDForRd = b; } bool getDisableSATDForRD() { return m_disableSATDForRd; } #if JVET_O1164_RPR +#if JVET_O0299_APS_SCALINGLIST + void scaleRefPicList( Picture *scaledRefPic[ ], APS** apss, APS& lmcsAps, APS& scalingListAps, const bool isDecoder ); +#else void scaleRefPicList( Picture *scaledRefPic[], APS** apss, APS& lmcsAps, const bool isDecoder ); +#endif void freeScaledRefPicList( Picture *scaledRefPic[] ); bool checkRPR(); const std::pair<int, int>& getScalingRatio( const RefPicList refPicList, const int refIdx ) const { return m_scalingRatio[refPicList][refIdx]; } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index c9390b3123eacc7e6906ae4edd05ffd033cdd4de..2c00190e0067ea7be29e229c65a7124f6fe9d2db 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -50,6 +50,8 @@ #include <assert.h> #include <cassert> +#define JVET_O0299_APS_SCALINGLIST 1 // JVET-O0299: Scaling List Matrices Support in APS + #define JVET_O1164_RPR 1 // JVET-O1164: Reference picture resampling #if JVET_O1164_RPR #define JVET_O1164_PS 1 @@ -498,6 +500,9 @@ enum ApsTypeValues { ALF_APS = 0, LMCS_APS = 1, +#if JVET_O0299_APS_SCALINGLIST + SCALING_LIST_APS = 2, +#endif }; enum QuantFlags diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index 65f7c9a941e261d5c12ff8b06d5345000238c323..d7a9718624ed783c11aa869f8386a38e7a68b094 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -838,6 +838,24 @@ void DecLib::xActivateParameterSets() } } +#if JVET_O0299_APS_SCALINGLIST + APS* scalinglistAPS = NULL; + if( m_apcSlicePilot->getscalingListAPSId() != -1 ) + { + scalinglistAPS = m_parameterSetManager.getAPS( m_apcSlicePilot->getscalingListAPSId(), SCALING_LIST_APS ); + CHECK( scalinglistAPS == 0, "No SCALING LIST APS present" ); + } + + if( scalinglistAPS ) + { + m_parameterSetManager.clearAPSChangedFlag( m_apcSlicePilot->getscalingListAPSId(), SCALING_LIST_APS ); + if( false == m_parameterSetManager.activateAPS( m_apcSlicePilot->getscalingListAPSId(), SCALING_LIST_APS ) ) + { + THROW( "SCALING LIST APS activation failed!" ); + } + } +#endif + xParsePrefixSEImessages(); #if RExt__HIGH_BIT_DEPTH_SUPPORT==0 @@ -851,7 +869,11 @@ void DecLib::xActivateParameterSets() m_pcPic = xGetNewPicBuffer (*sps, *pps, m_apcSlicePilot->getTLayer()); m_apcSlicePilot->applyReferencePictureListBasedMarking(m_cListPic, m_apcSlicePilot->getRPL0(), m_apcSlicePilot->getRPL1()); +#if JVET_O0299_APS_SCALINGLIST + m_pcPic->finalInit( *sps, *pps, apss, *lmcsAPS, *scalinglistAPS ); +#else m_pcPic->finalInit(*sps, *pps, apss, *lmcsAPS); +#endif m_parameterSetManager.getPPS(m_apcSlicePilot->getPPSId())->setNumBricksInPic((int)m_pcPic->brickMap->bricks.size()); m_pcPic->createTempBuffers( m_pcPic->cs->pps->pcv->maxCUWidth ); m_pcPic->cs->createCoeffs(); @@ -874,6 +896,9 @@ void DecLib::xActivateParameterSets() m_pcPic->cs->pps = pps; memcpy(m_pcPic->cs->alfApss, apss, sizeof(m_pcPic->cs->alfApss)); m_pcPic->cs->lmcsAps = lmcsAPS; +#if JVET_O0299_APS_SCALINGLIST + m_pcPic->cs->scalinglistAps = scalinglistAPS; +#endif m_pcPic->cs->pcv = pps->pcv; @@ -957,6 +982,9 @@ void DecLib::xActivateParameterSets() const PPS *pps = pSlice->getPPS(); APS** apss = pSlice->getAlfAPSs(); APS *lmcsAPS = pSlice->getLmcsAPS(); +#if JVET_O0299_APS_SCALINGLIST + APS *scalinglistAPS = pSlice->getscalingListAPS(); +#endif // fix Parameter Sets, now that we have the real slice m_pcPic->cs->slice = pSlice; @@ -964,6 +992,9 @@ void DecLib::xActivateParameterSets() m_pcPic->cs->pps = pps; memcpy(m_pcPic->cs->alfApss, apss, sizeof(m_pcPic->cs->alfApss)); m_pcPic->cs->lmcsAps = lmcsAPS; +#if JVET_O0299_APS_SCALINGLIST + m_pcPic->cs->scalinglistAps = scalinglistAPS; +#endif m_pcPic->cs->pcv = pps->pcv; @@ -993,6 +1024,12 @@ void DecLib::xActivateParameterSets() { EXIT("Error - a new LMCS APS has been decoded while processing a picture"); } +#if JVET_O0299_APS_SCALINGLIST + if( scalinglistAPS && m_parameterSetManager.getAPSChangedFlag( scalinglistAPS->getAPSId(), SCALING_LIST_APS ) ) + { + EXIT( "Error - a new SCALING LIST APS has been decoded while processing a picture" ); + } +#endif xParsePrefixSEImessages(); @@ -1269,7 +1306,11 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl pcSlice->constructRefPicList(m_cListPic); #if JVET_O1164_RPR +#if JVET_O0299_APS_SCALINGLIST + pcSlice->scaleRefPicList( scaledRefPic, m_parameterSetManager.getAPSs(), *pcSlice->getLmcsAPS(), *pcSlice->getscalingListAPS(), true ); +#else pcSlice->scaleRefPicList( scaledRefPic, m_parameterSetManager.getAPSs(), *pcSlice->getLmcsAPS(), true ); +#endif #endif if (!pcSlice->isIntra()) @@ -1405,6 +1446,27 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl Quant *quant = m_cTrQuant.getQuant(); +#if JVET_O0299_APS_SCALINGLIST + if( pcSlice->getSPS()->getScalingListFlag() ) + { + ScalingList scalingList; + if( pcSlice->getscalingListPresentFlag() ) + { + APS* scalingListAPS = pcSlice->getscalingListAPS(); + scalingList = scalingListAPS->getScalingList(); + } + else + { + scalingList.setDefaultScalingList(); + } + quant->setScalingListDec( scalingList ); + quant->setUseScalingList( true ); + } + else + { + quant->setUseScalingList( false ); + } +#else if(pcSlice->getSPS()->getScalingListFlag()) { ScalingList scalingList; @@ -1427,6 +1489,7 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl { quant->setUseScalingList(false); } +#endif if (pcSlice->getSPS()->getUseReshaper()) diff --git a/source/Lib/DecoderLib/DecSlice.cpp b/source/Lib/DecoderLib/DecSlice.cpp index 42b66acdaef5f78b5aca6c35bfe210f8a1bd60ce..909f680967196468f199ef73ce72fd636dcc586b 100644 --- a/source/Lib/DecoderLib/DecSlice.cpp +++ b/source/Lib/DecoderLib/DecSlice.cpp @@ -88,6 +88,9 @@ void DecSlice::decompressSlice( Slice* slice, InputBitstream* bitstream, int deb memcpy(cs.alfApss, slice->getAlfAPSs(), sizeof(cs.alfApss)); cs.lmcsAps = slice->getLmcsAPS(); +#if JVET_O0299_APS_SCALINGLIST + cs.scalinglistAps = slice->getscalingListAPS(); +#endif cs.pcv = slice->getPPS()->pcv; cs.chromaQpAdj = 0; diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index bb909f4b2b1fe4245a11442004cab7bf7c934c09..91c9ec1632fd0d6f75213610691d56142017a745 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -720,11 +720,13 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana } } +#if !JVET_O0299_APS_SCALINGLIST READ_FLAG( uiCode, "pps_scaling_list_data_present_flag" ); pcPPS->setScalingListPresentFlag( uiCode ? true : false ); if(pcPPS->getScalingListPresentFlag ()) { parseScalingList( &(pcPPS->getScalingList()) ); } +#endif READ_UVLC( uiCode, "log2_parallel_merge_level_minus2"); @@ -854,6 +856,20 @@ void HLSyntaxReader::parseAPS( APS* aps ) READ_CODE(3, code, "aps_params_type"); aps->setAPSType(code); +#if JVET_O0299_APS_SCALINGLIST + if( code == ALF_APS ) + { + parseAlfAps( aps ); + } + else if( code == LMCS_APS ) + { + parseLmcsAps( aps ); + } + else if( code == SCALING_LIST_APS ) + { + parseScalingListAps( aps ); + } +#else if (code == ALF_APS) { parseAlfAps(aps); @@ -862,6 +878,7 @@ void HLSyntaxReader::parseAPS( APS* aps ) { parseLmcsAps(aps); } +#endif READ_FLAG(code, "aps_extension_flag"); if (code) { @@ -996,6 +1013,13 @@ void HLSyntaxReader::parseLmcsAps( APS* aps ) aps->setReshaperAPSInfo(info); } +#if JVET_O0299_APS_SCALINGLIST +void HLSyntaxReader::parseScalingListAps( APS* aps ) +{ + ScalingList& info = aps->getScalingList(); + parseScalingList( &info ); +} +#endif void HLSyntaxReader::parseVUI(VUI* pcVUI, SPS *pcSPS) { @@ -1534,6 +1558,7 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) // KJS: remove scaling lists? READ_FLAG( uiCode, "scaling_list_enabled_flag" ); pcSPS->setScalingListFlag ( uiCode ); +#if !JVET_O0299_APS_SCALINGLIST if(pcSPS->getScalingListFlag()) { READ_FLAG( uiCode, "sps_scaling_list_data_present_flag" ); pcSPS->setScalingListPresentFlag ( uiCode ); @@ -1542,6 +1567,7 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) parseScalingList( &(pcSPS->getScalingList()) ); } } +#endif TimingInfo *timingInfo = pcSPS->getTimingInfo(); READ_FLAG( uiCode, "timing_info_present_flag"); timingInfo->setTimingInfoPresentFlag (uiCode ? true : false); @@ -2585,6 +2611,19 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para } } +#if JVET_O0299_APS_SCALINGLIST + if( sps->getScalingListFlag() ) + { + READ_FLAG( uiCode, "slice_scaling_list_present_flag" ); + pcSlice->setscalingListPresentFlag( uiCode ); + } + if( pcSlice->getscalingListPresentFlag() ) + { + READ_CODE( 3, uiCode, "slice_scaling_list_aps_id" ); + pcSlice->setscalingListAPSId( uiCode ); + } +#endif + if( pcSlice->getSliceCurStartBrickIdx() == 0 ) { pcSlice->setDefaultClpRng( *sps ); diff --git a/source/Lib/DecoderLib/VLCReader.h b/source/Lib/DecoderLib/VLCReader.h index fb11bd8807581378a177a768b5f79241caccff38..9bf0f8a1cdb1e9ea44b959f286df110c76a5cc0e 100644 --- a/source/Lib/DecoderLib/VLCReader.h +++ b/source/Lib/DecoderLib/VLCReader.h @@ -153,6 +153,9 @@ public: void parseAPS ( APS* pcAPS ); void parseAlfAps ( APS* pcAPS ); void parseLmcsAps ( APS* pcAPS ); +#if JVET_O0299_APS_SCALINGLIST + void parseScalingListAps ( APS* pcAPS ); +#endif void parseVUI ( VUI* pcVUI, SPS* pcSPS ); void parseConstraintInfo (ConstraintInfo *cinfo); void parseProfileTierLevel ( ProfileTierLevel *ptl, int maxNumSubLayersMinus1); diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index 509bd38338d702e58314689a6ebbc4972dff2c21..d0809fb04abfa788c3c5732af50bac64f8ae1701 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -2069,8 +2069,12 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, // Set reference list pcSlice->constructRefPicList(rcListPic); #if JVET_O1164_RPR +#if JVET_O0299_APS_SCALINGLIST + pcSlice->scaleRefPicList( scaledRefPic, m_pcEncLib->getApss(), *pcSlice->getLmcsAPS(), *pcSlice->getscalingListAPS(), false ); +#else pcSlice->scaleRefPicList( scaledRefPic, m_pcEncLib->getApss(), *pcSlice->getLmcsAPS(), false ); #endif +#endif #if JVET_O1164_PS xPicInitHashME( pcPic, pcSlice->getPPS(), rcListPic ); @@ -2506,6 +2510,20 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, xPicInitLMCS(pcPic, pcSlice); +#if JVET_O0299_APS_SCALINGLIST + if( pcSlice->getSPS()->getScalingListFlag() && m_pcCfg->getUseScalingListId() == SCALING_LIST_FILE_READ ) + { + pcSlice->setscalingListPresentFlag( true ); + int apsId = 0; + pcSlice->setscalingListAPSId( apsId ); + + ParameterSetMap<APS> *apsMap = m_pcEncLib->getApsMap(); + APS* scalingListAPS = apsMap->getPS( ( apsId << NUM_APS_TYPE_LEN ) + SCALING_LIST_APS ); + assert( scalingListAPS != NULL ); + pcSlice->setscalingListAPS( scalingListAPS ); + } +#endif + if( encPic ) // now compress (trial encode) the various slice segments (slices, and dependent slices) { @@ -2606,6 +2624,23 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, } #endif +#if JVET_O0299_APS_SCALINGLIST + if( pcSlice->getSPS()->getScalingListFlag() && m_pcCfg->getUseScalingListId() == SCALING_LIST_FILE_READ ) + { + pcSlice->setscalingListPresentFlag( true ); + int apsId = 0; + pcSlice->setscalingListAPSId( apsId ); + } + for( int s = 0; s < uiNumSliceSegments; s++ ) + { + pcPic->slices[ s ]->setscalingListPresentFlag( pcSlice->getscalingListPresentFlag() ); + if( pcSlice->getscalingListPresentFlag() ) + { + pcPic->slices[ s ]->setscalingListAPSId( pcSlice->getscalingListAPSId() ); + } + } +#endif + // SAO parameter estimation using non-deblocked pixels for CTU bottom and right boundary areas if( pcSlice->getSPS()->getSAOEnabledFlag() && m_pcCfg->getSaoCtuBoundary() ) { @@ -2776,6 +2811,23 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, } } +#if JVET_O0299_APS_SCALINGLIST + // only 1 SCALING LIST data for 1 picture + if( pcSlice->getSPS()->getScalingListFlag() && ( m_pcCfg->getUseScalingListId() == SCALING_LIST_FILE_READ ) ) + { + int apsId = pcSlice->getscalingListAPSId(); + ParameterSetMap<APS> *apsMap = m_pcEncLib->getApsMap(); + APS* aps = apsMap->getPS( ( apsId << NUM_APS_TYPE_LEN ) + SCALING_LIST_APS ); + bool writeAPS = aps && apsMap->getChangedFlag( ( apsId << NUM_APS_TYPE_LEN ) + SCALING_LIST_APS ); + if( writeAPS ) + { + actualTotalBits += xWriteAPS( accessUnit, aps ); + apsMap->clearChangedFlag( ( apsId << NUM_APS_TYPE_LEN ) + SCALING_LIST_APS ); + CHECK( aps != pcSlice->getscalingListAPS(), "Wrong SCALING LIST APS pointer in compressGOP" ); + } + } +#endif + if (pcSlice->getSPS()->getALFEnabledFlag() && pcSlice->getTileGroupAlfEnabledFlag(COMPONENT_Y)) { #if JVET_O_MAX_NUM_ALF_APS_8 diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index d6d21a10f753bbaf0af716e4a9689038f690d2e5..85e527c3ced427332fe67e1abf8bdec6fd32dd7f 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -66,6 +66,9 @@ EncLib::EncLib() , m_cacheModel() #endif , m_lmcsAPS(nullptr) +#if JVET_O0299_APS_SCALINGLIST + , m_scalinglistAPS( nullptr ) +#endif #if JVET_O0119_BASE_PALETTE_444 , m_doPlt( true ) #endif @@ -241,6 +244,11 @@ void EncLib::init( bool isFieldCoding, AUWriterIf* auWriterIf ) SPS &sps0=*(m_spsMap.allocatePS(0)); // NOTE: implementations that use more than 1 SPS need to be aware of activation issues. PPS &pps0=*(m_ppsMap.allocatePS(0)); +#if JVET_O0299_APS_SCALINGLIST + APS &aps0 = *( m_apsMap.allocatePS( SCALING_LIST_APS ) ); + aps0.setAPSId( 0 ); + aps0.setAPSType( SCALING_LIST_APS ); +#endif // initialize SPS xInitSPS(sps0); @@ -437,18 +445,31 @@ void EncLib::init( bool isFieldCoding, AUWriterIf* auWriterIf ) #if ER_CHROMA_QP_WCG_PPS if( m_wcgChromaQpControl.isEnabled() ) { +#if JVET_O0299_APS_SCALINGLIST + xInitScalingLists( sps0, *m_apsMap.getPS( 1 ) ); + xInitScalingLists( sps0, aps0 ); +#else xInitScalingLists( sps0, *m_ppsMap.getPS(1) ); xInitScalingLists( sps0, pps0 ); +#endif } else #endif { +#if JVET_O0299_APS_SCALINGLIST + xInitScalingLists( sps0, aps0 ); +#else xInitScalingLists( sps0, pps0 ); +#endif } #if JVET_O1164_RPR if( m_rprEnabled ) { +#if JVET_O0299_APS_SCALINGLIST + xInitScalingLists( sps0, *m_apsMap.getPS( ENC_PPS_ID_RPR ) ); +#else xInitScalingLists( sps0, *m_ppsMap.getPS( ENC_PPS_ID_RPR ) ); +#endif } #endif #if ENABLE_WPP_PARALLELISM @@ -463,7 +484,11 @@ void EncLib::init( bool isFieldCoding, AUWriterIf* auWriterIf ) picBg->create(sps0.getChromaFormatIdc(), Size(sps0.getPicWidthInLumaSamples(), sps0.getPicHeightInLumaSamples()), sps0.getMaxCUWidth(), sps0.getMaxCUWidth() + 16, false); #endif picBg->getRecoBuf().fill(0); +#if JVET_O0299_APS_SCALINGLIST + picBg->finalInit( sps0, pps0, m_apss, *m_lmcsAPS, *m_scalinglistAPS ); +#else picBg->finalInit(sps0, pps0, m_apss, *m_lmcsAPS); +#endif pps0.setNumBricksInPic((int)picBg->brickMap->bricks.size()); picBg->allocateNewSlice(); picBg->createSpliceIdx(pps0.pcv->sizeInCtus); @@ -479,14 +504,18 @@ void EncLib::init( bool isFieldCoding, AUWriterIf* auWriterIf ) } } +#if JVET_O0299_APS_SCALINGLIST +void EncLib::xInitScalingLists( SPS &sps, APS &aps ) +#else void EncLib::xInitScalingLists(SPS &sps, PPS &pps) +#endif { // Initialise scaling lists // The encoder will only use the SPS scaling lists. The PPS will never be marked present. const int maxLog2TrDynamicRange[MAX_NUM_CHANNEL_TYPE] = { - sps.getMaxLog2TrDynamicRange(CHANNEL_TYPE_LUMA), - sps.getMaxLog2TrDynamicRange(CHANNEL_TYPE_CHROMA) + sps.getMaxLog2TrDynamicRange(CHANNEL_TYPE_LUMA), + sps.getMaxLog2TrDynamicRange(CHANNEL_TYPE_CHROMA) }; Quant* quant = getTrQuant()->getQuant(); @@ -502,16 +531,23 @@ void EncLib::xInitScalingLists(SPS &sps, PPS &pps) getTrQuant( jId )->getQuant()->setUseScalingList( false ); } #endif +#if !JVET_O0299_APS_SCALINGLIST sps.setScalingListPresentFlag(false); pps.setScalingListPresentFlag(false); +#endif } else if(getUseScalingListId() == SCALING_LIST_DEFAULT) { +#if JVET_O0299_APS_SCALINGLIST + aps.getScalingList().setDefaultScalingList (); + quant->setScalingList( &( aps.getScalingList() ), maxLog2TrDynamicRange, sps.getBitDepths() ); +#else sps.getScalingList().setDefaultScalingList (); sps.setScalingListPresentFlag(false); pps.setScalingListPresentFlag(false); quant->setScalingList(&(sps.getScalingList()), maxLog2TrDynamicRange, sps.getBitDepths()); +#endif quant->setUseScalingList(true); #if ENABLE_SPLIT_PARALLELISM || ENABLE_WPP_PARALLELISM for( int jId = 1; jId < m_numCuEncStacks; jId++ ) @@ -522,6 +558,16 @@ void EncLib::xInitScalingLists(SPS &sps, PPS &pps) } else if(getUseScalingListId() == SCALING_LIST_FILE_READ) { +#if JVET_O0299_APS_SCALINGLIST + aps.getScalingList().setDefaultScalingList(); + CHECK( aps.getScalingList().xParseScalingList( getScalingListFileName() ), "Error Parsing Scaling List Input File" ); + aps.getScalingList().checkDcOfMatrix(); + if( aps.getScalingList().checkDefaultScalingList() == false ) + { + setUseScalingListId( SCALING_LIST_DEFAULT ); + } + quant->setScalingList( &( aps.getScalingList() ), maxLog2TrDynamicRange, sps.getBitDepths() ); +#else sps.getScalingList().setDefaultScalingList (); if(sps.getScalingList().xParseScalingList(getScalingListFileName())) { @@ -532,6 +578,7 @@ void EncLib::xInitScalingLists(SPS &sps, PPS &pps) pps.setScalingListPresentFlag(false); quant->setScalingList(&(sps.getScalingList()), maxLog2TrDynamicRange, sps.getBitDepths()); +#endif quant->setUseScalingList(true); #if ENABLE_SPLIT_PARALLELISM || ENABLE_WPP_PARALLELISM for( int jId = 1; jId < m_numCuEncStacks; jId++ ) @@ -545,7 +592,11 @@ void EncLib::xInitScalingLists(SPS &sps, PPS &pps) THROW("error : ScalingList == " << getUseScalingListId() << " not supported\n"); } +#if JVET_O0299_APS_SCALINGLIST + if( getUseScalingListId() == SCALING_LIST_FILE_READ ) +#else if (getUseScalingListId() == SCALING_LIST_FILE_READ && sps.getScalingListPresentFlag()) +#endif { // Prepare delta's: for (uint32_t sizeId = SCALING_LIST_2x2; sizeId <= SCALING_LIST_64x64; sizeId++) @@ -557,7 +608,11 @@ void EncLib::xInitScalingLists(SPS &sps, PPS &pps) { continue; } +#if JVET_O0299_APS_SCALINGLIST + aps.getScalingList().checkPredMode( sizeId, listId ); +#else sps.getScalingList().checkPredMode( sizeId, listId ); +#endif } } } @@ -620,7 +675,11 @@ void EncLib::encode( bool flush, PelStorage* pcPicYuvOrg, PelStorage* cPicYuvTru const SPS *sps = m_spsMap.getPS(pps->getSPSId()); picCurr->M_BUFS(0, PIC_ORIGINAL).copyFrom(m_cGOPEncoder.getPicBg()->getRecoBuf()); +#if JVET_O0299_APS_SCALINGLIST + picCurr->finalInit( *sps, *pps, m_apss, *m_lmcsAPS, *m_scalinglistAPS ); +#else picCurr->finalInit(*sps, *pps, m_apss, *m_lmcsAPS); +#endif picCurr->poc = m_iPOCLast - 1; m_iPOCLast -= 2; if (getUseAdaptiveQP()) @@ -716,7 +775,11 @@ void EncLib::encode( bool flush, PelStorage* pcPicYuvOrg, PelStorage* cPicYuvTru pcPicCurr->M_BUFS( 0, PIC_TRUE_ORIGINAL ).swap(*cPicYuvTrueOrg ); #endif +#if JVET_O0299_APS_SCALINGLIST + pcPicCurr->finalInit( *pSPS, *pPPS, m_apss, *m_lmcsAPS, *m_scalinglistAPS ); +#else pcPicCurr->finalInit(*pSPS, *pPPS, m_apss, *m_lmcsAPS); +#endif PPS *ptrPPS = (ppsID<0) ? m_ppsMap.getFirstPS() : m_ppsMap.getPS(ppsID); ptrPPS->setNumBricksInPic((int)pcPicCurr->brickMap->bricks.size()); } @@ -815,7 +878,11 @@ void EncLib::encode( bool flush, PelStorage* pcPicYuvOrg, PelStorage* pcPicYuvTr int ppsID=-1; // Use default PPS ID const PPS *pPPS=(ppsID<0) ? m_ppsMap.getFirstPS() : m_ppsMap.getPS(ppsID); const SPS *pSPS=m_spsMap.getPS(pPPS->getSPSId()); +#if JVET_O0299_APS_SCALINGLIST + pcField->finalInit( *pSPS, *pPPS, m_apss, *m_lmcsAPS, *m_scalinglistAPS ); +#else pcField->finalInit(*pSPS, *pPPS, m_apss, *m_lmcsAPS); +#endif } pcField->poc = m_iPOCLast; diff --git a/source/Lib/EncoderLib/EncLib.h b/source/Lib/EncoderLib/EncLib.h index 69bfefeb20467804d043222ad56854b58ee9771a..0aa443cd76c84300ad2cf52d03879a9f1b3990fe 100644 --- a/source/Lib/EncoderLib/EncLib.h +++ b/source/Lib/EncoderLib/EncLib.h @@ -145,6 +145,9 @@ private: #endif APS* m_lmcsAPS; +#if JVET_O0299_APS_SCALINGLIST + APS* m_scalinglistAPS; +#endif EncHRD m_encHRD; @@ -172,7 +175,11 @@ protected: void xInitSPS (SPS &sps); ///< initialize SPS from encoder options void xInitPPS (PPS &pps, const SPS &sps); ///< initialize PPS from encoder options void xInitAPS (APS &aps); ///< initialize APS from encoder options +#if JVET_O0299_APS_SCALINGLIST + void xInitScalingLists ( SPS &sps, APS &aps ); ///< initialize scaling lists +#else void xInitScalingLists (SPS &sps, PPS &pps); ///< initialize scaling lists +#endif void xInitPPSforLT(PPS& pps); void xInitHrdParameters(SPS &sps); ///< initialize HRDParameters parameters diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 40a12213aeca951622ca33dc2eb06009f55abd35..589b91f8f0cbf96005c516e0080d6e8f0a4cbfef 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -429,11 +429,13 @@ void HLSWriter::codePPS( const PPS* pcPPS ) } } +#if !JVET_O0299_APS_SCALINGLIST WRITE_FLAG( pcPPS->getScalingListPresentFlag() ? 1 : 0, "pps_scaling_list_data_present_flag" ); if( pcPPS->getScalingListPresentFlag() ) { codeScalingList( pcPPS->getScalingList() ); } +#endif WRITE_UVLC( pcPPS->getLog2ParallelMergeLevelMinus2(), "log2_parallel_merge_level_minus2"); WRITE_FLAG( pcPPS->getSliceHeaderExtensionPresentFlag() ? 1 : 0, "slice_segment_header_extension_present_flag"); @@ -541,6 +543,12 @@ void HLSWriter::codeAPS( APS* pcAPS ) { codeLmcsAps (pcAPS); } +#if JVET_O0299_APS_SCALINGLIST + else if( pcAPS->getAPSType() == SCALING_LIST_APS ) + { + codeScalingListAps( pcAPS ); + } +#endif WRITE_FLAG(0, "aps_extension_flag"); //Implementation when this flag is equal to 1 should be added when it is needed. Currently in the spec we don't have case when this flag is equal to 1 xWriteRbspTrailingBits(); } @@ -643,6 +651,14 @@ void HLSWriter::codeLmcsAps( APS* pcAPS ) } } +#if JVET_O0299_APS_SCALINGLIST +void HLSWriter::codeScalingListAps( APS* pcAPS ) +{ + ScalingList param = pcAPS->getScalingList(); + codeScalingList( param ); +} +#endif + void HLSWriter::codeVUI( const VUI *pcVUI, const SPS* pcSPS ) { #if ENABLE_TRACING @@ -1071,6 +1087,7 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) // KJS: remove scaling lists? WRITE_FLAG( pcSPS->getScalingListFlag() ? 1 : 0, "scaling_list_enabled_flag" ); +#if !JVET_O0299_APS_SCALINGLIST if(pcSPS->getScalingListFlag()) { WRITE_FLAG( pcSPS->getScalingListPresentFlag() ? 1 : 0, "sps_scaling_list_data_present_flag" ); @@ -1079,6 +1096,7 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) codeScalingList( pcSPS->getScalingList() ); } } +#endif const TimingInfo *timingInfo = pcSPS->getTimingInfo(); WRITE_FLAG(timingInfo->getTimingInfoPresentFlag(), "timing_info_present_flag"); @@ -1802,6 +1820,16 @@ void HLSWriter::codeSliceHeader ( Slice* pcSlice ) } } +#if JVET_O0299_APS_SCALINGLIST + if( pcSlice->getSPS()->getScalingListFlag() ) + { + WRITE_FLAG( pcSlice->getscalingListPresentFlag() ? 1 : 0, "slice_scaling_list_present_flag" ); + if( pcSlice->getscalingListPresentFlag() ) + { + WRITE_CODE( pcSlice->getscalingListAPSId(), 3, "slice_scaling_list_aps_id" ); + } + } +#endif if(pcSlice->getPPS()->getSliceHeaderExtensionPresentFlag()) { WRITE_UVLC(0,"slice_segment_header_extension_length"); diff --git a/source/Lib/EncoderLib/VLCWriter.h b/source/Lib/EncoderLib/VLCWriter.h index cca33464148a9043b11a6f4caaef9339470d46da..e18ab25ff92d9efd14c8f31cb75e21629ac069c3 100644 --- a/source/Lib/EncoderLib/VLCWriter.h +++ b/source/Lib/EncoderLib/VLCWriter.h @@ -132,6 +132,9 @@ public: void codeAPS ( APS* pcAPS ); void codeAlfAps ( APS* pcAPS ); void codeLmcsAps ( APS* pcAPS ); +#if JVET_O0299_APS_SCALINGLIST + void codeScalingListAps ( APS* pcAPS ); +#endif void codeVPS ( const VPS* pcVPS ); void codeDPS ( const DPS* dps ); void codeSliceHeader ( Slice* pcSlice );