The patch is not applying on default. Could you please rebase it on the latest default tip and resend the patch?
On Fri, Aug 23, 2019 at 12:40 PM <[email protected]> wrote: > # HG changeset patch > # User Pooja Venkatesan > # Date 1566540185 -19800 > # Fri Aug 23 11:33:05 2019 +0530 > # Node ID ff2a24a84069327711f08d8ea026bf7383013f21 > # Parent de920e0a31831f52599f3937c3ee6945e88ed851 > motion: Modify "--refine-mv" option > > Add MV refinement level 1,2 and 3. > Based on the MV refinement level, number of search increases. > > diff -r de920e0a3183 -r ff2a24a84069 doc/reST/cli.rst > --- a/doc/reST/cli.rst Tue Jul 23 17:03:51 2019 +0530 > +++ b/doc/reST/cli.rst Fri Aug 23 11:33:05 2019 +0530 > @@ -997,11 +997,14 @@ > the encoder settings. It is recommended to use > :option:`--refine-intra` 4 with dynamic > refinement. Default disabled. > > -.. option:: --refine-mv > - > +.. option:: --refine-mv <0..3> > + > Enables refinement of motion vector for scaled video. Evaluates > the best > - motion vector by searching the surrounding eight integer and > subpel pixel > - positions. > + motion vector based on the level selected. Default 0 - disabled. > + > + Level 1 - Search around scaled MV. > + Level 2 - Level 1 + Search around best AMVP cand. > + Level 3 - Level 2 + Search around the other AMVP cand. > > Options which affect the transform unit quad-tree, sometimes referred to > as the residual quad-tree (RQT). > diff -r de920e0a3183 -r ff2a24a84069 source/common/param.cpp > --- a/source/common/param.cpp Tue Jul 23 17:03:51 2019 +0530 > +++ b/source/common/param.cpp Fri Aug 23 11:33:05 2019 +0530 > @@ -1209,7 +1209,7 @@ > OPT("scale-factor") p->scaleFactor = atoi(value); > OPT("refine-intra")p->intraRefine = atoi(value); > OPT("refine-inter")p->interRefine = atoi(value); > - OPT("refine-mv")p->mvRefine = atobool(value); > + OPT("refine-mv")p->mvRefine = atoi(value); > OPT("force-flush")p->forceFlush = atoi(value); > OPT("splitrd-skip") p->bEnableSplitRdSkip = atobool(value); > OPT("lowpass-dct") p->bLowPassDct = atobool(value); > @@ -1650,6 +1650,8 @@ > "Strict-cbr cannot be applied without specifying target bitrate > or vbv bufsize"); > CHECK((param->analysisSave || param->analysisLoad) && > (param->analysisReuseLevel < 1 || param->analysisReuseLevel > 10), > "Invalid analysis refine level. Value must be between 1 and 10 > (inclusive)"); > + CHECK(param->analysisLoad && (param->mvRefine < 0 || param->mvRefine > > 3), > + "Invalid mv refinement level. Value must be between 0 and 3 > (inclusive)"); > CHECK(param->scaleFactor > 2, "Invalid scale-factor. Supports factor > <= 2"); > CHECK(param->rc.qpMax < QP_MIN || param->rc.qpMax > QP_MAX_MAX, > "qpmax exceeds supported range (0 to 69)"); > diff -r de920e0a3183 -r ff2a24a84069 source/encoder/analysis.cpp > --- a/source/encoder/analysis.cpp Tue Jul 23 17:03:51 2019 +0530 > +++ b/source/encoder/analysis.cpp Fri Aug 23 11:33:05 2019 +0530 > @@ -2488,14 +2488,18 @@ > MV mvp; > > int numMvc = > mode.cu.getPMV(mode.interNeighbours, list, ref, mode.amvpCand[list][ref], > mvc); > - if (m_param->interRefine != 1) > - mvp = > mode.amvpCand[list][ref][mode.cu.m_mvpIdx[list][pu.puAbsPartIdx]]; > - else > - mvp = interDataCTU->mv[list][cuIdx + > part].word; > + mvp = > mode.amvpCand[list][ref][mode.cu.m_mvpIdx[list][pu.puAbsPartIdx]]; > if (m_param->mvRefine || m_param->interRefine > == 1) > { > - MV outmv; > - searchMV(mode, pu, list, ref, outmv, mvp, > numMvc, mvc); > + MV outmv, mvpSelect[3]; > + mvpSelect[0] = > interDataCTU->mv[list][cuIdx + part].word; > + switch (m_param->mvRefine) > + { > + case 3: mvpSelect[2] = > mode.amvpCand[list][ref][!(mode.cu.m_mvpIdx[list][pu.puAbsPartIdx])]; > + case 2: mvpSelect[1] = mvp; > + default: break; > + } > + searchMV(mode, list, ref, outmv, > mvpSelect, numMvc, mvc); > mode.cu.setPUMv(list, outmv, > pu.puAbsPartIdx, part); > } > mode.cu.m_mvd[list][pu.puAbsPartIdx] = > mode.cu.m_mv[list][pu.puAbsPartIdx] - > mode.amvpCand[list][ref][mode.cu.m_mvpIdx[list][pu.puAbsPartIdx]]/*mvp*/; > diff -r de920e0a3183 -r ff2a24a84069 source/encoder/encoder.cpp > --- a/source/encoder/encoder.cpp Tue Jul 23 17:03:51 2019 +0530 > +++ b/source/encoder/encoder.cpp Fri Aug 23 11:33:05 2019 +0530 > @@ -2983,11 +2983,11 @@ > x265_log(p, X265_LOG_WARNING, "MV refinement requires > analysis load, analysis-reuse-level 10. Disabling MV refine.\n"); > p->mvRefine = 0; > } > - else if (p->interRefine >= 2) > - { > - x265_log(p, X265_LOG_WARNING, "MVs are recomputed when > refine-inter >= 2. MV refinement not applicable. Disabling MV refine\n"); > - p->mvRefine = 0; > - } > + } > + if (p->scaleFactor && p->analysisLoad && p->interRefine && > p->analysisReuseLevel == 10 && !p->mvRefine) > + { > + x265_log(p, X265_LOG_WARNING, "Enabling MV refinement level 1 > with scaling and analysis-reuse-level=10.\n"); > + p->mvRefine = 1; > } > > if (p->ctuDistortionRefine == CTU_DISTORTION_INTERNAL) > diff -r de920e0a3183 -r ff2a24a84069 source/encoder/search.cpp > --- a/source/encoder/search.cpp Tue Jul 23 17:03:51 2019 +0530 > +++ b/source/encoder/search.cpp Fri Aug 23 11:33:05 2019 +0530 > @@ -2152,23 +2152,27 @@ > bestME[list].mvCost = mvCost; > } > } > -void Search::searchMV(Mode& interMode, const PredictionUnit& pu, int > list, int ref, MV& outmv, MV mvp, int numMvc, MV* mvc) > +void Search::searchMV(Mode& interMode, int list, int ref, MV& outmv, MV > mvp[3], int numMvc, MV* mvc) > { > CUData& cu = interMode.cu; > - const Slice *slice = m_slice; > - MV mv; > - if (m_param->interRefine == 1) > - mv = mvp; > - else > - mv = cu.m_mv[list][pu.puAbsPartIdx]; > + MV mv, mvmin, mvmax; > cu.clipMv(mv); > - MV mvmin, mvmax; > - setSearchRange(cu, mv, m_param->searchRange, mvmin, mvmax); > - if (m_param->interRefine == 1) > - m_me.motionEstimate(&m_slice->m_mref[list][ref], mvmin, mvmax, > mv, numMvc, mvc, m_param->searchRange, outmv, m_param->maxSlices, > + int cand = 0, bestcost = INT_MAX; > + do > + { > + if (cand && (mvp[cand] == mvp[cand - 1] || (cand == 2 && > mvp[cand] == mvp[cand - 2]))) > + continue; > + MV bestMV; > + mv = mvp[cand]; > + setSearchRange(cu, mv, m_param->searchRange, mvmin, mvmax); > + int cost = m_me.motionEstimate(&m_slice->m_mref[list][ref], > mvmin, mvmax, mv, numMvc, mvc, m_param->searchRange, bestMV, > m_param->maxSlices, > m_param->bSourceReferenceEstimation ? > m_slice->m_refFrameList[list][ref]->m_fencPic->getLumaAddr(0) : 0); > - else > - m_me.refineMV(&slice->m_mref[list][ref], mvmin, mvmax, mv, outmv); > + if (bestcost > cost) > + { > + bestcost = cost; > + outmv = bestMV; > + } > + }while (++cand < m_param->mvRefine); > } > /* find the best inter prediction for each PU of specified mode */ > void Search::predInterSearch(Mode& interMode, const CUGeom& cuGeom, bool > bChromaMC, uint32_t refMasks[2]) > @@ -2229,7 +2233,6 @@ > int ref = -1; > if (useAsMVP) > ref = interDataCTU->refIdx[list][cuIdx + puIdx]; > - > else > ref = bestME[list].ref; > if (ref < 0) > @@ -2243,7 +2246,7 @@ > const MV* amvp = interMode.amvpCand[list][ref]; > int mvpIdx = selectMVP(cu, pu, amvp, list, ref); > MV mvmin, mvmax, outmv, mvp; > - if (useAsMVP) > + if (useAsMVP && !m_param->mvRefine) > { > mvp = interDataCTU->mv[list][cuIdx + puIdx].word; > mvpIdx = interDataCTU->mvpIdx[list][cuIdx + puIdx]; > @@ -2259,11 +2262,44 @@ > } > setSearchRange(cu, mvp, m_param->searchRange, mvmin, > mvmax); > MV mvpIn = mvp; > + int satdCost; > if (m_param->analysisMultiPassRefine && > m_param->rc.bStatRead && mvpIdx == bestME[list].mvpIdx) > mvpIn = bestME[list].mv; > - > - int satdCost = > m_me.motionEstimate(&slice->m_mref[list][ref], mvmin, mvmax, mvpIn, numMvc, > mvc, m_param->searchRange, outmv, m_param->maxSlices, > - m_param->bSourceReferenceEstimation ? > m_slice->m_refFrameList[list][ref]->m_fencPic->getLumaAddr(0) : 0); > + if (useAsMVP && m_param->mvRefine) > + { > + MV bestmv, mvpSel[3]; > + int mvpIdxSel[3]; > + satdCost = m_me.COST_MAX; > + switch (m_param->mvRefine) > + { > + case 3: mvpSel[2] = > interMode.amvpCand[list][ref][!mvpIdx]; > + mvpIdxSel[2] = !mvpIdx; > + case 2: mvpSel[1] = > interMode.amvpCand[list][ref][mvpIdx]; > + mvpIdxSel[1] = mvpIdx; > + case 1: mvpSel[0] = interDataCTU->mv[list][cuIdx + > puIdx].word; > + mvpIdxSel[0] = > interDataCTU->mvpIdx[list][cuIdx + puIdx]; > + } > + for (int cand = 0; cand < m_param->mvRefine; cand++) > + { > + if (cand && (mvpSel[cand] == mvpSel[cand - 1] || > (cand == 2 && mvpSel[cand] == mvpSel[cand - 2]))) > + continue; > + setSearchRange(cu, mvp, m_param->searchRange, > mvmin, mvmax); > + int bcost = > m_me.motionEstimate(&m_slice->m_mref[list][ref], mvmin, mvmax, > mvpSel[cand], numMvc, mvc, m_param->searchRange, bestmv, m_param->maxSlices, > + m_param->bSourceReferenceEstimation ? > m_slice->m_refFrameList[list][ref]->m_fencPic->getLumaAddr(0) : 0); > + if (satdCost > bcost) > + { > + satdCost = bcost; > + outmv = bestmv; > + mvp = mvpSel[cand]; > + mvpIdx = mvpIdxSel[cand]; > + } > + } > + } > + else > + { > + satdCost = > m_me.motionEstimate(&slice->m_mref[list][ref], mvmin, mvmax, mvpIn, numMvc, > mvc, m_param->searchRange, outmv, m_param->maxSlices, > + m_param->bSourceReferenceEstimation ? > m_slice->m_refFrameList[list][ref]->m_fencPic->getLumaAddr(0) : 0); > + } > > /* Get total cost of partition, but only include MV bit > cost once */ > bits += m_me.bitcost(outmv); > diff -r de920e0a3183 -r ff2a24a84069 source/encoder/search.h > --- a/source/encoder/search.h Tue Jul 23 17:03:51 2019 +0530 > +++ b/source/encoder/search.h Fri Aug 23 11:33:05 2019 +0530 > @@ -310,7 +310,7 @@ > > // estimation inter prediction (non-skip) > void predInterSearch(Mode& interMode, const CUGeom& cuGeom, bool > bChromaMC, uint32_t masks[2]); > - void searchMV(Mode& interMode, const PredictionUnit& pu, int > list, int ref, MV& outmv, MV mvp, int numMvc, MV* mvc); > + void searchMV(Mode& interMode, int list, int ref, MV& outmv, MV > mvp[3], int numMvc, MV* mvc); > // encode residual and compute rd-cost for inter mode > void encodeResAndCalcRdInterCU(Mode& interMode, const CUGeom& > cuGeom); > void encodeResAndCalcRdSkipCU(Mode& interMode); > diff -r de920e0a3183 -r ff2a24a84069 source/x265cli.h > --- a/source/x265cli.h Tue Jul 23 17:03:51 2019 +0530 > +++ b/source/x265cli.h Fri Aug 23 11:33:05 2019 +0530 > @@ -297,8 +297,7 @@ > { "dhdr10-opt", no_argument, NULL, 0}, > { "no-dhdr10-opt", no_argument, NULL, 0}, > { "dolby-vision-profile", required_argument, NULL, 0 }, > - { "refine-mv", no_argument, NULL, 0 }, > - { "no-refine-mv", no_argument, NULL, 0 }, > + { "refine-mv", required_argument, NULL, 0 }, > { "refine-ctu-distortion", required_argument, NULL, 0 }, > { "force-flush", required_argument, NULL, 0 }, > { "splitrd-skip", no_argument, NULL, 0 }, > @@ -549,7 +548,7 @@ > " - 3 : Functionality of (1) + > irrespective of size evaluate all inter modes.\n" > " Default:%d\n", > param->interRefine); > H0(" --[no-]dynamic-refine Dynamically changes refine-inter > level for each CU. Default %s\n", OPT(param->bDynamicRefine)); > - H0(" --[no-]refine-mv Enable mv refinement for load > mode. Default %s\n", OPT(param->mvRefine)); > + H0(" --refine-mv <0..3> Enable mv refinement for load > mode. Default %d\n", param->mvRefine); > H0(" --refine-ctu-distortion Store/normalize ctu distortion > in analysis-save/load.\n" > " - 0 : Disabled.\n" > " - 1 : Store/Load ctu > distortion to/from the file specified in analysis-save/load.\n" > _______________________________________________ > x265-devel mailing list > [email protected] > https://mailman.videolan.org/listinfo/x265-devel > -- Regards, Aruna
_______________________________________________ x265-devel mailing list [email protected] https://mailman.videolan.org/listinfo/x265-devel
