[x265] [PATCH] aq: set qp, lambda for every CU in the row before processing the CU

Aarthi Thirumalai aarthi at multicorewareinc.com
Thu Oct 31 12:36:57 CET 2013


# HG changeset patch
# User Aarthi Thirumalai
# Date 1383219394 -19800
#      Thu Oct 31 17:06:34 2013 +0530
# Node ID 0e321e5dd34869c0054a5c218cd14e5dfd30fd38
# Parent  9a0da4e6d9e363e383eae7243f0c64026a5f6d00
aq: set qp, lambda for every CU in the row before processing the CU

enabled bUseDQP flag when AQ is mode is ON.

diff -r 9a0da4e6d9e3 -r 0e321e5dd348 source/Lib/TLibCommon/TComDataCU.cpp
--- a/source/Lib/TLibCommon/TComDataCU.cpp	Thu Oct 31 15:10:34 2013 +0530
+++ b/source/Lib/TLibCommon/TComDataCU.cpp	Thu Oct 31 17:06:34 2013 +0530
@@ -246,7 +246,7 @@
     m_totalDistortion  = 0;
     m_totalBits        = 0;
     m_numPartitions    = pic->getNumPartInCU();
-
+    int qp             = pic->m_lowres.m_invQscaleFactor ? pic->getCU(getAddr())->getQP(0) : m_slice->getSliceQp();
     for (int i = 0; i < 4; i++)
     {
         m_avgCost[i] = 0;
@@ -304,7 +304,7 @@
         memset(m_height           + firstElement, g_maxCUHeight,            numElements * sizeof(*m_height));
         memset(m_mvpNum[0]        + firstElement, -1,                       numElements * sizeof(*m_mvpNum[0]));
         memset(m_mvpNum[1]        + firstElement, -1,                       numElements * sizeof(*m_mvpNum[1]));
-        memset(m_qp               + firstElement, getSlice()->getSliceQp(), numElements * sizeof(*m_qp));
+        memset(m_qp               + firstElement, qp,                        numElements * sizeof(*m_qp));
         memset(m_bMergeFlags      + firstElement, false,                    numElements * sizeof(*m_bMergeFlags));
         memset(m_mergeIndex       + firstElement, 0,                        numElements * sizeof(*m_mergeIndex));
         memset(m_lumaIntraDir     + firstElement, DC_IDX,                   numElements * sizeof(*m_lumaIntraDir));
diff -r 9a0da4e6d9e3 -r 0e321e5dd348 source/Lib/TLibEncoder/TEncCu.cpp
--- a/source/Lib/TLibEncoder/TEncCu.cpp	Thu Oct 31 15:10:34 2013 +0530
+++ b/source/Lib/TLibEncoder/TEncCu.cpp	Thu Oct 31 17:06:34 2013 +0530
@@ -1691,7 +1691,8 @@
 
     if (cu->getSlice()->getPPS()->getUseDQP() && (g_maxCUWidth >> depth) >= cu->getSlice()->getPPS()->getMinCuDQPSize())
     {
-        cu->setQPSubParts(cu->getRefQP(0), 0, depth); // set QP to default QP
+        if (!cu->getCbf(0, TEXT_LUMA, 0) && !cu->getCbf(0, TEXT_CHROMA_U, 0) && !cu->getCbf(0, TEXT_CHROMA_V, 0))
+            cu->setQPSubParts(cu->getRefQP(0), 0, depth); // set QP to default QP
     }
 }
 
diff -r 9a0da4e6d9e3 -r 0e321e5dd348 source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp	Thu Oct 31 15:10:34 2013 +0530
+++ b/source/encoder/encoder.cpp	Thu Oct 31 17:06:34 2013 +0530
@@ -784,7 +784,7 @@
 void Encoder::initPPS(TComPPS *pps)
 {
     pps->setConstrainedIntraPred(param.bEnableConstrainedIntra);
-    bool bUseDQP = (getMaxCuDQPDepth() > 0) ? true : false;
+    bool bUseDQP = ((getMaxCuDQPDepth() > 0) || param.rc.aqMode) ? true : false;
 
     int lowestQP = -(6 * (X265_DEPTH - 8)); //m_cSPS.getQpBDOffsetY();
 
diff -r 9a0da4e6d9e3 -r 0e321e5dd348 source/encoder/frameencoder.cpp
--- a/source/encoder/frameencoder.cpp	Thu Oct 31 15:10:34 2013 +0530
+++ b/source/encoder/frameencoder.cpp	Thu Oct 31 17:06:34 2013 +0530
@@ -306,6 +306,40 @@
     while (m_threadActive);
 }
 
+void FrameEncoder::setLambda(int qp , int row)
+{
+    TComSlice*   slice        = m_pic->getSlice();
+    double lambda = 0;
+    if (m_pic->getSlice()->getSliceType() == I_SLICE)
+    {
+        lambda = X265_MAX(1, x265_lambda2_tab_I[qp]);
+    }
+    else
+    {
+        lambda = X265_MAX(1, x265_lambda2_non_I[qp]);
+    }
+
+    // for RDO
+    // in RdCost there is only one lambda because the luma and chroma bits are not separated,
+    // instead we weight the distortion of chroma.
+    int qpc;
+    int chromaQPOffset = slice->getPPS()->getChromaCbQpOffset() + slice->getSliceQpDeltaCb();
+    qpc = Clip3(0, 57, qp + chromaQPOffset);
+    double cbWeight = pow(2.0, (qp - g_chromaScale[qpc])); // takes into account of the chroma qp mapping and chroma qp Offset
+    chromaQPOffset = slice->getPPS()->getChromaCrQpOffset() + slice->getSliceQpDeltaCr();
+    qpc = Clip3(0, 57, qp + chromaQPOffset);
+    double crWeight = pow(2.0, (qp - g_chromaScale[qpc])); // takes into account of the chroma qp mapping and chroma qp Offset
+    double chromaLambda = lambda / crWeight;
+    TComPicYuv *fenc = slice->getPic()->getPicYuvOrg();
+    m_rows[row].m_search.setQPLambda(qp, lambda, chromaLambda);
+    m_rows[row].m_search.m_me.setSourcePlane(fenc->getLumaAddr(), fenc->getStride());
+    m_rows[row].m_rdCost.setLambda(lambda);
+    m_rows[row].m_rdCost.setCbDistortionWeight(cbWeight);
+    m_rows[row].m_rdCost.setCrDistortionWeight(crWeight);
+    m_frameFilter.m_sao.lumaLambda = lambda;
+    m_frameFilter.m_sao.chromaLambda = chromaLambda;
+}
+
 void FrameEncoder::compressFrame()
 {
     PPAScopeEvent(FrameEncoder_compressFrame);
@@ -1042,8 +1076,12 @@
         codeRow.m_entropyCoder.resetEntropy();
 
         TEncSbac *bufSbac = (m_cfg->param.bEnableWavefront && col == 0 && row > 0) ? &m_rows[row - 1].m_bufferSbacCoder : NULL;
-        int qp = calcQpForCu(m_pic, cuAddr);
-        cu->setQP(0,(char)qp);
+        if (m_cfg->param.rc.aqMode)
+        {
+            int qp = calcQpForCu(m_pic, cuAddr);
+            cu->setQP(0, (char)qp);
+            setLambda(qp, row);
+        }
         codeRow.processCU(cu, m_pic->getSlice(), bufSbac, m_cfg->param.bEnableWavefront && col == 1);
 
         // TODO: Keep atomic running totals for rate control?
diff -r 9a0da4e6d9e3 -r 0e321e5dd348 source/encoder/frameencoder.h
--- a/source/encoder/frameencoder.h	Thu Oct 31 15:10:34 2013 +0530
+++ b/source/encoder/frameencoder.h	Thu Oct 31 17:06:34 2013 +0530
@@ -149,7 +149,7 @@
 
     /* blocks until worker thread is done, returns encoded picture and bitstream */
     TComPic *getEncodedPicture(NALUnitEBSP **nalunits);
-
+    void setLambda(int qp , int row);
     // worker thread
     void threadMain();
 


More information about the x265-devel mailing list