From 21f83d59174709918248a81f1a5e28e4e1cbf93d Mon Sep 17 00:00:00 2001 From: Frank Bossen <fbossen@gmail.com> Date: Thu, 27 Oct 2022 00:25:46 +0200 Subject: [PATCH] Clean up handling of ALF data in Picture object --- source/Lib/CommonLib/Picture.cpp | 40 ++++++++++++++++++++++++ source/Lib/CommonLib/Picture.h | 49 ++++++++---------------------- source/Lib/DecoderLib/DecLib.cpp | 18 +---------- source/Lib/DecoderLib/DecSlice.cpp | 4 +-- source/Lib/EncoderLib/EncGOP.cpp | 4 +-- 5 files changed, 56 insertions(+), 59 deletions(-) diff --git a/source/Lib/CommonLib/Picture.cpp b/source/Lib/CommonLib/Picture.cpp index 9298d03723..8171445702 100644 --- a/source/Lib/CommonLib/Picture.cpp +++ b/source/Lib/CommonLib/Picture.cpp @@ -1616,3 +1616,43 @@ void Picture::xOutputPreFilteredPic(Picture* pcPic, PicList* pcListPic, int blen } #endif +void Picture::copyAlfData(const Picture &p) +{ + CHECK(p.m_alfCtbFilterIndex.size() != m_alfCtbFilterIndex.size(), "Size mismatch"); + + std::copy(p.m_alfCtbFilterIndex.begin(), p.m_alfCtbFilterIndex.end(), m_alfCtbFilterIndex.begin()); + + for (int compIdx = 0; compIdx < MAX_NUM_COMPONENT; compIdx++) + { + CHECK(p.m_alfCtuEnableFlag[compIdx].size() != m_alfCtuEnableFlag[compIdx].size(), "Size mismatch"); + + std::copy(p.m_alfCtuEnableFlag[compIdx].begin(), p.m_alfCtuEnableFlag[compIdx].end(), + m_alfCtuEnableFlag[compIdx].begin()); + } + + for (int compIdx = COMPONENT_Cb; compIdx < MAX_NUM_COMPONENT; compIdx++) + { + CHECK(p.m_alfCtuAlternative[compIdx].size() != m_alfCtuAlternative[compIdx].size(), "Size mismatch"); + + std::copy(p.m_alfCtuAlternative[compIdx].begin(), p.m_alfCtuAlternative[compIdx].end(), + m_alfCtuAlternative[compIdx].begin()); + } +} + +void Picture::resizeAlfData(const int numEntries) +{ + for (int compIdx = 0; compIdx < MAX_NUM_COMPONENT; compIdx++) + { + m_alfCtuEnableFlag[compIdx].resize(numEntries); + std::fill(m_alfCtuEnableFlag[compIdx].begin(), m_alfCtuEnableFlag[compIdx].end(), 0); + } + + m_alfCtbFilterIndex.resize(numEntries); + std::fill(m_alfCtbFilterIndex.begin(), m_alfCtbFilterIndex.end(), 0); + + for (int compIdx = 1; compIdx < MAX_NUM_COMPONENT; compIdx++) + { + m_alfCtuAlternative[compIdx].resize(numEntries); + std::fill(m_alfCtuAlternative[compIdx].begin(), m_alfCtuAlternative[compIdx].end(), 0); + } +} diff --git a/source/Lib/CommonLib/Picture.h b/source/Lib/CommonLib/Picture.h index 8838998222..6d6d9045e6 100644 --- a/source/Lib/CommonLib/Picture.h +++ b/source/Lib/CommonLib/Picture.h @@ -278,6 +278,12 @@ private: UnitArea m_ctuArea; #endif + std::vector<uint8_t> m_alfCtuEnableFlag[MAX_NUM_COMPONENT]; + std::vector<short> m_alfCtbFilterIndex; + std::vector<uint8_t> m_alfCtuAlternative[MAX_NUM_COMPONENT]; + + std::vector<SAOBlkParam> m_sao[2]; + public: SAOBlkParam *getSAO(int id = 0) { return &m_sao[id][0]; }; void resizeSAO(unsigned numEntries, int dstid) { m_sao[dstid].resize(numEntries); } @@ -286,46 +292,17 @@ public: #if ENABLE_QPA std::vector<double> m_uEnerHpCtu; ///< CTU-wise L2 or squared L1 norm of high-passed luma input std::vector<Pel> m_iOffsetCtu; ///< CTU-wise DC offset (later QP index offset) of luma input - #if ENABLE_QPA_SUB_CTU +#if ENABLE_QPA_SUB_CTU std::vector<int8_t> m_subCtuQP; ///< sub-CTU-wise adapted QPs for delta-QP depth of 1 or more - #endif +#endif #endif - std::vector<SAOBlkParam> m_sao[2]; + void copyAlfData(const Picture &p); + void resizeAlfData(int numEntries); - std::vector<uint8_t> m_alfCtuEnableFlag[MAX_NUM_COMPONENT]; - uint8_t* getAlfCtuEnableFlag( int compIdx ) { return m_alfCtuEnableFlag[compIdx].data(); } - std::vector<uint8_t>* getAlfCtuEnableFlag() { return m_alfCtuEnableFlag; } - void resizeAlfCtuEnableFlag( int numEntries ) - { - for( int compIdx = 0; compIdx < MAX_NUM_COMPONENT; compIdx++ ) - { - m_alfCtuEnableFlag[compIdx].resize( numEntries ); - std::fill( m_alfCtuEnableFlag[compIdx].begin(), m_alfCtuEnableFlag[compIdx].end(), 0 ); - } - } - 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); - for (int i = 0; i < numEntries; i++) - { - m_alfCtbFilterIndex[i] = 0; - } - } - std::vector<uint8_t> m_alfCtuAlternative[MAX_NUM_COMPONENT]; - std::vector<uint8_t>& getAlfCtuAlternative( int compIdx ) { return m_alfCtuAlternative[compIdx]; } - uint8_t* getAlfCtuAlternativeData( int compIdx ) { return m_alfCtuAlternative[compIdx].data(); } - void resizeAlfCtuAlternative( int numEntries ) - { - for( int compIdx = 1; compIdx < MAX_NUM_COMPONENT; compIdx++ ) - { - m_alfCtuAlternative[compIdx].resize( numEntries ); - std::fill( m_alfCtuAlternative[compIdx].begin(), m_alfCtuAlternative[compIdx].end(), 0 ); - } - } + uint8_t *getAlfCtuEnableFlag(int compIdx) { return m_alfCtuEnableFlag[compIdx].data(); } + short *getAlfCtbFilterIndex() { return m_alfCtbFilterIndex.data(); } + uint8_t *getAlfCtuAlternativeData(int compIdx) { return m_alfCtuAlternative[compIdx].data(); } }; int calcAndPrintHashStatus(const CPelUnitBuf& pic, const class SEIDecodedPictureHash* pictureHashSEI, const BitDepths &bitDepths, const MsgLevel msgl); diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index c443d2f811..7f53c8165c 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -199,23 +199,7 @@ bool tryDecodePicture( Picture* pcEncPic, const int expectedPoc, const std::stri if (pic->cs->sps->getALFEnabledFlag()) { - std::copy(pic->getAlfCtbFilterIndexVec().begin(), pic->getAlfCtbFilterIndexVec().end(), - pcEncPic->getAlfCtbFilterIndexVec().begin()); - for (int compIdx = 0; compIdx < MAX_NUM_COMPONENT; compIdx++) - { - std::copy(pic->getAlfCtuEnableFlag()[compIdx].begin(), pic->getAlfCtuEnableFlag()[compIdx].end(), - pcEncPic->getAlfCtuEnableFlag()[compIdx].begin()); - } - pcEncPic->resizeAlfCtbFilterIndex(pic->cs->pcv->sizeInCtus); - memcpy(pcEncPic->getAlfCtbFilterIndex(), pic->getAlfCtbFilterIndex(), - sizeof(short) * pic->cs->pcv->sizeInCtus); - - std::copy(pic->getAlfCtuAlternative(COMPONENT_Cb).begin(), - pic->getAlfCtuAlternative(COMPONENT_Cb).end(), - pcEncPic->getAlfCtuAlternative(COMPONENT_Cb).begin()); - std::copy(pic->getAlfCtuAlternative(COMPONENT_Cr).begin(), - pic->getAlfCtuAlternative(COMPONENT_Cr).end(), - pcEncPic->getAlfCtuAlternative(COMPONENT_Cr).begin()); + pcEncPic->copyAlfData(*pic); for (int i = 0; i < pic->slices.size(); i++) { diff --git a/source/Lib/DecoderLib/DecSlice.cpp b/source/Lib/DecoderLib/DecSlice.cpp index a14d5c9197..753f6dcdab 100644 --- a/source/Lib/DecoderLib/DecSlice.cpp +++ b/source/Lib/DecoderLib/DecSlice.cpp @@ -98,9 +98,7 @@ void DecSlice::decompressSlice( Slice* slice, InputBitstream* bitstream, int deb if (slice->getFirstCtuRsAddrInSlice() == 0) { - cs.picture->resizeAlfCtuEnableFlag( cs.pcv->sizeInCtus ); - cs.picture->resizeAlfCtbFilterIndex(cs.pcv->sizeInCtus); - cs.picture->resizeAlfCtuAlternative( cs.pcv->sizeInCtus ); + cs.picture->resizeAlfData(cs.pcv->sizeInCtus); } const unsigned numSubstreams = slice->getNumberOfSubstreamSizes() + 1; diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index a12333733d..eaa857cca7 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -3108,9 +3108,7 @@ void EncGOP::compressGOP(int pocLast, int numPicRcvd, PicList &rcListPic, std::l // it is used for signalling during CTU mode decision, i.e. before ALF processing if( pcSlice->getSPS()->getALFEnabledFlag() ) { - pcPic->resizeAlfCtuEnableFlag( numberOfCtusInFrame ); - pcPic->resizeAlfCtuAlternative( numberOfCtusInFrame ); - pcPic->resizeAlfCtbFilterIndex(numberOfCtusInFrame); + pcPic->resizeAlfData(numberOfCtusInFrame); } bool decPic = false; -- GitLab