From: Sebastian Dröge Date: Sun, 18 Apr 2010 19:11:21 +0000 (+0200) Subject: videobox: Translate navigation events to make sense again upstream X-Git-Tag: RELEASE-0.10.23~183 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4e836d32713c91b7f97e8747ca12cd63da036abd;p=platform%2Fupstream%2Fgst-plugins-good.git videobox: Translate navigation events to make sense again upstream --- diff --git a/gst/videobox/gstvideobox.c b/gst/videobox/gstvideobox.c index e9815ee..058be5a 100644 --- a/gst/videobox/gstvideobox.c +++ b/gst/videobox/gstvideobox.c @@ -1,6 +1,7 @@ /* GStreamer - * Copyright (C) <1999> Erik Walthinsen - * Copyright (C) <2010> Sebastian Dröge + * Copyright (C) 1999 Erik Walthinsen + * Copyright (C) 2006 Tim-Philipp Müller + * Copyright (C) 2010 Sebastian Dröge * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -1881,6 +1882,8 @@ static void gst_video_box_before_transform (GstBaseTransform * trans, GstBuffer * in); static void gst_video_box_fixate_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); +static gboolean gst_video_box_src_event (GstBaseTransform * trans, + GstEvent * event); #define GST_TYPE_VIDEO_BOX_FILL (gst_video_box_fill_get_type()) static GType @@ -1996,6 +1999,7 @@ gst_video_box_class_init (GstVideoBoxClass * klass) trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_box_set_caps); trans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_video_box_get_unit_size); trans_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_video_box_fixate_caps); + trans_class->src_event = GST_DEBUG_FUNCPTR (gst_video_box_src_event); } static void @@ -2276,7 +2280,6 @@ gst_video_box_transform_caps (GstBaseTransform * trans, dw += video_box->box_right; } - if (direction == GST_PAD_SINK) { dh -= video_box->box_top; dh -= video_box->box_bottom; @@ -2650,6 +2653,52 @@ gst_video_box_fixate_caps (GstBaseTransform * trans, gst_structure_fixate_field_nearest_int (s, "height", height); } +static gboolean +gst_video_box_src_event (GstBaseTransform * trans, GstEvent * event) +{ + GstVideoBox *video_box = GST_VIDEO_BOX (trans); + GstStructure *new_structure; + const GstStructure *structure; + const gchar *event_name; + gdouble pointer_x; + gdouble pointer_y; + + GST_OBJECT_LOCK (video_box); + if (GST_EVENT_TYPE (event) == GST_EVENT_NAVIGATION && + (video_box->box_left != 0 || video_box->box_top != 0)) { + structure = gst_event_get_structure (event); + event_name = gst_structure_get_string (structure, "event"); + + if (event_name && + (strcmp (event_name, "mouse-move") == 0 || + strcmp (event_name, "mouse-button-press") == 0 || + strcmp (event_name, "mouse-button-release") == 0)) { + if (gst_structure_get_double (structure, "pointer_x", &pointer_x) && + gst_structure_get_double (structure, "pointer_y", &pointer_y)) { + gdouble new_pointer_x, new_pointer_y; + GstEvent *new_event; + + new_pointer_x = pointer_x + video_box->box_left; + new_pointer_y = pointer_y + video_box->box_top; + + new_structure = gst_structure_copy (structure); + gst_structure_set (new_structure, + "pointer_x", G_TYPE_DOUBLE, (gdouble) (new_pointer_x), + "pointer_y", G_TYPE_DOUBLE, (gdouble) (new_pointer_y), NULL); + + new_event = gst_event_new_navigation (new_structure); + gst_event_unref (event); + event = new_event; + } else { + GST_WARNING_OBJECT (video_box, "Failed to read navigation event"); + } + } + } + GST_OBJECT_UNLOCK (video_box); + + return GST_BASE_TRANSFORM_CLASS (parent_class)->src_event (trans, event); +} + static void gst_video_box_process (GstVideoBox * video_box, const guint8 * src, guint8 * dest)