[x265] [PATCH] Add optional parameter to setLambdaFromQP and calculateQpForCUSize functions

kavitha at multicorewareinc.com kavitha at multicorewareinc.com
Thu Oct 8 15:01:50 CEST 2015


# HG changeset patch
# User Kavitha Sampath <kavitha at multicorewareinc.com>
# Date 1444306002 -19800
#      Thu Oct 08 17:36:42 2015 +0530
# Node ID c4d4df4413b8ae67550e6f3240367b4f241cc4b2
# Parent  bd8087bfd93f7564df436a27c22f7e44f6803c4a
Add optional parameter to setLambdaFromQP and calculateQpForCUSize functions

Inaddition, the zOrder is no more passed explicitly to compressIntraCU(),
instead used implicitly from cuGeom. This commit forms groundwork for
QP based RD refinement.

diff -r bd8087bfd93f -r c4d4df4413b8 source/encoder/analysis.cpp
--- a/source/encoder/analysis.cpp	Thu Oct 08 16:28:14 2015 +0530
+++ b/source/encoder/analysis.cpp	Thu Oct 08 17:36:42 2015 +0530
@@ -150,7 +150,6 @@
 
     ProfileCUScope(ctu, totalCTUTime, totalCTUs);
 
-    uint32_t zOrder = 0;
     if (m_slice->m_sliceType == I_SLICE)
     {
         analysis_intra_data* intraDataCTU = (analysis_intra_data*)m_frame->m_analysisData.intraData;
@@ -161,7 +160,7 @@
             memcpy(ctu.m_partSize, &intraDataCTU->partSizes[ctu.m_cuAddr * numPartition], sizeof(char) * numPartition);
             memcpy(ctu.m_chromaIntraDir, &intraDataCTU->chromaModes[ctu.m_cuAddr * numPartition], sizeof(uint8_t) * numPartition);
         }
-        compressIntraCU(ctu, cuGeom, zOrder, qp);
+        compressIntraCU(ctu, cuGeom, qp);
         if (m_param->analysisMode == X265_ANALYSIS_SAVE && intraDataCTU)
         {
             CUData* bestCU = &m_modeDepth[0].bestMode->cu;
@@ -190,6 +189,7 @@
             compressInterCU_rd0_4(ctu, cuGeom, qp);
         else
         {
+            uint32_t zOrder = 0;
             compressInterCU_rd5_6(ctu, cuGeom, zOrder, qp);
             if (m_param->analysisMode == X265_ANALYSIS_SAVE && m_frame->m_analysisData.interData)
             {
@@ -228,7 +228,7 @@
     }
 }
 
-void Analysis::compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, uint32_t& zOrder, int32_t qp)
+void Analysis::compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp)
 {
     uint32_t depth = cuGeom.depth;
     ModeDepth& md = m_modeDepth[depth];
@@ -302,7 +302,7 @@
                 if (m_slice->m_pps->bUseDQP && nextDepth <= m_slice->m_pps->maxCuDQPDepth)
                     nextQP = setLambdaFromQP(parentCTU, calculateQpforCuSize(parentCTU, childGeom));
 
-                compressIntraCU(parentCTU, childGeom, zOrder, nextQP);
+                compressIntraCU(parentCTU, childGeom, nextQP);
 
                 // Save best CU and pred data for this sub CU
                 splitCU->copyPartFrom(nd.bestMode->cu, childGeom, subPartIdx);
@@ -314,7 +314,6 @@
             {
                 /* record the depth of this non-present sub-CU */
                 splitCU->setEmptyPart(childGeom, subPartIdx);
-                zOrder += g_depthInc[g_maxCUDepth - 1][nextDepth];
             }
         }
         nextContext->store(splitPred->contexts);
@@ -2137,10 +2136,10 @@
     return false;
 }
 
-int Analysis::calculateQpforCuSize(const CUData& ctu, const CUGeom& cuGeom)
+int Analysis::calculateQpforCuSize(const CUData& ctu, const CUGeom& cuGeom, double baseQp)
 {
     FrameData& curEncData = *m_frame->m_encData;
-    double qp = curEncData.m_cuStat[ctu.m_cuAddr].baseQp;
+    double qp = baseQp ? baseQp : curEncData.m_cuStat[ctu.m_cuAddr].baseQp;
 
     /* Use cuTree offsets if cuTree enabled and frame is referenced, else use AQ offsets */
     bool isReferenced = IS_REFERENCED(m_frame);
diff -r bd8087bfd93f -r c4d4df4413b8 source/encoder/analysis.h
--- a/source/encoder/analysis.h	Thu Oct 08 16:28:14 2015 +0530
+++ b/source/encoder/analysis.h	Thu Oct 08 17:36:42 2015 +0530
@@ -111,7 +111,7 @@
     uint32_t m_splitRefIdx[4];
 
     /* full analysis for an I-slice CU */
-    void compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, uint32_t &zOrder, int32_t qp);
+    void compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp);
 
     /* full analysis for a P or B slice CU */
     uint32_t compressInterCU_dist(const CUData& parentCTU, const CUGeom& cuGeom, int32_t qp);
@@ -141,7 +141,7 @@
     /* generate residual and recon pixels for an entire CTU recursively (RD0) */
     void encodeResidue(const CUData& parentCTU, const CUGeom& cuGeom);
 
-    int calculateQpforCuSize(const CUData& ctu, const CUGeom& cuGeom);
+    int calculateQpforCuSize(const CUData& ctu, const CUGeom& cuGeom, double baseQP = 0);
 
     /* check whether current mode is the new best */
     inline void checkBestMode(Mode& mode, uint32_t depth)
diff -r bd8087bfd93f -r c4d4df4413b8 source/encoder/search.cpp
--- a/source/encoder/search.cpp	Thu Oct 08 16:28:14 2015 +0530
+++ b/source/encoder/search.cpp	Thu Oct 08 17:36:42 2015 +0530
@@ -164,12 +164,12 @@
     X265_FREE(m_tsRecon);
 }
 
-int Search::setLambdaFromQP(const CUData& ctu, int qp)
+int Search::setLambdaFromQP(const CUData& ctu, int qp, int lambdaQp)
 {
     X265_CHECK(qp >= QP_MIN && qp <= QP_MAX_MAX, "QP used for lambda is out of range\n");
 
     m_me.setQP(qp);
-    m_rdCost.setQP(*m_slice, qp);
+    m_rdCost.setQP(*m_slice, lambdaQp < 0 ? qp : lambdaQp);
 
     int quantQP = x265_clip3(QP_MIN, QP_MAX_SPEC, qp);
     m_quant.setQPforQuant(ctu, quantQP);
diff -r bd8087bfd93f -r c4d4df4413b8 source/encoder/search.h
--- a/source/encoder/search.h	Thu Oct 08 16:28:14 2015 +0530
+++ b/source/encoder/search.h	Thu Oct 08 17:36:42 2015 +0530
@@ -333,7 +333,7 @@
     ~Search();
 
     bool     initSearch(const x265_param& param, ScalingList& scalingList);
-    int      setLambdaFromQP(const CUData& ctu, int qp); /* returns real quant QP in valid spec range */
+    int      setLambdaFromQP(const CUData& ctu, int qp, int lambdaQP = -1); /* returns real quant QP in valid spec range */
 
     // mark temp RD entropy contexts as uninitialized; useful for finding loads without stores
     void     invalidateContexts(int fromDepth);


More information about the x265-devel mailing list