[vlc-devel] [PATCH] x264: support setting any option

Rafaël Carré funman at videolan.org
Mon Apr 16 18:43:57 CEST 2012


---
 modules/codec/x264.c |   31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/modules/codec/x264.c b/modules/codec/x264.c
index c09f8fe..4de9f56 100644
--- a/modules/codec/x264.c
+++ b/modules/codec/x264.c
@@ -407,6 +407,9 @@ static void x264_log( void *, int i_level, const char *psz, va_list );
 #define TUNE_TEXT N_("Default tune setting used" )
 #define PRESET_TEXT N_("Default preset setting used" )
 
+#define X264_OPTIONS_TEXT N_("x264 private options.")
+#define X264_OPTIONS_LONGTEXT N_("x264 private options, in the form {opt=val,op2=val2} .")
+
 static const char *const enc_me_list[] =
   { "dia", "hex", "umh", "esa", "tesa" };
 static const char *const enc_me_list_text[] =
@@ -721,6 +724,9 @@ vlc_module_begin ()
     add_string( SOUT_CFG_PREFIX "tune", NULL , TUNE_TEXT, TUNE_TEXT, false )
         change_string_list( x264_tune_names, x264_tune_names, 0 );
 
+    add_string( SOUT_CFG_PREFIX "options", NULL, X264_OPTIONS_TEXT,
+                X264_OPTIONS_LONGTEXT, true )
+
 vlc_module_end ()
 
 /*****************************************************************************
@@ -740,7 +746,8 @@ static const char *const ppsz_sout_options[] = {
     "verbose", "vbv-bufsize", "vbv-init", "vbv-maxrate", "weightb", "weightp",
     "aq-mode", "aq-strength", "psy-rd", "psy", "profile", "lookahead", "slices",
     "slice-max-size", "slice-max-mbs", "intra-refresh", "mbtree", "hrd",
-    "tune","preset", "opengop", "bluray-compat", "frame-packing", NULL
+    "tune","preset", "opengop", "bluray-compat", "frame-packing", "options",
+    NULL
 };
 
 static block_t *Encode( encoder_t *, picture_t * );
@@ -1324,6 +1331,28 @@ static int  Open ( vlc_object_t *p_this )
     /* We don't want repeated headers, we repeat p_extra ourself if needed */
     p_sys->param.b_repeat_headers = 0;
 
+    char *psz_opts = var_InheritString( p_enc, SOUT_CFG_PREFIX "options" );
+    if (psz_opts && *psz_opts) {
+        config_chain_t *cfg = NULL;
+        config_ChainParseOptions(&cfg, psz_opts);
+        while (cfg) {
+            config_chain_t *next = cfg->p_next;
+            char *name  = cfg->psz_name;
+            char *value = cfg->psz_value;
+            int ret = x264_param_parse(&p_sys->param, name, value);
+            if (ret == X264_PARAM_BAD_NAME) {
+                msg_Err(p_enc, "Unknown option \"%s\"", name);
+            } else if (ret == X264_PARAM_BAD_VALUE) {
+                msg_Err(p_enc, "Bad value \"%s\" for option \"%s\"", value, name);
+            }
+            free(name);
+            free(value);
+            free(cfg);
+            cfg = next;
+        }
+    }
+    free(psz_opts);
+
     /* Open the encoder */
     p_sys->h = x264_encoder_open( &p_sys->param );
 
-- 
1.7.9.5



More information about the vlc-devel mailing list