vf_fieldorder: switch to an AVOptions-based system.

This commit is contained in:
Anton Khirnov 2013-02-25 21:21:29 +01:00
parent b9dfee9fa2
commit a39c154049
2 changed files with 26 additions and 36 deletions

View File

@ -1037,15 +1037,13 @@ fade=type=in:start_frame=5:nb_frames=20
Transform the field order of the input video. Transform the field order of the input video.
It accepts one parameter which specifies the required field order that This filter accepts the following options:
the input interlaced video will be transformed to. The parameter can
assume one of the following values:
@table @option @table @option
@item 0 or bff
output bottom field first @item order
@item 1 or tff Output field order. Valid values are @var{tff} for top field first or @var{bff}
output top field first for bottom field first.
@end table @end table
Default value is "tff". Default value is "tff".
@ -1063,7 +1061,7 @@ which is bottom field first.
For example: For example:
@example @example
./avconv -i in.vob -vf "fieldorder=bff" out.dv ./avconv -i in.vob -vf "fieldorder=order=bff" out.dv
@end example @end example
@section fifo @section fifo

View File

@ -30,6 +30,7 @@
#include "libavutil/imgutils.h" #include "libavutil/imgutils.h"
#include "libavutil/internal.h" #include "libavutil/internal.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h" #include "libavutil/pixdesc.h"
#include "avfilter.h" #include "avfilter.h"
#include "formats.h" #include "formats.h"
@ -38,36 +39,11 @@
typedef struct typedef struct
{ {
unsigned int dst_tff; ///< output bff/tff const AVClass *class;
int dst_tff; ///< output bff/tff
int line_size[4]; ///< bytes of pixel data per line for each plane int line_size[4]; ///< bytes of pixel data per line for each plane
} FieldOrderContext; } FieldOrderContext;
static av_cold int init(AVFilterContext *ctx, const char *args)
{
FieldOrderContext *fieldorder = ctx->priv;
const char *tff = "tff";
const char *bff = "bff";
if (!args) {
fieldorder->dst_tff = 1;
} else if (sscanf(args, "%u", &fieldorder->dst_tff) == 1) {
fieldorder->dst_tff = !!fieldorder->dst_tff;
} else if (!strcmp(tff, args)) {
fieldorder->dst_tff = 1;
} else if (!strcmp(bff, args)) {
fieldorder->dst_tff = 0;
} else {
av_log(ctx, AV_LOG_ERROR, "Invalid argument '%s'.\n", args);
return AVERROR(EINVAL);
}
av_log(ctx, AV_LOG_VERBOSE, "output field order: %s\n",
fieldorder->dst_tff ? tff : bff);
return 0;
}
static int query_formats(AVFilterContext *ctx) static int query_formats(AVFilterContext *ctx)
{ {
AVFilterFormats *formats; AVFilterFormats *formats;
@ -177,6 +153,22 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
return ff_filter_frame(outlink, frame); return ff_filter_frame(outlink, frame);
} }
#define OFFSET(x) offsetof(FieldOrderContext, x)
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM
static const AVOption options[] = {
{ "order", "output field order", OFFSET(dst_tff), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, FLAGS, "order" },
{ "bff", "bottom field first", 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, .unit = "order" },
{ "tff", "top field first", 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, .unit = "order" },
{ NULL },
};
static const AVClass fieldorder_class = {
.class_name = "fieldorder",
.item_name = av_default_item_name,
.option = options,
.version = LIBAVUTIL_VERSION_INT,
};
static const AVFilterPad avfilter_vf_fieldorder_inputs[] = { static const AVFilterPad avfilter_vf_fieldorder_inputs[] = {
{ {
.name = "default", .name = "default",
@ -200,8 +192,8 @@ static const AVFilterPad avfilter_vf_fieldorder_outputs[] = {
AVFilter avfilter_vf_fieldorder = { AVFilter avfilter_vf_fieldorder = {
.name = "fieldorder", .name = "fieldorder",
.description = NULL_IF_CONFIG_SMALL("Set the field order."), .description = NULL_IF_CONFIG_SMALL("Set the field order."),
.init = init,
.priv_size = sizeof(FieldOrderContext), .priv_size = sizeof(FieldOrderContext),
.priv_class = &fieldorder_class,
.query_formats = query_formats, .query_formats = query_formats,
.inputs = avfilter_vf_fieldorder_inputs, .inputs = avfilter_vf_fieldorder_inputs,
.outputs = avfilter_vf_fieldorder_outputs, .outputs = avfilter_vf_fieldorder_outputs,