<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Nov 12, 2013 at 5:49 AM,  <span dir="ltr"><<a href="mailto:shazeb@multicorewareinc.com" target="_blank">shazeb@multicorewareinc.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"># HG changeset patch<br>
# User Shazeb Nawaz Khan <<a href="mailto:shazeb@multicorewareinc.com">shazeb@multicorewareinc.com</a>><br>
# Date 1384256810 -19800<br>
#      Tue Nov 12 17:16:50 2013 +0530<br>
# Node ID 37998a9d21f35a85b7328b514bda337a99b1b831<br>
# Parent  21596a519ba8cc521dbc81f693c867cbca03fd3f<br>
Using weighted lowres ref frames in cost estimation in lookahead<br>
<br>
diff -r 21596a519ba8 -r 37998a9d21f3 source/common/lowres.cpp<br>
--- a/source/common/lowres.cpp  Tue Nov 12 17:07:27 2013 +0530<br>
+++ b/source/common/lowres.cpp  Tue Nov 12 17:16:50 2013 +0530<br>
@@ -40,6 +40,7 @@<br>
     int cuWidth = (width + X265_LOWRES_CU_SIZE - 1) >> X265_LOWRES_CU_BITS;<br>
     int cuHeight = (lines + X265_LOWRES_CU_SIZE - 1) >> X265_LOWRES_CU_BITS;<br>
     int cuCount = cuWidth * cuHeight;<br>
+    bufferSize = lumaStride * (lines + 2 * orig->getLumaMarginY());<br>
<br>
     /* rounding the width to multiple of lowres CU size */<br>
     width = cuWidth * X265_LOWRES_CU_SIZE;<br>
@@ -115,6 +116,51 @@<br>
     X265_FREE(invQscaleFactor);<br>
 }<br>
<br>
+void Lowres::initWeighted(Lowres *ref, int bframes, wpScalingParam *w)<br>
+{<br>
+    bScenecut = true;<br>
+    bIntraCalculated = false;<br>
+    bLastMiniGopBFrame = false;<br>
+    bKeyframe = false; // Not a keyframe unless identified by lookahead<br>
+    sliceType = ref->sliceType;<br>
+    frameNum = ref->frameNum;<br>
+    leadingBframes = 0;<br>
+    satdCost = -1;<br>
+    isWeighted = true;<br></blockquote><div><br></div><div>it should not be necessary to initialize any of these cost fields.  The actual fref0 lowres structure should be used for all of that data, this weighted lowres struct is only passed to motion search</div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
+    memset(costEst, -1, sizeof(costEst));<br>
+<br>
+    if (qpAqOffset && invQscaleFactor)<br>
+        memset(costEstAq, -1, sizeof(costEstAq));<br>
+<br>
+    for (int y = 0; y < bframes + 2; y++)<br>
+    {<br>
+        for (int x = 0; x < bframes + 2; x++)<br>
+        {<br>
+            rowSatds[y][x][0] = -1;<br>
+        }<br>
+    }<br>
+<br>
+    for (int i = 0; i < bframes + 1; i++)<br>
+    {<br>
+        lowresMvs[0][i][0].x = 0x7FFF;<br>
+        lowresMvs[1][i][0].x = 0x7FFF;<br>
+    }<br>
+<br>
+    for (int i = 0; i < bframes + 2; i++)<br>
+    {<br>
+        intraMbs[i] = 0;<br>
+    }<br>
+<br>
+    int corection = (IF_INTERNAL_PREC - X265_DEPTH);<br></blockquote><div><br></div><div>correction</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

+    for(int i = 0; i < 4; i++)<br></blockquote><div>white-space </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

+    {<br>
+        //Adding (IF_INTERNAL_PREC - X265_DEPTH) to cancel effect of pixel to short conversion inside the primitive<br>
+        primitives.weightpUniPixel(ref->buffer[i], this->buffer[i], lumaStride, lumaStride, lumaStride, (int) bufferSize / lumaStride, w->inputWeight, (1<<(w->log2WeightDenom - 1 + corection)), (w->log2WeightDenom + corection), w->inputOffset);<br>

+    }<br>
+<br>
+    fpelPlane = lowresPlane[0];<br>
+}<br>
+<br>
 // (re) initialize lowres state<br>
 void Lowres::init(TComPicYuv *orig, int poc, int type, int bframes)<br>
 {<br>
@@ -126,6 +172,7 @@<br>
     frameNum = poc;<br>
     leadingBframes = 0;<br>
     satdCost = -1;<br>
+    isWeighted = false;<br></blockquote><div>unnecessary </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
     memset(costEst, -1, sizeof(costEst));<br>
<br>
     if (qpAqOffset && invQscaleFactor)<br>
diff -r 21596a519ba8 -r 37998a9d21f3 source/common/lowres.h<br>
--- a/source/common/lowres.h    Tue Nov 12 17:07:27 2013 +0530<br>
+++ b/source/common/lowres.h    Tue Nov 12 17:16:50 2013 +0530<br>
@@ -26,6 +26,7 @@<br>
<br>
 #include "primitives.h"<br>
 #include "common.h"<br>
+#include "Lib\TLibCommon\TComSlice.h"<br></blockquote><div>Lib\ unnecessary, back-slashes are not allowed in include statements (it breaks Unix compiles)</div><div><br></div><div>and in any event you should be just forward-declaring this WP struct anyway</div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
 #include "mv.h"<br>
<br>
 namespace x265 {<br>
@@ -100,6 +101,7 @@<br>
 struct Lowres : public ReferencePlanes<br>
 {<br>
     pixel *buffer[4];<br>
+    int bufferSize;<br></blockquote><div><br></div><div>this looks unused</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<br>
     int    frameNum;         // Presentation frame number<br>
     int    sliceType;        // Slice type decided by lookahead<br>
@@ -132,6 +134,7 @@<br>
     void create(TComPic *pic, int bframes, int32_t *aqMode);<br>
     void destroy(int bframes);<br>
     void init(TComPicYuv *orig, int poc, int sliceType, int bframes);<br>
+    void initWeighted(Lowres *ref, int bframes, wpScalingParam *w);<br>
 };<br>
 }<br>
<br>
diff -r 21596a519ba8 -r 37998a9d21f3 source/encoder/slicetype.cpp<br>
--- a/source/encoder/slicetype.cpp      Tue Nov 12 17:07:27 2013 +0530<br>
+++ b/source/encoder/slicetype.cpp      Tue Nov 12 17:16:50 2013 +0530<br>
@@ -79,17 +79,23 @@<br>
     widthInCU = ((cfg->param.sourceWidth / 2) + X265_LOWRES_CU_SIZE - 1) >> X265_LOWRES_CU_BITS;<br>
     heightInCU = ((cfg->param.sourceHeight / 2) + X265_LOWRES_CU_SIZE - 1) >> X265_LOWRES_CU_BITS;<br>
<br></blockquote><div> </div><div>why malloc this struct?  can't it be a normal data member? </div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
+    weightedRef = new Lowres();<br>
+    weightedRef->buffer[0] = NULL;<br>
+<br>
     lhrows = new LookaheadRow[heightInCU];<br>
     for (int i = 0; i < heightInCU; i++)<br>
     {<br>
         lhrows[i].widthInCU = widthInCU;<br>
         lhrows[i].heightInCU = heightInCU;<br>
         lhrows[i].frames = frames;<br>
+        lhrows[i].weightedRef = weightedRef;<br>
+        lhrows[i].cfg = cfg;<br>
     }<br>
 }<br>
<br>
 Lookahead::~Lookahead()<br>
 {<br>
+    delete weightedRef;<br>
 }<br>
<br>
 void Lookahead::init()<br>
@@ -128,6 +134,12 @@<br>
 {<br>
     pic->m_lowres.init(pic->getPicYuvOrg(), pic->getSlice()->getPOC(), sliceType, cfg->param.bframes);<br>
<br>
+    if( weightedRef->buffer[0] == NULL)<br></blockquote><div> </div><div>white-space</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

+    {<br>
+        // Just using width/height data from the pic to create a standalone Lowres object<br>
+        weightedRef->create(pic, cfg->param.bframes, &cfg->param.rc.aqMode);<br>
+    }<br>
+<br>
     inputQueue.pushBack(*pic);<br>
     if (inputQueue.size() >= cfg->param.lookaheadDepth)<br>
         slicetypeDecide();<br>
@@ -537,6 +549,14 @@<br>
                 wp.bPresentFlag = false;<br>
                 wp.inputWeight = 0;<br>
                 weightsAnalyse(b, p0, 1, &wp);<br>
+                if(wp.bPresentFlag)<br></blockquote><div>white-space </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

+                {<br>
+                    weightedRef->initWeighted(frames[p0], cfg->param.bframes, &wp);<br>
+                }<br></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">+                else<br>

+                {<br>
+                    weightedRef->isWeighted = false;<br>
+                }<br>
             }<br>
         bDoSearch[0] = b != p0 && fenc->lowresMvs[0][b - p0 - 1][0].x == 0x7FFF;<br>
         bDoSearch[1] = b != p1 && fenc->lowresMvs[1][p1 - b - 1][0].x == 0x7FFF;<br>
@@ -627,6 +647,11 @@<br>
     Lowres *fref1 = frames[p1];<br>
     Lowres *fenc  = frames[b];<br>
<br>
+    if (cfg->param.bEnableWeightedPred && weightedRef->isWeighted)<br></blockquote><div><br></div><div>checking cfg->param.bEnableWeightedPred is unnecessary</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

+    {<br>
+        fref0 = weightedRef;<br>
+    }<br>
+<br>
     const int bBidir = (b < p1);<br>
     const int cuXY = cux + cuy * widthInCU;<br>
     const int cuSize = X265_LOWRES_CU_SIZE;<br>
_______________________________________________<br>
x265-devel mailing list<br>
<a href="mailto:x265-devel@videolan.org">x265-devel@videolan.org</a><br>
<a href="https://mailman.videolan.org/listinfo/x265-devel" target="_blank">https://mailman.videolan.org/listinfo/x265-devel</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>Steve Borho
</div></div>