[x265] [PATCH 1 of 2] analysis-save/load: Enforce resolution and maxCUSize constraints in non-dyadic

Aruna Matheswaran aruna at multicorewareinc.com
Fri Jan 24 06:42:29 CET 2020


# HG changeset patch
# User Aruna Matheswaran <aruna at multicorewareinc.com>
# Date 1579629937 -19800
#      Tue Jan 21 23:35:37 2020 +0530
# Node ID ba9cb149de98b7ad753686d155155419d1ea1d50
# Parent  acc5d16999e2faf6e75ecc1df9a01c1953ebaf8c
analysis-save/load: Enforce resolution and maxCUSize constraints in non-dyadic
analysis load only if analysis-load-reuse-level > 1.

This patch removes resolution and maxCUSize constraints in
analysis-load-reuse-level 1 as it re-uses only frame level info.

It also fixes the encoder crashes that were present earlier due to
1) Unwanted analysis load validation failures in re-use level 10
2) Incorrect memory allocation for multi-pass-opt-analysis/distortion

diff -r acc5d16999e2 -r ba9cb149de98 source/encoder/api.cpp
--- a/source/encoder/api.cpp	Mon Jan 20 18:07:59 2020 +0530
+++ b/source/encoder/api.cpp	Tue Jan 21 23:35:37 2020 +0530
@@ -812,13 +812,14 @@
     if (!isMultiPassOpt && !(param->bAnalysisType == AVC_INFO))
         CHECKED_MALLOC_ZERO(analysis->wt, x265_weight_param, numPlanes * numDir);
 
-    if (maxReuseLevel < 2)
-        return;
+    //Allocate memory for intraData pointer
+    if ((maxReuseLevel > 1) || isMultiPassOpt)
+    {
+        CHECKED_MALLOC_ZERO(intraData, x265_analysis_intra_data, 1);
+        CHECKED_MALLOC(intraData->depth, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);
+    }
 
-    //Allocate memory for intraData pointer
-    CHECKED_MALLOC_ZERO(intraData, x265_analysis_intra_data, 1);
-    CHECKED_MALLOC(intraData->depth, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);
-    if (!isMultiPassOpt)
+    if (maxReuseLevel > 1)
     {
         CHECKED_MALLOC_ZERO(intraData->modes, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);
         CHECKED_MALLOC_ZERO(intraData->partSizes, char, analysis->numPartitions * analysis->numCUsInFrame);
@@ -828,17 +829,20 @@
     }
     analysis->intraData = intraData;
 
-    //Allocate memory for interData pointer based on ReuseLevels
-    CHECKED_MALLOC_ZERO(interData, x265_analysis_inter_data, 1);
-    CHECKED_MALLOC(interData->depth, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);
-    CHECKED_MALLOC_ZERO(interData->modes, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);
+    if ((maxReuseLevel > 1) || isMultiPassOpt)
+    {
+        //Allocate memory for interData pointer based on ReuseLevels
+        CHECKED_MALLOC_ZERO(interData, x265_analysis_inter_data, 1);
+        CHECKED_MALLOC(interData->depth, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);
+        CHECKED_MALLOC_ZERO(interData->modes, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);
 
-    if (param->rc.cuTree && !isMultiPassOpt)
-        CHECKED_MALLOC_ZERO(interData->cuQPOff, int8_t, analysis->numPartitions * analysis->numCUsInFrame);
-    CHECKED_MALLOC_ZERO(interData->mvpIdx[0], uint8_t, analysis->numPartitions * analysis->numCUsInFrame);
-    CHECKED_MALLOC_ZERO(interData->mvpIdx[1], uint8_t, analysis->numPartitions * analysis->numCUsInFrame);
-    CHECKED_MALLOC_ZERO(interData->mv[0], x265_analysis_MV, analysis->numPartitions * analysis->numCUsInFrame);
-    CHECKED_MALLOC_ZERO(interData->mv[1], x265_analysis_MV, analysis->numPartitions * analysis->numCUsInFrame);
+        if (param->rc.cuTree && !isMultiPassOpt)
+            CHECKED_MALLOC_ZERO(interData->cuQPOff, int8_t, analysis->numPartitions * analysis->numCUsInFrame);
+        CHECKED_MALLOC_ZERO(interData->mvpIdx[0], uint8_t, analysis->numPartitions * analysis->numCUsInFrame);
+        CHECKED_MALLOC_ZERO(interData->mvpIdx[1], uint8_t, analysis->numPartitions * analysis->numCUsInFrame);
+        CHECKED_MALLOC_ZERO(interData->mv[0], x265_analysis_MV, analysis->numPartitions * analysis->numCUsInFrame);
+        CHECKED_MALLOC_ZERO(interData->mv[1], x265_analysis_MV, analysis->numPartitions * analysis->numCUsInFrame);
+    }
 
     if (maxReuseLevel > 4)
     {
@@ -905,9 +909,6 @@
     if (!isMultiPassOpt && analysis->wt && !(param->bAnalysisType == AVC_INFO))
         X265_FREE(analysis->wt);
 
-    if (maxReuseLevel < 2)
-        return;
-
     //Free memory for intraData pointers
     if (analysis->intraData)
     {
diff -r acc5d16999e2 -r ba9cb149de98 source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp	Mon Jan 20 18:07:59 2020 +0530
+++ b/source/encoder/encoder.cpp	Tue Jan 21 23:35:37 2020 +0530
@@ -4990,8 +4990,8 @@
         X265_FREAD(&readValue, sizeof(int), 1, m_analysisFileIn, &(saveParam->maxCUSize));
 
         bool isScaledRes = (2 * sourceHeight == curSourceHeight) && (2 * sourceWidth == curSourceWidth);
-        if (!isScaledRes && (sourceHeight != curSourceHeight || sourceWidth != curSourceWidth 
-                            || readValue != (int)m_param->maxCUSize || m_param->scaleFactor))
+        if (!isScaledRes && (m_param->analysisLoadReuseLevel > 1) && (sourceHeight != curSourceHeight
+            || sourceWidth != curSourceWidth || readValue != (int)m_param->maxCUSize || m_param->scaleFactor))
             error = true;
         else if (isScaledRes && !m_param->scaleFactor)
             error = true;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265_push-1.patch
Type: text/x-patch
Size: 5135 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20200124/dfb1e72d/attachment-0001.bin>


More information about the x265-devel mailing list