diff --git a/source/Lib/CommonLib/CodingStructure.cpp b/source/Lib/CommonLib/CodingStructure.cpp index 336daef4fdb05d365d34eff86c583b47ac09e3c8..b9282a2e30d3d9393430d87f96d3e6e166b54300 100644 --- a/source/Lib/CommonLib/CodingStructure.cpp +++ b/source/Lib/CommonLib/CodingStructure.cpp @@ -908,6 +908,31 @@ void CodingStructure::reorderPrevPLT(PLTBuf& prevPLT, uint8_t curPLTSize[MAX_NUM } } +#if JVET_Q0501_PALETTE_WPP_INIT_ABOVECTU +void CodingStructure::setPrevPLT(PLTBuf predictor) +{ + for (int comp = 0; comp < MAX_NUM_CHANNEL_TYPE; comp++) + { + prevPLT.curPLTSize[comp] = predictor.curPLTSize[comp]; + } + for (int comp = 0; comp < MAX_NUM_COMPONENT; comp++) + { + memcpy(prevPLT.curPLT[comp], predictor.curPLT[comp], MAXPLTPREDSIZE * sizeof(Pel)); + } +} +void CodingStructure::storePrevPLT(PLTBuf& predictor) +{ + for (int comp = 0; comp < MAX_NUM_CHANNEL_TYPE; comp++) + { + predictor.curPLTSize[comp] = prevPLT.curPLTSize[comp]; + } + for (int comp = 0; comp < MAX_NUM_COMPONENT; comp++) + { + memcpy(predictor.curPLT[comp], prevPLT.curPLT[comp], MAXPLTPREDSIZE * sizeof(Pel)); + } +} +#endif + void CodingStructure::rebindPicBufs() { CHECK( parent, "rebindPicBufs can only be used for the top level CodingStructure" ); diff --git a/source/Lib/CommonLib/CodingStructure.h b/source/Lib/CommonLib/CodingStructure.h index 317e330ba33e86f62432527e1ab5182a0c0ad072..227a90d21933e8d575862c3da3e295f0b4ac9f70 100644 --- a/source/Lib/CommonLib/CodingStructure.h +++ b/source/Lib/CommonLib/CodingStructure.h @@ -202,7 +202,10 @@ public: PLTBuf prevPLT; void resetPrevPLT(PLTBuf& prevPLT); void reorderPrevPLT(PLTBuf& prevPLT, uint8_t curPLTSize[MAX_NUM_CHANNEL_TYPE], Pel curPLT[MAX_NUM_COMPONENT][MAXPLTSIZE], bool reuseflag[MAX_NUM_CHANNEL_TYPE][MAXPLTPREDSIZE], uint32_t compBegin, uint32_t numComp, bool jointPLT); - +#if JVET_Q0501_PALETTE_WPP_INIT_ABOVECTU + void setPrevPLT(PLTBuf predictor); + void storePrevPLT(PLTBuf& predictor); +#endif private: // needed for TU encoding diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 63025efcfc44633e902f308e55f167471affc989..0ec6033bc953f84d647580bbd396a686f578c0f4 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -50,6 +50,7 @@ #include <assert.h> #include <cassert> + #define JVET_Q0820_ACT 1 // JVET-Q0820: ACT bug fixes and reversible ACT transform #define JVET_Q0353_ACT_SW_FIX 1 // JVET-Q0353: Bug fix of ACT @@ -61,6 +62,8 @@ #define JVET_Q0784_LFNST_COMBINATION 1 // lfnst signaling, latency reduction and a bugfix for scaling from Q0106, Q0686, Q0133 +#define JVET_Q0501_PALETTE_WPP_INIT_ABOVECTU 1 // JVET-Q0501: Initialize palette predictor from above CTU row in WPP + #define JVET_Q0147_JCCR_SIGNALLING 1 // JVET-Q0147: Conditional signaling of sps_joint_cbcr_enabled_flag based on ChromaArrayType #define JVET_Q0267_RESET_CHROMA_QP_OFFSET 1 // JVET-Q0267: Reset chroma QP offsets at the start of each chroma QP offset group diff --git a/source/Lib/DecoderLib/DecSlice.cpp b/source/Lib/DecoderLib/DecSlice.cpp index 8adadb3a22e641dc8db273f76428105e7b0f7380..9e4d1360f7ecba1201d193cf282e85e70cf90cac 100644 --- a/source/Lib/DecoderLib/DecSlice.cpp +++ b/source/Lib/DecoderLib/DecSlice.cpp @@ -170,6 +170,9 @@ void DecSlice::decompressSlice( Slice* slice, InputBitstream* bitstream, int deb { // Top is available, so use it. cabacReader.getCtx() = m_entropyCodingSyncContextState; +#if JVET_Q0501_PALETTE_WPP_INIT_ABOVECTU + cs.setPrevPLT(m_palettePredictorSyncState); +#endif } pic->m_prevQP[0] = pic->m_prevQP[1] = slice->getSliceQp(); } @@ -203,6 +206,9 @@ void DecSlice::decompressSlice( Slice* slice, InputBitstream* bitstream, int deb if( ctuXPosInCtus == tileXPosInCtus && wavefrontsEnabled ) { m_entropyCodingSyncContextState = cabacReader.getCtx(); +#if JVET_Q0501_PALETTE_WPP_INIT_ABOVECTU + cs.storePrevPLT(m_palettePredictorSyncState); +#endif } diff --git a/source/Lib/DecoderLib/DecSlice.h b/source/Lib/DecoderLib/DecSlice.h index 1ff2a2282be31abb227e326a9167d515ffffe64d..cd918ed76d3fe28fab725c5efd40965359a4af74 100644 --- a/source/Lib/DecoderLib/DecSlice.h +++ b/source/Lib/DecoderLib/DecSlice.h @@ -63,6 +63,9 @@ private: DecCu* m_pcCuDecoder; Ctx m_entropyCodingSyncContextState; ///< context storage for state of contexts at the wavefront/WPP/entropy-coding-sync second CTU of tile-row +#if JVET_Q0501_PALETTE_WPP_INIT_ABOVECTU + PLTBuf m_palettePredictorSyncState; /// palette predictor storage at wavefront/WPP +#endif public: DecSlice(); diff --git a/source/Lib/EncoderLib/EncLib.h b/source/Lib/EncoderLib/EncLib.h index f9b13233e597e85169e374573f23fea701a2e419..2a6d82cadb4c0b1e17ffda28b8bb323dfb2b0925 100644 --- a/source/Lib/EncoderLib/EncLib.h +++ b/source/Lib/EncoderLib/EncLib.h @@ -159,6 +159,9 @@ public: SPS* getSPS( int spsId ) { return m_spsMap.getPS( spsId ); }; APS** getApss() { return m_apss; } Ctx m_entropyCodingSyncContextState; ///< leave in addition to vector for compatibility +#if JVET_Q0501_PALETTE_WPP_INIT_ABOVECTU + PLTBuf m_palettePredictorSyncState; +#endif protected: void xGetNewPicBuffer ( std::list<PelUnitBuf*>& rcListPicYuvRecOut, Picture*& rpcPic, int ppsId ); ///< get picture buffer which will be processed. If ppsId<0, then the ppsMap will be queried for the first match. diff --git a/source/Lib/EncoderLib/EncSlice.cpp b/source/Lib/EncoderLib/EncSlice.cpp index ab194d148c76b8c169a871d9d2cf7335eb4fe844..8e54f7b2873ad0e0d612c07b72eb13a36786a869 100644 --- a/source/Lib/EncoderLib/EncSlice.cpp +++ b/source/Lib/EncoderLib/EncSlice.cpp @@ -1444,6 +1444,9 @@ void EncSlice::encodeCtus( Picture* pcPic, const bool bCompressEntireSlice, cons { // Top is available, we use it. pCABACWriter->getCtx() = pEncLib->m_entropyCodingSyncContextState; +#if JVET_Q0501_PALETTE_WPP_INIT_ABOVECTU + cs.setPrevPLT(pEncLib->m_palettePredictorSyncState); +#endif } prevQP[0] = prevQP[1] = pcSlice->getSliceQp(); } @@ -1566,6 +1569,9 @@ void EncSlice::encodeCtus( Picture* pcPic, const bool bCompressEntireSlice, cons if( cs.pps->ctuIsTileColBd( ctuXPosInCtus ) && pEncLib->getEntropyCodingSyncEnabledFlag() ) { pEncLib->m_entropyCodingSyncContextState = pCABACWriter->getCtx(); +#if JVET_Q0501_PALETTE_WPP_INIT_ABOVECTU + cs.storePrevPLT(pEncLib->m_palettePredictorSyncState); +#endif } int actualBits = int(cs.fracBits >> SCALE_BITS); @@ -1683,6 +1689,9 @@ void EncSlice::encodeSlice ( Picture* pcPic, OutputBitstream* pcSubstreams, ui { // Top is available, so use it. m_CABACWriter->getCtx() = m_entropyCodingSyncContextState; +#if JVET_Q0501_PALETTE_WPP_INIT_ABOVECTU + cs.setPrevPLT(m_palettePredictorSyncState); +#endif } } @@ -1698,6 +1707,9 @@ void EncSlice::encodeSlice ( Picture* pcPic, OutputBitstream* pcSubstreams, ui if( cs.pps->ctuIsTileColBd( ctuXPosInCtus ) && wavefrontsEnabled ) { m_entropyCodingSyncContextState = m_CABACWriter->getCtx(); +#if JVET_Q0501_PALETTE_WPP_INIT_ABOVECTU + cs.storePrevPLT(m_palettePredictorSyncState); +#endif } // terminate the sub-stream, if required (end of slice-segment, end of tile, end of wavefront-CTU-row): diff --git a/source/Lib/EncoderLib/EncSlice.h b/source/Lib/EncoderLib/EncSlice.h index ed88068075c5a87db40fb86e6750f62e394f6937..6c633aa055bdf8f82315e8157820725cf9b059c0 100644 --- a/source/Lib/EncoderLib/EncSlice.h +++ b/source/Lib/EncoderLib/EncSlice.h @@ -92,6 +92,9 @@ private: uint32_t m_uiSliceSegmentIdx; Ctx m_entropyCodingSyncContextState; ///< context storage for state of contexts at the wavefront/WPP/entropy-coding-sync second CTU of tile-row SliceType m_encCABACTableIdx; +#if JVET_Q0501_PALETTE_WPP_INIT_ABOVECTU + PLTBuf m_palettePredictorSyncState; +#endif #if SHARP_LUMA_DELTA_QP || ENABLE_QPA_SUB_CTU int m_gopID; #endif