From 02ad0416c06e4d6859d3d54bc039975b58661e75 Mon Sep 17 00:00:00 2001 From: Martin Vignali Date: Sun, 21 Oct 2018 19:28:03 +0200 Subject: avfilter/setparams : merge setfield and setrange filter to setparams filter setfield and setrange filters are kept. --- Changelog | 1 + doc/filters.texi | 46 ++++++++++++++++++++++ libavfilter/Makefile | 3 +- libavfilter/allfilters.c | 1 + libavfilter/version.h | 2 +- libavfilter/vf_setfield.c | 94 -------------------------------------------- libavfilter/vf_setparams.c | 97 +++++++++++++++++++++++++++++++++++++++++++++- 7 files changed, 146 insertions(+), 98 deletions(-) delete mode 100644 libavfilter/vf_setfield.c diff --git a/Changelog b/Changelog index 3b5131190c..ea54103278 100644 --- a/Changelog +++ b/Changelog @@ -36,6 +36,7 @@ version : - SER demuxer - sinc audio filter source - chromahold filter +- setparams filter version 4.0: diff --git a/doc/filters.texi b/doc/filters.texi index ad3e666253..6f58303252 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -14967,6 +14967,52 @@ Mark the frame as progressive. @end table @end table +@anchor{setparams} +@section setparams + +Force frame parameter for the output video frame. + +The @code{setparams} filter marks interlace and color range for the +output frames. It does not change the input frame, but only sets the +corresponding property, which affects how the frame is treated by +filters/encoders. + +@table @option +@item field_mode +Available values are: + +@table @samp +@item auto +Keep the same field property (default). + +@item bff +Mark the frame as bottom-field-first. + +@item tff +Mark the frame as top-field-first. + +@item prog +Mark the frame as progressive. +@end table + +@item range +Available values are: + +@table @samp +@item auto +Keep the same color range property (default). + +@item unspecified, unknown +Mark the frame as unspecified color range. + +@item limited, tv, mpeg +Mark the frame as limited range. + +@item full, pc, jpeg +Mark the frame as full range. +@end table +@end table + @section showinfo Show a line containing various information for each input video frame. diff --git a/libavfilter/Makefile b/libavfilter/Makefile index 46c6023bcc..108a2f87d7 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -342,7 +342,8 @@ OBJS-$(CONFIG_SELECTIVECOLOR_FILTER) += vf_selectivecolor.o OBJS-$(CONFIG_SENDCMD_FILTER) += f_sendcmd.o OBJS-$(CONFIG_SEPARATEFIELDS_FILTER) += vf_separatefields.o OBJS-$(CONFIG_SETDAR_FILTER) += vf_aspect.o -OBJS-$(CONFIG_SETFIELD_FILTER) += vf_setfield.o +OBJS-$(CONFIG_SETFIELD_FILTER) += vf_setparams.o +OBJS-$(CONFIG_SETPARAMS_FILTER) += vf_setparams.o OBJS-$(CONFIG_SETPTS_FILTER) += setpts.o OBJS-$(CONFIG_SETRANGE_FILTER) += vf_setparams.o OBJS-$(CONFIG_SETSAR_FILTER) += vf_aspect.o diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c index 536765581b..557590850b 100644 --- a/libavfilter/allfilters.c +++ b/libavfilter/allfilters.c @@ -327,6 +327,7 @@ extern AVFilter ff_vf_sendcmd; extern AVFilter ff_vf_separatefields; extern AVFilter ff_vf_setdar; extern AVFilter ff_vf_setfield; +extern AVFilter ff_vf_setparams; extern AVFilter ff_vf_setpts; extern AVFilter ff_vf_setrange; extern AVFilter ff_vf_setsar; diff --git a/libavfilter/version.h b/libavfilter/version.h index 17a1a36142..4e7ec97b2f 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -30,7 +30,7 @@ #include "libavutil/version.h" #define LIBAVFILTER_VERSION_MAJOR 7 -#define LIBAVFILTER_VERSION_MINOR 35 +#define LIBAVFILTER_VERSION_MINOR 36 #define LIBAVFILTER_VERSION_MICRO 100 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ diff --git a/libavfilter/vf_setfield.c b/libavfilter/vf_setfield.c deleted file mode 100644 index f4dc33d7e5..0000000000 --- a/libavfilter/vf_setfield.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2012 Stefano Sabatini - * - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * @file - * set field order - */ - -#include "libavutil/opt.h" -#include "avfilter.h" -#include "internal.h" -#include "video.h" - -enum SetFieldMode { - MODE_AUTO = -1, - MODE_BFF, - MODE_TFF, - MODE_PROG, -}; - -typedef struct SetFieldContext { - const AVClass *class; - int mode; ///< SetFieldMode -} SetFieldContext; - -#define OFFSET(x) offsetof(SetFieldContext, x) -#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM - -static const AVOption setfield_options[] = { - {"mode", "select interlace mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=MODE_AUTO}, -1, MODE_PROG, FLAGS, "mode"}, - {"auto", "keep the same input field", 0, AV_OPT_TYPE_CONST, {.i64=MODE_AUTO}, INT_MIN, INT_MAX, FLAGS, "mode"}, - {"bff", "mark as bottom-field-first", 0, AV_OPT_TYPE_CONST, {.i64=MODE_BFF}, INT_MIN, INT_MAX, FLAGS, "mode"}, - {"tff", "mark as top-field-first", 0, AV_OPT_TYPE_CONST, {.i64=MODE_TFF}, INT_MIN, INT_MAX, FLAGS, "mode"}, - {"prog", "mark as progressive", 0, AV_OPT_TYPE_CONST, {.i64=MODE_PROG}, INT_MIN, INT_MAX, FLAGS, "mode"}, - {NULL} -}; - -AVFILTER_DEFINE_CLASS(setfield); - -static int filter_frame(AVFilterLink *inlink, AVFrame *picref) -{ - SetFieldContext *setfield = inlink->dst->priv; - - if (setfield->mode == MODE_PROG) { - picref->interlaced_frame = 0; - } else if (setfield->mode != MODE_AUTO) { - picref->interlaced_frame = 1; - picref->top_field_first = setfield->mode; - } - return ff_filter_frame(inlink->dst->outputs[0], picref); -} - -static const AVFilterPad setfield_inputs[] = { - { - .name = "default", - .type = AVMEDIA_TYPE_VIDEO, - .filter_frame = filter_frame, - }, - { NULL } -}; - -static const AVFilterPad setfield_outputs[] = { - { - .name = "default", - .type = AVMEDIA_TYPE_VIDEO, - }, - { NULL } -}; - -AVFilter ff_vf_setfield = { - .name = "setfield", - .description = NULL_IF_CONFIG_SMALL("Force field for the output video frame."), - .priv_size = sizeof(SetFieldContext), - .priv_class = &setfield_class, - .inputs = setfield_inputs, - .outputs = setfield_outputs, -}; diff --git a/libavfilter/vf_setparams.c b/libavfilter/vf_setparams.c index 8427f98ba8..5426d88777 100644 --- a/libavfilter/vf_setparams.c +++ b/libavfilter/vf_setparams.c @@ -1,4 +1,6 @@ /* + * Copyright (c) 2012 Stefano Sabatini + * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or @@ -22,15 +24,29 @@ #include "internal.h" #include "video.h" +enum SetFieldMode { + MODE_AUTO = -1, + MODE_BFF, + MODE_TFF, + MODE_PROG, +}; + typedef struct SetParamsContext { const AVClass *class; + int field_mode; int color_range; } SetParamsContext; #define OFFSET(x) offsetof(SetParamsContext, x) #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM -static const AVOption setrange_options[] = { +static const AVOption setparams_options[] = { + {"field_mode", "select interlace mode", OFFSET(field_mode), AV_OPT_TYPE_INT, {.i64=MODE_AUTO}, -1, MODE_PROG, FLAGS, "mode"}, + {"auto", "keep the same input field", 0, AV_OPT_TYPE_CONST, {.i64=MODE_AUTO}, INT_MIN, INT_MAX, FLAGS, "mode"}, + {"bff", "mark as bottom-field-first", 0, AV_OPT_TYPE_CONST, {.i64=MODE_BFF}, INT_MIN, INT_MAX, FLAGS, "mode"}, + {"tff", "mark as top-field-first", 0, AV_OPT_TYPE_CONST, {.i64=MODE_TFF}, INT_MIN, INT_MAX, FLAGS, "mode"}, + {"prog", "mark as progressive", 0, AV_OPT_TYPE_CONST, {.i64=MODE_PROG}, INT_MIN, INT_MAX, FLAGS, "mode"}, + {"range", "select color range", OFFSET(color_range), AV_OPT_TYPE_INT, {.i64=-1},-1, AVCOL_RANGE_NB-1, FLAGS, "range"}, {"auto", "keep the same color range", 0, AV_OPT_TYPE_CONST, {.i64=-1}, 0, 0, FLAGS, "range"}, {"unspecified", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_UNSPECIFIED}, 0, 0, FLAGS, "range"}, @@ -44,13 +60,22 @@ static const AVOption setrange_options[] = { {NULL} }; -AVFILTER_DEFINE_CLASS(setrange); +AVFILTER_DEFINE_CLASS(setparams); static int filter_frame(AVFilterLink *inlink, AVFrame *frame) { AVFilterContext *ctx = inlink->dst; SetParamsContext *s = ctx->priv; + /* set field */ + if (s->field_mode == MODE_PROG) { + frame->interlaced_frame = 0; + } else if (s->field_mode != MODE_AUTO) { + frame->interlaced_frame = 1; + frame->top_field_first = s->field_mode; + } + + /* set range */ if (s->color_range >= 0) frame->color_range = s->color_range; return ff_filter_frame(ctx->outputs[0], frame); @@ -73,11 +98,79 @@ static const AVFilterPad outputs[] = { { NULL } }; +AVFilter ff_vf_setparams = { + .name = "setparams", + .description = NULL_IF_CONFIG_SMALL("Force field, or color range for the output video frame."), + .priv_size = sizeof(SetParamsContext), + .priv_class = &setparams_class, + .inputs = inputs, + .outputs = outputs, +}; + +#if CONFIG_SETRANGE_FILTER + +static const AVOption setrange_options[] = { + {"range", "select color range", OFFSET(color_range), AV_OPT_TYPE_INT, {.i64=-1},-1, AVCOL_RANGE_NB-1, FLAGS, "range"}, + {"auto", "keep the same color range", 0, AV_OPT_TYPE_CONST, {.i64=-1}, 0, 0, FLAGS, "range"}, + {"unspecified", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_UNSPECIFIED}, 0, 0, FLAGS, "range"}, + {"unknown", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_UNSPECIFIED}, 0, 0, FLAGS, "range"}, + {"limited", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_MPEG}, 0, 0, FLAGS, "range"}, + {"tv", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_MPEG}, 0, 0, FLAGS, "range"}, + {"mpeg", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_MPEG}, 0, 0, FLAGS, "range"}, + {"full", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG}, 0, 0, FLAGS, "range"}, + {"pc", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG}, 0, 0, FLAGS, "range"}, + {"jpeg", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG}, 0, 0, FLAGS, "range"}, + {NULL} +}; + +AVFILTER_DEFINE_CLASS(setrange); + +static av_cold int init_setrange(AVFilterContext *ctx) +{ + SetParamsContext *s = ctx->priv; + + s->field_mode = MODE_AUTO;/* set field mode to auto */ + return 0; +} + AVFilter ff_vf_setrange = { .name = "setrange", .description = NULL_IF_CONFIG_SMALL("Force color range for the output video frame."), .priv_size = sizeof(SetParamsContext), + .init = init_setrange, .priv_class = &setrange_class, .inputs = inputs, .outputs = outputs, }; +#endif /* CONFIG_SETRANGE_FILTER */ + +#if CONFIG_SETFIELD_FILTER +static const AVOption setfield_options[] = { + {"mode", "select interlace mode", OFFSET(field_mode), AV_OPT_TYPE_INT, {.i64=MODE_AUTO}, -1, MODE_PROG, FLAGS, "mode"}, + {"auto", "keep the same input field", 0, AV_OPT_TYPE_CONST, {.i64=MODE_AUTO}, INT_MIN, INT_MAX, FLAGS, "mode"}, + {"bff", "mark as bottom-field-first", 0, AV_OPT_TYPE_CONST, {.i64=MODE_BFF}, INT_MIN, INT_MAX, FLAGS, "mode"}, + {"tff", "mark as top-field-first", 0, AV_OPT_TYPE_CONST, {.i64=MODE_TFF}, INT_MIN, INT_MAX, FLAGS, "mode"}, + {"prog", "mark as progressive", 0, AV_OPT_TYPE_CONST, {.i64=MODE_PROG}, INT_MIN, INT_MAX, FLAGS, "mode"}, + {NULL} +}; + +AVFILTER_DEFINE_CLASS(setfield); + +static av_cold int init_setfield(AVFilterContext *ctx) +{ + SetParamsContext *s = ctx->priv; + + s->color_range = -1;/* set range mode to auto */ + return 0; +} + +AVFilter ff_vf_setfield = { + .name = "setfield", + .description = NULL_IF_CONFIG_SMALL("Force field for the output video frame."), + .priv_size = sizeof(SetParamsContext), + .init = init_setfield, + .priv_class = &setfield_class, + .inputs = inputs, + .outputs = outputs, +}; +#endif /* CONFIG_SETFIELD_FILTER */ -- cgit v1.2.3