diff options
-rw-r--r-- | sys/xvimage/xvimagesink.c | 107 |
1 files changed, 51 insertions, 56 deletions
diff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c index 80b452bb9..bc9f6bf34 100644 --- a/sys/xvimage/xvimagesink.c +++ b/sys/xvimage/xvimagesink.c @@ -1112,75 +1112,70 @@ gst_xv_image_sink_navigation_send_event (GstNavigation * navigation, GstStructure * structure) { GstXvImageSink *xvimagesink = GST_XV_IMAGE_SINK (navigation); - GstPad *peer; gboolean handled = FALSE; GstEvent *event = NULL; - if ((peer = gst_pad_get_peer (GST_VIDEO_SINK_PAD (xvimagesink)))) { - GstVideoRectangle src = { 0, }; - GstVideoRectangle dst = { 0, }; - GstVideoRectangle result; - gdouble x, y, xscale = 1.0, yscale = 1.0; - GstXWindow *xwindow; - - /* We take the flow_lock while we look at the window */ - g_mutex_lock (&xvimagesink->flow_lock); - - if (!(xwindow = xvimagesink->xwindow)) { - g_mutex_unlock (&xvimagesink->flow_lock); - gst_object_unref (peer); - return; - } + GstVideoRectangle src = { 0, }; + GstVideoRectangle dst = { 0, }; + GstVideoRectangle result; + gdouble x, y, xscale = 1.0, yscale = 1.0; + GstXWindow *xwindow; - if (xvimagesink->keep_aspect) { - /* We get the frame position using the calculated geometry from _setcaps - that respect pixel aspect ratios */ - src.w = GST_VIDEO_SINK_WIDTH (xvimagesink); - src.h = GST_VIDEO_SINK_HEIGHT (xvimagesink); - dst.w = xwindow->render_rect.w; - dst.h = xwindow->render_rect.h; - - gst_video_sink_center_rect (src, dst, &result, TRUE); - result.x += xwindow->render_rect.x; - result.y += xwindow->render_rect.y; - } else { - memcpy (&result, &xwindow->render_rect, sizeof (GstVideoRectangle)); - } + /* We take the flow_lock while we look at the window */ + g_mutex_lock (&xvimagesink->flow_lock); + if (!(xwindow = xvimagesink->xwindow)) { g_mutex_unlock (&xvimagesink->flow_lock); + return; + } - /* We calculate scaling using the original video frames geometry to include - pixel aspect ratio scaling. */ - xscale = (gdouble) xvimagesink->video_width / result.w; - yscale = (gdouble) xvimagesink->video_height / result.h; - - /* Converting pointer coordinates to the non scaled geometry */ - if (gst_structure_get_double (structure, "pointer_x", &x)) { - x = MIN (x, result.x + result.w); - x = MAX (x - result.x, 0); - gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, - (gdouble) x * xscale, NULL); - } - if (gst_structure_get_double (structure, "pointer_y", &y)) { - y = MIN (y, result.y + result.h); - y = MAX (y - result.y, 0); - gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE, - (gdouble) y * yscale, NULL); - } + if (xvimagesink->keep_aspect) { + /* We get the frame position using the calculated geometry from _setcaps + that respect pixel aspect ratios */ + src.w = GST_VIDEO_SINK_WIDTH (xvimagesink); + src.h = GST_VIDEO_SINK_HEIGHT (xvimagesink); + dst.w = xwindow->render_rect.w; + dst.h = xwindow->render_rect.h; - event = gst_event_new_navigation (structure); - gst_event_ref (event); - handled = gst_pad_send_event (peer, event); - gst_object_unref (peer); + gst_video_sink_center_rect (src, dst, &result, TRUE); + result.x += xwindow->render_rect.x; + result.y += xwindow->render_rect.y; + } else { + memcpy (&result, &xwindow->render_rect, sizeof (GstVideoRectangle)); } - if (!handled && event) { - gst_element_post_message ((GstElement *) xvimagesink, - gst_navigation_message_new_event ((GstObject *) xvimagesink, event)); + g_mutex_unlock (&xvimagesink->flow_lock); + + /* We calculate scaling using the original video frames geometry to include + pixel aspect ratio scaling. */ + xscale = (gdouble) xvimagesink->video_width / result.w; + yscale = (gdouble) xvimagesink->video_height / result.h; + + /* Converting pointer coordinates to the non scaled geometry */ + if (gst_structure_get_double (structure, "pointer_x", &x)) { + x = MIN (x, result.x + result.w); + x = MAX (x - result.x, 0); + gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, + (gdouble) x * xscale, NULL); + } + if (gst_structure_get_double (structure, "pointer_y", &y)) { + y = MIN (y, result.y + result.h); + y = MAX (y - result.y, 0); + gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE, + (gdouble) y * yscale, NULL); } - if (event) + event = gst_event_new_navigation (structure); + if (event) { + gst_event_ref (event); + handled = gst_pad_push_event (GST_VIDEO_SINK_PAD (xvimagesink), event); + + if (!handled) + gst_element_post_message ((GstElement *) xvimagesink, + gst_navigation_message_new_event ((GstObject *) xvimagesink, event)); + gst_event_unref (event); + } } static void |