diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index 70d259c0ff355c3a10c3501f2c506643b6bb8607..aa4c1d8b044cac98bb22625a3968e6b3c87d7428 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -525,10 +525,8 @@ void EncApp::xInitLibCfg() m_cEncLib.setGdrEnabled ( m_gdrEnabled ); m_cEncLib.setGdrPeriod ( m_gdrPeriod ); m_cEncLib.setGdrPocStart ( m_gdrPocStart ); - m_cEncLib.setGdrFrequency ( m_gdrFrequency); - m_cEncLib.setStartWithGdr ( m_bStartWithGdr ); - m_cEncLib.setNoHashForGdr ( m_bNoHashForGdr ); - m_cEncLib.setGdrPicOutput ( m_bGdrPicOutput ); + m_cEncLib.setGdrInterval ( m_gdrInterval); + m_cEncLib.setNoHashForGdr ( m_bNoHashForGdr ); #endif m_cEncLib.setDecodingRefreshType ( m_iDecodingRefreshType ); m_cEncLib.setGOPSize ( m_iGOPSize ); diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index 65334230bdc5ed18cfa6c15d390093566b2f9c0a..8c839683a5d0fff74f7748f114372fbcb3cc106a 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -1010,10 +1010,8 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) ("GdrEnabled", m_gdrEnabled, false, "GDR enabled") ("GdrPocStart", m_gdrPocStart, -1, "GDR poc start") ("GdrPeriod", m_gdrPeriod, -1, "GDR period") - ("GdrFrequency", m_gdrFrequency, -1, "GDR freqency") - ("StartWithGDR", m_bStartWithGdr, false, "Start bitstream with GDR") - ("NoHashforGDR", m_bNoHashForGdr, true, "No Hash for GDR") - ("GdrPicOutput", m_bGdrPicOutput, false, "Picture Output for GDR") + ("GdrInterval", m_gdrInterval, -1, "GDR freqency") + ("NoHashforGDR", m_bNoHashForGdr, true, "No Hash for GDR") #endif ("DecodingRefreshType,-dr", m_iDecodingRefreshType, 0, "Intra refresh type (0:none 1:CRA 2:IDR 3:RecPointSEI)") ("GOPSize,g", m_iGOPSize, 1, "GOP size of temporal structure") @@ -1546,22 +1544,20 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) m_BIO = false; m_DMVR = false; m_SMVD = false; + + if (m_gdrPeriod < 0) + { + m_gdrPeriod = m_iFrameRate * 2; + } - - if (m_gdrFrequency < 0) - m_gdrFrequency = 2; - - if (m_gdrPocStart < 0) + if (m_gdrInterval < 0) { - if (m_iIntraPeriod > 0) - m_gdrPocStart = m_iIntraPeriod; - else - m_gdrPocStart = m_iFrameRate * m_gdrFrequency; + m_gdrInterval = m_iFrameRate; } - if (m_gdrPeriod < 0) + if (m_gdrPocStart < 0) { - m_gdrPeriod = m_iFrameRate; + m_gdrPocStart = m_gdrPeriod; } if (m_iIntraPeriod == -1) @@ -1570,7 +1566,7 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) if (m_gdrPocStart % m_iFrameRate != 0) m_iIntraPeriod = -1; else - m_iIntraPeriod = m_iFrameRate * m_gdrFrequency; + m_iIntraPeriod = m_gdrPeriod; } } #endif diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index 23708acf1783f7ea8b2fd37cbf7e77776a337242..d70c8c8f4ec25fd359820d2eed9d1e89cf981bc6 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -222,10 +222,8 @@ protected: bool m_gdrEnabled; int m_gdrPocStart; int m_gdrPeriod; - int m_gdrFrequency; - bool m_bStartWithGdr; - bool m_bNoHashForGdr; - bool m_bGdrPicOutput; + int m_gdrInterval; + bool m_bNoHashForGdr; #endif int m_iDecodingRefreshType; ///< random access type int m_iGOPSize; ///< GOP size of hierarchical structure diff --git a/source/Lib/CommonLib/CodingStructure.cpp b/source/Lib/CommonLib/CodingStructure.cpp index a8c6e76715bc468a1f2506cdcd696b9ace07e0b9..39d15569279a1df1a3c01d39801a9f38afd0665e 100644 --- a/source/Lib/CommonLib/CodingStructure.cpp +++ b/source/Lib/CommonLib/CodingStructure.cpp @@ -356,7 +356,7 @@ bool CodingStructure::isClean(const Position &IntPos, Mv FracMv) const } PicHeader *curPh = curPic->cs->picHeader; - bool isCurGdrPicture = curPh->getInGdrPeriod(); + bool isCurGdrPicture = curPh->getInGdrInterval(); if (isCurGdrPicture) { @@ -416,7 +416,7 @@ bool CodingStructure::isClean(const Position &IntPos, Mv FracMv, const Picture* return false; } - bool isRefGdrPicture = refPh->getInGdrPeriod(); + bool isRefGdrPicture = refPh->getInGdrInterval(); if (isRefGdrPicture) { @@ -497,7 +497,7 @@ bool CodingStructure::isClean(const Position &IntPos, Mv FracMv, RefPicList e, i return false; } - bool isRefGdrPicture = refPh->getInGdrPeriod(); + bool isRefGdrPicture = refPh->getInGdrInterval(); if (isRefGdrPicture) { @@ -591,7 +591,7 @@ bool CodingStructure::isClean(const Position &IntPos, Mv FracMv, RefPicList e, i return false; } - bool isRefGdrPicture = refPh->getInGdrPeriod(); + bool isRefGdrPicture = refPh->getInGdrInterval(); if (isRefGdrPicture) { @@ -655,7 +655,7 @@ bool CodingStructure::isClean(const Position &IntPos, RefPicList e, int refIdx) } PicHeader *refPh = refPic->cs->picHeader; - bool isRefGdrPicture = refPh->getInGdrPeriod(); + bool isRefGdrPicture = refPh->getInGdrInterval(); if (isRefGdrPicture) { @@ -692,7 +692,7 @@ bool CodingStructure::isClean(const Position &IntPos, const Picture* const refPi } PicHeader *refPh = refPic->cs->picHeader; - bool isRefGdrPicture = refPh->getInGdrPeriod(); + bool isRefGdrPicture = refPh->getInGdrInterval(); if (isRefGdrPicture) { @@ -730,7 +730,7 @@ bool CodingStructure::isClean(const int Intx, const int Inty, const ChannelType pos in dirty area -> false */ PicHeader *curPh = picHeader; - bool isCurGdrPicture = curPh->getInGdrPeriod(); + bool isCurGdrPicture = curPh->getInGdrInterval(); if (isCurGdrPicture) { int virboundary_endx = curPh->getVirtualBoundariesPosX(0); diff --git a/source/Lib/CommonLib/ContextModelling.cpp b/source/Lib/CommonLib/ContextModelling.cpp index 38e1ca3ce026d56874b62e2d49b49484bffb5208..5edbb1cb887eed1fe6973011dda524adcbc83cce 100644 --- a/source/Lib/CommonLib/ContextModelling.cpp +++ b/source/Lib/CommonLib/ContextModelling.cpp @@ -367,7 +367,7 @@ void MergeCtx::setMergeInfo( PredictionUnit& pu, int candIdx ) pu.mvpNum [REF_PIC_LIST_1] = NOT_VALID; #if GDR_ENABLED CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); if (isEncodeGdrClean) { @@ -410,7 +410,7 @@ void MergeCtx::setMmvdMergeCandiInfo(PredictionUnit& pu, int candIdx) #if GDR_ENABLED const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif tempIdx = candIdx; diff --git a/source/Lib/CommonLib/InterPrediction.cpp b/source/Lib/CommonLib/InterPrediction.cpp index e271546ca26604b1c303f4c9494c72017557d781..fe789d9eb94774c5bcb8da555e800cfe170ecf04 100644 --- a/source/Lib/CommonLib/InterPrediction.cpp +++ b/source/Lib/CommonLib/InterPrediction.cpp @@ -896,7 +896,7 @@ void InterPrediction::xPredAffineBlk(const ComponentID &compID, const Prediction #if GDR_ENABLED bool allOk = true; const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); const int pux = pu.lx(); const int puy = pu.ly(); #endif diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index a00b007af2fdf018f76f5ac7989614819080e9dd..52996d84bccc3cae64c2bb30ac4e158b1e893a5d 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -2742,8 +2742,8 @@ void PicHeader::initPicHeader() m_alfApsIdsLuma.resize(0); #if GDR_ENABLED - m_inGdrPeriod = false; - m_lastGdrPeriodPoc = -1; + m_inGdrInterval = false; + m_lastGdrIntervalPoc = -1; #endif } diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index df366b861e33f089bab5e76cae6d66670742c437..e47f8f3853580528465d8fd6f358668f0c5282f6 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -2333,8 +2333,8 @@ private: bool m_gdrOrIrapPicFlag; //!< gdr or irap picture flag bool m_gdrPicFlag; //!< gradual decoding refresh picture flag #if GDR_ENABLED - bool m_inGdrPeriod; - int m_lastGdrPeriodPoc; + bool m_inGdrInterval; + int m_lastGdrIntervalPoc; #endif uint32_t m_recoveryPocCnt; //!< recovery POC count bool m_noOutputBeforeRecoveryFlag; //!< NoOutputBeforeRecoveryFlag @@ -2423,8 +2423,8 @@ public: void setGdrPicFlag( bool b ) { m_gdrPicFlag = b; } bool getGdrPicFlag() const { return m_gdrPicFlag; } #if GDR_ENABLED - void setInGdrPeriod(bool b) { m_inGdrPeriod = b; } - bool getInGdrPeriod() const { return m_inGdrPeriod; } + void setInGdrInterval(bool b) { m_inGdrInterval = b; } + bool getInGdrInterval() const { return m_inGdrInterval; } #endif void setRecoveryPocCnt( uint32_t u ) { m_recoveryPocCnt = u; } uint32_t getRecoveryPocCnt() const { return m_recoveryPocCnt; } diff --git a/source/Lib/CommonLib/UnitTools.cpp b/source/Lib/CommonLib/UnitTools.cpp index de9d7878f204733eff4361ec95610a75bed0ef04..d7e6d1097b448ba7f39b92cf822a012d6a613958 100644 --- a/source/Lib/CommonLib/UnitTools.cpp +++ b/source/Lib/CommonLib/UnitTools.cpp @@ -873,7 +873,7 @@ bool PU::addMergeHMVPCand(const CodingStructure &cs, MergeCtx &mrgCtx, const int int num_avai_candInLUT = (int)lut.size(); #if GDR_ENABLED - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); bool vbOnCtuBoundary = true; if (isEncodeGdrClean) @@ -951,7 +951,7 @@ void PU::getIBCMergeCandidates(const PredictionUnit &pu, MergeCtx& mrgCtx, const const CodingStructure &cs = *pu.cs; const uint32_t maxNumMergeCand = pu.cs->sps->getMaxNumIBCMergeCand(); #if GDR_ENABLED - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); bool allCandSolidInAbove = true; #endif @@ -1103,7 +1103,7 @@ void PU::getInterMergeCandidates( const PredictionUnit &pu, MergeCtx& mrgCtx, const uint32_t maxNumMergeCand = pu.cs->sps->getMaxNumMergeCand(); CHECK (maxNumMergeCand > MRG_MAX_NUM_CANDS, "selected maximum number of merge candidate exceeds global limit"); #if GDR_ENABLED - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); bool allCandSolidInAbove = true; #endif for (uint32_t ui = 0; ui < maxNumMergeCand; ++ui) @@ -1813,7 +1813,7 @@ void PU::getInterMMVDMergeCandidates(const PredictionUnit &pu, MergeCtx& mrgCtx, #if GDR_ENABLED const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif #if GDR_ENABLED @@ -2209,7 +2209,7 @@ void PU::fillMvpCand(PredictionUnit &pu, const RefPicList &eRefPicList, const in Position posLB = pu.Y().bottomLeft(); #if GDR_ENABLED - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); bool &allCandSolidInAbove = amvpInfo.allCandSolidInAbove; #endif { @@ -2342,7 +2342,7 @@ bool PU::addAffineMVPCandUnscaled( const PredictionUnit &pu, const RefPicList &r Position neibPos; #if GDR_ENABLED - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif switch ( dir ) { @@ -2452,7 +2452,7 @@ bool PU::addAffineMVPCandUnscaled( const PredictionUnit &pu, const RefPicList &r void PU::xInheritedAffineMv(const PredictionUnit &pu, const PredictionUnit* puNeighbour, RefPicList eRefPicList, Mv rcMv[3], bool rcMvSolid[3], MvpType rcMvType[3], Position rcMvPos[3]) { const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); int posNeiX = puNeighbour->Y().pos().x; int posNeiY = puNeighbour->Y().pos().y; @@ -2664,7 +2664,7 @@ void PU::fillAffineMvpCand(PredictionUnit &pu, const RefPicList &eRefPicList, co #if GDR_ENABLED const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); bool &allCandSolidInAbove = affiAMVPInfo.allCandSolidInAbove; if (isEncodeGdrClean) @@ -3011,7 +3011,7 @@ bool PU::addMVPCandUnscaled( const PredictionUnit &pu, const RefPicList &eRefPic Position neibPos; #if GDR_ENABLED - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); bool &allCandSolidInAbove = info.allCandSolidInAbove; #endif @@ -3088,7 +3088,7 @@ void PU::addAMVPHMVPCand(const PredictionUnit &pu, const RefPicList eRefPicList, #if GDR_ENABLED CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); bool &allCandSolidInAbove = info.allCandSolidInAbove; #endif @@ -3356,7 +3356,7 @@ void PU::getAffineMergeCand( const PredictionUnit &pu, AffineMergeCtx& affMrgCtx const uint32_t maxNumAffineMergeCand = slice.getPicHeader()->getMaxNumAffineMergeCand(); const unsigned plevel = pu.cs->sps->getLog2ParallelMergeLevelMinus2() + 2; #if GDR_ENABLED - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif for ( int i = 0; i < maxNumAffineMergeCand; i++ ) @@ -3922,7 +3922,7 @@ bool PU::getInterMergeSubPuMvpCand(const PredictionUnit &pu, MergeCtx& mrgCtx, b #if GDR_ENABLED const CodingStructure& cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); bool isSubPuSolid[2] = { true, true }; #endif if ( count ) @@ -4280,7 +4280,7 @@ void PU::getGeoMergeCandidates( const PredictionUnit &pu, MergeCtx& geoMrgCtx ) #if GDR_ENABLED CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif for (int32_t i = 0; i < GEO_MAX_NUM_UNI_CANDS; i++) { diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index dc9155a43942c9108e3a8e2c3a1c19068fe0b147..5861aa59d2d9f48c7129140ae39da1ce99492e6f 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -4348,11 +4348,11 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, PicHeader* picHeader, Par if (getLastGdrPoc() > 0 && (getLastGdrPoc() <= cur_poc) && (cur_poc < (getLastGdrPoc() + recovery_poc_cnt))) { - picHeader->setInGdrPeriod(true); + picHeader->setInGdrInterval(true); } else { - picHeader->setInGdrPeriod(false); + picHeader->setInGdrInterval(false); } #endif @@ -4360,7 +4360,7 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, PicHeader* picHeader, Par printf("-gdr_pic_flag:%d\n", picHeader->getGdrPicFlag() ? 1 : 0); printf("-recovery_poc_cnt:%d\n", picHeader->getRecoveryPocCnt()); #if GDR_ENABLED - printf("-inGdrPeriod:%d\n", picHeader->getInGdrPeriod()); + printf("-inGdrInterval:%d\n", picHeader->getInGdrInterval()); #endif printf("-lmcs_enable : %d\n", picHeader->getLmcsEnabledFlag() ? 1 : 0); diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index 196675a7142d5dc631f2dc67648938ad25d9ab6f..85babab6d2a1963989afbd81110219d50db0a22b 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -303,13 +303,11 @@ protected: unsigned m_subPicIdLen; std::vector<uint16_t> m_subPicId; #if GDR_ENABLED - bool m_gdrEnabled; - unsigned m_gdrPeriod; + bool m_gdrEnabled; unsigned m_gdrPocStart; - int m_gdrFrequency; - bool m_bStartWithGdr; - bool m_bNoHashForGdr; - bool m_bGdrPicOutput; + unsigned m_gdrPeriod; + int m_gdrInterval; + bool m_bNoHashForGdr; #endif bool m_useSplitConsOverride; unsigned m_uiMinQT[3]; //0: I slice; 1: P/B slice, 2: I slice chroma @@ -1009,18 +1007,14 @@ public: void setGdrEnabled(bool b) { m_gdrEnabled = b; } void setGdrPeriod(unsigned u) { m_gdrPeriod = u; } void setGdrPocStart(unsigned u) { m_gdrPocStart = u; } - void setGdrFrequency(int i) { m_gdrFrequency = i; } - void setStartWithGdr(bool b) { m_bStartWithGdr = b; } - void setNoHashForGdr(bool b) { m_bNoHashForGdr = b; } - void setGdrPicOutput(bool b) { m_bGdrPicOutput = b; } + void setGdrInterval(int i) { m_gdrInterval = i; } + void setNoHashForGdr(bool b) { m_bNoHashForGdr = b; } bool getGdrEnabled() { return m_gdrEnabled; } unsigned getGdrPeriod() { return m_gdrPeriod; } unsigned getGdrPocStart() { return m_gdrPocStart; } - int getGdrFrequency() { return m_gdrFrequency; } - bool getStartWithGdr() { return m_bStartWithGdr; } - bool getNoHashForGdr() { return m_bNoHashForGdr; } - bool getGdrPicOutput() { return m_bGdrPicOutput; } + int getGdrInterval() { return m_gdrInterval; } + bool getNoHashForGdr() { return m_bNoHashForGdr; } #endif void setMaxMTTHierarchyDepth ( unsigned uiMaxMTTHierarchyDepth, unsigned uiMaxMTTHierarchyDepthI, unsigned uiMaxMTTHierarchyDepthIChroma ) { m_uiMaxMTTHierarchyDepth = uiMaxMTTHierarchyDepth; m_uiMaxMTTHierarchyDepthI = uiMaxMTTHierarchyDepthI; m_uiMaxMTTHierarchyDepthIChroma = uiMaxMTTHierarchyDepthIChroma; } diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp index 32240520b1f036db58ee6ec6413eb0e5a8a1bc58..5ae343983478ebb2ec55944e48d5e652a2ceaa22 100644 --- a/source/Lib/EncoderLib/EncCu.cpp +++ b/source/Lib/EncoderLib/EncCu.cpp @@ -556,83 +556,86 @@ void EncCu::xCompressCU( CodingStructure*& tempCS, CodingStructure*& bestCS, Par m_modeCtrl->initCULevel( partitioner, *tempCS ); #if GDR_ENABLED - bool isCurGdrPicture = slice.getPicHeader()->getInGdrPeriod(); - - // 1.0 applicable to inter picture only - if (isCurGdrPicture) + if (m_pcEncCfg->getGdrEnabled()) { - int gdrPocStart = m_pcEncCfg->getGdrPocStart(); - int gdrPeriod = m_pcEncCfg->getGdrPeriod(); - - int picWidth = slice.getPPS()->getPicWidthInLumaSamples(); - int m1, m2, n1; + bool isCurGdrPicture = slice.getPicHeader()->getInGdrInterval(); - int curPoc = slice.getPOC(); - int gdrPoc = (curPoc - gdrPocStart) % gdrPeriod; + // 1.0 applicable to inter picture only + if (isCurGdrPicture) + { + int gdrPocStart = m_pcEncCfg->getGdrPocStart(); + int gdrInterval = m_pcEncCfg->getGdrInterval(); - int begGdrX = 0; - int endGdrX = 0; + int picWidth = slice.getPPS()->getPicWidthInLumaSamples(); + int m1, m2, n1; - double dd = (picWidth / (double)gdrPeriod); - int mm = (int)((picWidth / (double)gdrPeriod) + 0.49999); - m1 = ((mm + 7) >> 3) << 3; - m2 = ((mm + 0) >> 3) << 3; + int curPoc = slice.getPOC(); + int gdrPoc = (curPoc - gdrPocStart) % gdrInterval; - if (dd > mm && m1 == m2) - { - m1 = m1 + 8; - } + int begGdrX = 0; + int endGdrX = 0; - n1 = (picWidth - m2 * gdrPeriod) / 8; + double dd = (picWidth / (double)gdrInterval); + int mm = (int)((picWidth / (double)gdrInterval) + 0.49999); + m1 = ((mm + 7) >> 3) << 3; + m2 = ((mm + 0) >> 3) << 3; - if (gdrPoc < n1) - { - begGdrX = m1 * gdrPoc; - endGdrX = begGdrX + m1; - } - else - { - begGdrX = m1 * n1 + m2 * (gdrPoc - n1); - endGdrX = begGdrX + m2; - if (picWidth <= endGdrX) + if (dd > mm && m1 == m2) { - endGdrX = picWidth; - endGdrX = picWidth; + m1 = m1 + 8; } - } - bool isInRefreshArea = tempCS->withinRefresh(begGdrX, endGdrX); + n1 = (picWidth - m2 * gdrInterval) / 8; - if (isInRefreshArea) - { - m_modeCtrl->forceIntraMode(); - } - else if (tempCS->containRefresh(begGdrX, endGdrX) || tempCS->overlapRefresh(begGdrX, endGdrX)) - { - // 1.3.1 enable only vertical splits (QT, BT_V, TT_V) - m_modeCtrl->forceVerSplitOnly(); + if (gdrPoc < n1) + { + begGdrX = m1 * gdrPoc; + endGdrX = begGdrX + m1; + } + else + { + begGdrX = m1 * n1 + m2 * (gdrPoc - n1); + endGdrX = begGdrX + m2; + if (picWidth <= endGdrX) + { + endGdrX = picWidth; + endGdrX = picWidth; + } + } - // 1.3.2 remove TT_V if it does not satisfy the condition - if (tempCS->refreshCrossTTV(begGdrX, endGdrX)) + bool isInRefreshArea = tempCS->withinRefresh(begGdrX, endGdrX); + + if (isInRefreshArea) { - m_modeCtrl->forceRemoveTTV(); + m_modeCtrl->forceIntraMode(); } - } + else if (tempCS->containRefresh(begGdrX, endGdrX) || tempCS->overlapRefresh(begGdrX, endGdrX)) + { + // 1.3.1 enable only vertical splits (QT, BT_V, TT_V) + m_modeCtrl->forceVerSplitOnly(); - if (tempCS->area.lwidth() != tempCS->area.lheight()) - { - m_modeCtrl->forceRemoveQT(); - } + // 1.3.2 remove TT_V if it does not satisfy the condition + if (tempCS->refreshCrossTTV(begGdrX, endGdrX)) + { + m_modeCtrl->forceRemoveTTV(); + } + } - if (!m_modeCtrl->anyPredModeLeft()) - { - m_modeCtrl->forceRemoveDontSplit(); - } + if (tempCS->area.lwidth() != tempCS->area.lheight()) + { + m_modeCtrl->forceRemoveQT(); + } - if (isInRefreshArea && !m_modeCtrl->anyIntraIBCMode() && (tempCS->area.lwidth() == 4 || tempCS->area.lheight() == 4)) - { - m_modeCtrl->finishCULevel(partitioner); - return; + if (!m_modeCtrl->anyPredModeLeft()) + { + m_modeCtrl->forceRemoveDontSplit(); + } + + if (isInRefreshArea && !m_modeCtrl->anyIntraIBCMode() && (tempCS->area.lwidth() == 4 || tempCS->area.lheight() == 4)) + { + m_modeCtrl->finishCULevel(partitioner); + return; + } } } #endif @@ -2151,7 +2154,7 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *& pu.regularMergeFlag = true; #if GDR_ENABLED cs = pu.cs; - isEncodeGdrClean = cs->sps->getGDREnabledFlag() && cs->pcv->isEncoder && ((cs->picHeader->getInGdrPeriod() && cs->isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs->picHeader->getNumVerVirtualBoundaries() == 0)); + isEncodeGdrClean = cs->sps->getGDREnabledFlag() && cs->pcv->isEncoder && ((cs->picHeader->getInGdrInterval() && cs->isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs->picHeader->getNumVerVirtualBoundaries() == 0)); #endif } bool candHasNoResidual[MRG_MAX_NUM_CANDS + MMVD_ADD_NUM]; @@ -2871,7 +2874,7 @@ void EncCu::xCheckRDCostMergeGeo2Nx2N(CodingStructure *&tempCS, CodingStructure PredictionUnit &pu = tempCS->addPU(cu, pm.chType); #if GDR_ENABLED CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif pu.mergeFlag = true; @@ -3291,7 +3294,7 @@ void EncCu::xCheckRDCostAffineMerge2Nx2N( CodingStructure *&tempCS, CodingStruct pu.regularMergeFlag = false; #if GDR_ENABLED cs = pu.cs; - isEncodeGdrClean = cs->sps->getGDREnabledFlag() && cs->pcv->isEncoder && ((cs->picHeader->getInGdrPeriod() && cs->isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs->picHeader->getNumVerVirtualBoundaries() == 0)); + isEncodeGdrClean = cs->sps->getGDREnabledFlag() && cs->pcv->isEncoder && ((cs->picHeader->getInGdrInterval() && cs->isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs->picHeader->getNumVerVirtualBoundaries() == 0)); #endif PU::getAffineMergeCand( pu, affineMergeCtx ); @@ -3652,7 +3655,7 @@ void EncCu::xCheckRDCostIBCModeMerge2Nx2N(CodingStructure *&tempCS, CodingStruct #endif } #if GDR_ENABLED - const bool isEncodeGdrClean = tempCS->sps->getGDREnabledFlag() && tempCS->pcv->isEncoder && tempCS->picHeader->getInGdrPeriod() && gdrClean; + const bool isEncodeGdrClean = tempCS->sps->getGDREnabledFlag() && tempCS->pcv->isEncoder && tempCS->picHeader->getInGdrInterval() && gdrClean; bool *MrgSolid = nullptr; bool *MrgValid = nullptr; #endif @@ -4118,7 +4121,7 @@ void EncCu::xCheckRDCostInter( CodingStructure *&tempCS, CodingStructure *&bestC bool testBcw = (bcwIdx != BCW_DEFAULT); #if GDR_ENABLED - const bool isEncodeGdrClean = tempCS->sps->getGDREnabledFlag() && tempCS->pcv->isEncoder && ((tempCS->picHeader->getInGdrPeriod() && tempCS->isClean(cu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (tempCS->picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = tempCS->sps->getGDREnabledFlag() && tempCS->pcv->isEncoder && ((tempCS->picHeader->getInGdrInterval() && tempCS->isClean(cu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (tempCS->picHeader->getNumVerVirtualBoundaries() == 0)); #endif m_pcInterSearch->predInterSearch(cu, partitioner); @@ -4336,7 +4339,7 @@ bool EncCu::xCheckRDCostInterIMV(CodingStructure *&tempCS, CodingStructure *&bes CU::addPUs( cu ); #if GDR_ENABLED - const bool isEncodeGdrClean = tempCS->sps->getGDREnabledFlag() && tempCS->pcv->isEncoder && ((tempCS->picHeader->getInGdrPeriod() && tempCS->isClean(cu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (tempCS->picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = tempCS->sps->getGDREnabledFlag() && tempCS->pcv->isEncoder && ((tempCS->picHeader->getInGdrInterval() && tempCS->isClean(cu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (tempCS->picHeader->getNumVerVirtualBoundaries() == 0)); #endif if (testAltHpelFilter) { diff --git a/source/Lib/EncoderLib/EncCu.h b/source/Lib/EncoderLib/EncCu.h index 7682705aa0f2d56099e45642fd150d4aecc87a9e..f92d28304da3a366cb8b3b9a3c20e8c460c28dfe 100644 --- a/source/Lib/EncoderLib/EncCu.h +++ b/source/Lib/EncoderLib/EncCu.h @@ -88,36 +88,17 @@ struct SmallerThanComboCost { inline bool operator() (const GeoMergeCombo& first, const GeoMergeCombo& second) { -#if GDR_ENABLED - bool ret = true; - - ret = (first.cost < second.cost); - - if (first.cost == second.cost) - { - ret = first.splitDir < second.splitDir; - if (first.splitDir == second.splitDir) - { - ret = first.mergeIdx0 < second.mergeIdx0; - if (first.mergeIdx0 == second.mergeIdx0) - { - ret = first.mergeIdx1 < second.mergeIdx1; - } - } - } - - return ret; -#else - return (first.cost < second.cost); -#endif + return (first.cost < second.cost); } }; + class GeoComboCostList { public: GeoComboCostList() {}; ~GeoComboCostList() {}; - std::vector<GeoMergeCombo> list; + std::vector<GeoMergeCombo> list; + void sortByCost() { std::stable_sort(list.begin(), list.end(), SmallerThanComboCost()); }; }; struct SingleGeoMergeEntry diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index bdc6c26327f6799af94715bdf65d0888f6778a4a..7a7b32473906dc5b8c13d179f352021ff3a82fe6 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -313,7 +313,7 @@ void EncGOP::init ( EncLib* pcEncLib ) } #endif #if GDR_ENABLED - m_lastGdrPeriodPoc = -1; + m_lastGdrIntervalPoc = -1; #endif } @@ -1953,7 +1953,7 @@ void EncGOP::xPicInitLMCS(Picture *pic, PicHeader *picHeader, Slice *slice) picHeader->setLmcsChromaResidualScaleFlag(m_pcReshaper->getSliceReshaperInfo().getSliceReshapeChromaAdj() == 1); #if GDR_ENABLED - if (picHeader->getInGdrPeriod()) + if (picHeader->getInGdrInterval()) { picHeader->setLmcsChromaResidualScaleFlag(false); } @@ -2164,7 +2164,7 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, } pcSlice->setTLayer(m_pcCfg->getGOPEntry(iGOPid).m_temporalId); #if GDR_ENABLED - if (pocCurr >= m_pcCfg->getGdrPocStart() && ((pocCurr - m_pcCfg->getGdrPocStart()) % (m_pcCfg->getGdrPeriod() * m_pcCfg->getGdrFrequency()) == 0)) + if (pocCurr >= m_pcCfg->getGdrPocStart() && ((pocCurr - m_pcCfg->getGdrPocStart()) % m_pcCfg->getGdrPeriod() == 0)) { pcSlice->setSliceType(B_SLICE); } @@ -2949,7 +2949,7 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, { picHeader->setLmcsEnabledFlag(true); #if GDR_ENABLED - if (picHeader->getInGdrPeriod()) + if (picHeader->getInGdrInterval()) { picHeader->setLmcsChromaResidualScaleFlag(false); } @@ -3612,7 +3612,7 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, std::string digestStr; #if GDR_ENABLED // note : generate hash sei only for non-gdr pictures - bool genHash = !(m_pcCfg->getNoHashForGdr() && pcSlice->getPicHeader()->getInGdrPeriod()); + bool genHash = !(m_pcCfg->getNoHashForGdr() && pcSlice->getPicHeader()->getInGdrInterval()); if (m_pcCfg->getDecodedPictureHashSEIType() != HASHTYPE_NONE && genHash) #else if (m_pcCfg->getDecodedPictureHashSEIType()!=HASHTYPE_NONE) @@ -3658,7 +3658,7 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, xWriteTrailingSEIMessages(trailingSeiMessages, accessUnit, pcSlice->getTLayer()); #if GDR_ENABLED - if (!(m_pcCfg->getNoHashForGdr() && pcSlice->getPicHeader()->getInGdrPeriod())) + if (!(m_pcCfg->getNoHashForGdr() && pcSlice->getPicHeader()->getInGdrInterval())) { printHash(m_pcCfg->getDecodedPictureHashSEIType(), digestStr); } @@ -5077,18 +5077,7 @@ NalUnitType EncGOP::getNalUnitType(int pocCurr, int lastIDR, bool isField) { if (pocCurr == 0) { -#if GDR_ENABLED - if (m_pcCfg->getStartWithGdr()) - { - return NAL_UNIT_CODED_SLICE_GDR; - } - else - { - return NAL_UNIT_CODED_SLICE_IDR_N_LP; - } -#else return NAL_UNIT_CODED_SLICE_IDR_N_LP; -#endif } if (m_pcCfg->getEfficientFieldIRAPEnabled() && isField && pocCurr == (m_pcCfg->getUseCompositeRef() ? 2: 1)) @@ -5101,7 +5090,7 @@ NalUnitType EncGOP::getNalUnitType(int pocCurr, int lastIDR, bool isField) if (m_pcCfg->getDecodingRefreshType() == 3 && (pocCurr >= m_pcCfg->getGdrPocStart())) { int m = pocCurr - m_pcCfg->getGdrPocStart(); - int n = m_pcCfg->getGdrPeriod() * m_pcCfg->getGdrFrequency(); + int n = m_pcCfg->getGdrPeriod(); if (m % n == 0) { return NAL_UNIT_CODED_SLICE_GDR; @@ -5149,7 +5138,7 @@ NalUnitType EncGOP::getNalUnitType(int pocCurr, int lastIDR, bool isField) } } #if GDR_ENABLED - if (pocCurr >= m_pcCfg->getGdrPocStart() && ((pocCurr - m_pcCfg->getGdrPocStart()) % (m_pcCfg->getGdrPeriod() * m_pcCfg->getGdrFrequency()) == 0)) + if (pocCurr >= m_pcCfg->getGdrPocStart() && ((pocCurr - m_pcCfg->getGdrPocStart()) % m_pcCfg->getGdrPeriod() == 0)) return NAL_UNIT_CODED_SLICE_TRAIL; else return NAL_UNIT_CODED_SLICE_TRAIL; diff --git a/source/Lib/EncoderLib/EncGOP.h b/source/Lib/EncoderLib/EncGOP.h index 04df5eada3d616eeea8d7b96c8b758d66b993042..c80df5b27063af6ae17461f0e4970d958ebf9cd4 100644 --- a/source/Lib/EncoderLib/EncGOP.h +++ b/source/Lib/EncoderLib/EncGOP.h @@ -184,7 +184,7 @@ private: AUWriterIf* m_AUWriterIf; #if GDR_ENABLED - int m_lastGdrPeriodPoc; + int m_lastGdrIntervalPoc; #endif #if JVET_O0756_CALCULATE_HDRMETRICS @@ -238,8 +238,8 @@ public: int getLastLTRefPoc() const { return m_lastLTRefPoc; } #if GDR_ENABLED - void setLastGdrPeriodPoc(int p) { m_lastGdrPeriodPoc = p; } - int getLastGdrPeriodPoc() const { return m_lastGdrPeriodPoc; } + void setLastGdrIntervalPoc(int p) { m_lastGdrIntervalPoc = p; } + int getLastGdrIntervalPoc() const { return m_lastGdrIntervalPoc; } #endif void printOutSummary( uint32_t uiNumAllPicCoded, bool isField, const bool printMSEBasedSNR, const bool printSequenceMSE, diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index 7790989bd2cac9004b15a6b33804880ab42f7b7a..a9961681c8cae82242680dbefebfe996f4c3c568 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -1662,14 +1662,7 @@ void EncLib::xInitPPS(PPS &pps, const SPS &sps) pps.setUseWP( m_useWeightedPred ); pps.setWPBiPred( m_useWeightedBiPred ); -#if GDR_ENABLED - if (getGdrPicOutput()) - pps.setOutputFlagPresentFlag( true ); - else - pps.setOutputFlagPresentFlag(false); -#else pps.setOutputFlagPresentFlag(false); -#endif if ( getDeblockingFilterMetric() ) { diff --git a/source/Lib/EncoderLib/EncModeCtrl.cpp b/source/Lib/EncoderLib/EncModeCtrl.cpp index 58ae037bd17f2e480e276b72ebc10bf2ad8e5c54..925ee191822244d76086a2ce64cb33860269eb98 100644 --- a/source/Lib/EncoderLib/EncModeCtrl.cpp +++ b/source/Lib/EncoderLib/EncModeCtrl.cpp @@ -938,6 +938,9 @@ static bool interHadActive( const ComprCUCtx& ctx ) void EncModeCtrlMTnoRQT::create( const EncCfg& cfg ) { +#if GDR_ENABLED + m_encCfg = cfg; +#endif CacheBlkInfoCtrl::create(); #if REUSE_CU_RESULTS BestEncInfoCache::create( cfg.getChromaFormatIdc() ); @@ -1266,10 +1269,13 @@ bool EncModeCtrlMTnoRQT::tryMode( const EncTestMode& encTestmode, const CodingSt ComprCUCtx& cuECtx = m_ComprCUCtxList.back(); // Fast checks, partitioning depended -#if !GDR_ENABLED - if (cuECtx.isHashPerfectMatch && encTestmode.type != ETM_MERGE_SKIP && encTestmode.type != ETM_INTER_ME && encTestmode.type != ETM_AFFINE && encTestmode.type != ETM_MERGE_GEO) +#if GDR_ENABLED + if (!m_encCfg.getGdrEnabled()) { - return false; + if (cuECtx.isHashPerfectMatch && encTestmode.type != ETM_MERGE_SKIP && encTestmode.type != ETM_INTER_ME && encTestmode.type != ETM_AFFINE && encTestmode.type != ETM_MERGE_GEO) + { + return false; + } } #endif diff --git a/source/Lib/EncoderLib/EncModeCtrl.h b/source/Lib/EncoderLib/EncModeCtrl.h index bb3eb1551ac6d097d1a7bf23ad9a28a48fc6784d..f9afc3e05c7853bc692e155ab1c6a9fee0db5ed6 100644 --- a/source/Lib/EncoderLib/EncModeCtrl.h +++ b/source/Lib/EncoderLib/EncModeCtrl.h @@ -915,6 +915,9 @@ class EncModeCtrlMTnoRQT : public EncModeCtrl, public CacheBlkInfoCtrl }; unsigned m_skipThreshold; +#if GDR_ENABLED + EncCfg m_encCfg; +#endif public: diff --git a/source/Lib/EncoderLib/EncSlice.cpp b/source/Lib/EncoderLib/EncSlice.cpp index cfc58ce4e9e802257cc3df4367a3e74278a32060..58a8628382c962a9a2f12cfb77fb655e2bd09191 100644 --- a/source/Lib/EncoderLib/EncSlice.cpp +++ b/source/Lib/EncoderLib/EncSlice.cpp @@ -439,7 +439,7 @@ void EncSlice::initEncSlice(Picture* pcPic, const int pocLast, const int pocCurr { eSliceType = (pocLast == 0 || (pocCurr - (isField ? 1 : 0)) % (m_pcCfg->getIntraPeriod() * multipleFactor) == 0 || m_pcGOPEncoder->getGOPSize() == 0) && (!useIlRef) ? I_SLICE : eSliceType; #if GDR_ENABLED - if (pocCurr >= m_pcCfg->getGdrPocStart() && ((pocCurr - m_pcCfg->getGdrPocStart()) % (m_pcCfg->getGdrPeriod() * m_pcCfg->getGdrFrequency()) == 0)) + if (m_pcCfg->getGdrEnabled() && (pocCurr >= m_pcCfg->getGdrPocStart()) && ((pocCurr - m_pcCfg->getGdrPocStart()) % m_pcCfg->getGdrPeriod() == 0)) { eSliceType = B_SLICE; } @@ -610,7 +610,7 @@ void EncSlice::initEncSlice(Picture* pcPic, const int pocLast, const int pocCurr { eSliceType = (pocLast == 0 || (pocCurr - (isField ? 1 : 0)) % (m_pcCfg->getIntraPeriod() * multipleFactor) == 0 || m_pcGOPEncoder->getGOPSize() == 0) && (!useIlRef) ? I_SLICE : eSliceType; #if GDR_ENABLED - if (pocCurr >= m_pcCfg->getGdrPocStart() && ((pocCurr - m_pcCfg->getGdrPocStart()) % (m_pcCfg->getGdrPeriod() * m_pcCfg->getGdrFrequency()) == 0)) + if (m_pcCfg->getGdrEnabled() && (pocCurr >= m_pcCfg->getGdrPocStart()) && ((pocCurr - m_pcCfg->getGdrPocStart()) % m_pcCfg->getGdrPeriod() == 0)) { eSliceType = B_SLICE; } @@ -718,130 +718,117 @@ void EncSlice::initEncSlice(Picture* pcPic, const int pocLast, const int pocCurr m_pcCuEncoder->getIbcHashMap().init( pcPic->cs->pps->getPicWidthInLumaSamples(), pcPic->cs->pps->getPicHeightInLumaSamples() ); } #if GDR_ENABLED - int gdrPocStart = m_pcCuEncoder->getEncCfg()->getGdrPocStart(); - int gdrPeriod = m_pcCuEncoder->getEncCfg()->getGdrPeriod(); - int gdr_frequency = m_pcCuEncoder->getEncCfg()->getGdrFrequency(); - - int picWidth = rpcSlice->getPPS()->getPicWidthInLumaSamples(); - - int curPoc = rpcSlice->getPOC(); - int gdrPoc = (curPoc - gdrPocStart) % gdrPeriod; - - pcPic->cs->picHeader->setGdrPicFlag(false); - pcPic->cs->picHeader->setRecoveryPocCnt(0); - pcPic->cs->picHeader->setInGdrPeriod(false); - - pcPic->cs->picHeader->setVirtualBoundariesPresentFlag(false); - - int offset = (curPoc < gdrPocStart) ? 0 : (((curPoc - gdrPocStart) / gdrPeriod) * gdrPeriod); - int actualGdrStart = gdrPocStart + offset; - int actualGdrPeriod = min(gdrPeriod, (int)(pcPic->getPicWidthInLumaSamples() / 8)); - int actualGdrEndPoc = actualGdrStart + actualGdrPeriod - 1; - - bool isActualGdrPeriod = (curPoc >= gdrPocStart) && ((((curPoc - gdrPocStart) / gdrPeriod) % gdr_frequency) == 0); - bool isGdrPeriodOver = (isActualGdrPeriod) && (curPoc > actualGdrEndPoc); - bool isGdrPic = (actualGdrStart == curPoc); - -#if GDR_ENC_TRACE - printf("\n"); - printf("-poc:%d actualGdrStart:%d actualGdrPeriod:%d actualGdrEndPoc:%d\n", rpcSlice->getPOC(), actualGdrStart, actualGdrPeriod, actualGdrEndPoc); -#endif - - // for first picture of the sequence (GDR picture with recovery_poc_cnt = 0) - if (curPoc == 0 && m_pcCfg->getStartWithGdr()) + if (m_pcCfg->getGdrEnabled()) { - pcPic->cs->picHeader->setGdrOrIrapPicFlag(true); - pcPic->cs->picHeader->setGdrPicFlag(true); + int gdrPocStart = m_pcCuEncoder->getEncCfg()->getGdrPocStart(); + int gdrPeriod = m_pcCuEncoder->getEncCfg()->getGdrPeriod(); + int gdrInterval = m_pcCuEncoder->getEncCfg()->getGdrInterval(); - pcPic->cs->picHeader->setInGdrPeriod(true); - pcPic->cs->picHeader->setVirtualBoundariesPresentFlag(true); + int picWidth = rpcSlice->getPPS()->getPicWidthInLumaSamples(); - if (m_pcCfg->getGdrPicOutput()) - pcPic->cs->picHeader->setPicOutputFlag(true); - else - pcPic->cs->picHeader->setPicOutputFlag(false); - + int curPoc = rpcSlice->getPOC(); + int gdrPoc = (curPoc - gdrPocStart) % gdrPeriod; + + pcPic->cs->picHeader->setGdrPicFlag(false); pcPic->cs->picHeader->setRecoveryPocCnt(0); - - pcPic->cs->picHeader->setNumHorVirtualBoundaries(0); - pcPic->cs->picHeader->setNumVerVirtualBoundaries(1); - pcPic->cs->picHeader->setVirtualBoundariesPosX(picWidth, 0); - } - // for none gdr period pictures - else if ((curPoc < gdrPocStart) || !isActualGdrPeriod || isGdrPeriodOver) - { - pcPic->cs->picHeader->setInGdrPeriod(false); + pcPic->cs->picHeader->setInGdrInterval(false); + pcPic->cs->picHeader->setVirtualBoundariesPresentFlag(false); - pcPic->cs->picHeader->setNumHorVirtualBoundaries(0); - pcPic->cs->picHeader->setNumVerVirtualBoundaries(0); + int offset = (curPoc < gdrPocStart) ? 0 : (((curPoc - gdrPocStart) / gdrPeriod) * gdrPeriod); + int actualGdrStart = gdrPocStart + offset; + int actualGdrInterval = min(gdrInterval, (int)(pcPic->getPicWidthInLumaSamples() / 8)); + int recoveryPocCnt = actualGdrInterval - 1; + int recoveryPicPoc = actualGdrStart + recoveryPocCnt; -#if GDR_ENC_TRACE - printf("-poc:%d no virtual boundary\n", rpcSlice->getPOC()); -#endif - } - // for gdr period pictures - else - { - pcPic->cs->picHeader->setInGdrPeriod(true); - pcPic->cs->picHeader->setVirtualBoundariesPresentFlag(true); + bool isInGdrInterval = (curPoc >= actualGdrStart) && (curPoc < recoveryPicPoc); + bool isOutGdrInterval = !isInGdrInterval; + bool isGdrPic = (actualGdrStart == curPoc); - if (m_pcCfg->getGdrPicOutput()) - pcPic->cs->picHeader->setPicOutputFlag(true); - else - pcPic->cs->picHeader->setPicOutputFlag(false); +#if GDR_ENC_TRACE + printf("\n"); + printf("-poc:%d gdrPocStart:%d actualGdrStart:%d actualGdrInterval:%d actualGdrEndPoc:%d\n", rpcSlice->getPOC(), gdrPocStart, actualGdrStart, actualGdrInterval, recoveryPicPoc - 1); +#endif - if (isGdrPic) + // for none gdr period pictures + if ((curPoc < gdrPocStart) || isOutGdrInterval) { - pcPic->cs->picHeader->setGdrOrIrapPicFlag(true); - pcPic->cs->picHeader->setGdrPicFlag(true); - - pcPic->cs->picHeader->setRecoveryPocCnt(actualGdrPeriod); - m_pcGOPEncoder->setLastGdrPeriodPoc(actualGdrStart + actualGdrPeriod - 1); + pcPic->cs->picHeader->setInGdrInterval(false); + pcPic->cs->picHeader->setVirtualBoundariesPresentFlag(false); + + pcPic->cs->picHeader->setNumHorVirtualBoundaries(0); + pcPic->cs->picHeader->setNumVerVirtualBoundaries(0); + +#if GDR_ENC_TRACE + printf("-poc:%d no virtual boundary\n", rpcSlice->getPOC()); +#endif } + // for gdr inteval pictures + else + { + if (curPoc == recoveryPicPoc) + { + pcPic->cs->picHeader->setInGdrInterval(false); + } + else + { + pcPic->cs->picHeader->setInGdrInterval(true); + } - pcPic->cs->picHeader->setNumHorVirtualBoundaries(0); - pcPic->cs->picHeader->setNumVerVirtualBoundaries(1); + pcPic->cs->picHeader->setVirtualBoundariesPresentFlag(true); - int begGdrX; - int endGdrX; - int m1, m2, n1; + if (isGdrPic) + { + pcPic->cs->picHeader->setGdrOrIrapPicFlag(true); + pcPic->cs->picHeader->setGdrPicFlag(true); - double dd = (picWidth / (double)gdrPeriod); - int mm = (int)((picWidth / (double)gdrPeriod) + 0.49999); - m1 = ((mm + 7) >> 3) << 3; - m2 = ((mm + 0) >> 3) << 3; + pcPic->cs->picHeader->setRecoveryPocCnt(recoveryPocCnt); + m_pcGOPEncoder->setLastGdrIntervalPoc(recoveryPicPoc - 1); + } - if (dd > mm && m1 == m2) - { - m1 = m1 + 8; - } - - n1 = (picWidth - m2 * gdrPeriod) / 8; + pcPic->cs->picHeader->setNumHorVirtualBoundaries(0); + pcPic->cs->picHeader->setNumVerVirtualBoundaries(1); - if (gdrPoc < n1) - { - begGdrX = m1 * gdrPoc; - endGdrX = begGdrX + m1; - } - else - { - begGdrX = m1 * n1 + m2 * (gdrPoc - n1); - endGdrX = begGdrX + m2; - if (picWidth <= begGdrX) - { + int begGdrX; + int endGdrX; + int m1, m2, n1; + + double dd = (picWidth / (double)gdrInterval); + int mm = (int)((picWidth / (double)gdrInterval) + 0.49999); + m1 = ((mm + 7) >> 3) << 3; + m2 = ((mm + 0) >> 3) << 3; + + if (dd > mm && m1 == m2) + { + m1 = m1 + 8; + } + + n1 = (picWidth - m2 * gdrInterval) / 8; + + if (gdrPoc < n1) + { + begGdrX = m1 * gdrPoc; + endGdrX = begGdrX + m1; + } + else + { + begGdrX = m1 * n1 + m2 * (gdrPoc - n1); + endGdrX = begGdrX + m2; + if (picWidth <= begGdrX) + { begGdrX = picWidth; endGdrX = picWidth; - } - } - - pcPic->cs->picHeader->setVirtualBoundariesPosX(endGdrX, 0); + } + } + + pcPic->cs->picHeader->setVirtualBoundariesPosX(endGdrX, 0); #if GDR_ENC_TRACE - printf("\n"); - printf("-poc:%d beg:%d end:%d\n", rpcSlice->getPOC(), begGdrX, endGdrX); + printf("\n"); + printf("-poc:%d beg:%d end:%d\n", rpcSlice->getPOC(), begGdrX, endGdrX); #endif - } + } + } #endif } diff --git a/source/Lib/EncoderLib/InterSearch.cpp b/source/Lib/EncoderLib/InterSearch.cpp index b5ebeb0ea72bd188049a376c7030ad08c6953f98..7bd68f39af10e0592543d4103d17aad84297d74e 100644 --- a/source/Lib/EncoderLib/InterSearch.cpp +++ b/source/Lib/EncoderLib/InterSearch.cpp @@ -756,7 +756,7 @@ Distortion InterSearch::xPatternRefinement( const CPelBuf* pcPatternKey, #if GDR_ENABLED const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); bool uiDistOk = false; bool uiDistBestOk = false; bool allOk = true; @@ -946,7 +946,7 @@ int InterSearch::xIBCSearchMVChromaRefine(PredictionUnit& pu, #if GDR_ENABLED CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); if (isEncodeGdrClean) { @@ -1071,7 +1071,7 @@ void InterSearch::xIntraPatternSearch(PredictionUnit& pu, IntTZSearchStruct& cS #if GDR_ENABLED CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif for (int cand = 0; cand < CHROMA_REFINEMENT_CANDIDATES; cand++) @@ -1453,7 +1453,7 @@ void InterSearch::xIBCEstimation(PredictionUnit& pu, PelUnitBuf& origBuf, #if GDR_ENABLED CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif if ((pu.cs->slice->getLmcsEnabledFlag() && m_pcReshape->getCTUFlag())) @@ -1644,7 +1644,7 @@ bool InterSearch::predIBCSearch(CodingUnit& cu, Partitioner& partitioner, const CHECK(pu.cu != &cu, "PU is contained in another CU"); #if GDR_ENABLED CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif #if GDR_ENABLED @@ -1795,7 +1795,7 @@ void InterSearch::xxIBCHashSearch(PredictionUnit& pu, Mv* mvPred, int numMvPred, #if GDR_ENABLED CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif std::vector<Position> candPos; if (ibcHashMap.ibcHashMatch(pu.Y(), candPos, *pu.cs, m_pcEncCfg->getIBCHashSearchMaxCand(), m_pcEncCfg->getIBCHashSearchRange4SmallBlk())) @@ -2035,7 +2035,7 @@ bool InterSearch::xRectHashInterEstimation(PredictionUnit& pu, RefPicList& bestR #if GDR_ENABLED CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif for (int k = 0; k < baseNum; k++) @@ -2229,7 +2229,10 @@ bool InterSearch::xRectHashInterEstimation(PredictionUnit& pu, RefPicList& bestR { bool isSolid = currAMVPInfoPel.mvSolid[mvpIdxTemp]; allOk = allOk && isSolid; - if (allOk) anyCandOk = true; + if (allOk) + { + anyCandOk = true; + } } #endif @@ -2251,12 +2254,15 @@ bool InterSearch::xRectHashInterEstimation(PredictionUnit& pu, RefPicList& bestR m_pcRdCost->setPredictor(mvPred4Pel); bitsMVP4Pel = m_pcRdCost->getBitsOfVectorWithPredictor(cMv.getHor(), cMv.getVer(), 4); #if GDR_ENABLED - allOk = (bitsMVP1Pel < curMVPbits); + allOk = (bitsMVP4Pel < curMVPbits); if (isEncodeGdrClean) { bool isSolid = currAMVPInfo4Pel.mvSolid[mvpIdxTemp]; allOk = allOk && isSolid; - if (allOk) anyCandOk = true; + if (allOk) + { + anyCandOk = true; + } } #endif @@ -2353,7 +2359,7 @@ bool InterSearch::xHashInterEstimation(PredictionUnit& pu, RefPicList& bestRefPi #if GDR_ENABLED CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif BlockHash currBlockHash; currBlockHash.x = xPos; @@ -2561,7 +2567,7 @@ bool InterSearch::xHashInterEstimation(PredictionUnit& pu, RefPicList& bestRefPi bitsMVP4Pel = m_pcRdCost->getBitsOfVectorWithPredictor(cMv.getHor(), cMv.getVer(), 4); #if GDR_ENABLED - allOk = (bitsMVP1Pel < curMVPbits); + allOk = (bitsMVP4Pel < curMVPbits); if (isEncodeGdrClean) { bool isSolid = currAMVPInfo4Pel.mvSolid[mvpIdxTemp]; @@ -2787,7 +2793,7 @@ void InterSearch::predInterSearch(CodingUnit& cu, Partitioner& partitioner) } #if GDR_ENABLED - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); const bool init_value = true; #endif @@ -4532,7 +4538,7 @@ void InterSearch::xEstimateMvPredAMVP( PredictionUnit& pu, PelUnitBuf& origBuf, AMVPInfo* pcAMVPInfo = &rAMVPInfo; #if GDR_ENABLED const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif #if GDR_ENABLED @@ -4688,7 +4694,7 @@ void InterSearch::xCheckBestMVP ( RefPicList eRefPicList, Mv cMv, Mv& rcMvPred, { #if GDR_ENABLED const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); bool iBestMvBitsOk = false; bool iMvBitsOk = false; #endif @@ -5090,43 +5096,46 @@ void InterSearch::xSetSearchRange ( const PredictionUnit& pu, Mv mvTL(cFPMvPred.getHor() - (iSrchRng << iMvShift), cFPMvPred.getVer() - (iSrchRng << iMvShift)); Mv mvBR(cFPMvPred.getHor() + (iSrchRng << iMvShift), cFPMvPred.getVer() + (iSrchRng << iMvShift)); #if GDR_ENABLED - bool isRefGdrPicture = pu.cs->slice->getRefPic(eRefPicList, iRefIdx)->cs->picHeader->getInGdrPeriod(); - if (isRefGdrPicture) + if (m_pcEncCfg->getGdrEnabled()) { - mvTL = { cFPMvPred.getHor(), cFPMvPred.getVer() }; - mvBR = { cFPMvPred.getHor(), cFPMvPred.getVer() }; + bool isRefGdrPicture = pu.cs->slice->getRefPic(eRefPicList, iRefIdx)->cs->picHeader->getInGdrInterval(); + if (isRefGdrPicture) + { + mvTL = { cFPMvPred.getHor(), cFPMvPred.getVer() }; + mvBR = { cFPMvPred.getHor(), cFPMvPred.getVer() }; - const int lumaPixelAway = 4; - const int chromaPixelAway = 5; + const int lumaPixelAway = 4; + const int chromaPixelAway = 5; - const Position LastPos = pu.Y().bottomRight(); + const Position LastPos = pu.Y().bottomRight(); - const int iMvShift = MV_FRACTIONAL_BITS_INTERNAL; - const int iMvLumaFrac = (1 << iMvShift); - const int iMvChromaFrac = (iMvLumaFrac << 1); - const int iFracOne = (1 << iMvShift); + const int iMvShift = MV_FRACTIONAL_BITS_INTERNAL; + const int iMvLumaFrac = (1 << iMvShift); + const int iMvChromaFrac = (iMvLumaFrac << 1); + const int iFracOne = (1 << iMvShift); - const bool isIntLumaMv = (cFPMvPred.getHor() % iMvLumaFrac) == 0; - const bool isIntChromaMv = (cFPMvPred.getHor() % iMvChromaFrac) == 0; + const bool isIntLumaMv = (cFPMvPred.getHor() % iMvLumaFrac) == 0; + const bool isIntChromaMv = (cFPMvPred.getHor() % iMvChromaFrac) == 0; - const int scaled_endx = pu.cs->slice->getRefPic(eRefPicList, iRefIdx)->cs->picHeader->getVirtualBoundariesPosX(0) << iMvShift; + const int scaled_endx = pu.cs->slice->getRefPic(eRefPicList, iRefIdx)->cs->picHeader->getVirtualBoundariesPosX(0) << iMvShift; - const Position OrigFracPos = Position(LastPos.x << iMvShift, LastPos.y << iMvShift); - const int last_luma_pos = ((OrigFracPos.x / iMvLumaFrac) * iMvLumaFrac) + cFPMvPred.getHor() + (isIntLumaMv ? 0 : (lumaPixelAway << iMvShift)); - const int last_chroma_pos = ((OrigFracPos.x / iMvChromaFrac) * iMvChromaFrac) + cFPMvPred.getHor() + (isIntChromaMv ? 0 : (chromaPixelAway << iMvShift)); + const Position OrigFracPos = Position(LastPos.x << iMvShift, LastPos.y << iMvShift); + const int last_luma_pos = ((OrigFracPos.x / iMvLumaFrac) * iMvLumaFrac) + cFPMvPred.getHor() + (isIntLumaMv ? 0 : (lumaPixelAway << iMvShift)); + const int last_chroma_pos = ((OrigFracPos.x / iMvChromaFrac) * iMvChromaFrac) + cFPMvPred.getHor() + (isIntChromaMv ? 0 : (chromaPixelAway << iMvShift)); - const int last_pel_pos = std::max(last_luma_pos, last_chroma_pos); + const int last_pel_pos = std::max(last_luma_pos, last_chroma_pos); - const int distance = Clip3(-(iSrchRng << iMvShift), (iSrchRng << iMvShift), scaled_endx - (last_pel_pos + iFracOne)); + const int distance = Clip3(-(iSrchRng << iMvShift), (iSrchRng << iMvShift), scaled_endx - (last_pel_pos + iFracOne)); - int srLeft = cFPMvPred.getHor() - (iSrchRng << iMvShift); - int srRight = cFPMvPred.getHor() + distance; - int srTop = cFPMvPred.getVer() - (iSrchRng << iMvShift); - int srBottom = cFPMvPred.getVer() + (iSrchRng << iMvShift); + int srLeft = cFPMvPred.getHor() - (iSrchRng << iMvShift); + int srRight = cFPMvPred.getHor() + distance; + int srTop = cFPMvPred.getVer() - (iSrchRng << iMvShift); + int srBottom = cFPMvPred.getVer() + (iSrchRng << iMvShift); - mvTL = { srLeft, srTop }; - mvBR = { srRight, srBottom }; + mvTL = { srLeft, srTop }; + mvBR = { srRight, srBottom }; + } } #endif @@ -5295,7 +5304,7 @@ void InterSearch::xTZSearch( const PredictionUnit& pu, #if GDR_ENABLED const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif int iSearchRange = m_iSearchRange; if( m_pcEncCfg->getMCTSEncConstraint() ) @@ -5847,7 +5856,7 @@ void InterSearch::xPatternSearchIntRefine(PredictionUnit& pu, IntTZSearchStruct& { #if GDR_ENABLED const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif CHECK( pu.cu->imv == 0 || pu.cu->imv == IMV_HPEL , "xPatternSearchIntRefine(): Sub-pel MV used."); @@ -6058,6 +6067,8 @@ void InterSearch::xPatternSearchFracDIF( rcMvQter = rcMvInt; rcMvQter <<= 1; // for mv-cost + rcMvQter += rcMvHalf; + rcMvQter <<= 1; #if GDR_ENABLED ruiCost = xPatternRefinement(pu, eRefPicList, iRefIdx, cStruct.pcPatternKey, baseRefMv, 1, rcMvQter, (!pu.cs->slice->getDisableSATDForRD()), rbCleanCandExist); #else @@ -6128,7 +6139,7 @@ Distortion InterSearch::xSymmeticRefineMvSearch( PredictionUnit &pu, PelUnitBuf& { #if GDR_ENABLED const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); bool uiCostOk; bool uiMinCostOk = rOk; #endif @@ -6357,7 +6368,7 @@ void InterSearch::xPredAffineInterSearch( PredictionUnit& pu, bool mvHevcSolid[3]; const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif AffineAMVPInfo aacAffineAMVPInfo[2][33]; AffineAMVPInfo affiAMVPInfoTemp[2]; @@ -8056,7 +8067,7 @@ void InterSearch::xCheckBestAffineMVP( PredictionUnit &pu, AffineAMVPInfo &affin { #if GDR_ENABLED const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif if ( affineAMVPInfo.numCand < 2 ) @@ -8185,7 +8196,7 @@ void InterSearch::xAffineMotionEstimation( PredictionUnit& pu, } #if GDR_ENABLED const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); bool acMvValid[3]; #endif @@ -8803,7 +8814,7 @@ void InterSearch::xEstimateAffineAMVP( PredictionUnit& pu, #if GDR_ENABLED const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); bool uiBestCostOk = false; #endif @@ -10972,7 +10983,7 @@ uint32_t InterSearch::xDetermineBestMvp( PredictionUnit& pu, Mv acMvTemp[3], int uint32_t minBits = std::numeric_limits<uint32_t>::max(); #if GDR_ENABLED const CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif for ( int i = 0; i < aamvpi.numCand; i++ ) @@ -11030,7 +11041,7 @@ void InterSearch::symmvdCheckBestMvp( { #if GDR_ENABLED CodingStructure &cs = *pu.cs; - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); bool bestCostOk = true; bool costOk = true; bool allOk; diff --git a/source/Lib/EncoderLib/IntraSearch.cpp b/source/Lib/EncoderLib/IntraSearch.cpp index 90b4dec0a06074edfc684688f7c5b7c158eca50a..dd02ff1f8cc46ee095c5d222868d1cf8d3baef6a 100644 --- a/source/Lib/EncoderLib/IntraSearch.cpp +++ b/source/Lib/EncoderLib/IntraSearch.cpp @@ -472,7 +472,7 @@ bool IntraSearch::isValidIntraPredLuma(PredictionUnit &pu, int luma_dirMode) bool isValid = true; PicHeader *ph = pu.cs->picHeader; - if (ph->getInGdrPeriod()) + if (ph->getInGdrInterval()) { int x = pu.Y().x; @@ -496,7 +496,7 @@ bool IntraSearch::isValidIntraPredChroma(PredictionUnit &pu, int luma_dirMode, i CodingStructure *cs = pu.cs; PicHeader *ph = cs->picHeader; - if (ph->getInGdrPeriod()) + if (ph->getInGdrInterval()) { // note: chroma cordinate int cbX = pu.Cb().x; @@ -638,7 +638,7 @@ bool IntraSearch::estIntraPredLumaQT(CodingUnit &cu, Partitioner &partitioner, c auto &pu = *cu.firstPU; #if GDR_ENABLED - const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); + const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0)); #endif bool validReturn = false; { @@ -1799,7 +1799,11 @@ void IntraSearch::estIntraPredChromaQT( CodingUnit &cu, Partitioner &partitioner //----- compare ----- #if GDR_ENABLED - if (dCost < dBestCost && isValidIntraPredChroma(pu, (int)PU::getCoLocatedIntraLumaMode(pu), chromaIntraMode)) + bool allOk = (dCost < dBestCost); + if (m_pcEncCfg->getGdrEnabled()) + allOk = allOk && dBestCost && isValidIntraPredChroma(pu, (int)PU::getCoLocatedIntraLumaMode(pu), chromaIntraMode); + + if (allOk) #else if( dCost < dBestCost ) #endif diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 6feb999a48420e09da67b995b483aac594486148..a004fa4f199b94c1189ad2fc0bfbd48a90f0998a 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -1549,7 +1549,7 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader, bool writeRbspTrailingB { slice = picHeader->getPic()->cs->slice; } -WRITE_FLAG(picHeader->getGdrOrIrapPicFlag(), "ph_gdr_or_irap_pic_flag"); + WRITE_FLAG(picHeader->getGdrOrIrapPicFlag(), "ph_gdr_or_irap_pic_flag"); WRITE_FLAG(picHeader->getNonReferencePictureFlag(), "ph_non_ref_pic_flag"); if (picHeader->getGdrOrIrapPicFlag()) { @@ -1581,7 +1581,7 @@ WRITE_FLAG(picHeader->getGdrOrIrapPicFlag(), "ph_gdr_or_irap_pic_flag"); #if GDR_ENC_TRACE printf("-gdr_pic_flag:%d\n", picHeader->getGdrPicFlag()); printf("-recovery_poc_cnt:%d\n", picHeader->getRecoveryPocCnt()); - printf("-InGdrPeriod:%d\n", picHeader->getInGdrPeriod()); + printf("-InGdrInterval:%d\n", picHeader->getInGdrInterval()); #endif // PH extra bits are not written in the reference encoder // as these bits are reserved for future extensions