Commit 2a2a643c authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit 'e67a87ea'

* commit 'e67a87ea':
  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: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 45131583 e67a87ea
...@@ -689,13 +689,13 @@ The filter accepts the following named parameters: ...@@ -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. ...@@ -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. ...@@ -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 ":", This filter accepts the following parameters:
for example "yuv420p:monow:rgb24". @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". ...@@ -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. ...@@ -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 ":", This filter accepts the following parameters:
for example "yuv420p:monow:rgb24". @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". ...@@ -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); ...@@ -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); \ return AVERROR(EINVAL); \
goto fail; \
} \ } \
add_to_list(&list, fmt); \ add_to_list(&list, fmt); \
\ \
...@@ -86,18 +93,6 @@ static int get_sample_rate(const char *samplerate) ...@@ -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) ...@@ -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: return 0;
av_opt_free(s);
return ret;
} }
static int query_formats(AVFilterContext *ctx) static int query_formats(AVFilterContext *ctx)
...@@ -148,6 +141,7 @@ AVFilter avfilter_af_aformat = { ...@@ -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 ...@@ -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 ...@@ -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(&copy);
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 @@ ...@@ -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 @@ ...@@ -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) ...@@ -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) { for (cur = format->pix_fmts; cur; cur = sep ? sep + 1 : NULL) {
if (!(sep = strchr(cur, ':'))) 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) ...@@ -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) ...@@ -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 = { ...@@ -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) ...@@ -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 = { ...@@ -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,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment