diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 801ba419ba44b712765f33ca1e3d4ae80699bf1e..3bb1dca8e1fc604ce14bb5dd7745d698f22ec413 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -246,6 +246,7 @@ #define JVET_Z0056_GPM_SPLIT_MODE_REORDERING 1 // JVET-Z0056: Template matching based reordering for GPM split modes #if ENABLE_OBMC #define JVET_Z0061_TM_OBMC 1 // JVET-Z0061: Template matching based OBMC +#define JVET_AC0335_CONTENT_ADAPTIVE_OBMC_ENABLING 1 // JVET-AC0335: Content adaptive OBMC enabling #endif #define JVET_AA0132_CONFIGURABLE_TM_TOOLS 1 // JVET-AA0132: Configuration parameters and SPS flags for template matching tools #define JVET_AB0079_TM_BCW_MRG 1 // JVET-AB0079: Template matching based BCW index derivation for merge mode with positive weights only diff --git a/source/Lib/EncoderLib/EncSlice.cpp b/source/Lib/EncoderLib/EncSlice.cpp index 61882d7364deceb7bb241ffc26fceca1e55be781..a31592b476fb23d71261f893c86166f9fa52be7a 100644 --- a/source/Lib/EncoderLib/EncSlice.cpp +++ b/source/Lib/EncoderLib/EncSlice.cpp @@ -1764,6 +1764,9 @@ void EncSlice::encodeCtus( Picture* pcPic, const bool bCompressEntireSlice, cons prevQP[0] = prevQP[1] = pcSlice->getSliceQp(); +#if JVET_AC0335_CONTENT_ADAPTIVE_OBMC_ENABLING && ENABLE_OBMC + int hashBlkHitPerc = -1; +#endif if( ( !pcSlice->isIntra() && pcSlice->getSPS()->getFpelMmvdEnabledFlag() ) || ( pcSlice->getSPS()->getIBCFlag() && m_pcCuEncoder->getEncCfg()->getIBCHashSearch() ) ) { @@ -1774,11 +1777,31 @@ void EncSlice::encodeCtus( Picture* pcPic, const bool bCompressEntireSlice, cons #endif if (m_pcCfg->getIntraPeriod() != -1) { +#if JVET_AC0335_CONTENT_ADAPTIVE_OBMC_ENABLING && ENABLE_OBMC + hashBlkHitPerc = m_pcCuEncoder->getIbcHashMap().calHashBlkMatchPerc(cs.area.Y()); +#else int hashBlkHitPerc = m_pcCuEncoder->getIbcHashMap().calHashBlkMatchPerc(cs.area.Y()); +#endif cs.slice->setDisableSATDForRD(hashBlkHitPerc > 59); } } +#if JVET_AC0335_CONTENT_ADAPTIVE_OBMC_ENABLING && ENABLE_OBMC + if (m_pcCuEncoder->getEncCfg()->getUseOBMC()) + { + if (cs.slice->getPOC() == 0 || cs.slice->getSliceType() == I_SLICE) // ensure sequential and parallel simulation generate same output + { + SPS* spsTmp = const_cast<SPS*>(cs.sps); + hashBlkHitPerc == -1 ? m_pcCuEncoder->getIbcHashMap().calHashBlkMatchPerc(cs.area.Y()) : hashBlkHitPerc; + bool hashScc = hashBlkHitPerc < 57; + spsTmp->setUseOBMC(hashScc); +#if JVET_Z0061_TM_OBMC + spsTmp->setUseOBMCTMMode(hashScc); +#endif + } + } +#endif + // for every CTU in the slice for( uint32_t ctuIdx = 0; ctuIdx < pcSlice->getNumCtuInSlice(); ctuIdx++ ) {