diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index 23fce78dc386bcf8d9336f5468fc7818e2c5cc7c..3d154cd966c22f3b21e40f8784d80bc80cec3985 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -877,7 +877,7 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) ("AffineAmvrEncOpt", m_AffineAmvrEncOpt, false, "Enable encoder optimization of affine AMVR") #endif #if JVET_M0147_DMVR - ("DMVR", m_DMVR, + ("DMVR", m_DMVR, false, "Decoder-side Motion Vector Refinement") #endif ( "IBC", m_IBCMode, 0u, "IBCMode (0x1:enabled, 0x0:disabled) [default: disabled]") ( "IBCLocalSearchRangeX", m_IBCLocalSearchRangeX, 128u, "Search range of IBC local search in x direction") diff --git a/source/Lib/CommonLib/Buffer.cpp b/source/Lib/CommonLib/Buffer.cpp index ad437016a5712f2c411c35c5281ec191b84889da..f245bff72d8aa2a3ebe80d1569707cdaf63a5b7d 100644 --- a/source/Lib/CommonLib/Buffer.cpp +++ b/source/Lib/CommonLib/Buffer.cpp @@ -327,15 +327,15 @@ void copyBufferCore(Pel *src, int srcStride, Pel *dst, int dstStride, int width, } } -void paddingCore(Pel *ptr, int iStride, int iWidth, int iHeight, int padSize) +void paddingCore(Pel *ptr, int stride, int width, int height, int padSize) { /*left and right padding*/ Pel *ptrTemp1 = ptr; - Pel *ptrTemp2 = ptr + (iWidth - 1); + Pel *ptrTemp2 = ptr + (width - 1); int offset = 0; - for (int i = 0; i < iHeight; i++) + for (int i = 0; i < height; i++) { - offset = iStride * i; + offset = stride * i; for (int j = 1; j <= padSize; j++) { *(ptrTemp1 - j + offset) = *(ptrTemp1 + offset); @@ -343,13 +343,13 @@ void paddingCore(Pel *ptr, int iStride, int iWidth, int iHeight, int padSize) } } /*Top and Bottom padding*/ - int numBytes = (iWidth + padSize + padSize) * sizeof(Pel); + int numBytes = (width + padSize + padSize) * sizeof(Pel); ptrTemp1 = (ptr - padSize); - ptrTemp2 = (ptr + (iStride * (iHeight - 1)) - padSize); + ptrTemp2 = (ptr + (stride * (height - 1)) - padSize); for (int i = 1; i <= padSize; i++) { - memcpy(ptrTemp1 - (i * iStride), (ptrTemp1), numBytes); - memcpy(ptrTemp2 + (i * iStride), (ptrTemp2), numBytes); + memcpy(ptrTemp1 - (i * stride), (ptrTemp1), numBytes); + memcpy(ptrTemp2 + (i * stride), (ptrTemp2), numBytes); } } #endif diff --git a/source/Lib/CommonLib/Buffer.h b/source/Lib/CommonLib/Buffer.h index 50b6571771024191c73e4516247caa25b9b6448f..3d9c703aba7db39907bbee5f61012bd6bfbefda7 100644 --- a/source/Lib/CommonLib/Buffer.h +++ b/source/Lib/CommonLib/Buffer.h @@ -96,7 +96,7 @@ extern PelBufferOps g_pelBufOP; #if JVET_M0147_DMVR -void paddingCore(Pel *ptr, int iStride, int iWidth, int iHeight, int padSize); +void paddingCore(Pel *ptr, int stride, int width, int height, int padSize); void copyBufferCore(Pel *src, int srcStride, Pel *Dst, int dstStride, int width, int height); #endif diff --git a/source/Lib/CommonLib/CommonDef.h b/source/Lib/CommonLib/CommonDef.h index bc2d375cb4704db3fc0cf74e161ceb2750fc336e..b2b7a9135047231cd348114148e5ac13b116ea1a 100644 --- a/source/Lib/CommonLib/CommonDef.h +++ b/source/Lib/CommonLib/CommonDef.h @@ -117,7 +117,7 @@ static const double AFFINE_ME_LIST_MVP_TH = 1.0; // ==================================================================================================================== // Common constants // ==================================================================================================================== - +static const uint64_t MAX_UINT64 = 0xFFFFFFFFFFFFFFFFU; static const uint32_t MAX_UINT = 0xFFFFFFFFU; ///< max. value of unsigned 32-bit integer static const int MAX_INT = 2147483647; ///< max. value of signed 32-bit integer static const uint8_t MAX_UCHAR = 255; diff --git a/source/Lib/CommonLib/InterPrediction.cpp b/source/Lib/CommonLib/InterPrediction.cpp index 9108117e1ea4deefcd042e06a73e6edcfdcdfb9e..0b426e3c004a72e2e0b2734d2d110bed8aed9d27 100644 --- a/source/Lib/CommonLib/InterPrediction.cpp +++ b/source/Lib/CommonLib/InterPrediction.cpp @@ -170,8 +170,8 @@ void InterPrediction::init( RdCost* pcRdCost, ChromaFormat chromaFormatIDC ) int extWidth = MAX_CU_SIZE + (2 * BIO_EXTEND_SIZE + 2) + 16; int extHeight = MAX_CU_SIZE + (2 * BIO_EXTEND_SIZE + 2) + 1; #if JVET_M0147_DMVR - extWidth = extWidth > (MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1) + 16) ? extWidth : MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1) + 16; - extHeight = extHeight > (MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1) + 1) ? extHeight : MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1) + 1; + extWidth = extWidth > (MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION) + 16) ? extWidth : MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION) + 16; + extHeight = extHeight > (MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION) + 1) ? extHeight : MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION) + 1; #endif for( uint32_t i = 0; i < LUMA_INTERPOLATION_FILTER_SUB_SAMPLE_POSITIONS_SIGNAL; i++ ) { @@ -201,12 +201,12 @@ void InterPrediction::init( RdCost* pcRdCost, ChromaFormat chromaFormatIDC ) } #if JVET_M0147_DMVR - m_cYuvPredTempDMVRL0 = (Pel*)xMalloc(Pel, (MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1)) * (MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1))); - m_cYuvPredTempDMVRL1 = (Pel*)xMalloc(Pel, (MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1)) * (MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1))); + m_cYuvPredTempDMVRL0 = (Pel*)xMalloc(Pel, (MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION)) * (MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION))); + m_cYuvPredTempDMVRL1 = (Pel*)xMalloc(Pel, (MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION)) * (MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION))); for (uint32_t ch = 0; ch < MAX_NUM_COMPONENT; ch++) { - m_cRefSamplesDMVRL0[ch] = (Pel*)xMalloc(Pel, (MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1) + NTAPS_LUMA) * (MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1) + NTAPS_LUMA)); - m_cRefSamplesDMVRL1[ch] = (Pel*)xMalloc(Pel, (MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1) + NTAPS_LUMA) * (MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1) + NTAPS_LUMA)); + m_cRefSamplesDMVRL0[ch] = (Pel*)xMalloc(Pel, (MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION) + NTAPS_LUMA) * (MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION) + NTAPS_LUMA)); + m_cRefSamplesDMVRL1[ch] = (Pel*)xMalloc(Pel, (MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION) + NTAPS_LUMA) * (MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION) + NTAPS_LUMA)); } #endif #if !JVET_J0090_MEMORY_BANDWITH_MEASURE @@ -507,8 +507,8 @@ void InterPrediction::xPredInterBi(PredictionUnit& pu, PelUnitBuf &pcYuvPred) } #endif #if JVET_M0147_DMVR - bool bDMVRApplied = false; - bDMVRApplied = (pu.mvRefine) && PU::checkDMVRCondition(pu); + bool dmvrApplied = false; + dmvrApplied = (pu.mvRefine) && PU::checkDMVRCondition(pu); #endif for (uint32_t refList = 0; refList < NUM_REF_PIC_LIST_01; refList++) { @@ -529,7 +529,7 @@ void InterPrediction::xPredInterBi(PredictionUnit& pu, PelUnitBuf &pcYuvPred) if (pu.refIdx[0] >= 0 && pu.refIdx[1] >= 0) { #if JVET_M0147_DMVR - if (bDMVRApplied) + if (dmvrApplied) continue; // mc will happen in processDMVR #endif xPredInterUni ( pu, eRefPicList, pcMbBuf, true @@ -556,7 +556,7 @@ void InterPrediction::xPredInterBi(PredictionUnit& pu, PelUnitBuf &pcYuvPred) } } #if JVET_M0147_DMVR - if (bDMVRApplied) + if (dmvrApplied) { xProcessDMVR(pu, pcYuvPred, slice.clpRngs(), bioApplied); } @@ -580,7 +580,7 @@ void InterPrediction::xPredInterBi(PredictionUnit& pu, PelUnitBuf &pcYuvPred) else { #if JVET_M0147_DMVR - if (bDMVRApplied == false) + if (dmvrApplied == false) { #endif xWeightedAverage( pu, srcPred0, srcPred1, pcYuvPred, slice.getSPS()->getBitDepths(), slice.clpRngs(), bioApplied ); @@ -1583,24 +1583,23 @@ void InterPrediction::xWeightedTriangleBlk( const PredictionUnit &pu, const uint } #if JVET_M0147_DMVR -const uint64_t MAX_UINT64 = 0xFFFFFFFFFFFFFFFFU; void InterPrediction::xPrefetchPad(PredictionUnit& pu, PelUnitBuf &pcPad, RefPicList refId) { int offset, width, height; int padsize; Mv cMv; const Picture* refPic = pu.cu->slice->getRefPic(refId, pu.refIdx[refId]); - int mvshift = (MV_FRACTIONAL_BITS_INTERNAL); + int mvShift = (MV_FRACTIONAL_BITS_INTERNAL); for (int compID = 0; compID < MAX_NUM_COMPONENT; compID++) { cMv = Mv(pu.mv[refId].getHor(), pu.mv[refId].getVer()); - pcPad.bufs[compID].stride = (MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1) + NTAPS_LUMA); + pcPad.bufs[compID].stride = (MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION) + NTAPS_LUMA); int filtersize = (compID == (COMPONENT_Y)) ? NTAPS_LUMA : NTAPS_CHROMA; width = pcPad.bufs[compID].width; height = pcPad.bufs[compID].height; offset = (DMVR_NUM_ITERATION) * (pcPad.bufs[compID].stride + 1); padsize = (DMVR_NUM_ITERATION) >> getComponentScaleX((ComponentID)compID, pu.chromaFormat); - int mvshiftTemp = mvshift + getComponentScaleX((ComponentID)compID, pu.chromaFormat); + int mvshiftTemp = mvShift + getComponentScaleX((ComponentID)compID, pu.chromaFormat); width += (filtersize - 1); height += (filtersize - 1); cMv += Mv(-(((filtersize >> 1) - 1) << mvshiftTemp), @@ -1657,19 +1656,19 @@ inline int32_t div_for_maxq7(int64_t N, int64_t D) void xSubPelErrorSrfc(uint64_t *sadBuffer, int32_t *deltaMv) { - int64_t iNum, iDenom; - int32_t iMvDeltaSubPel; - int32_t MvSubPelLvl = 4;/*1: half pel, 2: Qpel, 3:1/8, 4: 1/16*/ + int64_t numerator, denominator; + int32_t mvDeltaSubPel; + int32_t mvSubPelLvl = 4;/*1: half pel, 2: Qpel, 3:1/8, 4: 1/16*/ /*horizontal*/ - iNum = (int64_t)((sadBuffer[1] - sadBuffer[3]) << MvSubPelLvl); - iDenom = (int64_t)((sadBuffer[1] + sadBuffer[3] - (sadBuffer[0] << 1))); + numerator = (int64_t)((sadBuffer[1] - sadBuffer[3]) << mvSubPelLvl); + denominator = (int64_t)((sadBuffer[1] + sadBuffer[3] - (sadBuffer[0] << 1))); - if (0 != iDenom) + if (0 != denominator) { if ((sadBuffer[1] != sadBuffer[0]) && (sadBuffer[3] != sadBuffer[0])) { - iMvDeltaSubPel = div_for_maxq7(iNum, iDenom); - deltaMv[0] = (iMvDeltaSubPel); + mvDeltaSubPel = div_for_maxq7(numerator, denominator); + deltaMv[0] = (mvDeltaSubPel); } else { @@ -1685,14 +1684,14 @@ void xSubPelErrorSrfc(uint64_t *sadBuffer, int32_t *deltaMv) } /*vertical*/ - iNum = (int64_t)((sadBuffer[2] - sadBuffer[4]) << MvSubPelLvl); - iDenom = (int64_t)((sadBuffer[2] + sadBuffer[4] - (sadBuffer[0] << 1))); - if (0 != iDenom) + numerator = (int64_t)((sadBuffer[2] - sadBuffer[4]) << mvSubPelLvl); + denominator = (int64_t)((sadBuffer[2] + sadBuffer[4] - (sadBuffer[0] << 1))); + if (0 != denominator) { if ((sadBuffer[2] != sadBuffer[0]) && (sadBuffer[4] != sadBuffer[0])) { - iMvDeltaSubPel = div_for_maxq7(iNum, iDenom); - deltaMv[1] = (iMvDeltaSubPel); + mvDeltaSubPel = div_for_maxq7(numerator, denominator); + deltaMv[1] = (mvDeltaSubPel); } else { @@ -1709,7 +1708,7 @@ void xSubPelErrorSrfc(uint64_t *sadBuffer, int32_t *deltaMv) return; } -void InterPrediction::xBIPMVRefine(int bd, Pel *pRefL0, Pel *pRefL1, uint64_t& minCost, int16_t *delta_mv, uint64_t *pSADsArray, int width, int height) +void InterPrediction::xBIPMVRefine(int bd, Pel *pRefL0, Pel *pRefL1, uint64_t& minCost, int16_t *deltaMV, uint64_t *pSADsArray, int width, int height) { const int32_t refStrideL0 = m_biLinearBufStride; const int32_t refStrideL1 = m_biLinearBufStride; @@ -1717,18 +1716,18 @@ void InterPrediction::xBIPMVRefine(int bd, Pel *pRefL0, Pel *pRefL1, uint64_t& m Pel *pRefL1Orig = pRefL1; for (int nIdx = SAD_BOTTOM; nIdx <= SAD_TOP_LEFT; ++nIdx) { - int32_t SadOffset = ((m_pSearchOffset[nIdx].getVer() * ((DMVR_NUM_ITERATION << 1) + 1)) + m_pSearchOffset[nIdx].getHor()); + int32_t sadOffset = ((m_pSearchOffset[nIdx].getVer() * ((2 * DMVR_NUM_ITERATION) + 1)) + m_pSearchOffset[nIdx].getHor()); pRefL0 = pRefL0Orig + m_pSearchOffset[nIdx].hor + (m_pSearchOffset[nIdx].ver * refStrideL0); pRefL1 = pRefL1Orig - m_pSearchOffset[nIdx].hor - (m_pSearchOffset[nIdx].ver * refStrideL1); - if (*(pSADsArray + SadOffset) == MAX_UINT64) + if (*(pSADsArray + sadOffset) == MAX_UINT64) { const uint64_t cost = xDMVRCost(bd, pRefL0, refStrideL0, pRefL1, refStrideL1, width, height); - *(pSADsArray + SadOffset) = cost; + *(pSADsArray + sadOffset) = cost; } if (nIdx == SAD_LEFT) { int32_t down = -1, right = -1; - if (pSADsArray[(((DMVR_NUM_ITERATION << 1) + 1))] < pSADsArray[-(((DMVR_NUM_ITERATION << 1) + 1))]) + if (pSADsArray[(((2 * DMVR_NUM_ITERATION) + 1))] < pSADsArray[-(((2 * DMVR_NUM_ITERATION) + 1))]) { down = 1; } @@ -1738,16 +1737,16 @@ void InterPrediction::xBIPMVRefine(int bd, Pel *pRefL0, Pel *pRefL1, uint64_t& m } m_pSearchOffset[SAD_TOP_LEFT].set(right, down); } - if (*(pSADsArray + SadOffset) < minCost) + if (*(pSADsArray + sadOffset) < minCost) { - minCost = *(pSADsArray + SadOffset); - delta_mv[0] = m_pSearchOffset[nIdx].getHor(); - delta_mv[1] = m_pSearchOffset[nIdx].getVer(); + minCost = *(pSADsArray + sadOffset); + deltaMV[0] = m_pSearchOffset[nIdx].getHor(); + deltaMV[1] = m_pSearchOffset[nIdx].getVer(); } } } -void InterPrediction::xFinalPaddedMCForDMVR(PredictionUnit& pu, PelUnitBuf &pcYuvSrc0, PelUnitBuf &pcYuvSrc1, PelUnitBuf &pcPad0, PelUnitBuf &pcPad1, const bool bBIOApplied +void InterPrediction::xFinalPaddedMCForDMVR(PredictionUnit& pu, PelUnitBuf &pcYuvSrc0, PelUnitBuf &pcYuvSrc1, PelUnitBuf &pcPad0, PelUnitBuf &pcPad1, const bool bioApplied , const Mv mergeMV[NUM_REF_PIC_LIST_01] ) { @@ -1756,7 +1755,7 @@ void InterPrediction::xFinalPaddedMCForDMVR(PredictionUnit& pu, PelUnitBuf &pcYu PelUnitBuf pcYUVTemp = pcYuvSrc0; PelUnitBuf pcPadTemp = pcPad0; /*always high precision MVs are used*/ - int mvshift = 4; + int mvShift = MV_FRACTIONAL_BITS_INTERNAL; for (int k = 0; k < NUM_REF_PIC_LIST_01; k++) { @@ -1771,7 +1770,7 @@ void InterPrediction::xFinalPaddedMCForDMVR(PredictionUnit& pu, PelUnitBuf &pcYu for (int compID = 0; compID < MAX_NUM_COMPONENT; compID++) { - int mvshiftTemp = mvshift + getComponentScaleX((ComponentID)compID, pu.chromaFormat); + int mvshiftTemp = mvShift + getComponentScaleX((ComponentID)compID, pu.chromaFormat); int leftPixelExtra; if (compID == COMPONENT_Y) { @@ -1794,53 +1793,53 @@ void InterPrediction::xFinalPaddedMCForDMVR(PredictionUnit& pu, PelUnitBuf &pcYu offset += (deltaIntMvX); PelBuf &srcBuf = pcPadTemp.bufs[compID]; xPredInterBlk((ComponentID)compID, pu, refPic, cMv, pcYUVTemp, true, pu.cs->slice->getClpRngs().comp[compID], - bBIOApplied, false, 0, 0, 0, (srcBuf.buf + offset), pcPadTemp.bufs[compID].stride); + bioApplied, false, 0, 0, 0, (srcBuf.buf + offset), pcPadTemp.bufs[compID].stride); } pcYUVTemp = pcYuvSrc1; pcPadTemp = pcPad1; } } -uint64_t InterPrediction::xDMVRCost(int iBitDepth, Pel* pOrg, uint32_t uiRefStride, const Pel* pRef, uint32_t uiOrgStride, int iWidth, int iHeight) +uint64_t InterPrediction::xDMVRCost(int bitDepth, Pel* pOrg, uint32_t refStride, const Pel* pRef, uint32_t orgStride, int width, int height) { DistParam cDistParam; cDistParam.applyWeight = false; cDistParam.useMR = false; - m_pcRdCost->setDistParam(cDistParam, pOrg, pRef, uiOrgStride, uiRefStride, iBitDepth, COMPONENT_Y, iWidth, iHeight , 1); + m_pcRdCost->setDistParam(cDistParam, pOrg, pRef, orgStride, refStride, bitDepth, COMPONENT_Y, width, height, 1); uint64_t uiCost = cDistParam.distFunc(cDistParam); return uiCost; } -void xDMVRSubPixelErrorSurface(bool notZeroCost, int16_t *total_delta_mv, int16_t *delta_mv, uint64_t *pSADsArray) +void xDMVRSubPixelErrorSurface(bool notZeroCost, int16_t *totalDeltaMV, int16_t *deltaMV, uint64_t *pSADsArray) { - int sadStride = (((DMVR_NUM_ITERATION << 1) + 1)); + int sadStride = (((2 * DMVR_NUM_ITERATION) + 1)); uint64_t sadbuffer[5]; - int32_t deltaMv[2] = { 0,0 }; - if (notZeroCost && delta_mv[0] == 0 && delta_mv[1] == 0) + if (notZeroCost && deltaMV[0] == 0 && deltaMV[1] == 0) { + int32_t tempDeltaMv[2] = { 0,0 }; sadbuffer[0] = pSADsArray[0]; sadbuffer[1] = pSADsArray[-1]; sadbuffer[2] = pSADsArray[-sadStride]; sadbuffer[3] = pSADsArray[1]; sadbuffer[4] = pSADsArray[sadStride]; - xSubPelErrorSrfc(sadbuffer, deltaMv); - total_delta_mv[0] += deltaMv[0]; - total_delta_mv[1] += deltaMv[1]; + xSubPelErrorSrfc(sadbuffer, tempDeltaMv); + totalDeltaMV[0] += tempDeltaMv[0]; + totalDeltaMV[1] += tempDeltaMv[1]; } } void InterPrediction::xinitMC(PredictionUnit& pu, const ClpRngs &clpRngs) { - const int iRefIdx0 = pu.refIdx[0]; - const int iRefIdx1 = pu.refIdx[1]; + const int refIdx0 = pu.refIdx[0]; + const int refIdx1 = pu.refIdx[1]; /*use merge MV as starting MV*/ - Mv StartingMVL0(pu.mv[REF_PIC_LIST_0]); - Mv StartingMVL1(pu.mv[REF_PIC_LIST_1]); + Mv mergeMVL0(pu.mv[REF_PIC_LIST_0]); + Mv mergeMVL1(pu.mv[REF_PIC_LIST_1]); /*Clip the starting MVs*/ - clipMv(StartingMVL0, pu.lumaPos(), pu.lumaSize(), *pu.cs->sps); - clipMv(StartingMVL1, pu.lumaPos(), pu.lumaSize(), *pu.cs->sps); + clipMv(mergeMVL0, pu.lumaPos(), pu.lumaSize(), *pu.cs->sps); + clipMv(mergeMVL1, pu.lumaPos(), pu.lumaSize(), *pu.cs->sps); /*L0 MC for refinement*/ { @@ -1851,10 +1850,10 @@ void InterPrediction::xinitMC(PredictionUnit& pu, const ClpRngs &clpRngs) offset += (-(int)DMVR_NUM_ITERATION); PelBuf srcBuf = m_cYuvRefBuffDMVRL0.bufs[COMPONENT_Y]; PelUnitBuf yuvPredTempL0 = PelUnitBuf(pu.chromaFormat, PelBuf(m_cYuvPredTempDMVRL0, - (MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1)), pu.lwidth() + (DMVR_NUM_ITERATION << 1), pu.lheight() + (DMVR_NUM_ITERATION << 1))); + (MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION)), pu.lwidth() + (2 * DMVR_NUM_ITERATION), pu.lheight() + (2 * DMVR_NUM_ITERATION))); - xPredInterBlk(COMPONENT_Y, pu, pu.cu->slice->getRefPic(REF_PIC_LIST_0, iRefIdx0), StartingMVL0, yuvPredTempL0, true, clpRngs.comp[COMPONENT_Y], - false, false, pu.lwidth() + (DMVR_NUM_ITERATION << 1), pu.lheight() + (DMVR_NUM_ITERATION << 1), true, ((Pel *)srcBuf.buf) + offset, srcBuf.stride + xPredInterBlk(COMPONENT_Y, pu, pu.cu->slice->getRefPic(REF_PIC_LIST_0, refIdx0), mergeMVL0, yuvPredTempL0, true, clpRngs.comp[COMPONENT_Y], + false, false, pu.lwidth() + (2 * DMVR_NUM_ITERATION), pu.lheight() + (2 * DMVR_NUM_ITERATION), true, ((Pel *)srcBuf.buf) + offset, srcBuf.stride ); } @@ -1867,18 +1866,16 @@ void InterPrediction::xinitMC(PredictionUnit& pu, const ClpRngs &clpRngs) offset += (-(int)DMVR_NUM_ITERATION); PelBuf srcBuf = m_cYuvRefBuffDMVRL1.bufs[COMPONENT_Y]; PelUnitBuf yuvPredTempL1 = PelUnitBuf(pu.chromaFormat, PelBuf(m_cYuvPredTempDMVRL1, - (MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1)), pu.lwidth() + (DMVR_NUM_ITERATION << 1), pu.lheight() + (DMVR_NUM_ITERATION << 1))); + (MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION)), pu.lwidth() + (2 * DMVR_NUM_ITERATION), pu.lheight() + (2 * DMVR_NUM_ITERATION))); - xPredInterBlk(COMPONENT_Y, pu, pu.cu->slice->getRefPic(REF_PIC_LIST_1, iRefIdx1), StartingMVL1, yuvPredTempL1, true, clpRngs.comp[COMPONENT_Y], - false, false, pu.lwidth() + (DMVR_NUM_ITERATION << 1), pu.lheight() + (DMVR_NUM_ITERATION << 1), true, ((Pel *)srcBuf.buf) + offset, srcBuf.stride + xPredInterBlk(COMPONENT_Y, pu, pu.cu->slice->getRefPic(REF_PIC_LIST_1, refIdx1), mergeMVL1, yuvPredTempL1, true, clpRngs.comp[COMPONENT_Y], + false, false, pu.lwidth() + (2 * DMVR_NUM_ITERATION), pu.lheight() + (2 * DMVR_NUM_ITERATION), true, ((Pel *)srcBuf.buf) + offset, srcBuf.stride ); } } -void InterPrediction::xProcessDMVR(PredictionUnit& pu, PelUnitBuf &pcYuvDst, const ClpRngs &clpRngs, const bool bBIOApplied) +void InterPrediction::xProcessDMVR(PredictionUnit& pu, PelUnitBuf &pcYuvDst, const ClpRngs &clpRngs, const bool bioApplied) { - bool bDMVRApplied = true; - int iterationCount = DMVR_NUM_ITERATION; /*Always High Precision*/ int mvShift = MV_FRACTIONAL_BITS_INTERNAL; @@ -1886,7 +1883,7 @@ void InterPrediction::xProcessDMVR(PredictionUnit& pu, PelUnitBuf &pcYuvDst, con /*use merge MV as starting MV*/ Mv mergeMv[] = { pu.mv[REF_PIC_LIST_0] , pu.mv[REF_PIC_LIST_1] }; - m_biLinearBufStride = (MAX_CU_SIZE + (DMVR_NUM_ITERATION << 1)); + m_biLinearBufStride = (MAX_CU_SIZE + (2 * DMVR_NUM_ITERATION)); int dy = std::min<int>(pu.lumaSize().height, DMVR_SUBCU_HEIGHT); int dx = std::min<int>(pu.lumaSize().width, DMVR_SUBCU_WIDTH); @@ -1915,7 +1912,7 @@ void InterPrediction::xProcessDMVR(PredictionUnit& pu, PelUnitBuf &pcYuvDst, con Position puPos = pu.lumaPos(); int bd = pu.cs->slice->getClpRngs().comp[COMPONENT_Y].bd; - if (bDMVRApplied) + { int num = 0; @@ -1929,11 +1926,11 @@ void InterPrediction::xProcessDMVR(PredictionUnit& pu, PelUnitBuf &pcYuvDst, con int16_t totalDeltaMV[2] = { 0,0 }; int16_t deltaMV[2] = { 0, 0 }; uint64_t *pSADsArray; - for (int i = 0; i < (((DMVR_NUM_ITERATION << 1) + 1) * ((DMVR_NUM_ITERATION << 1) + 1)); i++) + for (int i = 0; i < (((2 * DMVR_NUM_ITERATION) + 1) * ((2 * DMVR_NUM_ITERATION) + 1)); i++) { m_SADsArray[i] = MAX_UINT64; } - pSADsArray = &m_SADsArray[(((DMVR_NUM_ITERATION << 1) + 1) * ((DMVR_NUM_ITERATION << 1) + 1)) >> 1]; + pSADsArray = &m_SADsArray[(((2 * DMVR_NUM_ITERATION) + 1) * ((2 * DMVR_NUM_ITERATION) + 1)) >> 1]; Pel *addrL0Centre = biLinearPredL0 + yStart * m_biLinearBufStride + xStart; Pel *addrL1Centre = biLinearPredL1 + yStart * m_biLinearBufStride + xStart; @@ -1967,7 +1964,7 @@ void InterPrediction::xProcessDMVR(PredictionUnit& pu, PelUnitBuf &pcYuvDst, con } totalDeltaMV[0] += deltaMV[0]; totalDeltaMV[1] += deltaMV[1]; - pSADsArray += ((deltaMV[1] * (((DMVR_NUM_ITERATION << 1) + 1))) + deltaMV[0]); + pSADsArray += ((deltaMV[1] * (((2 * DMVR_NUM_ITERATION) + 1))) + deltaMV[0]); } totalDeltaMV[0] = (totalDeltaMV[0] << mvShift); @@ -2012,12 +2009,12 @@ void InterPrediction::xProcessDMVR(PredictionUnit& pu, PelUnitBuf &pcYuvDst, con subPu.mv[1] = mergeMv[REF_PIC_LIST_1] - pu.mvdL0SubPu[num]; m_cYuvRefBuffSubCuDMVRL0 = m_cYuvRefBuffDMVRL0.subBuf(UnitAreaRelative(pu, subPu)); m_cYuvRefBuffSubCuDMVRL1 = m_cYuvRefBuffDMVRL1.subBuf(UnitAreaRelative(pu, subPu)); - xFinalPaddedMCForDMVR(subPu, srcPred0, srcPred1, m_cYuvRefBuffSubCuDMVRL0, m_cYuvRefBuffSubCuDMVRL1, bBIOApplied, mergeMv); + xFinalPaddedMCForDMVR(subPu, srcPred0, srcPred1, m_cYuvRefBuffSubCuDMVRL0, m_cYuvRefBuffSubCuDMVRL1, bioApplied, mergeMv); subPredBuf.bufs[COMPONENT_Y].buf = pcYuvDst.bufs[COMPONENT_Y].buf + xStart + yStart * dstStride[COMPONENT_Y]; subPredBuf.bufs[COMPONENT_Cb].buf = pcYuvDst.bufs[COMPONENT_Cb].buf + (xStart >> 1) + ((yStart >> 1) * dstStride[COMPONENT_Cb]); subPredBuf.bufs[COMPONENT_Cr].buf = pcYuvDst.bufs[COMPONENT_Cr].buf + (xStart >> 1) + ((yStart >> 1) * dstStride[COMPONENT_Cr]); - xWeightedAverage(subPu, srcPred0, srcPred1, subPredBuf, subPu.cu->slice->getSPS()->getBitDepths(), subPu.cu->slice->clpRngs(), bBIOApplied); + xWeightedAverage(subPu, srcPred0, srcPred1, subPredBuf, subPu.cu->slice->getSPS()->getBitDepths(), subPu.cu->slice->clpRngs(), bioApplied); num++; } } diff --git a/source/Lib/CommonLib/InterPrediction.h b/source/Lib/CommonLib/InterPrediction.h index 44c11d9d919b1fd2fe00d8934ab40be93c8ce51f..d25ef21d7539cebb5b9dd4ecfeb02b4695868863 100644 --- a/source/Lib/CommonLib/InterPrediction.h +++ b/source/Lib/CommonLib/InterPrediction.h @@ -119,7 +119,7 @@ protected: SAD_COUNT }; Mv m_pSearchOffset[5] = { Mv(0, 1), Mv(0, -1), Mv(1, 0), Mv(-1, 0), Mv(0, 0) }; - uint64_t m_SADsArray[((DMVR_NUM_ITERATION << 1) + 1) * ((DMVR_NUM_ITERATION << 1) + 1)]; + uint64_t m_SADsArray[((2 * DMVR_NUM_ITERATION) + 1) * ((2 * DMVR_NUM_ITERATION) + 1)]; #endif Pel* m_gradX0; @@ -210,13 +210,13 @@ public: #endif #if JVET_M0147_DMVR void xPrefetchPad(PredictionUnit& pu, PelUnitBuf &pcPad, RefPicList refId); - void xFinalPaddedMCForDMVR(PredictionUnit& pu, PelUnitBuf &pcYuvSrc0, PelUnitBuf &pcYuvSrc1, PelUnitBuf &pcPad0, PelUnitBuf &pcPad1, const bool bBIOApplied + void xFinalPaddedMCForDMVR(PredictionUnit& pu, PelUnitBuf &pcYuvSrc0, PelUnitBuf &pcYuvSrc1, PelUnitBuf &pcPad0, PelUnitBuf &pcPad1, const bool bioApplied , const Mv startMV[NUM_REF_PIC_LIST_01] ); - void xBIPMVRefine(int bd, Pel *pRefL0, Pel *pRefL1, uint64_t& minCost, int16_t *delta_mv, uint64_t *pSADsArray, int width, int height); - uint64_t xDMVRCost(int iBitDepth, Pel* pRef, uint32_t uiRefStride, const Pel* pOrg, uint32_t uiOrgStride, int iWidth, int iHeight); + void xBIPMVRefine(int bd, Pel *pRefL0, Pel *pRefL1, uint64_t& minCost, int16_t *deltaMV, uint64_t *pSADsArray, int width, int height); + uint64_t xDMVRCost(int bitDepth, Pel* pRef, uint32_t refStride, const Pel* pOrg, uint32_t orgStride, int width, int height); void xinitMC(PredictionUnit& pu, const ClpRngs &clpRngs); - void xProcessDMVR(PredictionUnit& pu, PelUnitBuf &pcYuvDst, const ClpRngs &clpRngs, const bool bBIOApplied ); + void xProcessDMVR(PredictionUnit& pu, PelUnitBuf &pcYuvDst, const ClpRngs &clpRngs, const bool bioApplied ); #endif #if JVET_J0090_MEMORY_BANDWITH_MEASURE diff --git a/source/Lib/CommonLib/InterpolationFilter.cpp b/source/Lib/CommonLib/InterpolationFilter.cpp index b33cd496629a813b0a267018d04fc7ee7409796e..3c16052f66e480c48286f60c4eca9fade9f73fff 100644 --- a/source/Lib/CommonLib/InterpolationFilter.cpp +++ b/source/Lib/CommonLib/InterpolationFilter.cpp @@ -219,7 +219,7 @@ InterpolationFilter::InterpolationFilter() //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// template<bool isFirst, bool isLast> #if JVET_M0147_DMVR -void InterpolationFilter::filterCopy( const ClpRng& clpRng, const Pel *src, int srcStride, Pel *dst, int dstStride, int width, int height, bool biMC10BitOut) +void InterpolationFilter::filterCopy( const ClpRng& clpRng, const Pel *src, int srcStride, Pel *dst, int dstStride, int width, int height, bool biMCForDMVR) #else void InterpolationFilter::filterCopy( const ClpRng& clpRng, const Pel *src, int srcStride, Pel *dst, int dstStride, int width, int height ) #endif @@ -249,7 +249,7 @@ void InterpolationFilter::filterCopy( const ClpRng& clpRng, const Pel *src, int const int shift = std::max<int>(2, (IF_INTERNAL_PREC - clpRng.bd)); #if JVET_M0147_DMVR - if (biMC10BitOut) + if (biMCForDMVR) { int shift10BitOut, offset; if ((clpRng.bd - IF_INTERNAL_PREC_BILINEAR) > 0) @@ -300,7 +300,7 @@ void InterpolationFilter::filterCopy( const ClpRng& clpRng, const Pel *src, int const int shift = std::max<int>(2, (IF_INTERNAL_PREC - clpRng.bd)); #if JVET_M0147_DMVR - if (biMC10BitOut) + if (biMCForDMVR) { int shift10BitOut, offset; if ((clpRng.bd - IF_INTERNAL_PREC_BILINEAR) > 0) @@ -376,7 +376,7 @@ void InterpolationFilter::filterCopy( const ClpRng& clpRng, const Pel *src, int //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// template<int N, bool isVertical, bool isFirst, bool isLast> #if JVET_M0147_DMVR -void InterpolationFilter::filter(const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, TFilterCoeff const *coeff, bool biMC10BitOut) +void InterpolationFilter::filter(const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, TFilterCoeff const *coeff, bool biMCForDMVR) #else void InterpolationFilter::filter(const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, TFilterCoeff const *coeff) #endif @@ -425,7 +425,7 @@ void InterpolationFilter::filter(const ClpRng& clpRng, Pel const *src, int srcSt } #if JVET_M0147_DMVR - if (biMC10BitOut) + if (biMCForDMVR) { shift = IF_FILTER_PREC_BILINEAR - (IF_INTERNAL_PREC_BILINEAR - clpRng.bd); offset = 1 << (shift - 1); @@ -492,7 +492,7 @@ void InterpolationFilter::filter(const ClpRng& clpRng, Pel const *src, int srcSt */ template<int N> #if JVET_M0147_DMVR -void InterpolationFilter::filterHor(const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, bool isLast, TFilterCoeff const *coeff, bool biMC10BitOut) +void InterpolationFilter::filterHor(const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, bool isLast, TFilterCoeff const *coeff, bool biMCForDMVR) #else void InterpolationFilter::filterHor(const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, bool isLast, TFilterCoeff const *coeff) #endif @@ -501,7 +501,7 @@ void InterpolationFilter::filterHor(const ClpRng& clpRng, Pel const *src, int sr if( N == 8 ) { #if JVET_M0147_DMVR - m_filterHor[0][1][isLast](clpRng, src, srcStride, dst, dstStride, width, height, coeff, biMC10BitOut); + m_filterHor[0][1][isLast](clpRng, src, srcStride, dst, dstStride, width, height, coeff, biMCForDMVR); #else m_filterHor[0][1][isLast]( clpRng, src, srcStride, dst, dstStride, width, height, coeff ); #endif @@ -509,7 +509,7 @@ void InterpolationFilter::filterHor(const ClpRng& clpRng, Pel const *src, int sr else if( N == 4 ) { #if JVET_M0147_DMVR - m_filterHor[1][1][isLast](clpRng, src, srcStride, dst, dstStride, width, height, coeff, biMC10BitOut); + m_filterHor[1][1][isLast](clpRng, src, srcStride, dst, dstStride, width, height, coeff, biMCForDMVR); #else m_filterHor[1][1][isLast]( clpRng, src, srcStride, dst, dstStride, width, height, coeff ); #endif @@ -517,7 +517,7 @@ void InterpolationFilter::filterHor(const ClpRng& clpRng, Pel const *src, int sr else if( N == 2 ) { #if JVET_M0147_DMVR - m_filterHor[2][1][isLast](clpRng, src, srcStride, dst, dstStride, width, height, coeff, biMC10BitOut); + m_filterHor[2][1][isLast](clpRng, src, srcStride, dst, dstStride, width, height, coeff, biMCForDMVR); #else m_filterHor[2][1][isLast]( clpRng, src, srcStride, dst, dstStride, width, height, coeff ); #endif @@ -545,7 +545,7 @@ void InterpolationFilter::filterHor(const ClpRng& clpRng, Pel const *src, int sr */ template<int N> #if JVET_M0147_DMVR -void InterpolationFilter::filterVer(const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, bool isFirst, bool isLast, TFilterCoeff const *coeff, bool biMC10BitOut) +void InterpolationFilter::filterVer(const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, bool isFirst, bool isLast, TFilterCoeff const *coeff, bool biMCForDMVR) #else void InterpolationFilter::filterVer(const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, bool isFirst, bool isLast, TFilterCoeff const *coeff) #endif @@ -554,7 +554,7 @@ void InterpolationFilter::filterVer(const ClpRng& clpRng, Pel const *src, int sr if( N == 8 ) { #if JVET_M0147_DMVR - m_filterVer[0][isFirst][isLast]( clpRng, src, srcStride, dst, dstStride, width, height, coeff, biMC10BitOut); + m_filterVer[0][isFirst][isLast]( clpRng, src, srcStride, dst, dstStride, width, height, coeff, biMCForDMVR); #else m_filterVer[0][isFirst][isLast]( clpRng, src, srcStride, dst, dstStride, width, height, coeff ); #endif @@ -562,7 +562,7 @@ void InterpolationFilter::filterVer(const ClpRng& clpRng, Pel const *src, int sr else if( N == 4 ) { #if JVET_M0147_DMVR - m_filterVer[1][isFirst][isLast]( clpRng, src, srcStride, dst, dstStride, width, height, coeff, biMC10BitOut); + m_filterVer[1][isFirst][isLast]( clpRng, src, srcStride, dst, dstStride, width, height, coeff, biMCForDMVR); #else m_filterVer[1][isFirst][isLast]( clpRng, src, srcStride, dst, dstStride, width, height, coeff ); #endif @@ -570,7 +570,7 @@ void InterpolationFilter::filterVer(const ClpRng& clpRng, Pel const *src, int sr else if( N == 2 ) { #if JVET_M0147_DMVR - m_filterVer[2][isFirst][isLast]( clpRng, src, srcStride, dst, dstStride, width, height, coeff, biMC10BitOut); + m_filterVer[2][isFirst][isLast]( clpRng, src, srcStride, dst, dstStride, width, height, coeff, biMCForDMVR); #else m_filterVer[2][isFirst][isLast]( clpRng, src, srcStride, dst, dstStride, width, height, coeff ); #endif @@ -600,7 +600,7 @@ void InterpolationFilter::filterVer(const ClpRng& clpRng, Pel const *src, int sr * \param bitDepth Bit depth */ #if JVET_M0147_DMVR -void InterpolationFilter::filterHor( const ComponentID compID, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, int frac, bool isLast, const ChromaFormat fmt, const ClpRng& clpRng, int nFilterIdx, bool biMC10BitOut) +void InterpolationFilter::filterHor( const ComponentID compID, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, int frac, bool isLast, const ChromaFormat fmt, const ClpRng& clpRng, int nFilterIdx, bool biMCForDMVR) #else void InterpolationFilter::filterHor( const ComponentID compID, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, int frac, bool isLast, const ChromaFormat fmt, const ClpRng& clpRng, int nFilterIdx ) #endif @@ -608,7 +608,7 @@ void InterpolationFilter::filterHor( const ComponentID compID, Pel const *src, i if( frac == 0 ) { #if JVET_M0147_DMVR - m_filterCopy[true][isLast](clpRng, src, srcStride, dst, dstStride, width, height, biMC10BitOut); + m_filterCopy[true][isLast](clpRng, src, srcStride, dst, dstStride, width, height, biMCForDMVR); #else m_filterCopy[true][isLast]( clpRng, src, srcStride, dst, dstStride, width, height ); #endif @@ -619,7 +619,7 @@ void InterpolationFilter::filterHor( const ComponentID compID, Pel const *src, i if( nFilterIdx == 1 ) { #if JVET_M0147_DMVR - filterHor<NTAPS_BILINEAR>(clpRng, src, srcStride, dst, dstStride, width, height, isLast, m_bilinearFilterPrec4[frac], biMC10BitOut); + filterHor<NTAPS_BILINEAR>(clpRng, src, srcStride, dst, dstStride, width, height, isLast, m_bilinearFilterPrec4[frac], biMCForDMVR); #else filterHor<NTAPS_BILINEAR>(clpRng, src, srcStride, dst, dstStride, width, height, isLast, m_bilinearFilter[frac]); #endif @@ -627,7 +627,7 @@ void InterpolationFilter::filterHor( const ComponentID compID, Pel const *src, i else { #if JVET_M0147_DMVR - filterHor<NTAPS_LUMA>( clpRng, src, srcStride, dst, dstStride, width, height, isLast, m_lumaFilter[frac], biMC10BitOut); + filterHor<NTAPS_LUMA>( clpRng, src, srcStride, dst, dstStride, width, height, isLast, m_lumaFilter[frac], biMCForDMVR); #else filterHor<NTAPS_LUMA>( clpRng, src, srcStride, dst, dstStride, width, height, isLast, m_lumaFilter[frac] ); #endif @@ -638,7 +638,7 @@ void InterpolationFilter::filterHor( const ComponentID compID, Pel const *src, i const uint32_t csx = getComponentScaleX( compID, fmt ); CHECK( frac < 0 || csx >= 2 || ( frac << ( 1 - csx ) ) >= CHROMA_INTERPOLATION_FILTER_SUB_SAMPLE_POSITIONS, "Invalid fraction" ); #if JVET_M0147_DMVR - filterHor<NTAPS_CHROMA>( clpRng, src, srcStride, dst, dstStride, width, height, isLast, m_chromaFilter[frac << ( 1 - csx )], biMC10BitOut); + filterHor<NTAPS_CHROMA>( clpRng, src, srcStride, dst, dstStride, width, height, isLast, m_chromaFilter[frac << ( 1 - csx )], biMCForDMVR); #else filterHor<NTAPS_CHROMA>( clpRng, src, srcStride, dst, dstStride, width, height, isLast, m_chromaFilter[frac << ( 1 - csx )] ); #endif @@ -663,7 +663,7 @@ void InterpolationFilter::filterHor( const ComponentID compID, Pel const *src, i * \param bitDepth Bit depth */ #if JVET_M0147_DMVR -void InterpolationFilter::filterVer( const ComponentID compID, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, int frac, bool isFirst, bool isLast, const ChromaFormat fmt, const ClpRng& clpRng, int nFilterIdx, bool biMC10BitOut) +void InterpolationFilter::filterVer( const ComponentID compID, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, int frac, bool isFirst, bool isLast, const ChromaFormat fmt, const ClpRng& clpRng, int nFilterIdx, bool biMCForDMVR) #else void InterpolationFilter::filterVer( const ComponentID compID, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, int frac, bool isFirst, bool isLast, const ChromaFormat fmt, const ClpRng& clpRng, int nFilterIdx) #endif @@ -671,7 +671,7 @@ void InterpolationFilter::filterVer( const ComponentID compID, Pel const *src, i if( frac == 0 ) { #if JVET_M0147_DMVR - m_filterCopy[isFirst][isLast](clpRng, src, srcStride, dst, dstStride, width, height, biMC10BitOut); + m_filterCopy[isFirst][isLast](clpRng, src, srcStride, dst, dstStride, width, height, biMCForDMVR); #else m_filterCopy[isFirst][isLast]( clpRng, src, srcStride, dst, dstStride, width, height ); #endif @@ -682,7 +682,7 @@ void InterpolationFilter::filterVer( const ComponentID compID, Pel const *src, i if (nFilterIdx == 1) { #if JVET_M0147_DMVR - filterVer<NTAPS_BILINEAR>(clpRng, src, srcStride, dst, dstStride, width, height, isFirst, isLast, m_bilinearFilterPrec4[frac], biMC10BitOut); + filterVer<NTAPS_BILINEAR>(clpRng, src, srcStride, dst, dstStride, width, height, isFirst, isLast, m_bilinearFilterPrec4[frac], biMCForDMVR); #else filterVer<NTAPS_BILINEAR>(clpRng, src, srcStride, dst, dstStride, width, height, isFirst, isLast, m_bilinearFilter[frac]); #endif @@ -690,7 +690,7 @@ void InterpolationFilter::filterVer( const ComponentID compID, Pel const *src, i else { #if JVET_M0147_DMVR - filterVer<NTAPS_LUMA>( clpRng, src, srcStride, dst, dstStride, width, height, isFirst, isLast, m_lumaFilter[frac], biMC10BitOut); + filterVer<NTAPS_LUMA>( clpRng, src, srcStride, dst, dstStride, width, height, isFirst, isLast, m_lumaFilter[frac], biMCForDMVR); #else filterVer<NTAPS_LUMA>( clpRng, src, srcStride, dst, dstStride, width, height, isFirst, isLast, m_lumaFilter[frac] ); #endif @@ -701,7 +701,7 @@ void InterpolationFilter::filterVer( const ComponentID compID, Pel const *src, i const uint32_t csy = getComponentScaleY( compID, fmt ); CHECK( frac < 0 || csy >= 2 || ( frac << ( 1 - csy ) ) >= CHROMA_INTERPOLATION_FILTER_SUB_SAMPLE_POSITIONS, "Invalid fraction" ); #if JVET_M0147_DMVR - filterVer<NTAPS_CHROMA>(clpRng, src, srcStride, dst, dstStride, width, height, isFirst, isLast, m_chromaFilter[frac << (1 - csy)], biMC10BitOut); + filterVer<NTAPS_CHROMA>(clpRng, src, srcStride, dst, dstStride, width, height, isFirst, isLast, m_chromaFilter[frac << (1 - csy)], biMCForDMVR); #else filterVer<NTAPS_CHROMA>( clpRng, src, srcStride, dst, dstStride, width, height, isFirst, isLast, m_chromaFilter[frac << ( 1 - csy )] ); #endif diff --git a/source/Lib/CommonLib/InterpolationFilter.h b/source/Lib/CommonLib/InterpolationFilter.h index f8c5a3de0275f8ac8554e470097c79679173d049..be366a5477bc1ad7a38ee3bcf092684a93f93407 100644 --- a/source/Lib/CommonLib/InterpolationFilter.h +++ b/source/Lib/CommonLib/InterpolationFilter.h @@ -66,27 +66,27 @@ class InterpolationFilter public: template<bool isFirst, bool isLast> #if JVET_M0147_DMVR - static void filterCopy( const ClpRng& clpRng, const Pel *src, int srcStride, Pel *dst, int dstStride, int width, int height, bool biMC10BitOut); + static void filterCopy( const ClpRng& clpRng, const Pel *src, int srcStride, Pel *dst, int dstStride, int width, int height, bool biMCForDMVR); #else static void filterCopy( const ClpRng& clpRng, const Pel *src, int srcStride, Pel *dst, int dstStride, int width, int height ); #endif template<int N, bool isVertical, bool isFirst, bool isLast> #if JVET_M0147_DMVR - static void filter(const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, TFilterCoeff const *coeff, bool biMC10BitOut); + static void filter(const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, TFilterCoeff const *coeff, bool biMCForDMVR); #else static void filter(const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, TFilterCoeff const *coeff); #endif template<int N> #if JVET_M0147_DMVR - void filterHor(const ClpRng& clpRng, Pel const* src, int srcStride, Pel *dst, int dstStride, int width, int height, bool isLast, TFilterCoeff const *coeff, bool biMC10BitOut); + void filterHor(const ClpRng& clpRng, Pel const* src, int srcStride, Pel *dst, int dstStride, int width, int height, bool isLast, TFilterCoeff const *coeff, bool biMCForDMVR); #else void filterHor(const ClpRng& clpRng, Pel const* src, int srcStride, Pel *dst, int dstStride, int width, int height, bool isLast, TFilterCoeff const *coeff); #endif template<int N> #if JVET_M0147_DMVR - void filterVer(const ClpRng& clpRng, Pel const* src, int srcStride, Pel *dst, int dstStride, int width, int height, bool isFirst, bool isLast, TFilterCoeff const *coeff, bool biMC10BitOut); + void filterVer(const ClpRng& clpRng, Pel const* src, int srcStride, Pel *dst, int dstStride, int width, int height, bool isFirst, bool isLast, TFilterCoeff const *coeff, bool biMCForDMVR); #else void filterVer(const ClpRng& clpRng, Pel const* src, int srcStride, Pel *dst, int dstStride, int width, int height, bool isFirst, bool isLast, TFilterCoeff const *coeff); #endif @@ -99,17 +99,17 @@ public: InterpolationFilter(); ~InterpolationFilter() {} #if JVET_M0147_DMVR - void( *m_filterHor[3][2][2] )( const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, TFilterCoeff const *coeff, bool biMC10BitOut); + void( *m_filterHor[3][2][2] )( const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, TFilterCoeff const *coeff, bool biMCForDMVR); #else void( *m_filterHor[3][2][2] )( const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, TFilterCoeff const *coeff ); #endif #if JVET_M0147_DMVR - void( *m_filterVer[3][2][2] )( const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, TFilterCoeff const *coeff, bool biMC10BitOut); + void( *m_filterVer[3][2][2] )( const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, TFilterCoeff const *coeff, bool biMCForDMVR); #else void( *m_filterVer[3][2][2] )( const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, TFilterCoeff const *coeff ); #endif #if JVET_M0147_DMVR - void( *m_filterCopy[2][2] ) ( const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, bool biMC10BitOut); + void( *m_filterCopy[2][2] ) ( const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, bool biMCForDMVR); #else void( *m_filterCopy[2][2] ) ( const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height ); #endif @@ -121,12 +121,12 @@ public: void _initInterpolationFilterX86(); #endif #if JVET_M0147_DMVR - void filterHor(const ComponentID compID, Pel const* src, int srcStride, Pel *dst, int dstStride, int width, int height, int frac, bool isLast, const ChromaFormat fmt, const ClpRng& clpRng, int nFilterIdx = 0, bool biMC10BitOut = false); + void filterHor(const ComponentID compID, Pel const* src, int srcStride, Pel *dst, int dstStride, int width, int height, int frac, bool isLast, const ChromaFormat fmt, const ClpRng& clpRng, int nFilterIdx = 0, bool biMCForDMVR = false); #else void filterHor(const ComponentID compID, Pel const* src, int srcStride, Pel *dst, int dstStride, int width, int height, int frac, bool isLast, const ChromaFormat fmt, const ClpRng& clpRng, int nFilterIdx = 0); #endif #if JVET_M0147_DMVR - void filterVer(const ComponentID compID, Pel const* src, int srcStride, Pel *dst, int dstStride, int width, int height, int frac, bool isFirst, bool isLast, const ChromaFormat fmt, const ClpRng& clpRng, int nFilterIdx = 0, bool biMC10BitOut = false); + void filterVer(const ComponentID compID, Pel const* src, int srcStride, Pel *dst, int dstStride, int width, int height, int frac, bool isFirst, bool isLast, const ChromaFormat fmt, const ClpRng& clpRng, int nFilterIdx = 0, bool biMCForDMVR = false); #else void filterVer(const ComponentID compID, Pel const* src, int srcStride, Pel *dst, int dstStride, int width, int height, int frac, bool isFirst, bool isLast, const ChromaFormat fmt, const ClpRng& clpRng, int nFilterIdx = 0); #endif diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index c371599d01a9cf0b45b000114bd543e797433287..bb5c1adbe70f4624765ad8946638b9cf21035741 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -1810,9 +1810,6 @@ SPSNext::SPSNext( SPS& sps ) , m_MTTEnabled ( false ) , m_MHIntra ( false ) , m_Triangle ( false ) -#if JVET_M0147_DMVR - , m_DMVR ( false ) -#endif #if ENABLE_WPP_PARALLELISM , m_NextDQP ( false ) #endif @@ -1855,6 +1852,9 @@ SPS::SPS() #if JVET_M0246_AFFINE_AMVR , m_affineAmvrEnabledFlag ( false ) #endif +#if JVET_M0147_DMVR +, m_DMVR ( false ) +#endif #if HEVC_VPS , m_VPSId ( 0) #endif diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index 2b84f963887f8730714a9a9e63ccef6cedddbb30..b4ab4227da91904131bca169551c933b8428997e 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -855,9 +855,6 @@ private: bool m_MTTEnabled; // bool m_MHIntra; bool m_Triangle; -#if JVET_M0147_DMVR - bool m_DMVR; -#endif #if ENABLE_WPP_PARALLELISM bool m_NextDQP; #endif @@ -899,10 +896,6 @@ public: bool getUseAffine () const { return m_Affine; } void setUseAffineType ( bool b ) { m_AffineType = b; } bool getUseAffineType () const { return m_AffineType; } -#if JVET_M0147_DMVR - void setUseDMVR(bool b) { m_DMVR = b; } - bool getUseDMVR() const { return m_DMVR; } -#endif void setDisableMotCompress ( bool b ) { m_DisableMotionCompression = b; } bool getDisableMotCompress () const { return m_DisableMotionCompression; } bool getMTTEnabled () const { return m_MTTEnabled; } @@ -996,6 +989,9 @@ private: #if JVET_M0246_AFFINE_AMVR bool m_affineAmvrEnabledFlag; #endif +#if JVET_M0147_DMVR + bool m_DMVR; +#endif #if HEVC_VPS int m_VPSId; #endif @@ -1255,7 +1251,10 @@ public: bool getDisFracMmvdEnabledFlag() const { return m_disFracMmvdEnabledFlag; } void setDisFracMmvdEnabledFlag( bool b ) { m_disFracMmvdEnabledFlag = b; } #endif - +#if JVET_M0147_DMVR + bool getUseDMVR()const { return m_DMVR; } + void setUseDMVR(bool b) { m_DMVR = b; } +#endif uint32_t getMaxTLayers() const { return m_uiMaxTLayers; } void setMaxTLayers( uint32_t uiMaxTLayers ) { CHECK( uiMaxTLayers > MAX_TLAYER, "Invalid number T-layers" ); m_uiMaxTLayers = uiMaxTLayers; } diff --git a/source/Lib/CommonLib/UnitTools.cpp b/source/Lib/CommonLib/UnitTools.cpp index 0f2c1f3220dc3992c76be87dd4e4ee5698c1dc05..91f2d3a4ec6a17ce2b3dcc2b1bc33a8fb6207cc8 100644 --- a/source/Lib/CommonLib/UnitTools.cpp +++ b/source/Lib/CommonLib/UnitTools.cpp @@ -1461,7 +1461,7 @@ void PU::getInterMergeCandidates( const PredictionUnit &pu, MergeCtx& mrgCtx, #if JVET_M0147_DMVR bool PU::checkDMVRCondition(const PredictionUnit& pu) { - if (pu.cs->sps->getSpsNext().getUseDMVR()) + if (pu.cs->sps->getUseDMVR()) { return pu.mergeFlag && pu.mergeType == MRG_TYPE_DEFAULT_N @@ -3878,12 +3878,12 @@ bool PU::isBiPredFromDifferentDirEqDistPoc(const PredictionUnit& pu) { if (pu.refIdx[0] >= 0 && pu.refIdx[1] >= 0) { - const int iPOC0 = pu.cu->slice->getRefPOC(REF_PIC_LIST_0, pu.refIdx[0]); - const int iPOC1 = pu.cu->slice->getRefPOC(REF_PIC_LIST_1, pu.refIdx[1]); - const int iPOC = pu.cu->slice->getPOC(); - if ((iPOC - iPOC0)*(iPOC - iPOC1) < 0) + const int poc0 = pu.cu->slice->getRefPOC(REF_PIC_LIST_0, pu.refIdx[0]); + const int poc1 = pu.cu->slice->getRefPOC(REF_PIC_LIST_1, pu.refIdx[1]); + const int poc = pu.cu->slice->getPOC(); + if ((poc - poc0)*(poc - poc1) < 0) { - if (abs(iPOC - iPOC0) == abs(iPOC - iPOC1)) + if (abs(poc - poc0) == abs(poc - poc1)) { return true; } diff --git a/source/Lib/CommonLib/x86/InterpolationFilterX86.h b/source/Lib/CommonLib/x86/InterpolationFilterX86.h index 9218115c815f238c2fe4077bd0552a5ee4bbbbbb..e31a8b61b8c7e9d95d6d118e56eb25b44ca0d90b 100644 --- a/source/Lib/CommonLib/x86/InterpolationFilterX86.h +++ b/source/Lib/CommonLib/x86/InterpolationFilterX86.h @@ -194,7 +194,7 @@ static void fullPelCopyAVX2( const ClpRng& clpRng, const void*_src, int srcStrid template<X86_VEXT vext, bool isFirst, bool isLast> #if JVET_M0147_DMVR -static void simdFilterCopy( const ClpRng& clpRng, const Pel* src, int srcStride, int16_t* dst, int dstStride, int width, int height, bool biMC10BitOut) +static void simdFilterCopy( const ClpRng& clpRng, const Pel* src, int srcStride, int16_t* dst, int dstStride, int width, int height, bool biMCForDMVR) #else static void simdFilterCopy( const ClpRng& clpRng, const Pel* src, int srcStride, int16_t* dst, int dstStride, int width, int height ) #endif @@ -216,7 +216,7 @@ static void simdFilterCopy( const ClpRng& clpRng, const Pel* src, int srcStride, #endif { //Scalar #if JVET_M0147_DMVR - InterpolationFilter::filterCopy<isFirst, isLast>( clpRng, src, srcStride, dst, dstStride, width, height, biMC10BitOut); + InterpolationFilter::filterCopy<isFirst, isLast>( clpRng, src, srcStride, dst, dstStride, width, height, biMCForDMVR); #else InterpolationFilter::filterCopy<isFirst, isLast>( clpRng, src, srcStride, dst, dstStride, width, height ); #endif @@ -1031,17 +1031,6 @@ static inline __m128i simdInterpolateLuma10Bit2P4(int16_t const *src, int srcStr sumLo = _mm_srai_epi16(_mm_add_epi16(sumLo, mmOffset), shift); return sumLo; } -// intermediate are not expected to cross 16 bit -#if USE_AVX2 -static inline __m256i simdClip3_256(__m256i mmMin, __m256i mmMax, __m256i mmPix) -{ - __m256i mmMask = _mm256_cmpgt_epi16(mmPix, mmMin); - mmPix = _mm256_or_si256(_mm256_and_si256(mmMask, mmPix), _mm256_andnot_si256(mmMask, mmMin)); - mmMask = _mm256_cmpgt_epi16(mmMax, mmPix); - mmPix = _mm256_or_si256(_mm256_and_si256(mmMask, mmPix), _mm256_andnot_si256(mmMask, mmMax)); - return(mmPix); -} -#endif template<X86_VEXT vext, bool isLast> static void simdInterpolateN2_10BIT_M4(const int16_t* src, int srcStride, int16_t *dst, int dstStride, int cStride, int width, int height, int shift, int offset, const ClpRng& clpRng, int16_t const *c) @@ -1049,16 +1038,14 @@ static void simdInterpolateN2_10BIT_M4(const int16_t* src, int srcStride, int16_ int row, col; __m128i mmOffset = _mm_set1_epi16(offset); __m128i mmCoeff[2]; - __m128i mmMin = _mm_set1_epi16(clpRng.min); - __m128i mmMax = _mm_set1_epi16(clpRng.max); for (int n = 0; n < 2; n++) mmCoeff[n] = _mm_set1_epi16(c[n]); + CHECK(isLast, "Not Supported"); + #if USE_AVX2 __m256i mm256Offset = _mm256_set1_epi16(offset); __m256i mm256Coeff[2]; - __m256i mm256Min = _mm256_set1_epi16(clpRng.min); - __m256i mm256Max = _mm256_set1_epi16(clpRng.max); for (int n = 0; n < 2; n++) mm256Coeff[n] = _mm256_set1_epi16(c[n]); #endif @@ -1070,10 +1057,6 @@ static void simdInterpolateN2_10BIT_M4(const int16_t* src, int srcStride, int16_ for (; col < ((width >> 4) << 4); col += 16) { __m256i mmFiltered = simdInterpolateLuma10Bit2P16(src + col, cStride, mm256Coeff, mm256Offset, shift); - if (isLast) - { - mmFiltered = simdClip3_256(mm256Min, mm256Max, mmFiltered); - } _mm256_storeu_si256((__m256i *)(dst + col), mmFiltered); } #endif @@ -1081,19 +1064,11 @@ static void simdInterpolateN2_10BIT_M4(const int16_t* src, int srcStride, int16_ for (; col < ((width >> 3) << 3); col += 8) { __m128i mmFiltered = simdInterpolateLuma10Bit2P8(src + col, cStride, mmCoeff, mmOffset, shift); - if (isLast) - { - mmFiltered = simdClip3(mmMin, mmMax, mmFiltered); - } _mm_storeu_si128((__m128i *)(dst + col), mmFiltered); } // last 4 samples __m128i mmFiltered = simdInterpolateLuma10Bit2P4(src + col, cStride, mmCoeff, mmOffset, shift); - if (isLast) - { - mmFiltered = simdClip3(mmMin, mmMax, mmFiltered); - } _mm_storel_epi64((__m128i *)(dst + col), mmFiltered); src += srcStride; dst += dstStride; @@ -1103,7 +1078,7 @@ static void simdInterpolateN2_10BIT_M4(const int16_t* src, int srcStride, int16_ template<X86_VEXT vext, int N, bool isVertical, bool isFirst, bool isLast> #if JVET_M0147_DMVR -static void simdFilter( const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, TFilterCoeff const *coeff, bool biMC10BitOut) +static void simdFilter( const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, TFilterCoeff const *coeff, bool biMCForDMVR) #else static void simdFilter( const ClpRng& clpRng, Pel const *src, int srcStride, Pel *dst, int dstStride, int width, int height, TFilterCoeff const *coeff ) #endif @@ -1153,7 +1128,7 @@ static void simdFilter( const ClpRng& clpRng, Pel const *src, int srcStride, Pel } #if JVET_M0147_DMVR - if (biMC10BitOut) + if (biMCForDMVR) { shift = IF_FILTER_PREC_BILINEAR - (IF_INTERNAL_PREC_BILINEAR - clpRng.bd); offset = 1 << (shift - 1); @@ -1208,7 +1183,7 @@ static void simdFilter( const ClpRng& clpRng, Pel const *src, int srcStride, Pel return; } #if JVET_M0147_DMVR - else if (biMC10BitOut) + else if (biMCForDMVR) { if (N == 2 && !(width & 0x03)) { diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 0ed70a77d2e5161f3ab4d2c332c31a3dcc338db9..da6544a9fea0c271e6a2a38d6f965f786db15417 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -829,9 +829,6 @@ void HLSyntaxReader::parseSPSNext( SPSNext& spsNext, const bool usePCM ) READ_FLAG( symbol, "mtt_enabled_flag" ); spsNext.setMTTMode ( symbol ); READ_FLAG( symbol, "mhintra_flag" ); spsNext.setUseMHIntra ( symbol != 0 ); READ_FLAG( symbol, "triangle_flag" ); spsNext.setUseTriangle ( symbol != 0 ); -#if JVET_M0147_DMVR - READ_FLAG(symbol, "dmvr_enable_flag"); spsNext.setUseDMVR (symbol != 0); -#endif #if ENABLE_WPP_PARALLELISM READ_FLAG( symbol, "next_dqp_enabled_flag" ); spsNext.setUseNextDQP ( symbol != 0 ); #else @@ -1104,6 +1101,9 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) #if JVET_M0246_AFFINE_AMVR READ_FLAG( uiCode, "sps_affine_amvr_enabled_flag" ); pcSPS->setAffineAmvrEnabledFlag ( uiCode != 0 ); #endif +#if JVET_M0147_DMVR + READ_FLAG(uiCode, "dmvr_enable_flag"); pcSPS->setUseDMVR(uiCode != 0); +#endif #if HEVC_USE_SCALING_LISTS READ_FLAG( uiCode, "scaling_list_enabled_flag" ); pcSPS->setScalingListFlag ( uiCode ); if(pcSPS->getScalingListFlag()) diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index 0a8d44941516caa69e72c720008494fef59add51..e95ddacebf33ff27036d77646f1f08ec5ff5520f 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -932,7 +932,7 @@ void EncLib::xInitSPS(SPS &sps) sps.setAffineAmvrEnabledFlag ( m_AffineAmvr ); #endif #if JVET_M0147_DMVR - sps.getSpsNext().setUseDMVR ( m_DMVR ); + sps.setUseDMVR ( m_DMVR ); #endif sps.getSpsNext().setIBCMode ( m_IBCMode ); diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 5c4dd6896b3196cec7d6469995f5989cabae4228..743c3b4e7ff6e27d1fb5457507ea6cba78311a32 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -570,9 +570,6 @@ void HLSWriter::codeSPSNext( const SPSNext& spsNext, const bool usePCM ) WRITE_FLAG( spsNext.getMTTEnabled() ? 1 : 0, "mtt_enabled_flag" ); WRITE_FLAG( spsNext.getUseMHIntra() ? 1 : 0, "mhintra_flag" ); WRITE_FLAG( spsNext.getUseTriangle() ? 1: 0, "triangle_flag" ); -#if JVET_M0147_DMVR - WRITE_FLAG(spsNext.getUseDMVR() ? 1 : 0, "dmvr_enable_flag"); -#endif #if ENABLE_WPP_PARALLELISM WRITE_FLAG( spsNext.getUseNextDQP(), "next_dqp_enabled_flag" ); #else @@ -774,6 +771,9 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) #if JVET_M0246_AFFINE_AMVR WRITE_FLAG( pcSPS->getAffineAmvrEnabledFlag() ? 1 : 0, "sps_affine_amvr_enabled_flag" ); #endif +#if JVET_M0147_DMVR + WRITE_FLAG( pcSPS->getUseDMVR() ? 1 : 0, "dmvr_enable_flag" ); +#endif #if HEVC_USE_SCALING_LISTS WRITE_FLAG( pcSPS->getScalingListFlag() ? 1 : 0, "scaling_list_enabled_flag" ); if(pcSPS->getScalingListFlag())