<div dir="ltr"><div dir="ltr"><div># HG changeset patch</div><div># User Akil <<a href="mailto:akil@multicorewareinc.com">akil@multicorewareinc.com</a>></div><div># Date 1539754718 -19800</div><div>#      Wed Oct 17 11:08:38 2018 +0530</div><div># Node ID 4eda86eadc691bfb9d86425d2bc7621dee06525e</div><div># Parent  f74003e88622dafc62f6c3c50720872df4d928bc</div><div>Cutree offset for analysis reuse</div><div><br></div><div>diff -r f74003e88622 -r 4eda86eadc69 source/common/cudata.cpp</div><div>--- a/source/common/cudata.cpp<span style="white-space:pre">  </span>Thu Nov 22 15:02:08 2018 +0530</div><div>+++ b/source/common/cudata.cpp<span style="white-space:pre">  </span>Wed Oct 17 11:08:38 2018 +0530</div><div>@@ -193,6 +193,7 @@</div><div>         uint8_t *charBuf = dataPool.charMemBlock + (m_numPartitions * (BytesPerPartition - 4)) * instance;</div><div> </div><div>         m_qp        = (int8_t*)charBuf; charBuf += m_numPartitions;</div><div>+        m_qpAnalysis = (int8_t*)charBuf; charBuf += m_numPartitions;</div><div>         m_log2CUSize         = charBuf; charBuf += m_numPartitions;</div><div>         m_lumaIntraDir       = charBuf; charBuf += m_numPartitions;</div><div>         m_tqBypass           = charBuf; charBuf += m_numPartitions;</div><div>@@ -233,6 +234,7 @@</div><div>         uint8_t *charBuf = dataPool.charMemBlock + (m_numPartitions * BytesPerPartition) * instance;</div><div> </div><div>         m_qp        = (int8_t*)charBuf; charBuf += m_numPartitions;</div><div>+        m_qpAnalysis = (int8_t*)charBuf; charBuf += m_numPartitions;</div><div>         m_log2CUSize         = charBuf; charBuf += m_numPartitions;</div><div>         m_lumaIntraDir       = charBuf; charBuf += m_numPartitions;</div><div>         m_tqBypass           = charBuf; charBuf += m_numPartitions;</div><div>@@ -291,6 +293,7 @@</div><div> </div><div>     /* sequential memsets */</div><div>     m_partSet((uint8_t*)m_qp, (uint8_t)qp);</div><div>+    m_partSet((uint8_t*)m_qpAnalysis, (uint8_t)qp);</div><div>     m_partSet(m_log2CUSize,   (uint8_t)m_slice->m_param->maxLog2CUSize);</div><div>     m_partSet(m_lumaIntraDir, (uint8_t)ALL_IDX);</div><div>     m_partSet(m_chromaIntraDir, (uint8_t)ALL_IDX);</div><div>@@ -304,7 +307,7 @@</div><div>     X265_CHECK(!(frame.m_encData->m_param->bLossless && !m_slice->m_pps->bTransquantBypassEnabled), "lossless enabled without TQbypass in PPS\n");</div><div> </div><div>     /* initialize the remaining CU data in one memset */</div><div>-    memset(m_cuDepth, 0, (frame.m_param->internalCsp == X265_CSP_I400 ? BytesPerPartition - 11 : BytesPerPartition - 7) * m_numPartitions);</div><div>+    memset(m_cuDepth, 0, (frame.m_param->internalCsp == X265_CSP_I400 ? BytesPerPartition - 12 : BytesPerPartition - 8) * m_numPartitions);</div><div> </div><div>     for (int8_t i = 0; i < NUM_TU_DEPTH; i++)</div><div>         m_refTuDepth[i] = -1;</div><div>@@ -344,6 +347,7 @@</div><div>     X265_CHECK(m_numPartitions == cuGeom.numPartitions, "initSubCU() size mismatch\n");</div><div> </div><div>     m_partSet((uint8_t*)m_qp, (uint8_t)qp);</div><div>+    m_partSet((uint8_t*)m_qpAnalysis, (uint8_t)qp);</div><div> </div><div>     m_partSet(m_log2CUSize,   (uint8_t)cuGeom.log2CUSize);</div><div>     m_partSet(m_lumaIntraDir, (uint8_t)ALL_IDX);</div><div>@@ -354,7 +358,7 @@</div><div>     m_partSet(m_cuDepth,      (uint8_t)cuGeom.depth);</div><div> </div><div>     /* initialize the remaining CU data in one memset */</div><div>-    memset(m_predMode, 0, (ctu.m_chromaFormat == X265_CSP_I400 ? BytesPerPartition - 12 : BytesPerPartition - 8) * m_numPartitions);</div><div>+    memset(m_predMode, 0, (ctu.m_chromaFormat == X265_CSP_I400 ? BytesPerPartition - 13 : BytesPerPartition - 9) * m_numPartitions);</div><div>     memset(m_distortion, 0, m_numPartitions * sizeof(sse_t));</div><div> }</div><div> </div><div>@@ -369,6 +373,7 @@</div><div>     m_bLastCuInSlice = subCU.m_bLastCuInSlice;</div><div> </div><div>     m_subPartCopy((uint8_t*)m_qp + offset, (uint8_t*)subCU.m_qp);</div><div>+    m_subPartCopy((uint8_t*)m_qpAnalysis + offset, (uint8_t*)subCU.m_qpAnalysis);</div><div>     m_subPartCopy(m_log2CUSize + offset, subCU.m_log2CUSize);</div><div>     m_subPartCopy(m_lumaIntraDir + offset, subCU.m_lumaIntraDir);</div><div>     m_subPartCopy(m_tqBypass + offset, subCU.m_tqBypass);</div><div>@@ -469,6 +474,7 @@</div><div>     CUData& ctu = *m_encData->getPicCTU(m_cuAddr);</div><div> </div><div>     m_partCopy((uint8_t*)ctu.m_qp + m_absIdxInCTU, (uint8_t*)m_qp);</div><div>+    m_partCopy((uint8_t*)ctu.m_qpAnalysis + m_absIdxInCTU, (uint8_t*)m_qpAnalysis);</div><div>     m_partCopy(ctu.m_log2CUSize + m_absIdxInCTU, m_log2CUSize);</div><div>     m_partCopy(ctu.m_lumaIntraDir + m_absIdxInCTU, m_lumaIntraDir);</div><div>     m_partCopy(ctu.m_tqBypass + m_absIdxInCTU, m_tqBypass);</div><div>@@ -523,7 +529,11 @@</div><div>     m_numPartitions = cuGeom.numPartitions;</div><div> </div><div>     /* copy out all prediction info for this part */</div><div>-    if (copyQp) m_partCopy((uint8_t*)m_qp, (uint8_t*)ctu.m_qp + m_absIdxInCTU);</div><div>+    if (copyQp)</div><div>+    {</div><div>+        m_partCopy((uint8_t*)m_qp, (uint8_t*)ctu.m_qp + m_absIdxInCTU);</div><div>+        m_partCopy((uint8_t*)m_qpAnalysis, (uint8_t*)ctu.m_qpAnalysis + m_absIdxInCTU);</div><div>+    }</div><div> </div><div>     m_partCopy(m_log2CUSize,   ctu.m_log2CUSize + m_absIdxInCTU);</div><div>     m_partCopy(m_lumaIntraDir, ctu.m_lumaIntraDir + m_absIdxInCTU);</div><div>@@ -566,6 +576,7 @@</div><div>     CUData& ctu = *m_encData->getPicCTU(m_cuAddr);</div><div> </div><div>     m_partCopy((uint8_t*)ctu.m_qp + m_absIdxInCTU, (uint8_t*)m_qp);</div><div>+    m_partCopy((uint8_t*)ctu.m_qpAnalysis + m_absIdxInCTU, (uint8_t*)m_qpAnalysis);</div><div>     m_partCopy(ctu.m_transformSkip[0] + m_absIdxInCTU, m_transformSkip[0]);</div><div>     m_partCopy(ctu.m_predMode + m_absIdxInCTU, m_predMode);</div><div>     m_partCopy(ctu.m_tuDepth + m_absIdxInCTU, m_tuDepth);</div><div>diff -r f74003e88622 -r 4eda86eadc69 source/common/cudata.h</div><div>--- a/source/common/cudata.h<span style="white-space:pre"> </span>Thu Nov 22 15:02:08 2018 +0530</div><div>+++ b/source/common/cudata.h<span style="white-space:pre">    </span>Wed Oct 17 11:08:38 2018 +0530</div><div>@@ -191,6 +191,7 @@</div><div> </div><div>     /* Per-part data, stored contiguously */</div><div>     int8_t*       m_qp;               // array of QP values</div><div>+    int8_t*       m_qpAnalysis;       // array of QP values for analysis reuse</div><div>     uint8_t*      m_log2CUSize;       // array of cu log2Size TODO: seems redundant to depth</div><div>     uint8_t*      m_lumaIntraDir;     // array of intra directions (luma)</div><div>     uint8_t*      m_tqBypass;         // array of CU lossless flags</div><div>@@ -206,7 +207,7 @@</div><div>     uint8_t*      m_transformSkip[3]; // array of transform skipping flags per plane</div><div>     uint8_t*      m_cbf[3];           // array of coded block flags (CBF) per plane</div><div>     uint8_t*      m_chromaIntraDir;   // array of intra directions (chroma)</div><div>-    enum { BytesPerPartition = 23 };  // combined sizeof() of all per-part data</div><div>+    enum { BytesPerPartition = 24 };  // combined sizeof() of all per-part data</div><div> </div><div>     sse_t*        m_distortion;</div><div>     coeff_t*      m_trCoeff[3];       // transformed coefficient buffer per plane</div><div>diff -r f74003e88622 -r 4eda86eadc69 source/encoder/analysis.cpp</div><div>--- a/source/encoder/analysis.cpp<span style="white-space:pre">  </span>Thu Nov 22 15:02:08 2018 +0530</div><div>+++ b/source/encoder/analysis.cpp<span style="white-space:pre">       </span>Wed Oct 17 11:08:38 2018 +0530</div><div>@@ -3568,6 +3568,14 @@</div><div>             qp += distortionData->offset[ctu.m_cuAddr];</div><div>     }</div><div> </div><div>+    if (m_param->analysisLoad && m_param->analysisReuseLevel == 10 && m_param->rc.cuTree)</div><div>+    {</div><div>+        int cuIdx = (ctu.m_cuAddr * ctu.m_numPartitions) + cuGeom.absPartIdx;</div><div>+        if (ctu.m_slice->m_sliceType == I_SLICE)</div><div>+            return x265_clip3(m_param->rc.qpMin, m_param->rc.qpMax, (int32_t)(qp + 0.5 + ((x265_analysis_intra_data*)m_frame->m_analysisData.intraData)->cuQPOff[cuIdx]));</div><div>+        else</div><div>+            return x265_clip3(m_param->rc.qpMin, m_param->rc.qpMax, (int32_t)(qp + 0.5 + ((x265_analysis_inter_data*)m_frame->m_analysisData.interData)->cuQPOff[cuIdx]));</div><div>+    }</div><div>     int loopIncr = (m_param->rc.qgSize == 8) ? 8 : 16;</div><div> </div><div>     /* Use cuTree offsets if cuTree enabled and frame is referenced, else use AQ offsets */</div><div>diff -r f74003e88622 -r 4eda86eadc69 source/encoder/api.cpp</div><div>--- a/source/encoder/api.cpp<span style="white-space:pre">      </span>Thu Nov 22 15:02:08 2018 +0530</div><div>+++ b/source/encoder/api.cpp<span style="white-space:pre">    </span>Wed Oct 17 11:08:38 2018 +0530</div><div>@@ -453,6 +453,8 @@</div><div>     CHECKED_MALLOC(intraData->modes, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);</div><div>     CHECKED_MALLOC(intraData->partSizes, char, analysis->numPartitions * analysis->numCUsInFrame);</div><div>     CHECKED_MALLOC(intraData->chromaModes, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);</div><div>+    if (param->rc.cuTree)</div><div>+        CHECKED_MALLOC(intraData->cuQPOff, int8_t, analysis->numPartitions * analysis->numCUsInFrame);</div><div>     analysis->intraData = intraData;</div><div> </div><div>     //Allocate memory for interData pointer based on ReuseLevels</div><div>@@ -460,6 +462,8 @@</div><div>     CHECKED_MALLOC(interData->depth, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);</div><div>     CHECKED_MALLOC(interData->modes, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);</div><div> </div><div>+    if (param->rc.cuTree)</div><div>+        CHECKED_MALLOC(interData->cuQPOff, int8_t, analysis->numPartitions * analysis->numCUsInFrame);</div><div>     CHECKED_MALLOC_ZERO(interData->mvpIdx[0], uint8_t, analysis->numPartitions * analysis->numCUsInFrame);</div><div>     CHECKED_MALLOC_ZERO(interData->mvpIdx[1], uint8_t, analysis->numPartitions * analysis->numCUsInFrame);</div><div>     CHECKED_MALLOC_ZERO(interData->mv[0], x265_analysis_MV, analysis->numPartitions * analysis->numCUsInFrame);</div><div>@@ -537,6 +541,8 @@</div><div>         X265_FREE((analysis->intraData)->modes);</div><div>         X265_FREE((analysis->intraData)->partSizes);</div><div>         X265_FREE((analysis->intraData)->chromaModes);</div><div>+        if (param->rc.cuTree)</div><div>+            X265_FREE((analysis->intraData)->cuQPOff);</div><div>         X265_FREE(analysis->intraData);</div><div>         analysis->intraData = NULL;</div><div>     }</div><div>@@ -546,6 +552,8 @@</div><div>     {</div><div>         X265_FREE((analysis->interData)->depth);</div><div>         X265_FREE((analysis->interData)->modes);</div><div>+        if (param->rc.cuTree)</div><div>+            X265_FREE((analysis->interData)->cuQPOff);</div><div>         X265_FREE((analysis->interData)->mvpIdx[0]);</div><div>         X265_FREE((analysis->interData)->mvpIdx[1]);</div><div>         X265_FREE((analysis->interData)->mv[0]);</div><div>diff -r f74003e88622 -r 4eda86eadc69 source/encoder/encoder.cpp</div><div>--- a/source/encoder/encoder.cpp<span style="white-space:pre">  </span>Thu Nov 22 15:02:08 2018 +0530</div><div>+++ b/source/encoder/encoder.cpp<span style="white-space:pre">        </span>Wed Oct 17 11:08:38 2018 +0530</div><div>@@ -2745,12 +2745,6 @@</div><div>         p->bDistributeMotionEstimation = p->bDistributeModeAnalysis = 0;</div><div>     }</div><div> </div><div>-    if ((p->analysisLoad || p->analysisSave) && p->rc.cuTree)</div><div>-    {</div><div>-        x265_log(p, X265_LOG_WARNING, "Analysis load/save options works only with cu-tree off, Disabling cu-tree\n");</div><div>-        p->rc.cuTree = 0;</div><div>-    }</div><div>-</div><div>     if ((p->analysisLoad || p->analysisSave) && (p->analysisMultiPassRefine || p->analysisMultiPassDistortion))</div><div>     {</div><div>         x265_log(p, X265_LOG_WARNING, "Cannot use Analysis load/save option and multi-pass-opt-analysis/multi-pass-opt-distortion together,"</div><div>@@ -3287,15 +3281,20 @@</div><div>             return;</div><div> </div><div>         uint8_t *tempBuf = NULL, *depthBuf = NULL, *modeBuf = NULL, *partSizes = NULL;</div><div>+        int8_t *cuQPBuf = NULL;</div><div> </div><div>         tempBuf = X265_MALLOC(uint8_t, depthBytes * 3);</div><div>         depthBuf = tempBuf;</div><div>         modeBuf = tempBuf + depthBytes;</div><div>         partSizes = tempBuf + 2 * depthBytes;</div><div>+        if (m_param->rc.cuTree)</div><div>+            cuQPBuf = X265_MALLOC(int8_t, depthBytes);</div><div> </div><div>         X265_FREAD(depthBuf, sizeof(uint8_t), depthBytes, m_analysisFileIn, intraPic->depth);</div><div>         X265_FREAD(modeBuf, sizeof(uint8_t), depthBytes, m_analysisFileIn, intraPic->chromaModes);</div><div>         X265_FREAD(partSizes, sizeof(uint8_t), depthBytes, m_analysisFileIn, intraPic->partSizes);</div><div>+        if (m_param->rc.cuTree)</div><div>+            X265_FREAD(cuQPBuf, sizeof(int8_t), depthBytes, m_analysisFileIn, intraPic->cuQPOff);</div><div> </div><div>         size_t count = 0;</div><div>         for (uint32_t d = 0; d < depthBytes; d++)</div><div>@@ -3311,6 +3310,8 @@</div><div>             memset(&(analysis->intraData)->depth[count], depthBuf[d], bytes);</div><div>             memset(&(analysis->intraData)->chromaModes[count], modeBuf[d], bytes);</div><div>             memset(&(analysis->intraData)->partSizes[count], partSizes[d], bytes);</div><div>+            if (m_param->rc.cuTree)</div><div>+                memset(&(analysis->intraData)->cuQPOff[count], cuQPBuf[d], bytes);</div><div>             count += bytes;</div><div>         }</div><div> </div><div>@@ -3326,6 +3327,8 @@</div><div>                 memset(&(analysis->intraData)->modes[cnt], tempLumaBuf[ctu32Idx], factor);</div><div>             X265_FREE(tempLumaBuf);</div><div>         }</div><div>+        if (m_param->rc.cuTree)</div><div>+            X265_FREE(cuQPBuf);</div><div>         X265_FREE(tempBuf);</div><div>         consumedBytes += frameRecordSize;</div><div>     }</div><div>@@ -3342,6 +3345,7 @@</div><div>         uint8_t *interDir = NULL, *chromaDir = NULL, *mvpIdx[2];</div><div>         MV* mv[2];</div><div>         int8_t* refIdx[2];</div><div>+        int8_t* cuQPBuf = NULL;</div><div> </div><div>         int numBuf = m_param->analysisReuseLevel > 4 ? 4 : 2;</div><div>         bool bIntraInInter = false;</div><div>@@ -3355,9 +3359,13 @@</div><div>         tempBuf = X265_MALLOC(uint8_t, depthBytes * numBuf);</div><div>         depthBuf = tempBuf;</div><div>         modeBuf = tempBuf + depthBytes;</div><div>+        if (m_param->rc.cuTree)</div><div>+            cuQPBuf = X265_MALLOC(int8_t, depthBytes);</div><div> </div><div>         X265_FREAD(depthBuf, sizeof(uint8_t), depthBytes, m_analysisFileIn, interPic->depth);</div><div>         X265_FREAD(modeBuf, sizeof(uint8_t), depthBytes, m_analysisFileIn, interPic->modes);</div><div>+        if (m_param->rc.cuTree)</div><div>+            X265_FREAD(cuQPBuf, sizeof(int8_t), depthBytes, m_analysisFileIn, interPic->cuQPOff);</div><div> </div><div>         if (m_param->analysisReuseLevel > 4)</div><div>         {</div><div>@@ -3395,6 +3403,8 @@</div><div>                 depthBuf[d] = 1;</div><div>             memset(&(analysis->interData)->depth[count], depthBuf[d], bytes);</div><div>             memset(&(analysis->interData)->modes[count], modeBuf[d], bytes);</div><div>+            if (m_param->rc.cuTree)</div><div>+                memset(&(analysis->interData)->cuQPOff[count], cuQPBuf[d], bytes);</div><div>             if (m_param->analysisReuseLevel > 4)</div><div>             {</div><div>                 if (m_param->scaleFactor && modeBuf[d] == MODE_INTRA && partSize[d] == SIZE_NxN)</div><div>@@ -3427,6 +3437,8 @@</div><div>             count += bytes;</div><div>         }</div><div> </div><div>+        if (m_param->rc.cuTree)</div><div>+            X265_FREE(cuQPBuf);</div><div>         X265_FREE(tempBuf);</div><div> </div><div>         if (m_param->analysisReuseLevel == 10)</div><div>@@ -3605,15 +3617,20 @@</div><div>             return;</div><div> </div><div>         uint8_t *tempBuf = NULL, *depthBuf = NULL, *modeBuf = NULL, *partSizes = NULL;</div><div>+        int8_t *cuQPBuf = NULL;</div><div> </div><div>         tempBuf = X265_MALLOC(uint8_t, depthBytes * 3);</div><div>         depthBuf = tempBuf;</div><div>         modeBuf = tempBuf + depthBytes;</div><div>         partSizes = tempBuf + 2 * depthBytes;</div><div>+        if (m_param->rc.cuTree)</div><div>+            cuQPBuf = X265_MALLOC(int8_t, depthBytes);</div><div> </div><div>         X265_FREAD(depthBuf, sizeof(uint8_t), depthBytes, m_analysisFileIn, intraPic->depth);</div><div>         X265_FREAD(modeBuf, sizeof(uint8_t), depthBytes, m_analysisFileIn, intraPic->chromaModes);</div><div>         X265_FREAD(partSizes, sizeof(uint8_t), depthBytes, m_analysisFileIn, intraPic->partSizes);</div><div>+        if (m_param->rc.cuTree)</div><div>+            X265_FREAD(cuQPBuf, sizeof(int8_t), depthBytes, m_analysisFileIn, intraPic->cuQPOff);</div><div> </div><div>         uint32_t count = 0;</div><div>         for (uint32_t d = 0; d < depthBytes; d++)</div><div>@@ -3635,6 +3652,8 @@</div><div>                 memset(&(analysis->intraData)->depth[count], depthBuf[d], bytes);</div><div>                 memset(&(analysis->intraData)->chromaModes[count], modeBuf[d], bytes);</div><div>                 memset(&(analysis->intraData)->partSizes[count], partSizes[d], bytes);</div><div>+                if (m_param->rc.cuTree)</div><div>+                    memset(&(analysis->intraData)->cuQPOff[count], cuQPBuf[d], bytes);</div><div>                 count += bytes;</div><div>                 d += getCUIndex(&cuLoc, &count, bytes, 1);</div><div>             }</div><div>@@ -3653,6 +3672,8 @@</div><div>             ctu32Idx += getCUIndex(&cuLoc, &cnt, factor, 0);</div><div>         }</div><div>         X265_FREE(tempLumaBuf);</div><div>+        if (m_param->rc.cuTree)</div><div>+            X265_FREE(cuQPBuf);</div><div>         X265_FREE(tempBuf);</div><div>         consumedBytes += frameRecordSize;</div><div>     }</div><div>@@ -3669,6 +3690,7 @@</div><div>         uint8_t *interDir = NULL, *chromaDir = NULL, *mvpIdx[2];</div><div>         MV* mv[2];</div><div>         int8_t* refIdx[2];</div><div>+        int8_t* cuQPBuf = NULL;</div><div> </div><div>         int numBuf = m_param->analysisReuseLevel > 4 ? 4 : 2;</div><div>         bool bIntraInInter = false;</div><div>@@ -3682,9 +3704,13 @@</div><div>         tempBuf = X265_MALLOC(uint8_t, depthBytes * numBuf);</div><div>         depthBuf = tempBuf;</div><div>         modeBuf = tempBuf + depthBytes;</div><div>+        if (m_param->rc.cuTree)</div><div>+            cuQPBuf = X265_MALLOC(int8_t, depthBytes);</div><div> </div><div>         X265_FREAD(depthBuf, sizeof(uint8_t), depthBytes, m_analysisFileIn, interPic->depth);</div><div>         X265_FREAD(modeBuf, sizeof(uint8_t), depthBytes, m_analysisFileIn, interPic->modes);</div><div>+        if (m_param->rc.cuTree)</div><div>+            X265_FREAD(cuQPBuf, sizeof(int8_t), depthBytes, m_analysisFileIn, interPic->cuQPOff);</div><div>         if (m_param->analysisReuseLevel > 4)</div><div>         {</div><div>             partSize = modeBuf + depthBytes;</div><div>@@ -3733,6 +3759,8 @@</div><div>             {</div><div>                 memset(&(analysis->interData)->depth[count], writeDepth, bytes);</div><div>                 memset(&(analysis->interData)->modes[count], modeBuf[d], bytes);</div><div>+                if (m_param->rc.cuTree)</div><div>+                    memset(&(analysis->interData)->cuQPOff[count], cuQPBuf[d], bytes);</div><div>                 if (m_param->analysisReuseLevel == 10 && bIntraInInter)</div><div>                     memset(&(analysis->intraData)->chromaModes[count], chromaDir[d], bytes);</div><div> </div><div>@@ -3793,6 +3821,8 @@</div><div>             }</div><div>         }</div><div> </div><div>+        if (m_param->rc.cuTree)</div><div>+            X265_FREE(cuQPBuf);</div><div>         X265_FREE(tempBuf);</div><div> </div><div>         if (m_param->analysisReuseLevel == 10)</div><div>@@ -3894,6 +3924,7 @@</div><div>     X265_PARAM_VALIDATE(saveParam->lookaheadDepth, sizeof(int), 1, &m_param->lookaheadDepth, rc - lookahead);</div><div>     X265_PARAM_VALIDATE(saveParam->chunkStart, sizeof(int), 1, &m_param->chunkStart, chunk-start);</div><div>     X265_PARAM_VALIDATE(saveParam->chunkEnd, sizeof(int), 1, &m_param->chunkEnd, chunk-end);</div><div>+    X265_PARAM_VALIDATE(saveParam->cuTree,sizeof(int),1,&m_param->rc.cuTree, cutree - offset);</div><div> </div><div>     int sourceHeight, sourceWidth;</div><div>     if (writeFlag)</div><div>@@ -4223,6 +4254,7 @@</div><div> </div><div>                 CUData* ctu = curEncData.getPicCTU(cuAddr);</div><div>                 x265_analysis_intra_data* intraDataCTU = analysis->intraData;</div><div>+                int baseQP = (int)(ctu->m_encData->m_cuStat[cuAddr].baseQp + 0.5);</div><div> </div><div>                 for (uint32_t absPartIdx = 0; absPartIdx < ctu->m_numPartitions; depthBytes++)</div><div>                 {</div><div>@@ -4235,6 +4267,8 @@</div><div>                     partSize = ctu->m_partSize[absPartIdx];</div><div>                     intraDataCTU->partSizes[depthBytes] = partSize;</div><div> </div><div>+                    if (m_param->rc.cuTree)</div><div>+                        intraDataCTU->cuQPOff[depthBytes] = (int8_t)(ctu->m_qpAnalysis[absPartIdx] - baseQP);</div><div>                     absPartIdx += ctu->m_numPartitions >> (depth * 2);</div><div>                 }</div><div>                 memcpy(&intraDataCTU->modes[ctu->m_cuAddr * ctu->m_numPartitions], ctu->m_lumaIntraDir, sizeof(uint8_t)* ctu->m_numPartitions);</div><div>@@ -4252,6 +4286,7 @@</div><div>                 CUData* ctu = curEncData.getPicCTU(cuAddr);</div><div>                 x265_analysis_inter_data* interDataCTU = analysis->interData;</div><div>                 x265_analysis_intra_data* intraDataCTU = analysis->intraData;</div><div>+                int baseQP = (int)(ctu->m_encData->m_cuStat[cuAddr].baseQp + 0.5);</div><div> </div><div>                 for (uint32_t absPartIdx = 0; absPartIdx < ctu->m_numPartitions; depthBytes++)</div><div>                 {</div><div>@@ -4260,9 +4295,11 @@</div><div> </div><div>                     predMode = ctu->m_predMode[absPartIdx];</div><div>                     if (m_param->analysisReuseLevel != 10 && ctu->m_refIdx[1][absPartIdx] != -1)</div><div>-                        predMode = 4; // used as indiacator if the block is coded as bidir</div><div>+                        predMode = 4; // used as indicator if the block is coded as bidir</div><div> </div><div>                     interDataCTU->modes[depthBytes] = predMode;</div><div>+                    if (m_param->rc.cuTree)</div><div>+                        interDataCTU->cuQPOff[depthBytes] = (int8_t)(ctu->m_qpAnalysis[absPartIdx] - baseQP);</div><div> </div><div>                     if (m_param->analysisReuseLevel > 4)</div><div>                     {</div><div>@@ -4298,12 +4335,16 @@</div><div>             }</div><div>         }</div><div> </div><div>-        if (analysis->sliceType == X265_TYPE_IDR || analysis->sliceType == X265_TYPE_I)</div><div>+        if ((analysis->sliceType == X265_TYPE_IDR || analysis->sliceType == X265_TYPE_I) && m_param->rc.cuTree)</div><div>+            analysis->frameRecordSize += sizeof(uint8_t)* analysis->numCUsInFrame * analysis->numPartitions + depthBytes * 3 + (sizeof(int8_t) * depthBytes);</div><div>+        else if (analysis->sliceType == X265_TYPE_IDR || analysis->sliceType == X265_TYPE_I)</div><div>             analysis->frameRecordSize += sizeof(uint8_t)* analysis->numCUsInFrame * analysis->numPartitions + depthBytes * 3;</div><div>         else</div><div>         {</div><div>-            /* Add sizeof depth, modes, partSize, mergeFlag */</div><div>+            /* Add sizeof depth, modes, partSize, cuQPOffset, mergeFlag */</div><div>             analysis->frameRecordSize += depthBytes * 2;</div><div>+            if (m_param->rc.cuTree)</div><div>+            analysis->frameRecordSize += (sizeof(int8_t) * depthBytes);</div><div>             if (m_param->analysisReuseLevel > 4)</div><div>                 analysis->frameRecordSize += (depthBytes * 2);</div><div> </div><div>@@ -4345,12 +4386,16 @@</div><div>         X265_FWRITE((analysis->intraData)->depth, sizeof(uint8_t), depthBytes, m_analysisFileOut);</div><div>         X265_FWRITE((analysis->intraData)->chromaModes, sizeof(uint8_t), depthBytes, m_analysisFileOut);</div><div>         X265_FWRITE((analysis->intraData)->partSizes, sizeof(char), depthBytes, m_analysisFileOut);</div><div>+        if (m_param->rc.cuTree)</div><div>+            X265_FWRITE((analysis->intraData)->cuQPOff, sizeof(int8_t), depthBytes, m_analysisFileOut);</div><div>         X265_FWRITE((analysis->intraData)->modes, sizeof(uint8_t), analysis->numCUsInFrame * analysis->numPartitions, m_analysisFileOut);</div><div>     }</div><div>     else</div><div>     {</div><div>         X265_FWRITE((analysis->interData)->depth, sizeof(uint8_t), depthBytes, m_analysisFileOut);</div><div>         X265_FWRITE((analysis->interData)->modes, sizeof(uint8_t), depthBytes, m_analysisFileOut);</div><div>+        if (m_param->rc.cuTree)</div><div>+            X265_FWRITE((analysis->interData)->cuQPOff, sizeof(int8_t), depthBytes, m_analysisFileOut);</div><div>         if (m_param->analysisReuseLevel > 4)</div><div>         {</div><div>             X265_FWRITE((analysis->interData)->partSize, sizeof(uint8_t), depthBytes, m_analysisFileOut);</div><div>diff -r f74003e88622 -r 4eda86eadc69 source/x265.h</div><div>--- a/source/x265.h<span style="white-space:pre"> </span>Thu Nov 22 15:02:08 2018 +0530</div><div>+++ b/source/x265.h<span style="white-space:pre">     </span>Wed Oct 17 11:08:38 2018 +0530</div><div>@@ -129,6 +129,7 @@</div><div>     int     lookaheadDepth;</div><div>     int     chunkStart;</div><div>     int     chunkEnd;</div><div>+    int     cuTree;</div><div> }x265_analysis_validate;</div><div> </div><div> /* Stores intra analysis data for a single frame. This struct needs better packing */</div><div>@@ -138,6 +139,7 @@</div><div>     uint8_t*  modes;</div><div>     char*     partSizes;</div><div>     uint8_t*  chromaModes;</div><div>+    int8_t*    cuQPOff;</div><div> }x265_analysis_intra_data;</div><div> </div><div> typedef struct x265_analysis_MV</div><div>@@ -162,6 +164,7 @@</div><div>     int8_t*     refIdx[2];</div><div>     x265_analysis_MV*         mv[2];</div><div>     int64_t*     sadCost;</div><div>+    int8_t*    cuQPOff;</div><div> }x265_analysis_inter_data;</div><div> </div><div> typedef struct x265_weight_param</div><div><br></div></div></div>