From b38f107bd3a83a2e6922decdb1f5f1f65abab5f8 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Wed, 12 Aug 2015 00:20:10 +0200 Subject: glimagesink: take into account non 1/1 par for navigation The current code was ignoring the par/dar aspect when transforming from window coordinates to stream coordinates resulting in incorrect coordinates being sent upstream in the navigation events. --- ext/gl/gstglimagesink.c | 57 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 12 deletions(-) (limited to 'ext/gl') diff --git a/ext/gl/gstglimagesink.c b/ext/gl/gstglimagesink.c index 0528ed5c4..5f0e3ade7 100644 --- a/ext/gl/gstglimagesink.c +++ b/ext/gl/gstglimagesink.c @@ -359,6 +359,43 @@ enum static guint gst_glimage_sink_signals[LAST_SIGNAL] = { 0 }; +static void +_display_size_to_stream_size (GstGLImageSink * gl_sink, gdouble x, + gdouble y, gdouble * stream_x, gdouble * stream_y) +{ + gdouble stream_width, stream_height; + + stream_width = (gdouble) GST_VIDEO_INFO_WIDTH (&gl_sink->out_info); + stream_height = (gdouble) GST_VIDEO_INFO_HEIGHT (&gl_sink->out_info); + + /* from display coordinates to stream coordinates */ + if (gl_sink->display_rect.w > 0) + *stream_x = + (x - gl_sink->display_rect.x) / gl_sink->display_rect.w * stream_width; + else + *stream_x = 0.; + + /* clip to stream size */ + if (*stream_x < 0.) + *stream_x = 0.; + if (*stream_x > GST_VIDEO_INFO_WIDTH (&gl_sink->out_info)) + *stream_x = GST_VIDEO_INFO_WIDTH (&gl_sink->out_info); + + /* same for y-axis */ + if (gl_sink->display_rect.h > 0) + *stream_y = + (y - gl_sink->display_rect.y) / gl_sink->display_rect.h * stream_height; + else + *stream_y = 0.; + + if (*stream_y < 0.) + *stream_y = 0.; + if (*stream_y > GST_VIDEO_INFO_HEIGHT (&gl_sink->out_info)) + *stream_y = GST_VIDEO_INFO_HEIGHT (&gl_sink->out_info); + + GST_TRACE ("transform %fx%f into %fx%f", x, y, *stream_x, *stream_y); +} + static void gst_glimage_sink_navigation_send_event (GstNavigation * navigation, GstStructure * structure) @@ -368,7 +405,7 @@ gst_glimage_sink_navigation_send_event (GstNavigation * navigation, GstStructure GstPad *pad = NULL; GstGLWindow *window; guint width, height; - gdouble x, y, xscale, yscale; + gdouble x, y; if (!sink->context) return; @@ -384,19 +421,15 @@ gst_glimage_sink_navigation_send_event (GstNavigation * navigation, GstStructure pad = gst_pad_get_peer (GST_VIDEO_SINK_PAD (sink)); /* Converting pointer coordinates to the non scaled geometry */ - if (width != GST_VIDEO_SINK_WIDTH (sink) && - width != 0 && gst_structure_get_double (structure, "pointer_x", &x)) { - xscale = (gdouble) GST_VIDEO_SINK_WIDTH (sink) / width; + if (width != 0 && gst_structure_get_double (structure, "pointer_x", &x) + && height != 0 && gst_structure_get_double (structure, "pointer_y", &y)) { + gdouble stream_x, stream_y; + + _display_size_to_stream_size (sink, x, y, &stream_x, &stream_y); + gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, - (gdouble) x * xscale, NULL); + stream_x, "pointer_y", G_TYPE_DOUBLE, stream_y, NULL); } - if (height != GST_VIDEO_SINK_HEIGHT (sink) && - height != 0 && gst_structure_get_double (structure, "pointer_y", &y)) { - yscale = (gdouble) GST_VIDEO_SINK_HEIGHT (sink) / height; - gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE, - (gdouble) y * yscale, NULL); - } - if (GST_IS_PAD (pad) && GST_IS_EVENT (event)) gst_pad_send_event (pad, event); -- cgit v1.2.1