[x265] [PATCH] analysis: avoid motion references not used by split blocks in pme mode

Steve Borho steve at borho.org
Wed Aug 26 13:26:52 CEST 2015


On 08/26, ashok at multicorewareinc.com wrote:
> # HG changeset patch
> # User Ashok Kumar Mishra<ashok at multicorewareinc.com>
> # Date 1440506957 -19800
> #      Tue Aug 25 18:19:17 2015 +0530
> # Node ID 7c753931aff95353dc3d12ac2c51f88e9b17ab49
> # Parent  a28a863393994d8fb1d58c721352d9b4ec8c46ee
> analysis: avoid motion references not used by split blocks in pme mode

LGTM

> diff -r a28a86339399 -r 7c753931aff9 source/encoder/search.cpp
> --- a/source/encoder/search.cpp	Mon Aug 24 14:04:32 2015 +0530
> +++ b/source/encoder/search.cpp	Tue Aug 25 18:19:17 2015 +0530
> @@ -1964,10 +1964,16 @@
>      /* Perform ME, repeat until no more work is available */
>      do
>      {
> -        if (meId < m_slice->m_numRefIdx[0])
> -            slave.singleMotionEstimation(*this, pme.mode, pme.pu, pme.puIdx, 0, meId);
> +        if (meId < pme.m_jobs.refCnt[0])
> +        {
> +            int refIdx = pme.m_jobs.ref[0][meId]; //L0
> +            slave.singleMotionEstimation(*this, pme.mode, pme.pu, pme.puIdx, 0, refIdx);
> +        }
>          else
> -            slave.singleMotionEstimation(*this, pme.mode, pme.pu, pme.puIdx, 1, meId - m_slice->m_numRefIdx[0]);
> +        {
> +            int refIdx = pme.m_jobs.ref[1][meId - pme.m_jobs.refCnt[0]]; //L1
> +            slave.singleMotionEstimation(*this, pme.mode, pme.pu, pme.puIdx, 1, refIdx);
> +        }
>  
>          meId = -1;
>          pme.m_lock.acquire();
> @@ -2039,8 +2045,6 @@
>      const int* numRefIdx = slice->m_numRefIdx;
>      uint32_t lastMode = 0;
>      int      totalmebits = 0;
> -    int      numME = numRefIdx[0] + numRefIdx[1];
> -    bool     bTryDistributed = m_param->bDistributeMotionEstimation && numME > 2;
>      MV       mvzero(0, 0);
>      Yuv&     tmpPredYuv = m_rqt[cuGeom.depth].tmpPredYuv;
>  
> @@ -2105,17 +2109,38 @@
>              }
>              bDoUnidir = false;
>          }
> -        else if (bTryDistributed)
> +        else if (m_param->bDistributeMotionEstimation)
>          {
>              PME pme(*this, interMode, cuGeom, pu, puIdx);
> -            pme.m_jobTotal = numME;
> -            pme.m_jobAcquired = 1; /* reserve L0-0 */
> -
> -            if (pme.tryBondPeers(*m_frame->m_encData->m_jobProvider, numME - 1))
> +            pme.m_jobTotal = 0;
> +            pme.m_jobAcquired = 1; /* reserve L0-0 or L1-0 */
> +
> +            uint32_t refMask = refMasks[puIdx] ? refMasks[puIdx] : (uint32_t)-1;
> +            for (int list = 0; list < numPredDir; list++)
>              {
> +                int idx = 0;
> +                for (int ref = 0; ref < numRefIdx[list]; ref++)
> +                {
> +                    if (!(refMask & (1 << ref)))
> +                        continue;
> +
> +                    pme.m_jobs.ref[list][idx++]  = ref;
> +                    pme.m_jobTotal++;
> +                }
> +                pme.m_jobs.refCnt[list] = idx;
> +
> +                /* the second list ref bits start at bit 16 */
> +                refMask >>= 16;
> +            }
> +
> +            if (pme.m_jobTotal > 2)
> +            {
> +                pme.tryBondPeers(*m_frame->m_encData->m_jobProvider, pme.m_jobTotal - 1);
> +
>                  processPME(pme, *this);
>  
> -                singleMotionEstimation(*this, interMode, pu, puIdx, 0, 0); /* L0-0 */
> +                int ref = pme.m_jobs.refCnt[0] ? pme.m_jobs.ref[0][0] : pme.m_jobs.ref[1][0];
> +                singleMotionEstimation(*this, interMode, pu, puIdx, 0, ref); /* L0-0 or L1-0 */
>  
>                  bDoUnidir = false;
>  
> diff -r a28a86339399 -r 7c753931aff9 source/encoder/search.h
> --- a/source/encoder/search.h	Mon Aug 24 14:04:32 2015 +0530
> +++ b/source/encoder/search.h	Tue Aug 25 18:19:17 2015 +0530
> @@ -376,6 +376,11 @@
>          const PredictionUnit& pu;
>          int           puIdx;
>  
> +        struct {
> +            int ref[2][MAX_NUM_REF];
> +            int refCnt[2];
> +        } m_jobs;
> +
>          PME(Search& s, Mode& m, const CUGeom& g, const PredictionUnit& u, int p) : master(s), mode(m), cuGeom(g), pu(u), puIdx(p) {}
>  
>          void processTasks(int workerThreadId);
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel

-- 
Steve Borho


More information about the x265-devel mailing list