From c7095abd31a2828ef7832744bc2e221650c6502e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 11 Jun 2020 19:35:29 +0100 Subject: [PATCH] yadif: remove plugin, there's now deinterlace method=yadif Plugin code was still the GPL version, and the functionality has now been moved into the deinterlace element in gst-plugins-good as method=yadif (and LGPL). See https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/444 and https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/621 Closes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/216 Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/463 Part-of: --- docs/plugins/gst_plugins_cache.json | 86 --------- gst/meson.build | 2 +- gst/yadif/gstyadif.c | 350 ------------------------------------ gst/yadif/gstyadif.h | 67 ------- gst/yadif/meson.build | 24 --- gst/yadif/vf_yadif.c | 173 ------------------ gst/yadif/yadif.c | 116 ------------ gst/yadif/yadif_template.c | 262 --------------------------- meson_options.txt | 1 - 9 files changed, 1 insertion(+), 1080 deletions(-) delete mode 100644 gst/yadif/gstyadif.c delete mode 100644 gst/yadif/gstyadif.h delete mode 100644 gst/yadif/meson.build delete mode 100644 gst/yadif/vf_yadif.c delete mode 100644 gst/yadif/yadif.c delete mode 100644 gst/yadif/yadif_template.c diff --git a/docs/plugins/gst_plugins_cache.json b/docs/plugins/gst_plugins_cache.json index 27f522f..2e46363 100644 --- a/docs/plugins/gst_plugins_cache.json +++ b/docs/plugins/gst_plugins_cache.json @@ -232215,92 +232215,6 @@ "tracers": {}, "url": "Unknown package origin" }, - "yadif": { - "description": "YADIF deinterlacing filter", - "elements": { - "yadif": { - "author": "David Schleef ", - "description": "Deinterlace video using YADIF filter", - "hierarchy": [ - "GstYadif", - "GstBaseTransform", - "GstElement", - "GstObject", - "GInitiallyUnowned", - "GObject" - ], - "klass": "Video/Filter", - "long-name": "YADIF deinterlacer", - "pad-templates": { - "sink": { - "caps": "video/x-raw:\n format: { Y42B, I420, Y444 }\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n interlace-mode: { (string)interleaved, (string)mixed, (string)progressive }\n", - "direction": "sink", - "presence": "always" - }, - "src": { - "caps": "video/x-raw:\n format: { Y42B, I420, Y444 }\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n interlace-mode: progressive\n", - "direction": "src", - "presence": "always" - } - }, - "properties": { - "mode": { - "blurb": "Deinterlace mode", - "conditionally-available": false, - "construct": true, - "construct-only": false, - "controllable": false, - "default": "auto (0)", - "mutable": "null", - "readable": true, - "type": "GstYadifModes", - "writable": true - }, - "qos": { - "blurb": "Handle Quality-of-Service events", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "false", - "mutable": "null", - "readable": true, - "type": "gboolean", - "writable": true - } - }, - "rank": "none" - } - }, - "filename": "gstyadif", - "license": "GPL", - "other-types": { - "GstYadifModes": { - "kind": "enum", - "values": [ - { - "desc": "Auto detection", - "name": "auto", - "value": "0" - }, - { - "desc": "Force deinterlacing", - "name": "interlaced", - "value": "1" - }, - { - "desc": "Run in passthrough mode", - "name": "disabled", - "value": "2" - } - ] - } - }, - "package": "GStreamer Bad Plug-ins", - "source": "gst-plugins-bad", - "tracers": {}, - "url": "Unknown package origin" - }, "zbar": { "description": "zbar barcode scanner", "elements": { diff --git a/gst/meson.build b/gst/meson.build index 57d8fc1..50b583b 100644 --- a/gst/meson.build +++ b/gst/meson.build @@ -12,7 +12,7 @@ foreach plugin : ['accurip', 'adpcmdec', 'adpcmenc', 'aiff', 'asfmux', 'segmentclip', 'siren', 'smooth', 'speed', 'subenc', 'switchbin', 'timecode', 'transcode', 'videofilters', 'videoframe_audiolevel', 'videoparsers', 'videosignal', - 'vmnc', 'y4m', 'yadif'] + 'vmnc', 'y4m'] if not get_option(plugin).disabled() subdir(plugin) endif diff --git a/gst/yadif/gstyadif.c b/gst/yadif/gstyadif.c deleted file mode 100644 index c055b556..0000000 --- a/gst/yadif/gstyadif.c +++ /dev/null @@ -1,350 +0,0 @@ -/* GStreamer - * Copyright (C) 2013 David Schleef - * Copyright (C) 2013 Rdio, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Suite 500, - * Boston, MA 02110-1335, USA. - */ -/** - * SECTION:element-yadif - * @title: yadif - * - * The yadif element deinterlaces video, using the YADIF deinterlacing - * filter copied from Libav. This element only handles the simple case - * of interlace-mode=interleaved video instead of the more complex - * inverse telecine and deinterlace cases that are handled by the - * deinterlace element. - * - * ## Example launch line - * |[ - * gst-launch-1.0 -v videotestsrc pattern=ball ! interlace ! yadif ! xvimagesink - * ]| - * This pipeline creates an interlaced test pattern, and then deinterlaces - * it using the yadif filter. - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include "gstyadif.h" - -GST_DEBUG_CATEGORY_STATIC (gst_yadif_debug_category); -#define GST_CAT_DEFAULT gst_yadif_debug_category - -/* prototypes */ - - -static void gst_yadif_set_property (GObject * object, - guint property_id, const GValue * value, GParamSpec * pspec); -static void gst_yadif_get_property (GObject * object, - guint property_id, GValue * value, GParamSpec * pspec); -static void gst_yadif_dispose (GObject * object); -static void gst_yadif_finalize (GObject * object); - -static GstCaps *gst_yadif_transform_caps (GstBaseTransform * trans, - GstPadDirection direction, GstCaps * caps, GstCaps * filter); -static gboolean gst_yadif_set_caps (GstBaseTransform * trans, GstCaps * incaps, - GstCaps * outcaps); -static gboolean gst_yadif_get_unit_size (GstBaseTransform * trans, - GstCaps * caps, gsize * size); -static gboolean gst_yadif_start (GstBaseTransform * trans); -static gboolean gst_yadif_stop (GstBaseTransform * trans); -static GstFlowReturn gst_yadif_transform (GstBaseTransform * trans, - GstBuffer * inbuf, GstBuffer * outbuf); - -enum -{ - PROP_0, - PROP_MODE -}; - -#define DEFAULT_MODE GST_DEINTERLACE_MODE_AUTO - -/* pad templates */ - -static GstStaticPadTemplate gst_yadif_sink_template = -GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{Y42B,I420,Y444}") - ",interlace-mode=(string){interleaved,mixed,progressive}") - ); - -static GstStaticPadTemplate gst_yadif_src_template = -GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{Y42B,I420,Y444}") - ",interlace-mode=(string)progressive") - ); - -#define GST_TYPE_DEINTERLACE_MODES (gst_deinterlace_modes_get_type ()) -static GType -gst_deinterlace_modes_get_type (void) -{ - static GType deinterlace_modes_type = 0; - - static const GEnumValue modes_types[] = { - {GST_DEINTERLACE_MODE_AUTO, "Auto detection", "auto"}, - {GST_DEINTERLACE_MODE_INTERLACED, "Force deinterlacing", "interlaced"}, - {GST_DEINTERLACE_MODE_DISABLED, "Run in passthrough mode", "disabled"}, - {0, NULL, NULL}, - }; - - if (!deinterlace_modes_type) { - deinterlace_modes_type = - g_enum_register_static ("GstYadifModes", modes_types); - } - return deinterlace_modes_type; -} - - -/* class initialization */ - -G_DEFINE_TYPE_WITH_CODE (GstYadif, gst_yadif, GST_TYPE_BASE_TRANSFORM, - GST_DEBUG_CATEGORY_INIT (gst_yadif_debug_category, "yadif", 0, - "debug category for yadif element")); - -static void -gst_yadif_class_init (GstYadifClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GstBaseTransformClass *base_transform_class = - GST_BASE_TRANSFORM_CLASS (klass); - - /* Setting up pads and setting metadata should be moved to - base_class_init if you intend to subclass this class. */ - gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass), - &gst_yadif_sink_template); - gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass), - &gst_yadif_src_template); - - gst_element_class_set_static_metadata (GST_ELEMENT_CLASS (klass), - "YADIF deinterlacer", "Video/Filter", - "Deinterlace video using YADIF filter", "David Schleef "); - - gobject_class->set_property = gst_yadif_set_property; - gobject_class->get_property = gst_yadif_get_property; - gobject_class->dispose = gst_yadif_dispose; - gobject_class->finalize = gst_yadif_finalize; - base_transform_class->transform_caps = - GST_DEBUG_FUNCPTR (gst_yadif_transform_caps); - base_transform_class->set_caps = GST_DEBUG_FUNCPTR (gst_yadif_set_caps); - base_transform_class->get_unit_size = - GST_DEBUG_FUNCPTR (gst_yadif_get_unit_size); - base_transform_class->start = GST_DEBUG_FUNCPTR (gst_yadif_start); - base_transform_class->stop = GST_DEBUG_FUNCPTR (gst_yadif_stop); - base_transform_class->transform = GST_DEBUG_FUNCPTR (gst_yadif_transform); - - g_object_class_install_property (gobject_class, PROP_MODE, - g_param_spec_enum ("mode", "Deinterlace Mode", - "Deinterlace mode", - GST_TYPE_DEINTERLACE_MODES, - DEFAULT_MODE, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); - - gst_type_mark_as_plugin_api (GST_TYPE_DEINTERLACE_MODES, 0); -} - -static void -gst_yadif_init (GstYadif * yadif) -{ -} - -void -gst_yadif_set_property (GObject * object, guint property_id, - const GValue * value, GParamSpec * pspec) -{ - GstYadif *yadif = GST_YADIF (object); - - switch (property_id) { - case PROP_MODE: - yadif->mode = g_value_get_enum (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -void -gst_yadif_get_property (GObject * object, guint property_id, - GValue * value, GParamSpec * pspec) -{ - GstYadif *yadif = GST_YADIF (object); - - switch (property_id) { - case PROP_MODE: - g_value_set_enum (value, yadif->mode); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -void -gst_yadif_dispose (GObject * object) -{ - /* GstYadif *yadif = GST_YADIF (object); */ - - /* clean up as possible. may be called multiple times */ - - G_OBJECT_CLASS (gst_yadif_parent_class)->dispose (object); -} - -void -gst_yadif_finalize (GObject * object) -{ - /* GstYadif *yadif = GST_YADIF (object); */ - - /* clean up object here */ - - G_OBJECT_CLASS (gst_yadif_parent_class)->finalize (object); -} - - -static GstCaps * -gst_yadif_transform_caps (GstBaseTransform * trans, - GstPadDirection direction, GstCaps * caps, GstCaps * filter) -{ - GstCaps *othercaps; - - othercaps = gst_caps_copy (caps); - - if (direction == GST_PAD_SRC) { - GValue value = G_VALUE_INIT; - GValue v = G_VALUE_INIT; - - g_value_init (&value, GST_TYPE_LIST); - g_value_init (&v, G_TYPE_STRING); - - g_value_set_string (&v, "interleaved"); - gst_value_list_append_value (&value, &v); - g_value_set_string (&v, "mixed"); - gst_value_list_append_value (&value, &v); - g_value_set_string (&v, "progressive"); - gst_value_list_append_value (&value, &v); - - gst_caps_set_value (othercaps, "interlace-mode", &value); - g_value_unset (&value); - g_value_unset (&v); - } else { - gst_caps_set_simple (othercaps, "interlace-mode", G_TYPE_STRING, - "progressive", NULL); - } - - return othercaps; -} - -static gboolean -gst_yadif_set_caps (GstBaseTransform * trans, GstCaps * incaps, - GstCaps * outcaps) -{ - GstYadif *yadif = GST_YADIF (trans); - - gst_video_info_from_caps (&yadif->video_info, incaps); - - return TRUE; -} - -static gboolean -gst_yadif_get_unit_size (GstBaseTransform * trans, GstCaps * caps, gsize * size) -{ - GstVideoInfo info; - - if (gst_video_info_from_caps (&info, caps)) { - *size = GST_VIDEO_INFO_SIZE (&info); - - return TRUE; - } - return FALSE; -} - -static gboolean -gst_yadif_start (GstBaseTransform * trans) -{ - - return TRUE; -} - -static gboolean -gst_yadif_stop (GstBaseTransform * trans) -{ - - return TRUE; -} - -void yadif_filter (GstYadif * yadif, int parity, int tff); - -static GstFlowReturn -gst_yadif_transform (GstBaseTransform * trans, GstBuffer * inbuf, - GstBuffer * outbuf) -{ - GstYadif *yadif = GST_YADIF (trans); - int parity; - int tff; - - parity = 0; - tff = 0; - - if (!gst_video_frame_map (&yadif->dest_frame, &yadif->video_info, outbuf, - GST_MAP_WRITE)) - goto dest_map_failed; - - if (!gst_video_frame_map (&yadif->cur_frame, &yadif->video_info, inbuf, - GST_MAP_READ)) - goto src_map_failed; - - yadif->next_frame = yadif->cur_frame; - yadif->prev_frame = yadif->cur_frame; - - yadif_filter (yadif, parity, tff); - - gst_video_frame_unmap (&yadif->dest_frame); - gst_video_frame_unmap (&yadif->cur_frame); - return GST_FLOW_OK; - -dest_map_failed: - { - GST_ERROR_OBJECT (yadif, "failed to map dest"); - return GST_FLOW_ERROR; - } -src_map_failed: - { - GST_ERROR_OBJECT (yadif, "failed to map src"); - gst_video_frame_unmap (&yadif->dest_frame); - return GST_FLOW_ERROR; - } -} - - -static gboolean -plugin_init (GstPlugin * plugin) -{ - - return gst_element_register (plugin, "yadif", GST_RANK_NONE, GST_TYPE_YADIF); -} - -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - yadif, - "YADIF deinterlacing filter", - plugin_init, VERSION, "GPL", PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/yadif/gstyadif.h b/gst/yadif/gstyadif.h deleted file mode 100644 index 03a4d3d..0000000 --- a/gst/yadif/gstyadif.h +++ /dev/null @@ -1,67 +0,0 @@ -/* GStreamer - * Copyright (C) 2013 Rdio, Inc. - * Copyright (C) 2013 David Schleef - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef _GST_YADIF_H_ -#define _GST_YADIF_H_ - -#include -#include - -G_BEGIN_DECLS - -#define GST_TYPE_YADIF (gst_yadif_get_type()) -#define GST_YADIF(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_YADIF,GstYadif)) -#define GST_YADIF_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_YADIF,GstYadifClass)) -#define GST_IS_YADIF(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_YADIF)) -#define GST_IS_YADIF_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_YADIF)) - -typedef struct _GstYadif GstYadif; -typedef struct _GstYadifClass GstYadifClass; - -typedef enum { - GST_DEINTERLACE_MODE_AUTO, - GST_DEINTERLACE_MODE_INTERLACED, - GST_DEINTERLACE_MODE_DISABLED -} GstDeinterlaceMode; - -struct _GstYadif -{ - GstBaseTransform base_yadif; - - GstDeinterlaceMode mode; - - GstVideoInfo video_info; - - GstVideoFrame prev_frame; - GstVideoFrame cur_frame; - GstVideoFrame next_frame; - GstVideoFrame dest_frame; -}; - -struct _GstYadifClass -{ - GstBaseTransformClass base_yadif_class; -}; - -GType gst_yadif_get_type (void); - -G_END_DECLS - -#endif diff --git a/gst/yadif/meson.build b/gst/yadif/meson.build deleted file mode 100644 index b5955a9..0000000 --- a/gst/yadif/meson.build +++ /dev/null @@ -1,24 +0,0 @@ -yadif_sources = [ - 'gstyadif.c', - 'vf_yadif.c', - 'yadif.c' -] - -local_c_args = gst_plugins_bad_args - -# The plugin can build asm extensions -# on x86_64 -if host_machine.cpu() == 'x86_64' - local_c_args += ['-DHAVE_CPU_X86_64=1'] -endif - -gstyadif = library('gstyadif', - yadif_sources, - c_args : local_c_args, - include_directories : [configinc], - dependencies : [gstbase_dep, gstvideo_dep], - install : true, - install_dir : plugins_install_dir, -) -pkgconfig.generate(gstyadif, install_dir : plugins_pkgconfig_install_dir) -plugins += [gstyadif] diff --git a/gst/yadif/vf_yadif.c b/gst/yadif/vf_yadif.c deleted file mode 100644 index 0a7baee..0000000 --- a/gst/yadif/vf_yadif.c +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) 2013 David Schleef - * Copyright (C) 2013 Rdio, Inc. - * Copyright (C) 2006-2010 Michael Niedermayer - * 2010 James Darnley - * - * This file is part of Libav. - * - * Libav is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * Libav 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with Libav; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "config.h" - -#include -#include - -#undef NDEBUG -#include - -#define FFABS(a) ABS(a) -#define FFMIN(a,b) MIN(a,b) -#define FFMAX(a,b) MAX(a,b) -#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c) -#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c) - - -#define PERM_RWP AV_PERM_WRITE | AV_PERM_PRESERVE | AV_PERM_REUSE - -#define CHECK(j)\ - { int score = FFABS(cur[mrefs-1+(j)] - cur[prefs-1-(j)])\ - + FFABS(cur[mrefs +(j)] - cur[prefs -(j)])\ - + FFABS(cur[mrefs+1+(j)] - cur[prefs+1-(j)]);\ - if (score < spatial_score) {\ - spatial_score= score;\ - spatial_pred= (cur[mrefs +(j)] + cur[prefs -(j)])>>1;\ - -#define FILTER \ - for (x = 0; x < w; x++) { \ - int c = cur[mrefs]; \ - int d = (prev2[0] + next2[0])>>1; \ - int e = cur[prefs]; \ - int temporal_diff0 = FFABS(prev2[0] - next2[0]); \ - int temporal_diff1 =(FFABS(prev[mrefs] - c) + FFABS(prev[prefs] - e) )>>1; \ - int temporal_diff2 =(FFABS(next[mrefs] - c) + FFABS(next[prefs] - e) )>>1; \ - int diff = FFMAX3(temporal_diff0 >> 1, temporal_diff1, temporal_diff2); \ - int spatial_pred = (c+e) >> 1; \ - int spatial_score = -1; \ - \ - if (mrefs > 0 && prefs > 0) { \ - spatial_score = FFABS(cur[mrefs - 1] - cur[prefs - 1]) + FFABS(c-e) \ - + FFABS(cur[mrefs + 1] - cur[prefs + 1]) - 1; \ - \ - CHECK(-1) CHECK(-2) }} }} \ - CHECK( 1) CHECK( 2) }} }} \ - } \ - if (mode < 2) { \ - int b = (prev2[2 * mrefs] + next2[2 * mrefs])>>1; \ - int f = (prev2[2 * prefs] + next2[2 * prefs])>>1; \ - int max = FFMAX3(d - e, d - c, FFMIN(b - c, f - e)); \ - int min = FFMIN3(d - e, d - c, FFMAX(b - c, f - e)); \ - \ - diff = FFMAX3(diff, min, -max); \ - } \ - \ - if (spatial_pred > d + diff) \ - spatial_pred = d + diff; \ - else if (spatial_pred < d - diff) \ - spatial_pred = d - diff; \ - \ - dst[0] = spatial_pred; \ - \ - dst++; \ - cur++; \ - prev++; \ - next++; \ - prev2++; \ - next2++; \ - } - -static void -filter_line_c (guint8 * dst, - guint8 * prev, guint8 * cur, guint8 * next, - int w, int prefs, int mrefs, int parity, int mode) -{ - int x; - guint8 *prev2 = parity ? prev : cur; - guint8 *next2 = parity ? cur : next; - -FILTER} - -#if 0 -static void -filter_line_c_16bit (guint16 * dst, - guint16 * prev, guint16 * cur, guint16 * next, - int w, int prefs, int mrefs, int parity, int mode) -{ - int x; - guint16 *prev2 = parity ? prev : cur; - guint16 *next2 = parity ? cur : next; - mrefs /= 2; - prefs /= 2; - -FILTER} -#endif - -void yadif_filter (GstYadif * yadif, int parity, int tff); -#if HAVE_CPU_X86_64 && (defined(__GNUC__) || defined(__clang__)) -void filter_line_x86_64 (guint8 * dst, - guint8 * prev, guint8 * cur, guint8 * next, - int w, int prefs, int mrefs, int parity, int mode); -#endif - -void -yadif_filter (GstYadif * yadif, int parity, int tff) -{ - int y, i; - const GstVideoInfo *vi = &yadif->video_info; - const GstVideoFormatInfo *vfi = vi->finfo; - - for (i = 0; i < GST_VIDEO_FORMAT_INFO_N_COMPONENTS (vfi); i++) { - int w = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (vfi, i, vi->width); - int h = GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (vfi, i, vi->height); - int refs = GST_VIDEO_INFO_COMP_STRIDE (vi, i); - int df = GST_VIDEO_INFO_COMP_PSTRIDE (vi, i); - guint8 *prev_data = GST_VIDEO_FRAME_COMP_DATA (&yadif->prev_frame, i); - guint8 *cur_data = GST_VIDEO_FRAME_COMP_DATA (&yadif->cur_frame, i); - guint8 *next_data = GST_VIDEO_FRAME_COMP_DATA (&yadif->next_frame, i); - guint8 *dest_data = GST_VIDEO_FRAME_COMP_DATA (&yadif->dest_frame, i); - - for (y = 0; y < h; y++) { - if ((y ^ parity) & 1) { - guint8 *prev = prev_data + y * refs; - guint8 *cur = cur_data + y * refs; - guint8 *next = next_data + y * refs; - guint8 *dst = dest_data + y * refs; - int mode = ((y == 1) || (y + 2 == h)) ? 2 : yadif->mode; -#if HAVE_CPU_X86_64 && (defined(__GNUC__) || defined(__clang__)) - if (0) { - filter_line_c (dst, prev, cur, next, w, - y + 1 < h ? refs : -refs, y ? -refs : refs, parity ^ tff, mode); - } else { - filter_line_x86_64 (dst, prev, cur, next, w, - y + 1 < h ? refs : -refs, y ? -refs : refs, parity ^ tff, mode); - } -#else - filter_line_c (dst, prev, cur, next, w, - y + 1 < h ? refs : -refs, y ? -refs : refs, parity ^ tff, mode); -#endif - } else { - guint8 *dst = dest_data + y * refs; - guint8 *cur = cur_data + y * refs; - - memcpy (dst, cur, w * df); - } - } - } - -#if 0 - emms_c (); -#endif -} diff --git a/gst/yadif/yadif.c b/gst/yadif/yadif.c deleted file mode 100644 index 39cd3cf..0000000 --- a/gst/yadif/yadif.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2006 Michael Niedermayer - * - * This file is part of Libav. - * - * Libav is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * Libav 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with Libav; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "config.h" - -#include - -#if HAVE_CPU_X86_64 -/* The inline asm is not MSVC compatible */ -#if defined(__GNUC__) || defined(__clang__) - -typedef struct xmm_reg -{ - guint64 a, b; -} xmm_reg; -typedef gint64 x86_reg; - -#if defined(_MSC_VER) -#define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v -#define DECLARE_ASM_CONST(n,t,v) static const __declspec(align(n)) t v -#else -#define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v -#define DECLARE_ASM_CONST(n,t,v) static const t __attribute__((used)) __attribute__ ((aligned (n))) v -#endif - -#if defined(__APPLE__) -# define EXTERN_PREFIX "_" -#else -# define EXTERN_PREFIX "" -#endif - -#if defined(__PIC__) -# define LOCAL_MANGLE(a) #a "(%%rip)" -#else -# define LOCAL_MANGLE(a) #a -#endif - -#define MANGLE(a) EXTERN_PREFIX LOCAL_MANGLE(a) - -DECLARE_ASM_CONST (16, xmm_reg, pb_1) = { -0x0101010101010101ULL, 0x0101010101010101ULL}; - -DECLARE_ASM_CONST (16, xmm_reg, pw_1) = { -0x0001000100010001ULL, 0x0001000100010001ULL}; - - -#define HAVE_SSE2_INLINE 1 - -#if HAVE_SSSE3_INLINE -#define COMPILE_TEMPLATE_SSE2 1 -#define COMPILE_TEMPLATE_SSSE3 1 -#undef RENAME -#define RENAME(a) a ## _ssse3 -#include "yadif_template.c" -#undef COMPILE_TEMPLATE_SSSE3 -#endif - -#if HAVE_SSE2_INLINE -#undef RENAME -#define RENAME(a) a ## _sse2 -#include "yadif_template.c" -#undef COMPILE_TEMPLATE_SSE2 -#endif - -#if HAVE_MMXEXT_INLINE -#undef RENAME -#define RENAME(a) a ## _mmxext -#include "yadif_template.c" -#endif - - -void filter_line_x86_64 (guint8 * dst, - guint8 * prev, guint8 * cur, guint8 * next, - int w, int prefs, int mrefs, int parity, int mode); - -void -filter_line_x86_64 (guint8 * dst, - guint8 * prev, guint8 * cur, guint8 * next, - int w, int prefs, int mrefs, int parity, int mode) -{ -#if 0 -#if HAVE_MMXEXT_INLINE - if (cpu_flags & AV_CPU_FLAG_MMXEXT) - yadif->filter_line = yadif_filter_line_mmxext; -#endif -#if HAVE_SSE2_INLINE - if (cpu_flags & AV_CPU_FLAG_SSE2) - yadif->filter_line = yadif_filter_line_sse2; -#endif -#if HAVE_SSSE3_INLINE - if (cpu_flags & AV_CPU_FLAG_SSSE3) - yadif->filter_line = yadif_filter_line_ssse3; -#endif -#endif - yadif_filter_line_sse2 (dst, prev, cur, next, w, prefs, mrefs, parity, mode); -} - -#endif -#endif diff --git a/gst/yadif/yadif_template.c b/gst/yadif/yadif_template.c deleted file mode 100644 index ef3dffc..0000000 --- a/gst/yadif/yadif_template.c +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (C) 2006 Michael Niedermayer - * - * This file is part of Libav. - * - * Libav is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * Libav 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with Libav; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifdef COMPILE_TEMPLATE_SSE2 -#define MM "%%xmm" -#define MOV "movq" -#define MOVQ "movdqa" -#define MOVQU "movdqu" -#define STEP 8 -#define LOAD(mem,dst) \ - MOV" "mem", "dst" \n\t"\ - "punpcklbw "MM"7, "dst" \n\t" -#define PSRL1(reg) "psrldq $1, "reg" \n\t" -#define PSRL2(reg) "psrldq $2, "reg" \n\t" -#define PSHUF(src,dst) "movdqa "dst", "src" \n\t"\ - "psrldq $2, "src" \n\t" -#else -#define MM "%%mm" -#define MOV "movd" -#define MOVQ "movq" -#define MOVQU "movq" -#define STEP 4 -#define LOAD(mem,dst) \ - MOV" "mem", "dst" \n\t"\ - "punpcklbw "MM"7, "dst" \n\t" -#define PSRL1(reg) "psrlq $8, "reg" \n\t" -#define PSRL2(reg) "psrlq $16, "reg" \n\t" -#define PSHUF(src,dst) "pshufw $9, "dst", "src" \n\t" -#endif - -#ifdef COMPILE_TEMPLATE_SSSE3 -#define PABS(tmp,dst) \ - "pabsw "dst", "dst" \n\t" -#else -#define PABS(tmp,dst) \ - "pxor "tmp", "tmp" \n\t"\ - "psubw "dst", "tmp" \n\t"\ - "pmaxsw "tmp", "dst" \n\t" -#endif - -#define CHECK(pj,mj) \ - MOVQU" "#pj"(%[cur],%[mrefs]), "MM"2 \n\t" /* cur[x-refs-1+j] */\ - MOVQU" "#mj"(%[cur],%[prefs]), "MM"3 \n\t" /* cur[x+refs-1-j] */\ - MOVQ" "MM"2, "MM"4 \n\t"\ - MOVQ" "MM"2, "MM"5 \n\t"\ - "pxor "MM"3, "MM"4 \n\t"\ - "pavgb "MM"3, "MM"5 \n\t"\ - "pand "MANGLE(pb_1)", "MM"4 \n\t"\ - "psubusb "MM"4, "MM"5 \n\t"\ - PSRL1(MM"5") \ - "punpcklbw "MM"7, "MM"5 \n\t" /* (cur[x-refs+j] + cur[x+refs-j])>>1 */\ - MOVQ" "MM"2, "MM"4 \n\t"\ - "psubusb "MM"3, "MM"2 \n\t"\ - "psubusb "MM"4, "MM"3 \n\t"\ - "pmaxub "MM"3, "MM"2 \n\t"\ - MOVQ" "MM"2, "MM"3 \n\t"\ - MOVQ" "MM"2, "MM"4 \n\t" /* ABS(cur[x-refs-1+j] - cur[x+refs-1-j]) */\ - PSRL1(MM"3") /* ABS(cur[x-refs +j] - cur[x+refs -j]) */\ - PSRL2(MM"4") /* ABS(cur[x-refs+1+j] - cur[x+refs+1-j]) */\ - "punpcklbw "MM"7, "MM"2 \n\t"\ - "punpcklbw "MM"7, "MM"3 \n\t"\ - "punpcklbw "MM"7, "MM"4 \n\t"\ - "paddw "MM"3, "MM"2 \n\t"\ - "paddw "MM"4, "MM"2 \n\t" /* score */ - -#define CHECK1 \ - MOVQ" "MM"0, "MM"3 \n\t"\ - "pcmpgtw "MM"2, "MM"3 \n\t" /* if(score < spatial_score) */\ - "pminsw "MM"2, "MM"0 \n\t" /* spatial_score= score; */\ - MOVQ" "MM"3, "MM"6 \n\t"\ - "pand "MM"3, "MM"5 \n\t"\ - "pandn "MM"1, "MM"3 \n\t"\ - "por "MM"5, "MM"3 \n\t"\ - MOVQ" "MM"3, "MM"1 \n\t" /* spatial_pred= (cur[x-refs+j] + cur[x+refs-j])>>1; */ - -#define CHECK2 /* pretend not to have checked dir=2 if dir=1 was bad.\ - hurts both quality and speed, but matches the C version. */\ - "paddw "MANGLE(pw_1)", "MM"6 \n\t"\ - "psllw $14, "MM"6 \n\t"\ - "paddsw "MM"6, "MM"2 \n\t"\ - MOVQ" "MM"0, "MM"3 \n\t"\ - "pcmpgtw "MM"2, "MM"3 \n\t"\ - "pminsw "MM"2, "MM"0 \n\t"\ - "pand "MM"3, "MM"5 \n\t"\ - "pandn "MM"1, "MM"3 \n\t"\ - "por "MM"5, "MM"3 \n\t"\ - MOVQ" "MM"3, "MM"1 \n\t" - -static void RENAME (yadif_filter_line) (guint8 * dst, guint8 * prev, - guint8 * cur, guint8 * next, int w, int prefs, int mrefs, int parity, - int mode) -{ - DECLARE_ALIGNED (16, guint8, tmp)[16 * 4]; - int x; - -#define FILTER\ - for(x=0; x>1 */\ - MOVQ" "MM"0, (%[tmp]) \n\t" /* c */\ - MOVQ" "MM"3, 16(%[tmp]) \n\t" /* d */\ - MOVQ" "MM"1, 32(%[tmp]) \n\t" /* e */\ - "psubw "MM"4, "MM"2 \n\t"\ - PABS( MM"4", MM"2") /* temporal_diff0 */\ - LOAD("(%[prev],%[mrefs])", MM"3") /* prev[x-refs] */\ - LOAD("(%[prev],%[prefs])", MM"4") /* prev[x+refs] */\ - "psubw "MM"0, "MM"3 \n\t"\ - "psubw "MM"1, "MM"4 \n\t"\ - PABS( MM"5", MM"3")\ - PABS( MM"5", MM"4")\ - "paddw "MM"4, "MM"3 \n\t" /* temporal_diff1 */\ - "psrlw $1, "MM"2 \n\t"\ - "psrlw $1, "MM"3 \n\t"\ - "pmaxsw "MM"3, "MM"2 \n\t"\ - LOAD("(%[next],%[mrefs])", MM"3") /* next[x-refs] */\ - LOAD("(%[next],%[prefs])", MM"4") /* next[x+refs] */\ - "psubw "MM"0, "MM"3 \n\t"\ - "psubw "MM"1, "MM"4 \n\t"\ - PABS( MM"5", MM"3")\ - PABS( MM"5", MM"4")\ - "paddw "MM"4, "MM"3 \n\t" /* temporal_diff2 */\ - "psrlw $1, "MM"3 \n\t"\ - "pmaxsw "MM"3, "MM"2 \n\t"\ - MOVQ" "MM"2, 48(%[tmp]) \n\t" /* diff */\ -\ - "paddw "MM"0, "MM"1 \n\t"\ - "paddw "MM"0, "MM"0 \n\t"\ - "psubw "MM"1, "MM"0 \n\t"\ - "psrlw $1, "MM"1 \n\t" /* spatial_pred */\ - PABS( MM"2", MM"0") /* ABS(c-e) */\ -\ - MOVQU" -1(%[cur],%[mrefs]), "MM"2 \n\t" /* cur[x-refs-1] */\ - MOVQU" -1(%[cur],%[prefs]), "MM"3 \n\t" /* cur[x+refs-1] */\ - MOVQ" "MM"2, "MM"4 \n\t"\ - "psubusb "MM"3, "MM"2 \n\t"\ - "psubusb "MM"4, "MM"3 \n\t"\ - "pmaxub "MM"3, "MM"2 \n\t"\ - PSHUF(MM"3", MM"2") \ - "punpcklbw "MM"7, "MM"2 \n\t" /* ABS(cur[x-refs-1] - cur[x+refs-1]) */\ - "punpcklbw "MM"7, "MM"3 \n\t" /* ABS(cur[x-refs+1] - cur[x+refs+1]) */\ - "paddw "MM"2, "MM"0 \n\t"\ - "paddw "MM"3, "MM"0 \n\t"\ - "psubw "MANGLE(pw_1)", "MM"0 \n\t" /* spatial_score */\ -\ - CHECK(-2,0)\ - CHECK1\ - CHECK(-3,1)\ - CHECK2\ - CHECK(0,-2)\ - CHECK1\ - CHECK(1,-3)\ - CHECK2\ -\ - /* if(p->mode<2) ... */\ - MOVQ" 48(%[tmp]), "MM"6 \n\t" /* diff */\ - "cmpl $2, %[mode] \n\t"\ - "jge 1f \n\t"\ - LOAD("(%["prev2"],%[mrefs],2)", MM"2") /* prev2[x-2*refs] */\ - LOAD("(%["next2"],%[mrefs],2)", MM"4") /* next2[x-2*refs] */\ - LOAD("(%["prev2"],%[prefs],2)", MM"3") /* prev2[x+2*refs] */\ - LOAD("(%["next2"],%[prefs],2)", MM"5") /* next2[x+2*refs] */\ - "paddw "MM"4, "MM"2 \n\t"\ - "paddw "MM"5, "MM"3 \n\t"\ - "psrlw $1, "MM"2 \n\t" /* b */\ - "psrlw $1, "MM"3 \n\t" /* f */\ - MOVQ" (%[tmp]), "MM"4 \n\t" /* c */\ - MOVQ" 16(%[tmp]), "MM"5 \n\t" /* d */\ - MOVQ" 32(%[tmp]), "MM"7 \n\t" /* e */\ - "psubw "MM"4, "MM"2 \n\t" /* b-c */\ - "psubw "MM"7, "MM"3 \n\t" /* f-e */\ - MOVQ" "MM"5, "MM"0 \n\t"\ - "psubw "MM"4, "MM"5 \n\t" /* d-c */\ - "psubw "MM"7, "MM"0 \n\t" /* d-e */\ - MOVQ" "MM"2, "MM"4 \n\t"\ - "pminsw "MM"3, "MM"2 \n\t"\ - "pmaxsw "MM"4, "MM"3 \n\t"\ - "pmaxsw "MM"5, "MM"2 \n\t"\ - "pminsw "MM"5, "MM"3 \n\t"\ - "pmaxsw "MM"0, "MM"2 \n\t" /* max */\ - "pminsw "MM"0, "MM"3 \n\t" /* min */\ - "pxor "MM"4, "MM"4 \n\t"\ - "pmaxsw "MM"3, "MM"6 \n\t"\ - "psubw "MM"2, "MM"4 \n\t" /* -max */\ - "pmaxsw "MM"4, "MM"6 \n\t" /* diff= MAX3(diff, min, -max); */\ - "1: \n\t"\ -\ - MOVQ" 16(%[tmp]), "MM"2 \n\t" /* d */\ - MOVQ" "MM"2, "MM"3 \n\t"\ - "psubw "MM"6, "MM"2 \n\t" /* d-diff */\ - "paddw "MM"6, "MM"3 \n\t" /* d+diff */\ - "pmaxsw "MM"2, "MM"1 \n\t"\ - "pminsw "MM"3, "MM"1 \n\t" /* d = clip(spatial_pred, d-diff, d+diff); */\ - "packuswb "MM"1, "MM"1 \n\t"\ -\ - ::[prev] "r"(prev),\ - [cur] "r"(cur),\ - [next] "r"(next),\ - [prefs]"r"((x86_reg)prefs),\ - [mrefs]"r"((x86_reg)mrefs),\ - [mode] "g"(mode),\ - [tmp] "r"(tmp)\ - );\ - __asm__ volatile(MOV" "MM"1, %0" :"=m"(*dst));\ - dst += STEP;\ - prev+= STEP;\ - cur += STEP;\ - next+= STEP;\ - } - - if (parity) { -#define prev2 "prev" -#define next2 "cur" - FILTER -#undef prev2 -#undef next2 - } else { -#define prev2 "cur" -#define next2 "next" - FILTER -#undef prev2 -#undef next2 - } -} - -#undef STEP -#undef MM -#undef MOV -#undef MOVQ -#undef MOVQU -#undef PSHUF -#undef PSRL1 -#undef PSRL2 -#undef LOAD -#undef PABS -#undef CHECK -#undef CHECK1 -#undef CHECK2 -#undef FILTER diff --git a/meson_options.txt b/meson_options.txt index ccd7933..c42799a 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -65,7 +65,6 @@ option('videoparsers', type : 'feature', value : 'auto') option('videosignal', type : 'feature', value : 'auto') option('vmnc', type : 'feature', value : 'auto') option('y4m', type : 'feature', value : 'auto') -option('yadif', type : 'feature', value : 'auto') # Feature options for libraries that need external deps option('opencv', type : 'feature', value : 'auto', description : 'OpenCV computer vision library support') -- 2.7.4