diff options
author | Filippo Argiolas <filippo.argiolas@gmail.com> | 2010-08-09 10:03:20 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2010-08-09 19:25:54 +0200 |
commit | 2a9b456dab89e090dbd1e4c3b02984f3a67de663 (patch) | |
tree | 30a9277694aaffdc91a52ab84ec05e08fca59042 /gst/geometrictransform | |
parent | a72b2f5849c0f07a6e520b9eccd2b95d6269a790 (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.c | 125 | ||||
-rw-r--r-- | gst/geometrictransform/gstmirror.h | 19 |
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 |