[x265] [PATCH] rd: determine CU complexity to skip analysis of higher depths

kavitha at multicorewareinc.com kavitha at multicorewareinc.com
Thu Jun 9 08:37:16 CEST 2016


# HG changeset patch
# User Kavitha Sampath <kavitha at multicorewareinc.com>
# Date 1463588688 25200
#      Wed May 18 09:24:48 2016 -0700
# Node ID 4baa78c17dca00c3d2f8a1c4d5e0ae87d7463f05
# Parent  0af296185f7ae3e05493ecf164046ddfec085bb3
rd: determine CU complexity to skip analysis of higher depths

Complexity check is performed for RD level 2 of 4K videos

diff -r 0af296185f7a -r 4baa78c17dca source/common/constants.cpp
--- a/source/common/constants.cpp	Tue Jun 07 09:20:11 2016 +0530
+++ b/source/common/constants.cpp	Wed May 18 09:24:48 2016 -0700
@@ -161,6 +161,7 @@
     65535
 };
 
+bool     g_is4k = false;
 int      g_ctuSizeConfigured = 0;
 uint32_t g_maxLog2CUSize = MAX_LOG2_CU_SIZE;
 uint32_t g_maxCUSize     = MAX_CU_SIZE;
diff -r 0af296185f7a -r 4baa78c17dca source/common/constants.h
--- a/source/common/constants.h	Tue Jun 07 09:20:11 2016 +0530
+++ b/source/common/constants.h	Wed May 18 09:24:48 2016 -0700
@@ -31,6 +31,7 @@
 // private namespace
 
 extern int g_ctuSizeConfigured;
+extern bool g_is4k;
 
 void initZscanToRaster(uint32_t maxFullDepth, uint32_t depth, uint32_t startVal, uint32_t*& curIdx);
 void initRasterToZscan(uint32_t maxFullDepth);
diff -r 0af296185f7a -r 4baa78c17dca source/common/param.cpp
--- a/source/common/param.cpp	Tue Jun 07 09:20:11 2016 +0530
+++ b/source/common/param.cpp	Wed May 18 09:24:48 2016 -0700
@@ -1265,6 +1265,9 @@
         initZscanToRaster(g_unitSizeDepth, 1, 0, tmp);
         initRasterToZscan(g_unitSizeDepth);
     }
+    if (param->sourceWidth >= 3840)
+        g_is4k = true;
+
     return 0;
 }
 
diff -r 0af296185f7a -r 4baa78c17dca source/encoder/analysis.cpp
--- a/source/encoder/analysis.cpp	Tue Jun 07 09:20:11 2016 +0530
+++ b/source/encoder/analysis.cpp	Wed May 18 09:24:48 2016 -0700
@@ -944,8 +944,13 @@
     if (md.bestMode && m_param->bEnableRecursionSkip)
     {
         skipRecursion = md.bestMode->cu.isSkipped(0);
-        if (mightSplit && depth && depth >= minDepth && !skipRecursion)
-            skipRecursion = recursionDepthCheck(parentCTU, cuGeom, *md.bestMode);
+        if (mightSplit && depth >= minDepth && !skipRecursion)
+        {
+            if (depth)
+                skipRecursion = recursionDepthCheck(parentCTU, cuGeom, *md.bestMode);
+            if (g_is4k && !skipRecursion && m_param->rdLevel == 2 && md.fencYuv.m_size != MAX_CU_SIZE)
+                skipRecursion = complexityCheckCU(*md.bestMode);
+        }
     }
 
     /* Step 2. Evaluate each of the 4 split sub-blocks in series */
@@ -2593,6 +2598,30 @@
     return false;
 }
 
+bool Analysis::complexityCheckCU(const Mode& bestMode)
+{
+    uint32_t mean = 0;
+    uint32_t homo = 0;
+    uint32_t cuSize = bestMode.fencYuv->m_size;
+    for (uint32_t y = 0; y < cuSize; y++) {
+        for (uint32_t x = 0; x < cuSize; x++) {
+            mean += (bestMode.fencYuv->m_buf[0][y * cuSize + x]);
+        }
+    }
+    mean = mean / (cuSize * cuSize);
+    for (uint32_t y = 0 ; y < cuSize; y++){
+        for (uint32_t x = 0 ; x < cuSize; x++){
+            homo += abs(int(bestMode.fencYuv->m_buf[0][y * cuSize + x] - mean));
+        }
+    }
+    homo = homo / (cuSize * cuSize);
+
+    if (homo < (.1 * mean))
+        return true;
+
+    return false;
+}
+
 int Analysis::calculateQpforCuSize(const CUData& ctu, const CUGeom& cuGeom, double baseQp)
 {
     FrameData& curEncData = *m_frame->m_encData;
diff -r 0af296185f7a -r 4baa78c17dca source/encoder/analysis.h
--- a/source/encoder/analysis.h	Tue Jun 07 09:20:11 2016 +0530
+++ b/source/encoder/analysis.h	Wed May 18 09:24:48 2016 -0700
@@ -160,6 +160,7 @@
     /* work-avoidance heuristics for RD levels < 5 */
     uint32_t topSkipMinDepth(const CUData& parentCTU, const CUGeom& cuGeom);
     bool recursionDepthCheck(const CUData& parentCTU, const CUGeom& cuGeom, const Mode& bestMode);
+    bool complexityCheckCU(const Mode& bestMode);
 
     /* generate residual and recon pixels for an entire CTU recursively (RD0) */
     void encodeResidue(const CUData& parentCTU, const CUGeom& cuGeom);


More information about the x265-devel mailing list