[x265] [PATCH] analysis: Dump the best MV statistics and re-use this for analysis load mode

Gopu Govindaswamy gopu at multicorewareinc.com
Tue Nov 11 06:13:37 CET 2014


On Tue, Nov 11, 2014 at 8:50 AM, Steve Borho <steve at borho.org> wrote:

> On 11/10, gopu at multicorewareinc.com wrote:
> > # HG changeset patch
> > # User Gopu Govindaswamy <gopu at multicorewareinc.com>
> > # Date 1415611936 -19800
> > #      Mon Nov 10 15:02:16 2014 +0530
> > # Node ID 31b6ed10054e753331b65a5e08e512f2f5b22b2d
> > # Parent  1e04e178a349ff3a27ed0207cca7bdd9f0db4ff8
> > analysis: Dump the best MV statistics and re-use this for analysis load
> mode
> >
> > this patch is to fix the bug in inter information sharing when using
> > analysis=load|save mode, existing algorithm always dump and share the
> last part
> > best MV for each prediction, but there is multiple part's each with its
> own
> > prediction, the fix is to dump and share all part best MV's for each
> prediction
> >
> > diff -r 1e04e178a349 -r 31b6ed10054e source/common/common.h
> > --- a/source/common/common.h  Sun Nov 09 00:30:09 2014 -0600
> > +++ b/source/common/common.h  Mon Nov 10 15:02:16 2014 +0530
> > @@ -291,6 +291,7 @@
> >  #define MAX_NUM_REF                 16 // max. number of entries in
> picture reference list
> >
> >  #define REF_NOT_VALID               -1
> > +#define MAX_NUM_PART                 4
>
> in HEVC, inter cannot code NxN, so for the purpose of this data the max
> count is 2. If would be preferrable for this to be an enum in Mode
> rather than a general #define in common.h
>
> >  #define AMVP_NUM_CANDS              2 // number of AMVP candidates
> >  #define MRG_MAX_NUM_CANDS           5 // max number of final merge
> candidates
> > diff -r 1e04e178a349 -r 31b6ed10054e source/encoder/analysis.cpp
> > --- a/source/encoder/analysis.cpp     Sun Nov 09 00:30:09 2014 -0600
> > +++ b/source/encoder/analysis.cpp     Mon Nov 10 15:02:16 2014 +0530
> > @@ -1407,12 +1407,16 @@
> >
> >      if (m_param->analysisMode == X265_ANALYSIS_LOAD &&
> m_interAnalysisData)
> >      {
> > -        for (int32_t i = 0; i < numPredDir; i++)
> > +        for (uint32_t part = 0; part < interMode.cu.getNumPartInter();
> part++)
> >          {
> > -            interMode.bestME[i].costZero =
> !!m_interAnalysisData->costZero[i];
> > -            interMode.bestME[i].mv.x = m_interAnalysisData->mvx[i];
> > -            interMode.bestME[i].mv.y = m_interAnalysisData->mvy[i];
> > -            interMode.bestME[i].ref = m_interAnalysisData->ref[i];
> > +            for (int32_t i = 0; i < numPredDir; i++)
> > +            {
> > +                interMode.bestME[part][i].costZero =
> !!m_interAnalysisData->costZero[i];
> > +                interMode.bestME[part][i].mv.x =
> m_interAnalysisData->mvx[i];
> > +                interMode.bestME[part][i].mv.y =
> m_interAnalysisData->mvy[i];
> > +                interMode.bestME[part][i].ref =
> m_interAnalysisData->ref[i];
> > +            }
> > +            m_interAnalysisData++;
> >
>
the pointers are incremented for load mode after copied into
interMode.bestME

> >
> >          }
> >      }
> >      if (predInterSearch(interMode, cuGeom, false, false))
> > @@ -1425,17 +1429,20 @@
> >
> >          if (m_param->analysisMode == X265_ANALYSIS_SAVE &&
> m_interAnalysisData)
> >          {
> > -            for (int32_t i = 0; i < numPredDir; i++)
> > +            for (uint32_t part = 0; part <
> interMode.cu.getNumPartInter(); part++)
> >              {
> > -                m_interAnalysisData->costZero[i] =
> interMode.bestME[i].costZero;
> > -                m_interAnalysisData->mvx[i] = interMode.bestME[i].mv.x;
> > -                m_interAnalysisData->mvy[i] = interMode.bestME[i].mv.y;
> > -                m_interAnalysisData->ref[i] = interMode.bestME[i].ref;
> > +                for (int32_t i = 0; i < numPredDir; i++)
> > +                {
> > +                    m_interAnalysisData->costZero[i] =
> interMode.bestME[part][i].costZero;
> > +                    m_interAnalysisData->mvx[i] =
> interMode.bestME[part][i].mv.x;
> > +                    m_interAnalysisData->mvy[i] =
> interMode.bestME[part][i].mv.y;
> > +                    m_interAnalysisData->ref[i] =
> interMode.bestME[part][i].ref;
> > +                }
> > +                m_interAnalysisData->zOrder = cuGeom.encodeIdx;
> > +                m_interAnalysisData->depth  = cuGeom.depth;
> > +                m_interAnalysisData++;
>
the pointers are incremented for save mode after copied into
interAnalysisData

> >              }
> > -            m_interAnalysisData->zOrder = cuGeom.encodeIdx;
> > -            m_interAnalysisData->depth  = cuGeom.depth;
> >          }
> > -        m_interAnalysisData++;
> >      }
> >      else
> >      {
> > @@ -1453,12 +1460,16 @@
> >
> >      if (m_param->analysisMode == X265_ANALYSIS_LOAD &&
> m_interAnalysisData)
> >      {
> > -        for (int32_t i = 0; i < numPredDir; i++)
> > +        for (uint32_t part = 0; part < interMode.cu.getNumPartInter();
> part++)
> >          {
> > -            interMode.bestME[i].costZero =
> !!m_interAnalysisData->costZero[i];
> > -            interMode.bestME[i].mv.x = m_interAnalysisData->mvx[i];
> > -            interMode.bestME[i].mv.y = m_interAnalysisData->mvy[i];
> > -            interMode.bestME[i].ref = m_interAnalysisData->ref[i];
> > +            for (int32_t i = 0; i < numPredDir; i++)
> > +            {
> > +                interMode.bestME[part][i].costZero =
> !!m_interAnalysisData->costZero[i];
> > +                interMode.bestME[part][i].mv.x =
> m_interAnalysisData->mvx[i];
> > +                interMode.bestME[part][i].mv.y =
> m_interAnalysisData->mvy[i];
> > +                interMode.bestME[part][i].ref =
> m_interAnalysisData->ref[i];
> > +            }
> > +            m_interAnalysisData++;
> >          }
> >      }
> >      if (predInterSearch(interMode, cuGeom, bMergeOnly, true))
> > @@ -1467,17 +1478,20 @@
> >          encodeResAndCalcRdInterCU(interMode, cuGeom);
> >          if (m_param->analysisMode == X265_ANALYSIS_SAVE &&
> m_interAnalysisData)
> >          {
> > -            for (int32_t i = 0; i < numPredDir; i++)
> > +            for (uint32_t part = 0; part <
> interMode.cu.getNumPartInter(); part++)
> >              {
> > -                m_interAnalysisData->costZero[i] =
> interMode.bestME[i].costZero;
> > -                m_interAnalysisData->mvx[i] = interMode.bestME[i].mv.x;
> > -                m_interAnalysisData->mvy[i] = interMode.bestME[i].mv.y;
> > -                m_interAnalysisData->ref[i] = interMode.bestME[i].ref;
> > +                for (int32_t i = 0; i < numPredDir; i++)
> > +                {
> > +                    m_interAnalysisData->costZero[i] =
> interMode.bestME[part][i].costZero;
> > +                    m_interAnalysisData->mvx[i] =
> interMode.bestME[part][i].mv.x;
> > +                    m_interAnalysisData->mvy[i] =
> interMode.bestME[part][i].mv.y;
> > +                    m_interAnalysisData->ref[i] =
> interMode.bestME[part][i].ref;
> > +                }
> > +                m_interAnalysisData->zOrder = cuGeom.encodeIdx;
> > +                m_interAnalysisData->depth  = cuGeom.depth;
> > +                m_interAnalysisData++;
> >              }
> > -            m_interAnalysisData->zOrder = cuGeom.encodeIdx;
> > -            m_interAnalysisData->depth  = cuGeom.depth;
> >          }
> > -        m_interAnalysisData++;
> >      }
> >      else
> >      {
> > diff -r 1e04e178a349 -r 31b6ed10054e source/encoder/search.cpp
> > --- a/source/encoder/search.cpp       Sun Nov 09 00:30:09 2014 -0600
> > +++ b/source/encoder/search.cpp       Mon Nov 10 15:02:16 2014 +0530
> > @@ -1907,15 +1907,15 @@
> >
> >      /* tie goes to the smallest ref ID, just like --no-pme */
> >      ScopedLock _lock(master.m_outputLock);
> > -    if (cost < interMode.bestME[list].cost ||
> > -       (cost == interMode.bestME[list].cost && ref <
> interMode.bestME[list].ref))
> > +    if (cost < interMode.bestME[part][list].cost ||
> > +       (cost == interMode.bestME[part][list].cost && ref <
> interMode.bestME[part][list].ref))
> >      {
> > -        interMode.bestME[list].mv = outmv;
> > -        interMode.bestME[list].mvp = mvp;
> > -        interMode.bestME[list].mvpIdx = mvpIdx;
> > -        interMode.bestME[list].ref = ref;
> > -        interMode.bestME[list].cost = cost;
> > -        interMode.bestME[list].bits = bits;
> > +        interMode.bestME[part][list].mv = outmv;
> > +        interMode.bestME[part][list].mvp = mvp;
> > +        interMode.bestME[part][list].mvpIdx = mvpIdx;
> > +        interMode.bestME[part][list].ref = ref;
> > +        interMode.bestME[part][list].cost = cost;
> > +        interMode.bestME[part][list].bits = bits;
> >      }
> >  }
> >
> > @@ -1988,17 +1988,17 @@
> >          uint32_t bidirCost = MAX_UINT;
> >          int bidirBits = 0;
>
> this would be a lot easier to read if you just declared:
>
>            MotionData* bestME = interMode.bestME[puIdx];
>
> >
> > -        interMode.bestME[0].cost = MAX_UINT;
> > -        interMode.bestME[1].cost = MAX_UINT;
> > +        interMode.bestME[puIdx][0].cost = MAX_UINT;
> > +        interMode.bestME[puIdx][1].cost = MAX_UINT;
> >
> >          getBlkBits((PartSize)cu.m_partSize[0], slice->isInterP(),
> puIdx, lastMode, m_listSelBits);
> >
> >          /* Uni-directional prediction */
> > -        if (m_param->analysisMode == X265_ANALYSIS_LOAD &&
> interMode.bestME[0].ref >= 0)
> > +        if (m_param->analysisMode == X265_ANALYSIS_LOAD &&
> interMode.bestME[puIdx][0].ref >= 0)
> >          {
> >              for (int l = 0; l < numPredDir; l++)
> >              {
> > -                int ref = interMode.bestME[l].ref;
> > +                int ref = interMode.bestME[puIdx][l].ref;
> >                  uint32_t bits = m_listSelBits[l] + MVP_IDX_BITS;
> >                  bits += getTUBits(ref, numRefIdx[l]);
> >
> > @@ -2030,13 +2030,13 @@
> >
> >                  MV mvmin, mvmax, outmv, mvp =
> interMode.amvpCand[l][ref][mvpIdx];
> >                  m_me.setMVP(mvp);
> > -                MV bmv(interMode.bestME[l].mv.x,
> interMode.bestME[l].mv.y);
> > +                MV bmv(interMode.bestME[puIdx][l].mv.x,
> interMode.bestME[puIdx][l].mv.y);
> >
> >                  int satdCost;
> > -                if (interMode.bestME[l].costZero)
> > +                if (interMode.bestME[puIdx][l].costZero)
> >                      satdCost = m_me.mvcost(bmv);
> >                  else
> > -                    satdCost = interMode.bestME[l].cost;
> > +                    satdCost = interMode.bestME[puIdx][l].cost;
> >
> >                  /* Get total cost of partition, but only include MV bit
> cost once */
> >                  bits += m_me.bitcost(bmv);
> > @@ -2045,14 +2045,14 @@
> >                  /* Refine MVP selection, updates: mvp, mvpIdx, bits,
> cost */
> >                  checkBestMVP(interMode.amvpCand[l][ref], outmv, mvp,
> mvpIdx, bits, cost);
> >
> > -                if (cost < interMode.bestME[l].cost)
> > +                if (cost < interMode.bestME[puIdx][l].cost)
> >                  {
> > -                    interMode.bestME[l].mv = outmv;
> > -                    interMode.bestME[l].mvp = mvp;
> > -                    interMode.bestME[l].mvpIdx = mvpIdx;
> > -                    interMode.bestME[l].ref = ref;
> > -                    interMode.bestME[l].cost = cost;
> > -                    interMode.bestME[l].bits = bits;
> > +                    interMode.bestME[puIdx][l].mv = outmv;
> > +                    interMode.bestME[puIdx][l].mvp = mvp;
> > +                    interMode.bestME[puIdx][l].mvpIdx = mvpIdx;
> > +                    interMode.bestME[puIdx][l].ref = ref;
> > +                    interMode.bestME[puIdx][l].cost = cost;
> > +                    interMode.bestME[puIdx][l].bits = bits;
> >                  }
> >              }
> >          }
> > @@ -2148,31 +2148,31 @@
> >                      /* Refine MVP selection, updates: mvp, mvpIdx,
> bits, cost */
> >                      checkBestMVP(interMode.amvpCand[l][ref], outmv,
> mvp, mvpIdx, bits, cost);
> >
> > -                    if (cost < interMode.bestME[l].cost)
> > +                    if (cost < interMode.bestME[puIdx][l].cost)
> >                      {
> > -                        interMode.bestME[l].mv = outmv;
> > -                        interMode.bestME[l].mvp = mvp;
> > -                        interMode.bestME[l].mvpIdx = mvpIdx;
> > -                        interMode.bestME[l].ref = ref;
> > -                        interMode.bestME[l].cost = cost;
> > -                        interMode.bestME[l].bits = bits;
> > +                        interMode.bestME[puIdx][l].mv = outmv;
> > +                        interMode.bestME[puIdx][l].mvp = mvp;
> > +                        interMode.bestME[puIdx][l].mvpIdx = mvpIdx;
> > +                        interMode.bestME[puIdx][l].ref = ref;
> > +                        interMode.bestME[puIdx][l].cost = cost;
> > +                        interMode.bestME[puIdx][l].bits = bits;
> >                      }
> >                  }
> >              }
> >          }
> >
> >          /* Bi-directional prediction */
> > -        if (slice->isInterB() && !cu.isBipredRestriction() &&
> interMode.bestME[0].cost != MAX_UINT && interMode.bestME[1].cost !=
> MAX_UINT)
> > +        if (slice->isInterB() && !cu.isBipredRestriction() &&
> interMode.bestME[puIdx][0].cost != MAX_UINT &&
> interMode.bestME[puIdx][1].cost != MAX_UINT)
> >          {
> > -            bidir[0] = interMode.bestME[0];
> > -            bidir[1] = interMode.bestME[1];
> > +            bidir[0] = interMode.bestME[puIdx][0];
> > +            bidir[1] = interMode.bestME[puIdx][1];
> >
> >              /* Generate reference subpels */
> > -            PicYuv* refPic0  =
> slice->m_refPicList[0][interMode.bestME[0].ref]->m_reconPic;
> > -            PicYuv* refPic1  =
> slice->m_refPicList[1][interMode.bestME[1].ref]->m_reconPic;
> > +            PicYuv* refPic0  =
> slice->m_refPicList[0][interMode.bestME[puIdx][0].ref]->m_reconPic;
> > +            PicYuv* refPic1  =
> slice->m_refPicList[1][interMode.bestME[puIdx][1].ref]->m_reconPic;
> >              Yuv*    bidirYuv = m_rqt[cuGeom.depth].bidirPredYuv;
> > -            predInterLumaPixel(bidirYuv[0], *refPic0,
> interMode.bestME[0].mv);
> > -            predInterLumaPixel(bidirYuv[1], *refPic1,
> interMode.bestME[1].mv);
> > +            predInterLumaPixel(bidirYuv[0], *refPic0,
> interMode.bestME[puIdx][0].mv);
> > +            predInterLumaPixel(bidirYuv[1], *refPic1,
> interMode.bestME[puIdx][1].mv);
> >
> >              pixel *pred0 = bidirYuv[0].getLumaAddr(m_puAbsPartIdx);
> >              pixel *pred1 = bidirYuv[1].getLumaAddr(m_puAbsPartIdx);
> > @@ -2181,10 +2181,10 @@
> >              primitives.pixelavg_pp[partEnum](tmpPredYuv.m_buf[0],
> tmpPredYuv.m_size, pred0, bidirYuv[0].m_size, pred1, bidirYuv[1].m_size,
> 32);
> >              int satdCost = m_me.bufSATD(tmpPredYuv.m_buf[0],
> tmpPredYuv.m_size);
> >
> > -            bidirBits = interMode.bestME[0].bits +
> interMode.bestME[1].bits + m_listSelBits[2] - (m_listSelBits[0] +
> m_listSelBits[1]);
> > +            bidirBits = interMode.bestME[puIdx][0].bits +
> interMode.bestME[puIdx][1].bits + m_listSelBits[2] - (m_listSelBits[0] +
> m_listSelBits[1]);
> >              bidirCost = satdCost + m_rdCost.getCost(bidirBits);
> >
> > -            bool bTryZero = interMode.bestME[0].mv.notZero() ||
> interMode.bestME[1].mv.notZero();
> > +            bool bTryZero = interMode.bestME[puIdx][0].mv.notZero() ||
> interMode.bestME[puIdx][1].mv.notZero();
> >              if (bTryZero)
> >              {
> >                  /* Do not try zero MV if unidir motion predictors are
> beyond
> > @@ -2196,32 +2196,32 @@
> >                  mvmin <<= 2;
> >                  mvmax <<= 2;
> >
> > -                bTryZero &= interMode.bestME[0].mvp.checkRange(mvmin,
> mvmax);
> > -                bTryZero &= interMode.bestME[1].mvp.checkRange(mvmin,
> mvmax);
> > +                bTryZero &=
> interMode.bestME[puIdx][0].mvp.checkRange(mvmin, mvmax);
> > +                bTryZero &=
> interMode.bestME[puIdx][1].mvp.checkRange(mvmin, mvmax);
> >              }
> >              if (bTryZero)
> >              {
> >                  /* coincident blocks of the two reference pictures */
> > -                pixel *ref0 =
> m_slice->m_mref[0][interMode.bestME[0].ref].getLumaAddr(cu.m_cuAddr,
> cuGeom.encodeIdx + m_puAbsPartIdx);
> > -                pixel *ref1 =
> m_slice->m_mref[1][interMode.bestME[1].ref].getLumaAddr(cu.m_cuAddr,
> cuGeom.encodeIdx + m_puAbsPartIdx);
> > +                pixel *ref0 =
> m_slice->m_mref[0][interMode.bestME[puIdx][0].ref].getLumaAddr(cu.m_cuAddr,
> cuGeom.encodeIdx + m_puAbsPartIdx);
> > +                pixel *ref1 =
> m_slice->m_mref[1][interMode.bestME[puIdx][1].ref].getLumaAddr(cu.m_cuAddr,
> cuGeom.encodeIdx + m_puAbsPartIdx);
> >                  intptr_t refStride = slice->m_mref[0][0].lumaStride;
> >
> >                  primitives.pixelavg_pp[partEnum](tmpPredYuv.m_buf[0],
> tmpPredYuv.m_size, ref0, refStride, ref1, refStride, 32);
> >                  satdCost = m_me.bufSATD(tmpPredYuv.m_buf[0],
> tmpPredYuv.m_size);
> >
> > -                MV mvp0 = interMode.bestME[0].mvp;
> > -                int mvpIdx0 = interMode.bestME[0].mvpIdx;
> > -                uint32_t bits0 = interMode.bestME[0].bits -
> m_me.bitcost(interMode.bestME[0].mv, mvp0) + m_me.bitcost(mvzero, mvp0);
> > -
> > -                MV mvp1 = interMode.bestME[1].mvp;
> > -                int mvpIdx1 = interMode.bestME[1].mvpIdx;
> > -                uint32_t bits1 = interMode.bestME[1].bits -
> m_me.bitcost(interMode.bestME[1].mv, mvp1) + m_me.bitcost(mvzero, mvp1);
> > +                MV mvp0 = interMode.bestME[puIdx][0].mvp;
> > +                int mvpIdx0 = interMode.bestME[puIdx][0].mvpIdx;
> > +                uint32_t bits0 = interMode.bestME[puIdx][0].bits -
> m_me.bitcost(interMode.bestME[puIdx][0].mv, mvp0) + m_me.bitcost(mvzero,
> mvp0);
> > +
> > +                MV mvp1 = interMode.bestME[puIdx][1].mvp;
> > +                int mvpIdx1 = interMode.bestME[puIdx][1].mvpIdx;
> > +                uint32_t bits1 = interMode.bestME[puIdx][1].bits -
> m_me.bitcost(interMode.bestME[puIdx][1].mv, mvp1) + m_me.bitcost(mvzero,
> mvp1);
> >
> >                  uint32_t cost = satdCost + m_rdCost.getCost(bits0) +
> m_rdCost.getCost(bits1);
> >
> >                  /* refine MVP selection for zero mv, updates: mvp,
> mvpidx, bits, cost */
> > -
> checkBestMVP(interMode.amvpCand[0][interMode.bestME[0].ref], mvzero, mvp0,
> mvpIdx0, bits0, cost);
> > -
> checkBestMVP(interMode.amvpCand[1][interMode.bestME[1].ref], mvzero, mvp1,
> mvpIdx1, bits1, cost);
> > +
> checkBestMVP(interMode.amvpCand[0][interMode.bestME[puIdx][0].ref], mvzero,
> mvp0, mvpIdx0, bits0, cost);
> > +
> checkBestMVP(interMode.amvpCand[1][interMode.bestME[puIdx][1].ref], mvzero,
> mvp1, mvpIdx1, bits1, cost);
> >
> >                  if (cost < bidirCost)
> >                  {
> > @@ -2243,7 +2243,7 @@
> >          }
> >
> >          /* select best option and store into CU */
> > -        if (mrgCost < bidirCost && mrgCost < interMode.bestME[0].cost
> && mrgCost < interMode.bestME[1].cost)
> > +        if (mrgCost < bidirCost && mrgCost <
> interMode.bestME[puIdx][0].cost && mrgCost <
> interMode.bestME[puIdx][1].cost)
> >          {
> >              cu.m_mergeFlag[m_puAbsPartIdx] = true;
> >              cu.m_mvpIdx[0][m_puAbsPartIdx] = merge.index; // merge
> candidate ID is stored in L0 MVP idx
> > @@ -2255,39 +2255,39 @@
> >
> >              totalmebits += merge.bits;
> >          }
> > -        else if (bidirCost < interMode.bestME[0].cost && bidirCost <
> interMode.bestME[1].cost)
> > +        else if (bidirCost < interMode.bestME[puIdx][0].cost &&
> bidirCost < interMode.bestME[puIdx][1].cost)
> >          {
> >              lastMode = 2;
> >
> >              cu.m_mergeFlag[m_puAbsPartIdx] = false;
> >              cu.setPUInterDir(3, m_puAbsPartIdx, puIdx);
> >              cu.setPUMv(0, bidir[0].mv, m_puAbsPartIdx, puIdx);
> > -            cu.setPURefIdx(0, interMode.bestME[0].ref, m_puAbsPartIdx,
> puIdx);
> > +            cu.setPURefIdx(0, interMode.bestME[puIdx][0].ref,
> m_puAbsPartIdx, puIdx);
> >              cu.m_mvd[0][m_puAbsPartIdx] = bidir[0].mv - bidir[0].mvp;
> >              cu.m_mvpIdx[0][m_puAbsPartIdx] = bidir[0].mvpIdx;
> >
> >              cu.setPUMv(1, bidir[1].mv, m_puAbsPartIdx, puIdx);
> > -            cu.setPURefIdx(1, interMode.bestME[1].ref, m_puAbsPartIdx,
> puIdx);
> > +            cu.setPURefIdx(1, interMode.bestME[puIdx][1].ref,
> m_puAbsPartIdx, puIdx);
> >              cu.m_mvd[1][m_puAbsPartIdx] = bidir[1].mv - bidir[1].mvp;
> >              cu.m_mvpIdx[1][m_puAbsPartIdx] = bidir[1].mvpIdx;
> >
> >              totalmebits += bidirBits;
> >          }
> > -        else if (interMode.bestME[0].cost <= interMode.bestME[1].cost)
> > +        else if (interMode.bestME[puIdx][0].cost <=
> interMode.bestME[puIdx][1].cost)
> >          {
> >              lastMode = 0;
> >
> >              cu.m_mergeFlag[m_puAbsPartIdx] = false;
> >              cu.setPUInterDir(1, m_puAbsPartIdx, puIdx);
> > -            cu.setPUMv(0, interMode.bestME[0].mv, m_puAbsPartIdx,
> puIdx);
> > -            cu.setPURefIdx(0, interMode.bestME[0].ref, m_puAbsPartIdx,
> puIdx);
> > -            cu.m_mvd[0][m_puAbsPartIdx] = interMode.bestME[0].mv -
> interMode.bestME[0].mvp;
> > -            cu.m_mvpIdx[0][m_puAbsPartIdx] = interMode.bestME[0].mvpIdx;
> > +            cu.setPUMv(0, interMode.bestME[puIdx][0].mv,
> m_puAbsPartIdx, puIdx);
> > +            cu.setPURefIdx(0, interMode.bestME[puIdx][0].ref,
> m_puAbsPartIdx, puIdx);
> > +            cu.m_mvd[0][m_puAbsPartIdx] = interMode.bestME[puIdx][0].mv
> - interMode.bestME[puIdx][0].mvp;
> > +            cu.m_mvpIdx[0][m_puAbsPartIdx] =
> interMode.bestME[puIdx][0].mvpIdx;
> >
> >              cu.setPURefIdx(1, REF_NOT_VALID, m_puAbsPartIdx, puIdx);
> >              cu.setPUMv(1, mvzero, m_puAbsPartIdx, puIdx);
> >
> > -            totalmebits += interMode.bestME[0].bits;
> > +            totalmebits += interMode.bestME[puIdx][0].bits;
> >          }
> >          else
> >          {
> > @@ -2295,15 +2295,15 @@
> >
> >              cu.m_mergeFlag[m_puAbsPartIdx] = false;
> >              cu.setPUInterDir(2, m_puAbsPartIdx, puIdx);
> > -            cu.setPUMv(1, interMode.bestME[1].mv, m_puAbsPartIdx,
> puIdx);
> > -            cu.setPURefIdx(1, interMode.bestME[1].ref, m_puAbsPartIdx,
> puIdx);
> > -            cu.m_mvd[1][m_puAbsPartIdx] = interMode.bestME[1].mv -
> interMode.bestME[1].mvp;
> > -            cu.m_mvpIdx[1][m_puAbsPartIdx] = interMode.bestME[1].mvpIdx;
> > +            cu.setPUMv(1, interMode.bestME[puIdx][1].mv,
> m_puAbsPartIdx, puIdx);
> > +            cu.setPURefIdx(1, interMode.bestME[puIdx][1].ref,
> m_puAbsPartIdx, puIdx);
> > +            cu.m_mvd[1][m_puAbsPartIdx] = interMode.bestME[puIdx][1].mv
> - interMode.bestME[puIdx][1].mvp;
> > +            cu.m_mvpIdx[1][m_puAbsPartIdx] =
> interMode.bestME[puIdx][1].mvpIdx;
> >
> >              cu.setPURefIdx(0, REF_NOT_VALID, m_puAbsPartIdx, puIdx);
> >              cu.setPUMv(0, mvzero, m_puAbsPartIdx, puIdx);
> >
> > -            totalmebits += interMode.bestME[1].bits;
> > +            totalmebits += interMode.bestME[puIdx][1].bits;
> >          }
> >
> >          prepMotionCompensation(cu, cuGeom, puIdx);
> > diff -r 1e04e178a349 -r 31b6ed10054e source/encoder/search.h
> > --- a/source/encoder/search.h Sun Nov 09 00:30:09 2014 -0600
> > +++ b/source/encoder/search.h Mon Nov 10 15:02:16 2014 +0530
> > @@ -84,7 +84,7 @@
> >      Yuv        reconYuv;
> >      Entropy    contexts;
> >
> > -    MotionData bestME[2];
> > +    MotionData bestME[MAX_NUM_PART][2];
>
>        enum { MAX_INTER_PARTS = 2 };
>        MotionData bestME[MAX_INTER_PARTS][2];
>
> >      MV         amvpCand[2][MAX_NUM_REF][AMVP_NUM_CANDS];
> >
> >      uint64_t   rdCost;     // sum of partition (psy) RD costs
> (sse(fenc, recon) + lambda2 * bits)
>
> Don't changes need to be made to the allocation of the inter data
> buffers or where the pointers are incremented?
>
> yes i need to increment the inter buffer allocation for part also

> --
> Steve Borho
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>



-- 
Thanks & Regards
Gopu G
Multicoreware Inc
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20141111/1fb6520f/attachment-0001.html>


More information about the x265-devel mailing list