vf_(no)format: switch to an AVOptions-based system.

This commit is contained in:
Anton Khirnov 2013-02-25 21:21:29 +01:00
parent 0af7fe1f95
commit e67a87eac8
3 changed files with 75 additions and 10 deletions

View File

@ -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

View File

@ -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(&copy);
if (ret < 0)
goto fail;
#endif
} else {
ret = process_unnamed_options(filter, &options, args);
if (ret < 0)

View File

@ -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,