|
|
|
@ -49,9 +49,6 @@ |
|
|
|
|
#include <sys/resource.h> |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
const char **opt_names; |
|
|
|
|
const char **opt_values; |
|
|
|
|
static int opt_name_count; |
|
|
|
|
AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB]; |
|
|
|
|
AVFormatContext *avformat_opts; |
|
|
|
|
struct SwsContext *sws_opts; |
|
|
|
@ -81,17 +78,6 @@ void uninit_opts(void) |
|
|
|
|
sws_freeContext(sws_opts); |
|
|
|
|
sws_opts = NULL; |
|
|
|
|
#endif |
|
|
|
|
for (i = 0; i < opt_name_count; i++) { |
|
|
|
|
//opt_values are only stored for codec-specific options in which case
|
|
|
|
|
//both the name and value are dup'd
|
|
|
|
|
if (opt_values[i]) { |
|
|
|
|
av_freep(&opt_names[i]); |
|
|
|
|
av_freep(&opt_values[i]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
av_freep(&opt_names); |
|
|
|
|
av_freep(&opt_values); |
|
|
|
|
opt_name_count = 0; |
|
|
|
|
av_dict_free(&format_opts); |
|
|
|
|
av_dict_free(&codec_opts); |
|
|
|
|
} |
|
|
|
@ -297,7 +283,7 @@ unknown_opt: |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#define FLAGS (o->type == FF_OPT_TYPE_FLAGS) ? AV_DICT_APPEND : 0 |
|
|
|
|
static int opt_default2(const char *opt, const char *arg) |
|
|
|
|
int opt_default(const char *opt, const char *arg) |
|
|
|
|
{ |
|
|
|
|
const AVOption *o; |
|
|
|
|
if ((o = av_opt_find(avcodec_opts[0], opt, NULL, 0, AV_OPT_SEARCH_CHILDREN)) || |
|
|
|
@ -321,66 +307,6 @@ static int opt_default2(const char *opt, const char *arg) |
|
|
|
|
return AVERROR_OPTION_NOT_FOUND; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int opt_default(const char *opt, const char *arg){ |
|
|
|
|
int type; |
|
|
|
|
int ret= 0; |
|
|
|
|
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; *avcodec_opts && type<AVMEDIA_TYPE_NB && ret>= 0; type++){ |
|
|
|
|
const AVOption *o2 = av_opt_find(avcodec_opts[0], opt, NULL, opt_types[type], 0); |
|
|
|
|
if(o2) |
|
|
|
|
ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o); |
|
|
|
|
} |
|
|
|
|
if(!o && avformat_opts) |
|
|
|
|
ret = av_set_string3(avformat_opts, opt, arg, 1, &o); |
|
|
|
|
if(!o && sws_opts) |
|
|
|
|
ret = av_set_string3(sws_opts, opt, arg, 1, &o); |
|
|
|
|
if(!o){ |
|
|
|
|
if (opt[0] == 'a' && avcodec_opts[AVMEDIA_TYPE_AUDIO]) |
|
|
|
|
ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_AUDIO], opt+1, arg, 1, &o); |
|
|
|
|
else if(opt[0] == 'v' && avcodec_opts[AVMEDIA_TYPE_VIDEO]) |
|
|
|
|
ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 1, &o); |
|
|
|
|
else if(opt[0] == 's' && avcodec_opts[AVMEDIA_TYPE_SUBTITLE]) |
|
|
|
|
ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], opt+1, arg, 1, &o); |
|
|
|
|
} |
|
|
|
|
if (o && ret < 0) { |
|
|
|
|
fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt); |
|
|
|
|
exit(1); |
|
|
|
|
} |
|
|
|
|
if (!o) { |
|
|
|
|
AVCodec *p = NULL; |
|
|
|
|
AVOutputFormat *oformat = NULL; |
|
|
|
|
while ((p=av_codec_next(p))){ |
|
|
|
|
const AVClass *c = p->priv_class; |
|
|
|
|
if(c && av_opt_find(&c, opt, NULL, 0, 0)) |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if (!p) { |
|
|
|
|
while ((oformat = av_oformat_next(oformat))) { |
|
|
|
|
const AVClass *c = oformat->priv_class; |
|
|
|
|
if (c && av_opt_find(&c, opt, NULL, 0, 0)) |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ((ret = opt_default2(opt, arg)) < 0) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
// av_log(NULL, AV_LOG_ERROR, "%s:%s: %f 0x%0X\n", opt, arg, av_get_double(avcodec_opts, opt, NULL), (int)av_get_int(avcodec_opts, opt, NULL));
|
|
|
|
|
|
|
|
|
|
//FIXME we should always use avcodec_opts, ... for storing options so there will not be any need to keep track of what i set over this
|
|
|
|
|
opt_values= av_realloc(opt_values, sizeof(void*)*(opt_name_count+1)); |
|
|
|
|
opt_values[opt_name_count]= o ? NULL : av_strdup(arg); |
|
|
|
|
opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1)); |
|
|
|
|
opt_names[opt_name_count++]= o ? o->name : av_strdup(opt); |
|
|
|
|
|
|
|
|
|
if ((*avcodec_opts && avcodec_opts[0]->debug) || (avformat_opts && avformat_opts->debug)) |
|
|
|
|
av_log_set_level(AV_LOG_DEBUG); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int opt_loglevel(const char *opt, const char *arg) |
|
|
|
|
{ |
|
|
|
|
const struct { const char *name; int level; } log_levels[] = { |
|
|
|
@ -429,38 +355,6 @@ int opt_timelimit(const char *opt, const char *arg) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void set_context_opts(void *ctx, void *opts_ctx, int flags, AVCodec *codec) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
void *priv_ctx=NULL; |
|
|
|
|
if(!strcmp("AVCodecContext", (*(AVClass**)ctx)->class_name)){ |
|
|
|
|
AVCodecContext *avctx= ctx; |
|
|
|
|
if(codec && codec->priv_class && avctx->priv_data){ |
|
|
|
|
priv_ctx= avctx->priv_data; |
|
|
|
|
} |
|
|
|
|
} else if (!strcmp("AVFormatContext", (*(AVClass**)ctx)->class_name)) { |
|
|
|
|
AVFormatContext *avctx = ctx; |
|
|
|
|
if (avctx->oformat && avctx->oformat->priv_class) { |
|
|
|
|
priv_ctx = avctx->priv_data; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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_string3(ctx, opt_names[i], str, 1, NULL); |
|
|
|
|
/* We need to use a differnt system to pass options to the private context because
|
|
|
|
|
it is not known which codec and thus context kind that will be when parsing options |
|
|
|
|
we thus use opt_values directly instead of opts_ctx */ |
|
|
|
|
if(!str && priv_ctx && av_get_string(priv_ctx, opt_names[i], &opt, buf, sizeof(buf))){ |
|
|
|
|
av_set_string3(priv_ctx, opt_names[i], opt_values[i], 1, NULL); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void print_error(const char *filename, int err) |
|
|
|
|
{ |
|
|
|
|
char errbuf[128]; |
|
|
|
|