[x265] [PATCH] analysis: avoid motion references not used by split blocks in pme mode
ashok at multicorewareinc.com
ashok at multicorewareinc.com
Wed Aug 19 12:52:57 CEST 2015
# HG changeset patch
# User Ashok Kumar Mishra<ashok at multicorewareinc.com>
# Date 1439808217 -19800
# Mon Aug 17 16:13:37 2015 +0530
# Node ID 868aa6ce2f9033812cdc1c9c4fae31a8a40a2921
# Parent 2980141a744a569ad6f60dbebdece76a4eababfd
analysis: avoid motion references not used by split blocks in pme mode
diff -r 2980141a744a -r 868aa6ce2f90 source/encoder/search.cpp
--- a/source/encoder/search.cpp Tue Aug 18 12:45:52 2015 +0530
+++ b/source/encoder/search.cpp Mon Aug 17 16:13:37 2015 +0530
@@ -1962,10 +1962,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 < m_refIdxCnt[0])
+ {
+ int refIdx = m_bestRefIdx[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 = m_bestRefIdx[1][meId - m_refIdxCnt[0]]; //L1
+ slave.singleMotionEstimation(*this, pme.mode, pme.pu, pme.puIdx, 1, refIdx);
+ }
meId = -1;
pme.m_lock.acquire();
@@ -2037,8 +2043,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;
@@ -2047,6 +2051,32 @@
for (int puIdx = 0; puIdx < numPart; puIdx++)
{
+ uint32_t refMask = refMasks[puIdx] ? refMasks[puIdx] : (uint32_t)-1;
+
+ m_refIdxCnt[0] = 0; m_refIdxCnt[1] = 0;
+ for (int list = 0; list < numPredDir; list++)
+ {
+ int idx = 0;
+ for (int ref = 0; ref < numRefIdx[list]; ref++)
+ {
+ ProfileCounter(interMode.cu, totalMotionReferences[cuGeom.depth]);
+
+ if (!(refMask & (1 << ref)))
+ {
+ ProfileCounter(interMode.cu, skippedMotionReferences[cuGeom.depth]);
+ continue;
+ }
+ m_bestRefIdx[list][idx++] = ref;
+ }
+ m_refIdxCnt[list] = idx;
+
+ /* the second list ref bits start at bit 16 */
+ refMask >>= 16;
+ }
+ int numME = m_refIdxCnt[0] + m_refIdxCnt[1];
+
+ bool bTryDistributed = m_param->bDistributeMotionEstimation && numME > 2;
+
MotionData* bestME = interMode.bestME[puIdx];
PredictionUnit pu(cu, cuGeom, puIdx);
@@ -2113,7 +2143,8 @@
{
processPME(pme, *this);
- singleMotionEstimation(*this, interMode, pu, puIdx, 0, 0); /* L0-0 */
+ int ref = (m_refIdxCnt[0] == 0) ? m_bestRefIdx[1][0] : m_bestRefIdx[0][0];
+ singleMotionEstimation(*this, interMode, pu, puIdx, 0, ref); /* L0-0 or L1-0 */
bDoUnidir = false;
@@ -2126,19 +2157,11 @@
}
if (bDoUnidir)
{
- uint32_t refMask = refMasks[puIdx] ? refMasks[puIdx] : (uint32_t)-1;
-
for (int list = 0; list < numPredDir; list++)
{
- for (int ref = 0; ref < numRefIdx[list]; ref++)
+ for (int idx = 0; idx < m_refIdxCnt[list]; idx++)
{
- ProfileCounter(interMode.cu, totalMotionReferences[cuGeom.depth]);
-
- if (!(refMask & (1 << ref)))
- {
- ProfileCounter(interMode.cu, skippedMotionReferences[cuGeom.depth]);
- continue;
- }
+ int ref = m_bestRefIdx[list][idx];
uint32_t bits = m_listSelBits[list] + MVP_IDX_BITS;
bits += getTUBits(ref, numRefIdx[list]);
@@ -2173,8 +2196,6 @@
bestME[list].bits = bits;
}
}
- /* the second list ref bits start at bit 16 */
- refMask >>= 16;
}
}
diff -r 2980141a744a -r 868aa6ce2f90 source/encoder/search.h
--- a/source/encoder/search.h Tue Aug 18 12:45:52 2015 +0530
+++ b/source/encoder/search.h Mon Aug 17 16:13:37 2015 +0530
@@ -316,6 +316,9 @@
uint32_t m_numLayers;
uint32_t m_refLagPixels;
+ int m_refIdxCnt[2];
+ int m_bestRefIdx[2][16];
+
#if DETAILED_CU_STATS
/* Accumulate CU statistics separately for each frame encoder */
CUStats m_stats[X265_MAX_FRAME_THREADS];
More information about the x265-devel
mailing list