2 * Copyright (c) 2012 Stefano Sabatini
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 #include "libavutil/opt.h"
40 enum SetFieldMode mode
;
43 #define OFFSET(x) offsetof(SetFieldContext, x)
44 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
46 static const AVOption setfield_options
[] = {
47 {"mode", "select interlace mode", OFFSET(mode
), AV_OPT_TYPE_INT
, {.i64
=MODE_AUTO
}, -1, MODE_PROG
, FLAGS
, "mode"},
48 {"auto", "keep the same input field", 0, AV_OPT_TYPE_CONST
, {.i64
=MODE_AUTO
}, INT_MIN
, INT_MAX
, FLAGS
, "mode"},
49 {"bff", "mark as bottom-field-first", 0, AV_OPT_TYPE_CONST
, {.i64
=MODE_BFF
}, INT_MIN
, INT_MAX
, FLAGS
, "mode"},
50 {"tff", "mark as top-field-first", 0, AV_OPT_TYPE_CONST
, {.i64
=MODE_TFF
}, INT_MIN
, INT_MAX
, FLAGS
, "mode"},
51 {"prog", "mark as progressive", 0, AV_OPT_TYPE_CONST
, {.i64
=MODE_PROG
}, INT_MIN
, INT_MAX
, FLAGS
, "mode"},
55 AVFILTER_DEFINE_CLASS(setfield
);
57 static int filter_frame(AVFilterLink
*inlink
, AVFrame
*picref
)
59 SetFieldContext
*setfield
= inlink
->dst
->priv
;
61 if (setfield
->mode
== MODE_PROG
) {
62 picref
->interlaced_frame
= 0;
63 } else if (setfield
->mode
!= MODE_AUTO
) {
64 picref
->interlaced_frame
= 1;
65 picref
->top_field_first
= setfield
->mode
;
67 return ff_filter_frame(inlink
->dst
->outputs
[0], picref
);
70 static const AVFilterPad setfield_inputs
[] = {
73 .type
= AVMEDIA_TYPE_VIDEO
,
74 .filter_frame
= filter_frame
,
79 static const AVFilterPad setfield_outputs
[] = {
82 .type
= AVMEDIA_TYPE_VIDEO
,
87 AVFilter ff_vf_setfield
= {
89 .description
= NULL_IF_CONFIG_SMALL("Force field for the output video frame."),
90 .priv_size
= sizeof(SetFieldContext
),
91 .priv_class
= &setfield_class
,
92 .inputs
= setfield_inputs
,
93 .outputs
= setfield_outputs
,