[x265] [PATCH] motion: Modify "--refine-mv" option

Pooja Venkatesan pooja at multicorewareinc.com
Wed Sep 4 09:30:26 CEST 2019


Sure.

On Wed, Sep 4, 2019 at 12:52 PM Aruna Matheswaran <
aruna at multicorewareinc.com> wrote:

> 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 <pooja at multicorewareinc.com> 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
>> x265-devel at videolan.org
>> https://mailman.videolan.org/listinfo/x265-devel
>>
>
>
> --
> Regards,
> Aruna
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20190904/8cf7d5d8/attachment-0001.html>


More information about the x265-devel mailing list