<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Sep 27, 2013 at 7:45 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 1380285873 -19800<br>
#      Fri Sep 27 18:14:33 2013 +0530<br>
# Node ID 0cc42fd8c556e317ef6d5adaa407f372576bfe2d<br>
# Parent  4014edcf215747ba4ac8147b1168f8edc6f5d64c<br>
Generating weighted full-pels in compressCTURows<br>
<br>
We are re-enabling weightP after introduction of frame parallelism. Not yet using the weighted pixels.<br>
<br>
diff -r 4014edcf2157 -r 0cc42fd8c556 source/common/reference.cpp<br>
--- a/source/common/reference.cpp       Fri Sep 27 02:18:36 2013 -0500<br>
+++ b/source/common/reference.cpp       Fri Sep 27 18:14:33 2013 +0530<br>
@@ -24,6 +24,7 @@<br>
<br>
 #include "TLibCommon/TypeDef.h"<br>
 #include "TLibCommon/TComPicYuv.h"<br>
+#include "TLibCommon/TComPic.h"<br>
 #include "TLibCommon/TComSlice.h"<br>
 #include "primitives.h"<br>
 #include "reference.h"<br>
@@ -57,6 +58,8 @@<br>
     lumaStride = pic->getStride();<br>
     m_startPad = pic->m_lumaMarginY * lumaStride + pic->m_lumaMarginX;<br>
     m_next = NULL;<br>
+    isWeighted = false;<br>
+    numWghtdRows = 0;<br>
<br>
     if (w)<br>
     {<br>
@@ -78,5 +81,67 @@<br>
 MotionReference::~MotionReference()<br>
 {<br>
     if (isWeighted)<br>
-        X265_FREE(fpelPlane);<br>
+        X265_FREE(fpelPlane - m_startPad);<br>
 }<br>
+<br>
+void MotionReference::applyWeight(TComPic* ref, int rows)<br>
+{<br>
+    TComPicYuv* pic = ref->getPicYuvRec();<br>
+    pixel *src = (pixel*) pic->getLumaAddr();<br>
+    pixel *dst = fpelPlane;<br>
+    int marginX = pic->m_lumaMarginX;<br>
+    int marginY = pic->m_lumaMarginY;<br>
+<br>
+    int width = pic->getWidth();<br>
+    int height = ((rows - numWghtdRows) * g_maxCUHeight);<br>
+    if (rows == m_numRows - 1) height = ((pic->getHeight() % g_maxCUHeight) ? (pic->getHeight() % g_maxCUHeight) : g_maxCUHeight);<br>
+<br>
+    size_t dstStride = lumaStride;<br>
+<br>
+    // Computing weighted CU rows<br>
+    int shiftNum = IF_INTERNAL_PREC - X265_DEPTH;<br>
+    shift = shift + shiftNum;<br>
+    round = shift ? (1 << (shift - 1)) : 0;<br>
+<br>
+    int x, y;<br>
+    for (y = height - 1; y >= numWghtdRows * (int)g_maxCUHeight; y--)<br></blockquote><div><br></div><div>height - 1 looks a little fishy</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>
+        for (x = width - 1; x >= 0; )<br>
+        {<br>
+            // note: luma min width is 4<br>
+            dst[x] = (pixel)Clip3(0, ((1 << X265_DEPTH) - 1), ((weight * (src[x] + IF_INTERNAL_OFFS) + round) >> shift) + offset);<br>
+            x--;<br>
+            dst[x] = (pixel)Clip3(0, ((1 << X265_DEPTH) - 1), ((weight * (src[x] + IF_INTERNAL_OFFS) + round) >> shift) + offset);<br>
+            x--;<br>
+        }<br>
+<br>
+        src += lumaStride;<br>
+        dst += dstStride;<br>
+    }<br></blockquote><div><br></div><div>we have a primitive for this, don't we?  I'm pretty sure there needs to be a cast of the pixel to uint16_t prior to multiplying and rounding.</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>
+    // Extending Left & Right<br>
+    primitives.extendRowBorder(fpelPlane, dstStride, width, height, marginX);<br>
+<br>
+    // Extending Above<br>
+    if (numWghtdRows == 0)<br>
+    {<br>
+        pixel *pixY = fpelPlane - marginX;<br>
+<br>
+        for (int y = 0; y < marginY; y++)<br>
+        {<br>
+            memcpy(pixY - (y + 1) * dstStride, pixY, dstStride * sizeof(pixel));<br>
+        }<br>
+    }<br>
+<br>
+    // Extending Bottom<br>
+    if (rows == (m_numRows - 1))<br>
+    {<br>
+        pixel *pixY = fpelPlane - marginX + (pic->getHeight() - 1) * dstStride;<br>
+<br>
+        for (int y = 0; y < marginY; y++)<br>
+        {<br>
+            memcpy(pixY + (y + 1) * dstStride, pixY, dstStride * sizeof(pixel));<br>
+        }<br>
+    }<br>
+    numWghtdRows = rows;<br>
+}<br>
\ No newline at end of file<br></blockquote><div><br></div><div>newline</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">

diff -r 4014edcf2157 -r 0cc42fd8c556 source/common/reference.h<br>
--- a/source/common/reference.h Fri Sep 27 02:18:36 2013 -0500<br>
+++ b/source/common/reference.h Fri Sep 27 18:14:33 2013 +0530<br>
@@ -30,6 +30,7 @@<br>
 // private x265 namespace<br>
<br>
 class TComPicYuv;<br>
+class TComPic;<br>
 struct WpScalingParam;<br>
 typedef WpScalingParam wpScalingParam;<br>
<br>
@@ -60,8 +61,13 @@<br>
<br>
     ~MotionReference();<br>
<br>
+    void applyWeight(TComPic* src, int rows);<br>
+    void extendRow(TComPic* pic, int row);<br>
+<br>
     MotionReference *m_next;<br>
     TComPicYuv      *m_reconPic;<br>
+    int              numWghtdRows;<br></blockquote><div><br></div><div>follow convention, this member variable needs an m_ prefix.  I'll sell you a few vowels to finish spelling the word weighted. :)</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">
+    int              m_numRows; </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">
<br>
 protected:<br>
<br>
diff -r 4014edcf2157 -r 0cc42fd8c556 source/encoder/frameencoder.cpp<br>
--- a/source/encoder/frameencoder.cpp   Fri Sep 27 02:18:36 2013 -0500<br>
+++ b/source/encoder/frameencoder.cpp   Fri Sep 27 18:14:33 2013 +0530<br>
@@ -914,6 +914,11 @@<br>
                     {<br>
                         refpic->m_reconRowWait.wait();<br>
                     }<br>
+                    if(slice->getPPS()->getUseWP())<br>
+                    {<br>
+                        slice->m_mref[list][ref]->m_numRows = m_numRows;<br></blockquote><div><br></div><div>num rows should be initialized at setup, or just passed to applyWeight() and don't keep it as a member variable</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">
+                        slice->m_mref[list][ref]->applyWeight(refpic, row + refLagRows);<br>
+                    }<br>
                 }<br>
             }<br>
<br>
diff -r 4014edcf2157 -r 0cc42fd8c556 source/x265opts.h<br>
--- a/source/x265opts.h Fri Sep 27 02:18:36 2013 -0500<br>
+++ b/source/x265opts.h Fri Sep 27 18:14:33 2013 +0530<br>
@@ -69,8 +69,8 @@<br>
 OPT("ref",             param->maxNumReferences,       required_argument, 0, "max number of L0 references to be allowed  (1 .. 16)")<br>
 // Disabled because weighted uni-prediction was busted by not using<br>
 // pre-generated planes in motion compensation<br>
-//OPT("no-weightp",      param->bEnableWeightedPred,          no_argument, 0, "Disable weighted prediction in P slices")<br>
-//OPT("weightp",         param->bEnableWeightedPred,          no_argument, 'w', "Enable weighted prediction in P slices")<br>
+OPT("no-weightp",      param->bEnableWeightedPred,          no_argument, 0, "Disable weighted prediction in P slices")<br>
+OPT("weightp",         param->bEnableWeightedPred,          no_argument, 'w', "Enable weighted prediction in P slices")<br>
 // Disabled because weighted bi prediction is busted<br>
 //OPT("no-weightbp",     param->bEnableWeightedBiPred,        no_argument, 0, "Disable weighted (bidirectional) prediction in B slices")<br>
 //OPT("weightbp",        param->bEnableWeightedBiPred,        no_argument, 0, "Enable weighted (bidirectional) prediction in B slices")<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>