<div>The second line of the test output in each cases is before applying the patch, the third line is after applying the patch, we can get that no BDRATE loss in my test cases, and when the output bit-rate is smaller, the more speed up gain we will get.</div><div><br></div><div>BasketballDrive_1920x1080_50.yuv --frames 500 --fps 50 --input-res 1920x1080 --keyint 0 -o test.265</div><div>encoded 500 frames in 261.10s (1.91 fps), 10683.10 kb/s, Avg QP:35.21</div><div>encoded 500 frames in 254.14s (1.97 fps), 10683.10 kb/s, Avg QP:35.21</div><div><br></div><div>BasketballDrive_1920x1080_50.yuv --frames 500 --bitrate 2048 --fps 50 --input-res 1920x1080 --keyint 0 -o test.265</div><div>encoded 500 frames in 202.13s (2.47 fps), 2059.03 kb/s, Avg QP:48.72</div><div>encoded 500 frames in 162.09s (3.08 fps), 2059.03 kb/s, Avg QP:48.72</div><div><br></div><div>BasketballDrive_1920x1080_50.yuv --frames 500 --bitrate 1024 --fps 50 --input-res 1920x1080 --keyint 0 -o test.265</div><div>encoded 500 frames in 176.67s (2.83 fps), 1778.76 kb/s, Avg QP:50.93</div><div>encoded 500 frames in 103.88s (4.81 fps), 1778.76 kb/s, Avg QP:50.93</div><div><br></div><div>BasketballDrill_832x480_50.yuv --frames 500 --bitrate 1024 --fps 50 --input-res 832x480 --keyint 0 -o test.265</div><div>encoded 500 frames in 45.75s (10.93 fps), 1025.68 kb/s, Avg QP:46.18</div><div>encoded 500 frames in 41.50s (12.05 fps), 1025.68 kb/s, Avg QP:46.18</div><div><br></div><div>BasketballDrill_832x480_50.yuv --frames 500 --bitrate 2048 --fps 50 --input-res 832x480 --keyint 0 -o test.265</div><div>encoded 500 frames in 50.72s (9.86 fps), 2059.46 kb/s, Avg QP:41.22</div><div>encoded 500 frames in 49.03s (10.20 fps), 2059.46 kb/s, Avg QP:41.22</div><div><br></div><div>BasketballDrill_832x480_50.yuv --frames 500 --bitrate 4096 --fps 50 --input-res 832x480 --keyint 0 -o test.265</div><div>encoded 500 frames in 58.47s (8.55 fps), 4109.42 kb/s, Avg QP:35.65</div><div>encoded 500 frames in 56.16s (8.90 fps), 4109.42 kb/s, Avg QP:35.65</div><div><br></div><div>BQMall_832x480_60.yuv --frames 600 --bitrate 4096 --fps 60 --input-res 832x480 --keyint 0 -o test.265</div><div>encoded 600 frames in 63.68s (9.42 fps), 3927.55 kb/s, Avg QP:38.39</div><div>encoded 600 frames in 62.43s (9.61 fps), 3927.55 kb/s, Avg QP:38.39</div><div><br></div><div>BQMall_832x480_60.yuv --frames 600 --bitrate 2048 --fps 60 --input-res 832x480 --keyint 0 -o test.265</div><div>encoded 600 frames in 57.47s (10.44 fps), 2010.04 kb/s, Avg QP:43.65</div><div>encoded 600 frames in 53.77s (11.16 fps), 2010.04 kb/s, Avg QP:43.65</div><div><br></div><div>BQMall_832x480_60.yuv --frames 600 --bitrate 1024 --fps 60 --input-res 832x480 --keyint 0 -o test.265</div><div>encoded 600 frames in 51.82s (11.58 fps), 970.95 kb/s, Avg QP:49.04</div><div>encoded 600 frames in 43.71s (13.73 fps), 970.95 kb/s, Avg QP:49.04</div><div> </div><div><div><br></div><div><br></div><div style="font-size: 12px;font-family: Arial Narrow;padding:2px 0 2px 0;">------------------ 原始邮件 ------------------</div><div style="font-size: 12px;background:#efefef;padding:8px;"><div><b>发件人:</b> "Ximing Cheng";<chengximing1989@foxmail.com>;</div><div><b>发送时间:</b> 2017年7月22日(星期六) 中午11:57</div><div><b>收件人:</b> "Development for x265"<x265-devel@videolan.org>; <wbr></div><div></div><div><b>主题:</b> Re: [x265] [PATCH] intra: skip RD analysis when sum of subCUsplitcost bigger than non-split cost</div></div><div><br></div>
<style></style><div>I will give my test cases later, and I will add a ci option on this skip. As I was very busy on workdays, sorry for late.</div><div> </div><div><div style="font-size:12px;padding:2px 0;">---Original---</div><div style="font-size:12px;background:#f0f0f0;color:#212121;padding:8px!important;border-radius:4px;line-height:1.5;"><div><b>From:</b> "Tom Vaughan"<tom.vaughan@multicorewareinc.com></div><div><b>Date:</b> 2017/7/22 03:33:28</div><div><b>To:</b> "Development for x265"<x265-devel@videolan.org>;</div><div><b>Subject:</b> Re: [x265] [PATCH] intra: skip RD analysis when sum of sub CUsplitcost bigger than non-split cost</div></div><br>
<div class="WordSection1"><p class="MsoNormal">Ximing - thanks for your contribution!</p><p class="MsoNormal"> </p><p class="MsoNormal">Pradeep - This early decision optimization certainly looks like it has good potential to be a smart tradeoff for intermediate presets (like medium).   Sure, the test was only for 2 seconds of video, but for this test case we see a 10% performance gain with no loss of quality... so that’s very promising.  You’re right;  more testing is needed to fully understand the cost/benefit under a wide range of conditions.  Can we ask one of our engineers to run some tests?  </p><p class="MsoNormal"> </p><p class="MsoNormal">I also think we need to take the lead when it comes to naming CLI options and parameters.  Maybe --splitrdskip?</p><p class="MsoNormal"> </p><p class="MsoNormal">Thanks,</p><p class="MsoNormal">Tom</p><p class="MsoNormal"> </p><p class="MsoNormal"><b>From:</b> x265-devel [mailto:<a href="mailto:x265-devel-bounces@videolan.org">x265-devel-bounces@videolan.org</a>] <b>On Behalf Of </b>Pradeep Ramachandran<br><b>Sent:</b> Tuesday, July 18, 2017 10:10 AM<br><b>To:</b> Development for x265<br><b>Subject:</b> Re: [x265] [PATCH] intra: skip RD analysis when sum of sub CU splitcost bigger than non-split cost</p><p class="MsoNormal"> </p><div><div><p class="MsoNormal"> </p><div><p class="MsoNormal">On Fri, Jul 14, 2017 at 10:38 PM, Ximing Cheng <<a href="mailto:chengximing1989@foxmail.com" target="_blank">chengximing1989@foxmail.com</a>> wrote:</p><div><p class="MsoNormal">command line:</p></div><div><p class="MsoNormal">x265 --input BasketballDrive_1920x1080_50.yuv --input-res 1920x1080 --fps 50 --frames 100 --keyint 0 -o test.265</p></div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">before patch </p></div><div><p class="MsoNormal">encoded 100 frames in 57.28s (1.75 fps), 10496.03 kb/s, Avg QP:34.74</p></div><div><p class="MsoNormal">after patch</p></div><div><p class="MsoNormal">encoded 100 frames in 51.52s (1.94 fps), 10496.03 kb/s, Avg QP:34.74</p></div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">Thanks for your test data. Looks like this is an intra-only optimization. Could you please share more results with longer test sequences at different resolutions, if you have them? We can also run additional tests before considering this improvement if the results are more wide-spread.</p></div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">Also, please add a new param field and cli option that may be used to exercise this. It is always better to do this instead of affect default encodes with such performance optimizations. They param should be off by default, and if we can clearly see the benefits to <i>all possible encodes</i> for a given preset, then we can consider enabling that optimization for that given preset.</p></div><div><p class="MsoNormal"> </p></div><blockquote style="border-style: none none none solid; border-left-color: rgb(204, 204, 204); border-left-width: 1pt; padding: 0px 0px 0px 8px; margin: 0px 0px 0px 6.400000095367432px; color: rgb(149, 149, 149); background-color: rgb(245, 246, 250);"><div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">------------------ Original ------------------</p></div><div><div><p class="MsoNormal" style="background:#efefef"><b>From: </b> "Ximing Cheng";<<a href="mailto:chengximing1989@foxmail.com" target="_blank">chengximing1989@foxmail.com</a>>;</p></div><div><p class="MsoNormal" style="background:#efefef"><b>Send time:</b> Saturday, Jul 15, 2017 1:07 AM</p></div><div><p class="MsoNormal" style="background:#efefef"><b>To:</b> "x265-devel"<<a href="mailto:x265-devel@videolan.org" target="_blank">x265-devel@videolan.org</a>>; </p></div><div><p class="MsoNormal" style="background:#efefef"><b>Subject: </b> [x265] [PATCH] intra: skip RD analysis when sum of sub CU splitcost bigger than non-split cost</p></div></div><div><div><div><p class="MsoNormal"> </p></div><p class="MsoNormal"># HG changeset patch<br># User Ximing Cheng <<a href="mailto:ximingcheng@tencent.com" target="_blank">ximingcheng@tencent.com</a>><br># Date 1500052036 -28800<br>#      Sat Jul 15 01:07:16 2017 +0800<br># Node ID 9c2e9f6c6ee73e75b94c2e52f85a64bca628baf0<br># Parent  3f6841d271e36dc324936f09846d1f2cb77c63e5<br>intra: skip RD analysis when sum of sub CU split cost bigger than non-split cost<br>This patch will speed up all intra case with almost no BDRATE loss<br><br>diff -r 3f6841d271e3 -r 9c2e9f6c6ee7 source/encoder/analysis.cpp<br>--- a/source/encoder/analysis.cpp Wed Jun 28 10:44:19 2017 +0530<br>+++ b/source/encoder/analysis.cpp Sat Jul 15 01:07:16 2017 +0800<br>@@ -485,7 +485,7 @@<br>     md.bestMode->reconYuv.copyToPicYuv(*m_frame->m_reconPic, parentCTU.m_cuAddr, cuGeom.absPartIdx);<br> }<br> <br>-void Analysis::compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp)<br>+uint64_t Analysis::compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp)<br> {<br>     uint32_t depth = cuGeom.depth;<br>     ModeDepth& md = m_modeDepth[depth];<br>@@ -561,6 +561,9 @@<br>         Entropy* nextContext = &m_rqt[depth].cur;<br>         int32_t nextQP = qp;<br> <br>+        uint64_t curCost = 0;<br>+        int skipSplitCheck = 0;<br>+<br>         for (uint32_t subPartIdx = 0; subPartIdx < 4; subPartIdx++)<br>         {<br>             const CUGeom& childGeom = *(&cuGeom + cuGeom.childOffset + subPartIdx);<br>@@ -572,7 +575,12 @@<br>                 if (m_slice->m_pps->bUseDQP && nextDepth <= m_slice->m_pps->maxCuDQPDepth)<br>                     nextQP = setLambdaFromQP(parentCTU, calculateQpforCuSize(parentCTU, childGeom));<br> <br>-                compressIntraCU(parentCTU, childGeom, nextQP);<br>+                curCost += compressIntraCU(parentCTU, childGeom, nextQP);<br>+                if (m_modeDepth[depth].bestMode && curCost > m_modeDepth[depth].bestMode->rdCost)<br>+                {<br>+                    skipSplitCheck = 1;<br>+                    break;<br>+                }<br> <br>                 // Save best CU and pred data for this sub CU<br>                 splitCU->copyPartFrom(nd.bestMode->cu, childGeom, subPartIdx);<br>@@ -590,14 +598,18 @@<br>                     memset(parentCTU.m_cuDepth + childGeom.absPartIdx, 0, childGeom.numPartitions);<br>             }<br>         }<br>-        nextContext->store(splitPred->contexts);<br>-        if (mightNotSplit)<br>-            addSplitFlagCost(*splitPred, cuGeom.depth);<br>-        else<br>-            updateModeCost(*splitPred);<br>-<br>-        checkDQPForSplitPred(*splitPred, cuGeom);<br>-        checkBestMode(*splitPred, depth);<br>+<br>+        if (!skipSplitCheck)<br>+        {<br>+            nextContext->store(splitPred->contexts);<br>+            if (mightNotSplit)<br>+                addSplitFlagCost(*splitPred, cuGeom.depth);<br>+            else<br>+                updateModeCost(*splitPred);<br>+<br>+            checkDQPForSplitPred(*splitPred, cuGeom);<br>+            checkBestMode(*splitPred, depth);<br>+        }<br>     }<br> <br>     if (m_param->bEnableRdRefine && depth <= m_slice->m_pps->maxCuDQPDepth)<br>@@ -620,6 +632,8 @@<br>     md.bestMode->cu.copyToPic(depth);<br>     if (md.bestMode != &md.pred[PRED_SPLIT])<br>         md.bestMode->reconYuv.copyToPicYuv(*m_frame->m_reconPic, parentCTU.m_cuAddr, cuGeom.absPartIdx);<br>+<br>+    return md.bestMode->rdCost;<br> }<br> <br> void Analysis::PMODE::processTasks(int workerThreadId)<br>diff -r 3f6841d271e3 -r 9c2e9f6c6ee7 source/encoder/analysis.h<br>--- a/source/encoder/analysis.h Wed Jun 28 10:44:19 2017 +0530<br>+++ b/source/encoder/analysis.h Sat Jul 15 01:07:16 2017 +0800<br>@@ -145,7 +145,7 @@<br>     void qprdRefine(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp, int32_t lqp);<br> <br>     /* full analysis for an I-slice CU */<br>-    void compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp);<br>+    uint64_t compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp);<br> <br>     /* full analysis for a P or B slice CU */<br>     uint32_t compressInterCU_dist(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp);<br><br><br>_______________________________________________<br>x265-devel mailing list<br><a href="mailto:x265-devel@videolan.org" target="_blank">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></p></div></div></div><p class="MsoNormal" style="margin-bottom:12.0pt"><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></p></blockquote></div><p class="MsoNormal"> </p></div></div></div>

</div></div>