Move opt_default() and set_context_opts() to cmdutils so it can be used from
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 28 Sep 2008 19:35:22 +0000 (19:35 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 28 Sep 2008 19:35:22 +0000 (19:35 +0000)
the other tools as well.

Originally committed as revision 15450 to svn://svn.ffmpeg.org/ffmpeg/trunk

cmdutils.c
cmdutils.h
ffmpeg.c

index 505f55b..8a01a0a 100644 (file)
@@ -31,6 +31,7 @@
 #include "libswscale/swscale.h"
 #include "libpostproc/postprocess.h"
 #include "libavutil/avstring.h"
+#include "libavcodec/opt.h"
 #include "cmdutils.h"
 #include "version.h"
 #ifdef CONFIG_NETWORK
 
 #undef exit
 
+const char **opt_names;
+static int opt_name_count;
+AVCodecContext *avctx_opts[CODEC_TYPE_NB];
+AVFormatContext *avformat_opts;
+struct SwsContext *sws_opts;
 
 double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max)
 {
@@ -160,6 +166,55 @@ unknown_opt:
     }
 }
 
+int opt_default(const char *opt, const char *arg){
+    int type;
+    const AVOption *o= NULL;
+    int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
+
+    for(type=0; type<CODEC_TYPE_NB; type++){
+        const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
+        if(o2)
+            o = av_set_string2(avctx_opts[type], opt, arg, 1);
+    }
+    if(!o)
+        o = av_set_string2(avformat_opts, opt, arg, 1);
+    if(!o)
+        o = av_set_string2(sws_opts, opt, arg, 1);
+    if(!o){
+        if(opt[0] == 'a')
+            o = av_set_string2(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg, 1);
+        else if(opt[0] == 'v')
+            o = av_set_string2(avctx_opts[CODEC_TYPE_VIDEO], opt+1, arg, 1);
+        else if(opt[0] == 's')
+            o = av_set_string2(avctx_opts[CODEC_TYPE_SUBTITLE], opt+1, arg, 1);
+    }
+    if(!o)
+        return -1;
+
+//    av_log(NULL, AV_LOG_ERROR, "%s:%s: %f 0x%0X\n", opt, arg, av_get_double(avctx_opts, opt, NULL), (int)av_get_int(avctx_opts, opt, NULL));
+
+    //FIXME we should always use avctx_opts, ... for storing options so there will not be any need to keep track of what i set over this
+    opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
+    opt_names[opt_name_count++]= o->name;
+
+    if(avctx_opts[0]->debug || avformat_opts->debug)
+        av_log_set_level(AV_LOG_DEBUG);
+    return 0;
+}
+
+void set_context_opts(void *ctx, void *opts_ctx, int flags)
+{
+    int i;
+    for(i=0; i<opt_name_count; i++){
+        char buf[256];
+        const AVOption *opt;
+        const char *str= av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
+        /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
+        if(str && ((opt->flags & flags) == flags))
+            av_set_string2(ctx, opt_names[i], str, 1);
+    }
+}
+
 void print_error(const char *filename, int err)
 {
     switch(err) {
index 981f0fa..2cc2ee2 100644 (file)
@@ -34,6 +34,17 @@ extern const char program_name[];
  */
 extern const int program_birth_year;
 
+extern const char **opt_names;
+extern AVCodecContext *avctx_opts[CODEC_TYPE_NB];
+extern AVFormatContext *avformat_opts;
+extern struct SwsContext *sws_opts;
+
+/**
+ * Fallback for options that are not explixitly handled, these will be
+ * parsed through AVOptions.
+ */
+int opt_default(const char *opt, const char *arg);
+
 /**
  * Parses a string and returns its corresponding value as a double.
  * Exits from the application if the string cannot be correctly
@@ -106,6 +117,8 @@ void show_help_options(const OptionDef *options, const char *msg, int mask, int
 void parse_options(int argc, char **argv, const OptionDef *options,
                    void (* parse_arg_function)(const char*));
 
+void set_context_opts(void *ctx, void *opts_ctx, int flags);
+
 void print_error(const char *filename, int err);
 
 /**
index 14027a1..73ce516 100644 (file)
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -219,11 +219,6 @@ static float dts_delta_threshold = 10;
 
 static unsigned int sws_flags = SWS_BICUBIC;
 
-static const char **opt_names;
-static int opt_name_count;
-static AVCodecContext *avctx_opts[CODEC_TYPE_NB];
-static AVFormatContext *avformat_opts;
-static struct SwsContext *sws_opts;
 static int64_t timer_start;
 
 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
@@ -2267,42 +2262,6 @@ static void opt_format(const char *arg)
     }
 }
 
-static int opt_default(const char *opt, const char *arg){
-    int type;
-    const AVOption *o= NULL;
-    int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
-
-    for(type=0; type<CODEC_TYPE_NB; type++){
-        const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
-        if(o2)
-            o = av_set_string2(avctx_opts[type], opt, arg, 1);
-    }
-    if(!o)
-        o = av_set_string2(avformat_opts, opt, arg, 1);
-    if(!o)
-        o = av_set_string2(sws_opts, opt, arg, 1);
-    if(!o){
-        if(opt[0] == 'a')
-            o = av_set_string2(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg, 1);
-        else if(opt[0] == 'v')
-            o = av_set_string2(avctx_opts[CODEC_TYPE_VIDEO], opt+1, arg, 1);
-        else if(opt[0] == 's')
-            o = av_set_string2(avctx_opts[CODEC_TYPE_SUBTITLE], opt+1, arg, 1);
-    }
-    if(!o)
-        return -1;
-
-//    av_log(NULL, AV_LOG_ERROR, "%s:%s: %f 0x%0X\n", opt, arg, av_get_double(avctx_opts, opt, NULL), (int)av_get_int(avctx_opts, opt, NULL));
-
-    //FIXME we should always use avctx_opts, ... for storing options so there will not be any need to keep track of what i set over this
-    opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
-    opt_names[opt_name_count++]= o->name;
-
-    if(avctx_opts[0]->debug || avformat_opts->debug)
-        av_log_set_level(AV_LOG_DEBUG);
-    return 0;
-}
-
 static void opt_video_rc_override_string(const char *arg)
 {
     video_rc_override_string = arg;
@@ -2780,19 +2739,6 @@ static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
     return codec->id;
 }
 
-static void set_context_opts(void *ctx, void *opts_ctx, int flags)
-{
-    int i;
-    for(i=0; i<opt_name_count; i++){
-        char buf[256];
-        const AVOption *opt;
-        const char *str= av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
-        /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
-        if(str && ((opt->flags & flags) == flags))
-            av_set_string2(ctx, opt_names[i], str, 1);
-    }
-}
-
 static void opt_input_file(const char *filename)
 {
     AVFormatContext *ic;