summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/directdraw/gstdirectdrawsink.c51
1 files changed, 26 insertions, 25 deletions
diff --git a/sys/directdraw/gstdirectdrawsink.c b/sys/directdraw/gstdirectdrawsink.c
index 36ad78ff0..c1a97b27d 100644
--- a/sys/directdraw/gstdirectdrawsink.c
+++ b/sys/directdraw/gstdirectdrawsink.c
@@ -193,47 +193,48 @@ gst_directdraw_sink_navigation_send_event (GstNavigation * navigation,
GstDirectDrawSink *ddrawsink = GST_DIRECTDRAW_SINK (navigation);
GstEvent *event;
GstVideoRectangle src, dst, result;
- double x, y, old_x, old_y;
+ gdouble x, y, old_x, old_y, xscale = 1.0, yscale=1.0;
GstPad *pad = NULL;
src.w = GST_VIDEO_SINK_WIDTH (ddrawsink);
src.h = GST_VIDEO_SINK_HEIGHT (ddrawsink);
dst.w = ddrawsink->out_width;
dst.h = ddrawsink->out_height;
- gst_video_sink_center_rect (src, dst, &result, FALSE);
event = gst_event_new_navigation (structure);
- /* Our coordinates can be wrong here if we centered the video */
+ if (ddrawsink->keep_aspect_ratio) {
+ gst_video_sink_center_rect (src, dst, &result, TRUE);
+ } else {
+ result.x = 0;
+ result.y = 0;
+ result.w = dst.w;
+ result.h = dst.h;
+ }
+
+ /* We calculate scaling using the original video frames geometry to include
+ pixel aspect ratio scaling. */
+ xscale = (gdouble) ddrawsink->video_width / result.w;
+ yscale = (gdouble) ddrawsink->video_height / result.h;
/* Converting pointer coordinates to the non scaled geometry */
if (gst_structure_get_double (structure, "pointer_x", &old_x)) {
x = old_x;
-
- if (x >= result.x && x <= (result.x + result.w)) {
- x -= result.x;
- x *= ddrawsink->video_width;
- x /= result.w;
- } else {
- x = 0;
- }
- GST_DEBUG_OBJECT (ddrawsink, "translated navigation event x "
- "coordinate from %f to %f", old_x, x);
- gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, x, NULL);
+ 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);
+ GST_DEBUG_OBJECT (ddrawsink,
+ "translated navigation event x coordinate from %f to %f", old_x, x);
}
if (gst_structure_get_double (structure, "pointer_y", &old_y)) {
y = old_y;
-
- if (y >= result.y && y <= (result.y + result.h)) {
- y -= result.y;
- y *= ddrawsink->video_height;
- y /= result.h;
- } else {
- y = 0;
- }
- GST_DEBUG_OBJECT (ddrawsink, "translated navigation event y "
- "coordinate from %f to %f", old_y, y);
- gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE, y, NULL);
+ 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);
+ GST_DEBUG_OBJECT (ddrawsink,
+ "translated navigation event x coordinate from %f to %f", old_y, y);
}
pad = gst_pad_get_peer (GST_VIDEO_SINK_PAD (ddrawsink));