Commit aeac1dae authored by Stefano Sabatini's avatar Stefano Sabatini

lavfi/fieldorder: add support to named options

parent a3233e9d
......@@ -2986,18 +2986,19 @@ field=type=bottom
Transform the field order of the input video.
It accepts one parameter which specifies the required field order that
the input interlaced video will be transformed to. The parameter can
assume one of the following values:
This filter accepts the named option @option{order} which
specifies the required field order that the input interlaced video
will be transformed to. The option name can be omitted.
@table @option
@item 0 or bff
The option @option{order} can assume one of the following values:
@table @samp
@item bff
output bottom field first
@item 1 or tff
@item tff
output top field first
@end table
Default value is "tff".
Default value is @samp{tff}.
Transformation is achieved by shifting the picture content up or down
by one line, and filling the remaining line with appropriate picture content.
......
......@@ -30,7 +30,7 @@
#define LIBAVFILTER_VERSION_MAJOR 3
#define LIBAVFILTER_VERSION_MINOR 45
#define LIBAVFILTER_VERSION_MICRO 100
#define LIBAVFILTER_VERSION_MICRO 101
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \
......
......@@ -23,6 +23,7 @@
* video field order filter, heavily influenced by vf_pad.c
*/
#include "libavutil/opt.h"
#include "libavutil/imgutils.h"
#include "libavutil/internal.h"
#include "libavutil/pixdesc.h"
......@@ -31,34 +32,45 @@
#include "internal.h"
#include "video.h"
typedef struct
{
enum FieldOrder {
ORDER_TFF,
ORDER_BFF,
ORDER_NB,
};
typedef struct {
const AVClass *class;
enum FieldOrder order;
unsigned int dst_tff; ///< output bff/tff
int line_size[4]; ///< bytes of pixel data per line for each plane
} FieldOrderContext;
#define OFFSET(x) offsetof(FieldOrderContext, x)
#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
static const AVOption fieldorder_options[] = {
{ "order", "set output field order", OFFSET(order), AV_OPT_TYPE_INT, {.i64=ORDER_TFF}, 0, ORDER_NB-1, FLAGS, "order" },
{ "tff", "set top field first", 0, AV_OPT_TYPE_CONST, {.i64=ORDER_TFF}, .flags=FLAGS, .unit="order" },
{ "bff", "set bottom field first", 0, AV_OPT_TYPE_CONST, {.i64=ORDER_BFF}, .flags=FLAGS, .unit="order" },
{ NULL }
};
AVFILTER_DEFINE_CLASS(fieldorder);
static av_cold int init(AVFilterContext *ctx, const char *args)
{
FieldOrderContext *fieldorder = ctx->priv;
int ret;
static const char *shorthand[] = { "order", NULL };
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);
}
fieldorder->class = &fieldorder_class;
av_opt_set_defaults(fieldorder);
if ((ret = av_opt_set_from_string(fieldorder, args, shorthand, "=", ":")) < 0)
return ret;
av_log(ctx, AV_LOG_VERBOSE, "output field order: %s\n",
fieldorder->dst_tff ? tff : bff);
fieldorder->dst_tff = fieldorder->order == ORDER_TFF;
av_log(ctx, AV_LOG_VERBOSE, "tff:%d\n", fieldorder->dst_tff);
return 0;
}
......@@ -200,4 +212,5 @@ AVFilter avfilter_vf_fieldorder = {
.query_formats = query_formats,
.inputs = avfilter_vf_fieldorder_inputs,
.outputs = avfilter_vf_fieldorder_outputs,
.priv_class = &fieldorder_class,
};
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