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 ...@@ -2986,18 +2986,19 @@ field=type=bottom
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 named option @option{order} which
the input interlaced video will be transformed to. The parameter can specifies the required field order that the input interlaced video
assume one of the following values: will be transformed to. The option name can be omitted.
@table @option The option @option{order} can assume one of the following values:
@item 0 or bff @table @samp
@item bff
output bottom field first output bottom field first
@item 1 or tff @item tff
output top field first output top field first
@end table @end table
Default value is "tff". Default value is @samp{tff}.
Transformation is achieved by shifting the picture content up or down Transformation is achieved by shifting the picture content up or down
by one line, and filling the remaining line with appropriate picture content. by one line, and filling the remaining line with appropriate picture content.
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#define LIBAVFILTER_VERSION_MAJOR 3 #define LIBAVFILTER_VERSION_MAJOR 3
#define LIBAVFILTER_VERSION_MINOR 45 #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, \ #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \ LIBAVFILTER_VERSION_MINOR, \
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
* video field order filter, heavily influenced by vf_pad.c * video field order filter, heavily influenced by vf_pad.c
*/ */
#include "libavutil/opt.h"
#include "libavutil/imgutils.h" #include "libavutil/imgutils.h"
#include "libavutil/internal.h" #include "libavutil/internal.h"
#include "libavutil/pixdesc.h" #include "libavutil/pixdesc.h"
...@@ -31,34 +32,45 @@ ...@@ -31,34 +32,45 @@
#include "internal.h" #include "internal.h"
#include "video.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 unsigned 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;
#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) static av_cold int init(AVFilterContext *ctx, const char *args)
{ {
FieldOrderContext *fieldorder = ctx->priv; FieldOrderContext *fieldorder = ctx->priv;
int ret;
static const char *shorthand[] = { "order", NULL };
const char *tff = "tff"; fieldorder->class = &fieldorder_class;
const char *bff = "bff"; av_opt_set_defaults(fieldorder);
if (!args) { if ((ret = av_opt_set_from_string(fieldorder, args, shorthand, "=", ":")) < 0)
fieldorder->dst_tff = 1; return ret;
} 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 = fieldorder->order == ORDER_TFF;
fieldorder->dst_tff ? tff : bff); av_log(ctx, AV_LOG_VERBOSE, "tff:%d\n", fieldorder->dst_tff);
return 0; return 0;
} }
...@@ -200,4 +212,5 @@ AVFilter avfilter_vf_fieldorder = { ...@@ -200,4 +212,5 @@ AVFilter avfilter_vf_fieldorder = {
.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,
.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