[x265] [PATCH] analysis: Throw error messages for invalid analysis data from previous encode

bhavna at multicorewareinc.com bhavna at multicorewareinc.com
Thu May 17 08:53:33 CEST 2018


# HG changeset patch
# User Bhavna Hariharan <bhavna at multicorewareinc.com>
# Date 1526539305 -19800
#      Thu May 17 12:11:45 2018 +0530
# Branch stable
# Node ID e70f8897811514877bed1f1f318ed95d24658af0
# Parent  0968a46d6ba40d8eed7bf83729845f65f1f647e2
analysis: Throw error messages for invalid analysis data from previous encode

This patch does the following:
Save encode - In the analysis file, save the param values that are required
to match in the load encode for the data to be reused.

Load encode - Read the saved param values and compare them with the current
param values. Throw error if there are any mismatches in the param values.

diff -r 0968a46d6ba4 -r e70f88978115 source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp	Fri May 04 14:56:10 2018 +0530
+++ b/source/encoder/encoder.cpp	Thu May 17 12:11:45 2018 +0530
@@ -1069,8 +1069,16 @@
         /* Load analysis data before lookahead->addPicture, since sliceType has been decided */
         if (m_param->analysisLoad)
         {
-            /* readAnalysisFile reads analysis data for the frame and allocates memory based on slicetype */
-            readAnalysisFile(&inFrame->m_analysisData, inFrame->m_poc, pic_in);
+            /* reads analysis data for the frame and allocates memory based on slicetype */
+            static int paramBytes = 0;
+            if (!inFrame->m_poc)
+            {
+                x265_analysis_data analysisData = pic_in->analysisData;
+                paramBytes = validateAnalysisData(&analysisData, 0);
+                if (paramBytes == -1)
+                    m_aborted = true;
+            }
+            readAnalysisFile(&inFrame->m_analysisData, inFrame->m_poc, pic_in, paramBytes);
             inFrame->m_poc = inFrame->m_analysisData.poc;
             sliceType = inFrame->m_analysisData.sliceType;
             inFrame->m_lowres.bScenecut = !!inFrame->m_analysisData.bScenecut;
@@ -3310,7 +3318,7 @@
     }
 }
 
-void Encoder::readAnalysisFile(x265_analysis_data* analysis, int curPoc, const x265_picture* picIn)
+void Encoder::readAnalysisFile(x265_analysis_data* analysis, int curPoc, const x265_picture* picIn, int paramBytes)
 {
 
 #define X265_FREAD(val, size, readSize, fileOffset, src)\
@@ -3330,7 +3338,8 @@
     static uint64_t totalConsumedBytes = 0;
     uint32_t depthBytes = 0;
     if (m_param->bUseAnalysisFile)
-        fseeko(m_analysisFileIn, totalConsumedBytes, SEEK_SET);
+        fseeko(m_analysisFileIn, totalConsumedBytes + paramBytes, SEEK_SET);
+
     const x265_analysis_data *picData = &(picIn->analysisData);
     analysis_intra_data *intraPic = (analysis_intra_data *)picData->intraData;
     analysis_inter_data *interPic = (analysis_inter_data *)picData->interData;
@@ -3348,7 +3357,7 @@
         while (poc != curPoc && !feof(m_analysisFileIn))
         {
             currentOffset += frameRecordSize;
-            fseeko(m_analysisFileIn, currentOffset, SEEK_SET);
+            fseeko(m_analysisFileIn, currentOffset + paramBytes, SEEK_SET);
             X265_FREAD(&frameRecordSize, sizeof(uint32_t), 1, m_analysisFileIn, &(picData->frameRecordSize));
             X265_FREAD(&depthBytes, sizeof(uint32_t), 1, m_analysisFileIn, &(picData->depthBytes));
             X265_FREAD(&poc, sizeof(int), 1, m_analysisFileIn, &(picData->poc));
@@ -3680,6 +3689,57 @@
 #undef X265_FREAD
 }
 
+
+int Encoder::validateAnalysisData(x265_analysis_data* analysis, int writeFlag)
+{
+#define X265_PARAM_VALIDATE(analysisParam, size, bytes, param)\
+    if(!writeFlag)\
+    {\
+        fileOffset = m_analysisFileIn;\
+        if ((!m_param->bUseAnalysisFile && analysisParam != (int)*param) || \
+            (m_param->bUseAnalysisFile && (fread(&readValue, size, bytes, fileOffset) != bytes || (readValue != (int)*param))))\
+        {\
+            x265_log(NULL, X265_LOG_ERROR, "Error reading analysis data. Mismatch in params.\n");\
+            m_aborted = true;\
+            return -1;\
+        }\
+    }\
+    if(writeFlag)\
+    {\
+        fileOffset = m_analysisFileOut;\
+        if(!m_param->bUseAnalysisFile)\
+            analysisParam = *param;\
+        else if(fwrite(param, size, bytes, fileOffset) < bytes)\
+        {\
+            x265_log(NULL, X265_LOG_ERROR, "Error writing analysis data\n"); \
+            m_aborted = true;\
+            return -1; \
+        }\
+    }\
+    count++;\
+
+    x265_analysis_validate saveParam = analysis->saveParam;
+    FILE*     fileOffset = NULL;
+    int       readValue = 0;
+    int       count = 0;
+
+    X265_PARAM_VALIDATE(saveParam.maxNumReferences, sizeof(int), 1, &m_param->maxNumReferences);
+    X265_PARAM_VALIDATE(saveParam.analysisReuseLevel, sizeof(int), 1, &m_param->analysisReuseLevel);
+    X265_PARAM_VALIDATE(saveParam.scaleFactor, sizeof(int), 1, &m_param->scaleFactor);
+    X265_PARAM_VALIDATE(saveParam.keyframeMax, sizeof(int), 1, &m_param->keyframeMax);
+    X265_PARAM_VALIDATE(saveParam.keyframeMin, sizeof(int), 1, &m_param->keyframeMin);
+    X265_PARAM_VALIDATE(saveParam.openGOP, sizeof(int), 1, &m_param->bOpenGOP);
+    X265_PARAM_VALIDATE(saveParam.bframes, sizeof(int), 1, &m_param->bframes);
+    X265_PARAM_VALIDATE(saveParam.bPyramid, sizeof(int), 1, &m_param->bBPyramid);
+    X265_PARAM_VALIDATE(saveParam.maxCUSize, sizeof(int), 1, &m_param->maxCUSize);
+    X265_PARAM_VALIDATE(saveParam.minCUSize, sizeof(int), 1, &m_param->minCUSize);
+    X265_PARAM_VALIDATE(saveParam.radl, sizeof(int), 1, &m_param->radl);
+    X265_PARAM_VALIDATE(saveParam.lookaheadDepth, sizeof(int), 1, &m_param->lookaheadDepth);
+    X265_PARAM_VALIDATE(saveParam.gopLookahead, sizeof(int), 1, &m_param->gopLookahead);
+    return (count * sizeof(int));
+#undef X265_PARAM_VALIDATE
+}
+
 /* Toggle between two consecutive CTU rows. The save's CTU is copied
 twice consecutively in the first and second CTU row of load*/
 
@@ -3928,6 +3988,9 @@
     uint32_t numDir, numPlanes;
     bool bIntraInInter = false;
 
+    if (!analysis->poc)
+        validateAnalysisData(analysis, 1);
+
     /* calculate frameRecordSize */
     analysis->frameRecordSize = sizeof(analysis->frameRecordSize) + sizeof(depthBytes) + sizeof(analysis->poc) + sizeof(analysis->sliceType) +
                       sizeof(analysis->numCUsInFrame) + sizeof(analysis->numPartitions) + sizeof(analysis->bScenecut) + sizeof(analysis->satdCost);
diff -r 0968a46d6ba4 -r e70f88978115 source/encoder/encoder.h
--- a/source/encoder/encoder.h	Fri May 04 14:56:10 2018 +0530
+++ b/source/encoder/encoder.h	Thu May 17 12:11:45 2018 +0530
@@ -279,7 +279,7 @@
 
     void freeAnalysis2Pass(x265_analysis_2Pass* analysis, int sliceType);
 
-    void readAnalysisFile(x265_analysis_data* analysis, int poc, const x265_picture* picIn);
+    void readAnalysisFile(x265_analysis_data* analysis, int poc, const x265_picture* picIn, int paramBytes);
 
     int getCUIndex(cuLocation* cuLoc, uint32_t* count, int bytes, int flag);
 
@@ -290,6 +290,8 @@
     void writeAnalysis2PassFile(x265_analysis_2Pass* analysis2Pass, FrameData &curEncData, int slicetype);
     void finishFrameStats(Frame* pic, FrameEncoder *curEncoder, x265_frame_stats* frameStats, int inPoc);
 
+    int validateAnalysisData(x265_analysis_data* analysis, int readWriteFlag);
+
     void calcRefreshInterval(Frame* frameEnc);
 
     void initRefIdx();
diff -r 0968a46d6ba4 -r e70f88978115 source/x265.h
--- a/source/x265.h	Fri May 04 14:56:10 2018 +0530
+++ b/source/x265.h	Thu May 17 12:11:45 2018 +0530
@@ -108,6 +108,23 @@
     int64_t   reorderedPts;
 } x265_lookahead_data;
 
+typedef struct x265_analysis_validate
+{
+    int     maxNumReferences;
+    int     analysisReuseLevel;
+    int     scaleFactor;
+    int     keyframeMax;
+    int     keyframeMin;
+    int     openGOP;
+    int     bframes;
+    int     bPyramid;
+    int     maxCUSize;
+    int     minCUSize;
+    int     radl;
+    int     lookaheadDepth;
+    int     gopLookahead;
+}x265_analysis_validate;
+
 /* Stores all analysis data for a single frame */
 typedef struct x265_analysis_data
 {
@@ -125,6 +142,7 @@
     uint32_t         numCuInHeight;
     x265_lookahead_data lookahead;
     uint8_t*         modeFlag[2];
+    x265_analysis_validate saveParam;
 } x265_analysis_data;
 
 /* cu statistics */
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265-clone.patch
Type: text/x-patch
Size: 8247 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20180517/fe28babd/attachment.bin>


More information about the x265-devel mailing list