[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