<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Oct 27, 2015 at 11:21 AM,  <span dir="ltr"><<a href="mailto:kavitha@multicorewareinc.com" target="_blank">kavitha@multicorewareinc.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 Kavitha Sampath <<a href="mailto:kavitha@multicorewareinc.com">kavitha@multicorewareinc.com</a>><br>
# Date 1445610049 -19800<br>
#      Fri Oct 23 19:50:49 2015 +0530<br>
# Node ID 3bcefff74b44d78c65456ecff25ef10b8a710283<br>
# Parent  6563218ce342c30bfd4f9bc172a1dab510e6e55b<br>
Add optional parameter to setLambdaFromQP and calculateQpForCUSize functions<br>
<br>
Inaddition, the zOrder is no more passed explicitly to compressIntraCU(),<br>
instead used implicitly from cuGeom. This commit forms groundwork for<br>
QP based RD refinement.<br>
<br>
diff -r 6563218ce342 -r 3bcefff74b44 source/encoder/analysis.cpp<br>
--- a/source/encoder/analysis.cpp       Mon Oct 26 12:13:53 2015 +0530<br>
+++ b/source/encoder/analysis.cpp       Fri Oct 23 19:50:49 2015 +0530<br>
@@ -147,7 +147,6 @@<br>
<br>
     ProfileCUScope(ctu, totalCTUTime, totalCTUs);<br>
<br>
-    uint32_t zOrder = 0;<br>
     if (m_slice->m_sliceType == I_SLICE)<br>
     {<br>
         analysis_intra_data* intraDataCTU = (analysis_intra_data*)m_frame->m_analysisData.intraData;<br>
@@ -158,7 +157,7 @@<br>
             memcpy(ctu.m_partSize, &intraDataCTU->partSizes[ctu.m_cuAddr * numPartition], sizeof(char) * numPartition);<br>
             memcpy(ctu.m_chromaIntraDir, &intraDataCTU->chromaModes[ctu.m_cuAddr * numPartition], sizeof(uint8_t) * numPartition);<br>
         }<br>
-        compressIntraCU(ctu, cuGeom, zOrder, qp);<br>
+        compressIntraCU(ctu, cuGeom, qp);<br>
         if (m_param->analysisMode == X265_ANALYSIS_SAVE && intraDataCTU)<br>
         {<br>
             CUData* bestCU = &m_modeDepth[0].bestMode->cu;<br>
@@ -173,7 +172,7 @@<br>
         if (m_param->bIntraRefresh && m_slice->m_sliceType == P_SLICE &&<br>
             ctu.m_cuPelX / g_maxCUSize >= frame.m_encData->m_pir.pirStartCol<br>
             && ctu.m_cuPelX / g_maxCUSize < frame.m_encData->m_pir.pirEndCol)<br>
-            compressIntraCU(ctu, cuGeom, zOrder, qp);<br>
+            compressIntraCU(ctu, cuGeom, qp);<br>
         else if (!m_param->rdLevel)<br>
         {<br>
             /* In RD Level 0/1, copy source pixels into the reconstructed block so<br>
@@ -191,6 +190,7 @@<br>
             compressInterCU_rd0_4(ctu, cuGeom, qp);<br>
         else<br>
         {<br>
+            uint32_t zOrder = 0;<br>
             compressInterCU_rd5_6(ctu, cuGeom, zOrder, qp);<br>
             if (m_param->analysisMode == X265_ANALYSIS_SAVE && m_frame->m_analysisData.interData)<br>
             {<br>
@@ -229,7 +229,7 @@<br>
     }<br>
 }<br>
<br>
-void Analysis::compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, uint32_t& zOrder, int32_t qp)<br>
+void 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>
@@ -306,7 +306,7 @@<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, zOrder, nextQP);<br>
+                compressIntraCU(parentCTU, childGeom, nextQP);<br>
<br>
                 // Save best CU and pred data for this sub CU<br>
                 splitCU->copyPartFrom(nd.bestMode->cu, childGeom, subPartIdx);<br>
@@ -318,7 +318,6 @@<br>
             {<br>
                 /* record the depth of this non-present sub-CU */<br>
                 splitCU->setEmptyPart(childGeom, subPartIdx);<br>
-                zOrder += g_depthInc[g_maxCUDepth - 1][nextDepth];<br>
             }<br>
         }<br>
         nextContext->store(splitPred->contexts);<br>
@@ -2145,10 +2144,10 @@<br>
     return false;<br>
 }<br>
<br>
-int Analysis::calculateQpforCuSize(const CUData& ctu, const CUGeom& cuGeom)<br>
+int Analysis::calculateQpforCuSize(const CUData& ctu, const CUGeom& cuGeom, double baseQp)<br>
 {<br>
     FrameData& curEncData = *m_frame->m_encData;<br>
-    double qp = curEncData.m_cuStat[ctu.m_cuAddr].baseQp;<br>
+    double qp = baseQp ? baseQp : curEncData.m_cuStat[ctu.m_cuAddr].baseQp;<br>
<br>
     /* Use cuTree offsets if cuTree enabled and frame is referenced, else use AQ offsets */<br>
     bool isReferenced = IS_REFERENCED(m_frame);<br>
diff -r 6563218ce342 -r 3bcefff74b44 source/encoder/analysis.h<br>
--- a/source/encoder/analysis.h Mon Oct 26 12:13:53 2015 +0530<br>
+++ b/source/encoder/analysis.h Fri Oct 23 19:50:49 2015 +0530<br>
@@ -111,7 +111,7 @@<br>
     uint32_t m_splitRefIdx[4];<br>
<br>
     /* full analysis for an I-slice CU */<br>
-    void compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, uint32_t &zOrder, int32_t qp);<br>
+    void 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>
@@ -141,7 +141,7 @@<br>
     /* generate residual and recon pixels for an entire CTU recursively (RD0) */<br>
     void encodeResidue(const CUData& parentCTU, const CUGeom& cuGeom);<br>
<br>
-    int calculateQpforCuSize(const CUData& ctu, const CUGeom& cuGeom);<br>
+    int calculateQpforCuSize(const CUData& ctu, const CUGeom& cuGeom, double baseQP = 0);<br>
<br></blockquote><div>I set this to -1, in order to not screw up lossless/QP=0 encodes. LGTM, otherwise<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
     /* check whether current mode is the new best */<br>
     inline void checkBestMode(Mode& mode, uint32_t depth)<br>
diff -r 6563218ce342 -r 3bcefff74b44 source/encoder/search.cpp<br>
--- a/source/encoder/search.cpp Mon Oct 26 12:13:53 2015 +0530<br>
+++ b/source/encoder/search.cpp Fri Oct 23 19:50:49 2015 +0530<br>
@@ -164,12 +164,12 @@<br>
     X265_FREE(m_tsRecon);<br>
 }<br>
<br>
-int Search::setLambdaFromQP(const CUData& ctu, int qp)<br>
+int Search::setLambdaFromQP(const CUData& ctu, int qp, int lambdaQp)<br>
 {<br>
     X265_CHECK(qp >= QP_MIN && qp <= QP_MAX_MAX, "QP used for lambda is out of range\n");<br>
<br>
     m_me.setQP(qp);<br>
-    m_rdCost.setQP(*m_slice, qp);<br>
+    m_rdCost.setQP(*m_slice, lambdaQp < 0 ? qp : lambdaQp);<br>
<br>
     int quantQP = x265_clip3(QP_MIN, QP_MAX_SPEC, qp);<br>
     m_quant.setQPforQuant(ctu, quantQP);<br>
diff -r 6563218ce342 -r 3bcefff74b44 source/encoder/search.h<br>
--- a/source/encoder/search.h   Mon Oct 26 12:13:53 2015 +0530<br>
+++ b/source/encoder/search.h   Fri Oct 23 19:50:49 2015 +0530<br>
@@ -279,7 +279,7 @@<br>
     ~Search();<br>
<br>
     bool     initSearch(const x265_param& param, ScalingList& scalingList);<br>
-    int      setLambdaFromQP(const CUData& ctu, int qp); /* returns real quant QP in valid spec range */<br>
+    int      setLambdaFromQP(const CUData& ctu, int qp, int lambdaQP = -1); /* returns real quant QP in valid spec range */<br>
<br>
     // mark temp RD entropy contexts as uninitialized; useful for finding loads without stores<br>
     void     invalidateContexts(int fromDepth);<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" rel="noreferrer" target="_blank">https://mailman.videolan.org/listinfo/x265-devel</a><br>
</blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature"><div dir="ltr"><div><div>Deepthi Nandakumar<br></div>Engineering Manager, x265<br></div>Multicoreware, Inc<br></div></div>
</div></div>