# HG changeset patch # User Aruna Matheswaran <ar...@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;
# HG changeset patch # User Aruna Matheswaran <ar...@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;
_______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel