diff --git a/source/Lib/CommonLib/Picture.h b/source/Lib/CommonLib/Picture.h index 6bae4640da1b3d96f63a9933a7b293cdc13b0b87..931e72868db1aedec902563fd7641961ca2c4847 100644 --- a/source/Lib/CommonLib/Picture.h +++ b/source/Lib/CommonLib/Picture.h @@ -331,6 +331,7 @@ public: #if JVET_N0415_CTB_ALF std::vector<short> m_alfCtbFilterIndex; short* getAlfCtbFilterIndex() { return m_alfCtbFilterIndex.data(); } + std::vector<short>& getAlfCtbFilterIndexVec() { return m_alfCtbFilterIndex; } void resizeAlfCtbFilterIndex(int numEntries) { m_alfCtbFilterIndex.resize(numEntries); diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index 7d94f34c97a52dc7b10d530a41362f63d1fd5b45..cf805614f21826458552d02e8226421e395919f5 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -867,6 +867,20 @@ void Slice::copySliceInfo(Slice *pSrc, bool cpyAlmostAll) } m_cabacInitFlag = pSrc->m_cabacInitFlag; +#if JVET_N0415_CTB_ALF + memcpy(m_apss, pSrc->m_apss, sizeof(m_apss)); // this might be quite unsafe + memcpy( m_tileGroupAlfEnabledFlag, pSrc->m_tileGroupAlfEnabledFlag, sizeof(m_tileGroupAlfEnabledFlag)); + m_tileGroupNumAps = pSrc->m_tileGroupNumAps; + m_tileGroupLumaApsId = pSrc->m_tileGroupLumaApsId; + m_tileGroupChromaApsId = pSrc->m_tileGroupChromaApsId; +#else + m_apsId; + m_aps; + m_tileGroupAlfEnabledFlag; +#endif +#if JVET_N0329_IBC_SEARCH_IMP + m_disableSATDForRd = pSrc->m_disableSATDForRd; +#endif m_bLMvdL1Zero = pSrc->m_bLMvdL1Zero; m_LFCrossSliceBoundaryFlag = pSrc->m_LFCrossSliceBoundaryFlag; diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index 537e84d9641be6a5a34fadef6546538fdf9939a8..5225e37f1df085808446200e7c15621d725902d5 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -201,6 +201,9 @@ bool tryDecodePicture( Picture* pcEncPic, const int expectedPoc, const std::stri if( pic->cs->sps->getALFEnabledFlag() ) { +#if JVET_N0415_CTB_ALF + std::copy(pic->getAlfCtbFilterIndexVec().begin(), pic->getAlfCtbFilterIndexVec().end(), pcEncPic->getAlfCtbFilterIndexVec().begin()); +#endif for( int compIdx = 0; compIdx < MAX_NUM_COMPONENT; compIdx++ ) { std::copy( pic->getAlfCtuEnableFlag()[compIdx].begin(), pic->getAlfCtuEnableFlag()[compIdx].end(), pcEncPic->getAlfCtuEnableFlag()[compIdx].begin() ); diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index b8c9adc0699a8be180a5947bfc94ce7a2547259e..f7bd00073894005c8d8a7a685ac675cc6c482963 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -2575,7 +2575,14 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, { ParameterSetMap<APS> *apsMap = m_pcEncLib->getApsMap(); APS* aps = apsMap->getPS(apsId); - if (aps && apsMap->getChangedFlag(apsId)) + bool writeAPS = aps && apsMap->getChangedFlag(apsId); + if( !aps && pcSlice->getAPSs() && pcSlice->getAPSs()[apsId] ) + { + writeAPS = true; + aps = pcSlice->getAPSs()[apsId]; // use asp from slice header + *apsMap->allocatePS( apsId ) = *aps; //allocate and cpy + } + if (writeAPS ) { actualTotalBits += xWriteAPS(accessUnit, aps); apsMap->clearChangedFlag(apsId);