[x265] [PATCH] cli: modify --csv as CLI only option and move csv printing to x265.cpp

Divya Manivannan divya at multicorewareinc.com
Wed Jun 10 15:13:06 CEST 2015


# HG changeset patch
# User Divya Manivannan <divya at multicorewareinc.com>
# Date 1433941776 -19800
#      Wed Jun 10 18:39:36 2015 +0530
# Node ID fd1018a48cc60d7ff6359a8a18ed01d6ae46324b
# Parent  fbd752fe09427150250cdc13c30506c17d330052
cli: modify --csv as CLI only option and move csv printing to x265.cpp

diff -r fbd752fe0942 -r fd1018a48cc6 doc/reST/api.rst
--- a/doc/reST/api.rst	Wed Jun 10 17:32:11 2015 +0530
+++ b/doc/reST/api.rst	Wed Jun 10 18:39:36 2015 +0530
@@ -338,15 +338,6 @@
 Cleanup
 =======
 
-At the end of the encode, the application will want to trigger logging
-of the final encode statistics, if :option:`--csv` had been specified::
-
-	/* x265_encoder_log:
-	 *       write a line to the configured CSV file.  If a CSV filename was not
-	 *       configured, or file open failed, or the log level indicated frame level
-	 *       logging, this function will perform no write. */
-	void x265_encoder_log(x265_encoder *encoder, int argc, char **argv);
-
 Finally, the encoder must be closed in order to free all of its
 resources. An encoder that has been flushed cannot be restarted and
 reused. Once **x265_encoder_close()** has been called, the encoder
diff -r fbd752fe0942 -r fd1018a48cc6 doc/reST/cli.rst
--- a/doc/reST/cli.rst	Wed Jun 10 17:32:11 2015 +0530
+++ b/doc/reST/cli.rst	Wed Jun 10 18:39:36 2015 +0530
@@ -52,6 +52,7 @@
 	2. unable to open encoder
 	3. unable to generate stream headers
 	4. encoder abort
+	5. unable to open csv file
 
 Logging/Statistic Options
 =========================
@@ -123,6 +124,8 @@
 	enough ahead for the necessary reference data to be available. This
 	is more of a problem for P frames where some blocks are much more
 	expensive than others.
+	
+	**CLI ONLY**
 
 .. option:: --ssim, --no-ssim
 
diff -r fbd752fe0942 -r fd1018a48cc6 source/CMakeLists.txt
--- a/source/CMakeLists.txt	Wed Jun 10 17:32:11 2015 +0530
+++ b/source/CMakeLists.txt	Wed Jun 10 18:39:36 2015 +0530
@@ -30,7 +30,7 @@
 mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)
 
 # X265_BUILD must be incremented each time the public API is changed
-set(X265_BUILD 61)
+set(X265_BUILD 62)
 configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
                "${PROJECT_BINARY_DIR}/x265.def")
 configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
diff -r fbd752fe0942 -r fd1018a48cc6 source/common/param.cpp
--- a/source/common/param.cpp	Wed Jun 10 17:32:11 2015 +0530
+++ b/source/common/param.cpp	Wed Jun 10 18:39:36 2015 +0530
@@ -109,7 +109,6 @@
     param->frameNumThreads = 0;
 
     param->logLevel = X265_LOG_INFO;
-    param->csvfn = NULL;
     param->rc.lambdaFileName = NULL;
     param->bLogCuStats = 0;
     param->decodedPictureHashSEI = 0;
@@ -857,7 +856,6 @@
         p->rc.bStatRead = pass & 2;
     }
     OPT("stats") p->rc.statFileName = strdup(value);
-    OPT("csv") p->csvfn = strdup(value);
     OPT("scaling-list") p->scalingLists = strdup(value);
     OPT2("pools", "numa-pools") p->numaPools = strdup(value);
     OPT("lambda-file") p->rc.lambdaFileName = strdup(value);
diff -r fbd752fe0942 -r fd1018a48cc6 source/encoder/api.cpp
--- a/source/encoder/api.cpp	Wed Jun 10 17:32:11 2015 +0530
+++ b/source/encoder/api.cpp	Wed Jun 10 18:39:36 2015 +0530
@@ -190,15 +190,6 @@
     }
 }
 
-void x265_encoder_log(x265_encoder* enc, int argc, char **argv)
-{
-    if (enc)
-    {
-        Encoder *encoder = static_cast<Encoder*>(enc);
-        encoder->writeLog(argc, argv);
-    }
-}
-
 void x265_encoder_close(x265_encoder *enc)
 {
     if (enc)
@@ -279,7 +270,6 @@
     &x265_encoder_headers,
     &x265_encoder_encode,
     &x265_encoder_get_stats,
-    &x265_encoder_log,
     &x265_encoder_close,
     &x265_cleanup,
 };
diff -r fbd752fe0942 -r fd1018a48cc6 source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp	Wed Jun 10 17:32:11 2015 +0530
+++ b/source/encoder/encoder.cpp	Wed Jun 10 18:39:36 2015 +0530
@@ -39,18 +39,14 @@
 
 #include "x265.h"
 
+#if _MSC_VER
+#pragma warning (disable: 4996) // POSIX functions are just fine, thanks
+#endif
+
 namespace X265_NS {
 const char g_sliceTypeToChar[] = {'B', 'P', 'I'};
 }
 
-static const char* summaryCSVHeader =
-    "Command, Date/Time, Elapsed Time, FPS, Bitrate, "
-    "Y PSNR, U PSNR, V PSNR, Global PSNR, SSIM, SSIM (dB), "
-    "I count, I ave-QP, I kpbs, I-PSNR Y, I-PSNR U, I-PSNR V, I-SSIM (dB), "
-    "P count, P ave-QP, P kpbs, P-PSNR Y, P-PSNR U, P-PSNR V, P-SSIM (dB), "
-    "B count, B ave-QP, B kpbs, B-PSNR Y, B-PSNR U, B-PSNR V, B-SSIM (dB), "
-    "Version\n";
-
 static const char* defaultAnalysisFileName = "x265_analysis.dat";
 
 using namespace X265_NS;
@@ -72,7 +68,6 @@
     m_exportedPic = NULL;
     m_numDelayedPic = 0;
     m_outputCount = 0;
-    m_csvfpt = NULL;
     m_param = NULL;
     m_latestParam = NULL;
     m_cuOffsetY = NULL;
@@ -223,43 +218,6 @@
     initSPS(&m_sps);
     initPPS(&m_pps);
 
-    /* Try to open CSV file handle */
-    if (m_param->csvfn)
-    {
-        m_csvfpt = fopen(m_param->csvfn, "r");
-        if (m_csvfpt)
-        {
-            /* file already exists, re-open for append */
-            fclose(m_csvfpt);
-            m_csvfpt = fopen(m_param->csvfn, "ab");
-        }
-        else
-        {
-            /* new CSV file, write header */
-            m_csvfpt = fopen(m_param->csvfn, "wb");
-            if (m_csvfpt)
-            {
-                if (m_param->logLevel >= X265_LOG_FRAME)
-                {
-                    fprintf(m_csvfpt, "Encode Order, Type, POC, QP, Bits, ");
-                    if (m_param->rc.rateControlMode == X265_RC_CRF)
-                        fprintf(m_csvfpt, "RateFactor, ");
-                    fprintf(m_csvfpt, "Y PSNR, U PSNR, V PSNR, YUV PSNR, SSIM, SSIM (dB),  List 0, List 1");
-                    /* detailed performance statistics */
-                    fprintf(m_csvfpt, ", DecideWait (ms), Row0Wait (ms), Wall time (ms), Ref Wait Wall (ms), Total CTU time (ms), Stall Time (ms), Avg WPP, Row Blocks\n");
-                }
-                else
-                    fputs(summaryCSVHeader, m_csvfpt);
-            }
-        }
-
-        if (!m_csvfpt)
-        {
-            x265_log(m_param, X265_LOG_ERROR, "Unable to open CSV log file <%s>, aborting\n", m_param->csvfn);
-            m_aborted = true;
-        }
-    }
-
     int numRows = (m_param->sourceHeight + g_maxCUSize - 1) / g_maxCUSize;
     int numCols = (m_param->sourceWidth  + g_maxCUSize - 1) / g_maxCUSize;
     for (int i = 0; i < m_param->frameNumThreads; i++)
@@ -371,8 +329,6 @@
 
     if (m_analysisFile)
         fclose(m_analysisFile);
-    if (m_csvfpt)
-        fclose(m_csvfpt);
 
     if (m_param)
     {
@@ -381,7 +337,6 @@
         free((char*)m_param->rc.statFileName);
         free((char*)m_param->analysisFileName);
         free((char*)m_param->scalingLists);
-        free((char*)m_param->csvfn);
         free((char*)m_param->numaPools);
         free((char*)m_param->masteringDisplayColorVolume);
         free((char*)m_param->contentLightLevelInfo);
@@ -1075,6 +1030,10 @@
             stats->bitrate = 0;
             stats->elapsedVideoTime = 0;
         }
+        char buff[100];
+        stats->buffI = strdup(statsCSVString(m_analyzeI, buff));
+        stats->buffP = strdup(statsCSVString(m_analyzeP, buff));
+        stats->buffB = strdup(statsCSVString(m_analyzeB, buff));
     }
 
     /* If new statistics are added to x265_stats, we must check here whether the
@@ -1082,57 +1041,6 @@
      * future safety) */
 }
 
-void Encoder::writeLog(int argc, char **argv)
-{
-    if (m_csvfpt)
-    {
-        if (m_param->logLevel >= X265_LOG_FRAME)
-        {
-            // adding summary to a per-frame csv log file needs a summary header
-            fprintf(m_csvfpt, "\nSummary\n");
-            fputs(summaryCSVHeader, m_csvfpt);
-        }
-        // CLI arguments or other
-        for (int i = 1; i < argc; i++)
-        {
-            if (i) fputc(' ', m_csvfpt);
-            fputs(argv[i], m_csvfpt);
-        }
-
-        // current date and time
-        time_t now;
-        struct tm* timeinfo;
-        time(&now);
-        timeinfo = localtime(&now);
-        char buffer[200];
-        strftime(buffer, 128, "%c", timeinfo);
-        fprintf(m_csvfpt, ", %s, ", buffer);
-
-        x265_stats stats;
-        fetchStats(&stats, sizeof(stats));
-
-        // elapsed time, fps, bitrate
-        fprintf(m_csvfpt, "%.2f, %.2f, %.2f,",
-                stats.elapsedEncodeTime, stats.encodedPictureCount / stats.elapsedEncodeTime, stats.bitrate);
-
-        if (m_param->bEnablePsnr)
-            fprintf(m_csvfpt, " %.3lf, %.3lf, %.3lf, %.3lf,",
-                    stats.globalPsnrY / stats.encodedPictureCount, stats.globalPsnrU / stats.encodedPictureCount,
-                    stats.globalPsnrV / stats.encodedPictureCount, stats.globalPsnr);
-        else
-            fprintf(m_csvfpt, " -, -, -, -,");
-        if (m_param->bEnableSsim)
-            fprintf(m_csvfpt, " %.6f, %6.3f,", stats.globalSsim, x265_ssim2dB(stats.globalSsim));
-        else
-            fprintf(m_csvfpt, " -, -,");
-
-        fputs(statsCSVString(m_analyzeI, buffer), m_csvfpt);
-        fputs(statsCSVString(m_analyzeP, buffer), m_csvfpt);
-        fputs(statsCSVString(m_analyzeB, buffer), m_csvfpt);
-        fprintf(m_csvfpt, " %s\n", x265_version_str);
-    }
-}
-
 /**
  * Produce an ascii(hex) representation of picture digest.
  *
@@ -1281,59 +1189,6 @@
 
         x265_log(m_param, X265_LOG_DEBUG, "%s\n", buf);
     }
-
-    if (m_param->logLevel >= X265_LOG_FRAME && m_csvfpt)
-    {
-        // per frame CSV logging if the file handle is valid
-        fprintf(m_csvfpt, "%d, %c-SLICE, %4d, %2.2lf, %10d,", m_outputCount++, c, poc, curEncData.m_avgQpAq, (int)bits);
-        if (m_param->rc.rateControlMode == X265_RC_CRF)
-            fprintf(m_csvfpt, "%.3lf,", curEncData.m_rateFactor);
-        double psnr = (psnrY * 6 + psnrU + psnrV) / 8;
-        if (m_param->bEnablePsnr)
-            fprintf(m_csvfpt, "%.3lf, %.3lf, %.3lf, %.3lf,", psnrY, psnrU, psnrV, psnr);
-        else
-            fputs(" -, -, -, -,", m_csvfpt);
-        if (m_param->bEnableSsim)
-            fprintf(m_csvfpt, " %.6f, %6.3f", ssim, x265_ssim2dB(ssim));
-        else
-            fputs(" -, -", m_csvfpt);
-        if (slice->isIntra())
-            fputs(", -, -", m_csvfpt);
-        else
-        {
-            int numLists = slice->isInterP() ? 1 : 2;
-            for (int list = 0; list < numLists; list++)
-            {
-                fprintf(m_csvfpt, ", ");
-                for (int ref = 0; ref < slice->m_numRefIdx[list]; ref++)
-                {
-                    int k = slice->m_refPOCList[list][ref] - slice->m_lastIDR;
-                    fprintf(m_csvfpt, " %d", k);
-                }
-            }
-
-            if (numLists == 1)
-                fputs(", -", m_csvfpt);
-        }
-
-#define ELAPSED_MSEC(start, end) (((double)(end) - (start)) / 1000)
-
-        // detailed frame statistics
-        fprintf(m_csvfpt, ", %.1lf, %.1lf, %.1lf, %.1lf, %.1lf, %.1lf",
-            ELAPSED_MSEC(0, curEncoder->m_slicetypeWaitTime),
-            ELAPSED_MSEC(curEncoder->m_startCompressTime, curEncoder->m_row0WaitTime),
-            ELAPSED_MSEC(curEncoder->m_row0WaitTime, curEncoder->m_endCompressTime),
-            ELAPSED_MSEC(curEncoder->m_row0WaitTime, curEncoder->m_allRowsAvailableTime),
-            ELAPSED_MSEC(0, curEncoder->m_totalWorkerElapsedTime),
-            ELAPSED_MSEC(0, curEncoder->m_totalNoWorkerTime));
-        if (curEncoder->m_totalActiveWorkerCount)
-            fprintf(m_csvfpt, ", %.3lf", (double)curEncoder->m_totalActiveWorkerCount / curEncoder->m_activeWorkerCountSamples);
-        else
-            fputs(", 1", m_csvfpt);
-        fprintf(m_csvfpt, ", %d", curEncoder->m_countRowBlocks);
-        fprintf(m_csvfpt, "\n");
-        fflush(stderr);
-    }
 }
 
 #if defined(_MSC_VER)
diff -r fbd752fe0942 -r fd1018a48cc6 source/encoder/encoder.h
--- a/source/encoder/encoder.h	Wed Jun 10 17:32:11 2015 +0530
+++ b/source/encoder/encoder.h	Wed Jun 10 18:39:36 2015 +0530
@@ -105,7 +105,6 @@
     EncStats           m_analyzeI;
     EncStats           m_analyzeP;
     EncStats           m_analyzeB;
-    FILE*              m_csvfpt;
     int64_t            m_encodeStartTime;
 
     // weighted prediction
@@ -149,8 +148,6 @@
 
     void fetchStats(x265_stats* stats, size_t statsSizeBytes);
 
-    void writeLog(int argc, char **argv);
-
     void printSummary();
 
     char* statsString(EncStats&, char*);
diff -r fbd752fe0942 -r fd1018a48cc6 source/x265.cpp
--- a/source/x265.cpp	Wed Jun 10 17:32:11 2015 +0530
+++ b/source/x265.cpp	Wed Jun 10 18:39:36 2015 +0530
@@ -68,12 +68,22 @@
     b_ctrl_c = 1;
 }
 
+static const char* summaryCSVHeader =
+    "Command, Date/Time, Elapsed Time, FPS, Bitrate, "
+    "Y PSNR, U PSNR, V PSNR, Global PSNR, SSIM, SSIM (dB), "
+    "I count, I ave-QP, I kpbs, I-PSNR Y, I-PSNR U, I-PSNR V, I-SSIM (dB), "
+    "P count, P ave-QP, P kpbs, P-PSNR Y, P-PSNR U, P-PSNR V, P-SSIM (dB), "
+    "B count, B ave-QP, B kpbs, B-PSNR Y, B-PSNR U, B-PSNR V, B-SSIM (dB), "
+    "Version\n";
+
 struct CLIOptions
 {
     InputFile* input;
     ReconFile* recon;
     OutputFile* output;
     FILE*       qpfile;
+    FILE*       csvfpt;
+    const char* csvfn;
     const char* reconPlayCmd;
     const x265_api* api;
     x265_param* param;
@@ -95,6 +105,8 @@
         recon = NULL;
         output = NULL;
         qpfile = NULL;
+        csvfpt = NULL;
+        csvfn = NULL;
         reconPlayCmd = NULL;
         api = NULL;
         param = NULL;
@@ -108,6 +120,8 @@
     }
 
     void destroy();
+    bool parseCSVFile();
+    void printLog(int argc, char **argv, x265_stats stats);
     void printStatus(uint32_t frameNum);
     bool parse(int argc, char **argv);
     bool parseQPFile(x265_picture &pic_org);
@@ -124,11 +138,81 @@
     if (qpfile)
         fclose(qpfile);
     qpfile = NULL;
+    if (csvfpt)
+        fclose(csvfpt);
+    csvfpt = NULL;
     if (output)
         output->release();
     output = NULL;
 }
 
+bool CLIOptions::parseCSVFile()
+{
+    csvfpt = fopen(csvfn, "r");
+    if (csvfpt)
+    {
+        /* file already exists, re-open for append */
+        fclose(csvfpt);
+        csvfpt = fopen(csvfn, "ab");
+    }
+    else
+    {
+        /* new CSV file, write header */
+        csvfpt = fopen(csvfn, "wb");
+        if (csvfpt)
+            fputs(summaryCSVHeader, csvfpt);
+    }
+
+    if (!csvfpt)
+    {
+        x265_log(param, X265_LOG_ERROR, "Unable to open CSV log file <%s>, aborting\n", csvfn);
+        return true;
+    }
+    return false;
+}
+
+void CLIOptions::printLog(int argc, char **argv, x265_stats stats)
+{
+    if (csvfpt)
+    {
+        // CLI arguments or other
+        for (int i = 1; i < argc; i++)
+        {
+            if (i) fputc(' ', csvfpt);
+            fputs(argv[i], csvfpt);
+        }
+
+        // current date and time
+        time_t now;
+        struct tm* timeinfo;
+        time(&now);
+        timeinfo = localtime(&now);
+        char buffer[200];
+        strftime(buffer, 128, "%c", timeinfo);
+        fprintf(csvfpt, ", %s, ", buffer);
+
+        // elapsed time, fps, bitrate
+        fprintf(csvfpt, "%.2f, %.2f, %.2f,",
+            stats.elapsedEncodeTime, stats.encodedPictureCount / stats.elapsedEncodeTime, stats.bitrate);
+
+        if (param->bEnablePsnr)
+            fprintf(csvfpt, " %.3lf, %.3lf, %.3lf, %.3lf,",
+            stats.globalPsnrY / stats.encodedPictureCount, stats.globalPsnrU / stats.encodedPictureCount,
+            stats.globalPsnrV / stats.encodedPictureCount, stats.globalPsnr);
+        else
+            fprintf(csvfpt, " -, -, -, -,");
+        if (param->bEnableSsim)
+            fprintf(csvfpt, " %.6f, %6.3f,", stats.globalSsim, x265_ssim2dB(stats.globalSsim));
+        else
+            fprintf(csvfpt, " -, -,");
+
+        fputs(stats.buffI, csvfpt);
+        fputs(stats.buffP, csvfpt);
+        fputs(stats.buffB, csvfpt);
+        fprintf(csvfpt, " %s\n", x265_version_str);
+    }
+}
+
 void CLIOptions::printStatus(uint32_t frameNum)
 {
     char buf[200];
@@ -271,6 +355,7 @@
             if (0) ;
             OPT2("frame-skip", "seek") this->seek = (uint32_t)x265_atoi(optarg, bError);
             OPT("frames") this->framesToBeEncoded = (uint32_t)x265_atoi(optarg, bError);
+            OPT("csv") this->csvfn = optarg;
             OPT("no-progress") this->bProgress = false;
             OPT("output") outputfn = optarg;
             OPT("input") inputfn = optarg;
@@ -475,7 +560,8 @@
  * 1 - unable to parse command line
  * 2 - unable to open encoder
  * 3 - unable to generate stream headers
- * 4 - encoder abort */
+ * 4 - encoder abort
+ * 5 - unable to open csv file */
 
 int main(int argc, char **argv)
 {
@@ -509,6 +595,17 @@
     if (cliopt.reconPlayCmd)
         reconPlay = new ReconPlay(cliopt.reconPlayCmd, *param);
 
+    if (cliopt.csvfn)
+    {
+        if (cliopt.parseCSVFile())
+        {
+            cliopt.destroy();
+            if (cliopt.api)
+                cliopt.api->param_free(cliopt.param);
+            exit(5);
+        }
+    }
+
     /* note: we could try to acquire a different libx265 API here based on
      * the profile found during option parsing, but it must be done before
      * opening an encoder */
@@ -669,8 +766,8 @@
     delete reconPlay;
 
     api->encoder_get_stats(encoder, &stats, sizeof(stats));
-    if (param->csvfn && !b_ctrl_c)
-        api->encoder_log(encoder, argc, argv);
+    if (cliopt.csvfn && !b_ctrl_c)
+        cliopt.printLog(argc, argv, stats);
     api->encoder_close(encoder);
 
     int64_t second_largest_pts = 0;
diff -r fbd752fe0942 -r fd1018a48cc6 source/x265.def.in
--- a/source/x265.def.in	Wed Jun 10 17:32:11 2015 +0530
+++ b/source/x265.def.in	Wed Jun 10 18:39:36 2015 +0530
@@ -17,7 +17,6 @@
 x265_encoder_reconfig
 x265_encoder_encode
 x265_encoder_get_stats
-x265_encoder_log
 x265_encoder_close
 x265_cleanup
 x265_api_get_${X265_BUILD}
diff -r fbd752fe0942 -r fd1018a48cc6 source/x265.h
--- a/source/x265.h	Wed Jun 10 17:32:11 2015 +0530
+++ b/source/x265.h	Wed Jun 10 18:39:36 2015 +0530
@@ -316,6 +316,9 @@
     uint64_t  accBits;              /* total bits output thus far */
     uint32_t  encodedPictureCount;  /* number of output pictures thus far */
     uint32_t  totalWPFrames;        /* number of uni-directional weighted frames used */
+    char*     buffI;
+    char*     buffP;
+    char*     buffB;
 } x265_stats;
 
 /* String values accepted by x265_param_parse() (and CLI) for various parameters */
@@ -453,13 +456,6 @@
      * X265_LOG_FULL, default is X265_LOG_INFO */
     int       logLevel;
 
-    /* filename of CSV log. If logLevel greater than or equal to X265_LOG_FRAME,
-     * the encoder will emit per-slice statistics to this log file in encode
-     * order. Otherwise the encoder will emit per-stream statistics into the log
-     * file when x265_encoder_log is called (presumably at the end of the
-     * encode) */
-    const char* csvfn;
-
     /*== Internal Picture Specification ==*/
 
     /* Internal encoder bit depth. If x265 was compiled to use 8bit pixels
@@ -1262,12 +1258,6 @@
  *       returns encoder statistics */
 void x265_encoder_get_stats(x265_encoder *encoder, x265_stats *, uint32_t statsSizeBytes);
 
-/* x265_encoder_log:
- *       write a line to the configured CSV file.  If a CSV filename was not
- *       configured, or file open failed, or the log level indicated frame level
- *       logging, this function will perform no write. */
-void x265_encoder_log(x265_encoder *encoder, int argc, char **argv);
-
 /* x265_encoder_close:
  *      close an encoder handler */
 void x265_encoder_close(x265_encoder *);
@@ -1314,7 +1304,6 @@
     int           (*encoder_headers)(x265_encoder*, x265_nal**, uint32_t*);
     int           (*encoder_encode)(x265_encoder*, x265_nal**, uint32_t*, x265_picture*, x265_picture*);
     void          (*encoder_get_stats)(x265_encoder*, x265_stats*, uint32_t);
-    void          (*encoder_log)(x265_encoder*, int, char**);
     void          (*encoder_close)(x265_encoder*);
     void          (*cleanup)(void);
     /* add new pointers to the end, or increment X265_MAJOR_VERSION */


More information about the x265-devel mailing list