the other tools as well. Originally committed as revision 15450 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
| @@ -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 | |||
| @@ -39,6 +40,11 @@ | |||
| #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) { | |||
| @@ -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); | |||
| /** | |||
| @@ -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; | |||