[x265] [PATCH 2 of 3 x265] analysis-save/load: Validate conformance window offsets
Kavitha Sampath
kavitha at multicorewareinc.com
Mon Jan 13 08:32:10 CET 2020
Patch looks good overall. Minor suggestions to consider
On Fri, Jan 10, 2020 at 5:22 PM Aruna Matheswaran <
aruna at multicorewareinc.com> wrote:
> # HG changeset patch
> # User Aruna Matheswaran <aruna at multicorewareinc.com>
> # Date 1578656801 -19800
> # Fri Jan 10 17:16:41 2020 +0530
> # Node ID 5fdecb3d4af75a9c1a788b6af8577c3bf507697e
> # Parent a28fd843b302128cff31172fe140aac19f93ce80
> analysis-save/load: Validate conformance window offsets
>
> diff -r a28fd843b302 -r 5fdecb3d4af7 source/CMakeLists.txt
> --- a/source/CMakeLists.txt Fri Jan 10 17:01:08 2020 +0530
> +++ b/source/CMakeLists.txt Fri Jan 10 17:16:41 2020 +0530
> @@ -29,7 +29,7 @@
> option(STATIC_LINK_CRT "Statically link C runtime for release builds" OFF)
> mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)
> # X265_BUILD must be incremented each time the public API is changed
> -set(X265_BUILD 187)
> +set(X265_BUILD 188)
> configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
> "${PROJECT_BINARY_DIR}/x265.def")
> configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
> diff -r a28fd843b302 -r 5fdecb3d4af7 source/common/param.cpp
> --- a/source/common/param.cpp Fri Jan 10 17:01:08 2020 +0530
> +++ b/source/common/param.cpp Fri Jan 10 17:16:41 2020 +0530
> @@ -313,6 +313,10 @@
> param->log2MaxPocLsb = 8;
> param->maxSlices = 1;
>
> + /*Conformance window*/
> + param->confWinRightOffset = 0;
> + param->confWinBottomOffset = 0;
> +
> param->bEmitVUITimingInfo = 1;
> param->bEmitVUIHRDInfo = 1;
> param->bOptQpPPS = 0;
> @@ -1783,6 +1787,8 @@
> param->bSingleSeiNal = 0;
> x265_log(param, X265_LOG_WARNING, "None of the SEI messages are
> enabled. Disabling Single SEI NAL\n");
> }
> + CHECK(param->confWinRightOffset < 0, "Conformance Window Right Offset
> must be 0 or greater");
> + CHECK(param->confWinBottomOffset < 0, "Conformance Window Bottom
> Offset must be 0 or greater");
> return check_failed;
> }
>
> @@ -2197,6 +2203,7 @@
> BOOL(p->bEnableSceneCutAwareQp, "scenecut-aware-qp");
> if (p->bEnableSceneCutAwareQp)
> s += sprintf(s, " scenecut-window=%d max-qp-delta=%d",
> p->scenecutWindow, p->maxQpDelta);
> + s += sprintf(s, "conformance-window-offsets right=%d bottom=%d",
> p->confWinRightOffset, p->confWinBottomOffset);
> #undef BOOL
> return buf;
> }
> @@ -2547,6 +2554,8 @@
> dst->maxQpDelta = src->maxQpDelta;
> dst->bField = src->bField;
>
> + dst->confWinRightOffset = src->confWinRightOffset;
> + dst->confWinBottomOffset = src->confWinBottomOffset;
> #ifdef SVT_HEVC
> memcpy(dst->svtHevcParam, src->svtHevcParam,
> sizeof(EB_H265_ENC_CONFIGURATION));
> #endif
> diff -r a28fd843b302 -r 5fdecb3d4af7 source/encoder/api.cpp
> --- a/source/encoder/api.cpp Fri Jan 10 17:01:08 2020 +0530
> +++ b/source/encoder/api.cpp Fri Jan 10 17:16:41 2020 +0530
> @@ -176,6 +176,8 @@
>
> // may change params for auto-detect, etc
> encoder->configure(param);
> + if (encoder->m_aborted)
> + goto fail;
> // may change rate control and CPB params
> if (!enforceLevel(*param, encoder->m_vps))
> goto fail;
> diff -r a28fd843b302 -r 5fdecb3d4af7 source/encoder/encoder.cpp
> --- a/source/encoder/encoder.cpp Fri Jan 10 17:01:08 2020 +0530
> +++ b/source/encoder/encoder.cpp Fri Jan 10 17:16:41 2020 +0530
> @@ -81,6 +81,7 @@
> #define MVTHRESHOLD (10*10)
> #define PU_2Nx2N 1
> #define MAX_CHROMA_QP_OFFSET 12
> +#define CONF_OFFSET_BYTES (2 * sizeof(int))
> static const char* defaultAnalysisFileName = "x265_analysis.dat";
>
> using namespace X265_NS;
> @@ -474,15 +475,6 @@
> m_aborted = true;
> }
> }
> - if (m_param->analysisLoad && m_param->bUseAnalysisFile)
> - {
> - m_analysisFileIn = x265_fopen(m_param->analysisLoad, "rb");
> - if (!m_analysisFileIn)
> - {
> - x265_log_file(NULL, X265_LOG_ERROR, "Analysis load: failed to
> open file %s\n", m_param->analysisLoad);
> - m_aborted = true;
> - }
> - }
>
> if (m_param->analysisMultiPassRefine ||
> m_param->analysisMultiPassDistortion)
> {
> @@ -1751,11 +1743,11 @@
> if (m_param->analysisLoad)
> {
> /* reads analysis data for the frame and allocates memory
> based on slicetype */
> - static int paramBytes = 0;
> + static int paramBytes = CONF_OFFSET_BYTES;
> if (!inFrame->m_poc && m_param->bAnalysisType != HEVC_INFO)
> {
> - x265_analysis_data analysisData = inputPic->analysisData;
> - paramBytes = validateAnalysisData(&analysisData, 0);
> + x265_analysis_validate saveParam =
> inputPic->analysisData.saveParam;
> + paramBytes += validateAnalysisData(&saveParam, 0);
> if (paramBytes == -1)
> {
> m_aborted = true;
> @@ -3775,20 +3767,66 @@
> m_conformanceWindow.topOffset = 0;
> m_conformanceWindow.bottomOffset = 0;
> m_conformanceWindow.leftOffset = 0;
> +
> + uint32_t padsize = 0;
> + if (m_param->analysisLoad && m_param->bUseAnalysisFile)
> + {
>
[KS] Warn user on possible encoder crash if param's conformance window
offset is set along with file-based analysis load
> + m_analysisFileIn = x265_fopen(m_param->analysisLoad, "rb");
> + if (!m_analysisFileIn)
> + {
> + x265_log_file(NULL, X265_LOG_ERROR, "Analysis load: failed to
> open file %s\n", m_param->analysisLoad);
> + m_aborted = true;
> + }
> + else
> + {
> + if (fread(&m_conformanceWindow.rightOffset, sizeof(int), 1,
> m_analysisFileIn) != 1)
> + {
> + x265_log(NULL, X265_LOG_ERROR, "Error reading analysis
> data. Conformance window right offset missing\n");
> + m_aborted = true;
> + }
> + else if (m_conformanceWindow.rightOffset)
> + {
> + padsize = m_conformanceWindow.rightOffset * 2;
> + p->sourceWidth += padsize;
> + m_conformanceWindow.bEnabled = true;
> + m_conformanceWindow.rightOffset = padsize;
> + }
> +
> + if (fread(&m_conformanceWindow.bottomOffset, sizeof(int), 1,
> m_analysisFileIn) != 1)
> + {
> + x265_log(NULL, X265_LOG_ERROR, "Error reading analysis
> data. Conformance window bottom offset missing\n");
> + m_aborted = true;
> + }
> + else if (m_conformanceWindow.bottomOffset)
> + {
> + padsize = m_conformanceWindow.bottomOffset * 2;
> + p->sourceHeight += padsize;
> + m_conformanceWindow.bEnabled = true;
> + m_conformanceWindow.bottomOffset = padsize;
> + }
> + }
> + }
> +
> /* set pad size if width is not multiple of the minimum CU size */
> - if (p->scaleFactor == 2 && ((p->sourceWidth / 2) & (p->minCUSize -
> 1)) && p->analysisLoad)
> - {
> - uint32_t rem = (p->sourceWidth / 2) & (p->minCUSize - 1);
> - uint32_t padsize = p->minCUSize - rem;
> - p->sourceWidth += padsize * 2;
> -
> - m_conformanceWindow.bEnabled = true;
> - m_conformanceWindow.rightOffset = padsize * 2;
> - }
> - else if(p->sourceWidth & (p->minCUSize - 1))
> + if (p->confWinRightOffset)
> + {
> + if ((p->sourceWidth + p->confWinRightOffset) & (p->minCUSize - 1))
> + {
> + x265_log(p, X265_LOG_ERROR, "Incompatible conformance window
> right offset."
> + " This when added to the source
> width should be a multiple of minCUSize\n");
> + m_aborted = true;
> + }
> + else
> + {
> + p->sourceWidth += p->confWinRightOffset;
> + m_conformanceWindow.bEnabled = true;
> + m_conformanceWindow.rightOffset = p->confWinRightOffset;
> + }
> + }
> + else if (p->sourceWidth & (p->minCUSize - 1))
> {
> uint32_t rem = p->sourceWidth & (p->minCUSize - 1);
> - uint32_t padsize = p->minCUSize - rem;
> + padsize = p->minCUSize - rem;
> p->sourceWidth += padsize;
>
> m_conformanceWindow.bEnabled = true;
> @@ -3989,18 +4027,25 @@
> }
> }
> /* set pad size if height is not multiple of the minimum CU size */
> - if (p->scaleFactor == 2 && ((p->sourceHeight / 2) & (p->minCUSize -
> 1)) && p->analysisLoad)
> - {
> - uint32_t rem = (p->sourceHeight / 2) & (p->minCUSize - 1);
> - uint32_t padsize = p->minCUSize - rem;
> - p->sourceHeight += padsize * 2;
> - m_conformanceWindow.bEnabled = true;
> - m_conformanceWindow.bottomOffset = padsize * 2;
> + if (p->confWinBottomOffset)
> + {
> + if ((p->sourceHeight + p->confWinBottomOffset) & (p->minCUSize -
> 1))
> + {
> + x265_log(p, X265_LOG_ERROR, "Incompatible conformance window
> bottom offset."
> + " This when added to the source height should be a
> multiple of minCUSize\n");
> + m_aborted = true;
> + }
> + else
> + {
> + p->sourceHeight += p->confWinBottomOffset;
> + m_conformanceWindow.bEnabled = true;
> + m_conformanceWindow.bottomOffset = p->confWinBottomOffset;
> + }
> }
> else if(p->sourceHeight & (p->minCUSize - 1))
> {
> uint32_t rem = p->sourceHeight & (p->minCUSize - 1);
> - uint32_t padsize = p->minCUSize - rem;
> + padsize = p->minCUSize - rem;
> p->sourceHeight += padsize;
> m_conformanceWindow.bEnabled = true;
> m_conformanceWindow.bottomOffset = padsize;
> @@ -4835,7 +4880,7 @@
> }
>
>
> -int Encoder::validateAnalysisData(x265_analysis_data* analysis, int
> writeFlag)
> +int Encoder::validateAnalysisData(x265_analysis_validate* saveParam, int
> writeFlag)
> {
> #define X265_PARAM_VALIDATE(analysisParam, size, bytes, param, errorMsg)\
> if(!writeFlag)\
> @@ -4876,11 +4921,16 @@
> }\
> count++;
>
> - x265_analysis_validate *saveParam = &analysis->saveParam;
> FILE* fileOffset = NULL;
> int readValue = 0;
> int count = 0;
>
> + if (m_param->bUseAnalysisFile && writeFlag)
> + {
> + X265_PARAM_VALIDATE(saveParam->rightOffset, sizeof(int), 1,
> &m_conformanceWindow.rightOffset, right-offset);
> + X265_PARAM_VALIDATE(saveParam->bottomOffset, sizeof(int), 1,
> &m_conformanceWindow.bottomOffset, bottom-offset);
> + }
> +
> X265_PARAM_VALIDATE(saveParam->intraRefresh, sizeof(int), 1,
> &m_param->bIntraRefresh, intra-refresh);
> X265_PARAM_VALIDATE(saveParam->maxNumReferences, sizeof(int), 1,
> &m_param->maxNumReferences, ref);
> X265_PARAM_VALIDATE(saveParam->keyframeMax, sizeof(int), 1,
> &m_param->keyframeMax, keyint);
> @@ -5235,7 +5285,7 @@
>
> if (!analysis->poc)
> {
> - if (validateAnalysisData(analysis, 1) == -1)
> + if (validateAnalysisData(&analysis->saveParam, 1) == -1)
> {
> m_aborted = true;
> return;
> diff -r a28fd843b302 -r 5fdecb3d4af7 source/encoder/encoder.h
> --- a/source/encoder/encoder.h Fri Jan 10 17:01:08 2020 +0530
> +++ b/source/encoder/encoder.h Fri Jan 10 17:16:41 2020 +0530
> @@ -358,7 +358,7 @@
>
> void finishFrameStats(Frame* pic, FrameEncoder *curEncoder,
> x265_frame_stats* frameStats, int inPoc);
>
> - int validateAnalysisData(x265_analysis_data* analysis, int
> readWriteFlag);
> + int validateAnalysisData(x265_analysis_validate* param, int
> readWriteFlag);
>
> void readUserSeiFile(x265_sei_payload& seiMsg, int poc);
>
> diff -r a28fd843b302 -r 5fdecb3d4af7 source/x265.h
> --- a/source/x265.h Fri Jan 10 17:01:08 2020 +0530
> +++ b/source/x265.h Fri Jan 10 17:16:41 2020 +0530
> @@ -132,6 +132,8 @@
> int chunkEnd;
> int cuTree;
> int ctuDistortionRefine;
> + int rightOffset;
> + int bottomOffset;
> }x265_analysis_validate;
>
> /* Stores intra analysis data for a single frame. This struct needs
> better packing */
> @@ -1877,6 +1879,28 @@
> * analysis information reused in analysis-load. Higher the refine
> level higher
> * the information reused. Default is 5 */
> int analysisLoadReuseLevel;
> +
> + /* Conformance window right offset specifies the padding offset to the
> + * right side of the internal copy of the input pictures in the
> library.
> + * The decoded picture will be cropped based on conformance window
> right offset
> + * signaled in the SPS before output. Default is 0.
> + * Recommended to set this during non-file based analysis-load to
> inform
> + * it about the conformace window right offset to be added to match
> the
> + * number of CUs across the width for which analysis info is available
> + * from the corresponding analysis-save. */
> +
> + int confWinRightOffset;
> +
> + /* Conformance window bottom offset specifies the padding offset to
> the
> + * bottom side of the internal copy of the input pictures in the
> library.
> + * The decoded picture will be cropped based on conformance window
> bottom offset
> + * signaled in the SPS before output. Default is 0.
> + * Recommended to set this during non-file based analysis-load to
> inform
> + * it about the conformace window bottom offset to be added to match
> the
> + * number of CUs across the height for which analysis info is available
> + * from the corresponding analysis-save. */
>
[KS] Shorter lines will be more readable.
> +
> + int confWinBottomOffset;
> } x265_param;
>
> /* x265_param_alloc:
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
--
Regards,
Kavitha
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20200113/557f808b/attachment-0001.html>
More information about the x265-devel
mailing list