<div dir="ltr">  Resent the patch after re-basing on default tip; Please ignore this.  <br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jan 7, 2020 at 2:25 PM Aruna Matheswaran <<a href="mailto:aruna@multicorewareinc.com">aruna@multicorewareinc.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"># HG changeset patch<br>
# User Aruna Matheswaran <<a href="mailto:aruna@multicorewareinc.com" target="_blank">aruna@multicorewareinc.com</a>><br>
# Date 1576499107 -19800<br>
#  Â  Â  Mon Dec 16 17:55:07 2019 +0530<br>
# Node ID 4d870dd7c314334b27413de922d08d9c01d5860b<br>
# Parent  52135ffd9bcdd32b944311e9e66c473894c0a2bd<br>
De-couple analysis reuse levels of --analysis-save and --analysis-load.<br>
<br>
Currently, analysis reuse level of the load encode has to be the same as that of<br>
the reuse level of the save encode. This commit de-couples the reuse level<br>
constraints and let the load encode re-use a subset of the available analysis<br>
info.<br>
<br>
Two CLI and x265_param options are introduced to get the desired reuse level<br>
during save and load.<br>
<br>
The existing option --analysis-reuse-level is deprecated.<br>
<br>
diff -r 52135ffd9bcd -r 4d870dd7c314 doc/reST/cli.rst<br>
--- a/doc/reST/cli.rst  Mon Dec 23 14:40:32 2019 +0530<br>
+++ b/doc/reST/cli.rst  Mon Dec 16 17:55:07 2019 +0530<br>
@@ -918,12 +918,14 @@<br>
  Â  Â  Â  Specify a filename for `multi-pass-opt-analysis` and `multi-pass-opt-distortion`.<br>
  Â  Â  Â  If no filename is specified, x265_analysis.dat is used.<br>
<br>
-.. option:: --analysis-reuse-level <1..10><br>
-<br>
-  Â  Â  Â Amount of information stored/reused in :option:`--analysis-reuse-mode` is distributed across levels.<br>
+.. option:: --analysis-save-reuse-level <1..10>, --analysis-load-reuse-level <1..10><br>
+<br>
+  Â  Â  Â :option:`--analysis-save-reuse-level` denotes the amount of information stored during :option:`--analysis-save` and<br>
+  Â  Â  Â :option:`--analysis-load-reuse-level` denotes the amount of information reused during :option:`--analysis-load`.<br>
  Â  Â  Â  Higher the value, higher the information stored/reused, faster the encode. Default 5.<br>
<br>
-  Â  Â  Â Note that --analysis-reuse-level must be paired with analysis-reuse-mode.<br>
+  Â  Â  Â Note that :option:`--analysis-save-reuse-level` and :option:`--analysis-load-reuse-level` must be paired<br>
+  Â  Â  Â with :option:`--analysis-save` and :option:`--analysis-load` respectively.<br>
<br>
  Â  Â  Â  +--------------+------------------------------------------+<br>
  Â  Â  Â  | Level  Â  Â  Â  | Description  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  |<br>
diff -r 52135ffd9bcd -r 4d870dd7c314 source/CMakeLists.txt<br>
--- a/source/CMakeLists.txt  Â  Â Mon Dec 23 14:40:32 2019 +0530<br>
+++ b/source/CMakeLists.txt  Â  Â Mon Dec 16 17:55:07 2019 +0530<br>
@@ -29,7 +29,7 @@<br>
 option(STATIC_LINK_CRT "Statically link C runtime for release builds" OFF)<br>
 mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)<br>
 # X265_BUILD must be incremented each time the public API is changed<br>
-set(X265_BUILD 184)<br>
+set(X265_BUILD 185)<br>
 configure_file("${PROJECT_SOURCE_DIR}/<a href="http://x265.def.in" rel="noreferrer" target="_blank">x265.def.in</a>"<br>
  Â  Â  Â  Â  Â  Â  Â  "${PROJECT_BINARY_DIR}/x265.def")<br>
 configure_file("${PROJECT_SOURCE_DIR}/<a href="http://x265_config.h.in" rel="noreferrer" target="_blank">x265_config.h.in</a>"<br>
diff -r 52135ffd9bcd -r 4d870dd7c314 source/common/param.cpp<br>
--- a/source/common/param.cpp  Â Mon Dec 23 14:40:32 2019 +0530<br>
+++ b/source/common/param.cpp  Â Mon Dec 16 17:55:07 2019 +0530<br>
@@ -319,7 +319,9 @@<br>
  Â  Â param->bOptCUDeltaQP  Â  Â  Â  = 0;<br>
  Â  Â param->bAQMotion = 0;<br>
  Â  Â param->bHDROpt = 0;<br>
-  Â  param->analysisReuseLevel = 5;<br>
+  Â  param->analysisReuseLevel = 0;  /*DEPRECATED*/<br>
+  Â  param->analysisSaveReuseLevel = 0;<br>
+  Â  param->analysisLoadReuseLevel = 0;<br>
  Â  Â param->toneMapFile = NULL;<br>
  Â  Â param->bDhdr10opt = 0;<br>
  Â  Â param->dolbyProfile = 0;<br>
@@ -1219,7 +1221,14 @@<br>
  Â  Â  Â  Â OPT("multi-pass-opt-distortion") p->analysisMultiPassDistortion = atobool(value);<br>
  Â  Â  Â  Â OPT("aq-motion") p->bAQMotion = atobool(value);<br>
  Â  Â  Â  Â OPT("dynamic-rd") p->dynamicRd = atof(value);<br>
-  Â  Â  Â  OPT("analysis-reuse-level") p->analysisReuseLevel = atoi(value);<br>
+  Â  Â  Â  OPT("analysis-reuse-level")<br>
+  Â  Â  Â  {<br>
+  Â  Â  Â  Â  Â  p->analysisReuseLevel = atoi(value);<br>
+  Â  Â  Â  Â  Â  p->analysisSaveReuseLevel = atoi(value);<br>
+  Â  Â  Â  Â  Â  p->analysisLoadReuseLevel = atoi(value);<br>
+  Â  Â  Â  }<br>
+  Â  Â  Â  OPT("analysis-save-reuse-level") p->analysisSaveReuseLevel = atoi(value);<br>
+  Â  Â  Â  OPT("analysis-load-reuse-level") p->analysisLoadReuseLevel = atoi(value);<br>
  Â  Â  Â  Â OPT("ssim-rd")<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â int bval = atobool(value);<br>
@@ -1260,7 +1269,7 @@<br>
  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â  Â  Â else if (strcmp(strdup(value), "off") == 0)<br>
  Â  Â  Â  Â  Â  Â {<br>
-  Â  Â  Â  Â  Â  Â  Â  p->bAnalysisType = NO_INFO;<br>
+  Â  Â  Â  Â  Â  Â  Â  p->bAnalysisType = DEFAULT;<br>
  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â  Â  Â else<br>
  Â  Â  Â  Â  Â  Â {<br>
@@ -1696,8 +1705,10 @@<br>
  Â  Â  Â  Â  Â "Constant QP is incompatible with 2pass");<br>
  Â  Â CHECK(param->rc.bStrictCbr && (param->rc.bitrate <= 0 || param->rc.vbvBufferSize <=0),<br>
  Â  Â  Â  Â  Â "Strict-cbr cannot be applied without specifying target bitrate or vbv bufsize");<br>
-  Â  CHECK((param->analysisSave || param->analysisLoad) && (param->analysisReuseLevel < 1 || param->analysisReuseLevel > 10),<br>
-  Â  Â  Â  "Invalid analysis refine level. Value must be between 1 and 10 (inclusive)");<br>
+  Â  CHECK(param->analysisSave && (param->analysisSaveReuseLevel < 1 || param->analysisSaveReuseLevel > 10),<br>
+  Â  Â  Â  "Invalid analysis save refine level. Value must be between 1 and 10 (inclusive)");<br>
+  Â  CHECK(param->analysisLoad && (param->analysisLoadReuseLevel < 1 || param->analysisLoadReuseLevel > 10),<br>
+  Â  Â  Â  "Invalid analysis load refine level. Value must be between 1 and 10 (inclusive)");<br>
  Â  Â CHECK(param->analysisLoad && (param->mvRefine < 1 || param->mvRefine > 3),<br>
  Â  Â  Â  Â "Invalid mv refinement level. Value must be between 1 and 3 (inclusive)");<br>
  Â  Â CHECK(param->scaleFactor > 2, "Invalid scale-factor. Supports factor <= 2");<br>
@@ -2160,6 +2171,8 @@<br>
  Â  Â if (p->analysisLoad)<br>
  Â  Â  Â  Â s += sprintf(s, " analysis-load");<br>
  Â  Â s += sprintf(s, " analysis-reuse-level=%d", p->analysisReuseLevel);<br>
+  Â  s += sprintf(s, " analysis-save-reuse-level=%d", p->analysisSaveReuseLevel);<br>
+  Â  s += sprintf(s, " analysis-load-reuse-level=%d", p->analysisLoadReuseLevel);<br>
  Â  Â s += sprintf(s, " scale-factor=%d", p->scaleFactor);<br>
  Â  Â s += sprintf(s, " refine-intra=%d", p->intraRefine);<br>
  Â  Â s += sprintf(s, " refine-inter=%d", p->interRefine);<br>
@@ -2477,6 +2490,8 @@<br>
  Â  Â dst->bEmitHRDSEI = src->bEmitHRDSEI;<br>
  Â  Â dst->bHDROpt = src->bHDROpt;<br>
  Â  Â dst->analysisReuseLevel = src->analysisReuseLevel;<br>
+  Â  dst->analysisSaveReuseLevel = src->analysisSaveReuseLevel;<br>
+  Â  dst->analysisLoadReuseLevel = src->analysisLoadReuseLevel;<br>
  Â  Â dst->bLimitSAO = src->bLimitSAO;<br>
  Â  Â if (src->toneMapFile) dst->toneMapFile = strdup(src->toneMapFile);<br>
  Â  Â else dst->toneMapFile = NULL;<br>
diff -r 52135ffd9bcd -r 4d870dd7c314 source/encoder/analysis.cpp<br>
--- a/source/encoder/analysis.cpp  Â  Â  Â Mon Dec 23 14:40:32 2019 +0530<br>
+++ b/source/encoder/analysis.cpp  Â  Â  Â Mon Dec 16 17:55:07 2019 +0530<br>
@@ -202,14 +202,17 @@<br>
  Â  Â  Â  Â m_reuseDepth = &m_reuseInterDataCTU->depth[ctu.m_cuAddr * ctu.m_numPartitions];<br>
  Â  Â }<br>
<br>
-  Â  if ((m_param->analysisSave || m_param->analysisLoad) && m_slice->m_sliceType != I_SLICE && m_param->analysisReuseLevel > 1 && m_param->analysisReuseLevel < 10)<br>
+  Â  int reuseLevel = X265_MAX(m_param->analysisSaveReuseLevel, m_param->analysisLoadReuseLevel);<br>
+  Â  if ((m_param->analysisSave || m_param->analysisLoad) && m_slice->m_sliceType != I_SLICE && reuseLevel > 1 && reuseLevel < 10)<br>
  Â  Â {<br>
  Â  Â  Â  Â int numPredDir = m_slice->isInterP() ? 1 : 2;<br>
  Â  Â  Â  Â m_reuseInterDataCTU = m_frame->m_analysisData.interData;<br>
-  Â  Â  Â  m_reuseRef = &m_reuseInterDataCTU->ref [ctu.m_cuAddr * X265_MAX_PRED_MODE_PER_CTU * numPredDir];<br>
+  Â  Â  Â  if (((m_param->analysisSaveReuseLevel > 1) && (m_param->analysisSaveReuseLevel < 7)) ||<br>
+  Â  Â  Â  Â  Â  ((m_param->analysisLoadReuseLevel > 1) && (m_param->analysisLoadReuseLevel < 7)))<br>
+  Â  Â  Â  Â  Â  m_reuseRef = &m_reuseInterDataCTU->ref[ctu.m_cuAddr * X265_MAX_PRED_MODE_PER_CTU * numPredDir];<br>
  Â  Â  Â  Â m_reuseDepth = &m_reuseInterDataCTU->depth[ctu.m_cuAddr * ctu.m_numPartitions];<br>
  Â  Â  Â  Â m_reuseModes = &m_reuseInterDataCTU->modes[ctu.m_cuAddr * ctu.m_numPartitions];<br>
-  Â  Â  Â  if (m_param->analysisReuseLevel > 4)<br>
+  Â  Â  Â  if (reuseLevel > 4)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â m_reusePartSize = &m_reuseInterDataCTU->partSize[ctu.m_cuAddr * ctu.m_numPartitions];<br>
  Â  Â  Â  Â  Â  Â m_reuseMergeFlag = &m_reuseInterDataCTU->mergeFlag[ctu.m_cuAddr * ctu.m_numPartitions];<br>
@@ -223,7 +226,7 @@<br>
  Â  Â if (m_slice->m_sliceType == I_SLICE)<br>
  Â  Â {<br>
  Â  Â  Â  Â x265_analysis_intra_data* intraDataCTU = m_frame->m_analysisData.intraData;<br>
-  Â  Â  Â  if (m_param->analysisLoad && m_param->analysisReuseLevel > 1)<br>
+  Â  Â  Â  if (m_param->analysisLoadReuseLevel > 1)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â memcpy(ctu.m_cuDepth, &intraDataCTU->depth[ctu.m_cuAddr * numPartition], sizeof(uint8_t) * numPartition);<br>
  Â  Â  Â  Â  Â  Â memcpy(ctu.m_lumaIntraDir, &intraDataCTU->modes[ctu.m_cuAddr * numPartition], sizeof(uint8_t) * numPartition);<br>
@@ -234,9 +237,9 @@<br>
  Â  Â }<br>
  Â  Â else<br>
  Â  Â {<br>
-  Â  Â  Â  bool bCopyAnalysis = ((m_param->analysisLoad && m_param->analysisReuseLevel == 10) || (m_param->bAnalysisType == AVC_INFO && m_param->analysisReuseLevel >= 7 && ctu.m_numPartitions <= 16));<br>
-  Â  Â  Â  bool BCompressInterCUrd0_4 = (m_param->bAnalysisType == AVC_INFO && m_param->analysisReuseLevel >= 7 && m_param->rdLevel <= 4);<br>
-  Â  Â  Â  bool BCompressInterCUrd5_6 = (m_param->bAnalysisType == AVC_INFO && m_param->analysisReuseLevel >= 7 && m_param->rdLevel >= 5 && m_param->rdLevel <= 6);<br>
+  Â  Â  Â  bool bCopyAnalysis = ((m_param->analysisLoadReuseLevel == 10) || (m_param->bAnalysisType == AVC_INFO && m_param->analysisLoadReuseLevel >= 7 && ctu.m_numPartitions <= 16));<br>
+  Â  Â  Â  bool BCompressInterCUrd0_4 = (m_param->bAnalysisType == AVC_INFO && m_param->analysisLoadReuseLevel >= 7 && m_param->rdLevel <= 4);<br>
+  Â  Â  Â  bool BCompressInterCUrd5_6 = (m_param->bAnalysisType == AVC_INFO && m_param->analysisLoadReuseLevel >= 7 && m_param->rdLevel >= 5 && m_param->rdLevel <= 6);<br>
  Â  Â  Â  Â bCopyAnalysis = bCopyAnalysis || BCompressInterCUrd0_4 || BCompressInterCUrd5_6;<br>
<br>
  Â  Â  Â  Â if (bCopyAnalysis)<br>
@@ -275,8 +278,8 @@<br>
  Â  Â  Â  Â  Â  Â /* generate residual for entire CTU at once and copy to reconPic */<br>
  Â  Â  Â  Â  Â  Â encodeResidue(ctu, cuGeom);<br>
  Â  Â  Â  Â }<br>
-  Â  Â  Â  else if ((m_param->analysisLoad && m_param->analysisReuseLevel == 10 && (!(m_param->bAnalysisType == HEVC_INFO) || m_slice->m_sliceType != P_SLICE)) ||<br>
-  Â  Â  Â  Â  Â  Â  Â  Â ((m_param->bAnalysisType == AVC_INFO) && m_param->analysisReuseLevel >= 7 && ctu.m_numPartitions <= 16))<br>
+  Â  Â  Â  else if ((m_param->analysisLoadReuseLevel == 10 && (!(m_param->bAnalysisType == HEVC_INFO) || m_slice->m_sliceType != P_SLICE)) ||<br>
+  Â  Â  Â  Â  Â  Â  Â  ((m_param->bAnalysisType == AVC_INFO) && m_param->analysisLoadReuseLevel >= 7 && ctu.m_numPartitions <= 16))<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â x265_analysis_inter_data* interDataCTU = m_frame->m_analysisData.interData;<br>
  Â  Â  Â  Â  Â  Â int posCTU = ctu.m_cuAddr * numPartition;<br>
@@ -456,7 +459,7 @@<br>
  Â  Â int bestCUQP = qp;<br>
  Â  Â int lambdaQP = lqp;<br>
  Â  Â bool doQPRefine = (bDecidedDepth && depth <= m_slice->m_pps->maxCuDQPDepth) || (!bDecidedDepth && depth == m_slice->m_pps->maxCuDQPDepth);<br>
-  Â  if (m_param->analysisReuseLevel >= 7)<br>
+  Â  if (m_param->analysisLoadReuseLevel >= 7)<br>
  Â  Â  Â  Â doQPRefine = false;<br>
  Â  Â if (doQPRefine)<br>
  Â  Â {<br>
@@ -1164,7 +1167,7 @@<br>
  Â  Â SplitData splitCUData;<br>
<br>
  Â  Â bool bHEVCBlockAnalysis = (m_param->bAnalysisType == AVC_INFO && cuGeom.numPartitions > 16);<br>
-  Â  bool bRefineAVCAnalysis = (m_param->analysisReuseLevel == 7 && (m_modeFlag[0] || m_modeFlag[1]));<br>
+  Â  bool bRefineAVCAnalysis = (m_param->analysisLoadReuseLevel == 7 && (m_modeFlag[0] || m_modeFlag[1]));<br>
  Â  Â bool bNooffloading = !(m_param->bAnalysisType == AVC_INFO);<br>
<br>
  Â  Â if (bHEVCBlockAnalysis || bRefineAVCAnalysis || bNooffloading)<br>
@@ -1259,7 +1262,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â mightSplit &= !bDecidedDepth;<br>
  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â }<br>
-  Â  Â  Â  if ((m_param->analysisLoad && m_param->analysisReuseLevel > 1 && m_param->analysisReuseLevel != 10))<br>
+  Â  Â  Â  if ((m_param->analysisLoadReuseLevel > 1 && m_param->analysisLoadReuseLevel != 10))<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â if (mightNotSplit && depth == m_reuseDepth[cuGeom.absPartIdx])<br>
  Â  Â  Â  Â  Â  Â {<br>
@@ -1273,7 +1276,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â if (m_param->rdLevel)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â skipModes = m_param->bEnableEarlySkip && md.bestMode;<br>
  Â  Â  Â  Â  Â  Â  Â  Â }<br>
-  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel > 4 && m_reusePartSize[cuGeom.absPartIdx] == SIZE_2Nx2N)<br>
+  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel > 4 && m_reusePartSize[cuGeom.absPartIdx] == SIZE_2Nx2N)<br>
  Â  Â  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â if (m_reuseModes[cuGeom.absPartIdx] != MODE_INTRA  && m_reuseModes[cuGeom.absPartIdx] != 4)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â {<br>
@@ -1300,7 +1303,8 @@<br>
  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â }<br>
  Â  Â  Â  Â /* Step 1. Evaluate Merge/Skip candidates for likely early-outs, if skip mode was not set above */<br>
-  Â  Â  Â  if ((mightNotSplit && depth >= minDepth && !md.bestMode && !bCtuInfoCheck) || (m_param->bAnalysisType == AVC_INFO && m_param->analysisReuseLevel == 7 && (m_modeFlag[0] || m_modeFlag[1]))) /* TODO: Re-evaluate if analysis load/save still works */<br>
+  Â  Â  Â  if ((mightNotSplit && depth >= minDepth && !md.bestMode && !bCtuInfoCheck) || (m_param->bAnalysisType == AVC_INFO && m_param->analysisLoadReuseLevel == 7 && (m_modeFlag[0] || m_modeFlag[1])))<br>
+  Â  Â  Â  Â  Â  /* TODO: Re-evaluate if analysis load/save still works */<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â /* Compute Merge Cost */<br>
  Â  Â  Â  Â  Â  Â md.pred[PRED_MERGE].cu.initSubCU(parentCTU, cuGeom, qp);<br>
@@ -1310,7 +1314,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â skipModes = (m_param->bEnableEarlySkip || m_refineLevel == 2)<br>
  Â  Â  Â  Â  Â  Â  Â  Â && md.bestMode && md.bestMode->cu.isSkipped(0); // TODO: sa8d threshold per depth<br>
  Â  Â  Â  Â }<br>
-  Â  Â  Â  if (md.bestMode && m_param->bEnableRecursionSkip && !bCtuInfoCheck && !(m_param->bAnalysisType == AVC_INFO && m_param->analysisReuseLevel == 7 && (m_modeFlag[0] || m_modeFlag[1])))<br>
+  Â  Â  Â  if (md.bestMode && m_param->bEnableRecursionSkip && !bCtuInfoCheck && !(m_param->bAnalysisType == AVC_INFO && m_param->analysisLoadReuseLevel == 7 && (m_modeFlag[0] || m_modeFlag[1])))<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â skipRecursion = md.bestMode->cu.isSkipped(0);<br>
  Â  Â  Â  Â  Â  Â if (mightSplit && depth >= minDepth && !skipRecursion)<br>
@@ -1321,7 +1325,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â skipRecursion = complexityCheckCU(*md.bestMode);<br>
  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â }<br>
-  Â  Â  Â  if (m_param->bAnalysisType == AVC_INFO && md.bestMode && cuGeom.numPartitions <= 16 && m_param->analysisReuseLevel == 7)<br>
+  Â  Â  Â  if (m_param->bAnalysisType == AVC_INFO && md.bestMode && cuGeom.numPartitions <= 16 && m_param->analysisLoadReuseLevel == 7)<br>
  Â  Â  Â  Â  Â  Â skipRecursion = true;<br>
  Â  Â  Â  Â /* Step 2. Evaluate each of the 4 split sub-blocks in series */<br>
  Â  Â  Â  Â if (mightSplit && !skipRecursion)<br>
@@ -1378,7 +1382,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â splitPred->sa8dCost = m_rdCost.calcRdSADCost((uint32_t)splitPred->distortion, splitPred->sa8dBits);<br>
  Â  Â  Â  Â }<br>
  Â  Â  Â  Â /* If analysis mode is simple do not Evaluate other modes */<br>
-  Â  Â  Â  if (m_param->bAnalysisType == AVC_INFO && m_param->analysisReuseLevel == 7)<br>
+  Â  Â  Â  if (m_param->bAnalysisType == AVC_INFO && m_param->analysisLoadReuseLevel == 7)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â if (m_slice->m_sliceType == P_SLICE)<br>
  Â  Â  Â  Â  Â  Â {<br>
@@ -1857,7 +1861,7 @@<br>
  Â  Â SplitData splitCUData;<br>
<br>
  Â  Â bool bHEVCBlockAnalysis = (m_param->bAnalysisType == AVC_INFO && cuGeom.numPartitions > 16);<br>
-  Â  bool bRefineAVCAnalysis = (m_param->analysisReuseLevel == 7 && (m_modeFlag[0] || m_modeFlag[1]));<br>
+  Â  bool bRefineAVCAnalysis = (m_param->analysisLoadReuseLevel == 7 && (m_modeFlag[0] || m_modeFlag[1]));<br>
  Â  Â bool bNooffloading = !(m_param->bAnalysisType == AVC_INFO);<br>
<br>
  Â  Â if (bHEVCBlockAnalysis || bRefineAVCAnalysis || bNooffloading)<br>
@@ -1953,7 +1957,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â mightSplit &= !bDecidedDepth;<br>
  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â }<br>
-  Â  Â  Â  if (m_param->analysisLoad && m_param->analysisReuseLevel > 1 && m_param->analysisReuseLevel != 10)<br>
+  Â  Â  Â  if (m_param->analysisLoadReuseLevel > 1 && m_param->analysisLoadReuseLevel != 10)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â if (mightNotSplit && depth == m_reuseDepth[cuGeom.absPartIdx])<br>
  Â  Â  Â  Â  Â  Â {<br>
@@ -1971,7 +1975,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â if (m_param->bEnableRecursionSkip && depth && m_modeDepth[depth - 1].bestMode)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â skipRecursion = md.bestMode && !md.bestMode->cu.getQtRootCbf(0);<br>
  Â  Â  Â  Â  Â  Â  Â  Â }<br>
-  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel > 4 && m_reusePartSize[cuGeom.absPartIdx] == SIZE_2Nx2N)<br>
+  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel > 4 && m_reusePartSize[cuGeom.absPartIdx] == SIZE_2Nx2N)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â skipRectAmp = true && !!md.bestMode;<br>
  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â }<br>
@@ -1999,7 +2003,7 @@<br>
  Â  Â  Â  Â }<br>
  Â  Â  Â  Â /* Step 1. Evaluate Merge/Skip candidates for likely early-outs */<br>
  Â  Â  Â  Â if ((mightNotSplit && !md.bestMode && !bCtuInfoCheck) ||<br>
-  Â  Â  Â  Â  Â  (m_param->bAnalysisType == AVC_INFO && m_param->analysisReuseLevel == 7 && (m_modeFlag[0] || m_modeFlag[1])))<br>
+  Â  Â  Â  Â  Â  (m_param->bAnalysisType == AVC_INFO && m_param->analysisLoadReuseLevel == 7 && (m_modeFlag[0] || m_modeFlag[1])))<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â md.pred[PRED_SKIP].cu.initSubCU(parentCTU, cuGeom, qp);<br>
  Â  Â  Â  Â  Â  Â md.pred[PRED_MERGE].cu.initSubCU(parentCTU, cuGeom, qp);<br>
@@ -2014,7 +2018,7 @@<br>
  Â  Â  Â  Â  Â  Â if (m_param->bEnableRecursionSkip && depth && m_modeDepth[depth - 1].bestMode)<br>
  Â  Â  Â  Â  Â  Â  Â  Â skipRecursion = md.bestMode && !md.bestMode->cu.getQtRootCbf(0);<br>
  Â  Â  Â  Â }<br>
-  Â  Â  Â  if (m_param->bAnalysisType == AVC_INFO && md.bestMode && cuGeom.numPartitions <= 16 && m_param->analysisReuseLevel == 7)<br>
+  Â  Â  Â  if (m_param->bAnalysisType == AVC_INFO && md.bestMode && cuGeom.numPartitions <= 16 && m_param->analysisLoadReuseLevel == 7)<br>
  Â  Â  Â  Â  Â  Â skipRecursion = true;<br>
  Â  Â  Â  Â // estimate split cost<br>
  Â  Â  Â  Â /* Step 2. Evaluate each of the 4 split sub-blocks in series */<br>
@@ -2068,7 +2072,7 @@<br>
  Â  Â  Â  Â  Â  Â checkDQPForSplitPred(*splitPred, cuGeom);<br>
  Â  Â  Â  Â }<br>
  Â  Â  Â  Â /* If analysis mode is simple do not Evaluate other modes */<br>
-  Â  Â  Â  if (m_param->bAnalysisType == AVC_INFO && m_param->analysisReuseLevel == 7)<br>
+  Â  Â  Â  if (m_param->bAnalysisType == AVC_INFO && m_param->analysisLoadReuseLevel == 7)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â if (m_slice->m_sliceType == P_SLICE)<br>
  Â  Â  Â  Â  Â  Â {<br>
@@ -2461,7 +2465,7 @@<br>
  Â  Â  Â  Â  Â  Â for (uint32_t part = 0; part < numPU; part++)<br>
  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â PredictionUnit pu(<a href="http://mode.cu" rel="noreferrer" target="_blank">mode.cu</a>, cuGeom, part);<br>
-  Â  Â  Â  Â  Â  Â  Â  if ((m_param->analysisLoad && m_param->analysisReuseLevel == 10) || (m_param->bAnalysisType == AVC_INFO && m_param->analysisReuseLevel >= 7))<br>
+  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel == 10 || (m_param->bAnalysisType == AVC_INFO && m_param->analysisLoadReuseLevel >= 7))<br>
  Â  Â  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â x265_analysis_inter_data* interDataCTU = m_frame->m_analysisData.interData;<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â int cuIdx = (mode.cu.m_cuAddr * parentCTU.m_numPartitions) + cuGeom.absPartIdx;<br>
@@ -2552,7 +2556,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â checkDQPForSplitPred(*md.bestMode, cuGeom);<br>
  Â  Â  Â  Â }<br>
<br>
-  Â  Â  Â  if (m_param->bAnalysisType == AVC_INFO && m_param->analysisReuseLevel == 7)<br>
+  Â  Â  Â  if (m_param->bAnalysisType == AVC_INFO && m_param->analysisLoadReuseLevel == 7)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â for (int list = 0; list < m_slice->isInterB() + 1; list++)<br>
  Â  Â  Â  Â  Â  Â {<br>
@@ -2607,7 +2611,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â if (m_slice->m_pps->bUseDQP && nextDepth <= m_slice->m_pps->maxCuDQPDepth)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â nextQP = setLambdaFromQP(parentCTU, calculateQpforCuSize(parentCTU, childGeom));<br>
<br>
-  Â  Â  Â  Â  Â  Â  Â  int lamdaQP = (m_param->analysisReuseLevel >= 7) ? nextQP : lqp;<br>
+  Â  Â  Â  Â  Â  Â  Â  int lamdaQP = (m_param->analysisLoadReuseLevel >= 7) ? nextQP : lqp;<br>
<br>
  Â  Â  Â  Â  Â  Â  Â  Â if (split)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â m_param->rdLevel > 4 ? compressInterCU_rd5_6(parentCTU, childGeom, nextQP) : compressInterCU_rd0_4(parentCTU, childGeom, nextQP);<br>
@@ -3013,7 +3017,7 @@<br>
  Â  Â interMode.cu.setPredModeSubParts(MODE_INTER);<br>
  Â  Â int numPredDir = m_slice->isInterP() ? 1 : 2;<br>
<br>
-  Â  if (m_param->analysisLoad && m_reuseInterDataCTU && m_param->analysisReuseLevel > 1 && m_param->analysisReuseLevel != 10)<br>
+  Â  if (m_param->analysisLoadReuseLevel > 1 && m_param->analysisLoadReuseLevel != 10 && m_reuseInterDataCTU)<br>
  Â  Â {<br>
  Â  Â  Â  Â int refOffset = cuGeom.geomRecurId * 16 * numPredDir + partSize * numPredDir * 2;<br>
  Â  Â  Â  Â int index = 0;<br>
@@ -3056,7 +3060,7 @@<br>
  Â  Â }<br>
  Â  Â interMode.sa8dCost = m_rdCost.calcRdSADCost((uint32_t)interMode.distortion, interMode.sa8dBits);<br>
<br>
-  Â  if (m_param->analysisSave && m_reuseInterDataCTU && m_param->analysisReuseLevel > 1)<br>
+  Â  if (m_param->analysisSaveReuseLevel > 1 && m_reuseInterDataCTU)<br>
  Â  Â {<br>
  Â  Â  Â  Â int refOffset = cuGeom.geomRecurId * 16 * numPredDir + partSize * numPredDir * 2;<br>
  Â  Â  Â  Â int index = 0;<br>
@@ -3078,7 +3082,7 @@<br>
  Â  Â interMode.cu.setPredModeSubParts(MODE_INTER);<br>
  Â  Â int numPredDir = m_slice->isInterP() ? 1 : 2;<br>
<br>
-  Â  if (m_param->analysisLoad && m_reuseInterDataCTU && m_param->analysisReuseLevel > 1 && m_param->analysisReuseLevel != 10)<br>
+  Â  if (m_param->analysisLoadReuseLevel > 1 && m_param->analysisLoadReuseLevel != 10 && m_reuseInterDataCTU)<br>
  Â  Â {<br>
  Â  Â  Â  Â int refOffset = cuGeom.geomRecurId * 16 * numPredDir + partSize * numPredDir * 2;<br>
  Â  Â  Â  Â int index = 0;<br>
@@ -3113,7 +3117,7 @@<br>
  Â  Â /* predInterSearch sets interMode.sa8dBits, but this is ignored */<br>
  Â  Â encodeResAndCalcRdInterCU(interMode, cuGeom);<br>
<br>
-  Â  if (m_param->analysisSave && m_reuseInterDataCTU && m_param->analysisReuseLevel > 1)<br>
+  Â  if (m_param->analysisSaveReuseLevel > 1 && m_reuseInterDataCTU)<br>
  Â  Â {<br>
  Â  Â  Â  Â int refOffset = cuGeom.geomRecurId * 16 * numPredDir + partSize * numPredDir * 2;<br>
  Â  Â  Â  Â int index = 0;<br>
@@ -3612,7 +3616,7 @@<br>
  Â  Â  Â  Â  Â  Â qp += distortionData->offset[ctu.m_cuAddr];<br>
  Â  Â }<br>
<br>
-  Â  if (m_param->analysisLoad && m_param->analysisReuseLevel == 10 && m_param->rc.cuTree)<br>
+  Â  if (m_param->analysisLoadReuseLevel == 10 && m_param->rc.cuTree)<br>
  Â  Â {<br>
  Â  Â  Â  Â int cuIdx = (ctu.m_cuAddr * ctu.m_numPartitions) + cuGeom.absPartIdx;<br>
  Â  Â  Â  Â if (ctu.m_slice->m_sliceType == I_SLICE)<br>
diff -r 52135ffd9bcd -r 4d870dd7c314 source/encoder/api.cpp<br>
--- a/source/encoder/api.cpp  Â  Mon Dec 23 14:40:32 2019 +0530<br>
+++ b/source/encoder/api.cpp  Â  Mon Dec 16 17:55:07 2019 +0530<br>
@@ -771,6 +771,12 @@<br>
  Â  Â int numDir = 2; //irrespective of P or B slices set direction as 2<br>
  Â  Â uint32_t numPlanes = param->internalCsp == X265_CSP_I400 ? 1 : 3;<br>
<br>
+  Â  int maxReuseLevel = X265_MAX(param->analysisSaveReuseLevel, param->analysisLoadReuseLevel);<br>
+  Â  int minReuseLevel = (param->analysisSaveReuseLevel && param->analysisLoadReuseLevel) ?<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  X265_MIN(param->analysisSaveReuseLevel, param->analysisLoadReuseLevel) : maxReuseLevel;<br>
+<br>
+  Â  bool isMultiPassOpt = param->analysisMultiPassRefine || param->analysisMultiPassDistortion;<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  <br>
 #if X265_DEPTH < 10 && (LINKED_10BIT || LINKED_12BIT)<br>
  Â  Â uint32_t numCUs_sse_t = param->internalBitDepth > 8 ? analysis->numCUsInFrame << 1 : analysis->numCUsInFrame;<br>
 #elif X265_DEPTH >= 10 && LINKED_8BIT<br>
@@ -778,7 +784,7 @@<br>
 #else<br>
  Â  Â uint32_t numCUs_sse_t = analysis->numCUsInFrame;<br>
 #endif<br>
-  Â  if (param->analysisMultiPassRefine || param->analysisMultiPassDistortion || param->ctuDistortionRefine)<br>
+  Â  if (isMultiPassOpt || param->ctuDistortionRefine)<br>
  Â  Â {<br>
  Â  Â  Â  Â //Allocate memory for distortionData pointer<br>
  Â  Â  Â  Â CHECKED_MALLOC_ZERO(distortionData, x265_analysis_distortion_data, 1);<br>
@@ -792,7 +798,7 @@<br>
  Â  Â  Â  Â analysis->distortionData = distortionData;<br>
  Â  Â }<br>
<br>
-  Â  if (param->bDisableLookahead && isVbv)<br>
+  Â  if (!isMultiPassOpt && param->bDisableLookahead && isVbv)<br>
  Â  Â {<br>
  Â  Â  Â  Â CHECKED_MALLOC_ZERO(analysis->lookahead.intraSatdForVbv, uint32_t, analysis->numCuInHeight);<br>
  Â  Â  Â  Â CHECKED_MALLOC_ZERO(analysis->lookahead.satdForVbv, uint32_t, analysis->numCuInHeight);<br>
@@ -801,20 +807,23 @@<br>
  Â  Â }<br>
<br>
  Â  Â //Allocate memory for weightParam pointer<br>
-  Â  if (!(param->bAnalysisType == AVC_INFO))<br>
+  Â  if (!isMultiPassOpt && !(param->bAnalysisType == AVC_INFO))<br>
  Â  Â  Â  Â CHECKED_MALLOC_ZERO(analysis->wt, x265_weight_param, numPlanes * numDir);<br>
<br>
-  Â  if (param->analysisReuseLevel < 2)<br>
+  Â  if (maxReuseLevel < 2)<br>
  Â  Â  Â  Â return;<br>
<br>
  Â  Â //Allocate memory for intraData pointer<br>
  Â  Â CHECKED_MALLOC_ZERO(intraData, x265_analysis_intra_data, 1);<br>
  Â  Â CHECKED_MALLOC(intraData->depth, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
-  Â  CHECKED_MALLOC_ZERO(intraData->modes, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
-  Â  CHECKED_MALLOC_ZERO(intraData->partSizes, char, analysis->numPartitions * analysis->numCUsInFrame);<br>
-  Â  CHECKED_MALLOC_ZERO(intraData->chromaModes, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
-  Â  if (param->rc.cuTree)<br>
-  Â  Â  Â  CHECKED_MALLOC_ZERO(intraData->cuQPOff, int8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
+  Â  if (!isMultiPassOpt)<br>
+  Â  {<br>
+  Â  Â  Â  CHECKED_MALLOC_ZERO(intraData->modes, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
+  Â  Â  Â  CHECKED_MALLOC_ZERO(intraData->partSizes, char, analysis->numPartitions * analysis->numCUsInFrame);<br>
+  Â  Â  Â  CHECKED_MALLOC_ZERO(intraData->chromaModes, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
+  Â  Â  Â  if (param->rc.cuTree)<br>
+  Â  Â  Â  Â  Â  CHECKED_MALLOC_ZERO(intraData->cuQPOff, int8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
+  Â  }<br>
  Â  Â analysis->intraData = intraData;<br>
<br>
  Â  Â //Allocate memory for interData pointer based on ReuseLevels<br>
@@ -822,19 +831,19 @@<br>
  Â  Â CHECKED_MALLOC(interData->depth, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
  Â  Â CHECKED_MALLOC_ZERO(interData->modes, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
<br>
-  Â  if (param->rc.cuTree)<br>
+  Â  if (param->rc.cuTree && !isMultiPassOpt)<br>
  Â  Â  Â  Â CHECKED_MALLOC_ZERO(interData->cuQPOff, int8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
  Â  Â CHECKED_MALLOC_ZERO(interData->mvpIdx[0], uint8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
  Â  Â CHECKED_MALLOC_ZERO(interData->mvpIdx[1], uint8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
  Â  Â CHECKED_MALLOC_ZERO(interData->mv[0], x265_analysis_MV, analysis->numPartitions * analysis->numCUsInFrame);<br>
  Â  Â CHECKED_MALLOC_ZERO(interData->mv[1], x265_analysis_MV, analysis->numPartitions * analysis->numCUsInFrame);<br>
<br>
-  Â  if (param->analysisReuseLevel > 4)<br>
+  Â  if (maxReuseLevel > 4)<br>
  Â  Â {<br>
  Â  Â  Â  Â CHECKED_MALLOC_ZERO(interData->partSize, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
  Â  Â  Â  Â CHECKED_MALLOC_ZERO(interData->mergeFlag, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
  Â  Â }<br>
-  Â  if (param->analysisReuseLevel >= 7)<br>
+  Â  if (maxReuseLevel >= 7)<br>
  Â  Â {<br>
  Â  Â  Â  Â CHECKED_MALLOC_ZERO(interData->interDir, uint8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
  Â  Â  Â  Â CHECKED_MALLOC_ZERO(interData->sadCost, int64_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
@@ -844,14 +853,13 @@<br>
  Â  Â  Â  Â  Â  Â CHECKED_MALLOC_ZERO(analysis->modeFlag[dir], uint8_t, analysis->numPartitions * analysis->numCUsInFrame);<br>
  Â  Â  Â  Â }<br>
  Â  Â }<br>
-  Â  else<br>
+  Â  if ((minReuseLevel >= 2) && (minReuseLevel <= 6))<br>
  Â  Â {<br>
-  Â  Â  Â  if (param->analysisMultiPassRefine || param->analysisMultiPassDistortion){<br>
-  Â  Â  Â  Â  Â  CHECKED_MALLOC_ZERO(interData->ref, int32_t, 2 * analysis->numPartitions * analysis->numCUsInFrame);<br>
-  Â  Â  Â  }<br>
-  Â  Â  Â  else<br>
-  Â  Â  Â  Â  Â  CHECKED_MALLOC_ZERO(interData->ref, int32_t, analysis->numCUsInFrame * X265_MAX_PRED_MODE_PER_CTU * numDir);<br>
+  Â  Â  Â  CHECKED_MALLOC_ZERO(interData->ref, int32_t, analysis->numCUsInFrame * X265_MAX_PRED_MODE_PER_CTU * numDir);<br>
  Â  Â }<br>
+  Â  if (isMultiPassOpt)<br>
+  Â  Â  Â  CHECKED_MALLOC_ZERO(interData->ref, int32_t, 2 * analysis->numPartitions * analysis->numCUsInFrame);<br>
+<br>
  Â  Â analysis->interData = interData;<br>
<br>
  Â  Â return;<br>
@@ -862,10 +870,15 @@<br>
<br>
 void x265_free_analysis_data(x265_param *param, x265_analysis_data* analysis)<br>
 {<br>
+  Â  int maxReuseLevel = X265_MAX(param->analysisSaveReuseLevel, param->analysisLoadReuseLevel);<br>
+  Â  int minReuseLevel = (param->analysisSaveReuseLevel && param->analysisLoadReuseLevel) ?<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  X265_MIN(param->analysisSaveReuseLevel, param->analysisLoadReuseLevel) : maxReuseLevel;<br>
+<br>
  Â  Â bool isVbv = param->rc.vbvMaxBitrate > 0 && param->rc.vbvBufferSize > 0;<br>
+  Â  bool isMultiPassOpt = param->analysisMultiPassRefine || param->analysisMultiPassDistortion;<br>
<br>
  Â  Â //Free memory for Lookahead pointers<br>
-  Â  if (param->bDisableLookahead && isVbv)<br>
+  Â  if (!isMultiPassOpt && param->bDisableLookahead && isVbv)<br>
  Â  Â {<br>
  Â  Â  Â  Â X265_FREE(analysis->lookahead.satdForVbv);<br>
  Â  Â  Â  Â X265_FREE(analysis->lookahead.intraSatdForVbv);<br>
@@ -887,21 +900,24 @@<br>
  Â  Â }<br>
<br>
  Â  Â /* Early exit freeing weights alone if level is 1 (when there is no analysis inter/intra) */<br>
-  Â  if (analysis->wt && !(param->bAnalysisType == AVC_INFO))<br>
+  Â  if (!isMultiPassOpt && analysis->wt && !(param->bAnalysisType == AVC_INFO))<br>
  Â  Â  Â  Â X265_FREE(analysis->wt);<br>
<br>
-  Â  if (param->analysisReuseLevel < 2)<br>
+  Â  if (maxReuseLevel < 2)<br>
  Â  Â  Â  Â return;<br>
<br>
  Â  Â //Free memory for intraData pointers<br>
  Â  Â if (analysis->intraData)<br>
  Â  Â {<br>
  Â  Â  Â  Â X265_FREE((analysis->intraData)->depth);<br>
-  Â  Â  Â  X265_FREE((analysis->intraData)->modes);<br>
-  Â  Â  Â  X265_FREE((analysis->intraData)->partSizes);<br>
-  Â  Â  Â  X265_FREE((analysis->intraData)->chromaModes);<br>
-  Â  Â  Â  if (param->rc.cuTree)<br>
-  Â  Â  Â  Â  Â  X265_FREE((analysis->intraData)->cuQPOff);<br>
+  Â  Â  Â  if (!isMultiPassOpt)<br>
+  Â  Â  Â  {<br>
+  Â  Â  Â  Â  Â  X265_FREE((analysis->intraData)->modes);<br>
+  Â  Â  Â  Â  Â  X265_FREE((analysis->intraData)->partSizes);<br>
+  Â  Â  Â  Â  Â  X265_FREE((analysis->intraData)->chromaModes);<br>
+  Â  Â  Â  Â  Â  if (param->rc.cuTree)<br>
+  Â  Â  Â  Â  Â  Â  Â  X265_FREE((analysis->intraData)->cuQPOff);<br>
+  Â  Â  Â  }<br>
  Â  Â  Â  Â X265_FREE(analysis->intraData);<br>
  Â  Â  Â  Â analysis->intraData = NULL;<br>
  Â  Â }<br>
@@ -911,19 +927,19 @@<br>
  Â  Â {<br>
  Â  Â  Â  Â X265_FREE((analysis->interData)->depth);<br>
  Â  Â  Â  Â X265_FREE((analysis->interData)->modes);<br>
-  Â  Â  Â  if (param->rc.cuTree)<br>
+  Â  Â  Â  if (!isMultiPassOpt && param->rc.cuTree)<br>
  Â  Â  Â  Â  Â  Â X265_FREE((analysis->interData)->cuQPOff);<br>
  Â  Â  Â  Â X265_FREE((analysis->interData)->mvpIdx[0]);<br>
  Â  Â  Â  Â X265_FREE((analysis->interData)->mvpIdx[1]);<br>
  Â  Â  Â  Â X265_FREE((analysis->interData)->mv[0]);<br>
  Â  Â  Â  Â X265_FREE((analysis->interData)->mv[1]);<br>
<br>
-  Â  Â  Â  if (param->analysisReuseLevel > 4)<br>
+  Â  Â  Â  if (maxReuseLevel > 4)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â X265_FREE((analysis->interData)->mergeFlag);<br>
  Â  Â  Â  Â  Â  Â X265_FREE((analysis->interData)->partSize);<br>
  Â  Â  Â  Â }<br>
-  Â  Â  Â  if (param->analysisReuseLevel >= 7)<br>
+  Â  Â  Â  if (maxReuseLevel >= 7)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â int numDir = 2;<br>
  Â  Â  Â  Â  Â  Â X265_FREE((analysis->interData)->interDir);<br>
@@ -932,13 +948,13 @@<br>
  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â X265_FREE((analysis->interData)->refIdx[dir]);<br>
  Â  Â  Â  Â  Â  Â  Â  Â if (analysis->modeFlag[dir] != NULL)<br>
-  Â  Â  Â  Â  Â  Â  Â  {<br>
+  Â  Â  Â  Â  Â  Â  Â  { <br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â X265_FREE(analysis->modeFlag[dir]);<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â analysis->modeFlag[dir] = NULL;<br>
  Â  Â  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â }<br>
-  Â  Â  Â  else<br>
+  Â  Â  Â  if (((minReuseLevel >= 2) && (minReuseLevel <= 6)) || isMultiPassOpt)<br>
  Â  Â  Â  Â  Â  Â X265_FREE((analysis->interData)->ref);<br>
  Â  Â  Â  Â X265_FREE(analysis->interData);<br>
  Â  Â  Â  Â analysis->interData = NULL;<br>
diff -r 52135ffd9bcd -r 4d870dd7c314 source/encoder/encoder.cpp<br>
--- a/source/encoder/encoder.cpp  Â  Â  Â  Mon Dec 23 14:40:32 2019 +0530<br>
+++ b/source/encoder/encoder.cpp  Â  Â  Â  Mon Dec 16 17:55:07 2019 +0530<br>
@@ -650,7 +650,7 @@<br>
  Â  Â if (analysis_data->sliceType == X265_TYPE_IDR || analysis_data->sliceType == X265_TYPE_I)<br>
  Â  Â {<br>
  Â  Â  Â  Â curFrame->m_analysisData.sliceType = X265_TYPE_I;<br>
-  Â  Â  Â  if (m_param->analysisReuseLevel < 7)<br>
+  Â  Â  Â  if (m_param->analysisLoadReuseLevel < 7)<br>
  Â  Â  Â  Â  Â  Â return -1;<br>
  Â  Â  Â  Â curFrame->m_analysisData.numPartitions = m_param->num4x4Partitions;<br>
  Â  Â  Â  Â int num16x16inCUWidth = m_param->maxCUSize >> 4;<br>
@@ -680,7 +680,7 @@<br>
  Â  Â else<br>
  Â  Â {<br>
  Â  Â  Â  Â uint32_t numDir = analysis_data->sliceType == X265_TYPE_P ? 1 : 2;<br>
-  Â  Â  Â  if (m_param->analysisReuseLevel < 7)<br>
+  Â  Â  Â  if (m_param->analysisLoadReuseLevel < 7)<br>
  Â  Â  Â  Â  Â  Â return -1;<br>
  Â  Â  Â  Â curFrame->m_analysisData.numPartitions = m_param->num4x4Partitions;<br>
  Â  Â  Â  Â int num16x16inCUWidth = m_param->maxCUSize >> 4;<br>
@@ -722,7 +722,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â (interData)->mvpIdx[k][cuPos + cuOffset] = (srcInterData)->mvpIdx[k][(mbIndex * 16) + cuOffset];<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â (interData)->refIdx[k][cuPos + cuOffset] = (srcInterData)->refIdx[k][(mbIndex * 16) + cuOffset];<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â memcpy(&(interData)->mv[k][cuPos + cuOffset], &(srcInterData)->mv[k][(mbIndex * 16) + cuOffset], sizeof(MV));<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel == 7 && numPU == PU_2Nx2N &&<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel == 7 && numPU == PU_2Nx2N &&<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â ((interData)->depth[cuPos + cuOffset] == (m_param->maxCUSize >> 5)))<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â int mv_x = (interData)->mv[k][cuPos + cuOffset].x;<br>
@@ -756,7 +756,7 @@<br>
  Â  Â  Â  Â  Â  Â if (analysis_data->sliceType == X265_TYPE_IDR || analysis_data->sliceType == X265_TYPE_I)<br>
  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â curFrame->m_analysisData.sliceType = X265_TYPE_I;<br>
-  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel < 2)<br>
+  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel < 2)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â return -1;<br>
<br>
  Â  Â  Â  Â  Â  Â  Â  Â curFrame->m_analysisData.numPartitions = m_param->num4x4Partitions;<br>
@@ -777,7 +777,7 @@<br>
  Â  Â  Â  Â  Â  Â else<br>
  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â uint32_t numDir = analysis_data->sliceType == X265_TYPE_P ? 1 : 2;<br>
-  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel < 2)<br>
+  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel < 2)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â return -1;<br>
<br>
  Â  Â  Â  Â  Â  Â  Â  Â curFrame->m_analysisData.numPartitions = m_param->num4x4Partitions;<br>
@@ -790,7 +790,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â memset(&(currInterData)->depth[count], (interData)->depth[d], bytes);<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â memset(&(currInterData)->modes[count], (interData)->modes[d], bytes);<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â memcpy(&(currInterData)->sadCost[count], &(analysis_data->interData)->sadCost[d], bytes);<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel > 4)<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel > 4)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â memset(&(currInterData)->partSize[count], (interData)->partSize[d], bytes);<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â int numPU = nbPartsTable[(interData)->partSize[d]];<br>
@@ -798,7 +798,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â if (pu) d++;<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â (currInterData)->mergeFlag[count + pu] = (interData)->mergeFlag[d];<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel >= 7)<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel >= 7)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â (currInterData)->interDir[count + pu] = (interData)->interDir[d];<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â for (uint32_t i = 0; i < numDir; i++)<br>
@@ -806,7 +806,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â (currInterData)->mvpIdx[i][count + pu] = (interData)->mvpIdx[i][d];<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â (currInterData)->refIdx[i][count + pu] = (interData)->refIdx[i][d];<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â memcpy(&(currInterData)->mv[i][count + pu], &(interData)->mv[i][d], sizeof(MV));<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel == 7 && numPU == PU_2Nx2N && m_param->num4x4Partitions <= 16)<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel == 7 && numPU == PU_2Nx2N && m_param->num4x4Partitions <= 16)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â int mv_x = (currInterData)->mv[i][count + pu].x;<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â int mv_y = (currInterData)->mv[i][count + pu].y;<br>
@@ -3577,10 +3577,46 @@<br>
  Â  Â  Â  Â p->rc.rfConstantMin = 0;<br>
  Â  Â }<br>
<br>
-  Â  if (!(p->bAnalysisType == HEVC_INFO) && (p->analysisLoad || p->analysisSave) && p->rc.cuTree && p->analysisReuseLevel < 10)<br>
-  Â  {<br>
-  Â  Â  Â  x265_log(p, X265_LOG_WARNING, "cu-tree works only with analysis reuse level 10, Disabling cu-tree\n");<br>
-  Â  Â  Â  p->rc.cuTree = 0;<br>
+  Â  if (p->analysisSaveReuseLevel && !p->analysisSave)<br>
+  Â  {<br>
+  Â  Â  Â  x265_log(p, X265_LOG_WARNING, "analysis-save-reuse-level can be set only when analysis-save is enabled."<br>
+  Â  Â  Â  Â  Â  " Resetting analysis-save-reuse-level to 0.\n");<br>
+  Â  Â  Â  p->analysisSaveReuseLevel = 0;<br>
+  Â  }<br>
+<br>
+  Â  if (p->analysisLoadReuseLevel && !p->analysisLoad)<br>
+  Â  {<br>
+  Â  Â  Â  x265_log(p, X265_LOG_WARNING, "analysis-load-reuse-level can be set only when analysis-load is enabled."<br>
+  Â  Â  Â  Â  Â  " Resetting analysis-load-reuse-level to 0.\n");<br>
+  Â  Â  Â  p->analysisLoadReuseLevel = 0;<br>
+  Â  }<br>
+<br>
+  Â  if (p->analysisSave && !p->analysisSaveReuseLevel)<br>
+  Â  {<br>
+  Â  Â  Â  x265_log(p, X265_LOG_WARNING, "analysis-save-reuse-level must be set when analysis-save is enabled."<br>
+  Â  Â  Â  Â  Â  " Setting analysis-save-reuse-level to 5.\n");<br>
+  Â  Â  Â  p->analysisSaveReuseLevel = 5;<br>
+  Â  }<br>
+<br>
+  Â  if (p->analysisLoad && !p->analysisLoadReuseLevel)<br>
+  Â  {<br>
+  Â  Â  Â  x265_log(p, X265_LOG_WARNING, "analysis-load-reuse-level must be set when analysis-load is enabled."<br>
+  Â  Â  Â  Â  Â  " Setting analysis-load-reuse-level to 5.\n");<br>
+  Â  Â  Â  p->analysisLoadReuseLevel = 5;<br>
+  Â  }<br>
+<br>
+  Â  if ((p->bAnalysisType == DEFAULT) && p->rc.cuTree)<br>
+  Â  {<br>
+  Â  Â  Â  if (p->analysisSaveReuseLevel && p->analysisSaveReuseLevel < 10)<br>
+  Â  Â  Â  {<br>
+  Â  Â  Â  Â  Â  x265_log(p, X265_LOG_WARNING, "cu-tree works only with analysis-save-reuse-level 10, Disabling cu-tree\n");<br>
+  Â  Â  Â  Â  Â  p->rc.cuTree = 0;<br>
+  Â  Â  Â  }<br>
+  Â  Â  Â  if (p->analysisLoadReuseLevel && p->analysisLoadReuseLevel < 10)<br>
+  Â  Â  Â  {<br>
+  Â  Â  Â  Â  Â  x265_log(p, X265_LOG_WARNING, "cu-tree works only with analysis-load-reuse-level 10, Disabling cu-tree\n");<br>
+  Â  Â  Â  Â  Â  p->rc.cuTree = 0;<br>
+  Â  Â  Â  }<br>
  Â  Â }<br>
<br>
  Â  Â if ((p->analysisLoad || p->analysisSave) && (p->bDistributeModeAnalysis || p->bDistributeMotionEstimation))<br>
@@ -3602,45 +3638,37 @@<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â p->scaleFactor = 0;<br>
  Â  Â  Â  Â }<br>
-  Â  Â  Â  else if ((!p->analysisLoad && !p->analysisSave) || (p->analysisReuseLevel > 6 && p->analysisReuseLevel != 10))<br>
+  Â  Â  Â  else if ((p->analysisSaveReuseLevel > 6 && p->analysisSaveReuseLevel != 10) || (p->analysisLoadReuseLevel > 6 && p->analysisLoadReuseLevel != 10))<br>
  Â  Â  Â  Â {<br>
-  Â  Â  Â  Â  Â  x265_log(p, X265_LOG_WARNING, "Input scaling works with analysis load/save and analysis-reuse-level 1-6 and 10. Disabling scale-factor.\n");<br>
+  Â  Â  Â  Â  Â  x265_log(p, X265_LOG_WARNING, "Input scaling works with analysis-save/load and analysis-save/load-reuse-level 1-6 and 10. Disabling scale-factor.\n");<br>
  Â  Â  Â  Â  Â  Â p->scaleFactor = 0;<br>
  Â  Â  Â  Â }<br>
  Â  Â }<br>
<br>
-  Â  if (p->intraRefine)<br>
-  Â  {<br>
-  Â  Â  Â  if (!p->analysisLoad || p->analysisReuseLevel < 10)<br>
-  Â  Â  Â  {<br>
-  Â  Â  Â  Â  Â  x265_log(p, X265_LOG_WARNING, "Intra refinement requires analysis load, analysis-reuse-level 10. Disabling intra refine.\n");<br>
-  Â  Â  Â  Â  Â  p->intraRefine = 0;<br>
-  Â  Â  Â  }<br>
-  Â  }<br>
-<br>
-  Â  if (p->interRefine)<br>
-  Â  {<br>
-  Â  Â  Â  if (!p->analysisLoad || p->analysisReuseLevel < 10)<br>
-  Â  Â  Â  {<br>
-  Â  Â  Â  Â  Â  x265_log(p, X265_LOG_WARNING, "Inter refinement requires analysis load, analysis-reuse-level 10. Disabling inter refine.\n");<br>
-  Â  Â  Â  Â  Â  p->interRefine = 0;<br>
-  Â  Â  Â  }<br>
-  Â  }<br>
-<br>
-  Â  if (p->bDynamicRefine)<br>
-  Â  {<br>
-  Â  Â  Â  if (!p->analysisLoad || p->analysisReuseLevel < 10)<br>
-  Â  Â  Â  {<br>
-  Â  Â  Â  Â  Â  x265_log(p, X265_LOG_WARNING, "Dynamic refinement requires analysis load, analysis-reuse-level 10. Disabling dynamic refine.\n");<br>
-  Â  Â  Â  Â  Â  p->bDynamicRefine = 0;<br>
-  Â  Â  Â  }<br>
+  Â  if (p->intraRefine && p->analysisLoadReuseLevel && p->analysisLoadReuseLevel < 10)<br>
+  Â  {<br>
+  Â  Â  Â  x265_log(p, X265_LOG_WARNING, "Intra refinement requires analysis load, analysis-load-reuse-level 10. Disabling intra refine.\n");<br>
+  Â  Â  Â  p->intraRefine = 0;<br>
+  Â  }<br>
+<br>
+  Â  if (p->interRefine && p->analysisLoadReuseLevel && p->analysisLoadReuseLevel < 10)<br>
+  Â  {<br>
+  Â  Â  Â  x265_log(p, X265_LOG_WARNING, "Inter refinement requires analysis load, analysis-load-reuse-level 10. Disabling inter refine.\n");<br>
+  Â  Â  Â  p->interRefine = 0;<br>
+  Â  }<br>
+<br>
+  Â  if (p->bDynamicRefine && p->analysisLoadReuseLevel && p->analysisLoadReuseLevel < 10)<br>
+  Â  {<br>
+  Â  Â  Â  x265_log(p, X265_LOG_WARNING, "Dynamic refinement requires analysis load, analysis-load-reuse-level 10. Disabling dynamic refine.\n");<br>
+  Â  Â  Â  p->bDynamicRefine = 0;<br>
+<br>
  Â  Â  Â  Â if (p->interRefine)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â x265_log(p, X265_LOG_WARNING, "Inter refine cannot be used with dynamic refine. Disabling refine-inter.\n");<br>
  Â  Â  Â  Â  Â  Â p->interRefine = 0;<br>
  Â  Â  Â  Â }<br>
  Â  Â }<br>
-  Â  if (p->scaleFactor && p->analysisLoad && !p->interRefine && !p->bDynamicRefine && p->analysisReuseLevel == 10)<br>
+  Â  if (p->scaleFactor && !p->interRefine && !p->bDynamicRefine && p->analysisLoadReuseLevel == 10)<br>
  Â  Â {<br>
  Â  Â  Â  Â x265_log(p, X265_LOG_WARNING, "Inter refinement 0 is not supported with scaling and analysis-reuse-level=10. Enabling refine-inter 1.\n");<br>
  Â  Â  Â  Â p->interRefine = 1;<br>
@@ -4205,7 +4233,7 @@<br>
  Â  Â {<br>
  Â  Â  Â  Â if (m_param->bAnalysisType == HEVC_INFO)<br>
  Â  Â  Â  Â  Â  Â return;<br>
-  Â  Â  Â  if (m_param->analysisReuseLevel < 2)<br>
+  Â  Â  Â  if (m_param->analysisLoadReuseLevel < 2)<br>
  Â  Â  Â  Â  Â  Â return;<br>
<br>
  Â  Â  Â  Â uint8_t *tempBuf = NULL, *depthBuf = NULL, *modeBuf = NULL, *partSizes = NULL;<br>
@@ -4265,7 +4293,7 @@<br>
  Â  Â  Â  Â uint32_t numDir = analysis->sliceType == X265_TYPE_P ? 1 : 2;<br>
  Â  Â  Â  Â uint32_t numPlanes = m_param->internalCsp == X265_CSP_I400 ? 1 : 3;<br>
  Â  Â  Â  Â X265_FREAD((WeightParam*)analysis->wt, sizeof(WeightParam), numPlanes * numDir, m_analysisFileIn, (picIn->analysisData.wt));<br>
-  Â  Â  Â  if (m_param->analysisReuseLevel < 2)<br>
+  Â  Â  Â  if (m_param->analysisLoadReuseLevel < 2)<br>
  Â  Â  Â  Â  Â  Â return;<br>
<br>
  Â  Â  Â  Â uint8_t *tempBuf = NULL, *depthBuf = NULL, *modeBuf = NULL, *partSize = NULL, *mergeFlag = NULL;<br>
@@ -4274,9 +4302,9 @@<br>
  Â  Â  Â  Â int8_t* refIdx[2];<br>
  Â  Â  Â  Â int8_t* cuQPBuf = NULL;<br>
<br>
-  Â  Â  Â  int numBuf = m_param->analysisReuseLevel > 4 ? 4 : 2;<br>
+  Â  Â  Â  int numBuf = m_param->analysisLoadReuseLevel > 4 ? 4 : 2;<br>
  Â  Â  Â  Â bool bIntraInInter = false;<br>
-  Â  Â  Â  if (m_param->analysisReuseLevel == 10)<br>
+  Â  Â  Â  if (m_param->analysisLoadReuseLevel == 10)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â numBuf++;<br>
  Â  Â  Â  Â  Â  Â bIntraInInter = (analysis->sliceType == X265_TYPE_P || m_param->bIntraInBFrames);<br>
@@ -4299,14 +4327,14 @@<br>
  Â  Â  Â  Â  Â  Â X265_FREAD(modeBuf, sizeof(uint8_t), depthBytes, m_analysisFileIn, interPic->modes);<br>
  Â  Â  Â  Â  Â  Â if (m_param->rc.cuTree) { X265_FREAD(cuQPBuf, sizeof(int8_t), depthBytes, m_analysisFileIn, interPic->cuQPOff); }<br>
<br>
-  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel > 4)<br>
+  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel > 4)<br>
  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â partSize = modeBuf + depthBytes;<br>
  Â  Â  Â  Â  Â  Â  Â  Â mergeFlag = partSize + depthBytes;<br>
  Â  Â  Â  Â  Â  Â  Â  Â X265_FREAD(partSize, sizeof(uint8_t), depthBytes, m_analysisFileIn, interPic->partSize);<br>
  Â  Â  Â  Â  Â  Â  Â  Â X265_FREAD(mergeFlag, sizeof(uint8_t), depthBytes, m_analysisFileIn, interPic->mergeFlag);<br>
<br>
-  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel == 10)<br>
+  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel == 10)<br>
  Â  Â  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â interDir = mergeFlag + depthBytes;<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â X265_FREAD(interDir, sizeof(uint8_t), depthBytes, m_analysisFileIn, interPic->interDir);<br>
@@ -4337,7 +4365,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â memset(&(analysis->interData)->modes[count], modeBuf[d], bytes);<br>
  Â  Â  Â  Â  Â  Â  Â  Â if (m_param->rc.cuTree)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â memset(&(analysis->interData)->cuQPOff[count], cuQPBuf[d], bytes);<br>
-  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel > 4)<br>
+  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel > 4)<br>
  Â  Â  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â if (m_param->scaleFactor && modeBuf[d] == MODE_INTRA && partSize[d] == SIZE_NxN)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â partSize[d] = SIZE_2Nx2N;<br>
@@ -4347,7 +4375,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â if (pu) d++;<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â (analysis->interData)->mergeFlag[count + pu] = mergeFlag[d];<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel == 10)<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel == 10)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â (analysis->interData)->interDir[count + pu] = interDir[d];<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â for (uint32_t i = 0; i < numDir; i++)<br>
@@ -4363,7 +4391,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â }<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel == 10 && bIntraInInter)<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel == 10 && bIntraInInter)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â memset(&(analysis->intraData)->chromaModes[count], chromaDir[d], bytes);<br>
  Â  Â  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â  Â  Â  Â  Â count += bytes;<br>
@@ -4373,7 +4401,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â X265_FREE(cuQPBuf);<br>
  Â  Â  Â  Â  Â  Â X265_FREE(tempBuf);<br>
  Â  Â  Â  Â }<br>
-  Â  Â  Â  if (m_param->analysisReuseLevel == 10)<br>
+  Â  Â  Â  if (m_param->analysisLoadReuseLevel == 10)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â if (m_param->bAnalysisType != HEVC_INFO)<br>
  Â  Â  Â  Â  Â  Â {<br>
@@ -4556,7 +4584,7 @@<br>
<br>
  Â  Â if (analysis->sliceType == X265_TYPE_IDR || analysis->sliceType == X265_TYPE_I)<br>
  Â  Â {<br>
-  Â  Â  Â  if (m_param->analysisReuseLevel < 2)<br>
+  Â  Â  Â  if (m_param->analysisLoadReuseLevel < 2)<br>
  Â  Â  Â  Â  Â  Â return;<br>
<br>
  Â  Â  Â  Â uint8_t *tempBuf = NULL, *depthBuf = NULL, *modeBuf = NULL, *partSizes = NULL;<br>
@@ -4625,7 +4653,7 @@<br>
  Â  Â  Â  Â uint32_t numDir = analysis->sliceType == X265_TYPE_P ? 1 : 2;<br>
  Â  Â  Â  Â uint32_t numPlanes = m_param->internalCsp == X265_CSP_I400 ? 1 : 3;<br>
  Â  Â  Â  Â X265_FREAD((WeightParam*)analysis->wt, sizeof(WeightParam), numPlanes * numDir, m_analysisFileIn, (picIn->analysisData.wt));<br>
-  Â  Â  Â  if (m_param->analysisReuseLevel < 2)<br>
+  Â  Â  Â  if (m_param->analysisLoadReuseLevel < 2)<br>
  Â  Â  Â  Â  Â  Â return;<br>
<br>
  Â  Â  Â  Â uint8_t *tempBuf = NULL, *depthBuf = NULL, *modeBuf = NULL, *partSize = NULL, *mergeFlag = NULL;<br>
@@ -4634,9 +4662,9 @@<br>
  Â  Â  Â  Â int8_t* refIdx[2];<br>
  Â  Â  Â  Â int8_t* cuQPBuf = NULL;<br>
<br>
-  Â  Â  Â  int numBuf = m_param->analysisReuseLevel > 4 ? 4 : 2;<br>
+  Â  Â  Â  int numBuf = m_param->analysisLoadReuseLevel > 4 ? 4 : 2;<br>
  Â  Â  Â  Â bool bIntraInInter = false;<br>
-  Â  Â  Â  if (m_param->analysisReuseLevel == 10)<br>
+  Â  Â  Â  if (m_param->analysisLoadReuseLevel == 10)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â numBuf++;<br>
  Â  Â  Â  Â  Â  Â bIntraInInter = (analysis->sliceType == X265_TYPE_P || m_param->bIntraInBFrames);<br>
@@ -4652,13 +4680,13 @@<br>
  Â  Â  Â  Â X265_FREAD(depthBuf, sizeof(uint8_t), depthBytes, m_analysisFileIn, interPic->depth);<br>
  Â  Â  Â  Â X265_FREAD(modeBuf, sizeof(uint8_t), depthBytes, m_analysisFileIn, interPic->modes);<br>
  Â  Â  Â  Â if (m_param->rc.cuTree) { X265_FREAD(cuQPBuf, sizeof(int8_t), depthBytes, m_analysisFileIn, interPic->cuQPOff); }<br>
-  Â  Â  Â  if (m_param->analysisReuseLevel > 4)<br>
+  Â  Â  Â  if (m_param->analysisLoadReuseLevel > 4)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â partSize = modeBuf + depthBytes;<br>
  Â  Â  Â  Â  Â  Â mergeFlag = partSize + depthBytes;<br>
  Â  Â  Â  Â  Â  Â X265_FREAD(partSize, sizeof(uint8_t), depthBytes, m_analysisFileIn, interPic->partSize);<br>
  Â  Â  Â  Â  Â  Â X265_FREAD(mergeFlag, sizeof(uint8_t), depthBytes, m_analysisFileIn, interPic->mergeFlag);<br>
-  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel == 10)<br>
+  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel == 10)<br>
  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â interDir = mergeFlag + depthBytes;<br>
  Â  Â  Â  Â  Â  Â  Â  Â X265_FREAD(interDir, sizeof(uint8_t), depthBytes, m_analysisFileIn, interPic->interDir);<br>
@@ -4702,10 +4730,10 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â memset(&(analysis->interData)->modes[count], modeBuf[d], bytes);<br>
  Â  Â  Â  Â  Â  Â  Â  Â if (m_param->rc.cuTree)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â memset(&(analysis->interData)->cuQPOff[count], cuQPBuf[d], bytes);<br>
-  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel == 10 && bIntraInInter)<br>
+  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel == 10 && bIntraInInter)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â memset(&(analysis->intraData)->chromaModes[count], chromaDir[d], bytes);<br>
<br>
-  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel > 4)<br>
+  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel > 4)<br>
  Â  Â  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â puOrientation puOrient;<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â puOrient.init();<br>
@@ -4731,7 +4759,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â d++;<br>
<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â (analysis->interData)->mergeFlag[count + pu] = mergeFlag[d];<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel == 10)<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisLoadReuseLevel == 10)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â (analysis->interData)->interDir[count + pu] = interDir[d];<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â MV mvCopy[2];<br>
@@ -4766,7 +4794,7 @@<br>
  Â  Â  Â  Â  Â  Â X265_FREE(cuQPBuf);<br>
  Â  Â  Â  Â X265_FREE(tempBuf);<br>
<br>
-  Â  Â  Â  if (m_param->analysisReuseLevel == 10)<br>
+  Â  Â  Â  if (m_param->analysisLoadReuseLevel == 10)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â for (uint32_t i = 0; i < numDir; i++)<br>
  Â  Â  Â  Â  Â  Â {<br>
@@ -4855,7 +4883,6 @@<br>
<br>
  Â  Â X265_PARAM_VALIDATE(saveParam->intraRefresh, sizeof(int), 1, &m_param->bIntraRefresh, intra-refresh);<br>
  Â  Â X265_PARAM_VALIDATE(saveParam->maxNumReferences, sizeof(int), 1, &m_param->maxNumReferences, ref);<br>
-  Â  X265_PARAM_VALIDATE(saveParam->analysisReuseLevel, sizeof(int), 1, &m_param->analysisReuseLevel, analysis-reuse-level);<br>
  Â  Â X265_PARAM_VALIDATE(saveParam->keyframeMax, sizeof(int), 1, &m_param->keyframeMax, keyint);<br>
  Â  Â X265_PARAM_VALIDATE(saveParam->keyframeMin, sizeof(int), 1, &m_param->keyframeMin, min-keyint);<br>
  Â  Â X265_PARAM_VALIDATE(saveParam->openGOP, sizeof(int), 1, &m_param->bOpenGOP, open-gop);<br>
@@ -4871,6 +4898,7 @@<br>
  Â  Â int sourceHeight, sourceWidth;<br>
  Â  Â if (writeFlag)<br>
  Â  Â {<br>
+  Â  Â  Â  X265_PARAM_VALIDATE(saveParam->analysisReuseLevel, sizeof(int), 1, &m_param->analysisSaveReuseLevel, analysis - save - reuse - level);<br>
  Â  Â  Â  Â sourceHeight = m_param->sourceHeight - m_conformanceWindow.bottomOffset;<br>
  Â  Â  Â  Â sourceWidth = m_param->sourceWidth - m_conformanceWindow.rightOffset;<br>
  Â  Â  Â  Â X265_PARAM_VALIDATE(saveParam->sourceWidth, sizeof(int), 1, &sourceWidth, res-width);<br>
@@ -4880,10 +4908,35 @@<br>
  Â  Â else<br>
  Â  Â {<br>
  Â  Â  Â  Â fileOffset = m_analysisFileIn;<br>
+<br>
+  Â  Â  Â  int saveLevel = 0;<br>
+  Â  Â  Â  bool isIncompatibleReuseLevel = false;<br>
+  Â  Â  Â  int loadLevel = m_param->analysisLoadReuseLevel;<br>
+<br>
+  Â  Â  Â  X265_FREAD(&saveLevel, sizeof(int), 1, m_analysisFileIn, &(saveParam->analysisReuseLevel));<br>
+  Â  Â  Â  <br>
+  Â  Â  Â  if (loadLevel == 10 && saveLevel != 10)<br>
+  Â  Â  Â  Â  Â  isIncompatibleReuseLevel = true;<br>
+  Â  Â  Â  else if (((loadLevel >= 7) && (loadLevel <= 9)) && ((saveLevel < 7) || (saveLevel > 9)))<br>
+  Â  Â  Â  Â  Â  isIncompatibleReuseLevel = true;<br>
+  Â  Â  Â  else if ((loadLevel == 5 || loadLevel == 6) && ((saveLevel != 5) && (saveLevel != 6)))<br>
+  Â  Â  Â  Â  Â  isIncompatibleReuseLevel = true;<br>
+  Â  Â  Â  else if ((loadLevel >= 2 && loadLevel <= 4) && (saveLevel < 2 || saveLevel > 6))<br>
+  Â  Â  Â  Â  Â  isIncompatibleReuseLevel = true;<br>
+  Â  Â  Â  else if (!saveLevel)<br>
+  Â  Â  Â  Â  Â  isIncompatibleReuseLevel = true;<br>
+<br>
+  Â  Â  Â  if (isIncompatibleReuseLevel)<br>
+  Â  Â  Â  {<br>
+  Â  Â  Â  Â  Â  x265_log(NULL, X265_LOG_ERROR, "Error reading analysis data. Incompatible reuse-levels.\n");<br>
+  Â  Â  Â  Â  Â  m_aborted = true;<br>
+  Â  Â  Â  Â  Â  return -1;<br>
+  Â  Â  Â  }<br>
+<br>
  Â  Â  Â  Â bool error = false;<br>
  Â  Â  Â  Â int curSourceHeight = m_param->sourceHeight - m_conformanceWindow.bottomOffset;<br>
  Â  Â  Â  Â int curSourceWidth = m_param->sourceWidth - m_conformanceWindow.rightOffset;<br>
-<br>
+  Â  Â  <br>
  Â  Â  Â  Â X265_FREAD(&sourceWidth, sizeof(int), 1, m_analysisFileIn, &(saveParam->sourceWidth));<br>
  Â  Â  Â  Â X265_FREAD(&sourceHeight, sizeof(int), 1, m_analysisFileIn, &(saveParam->sourceHeight));<br>
  Â  Â  Â  Â X265_FREAD(&readValue, sizeof(int), 1, m_analysisFileIn, &(saveParam->maxCUSize));<br>
@@ -5205,7 +5258,7 @@<br>
  Â  Â  Â  Â analysis->frameRecordSize += analysis->numCUsInFrame * sizeof(sse_t);<br>
  Â  Â }<br>
<br>
-  Â  if (m_param->analysisReuseLevel > 1)<br>
+  Â  if (m_param->analysisSaveReuseLevel > 1)<br>
  Â  Â {<br>
<br>
  Â  Â  Â  Â if (analysis->sliceType == X265_TYPE_IDR || analysis->sliceType == X265_TYPE_I)<br>
@@ -5258,14 +5311,14 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â interDataCTU->depth[depthBytes] = depth;<br>
<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â predMode = ctu->m_predMode[absPartIdx];<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel != 10 && ctu->m_refIdx[1][absPartIdx] != -1)<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisSaveReuseLevel != 10 && ctu->m_refIdx[1][absPartIdx] != -1)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â predMode = 4; // used as indicator if the block is coded as bidir<br>
<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â interDataCTU->modes[depthBytes] = predMode;<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â if (m_param->rc.cuTree)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â interDataCTU->cuQPOff[depthBytes] = (int8_t)(ctu->m_qpAnalysis[absPartIdx] - baseQP);<br>
<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel > 4)<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisSaveReuseLevel > 4)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â partSize = ctu->m_partSize[absPartIdx];<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â interDataCTU->partSize[depthBytes] = partSize;<br>
@@ -5278,7 +5331,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â if (puIdx) depthBytes++;<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â interDataCTU->mergeFlag[depthBytes] = ctu->m_mergeFlag[puabsPartIdx];<br>
<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel == 10)<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisSaveReuseLevel == 10)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â interDataCTU->interDir[depthBytes] = ctu->m_interDir[puabsPartIdx];<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â for (uint32_t dir = 0; dir < numDir; dir++)<br>
@@ -5289,12 +5342,12 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â }<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel == 10 && bIntraInInter)<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisSaveReuseLevel == 10 && bIntraInInter)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â intraDataCTU->chromaModes[depthBytes] = ctu->m_chromaIntraDir[absPartIdx];<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â absPartIdx += ctu->m_numPartitions >> (depth * 2);<br>
  Â  Â  Â  Â  Â  Â  Â  Â }<br>
-  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel == 10 && bIntraInInter)<br>
+  Â  Â  Â  Â  Â  Â  Â  if (m_param->analysisSaveReuseLevel == 10 && bIntraInInter)<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â memcpy(&intraDataCTU->modes[ctu->m_cuAddr * ctu->m_numPartitions], ctu->m_lumaIntraDir, sizeof(uint8_t)* ctu->m_numPartitions);<br>
  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â }<br>
@@ -5309,10 +5362,10 @@<br>
  Â  Â  Â  Â  Â  Â analysis->frameRecordSize += depthBytes * 2;<br>
  Â  Â  Â  Â  Â  Â if (m_param->rc.cuTree)<br>
  Â  Â  Â  Â  Â  Â analysis->frameRecordSize += (sizeof(int8_t) * depthBytes);<br>
-  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel > 4)<br>
+  Â  Â  Â  Â  Â  if (m_param->analysisSaveReuseLevel > 4)<br>
  Â  Â  Â  Â  Â  Â  Â  Â analysis->frameRecordSize += (depthBytes * 2);<br>
<br>
-  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel == 10)<br>
+  Â  Â  Â  Â  Â  if (m_param->analysisSaveReuseLevel == 10)<br>
  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â /* Add Size of interDir, mvpIdx, refIdx, mv, luma and chroma modes */<br>
  Â  Â  Â  Â  Â  Â  Â  Â analysis->frameRecordSize += depthBytes;<br>
@@ -5344,7 +5397,7 @@<br>
  Â  Â if (analysis->sliceType > X265_TYPE_I)<br>
  Â  Â  Â  Â X265_FWRITE((WeightParam*)analysis->wt, sizeof(WeightParam), numPlanes * numDir, m_analysisFileOut);<br>
<br>
-  Â  if (m_param->analysisReuseLevel < 2)<br>
+  Â  if (m_param->analysisSaveReuseLevel < 2)<br>
  Â  Â  Â  Â return;<br>
<br>
  Â  Â if (analysis->sliceType == X265_TYPE_IDR || analysis->sliceType == X265_TYPE_I)<br>
@@ -5362,11 +5415,11 @@<br>
  Â  Â  Â  Â X265_FWRITE((analysis->interData)->modes, sizeof(uint8_t), depthBytes, m_analysisFileOut);<br>
  Â  Â  Â  Â if (m_param->rc.cuTree)<br>
  Â  Â  Â  Â  Â  Â X265_FWRITE((analysis->interData)->cuQPOff, sizeof(int8_t), depthBytes, m_analysisFileOut);<br>
-  Â  Â  Â  if (m_param->analysisReuseLevel > 4)<br>
+  Â  Â  Â  if (m_param->analysisSaveReuseLevel > 4)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â X265_FWRITE((analysis->interData)->partSize, sizeof(uint8_t), depthBytes, m_analysisFileOut);<br>
  Â  Â  Â  Â  Â  Â X265_FWRITE((analysis->interData)->mergeFlag, sizeof(uint8_t), depthBytes, m_analysisFileOut);<br>
-  Â  Â  Â  Â  Â  if (m_param->analysisReuseLevel == 10)<br>
+  Â  Â  Â  Â  Â  if (m_param->analysisSaveReuseLevel == 10)<br>
  Â  Â  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â  Â  Â X265_FWRITE((analysis->interData)->interDir, sizeof(uint8_t), depthBytes, m_analysisFileOut);<br>
  Â  Â  Â  Â  Â  Â  Â  Â if (bIntraInInter) X265_FWRITE((analysis->intraData)->chromaModes, sizeof(uint8_t), depthBytes, m_analysisFileOut);<br>
@@ -5380,7 +5433,7 @@<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â X265_FWRITE((analysis->intraData)->modes, sizeof(uint8_t), analysis->numCUsInFrame * analysis->numPartitions, m_analysisFileOut);<br>
  Â  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â }<br>
-  Â  Â  Â  if (m_param->analysisReuseLevel != 10)<br>
+  Â  Â  Â  if (m_param->analysisSaveReuseLevel != 10)<br>
  Â  Â  Â  Â  Â  Â X265_FWRITE((analysis->interData)->ref, sizeof(int32_t), analysis->numCUsInFrame * X265_MAX_PRED_MODE_PER_CTU * numDir, m_analysisFileOut);<br>
<br>
  Â  Â }<br>
diff -r 52135ffd9bcd -r 4d870dd7c314 source/encoder/search.cpp<br>
--- a/source/encoder/search.cpp Mon Dec 23 14:40:32 2019 +0530<br>
+++ b/source/encoder/search.cpp Mon Dec 16 17:55:07 2019 +0530<br>
@@ -2208,7 +2208,7 @@<br>
  Â  Â  Â  Â x265_analysis_inter_data* interDataCTU = NULL;<br>
  Â  Â  Â  Â int cuIdx;<br>
  Â  Â  Â  Â cuIdx = (interMode.cu.m_cuAddr * m_param->num4x4Partitions) + cuGeom.absPartIdx;<br>
-  Â  Â  Â  if (m_param->analysisReuseLevel == 10 && m_param->interRefine > 1)<br>
+  Â  Â  Â  if (m_param->analysisLoadReuseLevel == 10 && m_param->interRefine > 1)<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â interDataCTU = m_frame->m_analysisData.interData;<br>
  Â  Â  Â  Â  Â  Â if ((cu.m_predMode[pu.puAbsPartIdx] == interDataCTU->modes[cuIdx + pu.puAbsPartIdx])<br>
@@ -2227,7 +2227,7 @@<br>
<br>
  Â  Â  Â  Â cu.getNeighbourMV(puIdx, pu.puAbsPartIdx, interMode.interNeighbours);<br>
  Â  Â  Â  Â /* Uni-directional prediction */<br>
-  Â  Â  Â  if ((m_param->analysisLoad && m_param->analysisReuseLevel > 1 && m_param->analysisReuseLevel != 10)<br>
+  Â  Â  Â  if ((m_param->analysisLoadReuseLevel > 1 && m_param->analysisLoadReuseLevel != 10)<br>
  Â  Â  Â  Â  Â  Â || (m_param->analysisMultiPassRefine && m_param->rc.bStatRead) || (m_param->bAnalysisType == AVC_INFO) || (useAsMVP))<br>
  Â  Â  Â  Â {<br>
  Â  Â  Â  Â  Â  Â for (int list = 0; list < numPredDir; list++)<br>
diff -r 52135ffd9bcd -r 4d870dd7c314 source/x265.h<br>
--- a/source/x265.h  Â  Â Mon Dec 23 14:40:32 2019 +0530<br>
+++ b/source/x265.h  Â  Â Mon Dec 16 17:55:07 2019 +0530<br>
@@ -320,7 +320,7 @@<br>
<br>
 typedef enum<br>
 {<br>
-  Â  NO_INFO = 0,<br>
+  Â  DEFAULT = 0,<br>
  Â  Â AVC_INFO = 1,<br>
  Â  Â HEVC_INFO = 2,<br>
 }AnalysisRefineType;<br>
@@ -1656,7 +1656,7 @@<br>
<br>
  Â  Â /* A value between 1 and 10 (both inclusive) determines the level of<br>
  Â  Â * information stored/reused in analysis save/load. Higher the refine<br>
-  Â  * level higher the information stored/reused. Default is 5 */<br>
+  Â  * level higher the information stored/reused. Default is 5. Now deprecated. */<br>
  Â  Â int  Â  Â  Â analysisReuseLevel;<br>
<br>
  Â  Â  /* Limit Sample Adaptive Offset filter computation by early terminating SAO<br>
@@ -1859,6 +1859,16 @@<br>
<br>
  Â  Â /* Enable HME search ranges for L0, L1 and L2 respectively. */<br>
  Â  Â int  Â  Â  Â hmeRange[3];<br>
+<br>
+  Â  /* A value between 1 and 10 (both inclusive) determines the level of<br>
+  Â  * analysis information stored in analysis-save. Higher the refine level higher<br>
+  Â  * the information stored. Default is 5 */<br>
+  Â  int  Â  Â  Â analysisSaveReuseLevel;<br>
+  Â  <br>
+  Â  /* A value between 1 and 10 (both inclusive) determines the level of<br>
+  Â  * analysis information reused in analysis-load. Higher the refine level higher<br>
+  Â  * the information reused. Default is 5 */<br>
+  Â  int  Â  Â  Â analysisLoadReuseLevel;<br>
 } x265_param;<br>
<br>
 /* x265_param_alloc:<br>
diff -r 52135ffd9bcd -r 4d870dd7c314 source/x265cli.h<br>
--- a/source/x265cli.h  Mon Dec 23 14:40:32 2019 +0530<br>
+++ b/source/x265cli.h  Mon Dec 16 17:55:07 2019 +0530<br>
@@ -275,7 +275,9 @@<br>
  Â  Â { "no-multi-pass-opt-rps", no_argument, NULL, 0 },<br>
  Â  Â { "analysis-reuse-mode", required_argument, NULL, 0 }, /* DEPRECATED */<br>
  Â  Â { "analysis-reuse-file", required_argument, NULL, 0 },<br>
-  Â  { "analysis-reuse-level", required_argument, NULL, 0 },<br>
+  Â  { "analysis-reuse-level", required_argument, NULL, 0 }, /* DEPRECATED */<br>
+  Â  { "analysis-save-reuse-level", required_argument, NULL, 0 },<br>
+  Â  { "analysis-load-reuse-level", required_argument, NULL, 0 },<br>
  Â  Â { "analysis-save",  required_argument, NULL, 0 },<br>
  Â  Â { "analysis-load",  required_argument, NULL, 0 },<br>
  Â  Â { "scale-factor",  Â required_argument, NULL, 0 },<br>
@@ -549,7 +551,9 @@<br>
  Â  Â H0("  Â --analysis-save <filename>  Â  Dump analysis info into the specified file. Default Disabled\n");<br>
  Â  Â H0("  Â --analysis-load <filename>  Â  Load analysis buffers from the file specified. Default Disabled\n");<br>
  Â  Â H0("  Â --analysis-reuse-file <filename>  Â  Specify file name used for either dumping or reading analysis data. Deault x265_analysis.dat\n");<br>
-  Â  H0("  Â --analysis-reuse-level <1..10>  Â  Â  Level of analysis reuse indicates amount of info stored/reused in save/load mode, 1:least..10:most. Default %d\n", param->analysisReuseLevel);<br>
+  Â  H0("  Â --analysis-reuse-level <1..10>  Â  Â  Level of analysis reuse indicates amount of info stored/reused in save/load mode, 1:least..10:most. Now deprecated. Default %d\n", param->analysisReuseLevel);<br>
+  Â  H0("  Â --analysis-save-reuse-level <1..10> Indicates the amount of analysis info stored in save mode, 1:least..10:most. Default %d\n", param->analysisSaveReuseLevel);<br>
+  Â  H0("  Â --analysis-load-reuse-level <1..10> Indicates the amount of analysis info reused in load mode, 1:least..10:most. Default %d\n", param->analysisLoadReuseLevel);<br>
  Â  Â H0("  Â --refine-analysis-type <string>  Â  Â Reuse anlaysis information received through API call. Supported options are avc and hevc. Default disabled - %d\n", param->bAnalysisType);<br>
  Â  Â H0("  Â --scale-factor <int>  Â  Â  Â  Â  Specify factor by which input video is scaled down for analysis save mode. Default %d\n", param->scaleFactor);<br>
  Â  Â H0("  Â --refine-intra <0..4>  Â  Â  Â  Â Enable intra refinement for encode that uses analysis-load.\n"<br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><font face="georgia, serif">Regards,</font><div><b><font face="georgia, serif">Aruna Matheswaran,</font></b></div><div><font face="georgia, serif">Video Codec Engineer,</font></div><div><font face="georgia, serif">Media & AI analytics BU,</font></div><div><span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap"><span style="border:none;display:inline-block;overflow:hidden;width:153px;height:58px"><img src="https://lh5.googleusercontent.com/gjX5cPNIZgwUrhfqkTwQUZWztIKmmo0qs3kbwvkS5H-bDVE2ftte9pMTVnFLSjOcjYWLtfc6_OGpxW4vraLg2r5QAIf1Q3MpldFDgWtzK_gXi8ptw5B3joIbsGL6mxj-JRdjHzT5" width="96" height="36" style="margin-left: 0px; margin-top: 0px;"></span></span></span><font face="georgia, serif"><br></font></div><div><span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap"><span style="border:none;display:inline-block;overflow:hidden;width:153px;height:58px"><img src="https://lh5.googleusercontent.com/gjX5cPNIZgwUrhfqkTwQUZWztIKmmo0qs3kbwvkS5H-bDVE2ftte9pMTVnFLSjOcjYWLtfc6_OGpxW4vraLg2r5QAIf1Q3MpldFDgWtzK_gXi8ptw5B3joIbsGL6mxj-JRdjHzT5" style="margin-left: 0px; margin-top: 0px;"></span></span></span><font face="georgia, serif"><br></font></div><div><font face="georgia, serif"><br></font></div></div></div></div></div></div></div></div></div>