summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'media-libs/gst-plugins-good/files/gst-0.10.27-0003-v4l2sink-Add-flip-property.patch')
-rw-r--r--media-libs/gst-plugins-good/files/gst-0.10.27-0003-v4l2sink-Add-flip-property.patch187
1 files changed, 187 insertions, 0 deletions
diff --git a/media-libs/gst-plugins-good/files/gst-0.10.27-0003-v4l2sink-Add-flip-property.patch b/media-libs/gst-plugins-good/files/gst-0.10.27-0003-v4l2sink-Add-flip-property.patch
new file mode 100644
index 0000000..9bdfa51
--- /dev/null
+++ b/media-libs/gst-plugins-good/files/gst-0.10.27-0003-v4l2sink-Add-flip-property.patch
@@ -0,0 +1,187 @@
+From 1381c64fd606d8ab7169eef52386139a4848c439 Mon Sep 17 00:00:00 2001
+From: Kiran Nataraju <knataraju@ti.com>
+Date: Tue, 21 Sep 2010 06:21:23 +0200
+Subject: [PATCH 03/11] v4l2sink: Add flip property.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Kiran Nataraju <knataraju@ti.com>
+Signed-off-by: Daniel Díaz <yosoy@danieldiaz.org>
+---
+ sys/v4l2/gstv4l2sink.c | 88 +++++++++++++++++++++++++++++++++++++++++++++--
+ sys/v4l2/gstv4l2sink.h | 1 +
+ 2 files changed, 85 insertions(+), 4 deletions(-)
+
+diff --git a/sys/v4l2/gstv4l2sink.c b/sys/v4l2/gstv4l2sink.c
+index 5abf915..6163747 100644
+--- a/sys/v4l2/gstv4l2sink.c
++++ b/sys/v4l2/gstv4l2sink.c
+@@ -91,6 +91,7 @@ enum
+ PROP_CROP_WIDTH,
+ PROP_CROP_HEIGHT,
+ PROP_ROTATION,
++ PROP_FLIP,
+ };
+
+
+@@ -129,6 +130,34 @@ gst_v4l2sink_iface_supported (GstImplementsInterface * iface, GType iface_type)
+ return TRUE;
+ }
+
++/*
++ * Flip state
++ */
++enum
++{
++ FLIP_NONE = 0,
++ FLIP_HORIZONTAL = 1,
++ FLIP_VERTICAL = 2,
++};
++
++#define GST_TYPE_V4L2_FLIP (gst_v4l2_flip_get_type ())
++static GType
++gst_v4l2_flip_get_type (void)
++{
++ static GType type = 0;
++
++ if (!type) {
++ static GEnumValue vals[] = {
++ {FLIP_NONE, "No Flip", "none"},
++ {FLIP_HORIZONTAL, "Horizontal Flip", "horiz"},
++ {FLIP_VERTICAL, "Vertical Flip", "vert"},
++ {0, NULL, NULL},
++ };
++ type = g_enum_register_static ("GstV4l2SinkFlip", vals);
++ }
++ return type;
++}
++
+ static void
+ gst_v4l2sink_interface_init (GstImplementsInterfaceClass * klass)
+ {
+@@ -225,7 +254,7 @@ static GstFlowReturn gst_v4l2sink_buffer_alloc (GstBaseSink * bsink,
+ guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf);
+ static GstFlowReturn gst_v4l2sink_show_frame (GstBaseSink * bsink,
+ GstBuffer * buf);
+-static void gst_v4l2sink_set_rotation (GstV4l2Sink * v4l2sink);
++static void gst_v4l2sink_sync_rotation (GstV4l2Sink * v4l2sink);
+
+ static void
+ gst_v4l2sink_base_init (gpointer g_class)
+@@ -317,6 +346,11 @@ gst_v4l2sink_class_init (GstV4l2SinkClass * klass)
+ "Rotation angle for the image", MIN_ROTATION_ANGLE,
+ MAX_ROTATION_ANGLE, DEFAULT_ROTATION_ANGLE, G_PARAM_READWRITE));
+
++ g_object_class_install_property (gobject_class, PROP_FLIP,
++ g_param_spec_enum ("flip", "Flip State",
++ "Flip horizontal/vertical",
++ GST_TYPE_V4L2_FLIP, FLIP_NONE, G_PARAM_READWRITE));
++
+ basesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_v4l2sink_get_caps);
+ basesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_v4l2sink_set_caps);
+ basesink_class->buffer_alloc = GST_DEBUG_FUNCPTR (gst_v4l2sink_buffer_alloc);
+@@ -348,8 +382,46 @@ gst_v4l2sink_init (GstV4l2Sink * v4l2sink, GstV4l2SinkClass * klass)
+ v4l2sink->crop_fields_set = 0;
+ v4l2sink->state = 0;
+ v4l2sink->rotation = 0;
++ v4l2sink->flip = FLIP_NONE;
+ }
+
++static void
++gst_v4l2sink_sync_flip (GstV4l2Sink * v4l2sink)
++{
++ if (GST_V4L2_IS_OPEN (v4l2sink->v4l2object)) {
++ struct v4l2_control control;
++ gint fd = v4l2sink->v4l2object->video_fd;
++
++ memset (&control, 0x00, sizeof (struct v4l2_control));
++
++ switch (v4l2sink->flip) {
++ case FLIP_VERTICAL:
++ v4l2sink->rotation = 0;
++ control.value = 1;
++ break;
++ case FLIP_HORIZONTAL:
++ /* Horizontal Flip = Vertical Flip + 180 rotation */
++ v4l2sink->rotation = 180;
++ control.value = 1;
++ break;
++ case FLIP_NONE:
++ /* In the below switch case logic we need to handle FLIP_NONE
++ * case since the v4l2 driver holds on to the last configured
++ * flip value even after the device file is closed.
++ */
++ control.value = 0;
++ break;
++ default:
++ GST_WARNING_OBJECT (v4l2sink, "Invalid flip property");
++ control.value = 0;
++ break;
++ }
++
++ gst_v4l2sink_sync_rotation (v4l2sink);
++ control.id = V4L2_CID_VFLIP;
++ g_return_if_fail (v4l2_ioctl (fd, VIDIOC_S_CTRL, &control) >= 0);
++ }
++}
+
+ static void
+ gst_v4l2sink_dispose (GObject * object)
+@@ -488,7 +560,7 @@ gst_v4l2sink_sync_crop_fields (GstV4l2Sink * v4l2sink)
+ }
+
+ static void
+-gst_v4l2sink_set_rotation (GstV4l2Sink * v4l2sink)
++gst_v4l2sink_sync_rotation (GstV4l2Sink * v4l2sink)
+ {
+ if (GST_V4L2_IS_OPEN (v4l2sink->v4l2object)) {
+ struct v4l2_control control;
+@@ -559,7 +631,11 @@ gst_v4l2sink_set_property (GObject * object,
+ break;
+ case PROP_ROTATION:
+ v4l2sink->rotation = g_value_get_int (value);
+- gst_v4l2sink_set_rotation (v4l2sink);
++ gst_v4l2sink_sync_rotation (v4l2sink);
++ break;
++ case PROP_FLIP:
++ v4l2sink->flip = g_value_get_enum (value);
++ gst_v4l2sink_sync_flip (v4l2sink);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+@@ -611,6 +687,9 @@ gst_v4l2sink_get_property (GObject * object,
+ case PROP_ROTATION:
+ g_value_set_int (value, v4l2sink->rotation);
+ break;
++ case PROP_FLIP:
++ g_value_set_enum (value, v4l2sink->flip);
++ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+@@ -633,7 +712,8 @@ gst_v4l2sink_change_state (GstElement * element, GstStateChange transition)
+ /* open the device */
+ if (!gst_v4l2_object_start (v4l2sink->v4l2object))
+ return GST_STATE_CHANGE_FAILURE;
+- gst_v4l2sink_set_rotation (v4l2sink);
++ gst_v4l2sink_sync_rotation (v4l2sink);
++ gst_v4l2sink_sync_flip (v4l2sink);
+ break;
+ default:
+ break;
+diff --git a/sys/v4l2/gstv4l2sink.h b/sys/v4l2/gstv4l2sink.h
+index 1239621..907973a 100644
+--- a/sys/v4l2/gstv4l2sink.h
++++ b/sys/v4l2/gstv4l2sink.h
+@@ -76,6 +76,7 @@ struct _GstV4l2Sink {
+
+ guint8 state;
+ gint rotation;
++ gint flip;
+ };
+
+ struct _GstV4l2SinkClass {
+--
+1.7.1
+