* commit 'e67a87eac814c7805d18c983c43033a8a1bd62af': vf_(no)format: switch to an AVOptions-based system. af_aformat: switch to an AVOptions-based system. Conflicts: doc/filters.texi libavfilter/af_aformat.c Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.0
| @@ -689,13 +689,13 @@ The filter accepts the following named parameters: | |||||
| @table @option | @table @option | ||||
| @item sample_fmts | @item sample_fmts | ||||
| A comma-separated list of requested sample formats. | |||||
| A '|'-separated list of requested sample formats. | |||||
| @item sample_rates | @item sample_rates | ||||
| A comma-separated list of requested sample rates. | |||||
| A '|'-separated list of requested sample rates. | |||||
| @item channel_layouts | @item channel_layouts | ||||
| A comma-separated list of requested channel layouts. | |||||
| A '|'-separated list of requested channel layouts. | |||||
| @end table | @end table | ||||
| @@ -703,7 +703,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: | For example to force the output to either unsigned 8-bit or signed 16-bit stereo: | ||||
| @example | @example | ||||
| aformat='sample_fmts=u8,s16:channel_layouts=stereo' | |||||
| aformat=sample_fmts=u8|s16:channel_layouts=stereo | |||||
| @end example | @end example | ||||
| @section amerge | @section amerge | ||||
| @@ -3173,8 +3173,14 @@ Convert the input video to one of the specified pixel formats. | |||||
| Libavfilter will try to pick one that is supported for the input to | Libavfilter will try to pick one that is supported for the input to | ||||
| the next filter. | 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 | |||||
| @subsection Examples | @subsection Examples | ||||
| @@ -3182,12 +3188,12 @@ for example "yuv420p:monow:rgb24". | |||||
| @item | @item | ||||
| Convert the input video to the format @var{yuv420p} | Convert the input video to the format @var{yuv420p} | ||||
| @example | @example | ||||
| format=yuv420p | |||||
| format=pix_fmts=yuv420p | |||||
| @end example | @end example | ||||
| Convert the input video to any of the formats in the list | Convert the input video to any of the formats in the list | ||||
| @example | @example | ||||
| format=yuv420p:yuv444p:yuv410p | |||||
| format=pix_fmts=yuv420p|yuv444p|yuv410p | |||||
| @end example | @end example | ||||
| @end itemize | @end itemize | ||||
| @@ -4072,8 +4078,14 @@ alpha component (if available). The default value in input is 0. | |||||
| Force libavfilter not to use any of the specified pixel formats for the | Force libavfilter not to use any of the specified pixel formats for the | ||||
| input to the next filter. | 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 | |||||
| @subsection Examples | @subsection Examples | ||||
| @@ -4082,13 +4094,13 @@ for example "yuv420p:monow:rgb24". | |||||
| Force libavfilter to use a format different from @var{yuv420p} for the | Force libavfilter to use a format different from @var{yuv420p} for the | ||||
| input to the vflip filter: | input to the vflip filter: | ||||
| @example | @example | ||||
| noformat=yuv420p,vflip | |||||
| noformat=pix_fmts=yuv420p,vflip | |||||
| @end example | @end example | ||||
| @item | @item | ||||
| Convert the input video to any of the formats not contained in the list: | Convert the input video to any of the formats not contained in the list: | ||||
| @example | @example | ||||
| noformat=yuv420p:yuv444p:yuv410p | |||||
| noformat=yuv420p|yuv444p|yuv410p | |||||
| @end example | @end example | ||||
| @end itemize | @end itemize | ||||
| @@ -59,17 +59,24 @@ AVFILTER_DEFINE_CLASS(aformat); | |||||
| #define PARSE_FORMATS(str, type, list, add_to_list, get_fmt, none, desc) \ | #define PARSE_FORMATS(str, type, list, add_to_list, get_fmt, none, desc) \ | ||||
| do { \ | 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) { \ | while (cur) { \ | ||||
| type fmt; \ | type fmt; \ | ||||
| next = strchr(cur, ','); \ | |||||
| next = strchr(cur, sep); \ | |||||
| if (next) \ | if (next) \ | ||||
| *next++ = 0; \ | *next++ = 0; \ | ||||
| \ | \ | ||||
| if ((fmt = get_fmt(cur)) == none) { \ | if ((fmt = get_fmt(cur)) == none) { \ | ||||
| av_log(ctx, AV_LOG_ERROR, "Error parsing " desc ": %s.\n", cur);\ | 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); \ | add_to_list(&list, fmt); \ | ||||
| \ | \ | ||||
| @@ -86,18 +93,6 @@ static int get_sample_rate(const char *samplerate) | |||||
| static av_cold int init(AVFilterContext *ctx, const char *args) | static av_cold int init(AVFilterContext *ctx, const char *args) | ||||
| { | { | ||||
| AFormatContext *s = ctx->priv; | 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) | |||||
| return ret; | |||||
| PARSE_FORMATS(s->formats_str, enum AVSampleFormat, s->formats, | PARSE_FORMATS(s->formats_str, enum AVSampleFormat, s->formats, | ||||
| ff_add_format, av_get_sample_fmt, AV_SAMPLE_FMT_NONE, "sample format"); | ff_add_format, av_get_sample_fmt, AV_SAMPLE_FMT_NONE, "sample format"); | ||||
| @@ -107,9 +102,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args) | |||||
| ff_add_channel_layout, av_get_channel_layout, 0, | ff_add_channel_layout, av_get_channel_layout, 0, | ||||
| "channel layout"); | "channel layout"); | ||||
| fail: | |||||
| av_opt_free(s); | |||||
| return ret; | |||||
| return 0; | |||||
| } | } | ||||
| static int query_formats(AVFilterContext *ctx) | static int query_formats(AVFilterContext *ctx) | ||||
| @@ -148,6 +141,7 @@ AVFilter avfilter_af_aformat = { | |||||
| .init = init, | .init = init, | ||||
| .query_formats = query_formats, | .query_formats = query_formats, | ||||
| .priv_size = sizeof(AFormatContext), | .priv_size = sizeof(AFormatContext), | ||||
| .priv_class = &aformat_class, | |||||
| .inputs = avfilter_af_aformat_inputs, | .inputs = avfilter_af_aformat_inputs, | ||||
| .outputs = avfilter_af_aformat_outputs, | .outputs = avfilter_af_aformat_outputs, | ||||
| @@ -654,6 +654,9 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque | |||||
| AVDictionaryEntry *e; | AVDictionaryEntry *e; | ||||
| int ret=0; | int ret=0; | ||||
| int anton_options = | int anton_options = | ||||
| !strcmp(filter->filter->name, "aformat") || | |||||
| !strcmp(filter->filter->name, "format") || | |||||
| !strcmp(filter->filter->name, "noformat") || | |||||
| !strcmp(filter->filter->name, "resample") | !strcmp(filter->filter->name, "resample") | ||||
| ; | ; | ||||
| @@ -675,6 +678,33 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque | |||||
| ret = av_dict_parse_string(&options, args, "=", ":", 0); | ret = av_dict_parse_string(&options, args, "=", ":", 0); | ||||
| if (ret < 0) | if (ret < 0) | ||||
| goto fail; | 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 { | } else { | ||||
| ret = process_unnamed_options(filter, &options, args); | ret = process_unnamed_options(filter, &options, args); | ||||
| if (ret < 0) | if (ret < 0) | ||||
| @@ -28,6 +28,8 @@ | |||||
| #include "libavutil/internal.h" | #include "libavutil/internal.h" | ||||
| #include "libavutil/mem.h" | #include "libavutil/mem.h" | ||||
| #include "libavutil/pixdesc.h" | #include "libavutil/pixdesc.h" | ||||
| #include "libavutil/opt.h" | |||||
| #include "avfilter.h" | #include "avfilter.h" | ||||
| #include "internal.h" | #include "internal.h" | ||||
| #include "formats.h" | #include "formats.h" | ||||
| @@ -35,6 +37,8 @@ | |||||
| #include "video.h" | #include "video.h" | ||||
| typedef struct { | typedef struct { | ||||
| const AVClass *class; | |||||
| char *pix_fmts; | |||||
| /** | /** | ||||
| * List of flags telling if a given image format has been listed | * List of flags telling if a given image format has been listed | ||||
| * as argument to the filter. | * as argument to the filter. | ||||
| @@ -53,8 +57,8 @@ static av_cold int init(AVFilterContext *ctx, const char *args) | |||||
| enum AVPixelFormat pix_fmt; | enum AVPixelFormat pix_fmt; | ||||
| /* parse the list of formats */ | /* 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); | pix_fmt_name_len = strlen(cur); | ||||
| else | else | ||||
| pix_fmt_name_len = sep - cur; | pix_fmt_name_len = sep - cur; | ||||
| @@ -90,6 +94,12 @@ static AVFilterFormats *make_format_list(FormatContext *format, int flag) | |||||
| return formats; | 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 | #if CONFIG_FORMAT_FILTER | ||||
| static int query_formats_format(AVFilterContext *ctx) | static int query_formats_format(AVFilterContext *ctx) | ||||
| { | { | ||||
| @@ -97,6 +107,13 @@ static int query_formats_format(AVFilterContext *ctx) | |||||
| return 0; | 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[] = { | static const AVFilterPad avfilter_vf_format_inputs[] = { | ||||
| { | { | ||||
| .name = "default", | .name = "default", | ||||
| @@ -123,6 +140,7 @@ AVFilter avfilter_vf_format = { | |||||
| .query_formats = query_formats_format, | .query_formats = query_formats_format, | ||||
| .priv_size = sizeof(FormatContext), | .priv_size = sizeof(FormatContext), | ||||
| .priv_class = &format_class, | |||||
| .inputs = avfilter_vf_format_inputs, | .inputs = avfilter_vf_format_inputs, | ||||
| .outputs = avfilter_vf_format_outputs, | .outputs = avfilter_vf_format_outputs, | ||||
| @@ -136,6 +154,13 @@ static int query_formats_noformat(AVFilterContext *ctx) | |||||
| return 0; | 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[] = { | static const AVFilterPad avfilter_vf_noformat_inputs[] = { | ||||
| { | { | ||||
| .name = "default", | .name = "default", | ||||
| @@ -162,6 +187,7 @@ AVFilter avfilter_vf_noformat = { | |||||
| .query_formats = query_formats_noformat, | .query_formats = query_formats_noformat, | ||||
| .priv_size = sizeof(FormatContext), | .priv_size = sizeof(FormatContext), | ||||
| .priv_class = &noformat_class, | |||||
| .inputs = avfilter_vf_noformat_inputs, | .inputs = avfilter_vf_noformat_inputs, | ||||
| .outputs = avfilter_vf_noformat_outputs, | .outputs = avfilter_vf_noformat_outputs, | ||||