summaryrefslogtreecommitdiffstats
path: root/libhb/deinterlace.c
diff options
context:
space:
mode:
Diffstat (limited to 'libhb/deinterlace.c')
-rw-r--r--libhb/deinterlace.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/libhb/deinterlace.c b/libhb/deinterlace.c
new file mode 100644
index 000000000..de91a8202
--- /dev/null
+++ b/libhb/deinterlace.c
@@ -0,0 +1,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;
+}