<div dir="ltr">Ignore patch.</div><div class="gmail_extra"><br clear="all"><div><div dir="ltr">With Regards,<div>Sagar</div></div></div>
<br><div class="gmail_quote">On Tue, Sep 16, 2014 at 1:06 PM,  <span dir="ltr"><<a href="mailto:sagar@multicorewareinc.com" target="_blank">sagar@multicorewareinc.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"># HG changeset patch<br>
# User Sagar Kotecha <<a href="mailto:sagar@multicorewareinc.com">sagar@multicorewareinc.com</a>><br>
# Date 1410852729 -19800<br>
#      Tue Sep 16 13:02:09 2014 +0530<br>
# Node ID b9b5032d1608b04e6969cad794e9d31a07813168<br>
# Parent  67ee212bbf78f7192e5c5af6b53304468bfa55b1<br>
add fanout validation module to check param compatibility<br>
<br>
diff -r 67ee212bbf78 -r b9b5032d1608 source/common/param.cpp<br>
--- a/source/common/param.cpp   Mon Sep 15 16:09:52 2014 +0530<br>
+++ b/source/common/param.cpp   Tue Sep 16 13:02:09 2014 +0530<br>
@@ -1187,7 +1187,7 @@<br>
 {<br>
     char *buf, *s;<br>
<br>
-    buf = s = X265_MALLOC(char, 2000);<br>
+    buf = s = X265_MALLOC(char, MAXPARAMSIZE);<br>
     if (!buf)<br>
         return NULL;<br>
<br>
diff -r 67ee212bbf78 -r b9b5032d1608 source/common/param.h<br>
--- a/source/common/param.h     Mon Sep 15 16:09:52 2014 +0530<br>
+++ b/source/common/param.h     Tue Sep 16 13:02:09 2014 +0530<br>
@@ -38,6 +38,8 @@<br>
<br>
 /* this table is kept internal to avoid confusion, since log level indices start at -1 */<br>
 static const char * const logLevelNames[] = { "none", "error", "warning", "info", "debug", "full", 0 };<br>
+<br>
+#define MAXPARAMSIZE 2000<br>
 }<br>
<br>
 #endif // ifndef X265_PARAM_H<br>
diff -r 67ee212bbf78 -r b9b5032d1608 source/x265.cpp<br>
--- a/source/x265.cpp   Mon Sep 15 16:09:52 2014 +0530<br>
+++ b/source/x265.cpp   Tue Sep 16 13:02:09 2014 +0530<br>
@@ -227,6 +227,7 @@<br>
     uint32_t framesToBeEncoded; // number of frames to encode<br>
     uint64_t totalbytes;<br>
     size_t   analysisRecordSize; // number of bytes read from or dumped into file<br>
+    size_t   analysisHeaderSize;<br>
<br>
     int64_t startTime;<br>
     int64_t prevUpdateTime;<br>
@@ -262,6 +263,7 @@<br>
     bool parseQPFile(x265_picture &pic_org);<br>
     void readAnalysisFile(x265_picture* pic, x265_param*);<br>
     void writeAnalysisFile(x265_picture* pic, x265_param*);<br>
+    bool validateFanout(x265_param*);<br>
 };<br>
<br>
 void CLIOptions::destroy()<br>
@@ -755,6 +757,92 @@<br>
     return false;<br>
 }<br>
<br>
+bool CLIOptions::validateFanout(x265_param *param)<br>
+{<br>
+#define CMP_OPT_FANOUT(opt, param_val)\<br>
+    {\<br>
+        bErr = 0;\<br>
+        p = strstr(opts, opt "=");\<br>
+        char* q = strstr(opts, "no-"opt);\<br>
+        if (p && sscanf(p, opt "=%d" , &i) && param_val != i)\<br>
+            bErr = 1;\<br>
+        else if (!param_val && !q)\<br>
+            bErr = 1;\<br>
+        else if (param_val && (q || !strstr(opts, opt)))\<br>
+            bErr = 1;\<br>
+        if (bErr)\<br>
+        {\<br>
+            x265_log(param, X265_LOG_ERROR, "different " opt " setting than given in analysis file (%d vs %d)\n", param_val, i);\<br>
+            X265_FREE(opts);\<br>
+            return false;\<br>
+        }\<br>
+    }<br>
+<br>
+    char *p = NULL, *paramBuf, *opts;<br>
+    int i, j;<br>
+    uint32_t k , l;<br>
+    bool bErr = false;<br>
+<br>
+    opts = paramBuf = X265_MALLOC(char, MAXPARAMSIZE);<br>
+    if (!paramBuf)<br>
+        return false;<br>
+<br>
+    fread(paramBuf, 1, MAXPARAMSIZE, this->analysisFile);<br>
+<br>
+    /* check whether fanout options are compatible */<br>
+    if (strncmp(paramBuf, "#options:", 9))<br>
+    {<br>
+        x265_log(param, X265_LOG_ERROR, "options list in analysis file is not valid\n");<br>
+        return false;<br>
+    }<br>
+<br>
+    paramBuf = strchr(opts, '\n');<br>
+    fseek(this->analysisFile, long(strlen(opts) + 1), SEEK_SET);<br>
+    if (!paramBuf)<br>
+    {<br>
+        x265_log(param, X265_LOG_ERROR, "Malformed analysis file\n");<br>
+        return false;<br>
+    }<br>
+<br>
+    if (sscanf(opts, "#options: %dx%d", &i, &j) != 2)<br>
+    {<br>
+        x265_log(param, X265_LOG_ERROR, "Resolution specified in analysis file is not valid\n");<br>
+        X265_FREE(opts);<br>
+        return false;<br>
+    }<br>
+    if ((p = strstr(opts, " fps=")) == 0 || sscanf(p, " fps=%u/%u", &k, &l) != 2)<br>
+    {<br>
+        x265_log(param, X265_LOG_ERROR, "fps specified in analysis file is not valid\n");<br>
+        X265_FREE(opts);<br>
+        return false;<br>
+    }<br>
+    if (k != param->fpsNum || l != param->fpsDenom)<br>
+    {<br>
+        x265_log(param, X265_LOG_ERROR, "fps mismatch than given in analysis file (%u/%u vs %u/%u)\n",<br>
+            param->fpsNum, param->fpsDenom, k, l);<br>
+        X265_FREE(opts);<br>
+        return false;<br>
+    }<br>
+<br>
+    CMP_OPT_FANOUT("bitdepth", param->internalBitDepth);<br>
+    CMP_OPT_FANOUT("weightp", param->bEnableWeightedPred);<br>
+    CMP_OPT_FANOUT("bframes", param->bframes);<br>
+    CMP_OPT_FANOUT("b-pyramid", param->bBPyramid);<br>
+    CMP_OPT_FANOUT("b-adapt", param->bFrameAdaptive);<br>
+    CMP_OPT_FANOUT("open-gop", param->bOpenGOP);<br>
+    CMP_OPT_FANOUT("keyint", param->keyframeMax);<br>
+    CMP_OPT_FANOUT("min-keyint", param->keyframeMin);<br>
+    CMP_OPT_FANOUT("scenecut", param->scenecutThreshold);<br>
+    CMP_OPT_FANOUT("ctu", (int)param->maxCUSize);<br>
+    CMP_OPT_FANOUT("ref", param->maxNumReferences);<br>
+    CMP_OPT_FANOUT("rc-lookahead", param->lookaheadDepth);<br>
+<br>
+#undef CMP_OPT_FANOUT<br>
+<br>
+    X265_FREE(opts);<br>
+    return true;<br>
+}<br>
+<br>
 void CLIOptions::readAnalysisFile(x265_picture* pic, x265_param* p)<br>
 {<br>
     int poc, width, height;<br>
@@ -788,7 +876,7 @@<br>
<br>
 void CLIOptions::writeAnalysisFile(x265_picture* pic, x265_param *p)<br>
 {<br>
-    uint64_t seekTo = pic->poc * this->analysisRecordSize;<br>
+    uint64_t seekTo = pic->poc * this->analysisRecordSize + this->analysisHeaderSize;<br>
     fseeko(this->analysisFile, seekTo, SEEK_SET);<br>
     fwrite(&p->sourceWidth, sizeof(int), 1, this->analysisFile);<br>
     fwrite(&p->sourceHeight, sizeof(int), 1, this->analysisFile);<br>
@@ -912,6 +1000,26 @@<br>
<br>
         cliopt.analysisRecordSize = ((sizeof(int) * 4 + sizeof(uint32_t) * 2) + sizeof(x265_inter_data) * numCU * 85 +<br>
         sizeof(uint8_t) * 2 * numPart * numCU + sizeof(char) * numPart * numCU + sizeof(int) * numCU  + sizeof(uint32_t) * numCU);<br>
+        if (param->analysisMode == X265_ANALYSIS_SAVE)<br>
+        {<br>
+            char *p = x265_param2string(param);<br>
+            if (p)<br>
+            {<br>
+                fprintf(cliopt.analysisFile, "#options: %s\n", p);<br>
+                cliopt.analysisHeaderSize = strlen(p) + 1 + strlen("#options: \n");<br>
+                X265_FREE(p);<br>
+            }<br>
+            else<br>
+            {<br>
+                x265_log(NULL, X265_LOG_ERROR, "analysis: buffer allocation failure, aborting");<br>
+                goto fail;<br>
+            }<br>
+        }<br>
+        else<br>
+        {<br>
+            if (!cliopt.validateFanout(param))<br>
+                goto fail;<br>
+        }<br>
     }<br>
<br>
     if (cliopt.bDither)<br>
</blockquote></div><br></div>