[x265] [PATCH] use MV from analysis-save encode as MVP in load mode for refine-inter levels

Ashok Kumar Mishra ashok at multicorewareinc.com
Mon Mar 5 11:00:04 CET 2018


On Mon, Mar 5, 2018 at 3:27 PM, <bhavna at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Santhoshini Sekar <santhoshini at multicorewareinc.com>
> # Date 1516860441 -19800
> #      Thu Jan 25 11:37:21 2018 +0530
> # Node ID a12d4abf477016158397064730afa160a067c3e9
> # Parent  55eb3992299530de882829de0d3c0fea6d58b70d
> use MV from analysis-save encode as MVP in load mode for refine-inter
> levels
>
> diff -r 55eb39922995 -r a12d4abf4770 source/encoder/analysis.cpp
> --- a/source/encoder/analysis.cpp       Wed Feb 28 11:09:18 2018 +0530
> +++ b/source/encoder/analysis.cpp       Thu Jan 25 11:37:21 2018 +0530
> @@ -2455,7 +2455,7 @@
>                      }
>                      if (!mode.cu.m_mergeFlag[pu.puAbsPartIdx])
>                      {
> -                        if (m_param->mvRefine)
> +                        if (m_param->mvRefine || m_param->interRefine ==
> 1)
>                              m_me.setSourcePU(*mode.fencYuv, pu.ctuAddr,
> pu.cuAbsPartIdx, pu.puAbsPartIdx, pu.width, pu.height,
> m_param->searchMethod, m_param->subpelRefine, false);
>                          //AMVP
>                          MV mvc[(MD_ABOVE_LEFT + 1) * 2 + 2];
> @@ -2465,15 +2465,20 @@
>                              int ref = mode.cu.m_refIdx[list][pu.
> puAbsPartIdx];
>                              if (ref == -1)
>                                  continue;
> -                            mode.cu.getPMV(mode.interNeighbours, list,
> ref, mode.amvpCand[list][ref], mvc);
> -                            MV mvp = mode.amvpCand[list][ref][mode.
> cu.m_mvpIdx[list][pu.puAbsPartIdx]];
> -                            if (m_param->mvRefine)
> +                            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];
> +                            if (m_param->mvRefine || m_param->interRefine
> == 1)
>                              {
>                                  MV outmv;
> -                                searchMV(mode, pu, list, ref, outmv);
> +                                searchMV(mode, pu, list, ref, outmv, mvp,
> numMvc, mvc);
>                                  mode.cu.setPUMv(list, outmv,
> pu.puAbsPartIdx, part);
>                              }
> -                            mode.cu.m_mvd[list][pu.puAbsPartIdx] =
> mode.cu.m_mv[list][pu.puAbsPartIdx] - mvp;
> +                            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*/;
>                          }
>                      }
>                      else if(m_param->scaleFactor)
> diff -r 55eb39922995 -r a12d4abf4770 source/encoder/encoder.cpp
> --- a/source/encoder/encoder.cpp        Wed Feb 28 11:09:18 2018 +0530
> +++ b/source/encoder/encoder.cpp        Thu Jan 25 11:37:21 2018 +0530
> @@ -3096,9 +3096,8 @@
>          if (m_param->analysisReuseLevel > 4)
>          {
>              CHECKED_MALLOC(interData->partSize, uint8_t,
> analysis->numPartitions * analysis->numCUsInFrame);
> -            CHECKED_MALLOC(interData->mergeFlag, uint8_t,
> analysis->numPartitions * analysis->numCUsInFrame);
> +            CHECKED_MALLOC_ZERO(interData->mergeFlag, uint8_t,
> analysis->numPartitions * analysis->numCUsInFrame);
>          }
> -
>          if (m_param->analysisReuseLevel >= 7)
>          {
>              CHECKED_MALLOC(interData->interDir, uint8_t,
> analysis->numPartitions * analysis->numCUsInFrame);
> diff -r 55eb39922995 -r a12d4abf4770 source/encoder/search.cpp
> --- a/source/encoder/search.cpp Wed Feb 28 11:09:18 2018 +0530
> +++ b/source/encoder/search.cpp Thu Jan 25 11:37:21 2018 +0530
> @@ -2107,18 +2107,24 @@
>          bestME[list].mvCost  = mvCost;
>      }
>  }
> -
> -void Search::searchMV(Mode& interMode, const PredictionUnit& pu, int
> list, int ref, MV& outmv)
> +void Search::searchMV(Mode& interMode, const PredictionUnit& pu, int
> list, int ref, MV& outmv, MV mvp, int numMvc, MV* mvc)
>  {
>      CUData& cu = interMode.cu;
>      const Slice *slice = m_slice;
> -    MV mv = cu.m_mv[list][pu.puAbsPartIdx];
> +    MV mv;
> +    if (m_param->interRefine == 1)
> +        mv = mvp;
> +    else
> +        mv = cu.m_mv[list][pu.puAbsPartIdx];
>      cu.clipMv(mv);
>      MV mvmin, mvmax;
>      setSearchRange(cu, mv, m_param->searchRange, mvmin, mvmax);
> -    m_me.refineMV(&slice->m_mref[list][ref], mvmin, mvmax, mv, outmv);
> +    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,
> +        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);
>  }
> -
>  /* 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])
>  {
> @@ -2138,20 +2144,29 @@
>      int      totalmebits = 0;
>      MV       mvzero(0, 0);
>      Yuv&     tmpPredYuv = m_rqt[cuGeom.depth].tmpPredYuv;
> -
>      MergeData merge;
>      memset(&merge, 0, sizeof(merge));
> -
> +    bool useAsMVP = false;
>      for (int puIdx = 0; puIdx < numPart; puIdx++)
>      {
>          MotionData* bestME = interMode.bestME[puIdx];
>          PredictionUnit pu(cu, cuGeom, puIdx);
> -
>          m_me.setSourcePU(*interMode.fencYuv, pu.ctuAddr,
> pu.cuAbsPartIdx, pu.puAbsPartIdx, pu.width, pu.height,
> m_param->searchMethod, m_param->subpelRefine, bChromaMC);
> -
> +        useAsMVP = false;
> +        analysis_inter_data* interDataCTU = NULL;
> +        int cuIdx;
> +        cuIdx = (interMode.cu.m_cuAddr * m_param->num4x4Partitions) +
> cuGeom.absPartIdx;
> +        if (m_param->analysisReuseLevel == 10 && m_param->interRefine > 1)
> +        {
> +            interDataCTU = (analysis_inter_data*)m_frame-
> >m_analysisData.interData;
> +            if ((cu.m_predMode[pu.puAbsPartIdx] ==
> interDataCTU->modes[cuIdx + pu.puAbsPartIdx])
> +                && (cu.m_partSize[pu.puAbsPartIdx] ==
> interDataCTU->partSize[cuIdx + pu.puAbsPartIdx])
> +                && !(interDataCTU->mergeFlag[cuIdx + puIdx])
> +                && (cu.m_cuDepth[0] == interDataCTU->depth[cuIdx]))
> +                useAsMVP = true;
> +        }
>          /* find best cost merge candidate. note: 2Nx2N merge and bidir
> are handled as separate modes */
>          uint32_t mrgCost = numPart == 1 ? MAX_UINT : mergeEstimation(cu,
> cuGeom, pu, puIdx, merge);
> -
>          bestME[0].cost = MAX_UINT;
>          bestME[1].cost = MAX_UINT;
>
> @@ -2159,26 +2174,37 @@
>          bool bDoUnidir = true;
>
>          cu.getNeighbourMV(puIdx, pu.puAbsPartIdx,
> interMode.interNeighbours);
> -
>          /* Uni-directional prediction */
>          if ((m_param->analysisLoad && m_param->analysisReuseLevel > 1 &&
> m_param->analysisReuseLevel != 10)
> -            || (m_param->analysisMultiPassRefine &&
> m_param->rc.bStatRead) || (m_param->bMVType == AVC_INFO))
> +            || (m_param->analysisMultiPassRefine &&
> m_param->rc.bStatRead) || (m_param->bMVType == AVC_INFO) || (useAsMVP))
>          {
>              for (int list = 0; list < numPredDir; list++)
>              {
> -                int ref = bestME[list].ref;
> +
> +                int ref = -1;
> +                if (useAsMVP)
> +                    ref = interDataCTU->refIdx[list][cuIdx + puIdx];
> +
> +                else
> +                    ref = bestME[list].ref;
>                  if (ref < 0)
> +                {
>                      continue;
> -
> +                }
>                  uint32_t bits = m_listSelBits[list] + MVP_IDX_BITS;
>                  bits += getTUBits(ref, numRefIdx[list]);
>
>                  int numMvc = cu.getPMV(interMode.interNeighbours, list,
> ref, interMode.amvpCand[list][ref], mvc);
> -
>                  const MV* amvp = interMode.amvpCand[list][ref];
>                  int mvpIdx = selectMVP(cu, pu, amvp, list, ref);
> -                MV mvmin, mvmax, outmv, mvp = amvp[mvpIdx];
> -
> +                MV mvmin, mvmax, outmv, mvp;
> +                if (useAsMVP)
> +                {
> +                    mvp = interDataCTU->mv[list][cuIdx + puIdx];
> +                    mvpIdx = interDataCTU->mvpIdx[list][cuIdx + puIdx];
> +                }
> +                else
> +                    mvp = amvp[mvpIdx];
>                  if (m_param->searchMethod == X265_SEA)
>                  {
>                      int puX = puIdx & 1;
> @@ -2198,9 +2224,8 @@
>                  bits += m_me.bitcost(outmv);
>                  uint32_t mvCost = m_me.mvcost(outmv);
>                  uint32_t cost = (satdCost - mvCost) +
> m_rdCost.getCost(bits);
> -
>                  /* Refine MVP selection, updates: mvpIdx, bits, cost */
> -                if (!m_param->analysisMultiPassRefine)
> +                if (!(m_param->analysisMultiPassRefine || useAsMVP))
>                      mvp = checkBestMVP(amvp, outmv, mvpIdx, bits, cost);
>                  else
>                  {
> @@ -2225,6 +2250,7 @@
>                      bestME[list].cost = cost;
>                      bestME[list].bits = bits;
>                      bestME[list].mvCost  = mvCost;
> +                    bestME[list].ref = ref;
>                  }
>                  bDoUnidir = false;
>              }
> diff -r 55eb39922995 -r a12d4abf4770 source/encoder/search.h
> --- a/source/encoder/search.h   Wed Feb 28 11:09:18 2018 +0530
> +++ b/source/encoder/search.h   Thu Jan 25 11:37:21 2018 +0530
> @@ -310,8 +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);
> +    void     searchMV(Mode& interMode, const PredictionUnit& pu, int
> list, int ref, MV& outmv, MV mvp, int numMvc, MV* mvc);
>      // encode residual and compute rd-cost for inter mode
>      void     encodeResAndCalcRdInterCU(Mode& interMode, const CUGeom&
> cuGeom);
>      void     encodeResAndCalcRdSkipCU(Mode& interMode);
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
>

Pushed.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20180305/dbd18989/attachment-0001.html>


More information about the x265-devel mailing list