1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
/* deinterlace.c
Copyright (c) 2003-2015 HandBrake Team
This file is part of the HandBrake source code
Homepage: <http://handbrake.fr/>.
It may be used under the terms of the GNU General Public License v2.
For full terms see the file COPYING file or visit http://www.gnu.org/licenses/gpl-2.0.html
*/
#include "common.h"
#include "decomb.h"
#include "avfilter_priv.h"
static int deinterlace_init(hb_filter_object_t * filter,
hb_filter_init_t * init);
const char deint_template[] =
"mode=^"HB_INT_REG"$:parity=^([01])$";
hb_filter_object_t hb_filter_deinterlace =
{
.id = HB_FILTER_DEINTERLACE,
.enforce_order = 1,
.skip = 1,
.name = "Deinterlace",
.settings = NULL,
.init = deinterlace_init,
.work = hb_avfilter_null_work,
.close = hb_avfilter_alias_close,
.settings_template = deint_template,
};
/* Deinterlace Settings
* mode:parity
*
* mode - yadif deinterlace mode
* parity - field parity
*
* Modes:
* 1 = Enabled
* 2 = Spatial
* 4 = Bob
* 8 = Selective
*
* Parity:
* 0 = Top Field First
* 1 = Bottom Field First
* -1 = Automatic detection of field parity
*
*/
static int deinterlace_init(hb_filter_object_t * filter,
hb_filter_init_t * init)
{
hb_filter_private_t * pv = NULL;
pv = calloc(1, sizeof(struct hb_filter_private_s));
filter->private_data = pv;
if (pv == NULL)
{
return 1;
}
pv->input = *init;
hb_dict_t * settings = filter->settings;
int mode = 3, parity = -1;
hb_dict_extract_int(&mode, settings, "mode");
hb_dict_extract_int(&parity, settings, "parity");
if (!(mode & MODE_YADIF_ENABLE))
{
return 0;
}
hb_dict_t * avfilter = hb_dict_init();
hb_dict_t * avsettings = hb_dict_init();
if (mode & MODE_YADIF_BOB)
{
if (mode & MODE_YADIF_SPATIAL)
{
hb_dict_set(avsettings, "mode", hb_value_string("send_field"));
}
else
{
hb_dict_set(avsettings, "mode",
hb_value_string("send_field_nospatial"));
}
}
else
{
if (mode & MODE_YADIF_SPATIAL)
{
hb_dict_set(avsettings, "mode", hb_value_string("send_frame"));
}
else
{
hb_dict_set(avsettings, "mode",
hb_value_string("send_frame_nospatial"));
}
}
if (mode & MODE_DECOMB_SELECTIVE)
{
hb_dict_set(avsettings, "deint", hb_value_string("interlaced"));
}
if (parity == 0)
{
hb_dict_set(avsettings, "parity", hb_value_string("tff"));
}
else if (parity == 1)
{
hb_dict_set(avsettings, "parity", hb_value_string("bff"));
}
hb_dict_set(avfilter, "yadif", avsettings);
pv->avfilters = avfilter;
pv->output = *init;
return 0;
}
|