From 0af7fe1f95a9e4a25e7e46f386360c701c49763d Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Mon, 25 Feb 2013 21:21:29 +0100 Subject: [PATCH 1/2] af_aformat: switch to an AVOptions-based system. --- doc/filters.texi | 8 ++++---- libavfilter/af_aformat.c | 34 +++++++++++++--------------------- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 192cdfd885..9d1302a62c 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -133,13 +133,13 @@ The filter accepts the following named parameters: @table @option @item sample_fmts -A comma-separated list of requested sample formats. +A '|'-separated list of requested sample formats. @item sample_rates -A comma-separated list of requested sample rates. +A '|'-separated list of requested sample rates. @item channel_layouts -A comma-separated list of requested channel layouts. +A '|'-separated list of requested channel layouts. @end table @@ -147,7 +147,7 @@ If a parameter is omitted, all values are allowed. For example to force the output to either unsigned 8-bit or signed 16-bit stereo: @example -aformat=sample_fmts\=u8\,s16:channel_layouts\=stereo +aformat=sample_fmts=u8|s16:channel_layouts=stereo @end example @section amix diff --git a/libavfilter/af_aformat.c b/libavfilter/af_aformat.c index 2059cf2b49..93760e1ec7 100644 --- a/libavfilter/af_aformat.c +++ b/libavfilter/af_aformat.c @@ -63,17 +63,24 @@ static const AVClass aformat_class = { #define PARSE_FORMATS(str, type, list, add_to_list, get_fmt, none, desc) \ do { \ - char *next, *cur = str; \ + char *next, *cur = str, sep; \ + \ + if (str && strchr(str, ',')) { \ + av_log(ctx, AV_LOG_WARNING, "This syntax is deprecated, use '|' to "\ + "separate %s.\n", desc); \ + sep = ','; \ + } else \ + sep = '|'; \ + \ while (cur) { \ type fmt; \ - next = strchr(cur, ','); \ + next = strchr(cur, sep); \ if (next) \ *next++ = 0; \ \ if ((fmt = get_fmt(cur)) == none) { \ av_log(ctx, AV_LOG_ERROR, "Error parsing " desc ": %s.\n", cur);\ - ret = AVERROR(EINVAL); \ - goto fail; \ + return AVERROR(EINVAL); \ } \ add_to_list(&list, fmt); \ \ @@ -90,20 +97,6 @@ static int get_sample_rate(const char *samplerate) static av_cold int init(AVFilterContext *ctx, const char *args) { AFormatContext *s = ctx->priv; - int ret; - - if (!args) { - av_log(ctx, AV_LOG_ERROR, "No parameters supplied.\n"); - return AVERROR(EINVAL); - } - - s->class = &aformat_class; - av_opt_set_defaults(s); - - if ((ret = av_set_options_string(s, args, "=", ":")) < 0) { - av_log(ctx, AV_LOG_ERROR, "Error parsing options string '%s'.\n", args); - return ret; - } PARSE_FORMATS(s->formats_str, enum AVSampleFormat, s->formats, ff_add_format, av_get_sample_fmt, AV_SAMPLE_FMT_NONE, "sample format"); @@ -113,9 +106,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args) ff_add_channel_layout, av_get_channel_layout, 0, "channel layout"); -fail: - av_opt_free(s); - return ret; + return 0; } static int query_formats(AVFilterContext *ctx) @@ -154,6 +145,7 @@ AVFilter avfilter_af_aformat = { .init = init, .query_formats = query_formats, .priv_size = sizeof(AFormatContext), + .priv_class = &aformat_class, .inputs = avfilter_af_aformat_inputs, .outputs = avfilter_af_aformat_outputs, From e67a87eac814c7805d18c983c43033a8a1bd62af Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Mon, 25 Feb 2013 21:21:29 +0100 Subject: [PATCH 2/2] vf_(no)format: switch to an AVOptions-based system. --- doc/filters.texi | 28 ++++++++++++++++++++-------- libavfilter/avfilter.c | 27 +++++++++++++++++++++++++++ libavfilter/vf_format.c | 30 ++++++++++++++++++++++++++++-- 3 files changed, 75 insertions(+), 10 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 9d1302a62c..1d3457ca9c 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -1067,16 +1067,22 @@ Convert the input video to one of the specified pixel formats. Libavfilter will try to pick one that is supported for the input to the next filter. -The filter accepts a list of pixel format names, separated by ":", -for example "yuv420p:monow:rgb24". +This filter accepts the following parameters: +@table @option + +@item pix_fmts +A '|'-separated list of pixel format names, for example +"pix_fmts=yuv420p|monow|rgb24". + +@end table Some examples follow: @example # convert the input video to the format "yuv420p" -format=yuv420p +format=pix_fmts=yuv420p # convert the input video to any of the formats in the list -format=yuv420p:yuv444p:yuv410p +format=pix_fmts=yuv420p|yuv444p|yuv410p @end example @section fps @@ -1336,17 +1342,23 @@ alpha component (if available). The default value in input is 0. Force libavfilter not to use any of the specified pixel formats for the input to the next filter. -The filter accepts a list of pixel format names, separated by ":", -for example "yuv420p:monow:rgb24". +This filter accepts the following parameters: +@table @option + +@item pix_fmts +A '|'-separated list of pixel format names, for example +"pix_fmts=yuv420p|monow|rgb24". + +@end table Some examples follow: @example # force libavfilter to use a format different from "yuv420p" for the # input to the vflip filter -noformat=yuv420p,vflip +noformat=pix_fmts=yuv420p,vflip # convert the input video to any of the formats not contained in the list -noformat=yuv420p:yuv444p:yuv410p +noformat=yuv420p|yuv444p|yuv410p @end example @section null diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index a8429aac3e..e5a7f13464 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -486,6 +486,33 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque ret = av_dict_parse_string(&options, args, "=", ":", 0); if (ret < 0) goto fail; +#if FF_API_OLD_FILTER_OPTS + } else if (!strcmp(filter->filter->name, "format") || + !strcmp(filter->filter->name, "noformat")) { + /* a hack for compatibility with the old syntax + * replace colons with |s */ + char *copy = av_strdup(args); + char *p = copy; + + if (!copy) { + ret = AVERROR(ENOMEM); + goto fail; + } + + if (strchr(copy, ':')) { + av_log(filter, AV_LOG_WARNING, "This syntax is deprecated. Use " + "'|' to separate the list items.\n"); + } + + while ((p = strchr(p, ':'))) + *p++ = '|'; + + ret = process_unnamed_options(filter, &options, copy); + av_freep(©); + + if (ret < 0) + goto fail; +#endif } else { ret = process_unnamed_options(filter, &options, args); if (ret < 0) diff --git a/libavfilter/vf_format.c b/libavfilter/vf_format.c index 7e4a26e302..c08a707721 100644 --- a/libavfilter/vf_format.c +++ b/libavfilter/vf_format.c @@ -28,12 +28,16 @@ #include "libavutil/internal.h" #include "libavutil/mem.h" #include "libavutil/pixdesc.h" +#include "libavutil/opt.h" + #include "avfilter.h" #include "formats.h" #include "internal.h" #include "video.h" typedef struct { + const AVClass *class; + char *pix_fmts; /** * List of flags telling if a given image format has been listed * as argument to the filter. @@ -52,8 +56,8 @@ static av_cold int init(AVFilterContext *ctx, const char *args) enum AVPixelFormat pix_fmt; /* parse the list of formats */ - for (cur = args; cur; cur = sep ? sep+1 : NULL) { - if (!(sep = strchr(cur, ':'))) + for (cur = format->pix_fmts; cur; cur = sep ? sep + 1 : NULL) { + if (!(sep = strchr(cur, '|'))) pix_fmt_name_len = strlen(cur); else pix_fmt_name_len = sep - cur; @@ -92,6 +96,12 @@ static AVFilterFormats *make_format_list(FormatContext *format, int flag) return formats; } +#define OFFSET(x) offsetof(FormatContext, x) +static const AVOption options[] = { + { "pix_fmts", "A '|'-separated list of pixel formats", OFFSET(pix_fmts), AV_OPT_TYPE_STRING, .flags = AV_OPT_FLAG_VIDEO_PARAM }, + { NULL }, +}; + #if CONFIG_FORMAT_FILTER static int query_formats_format(AVFilterContext *ctx) { @@ -99,6 +109,13 @@ static int query_formats_format(AVFilterContext *ctx) return 0; } +static const AVClass format_class = { + .class_name = "format", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + static const AVFilterPad avfilter_vf_format_inputs[] = { { .name = "default", @@ -125,6 +142,7 @@ AVFilter avfilter_vf_format = { .query_formats = query_formats_format, .priv_size = sizeof(FormatContext), + .priv_class = &format_class, .inputs = avfilter_vf_format_inputs, .outputs = avfilter_vf_format_outputs, @@ -138,6 +156,13 @@ static int query_formats_noformat(AVFilterContext *ctx) return 0; } +static const AVClass noformat_class = { + .class_name = "noformat", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + static const AVFilterPad avfilter_vf_noformat_inputs[] = { { .name = "default", @@ -164,6 +189,7 @@ AVFilter avfilter_vf_noformat = { .query_formats = query_formats_noformat, .priv_size = sizeof(FormatContext), + .priv_class = &noformat_class, .inputs = avfilter_vf_noformat_inputs, .outputs = avfilter_vf_noformat_outputs,