summaryrefslogtreecommitdiff
path: root/gst/geometrictransform
diff options
context:
space:
mode:
authorFilippo Argiolas <filippo.argiolas@gmail.com>2010-08-09 10:03:20 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2010-08-09 19:25:54 +0200
commit2a9b456dab89e090dbd1e4c3b02984f3a67de663 (patch)
tree30a9277694aaffdc91a52ab84ec05e08fca59042 /gst/geometrictransform
parenta72b2f5849c0f07a6e520b9eccd2b95d6269a790 (diff)
geometrictransform: add a "mode" property to mirror filter
Add a "mode" enum property to mirror that defines how to split the frame and with side reflect. https://bugzilla.gnome.org/show_bug.cgi?id=625908
Diffstat (limited to 'gst/geometrictransform')
-rw-r--r--gst/geometrictransform/gstmirror.c125
-rw-r--r--gst/geometrictransform/gstmirror.h19
2 files changed, 130 insertions, 14 deletions
diff --git a/gst/geometrictransform/gstmirror.c b/gst/geometrictransform/gstmirror.c
index d2cbc1848..43d102cc2 100644
--- a/gst/geometrictransform/gstmirror.c
+++ b/gst/geometrictransform/gstmirror.c
@@ -53,10 +53,75 @@
GST_DEBUG_CATEGORY_STATIC (gst_mirror_debug);
#define GST_CAT_DEFAULT gst_mirror_debug
+enum
+{
+ PROP_0,
+ PROP_MODE
+};
+
+#define DEFAULT_PROP_MODE GST_MIRROR_MODE_LEFT
+
GST_BOILERPLATE (GstMirror, gst_mirror, GstGeometricTransform,
GST_TYPE_GEOMETRIC_TRANSFORM);
-/* GObject vmethod implementations */
+#define GST_TYPE_MIRROR_MODE (gst_mirror_mode_get_type())
+static GType
+gst_mirror_mode_get_type (void)
+{
+ static GType mode_type = 0;
+
+ static const GEnumValue modes[] = {
+ {GST_MIRROR_MODE_LEFT, "Split horizontally and reflect left into right",
+ "left"},
+ {GST_MIRROR_MODE_RIGHT, "Split horizontally and reflect right into left",
+ "right"},
+ {GST_MIRROR_MODE_TOP, "Split vertically and reflect top into bottom",
+ "top"},
+ {GST_MIRROR_MODE_BOTTOM, "Split vertically and reflect bottom into top",
+ "bottom"},
+ {0, NULL, NULL},
+ };
+
+ if (!mode_type) {
+ mode_type = g_enum_register_static ("GstMirrorMode", modes);
+ }
+ return mode_type;
+}
+
+
+static void
+gst_mirror_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstMirror *filter = GST_MIRROR_CAST (object);
+
+ switch (prop_id) {
+ case PROP_MODE:
+ GST_OBJECT_LOCK (filter);
+ filter->mode = g_value_get_enum (value);
+ GST_OBJECT_UNLOCK (filter);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_mirror_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstMirror *filter = GST_MIRROR_CAST (object);
+
+ switch (prop_id) {
+ case PROP_MODE:
+ g_value_set_enum (value, filter->mode);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
static void
gst_mirror_base_init (gpointer gclass)
@@ -76,19 +141,41 @@ mirror_map (GstGeometricTransform * gt, gint x, gint y, gdouble * in_x,
{
GstMirror *mirror = GST_MIRROR_CAST (gt);
- gdouble hw = gt->width / 2.0;
-
- /* possible parameters:
- - split horizontal/vertical
- - reflect left half into right half or viceversa
- - reflect top half into bottom half or viceversa
- */
- if (x > hw)
- *in_x = gt->width - 1 - x;
- else
- *in_x = x;
-
- *in_y = y;
+ gdouble hw = gt->width / 2.0 - 1.0;
+ gdouble hh = gt->height / 2.0 - 1.0;
+
+ switch (mirror->mode) {
+ case GST_MIRROR_MODE_LEFT:
+ if (x > hw)
+ *in_x = gt->width - 1.0 - x;
+ else
+ *in_x = x;
+ *in_y = y;
+ break;
+ case GST_MIRROR_MODE_RIGHT:
+ if (x > hw)
+ *in_x = x;
+ else
+ *in_x = gt->width - 1.0 - x;
+ *in_y = y;
+ break;
+ case GST_MIRROR_MODE_TOP:
+ if (y > hh)
+ *in_y = gt->height - 1.0 - y;
+ else
+ *in_y = y;
+ *in_x = x;
+ break;
+ case GST_MIRROR_MODE_BOTTOM:
+ if (y > hh)
+ *in_y = y;
+ else
+ *in_y = gt->height - 1.0 - y;
+ *in_x = x;
+ break;
+ default:
+ g_assert_not_reached ();
+ }
GST_DEBUG_OBJECT (mirror, "Inversely mapped %d %d into %lf %lf",
x, y, *in_x, *in_y);
@@ -105,6 +192,15 @@ gst_mirror_class_init (GstMirrorClass * klass)
gobject_class = (GObjectClass *) klass;
gstgt_class = (GstGeometricTransformClass *) klass;
+ gobject_class->set_property = gst_mirror_set_property;
+ gobject_class->get_property = gst_mirror_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_MODE,
+ g_param_spec_enum ("mode", "Mirror Mode",
+ "How to split the video frame and which side reflect",
+ GST_TYPE_MIRROR_MODE, DEFAULT_PROP_MODE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
parent_class = g_type_class_peek_parent (klass);
gstgt_class->map_func = mirror_map;
@@ -115,6 +211,7 @@ gst_mirror_init (GstMirror * filter, GstMirrorClass * gclass)
{
GstGeometricTransform *gt = GST_GEOMETRIC_TRANSFORM (filter);
+ filter->mode = DEFAULT_PROP_MODE;
gt->off_edge_pixels = GST_GT_OFF_EDGES_PIXELS_CLAMP;
}
diff --git a/gst/geometrictransform/gstmirror.h b/gst/geometrictransform/gstmirror.h
index 8c9abab7c..0ae3ad10b 100644
--- a/gst/geometrictransform/gstmirror.h
+++ b/gst/geometrictransform/gstmirror.h
@@ -65,9 +65,28 @@ G_BEGIN_DECLS
typedef struct _GstMirror GstMirror;
typedef struct _GstMirrorClass GstMirrorClass;
+/**
+ * GstColorEffectsPreset:
+ * @GST_MIRROR_MODE_LEFT: Split horizontally and reflect left into right
+ * @GST_MIRROR_MODE_RIGHT: Split horizontally and reflect right into left
+ * @GST_MIRROR_MODE_TOP: Split horizontally and reflect top into bottom
+ * @GST_MIRROR_MODE_BOTTOM: Split horizontally and reflect bottom into top
+ *
+ * How to split the video frame and which side reflect
+ */
+typedef enum
+{
+ GST_MIRROR_MODE_LEFT,
+ GST_MIRROR_MODE_RIGHT,
+ GST_MIRROR_MODE_TOP,
+ GST_MIRROR_MODE_BOTTOM
+} GstMirrorMode;
+
struct _GstMirror
{
GstGeometricTransform element;
+
+ GstMirrorMode mode;
};
struct _GstMirrorClass