[x265] [PATCH 2 of 3 x265] analysis-save/load: Validate conformance window offsets
Aruna Matheswaran
aruna at multicorewareinc.com
Mon Jan 13 09:34:45 CET 2020
On Mon, Jan 13, 2020 at 1:02 PM Kavitha Sampath <
kavitha at multicorewareinc.com> wrote:
> 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
>
[AM] Okay, will add the warning.
> + 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.
>
[AM] Okay, will re-phrase the comment.
> +
>> + 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
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
--
Regards,
*Aruna Matheswaran,*
Video Codec Engineer,
Media & AI analytics BU,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20200113/553b020e/attachment-0001.html>
More information about the x265-devel
mailing list