[x265] [PATCH] analysis: avoid motion references not used by split blocks in pme mode
ashok at multicorewareinc.com
ashok at multicorewareinc.com
Wed Aug 26 11:40:25 CEST 2015
# 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
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);
More information about the x265-devel
mailing list