Dear Sir or Madam,

Please consider my patch to x265.
It allows one to overwrite x265_log function so one could redirect all x265
messages from default stderr to somewhere else. It's useful when project
uses it's own logging facilities and does not want to use default format.

Best regards,
Yaroslav Dynnikov.
-- 
С уважением.
Дынников Ярослав.
From 39f5799bee17144a9212f76506047c53ccf05b79 Mon Sep 17 00:00:00 2001
From: Yaroslav Dynnikov <[email protected]>
Date: Thu, 6 Nov 2014 13:25:52 +0300
Subject: [PATCH] [api] ability to overwrite x265_log function

---
 source/common/common.cpp |   30 +++++-----------------------
 source/common/param.cpp  |   49 ++++++++++++++++++++++++++++++++++++----------
 source/x265.h            |    4 ++++
 3 files changed, 48 insertions(+), 35 deletions(-)

diff --git a/source/common/common.cpp b/source/common/common.cpp
index 2fb0a7a..f721c95 100644
--- a/source/common/common.cpp
+++ b/source/common/common.cpp
@@ -98,36 +98,16 @@ int x265_exp2fix8(double x)
 
 void x265_log(const x265_param *param, int level, const char *fmt, ...)
 {
-    if (param && level > param->logLevel)
+    if (param && param->logFunction && level > param->logLevel)
         return;
-    const char *log_level;
-    switch (level)
-    {
-    case X265_LOG_ERROR:
-        log_level = "error";
-        break;
-    case X265_LOG_WARNING:
-        log_level = "warning";
-        break;
-    case X265_LOG_INFO:
-        log_level = "info";
-        break;
-    case X265_LOG_DEBUG:
-        log_level = "debug";
-        break;
-    case X265_LOG_FULL:
-        log_level = "full";
-        break;
-    default:
-        log_level = "unknown";
-        break;
-    }
 
-    fprintf(stderr, "x265 [%s]: ", log_level);
+    char message[512];
     va_list arg;
     va_start(arg, fmt);
-    vfprintf(stderr, fmt, arg);
+    vsprintf(message, fmt, arg);
     va_end(arg);
+
+    param->logFunction(level, message);
 }
 
 double x265_ssim2dB(double ssim)
diff --git a/source/common/param.cpp b/source/common/param.cpp
index af70058..963b176 100644
--- a/source/common/param.cpp
+++ b/source/common/param.cpp
@@ -92,6 +92,34 @@ void x265_param_free(x265_param *p)
     return x265_free(p);
 }
 
+void defaultLogFunction(int level, const char * message)
+{
+    const char *log_level;
+    switch (level)
+    {
+    case X265_LOG_ERROR:
+        log_level = "error";
+        break;
+    case X265_LOG_WARNING:
+        log_level = "warning";
+        break;
+    case X265_LOG_INFO:
+        log_level = "info";
+        break;
+    case X265_LOG_DEBUG:
+        log_level = "debug";
+        break;
+    case X265_LOG_FULL:
+        log_level = "full";
+        break;
+    default:
+        log_level = "unknown";
+        break;
+    }
+
+    fprintf(stderr, "x265 [%s]: %s", log_level, message);
+}
+
 extern "C"
 void x265_param_default(x265_param *param)
 {
@@ -99,6 +127,7 @@ void x265_param_default(x265_param *param)
 
     /* Applying default values to all elements in the param structure */
     param->cpuid = x265::cpu_detect();
+    param->logFunction = defaultLogFunction;
     param->bEnableWavefront = 1;
     param->poolNumThreads = 0;
     param->frameNumThreads = 0;
@@ -1143,34 +1172,34 @@ void x265_print_params(x265_param *param)
         x265_log(param, X265_LOG_INFO, "VBV/HRD buffer / max-rate / init    : %d / %d / %.3f\n",
                  param->rc.vbvBufferSize, param->rc.vbvMaxBitrate, param->rc.vbvBufferInit);
 
-    x265_log(param, X265_LOG_INFO, "tools: ");
-#define TOOLOPT(FLAG, STR) if (FLAG) fprintf(stderr, "%s ", STR)
+    char buf[MAXPARAMSIZE], *s=buf;
+#define TOOLOPT(FLAG, STR) if (FLAG) s += sprintf(s, "%s ", STR)
     TOOLOPT(param->bEnableRectInter, "rect");
     TOOLOPT(param->bEnableAMP, "amp");
-    fprintf(stderr, "rd=%d ", param->rdLevel);
+    s += sprintf(s, "rd=%d ", param->rdLevel);
     if (param->psyRd > 0.)
-        fprintf(stderr, "psy-rd=%.2lf ", param->psyRd);
+        s += sprintf(s, "psy-rd=%.2lf ", param->psyRd);
     if (param->psyRdoq > 0.)
-        fprintf(stderr, "psy-rdoq=%.2lf ", param->psyRdoq);
+        s += sprintf(s, "psy-rdoq=%.2lf ", param->psyRdoq);
     TOOLOPT(param->bEnableEarlySkip, "esd");
     TOOLOPT(param->bEnableCbfFastMode, "cfm");
     if (param->noiseReduction)
-        fprintf(stderr, "nr=%d ", param->noiseReduction);
+        s += sprintf(s, "nr=%d ", param->noiseReduction);
     TOOLOPT(param->bEnableLoopFilter, "lft");
     if (param->bEnableSAO)
-        fprintf(stderr, "sao%s ", param->bSaoNonDeblocked ? "-non-deblock" : "");
+        s += sprintf(s, "sao%s ", param->bSaoNonDeblocked ? "-non-deblock" : "");
     TOOLOPT(param->bEnableSignHiding, "signhide");
     TOOLOPT(param->bEnableConstrainedIntra, "cip");
     TOOLOPT(param->bIntraInBFrames, "b-intra");
     TOOLOPT(param->bEnableFastIntra, "fast-intra");
     TOOLOPT(param->bEnableTemporalMvp, "tmvp");
     if (param->bEnableTransformSkip)
-        fprintf(stderr, "tskip%s ", param->bEnableTSkipFast ? "-fast" : "");
+        s += sprintf(s, "tskip%s ", param->bEnableTSkipFast ? "-fast" : "");
     TOOLOPT(param->bCULossless, "cu-lossless");
     TOOLOPT(param->rc.bStatWrite, "stats-write");
     TOOLOPT(param->rc.bStatRead,  "stats-read");
-    fprintf(stderr, "\n");
-    fflush(stderr);
+#undef TOOLOPT
+    x265_log(param, X265_LOG_INFO, "tools: %s\n", buf);
 }
 
 char *x265_param2string(x265_param *p)
diff --git a/source/x265.h b/source/x265.h
index e5474b7..18b6dd5 100644
--- a/source/x265.h
+++ b/source/x265.h
@@ -405,6 +405,10 @@ typedef struct x265_param
      * X265_LOG_FULL, default is X265_LOG_INFO */
     int       logLevel;
 
+    /* The function alows to overwrite logging function.
+     * Defaults to fprintf(stderr, "x265 [%s]: %s", log_level_names[level], message); */
+    void (*logFunction)(int level, const char * message);
+
     /* Enable analysis and logging distribution of Cus encoded across various
      * modes during mode decision. Default disabled */
     int       bLogCuStats;
-- 
1.7.9.5

_______________________________________________
x265-devel mailing list
[email protected]
https://mailman.videolan.org/listinfo/x265-devel

Reply via email to