<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Aug 7, 2016 at 11:35 AM, <span dir="ltr"><<a href="mailto:nvijay.anand@trispacetech.com" target="_blank">nvijay.anand@trispacetech.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"># HG changeset patch<br>
# User N Vijay Anand <<a href="mailto:nvijay.anand@trispacetech.com">nvijay.anand@trispacetech.com</a><wbr>><br>
# Date 1470549890 -19800<br>
# Sun Aug 07 11:34:50 2016 +0530<br>
# Node ID 340dd470d7ebbdd6e9532b9ea6e830<wbr>627600d3bf<br>
# Parent f46e843a27cbaa4a1c79f1a43d41a0<wbr>4d63f601c4<br>
Parameter passing optimisation<br>
<br>
diff -r f46e843a27cb -r 340dd470d7eb source/encoder/motion.cpp<br>
--- a/source/encoder/motion.cpp Fri Aug 05 17:02:17 2016 +0530<br>
+++ b/source/encoder/motion.cpp Sun Aug 07 11:34:50 2016 +0530<br>
@@ -100,23 +100,21 @@<br>
<br>
}<br>
<br>
-#define MAX_NUM_BESTVECTORS (16)<br>
-<br>
-inline void PushToBMVStack(MV *bStack, MV & bv, int *bCostStack, int bcost, int maxNumBmv)<br>
+inline void PushToBMVStack(BmvStack *bStack, MV & bv, int bcost)<br>
{<br>
- for (int i=0; i<maxNumBmv; i++)<br>
+ for (int i=0; i<bStack->maxNumBmv; i++)<br>
{<br>
- if((bCostStack[i] == bcost) && (bv == bStack[i]))<br>
+ if((bStack->bmvCostStack[i] == bcost) && (bv == bStack->bmvStack[i]))<br>
break;<br>
- if((bCostStack[i] >= bcost) && (bv != bStack[i]))<br>
+ if((bStack->bmvCostStack[i] >= bcost) && (bv != bStack->bmvStack[i]))<br>
{<br>
- for (int j=maxNumBmv-1; j>i; j--)<br>
+ for (int j=bStack->maxNumBmv-1; j>i; j--)<br>
{<br>
- bStack[j] = bStack[j-1];<br>
- bCostStack[j] = bCostStack[j-1];<br>
+ bStack->bmvStack[j] = bStack->bmvStack[j-1];<br>
+ bStack->bmvCostStack[j] = bStack->bmvCostStack[j-1];<br>
}<br>
- bStack[i] = bv;<br>
- bCostStack[i] = bcost;<br>
+ bStack->bmvStack[i] = bv;<br>
+ bStack->bmvCostStack[i] = bcost;<br>
break;<br>
}<br>
}<br>
@@ -247,7 +245,7 @@<br>
bmv = tmv; \<br>
bPointNr = point; \<br>
bDistance = dist; \<br>
- PushToBMVStack(bmvStack, tmv, bmvCostStack, cost, maxNumBmv); \<br>
+ PushToBMVStack(bmvStack, tmv, cost); \<br>
} \<br>
} while (0)<br>
<br>
@@ -257,7 +255,7 @@<br>
int cost = sad(fenc, FENC_STRIDE, fref + (mx) + (my) * stride, stride); \<br>
cost += mvcost(MV(mx, my) << 2); \<br>
COPY2_IF_LT(bcost, cost, bmv, MV(mx, my)); \<br>
- PushToBMVStack(bmvStack, MV(mx,my), bmvCostStack, cost, maxNumBmv); \<br>
+ PushToBMVStack(bmvStack, MV(mx,my), cost); \<br>
} while (0)<br>
<br>
#define COST_MV_X3_DIR(m0x, m0y, m1x, m1y, m2x, m2y, costs) \<br>
@@ -271,9 +269,9 @@<br>
(costs)[0] += mvcost((bmv + MV(m0x, m0y)) << 2); \<br>
(costs)[1] += mvcost((bmv + MV(m1x, m1y)) << 2); \<br>
(costs)[2] += mvcost((bmv + MV(m2x, m2y)) << 2); \<br>
- PushToBMVStack(bmvStack, bmv+MV(m0x,m0y), bmvCostStack, (costs)[0], maxNumBmv); \<br>
- PushToBMVStack(bmvStack, bmv+MV(m1x,m1y), bmvCostStack, (costs)[1], maxNumBmv); \<br>
- PushToBMVStack(bmvStack, bmv+MV(m2x,m2y), bmvCostStack, (costs)[2], maxNumBmv); \<br>
+ PushToBMVStack(bmvStack, bmv+MV(m0x,m0y), (costs)[0]); \<br>
+ PushToBMVStack(bmvStack, bmv+MV(m1x,m1y), (costs)[1]); \<br>
+ PushToBMVStack(bmvStack, bmv+MV(m2x,m2y), (costs)[2]); \<br>
}<br>
<br>
#define COST_MV_PT_DIST_X4(m0x, m0y, p0, d0, m1x, m1y, p1, d1, m2x, m2y, p2, d2, m3x, m3y, p3, d3) \<br>
@@ -289,13 +287,13 @@<br>
(costs)[2] += mvcost(MV(m2x, m2y) << 2); \<br>
(costs)[3] += mvcost(MV(m3x, m3y) << 2); \<br>
COPY4_IF_LT(bcost, costs[0], bmv, MV(m0x, m0y), bPointNr, p0, bDistance, d0); \<br>
- PushToBMVStack(bmvStack, MV(m0x,m0y), bmvCostStack, (costs)[0], maxNumBmv); \<br>
+ PushToBMVStack(bmvStack, MV(m0x,m0y), (costs)[0]); \<br>
COPY4_IF_LT(bcost, costs[1], bmv, MV(m1x, m1y), bPointNr, p1, bDistance, d1); \<br>
- PushToBMVStack(bmvStack, MV(m1x,m1y), bmvCostStack, (costs)[1], maxNumBmv); \<br>
+ PushToBMVStack(bmvStack, MV(m1x,m1y), (costs)[1]); \<br>
COPY4_IF_LT(bcost, costs[2], bmv, MV(m2x, m2y), bPointNr, p2, bDistance, d2); \<br>
- PushToBMVStack(bmvStack, MV(m2x,m2y), bmvCostStack, (costs)[2], maxNumBmv); \<br>
+ PushToBMVStack(bmvStack, MV(m2x,m2y), (costs)[2]); \<br>
COPY4_IF_LT(bcost, costs[3], bmv, MV(m3x, m3y), bPointNr, p3, bDistance, d3); \<br>
- PushToBMVStack(bmvStack, MV(m3x,m3y), bmvCostStack, (costs)[3], maxNumBmv); \<br>
+ PushToBMVStack(bmvStack, MV(m3x,m3y), (costs)[3]); \<br>
}<br>
<br>
#define COST_MV_X4(m0x, m0y, m1x, m1y, m2x, m2y, m3x, m3y) \<br>
@@ -312,13 +310,13 @@<br>
costs[2] += mvcost((omv + MV(m2x, m2y)) << 2); \<br>
costs[3] += mvcost((omv + MV(m3x, m3y)) << 2); \<br>
COPY2_IF_LT(bcost, costs[0], bmv, omv + MV(m0x, m0y)); \<br>
- PushToBMVStack(bmvStack, omv+MV(m0x,m0y), bmvCostStack, costs[0], maxNumBmv); \<br>
+ PushToBMVStack(bmvStack, omv+MV(m0x,m0y), costs[0]); \<br>
COPY2_IF_LT(bcost, costs[1], bmv, omv + MV(m1x, m1y)); \<br>
- PushToBMVStack(bmvStack, omv+MV(m1x,m1y), bmvCostStack, costs[1], maxNumBmv); \<br>
+ PushToBMVStack(bmvStack, omv+MV(m1x,m1y), costs[1]); \<br>
COPY2_IF_LT(bcost, costs[2], bmv, omv + MV(m2x, m2y)); \<br>
- PushToBMVStack(bmvStack, omv+MV(m2x,m2y), bmvCostStack, costs[2], maxNumBmv); \<br>
+ PushToBMVStack(bmvStack, omv+MV(m2x,m2y), costs[2]); \<br>
COPY2_IF_LT(bcost, costs[3], bmv, omv + MV(m3x, m3y)); \<br>
- PushToBMVStack(bmvStack, omv+MV(m3x,m3y), bmvCostStack, costs[3], maxNumBmv); \<br>
+ PushToBMVStack(bmvStack, omv+MV(m3x,m3y), costs[3]); \<br>
}<br>
<br>
#define COST_MV_X4_DIR(m0x, m0y, m1x, m1y, m2x, m2y, m3x, m3y, costs) \<br>
@@ -334,10 +332,10 @@<br>
(costs)[1] += mvcost((bmv + MV(m1x, m1y)) << 2); \<br>
(costs)[2] += mvcost((bmv + MV(m2x, m2y)) << 2); \<br>
(costs)[3] += mvcost((bmv + MV(m3x, m3y)) << 2); \<br>
- PushToBMVStack(bmvStack, bmv+MV(m0x,m0y), bmvCostStack, (costs)[0], maxNumBmv); \<br>
- PushToBMVStack(bmvStack, bmv+MV(m1x,m1y), bmvCostStack, (costs)[1], maxNumBmv); \<br>
- PushToBMVStack(bmvStack, bmv+MV(m2x,m2y), bmvCostStack, (costs)[2], maxNumBmv); \<br>
- PushToBMVStack(bmvStack, bmv+MV(m3x,m3y), bmvCostStack, (costs)[3], maxNumBmv); \<br>
+ PushToBMVStack(bmvStack, bmv+MV(m0x,m0y), (costs)[0]); \<br>
+ PushToBMVStack(bmvStack, bmv+MV(m1x,m1y), (costs)[1]); \<br>
+ PushToBMVStack(bmvStack, bmv+MV(m2x,m2y), (costs)[2]); \<br>
+ PushToBMVStack(bmvStack, bmv+MV(m3x,m3y), (costs)[3]); \<br>
}<br>
<br>
#define DIA1_ITER(mx, my) \<br>
@@ -377,9 +375,7 @@<br>
const MV & mvmax,<br>
MV & bmv,<br>
int & bcost,<br>
- MV *bmvStack,<br>
- int *bmvCostStack,<br>
- int maxNumBmv,<br>
+ BmvStack *bmvStack,<br>
int & bPointNr,<br>
int & bDistance,<br>
int earlyExitIters,<br>
@@ -658,23 +654,24 @@<br>
<br>
/* re-measure full pel rounded MVP with SAD as search start point */<br>
MV bmv = pmv.roundToFPel();<br>
- MV bmvStack[MAX_NUM_BESTVECTORS];<br>
- int bmvCostStack[MAX_NUM_<wbr>BESTVECTORS];<br>
- int bcost = bprecost;<br>
- const int maxNumBmv = 1 << searchMethod;<br>
+ BmvStack *bmvStack, bMVStack;<br>
+ int bcost = bprecost;<br>
<br>
- bmvStack[0] = bmv;<br>
- bmvCostStack[0] = bprecost;<br>
- for (int i=1 ; i < maxNumBmv; i++)<br>
+ bmvStack = &bMVStack;<br>
+ bmvStack->bmvStack[0] = bmv;<br>
+ bmvStack->bmvCostStack[0] = bprecost;<br>
+ bmvStack->maxNumBmv = 1 << searchMethod;<br>
+<br>
+ for (int i=1 ; i < bmvStack->maxNumBmv; i++)<br>
{<br>
- bmvStack[i] = bmv;<br>
- bmvCostStack[i] = 0x7fffffff;<br>
+ bmvStack->bmvStack[i] = bmv;<br>
+ bmvStack->bmvCostStack[i] = 0x7fffffff;<br>
}<br>
<br>
if (pmv.isSubpel())<br>
{<br>
bcost = sad(fenc, FENC_STRIDE, fref + bmv.x + bmv.y * stride, stride) + mvcost(bmv << 2);<br>
- bmvCostStack[0] = bcost;<br>
+ bmvStack->bmvCostStack[0] = bcost;<br>
}<br>
<br>
// measure SAD cost at MV(0) if MVP is not zero<br>
@@ -685,8 +682,8 @@<br>
{<br>
bcost = cost;<br>
bmv = 0;<br>
- bmvStack[0] = bmv;<br>
- bmvCostStack[0] = bcost;<br>
+ bmvStack->bmvStack[0] = bmv;<br>
+ bmvStack->bmvCostStack[0] = bcost;<br>
}<br>
}<br>
<br>
@@ -816,8 +813,8 @@<br>
/* refine predictors */<br>
omv = bmv;<br>
ucost1 = bcost;<br>
- bmvStack[0] = bmv;<br>
- bmvCostStack[0] = bcost;<br>
+ bmvStack->bmvStack[0] = bmv;<br>
+ bmvStack->bmvCostStack[0] = bcost;<br>
DIA1_ITER(pmv.x, pmv.y);<br>
if (pmv.notZero())<br>
DIA1_ITER(0, 0);<br>
@@ -945,7 +942,7 @@<br>
do \<br>
{ \<br>
COPY2_IF_LT(bcost, costs[k], dir, x * 16 + (y & 15)); \<br>
- PushToBMVStack(bmvStack, omv+MV(x*i,y*i), bmvCostStack, costs[k], maxNumBmv); \<br>
+ PushToBMVStack(bmvStack, omv+MV(x*i,y*i), costs[k]); \<br>
} while (0)<br>
<br>
SADS(0, +0, -4, +0, +4, -2, -3, +2, -3);<br>
@@ -1007,7 +1004,7 @@<br>
int bDistance = 0;<br>
<br>
const int EarlyExitIters = 3;<br>
- StarPatternSearch(ref, mvmin, mvmax, bmv, bcost, bmvStack, bmvCostStack, maxNumBmv, bPointNr, bDistance, EarlyExitIters, merange);<br>
+ StarPatternSearch(ref, mvmin, mvmax, bmv, bcost, bmvStack, bPointNr, bDistance, EarlyExitIters, merange);<br>
<br>
if (bDistance == 1)<br>
{<br>
@@ -1059,19 +1056,19 @@<br>
stride, costs);<br>
costs[0] += mvcost(tmv << 2);<br>
COPY2_IF_LT(bcost, costs[0], bmv, tmv);<br>
- PushToBMVStack(bmvStack, tmv, bmvCostStack, (costs)[0], maxNumBmv);<br>
+ PushToBMVStack(bmvStack, tmv, (costs)[0]);<br>
tmv.x += RasterDistance;<br>
costs[1] += mvcost(tmv << 2);<br>
COPY2_IF_LT(bcost, costs[1], bmv, tmv);<br>
- PushToBMVStack(bmvStack, tmv, bmvCostStack, (costs)[1], maxNumBmv);<br>
+ PushToBMVStack(bmvStack, tmv, (costs)[1]);<br>
tmv.x += RasterDistance;<br>
costs[2] += mvcost(tmv << 2);<br>
COPY2_IF_LT(bcost, costs[2], bmv, tmv);<br>
- PushToBMVStack(bmvStack, tmv, bmvCostStack, (costs)[2], maxNumBmv);<br>
+ PushToBMVStack(bmvStack, tmv, (costs)[2]);<br>
tmv.x += RasterDistance;<br>
costs[3] += mvcost(tmv << 3);<br>
COPY2_IF_LT(bcost, costs[3], bmv, tmv);<br>
- PushToBMVStack(bmvStack, tmv, bmvCostStack, (costs)[3], maxNumBmv);<br>
+ PushToBMVStack(bmvStack, tmv, (costs)[3]);<br>
}<br>
else<br>
COST_MV(tmv.x, tmv.y);<br>
@@ -1085,7 +1082,7 @@<br>
bDistance = 0;<br>
bPointNr = 0;<br>
const int MaxIters = 32;<br>
- StarPatternSearch(ref, mvmin, mvmax, bmv, bcost, bmvStack, bmvCostStack, maxNumBmv, bPointNr, bDistance, MaxIters, merange);<br>
+ StarPatternSearch(ref, mvmin, mvmax, bmv, bcost, bmvStack, bPointNr, bDistance, MaxIters, merange);<br>
<br>
if (bDistance == 1)<br>
{<br>
@@ -1135,19 +1132,19 @@<br>
stride, costs);<br>
costs[0] += mvcost(tmv << 2);<br>
COPY2_IF_LT(bcost, costs[0], bmv, tmv);<br>
- PushToBMVStack(bmvStack, tmv, bmvCostStack, (costs)[0], maxNumBmv);<br>
+ PushToBMVStack(bmvStack, tmv, (costs)[0]);<br>
tmv.x++;<br>
costs[1] += mvcost(tmv << 2);<br>
COPY2_IF_LT(bcost, costs[1], bmv, tmv);<br>
- PushToBMVStack(bmvStack, tmv, bmvCostStack, (costs)[1], maxNumBmv);<br>
+ PushToBMVStack(bmvStack, tmv, (costs)[1]);<br>
tmv.x++;<br>
costs[2] += mvcost(tmv << 2);<br>
COPY2_IF_LT(bcost, costs[2], bmv, tmv);<br>
- PushToBMVStack(bmvStack, tmv, bmvCostStack, (costs)[2], maxNumBmv);<br>
+ PushToBMVStack(bmvStack, tmv, (costs)[2]);<br>
tmv.x++;<br>
costs[3] += mvcost(tmv << 2);<br>
COPY2_IF_LT(bcost, costs[3], bmv, tmv);<br>
- PushToBMVStack(bmvStack, tmv, bmvCostStack, (costs)[3], maxNumBmv);<br>
+ PushToBMVStack(bmvStack, tmv, (costs)[3]);<br>
}<br>
else<br>
COST_MV(tmv.x, tmv.y);<br>
@@ -1166,14 +1163,14 @@<br>
{<br>
bmv = bestpre;<br>
bcost = bprecost;<br>
- PushToBMVStack(bmvStack, bmv, bmvCostStack, bcost, maxNumBmv);<br>
+ PushToBMVStack(bmvStack, bmv, bcost);<br>
}<br>
else<br>
{<br>
bmv = bmv.toQPel(); // promote search bmv to qpel<br>
- for (int i=0; i<maxNumBmv; i++)<br>
+ for (int i=0; i<bmvStack->maxNumBmv; i++)<br>
{<br>
- bmvStack[i] = bmvStack[i].toQPel();<br>
+ bmvStack->bmvStack[i] = bmvStack->bmvStack[i].toQPel()<wbr>;<br>
}<br>
}<br>
<br>
@@ -1188,11 +1185,11 @@<br>
else if (ref->isLowres)<br>
{<br>
int bdir = 0;<br>
- for (int nBmv=0; nBmv<maxNumBmv; nBmv++)<br>
+ for (int nBmv=0; nBmv<bmvStack->maxNumBmv; nBmv++)<br>
{<br>
bdir = 0;<br>
- bmv = bmvStack[nBmv];<br>
- bcost = bmvCostStack[nBmv];<br>
+ bmv = bmvStack->bmvStack[nBmv];<br>
+ bcost = bmvStack->bmvCostStack[nBmv];<br>
<br>
for (int i = 1; i <= wl.hpel_dirs; i++)<br>
{<br>
@@ -1213,18 +1210,18 @@<br>
}<br>
<br>
bmv += square1[bdir];<br>
- bmvStack[nBmv] = bmv;<br>
- bmvCostStack[nBmv] = bcost;<br>
+ bmvStack->bmvStack[nBmv] = bmv;<br>
+ bmvStack->bmvCostStack[nBmv] = bcost;<br>
}<br>
<br>
- bmv = bmvStack[0];<br>
- bcost = bmvCostStack[0];<br>
- for (int i=1; i<maxNumBmv; i++)<br>
+ bmv = bmvStack->bmvStack[0];<br>
+ bcost = bmvStack->bmvCostStack[0];<br>
+ for (int i=1; i<bmvStack->maxNumBmv; i++)<br>
{<br>
- if (bmvCostStack[i]<bcost)<br>
+ if (bmvStack->bmvCostStack[i]<<wbr>bcost)<br>
{<br>
- bmv = bmvStack[i];<br>
- bcost = bmvCostStack[i];<br>
+ bmv = bmvStack->bmvStack[i];<br>
+ bcost = bmvStack->bmvCostStack[i];<br>
}<br>
}<br>
}<br>
@@ -1232,10 +1229,10 @@<br>
{<br>
pixelcmp_t hpelcomp;<br>
<br>
- for (int nBmv=0; nBmv<maxNumBmv; nBmv++)<br>
+ for (int nBmv=0; nBmv<bmvStack->maxNumBmv; nBmv++)<br>
{<br>
- bmv = bmvStack[nBmv];<br>
- bcost = bmvCostStack[nBmv];<br>
+ bmv = bmvStack->bmvStack[nBmv];<br>
+ bcost = bmvStack->bmvCostStack[nBmv];<br>
<br>
if (wl.hpel_satd)<br>
{<br>
@@ -1281,18 +1278,18 @@<br>
break;<br>
}<br>
<br>
- bmvStack[nBmv] = bmv;<br>
- bmvCostStack[nBmv] = bcost;<br>
+ bmvStack->bmvStack[nBmv] = bmv;<br>
+ bmvStack->bmvCostStack[nBmv] = bcost;<br>
}<br>
<br>
- bmv = bmvStack[0];<br>
- bcost = bmvCostStack[0];<br>
- for (int i=1; i<maxNumBmv; i++)<br>
+ bmv = bmvStack->bmvStack[0];<br>
+ bcost = bmvStack->bmvCostStack[0];<br>
+ for (int i=1; i<bmvStack->maxNumBmv; i++)<br>
{<br>
- if (bmvCostStack[i]<bcost)<br>
+ if (bmvStack->bmvCostStack[i]<<wbr>bcost)<br>
{<br>
- bmv = bmvStack[i];<br>
- bcost = bmvCostStack[i];<br>
+ bmv = bmvStack->bmvStack[i];<br>
+ bcost = bmvStack->bmvCostStack[i];<br>
}<br>
}<br>
}<br>
diff -r f46e843a27cb -r 340dd470d7eb source/encoder/motion.h<br>
--- a/source/encoder/motion.h Fri Aug 05 17:02:17 2016 +0530<br>
+++ b/source/encoder/motion.h Sun Aug 07 11:34:50 2016 +0530<br>
@@ -34,6 +34,15 @@<br>
namespace X265_NS {<br>
// private x265 namespace<br>
<br>
+#define MAX_NUM_BESTVECTORS (16)<br>
+<br>
+typedef struct _BmvStack<br>
+{<br>
+ MV bmvStack[MAX_NUM_BESTVECTORS];<br>
+ int bmvCostStack[MAX_NUM_<wbr>BESTVECTORS];<br>
+ int maxNumBmv;<br>
+}BmvStack;<br>
+<br>
class MotionEstimate : public BitCost<br>
{<br>
protected:<br>
@@ -101,9 +110,7 @@<br>
const MV & mvmax,<br>
MV & bmv,<br>
int & bcost,<br>
- MV *bmvStack,<br>
- int *bCostStack,<br>
- int maxNumBmv,<br>
+ BmvStack *bmvStack,<br>
int & bPointNr,<br>
int & bDistance,<br>
int earlyExitIters,<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div>Principal Architect and Director,</div><div>TriSpace Technologies Pvt Ltd.,</div><div><span style="font-size:12.8000001907349px">Bangalore</span><br></div><div><span style="font-size:12.8000001907349px"><br></span></div><div><span style="font-size:12.8px">CONFIDENTIALITY NOTE : The information in this e-mail is confidential and privileged; it is intended for use solely by the individual or entity named as the recipient hereof. Disclosure, copying, distribution, or use of the contents of this e-mail by persons other than the intended recipient is strictly prohibited and may violate applicable laws. If you have received this e-mail in error, please delete the original message and notify us by return email or collect call immediately. Thank you. TriSpace Technologies Pvt. Ltd.</span><span style="font-size:12.8000001907349px"><br></span></div><div><span style="font-size:12.8px"><br></span></div></div></div></div></div></div></div>
</div></div>