[vlc-commits] video output: support rotated movies
Matthias Keiser
git at videolan.org
Thu Mar 13 21:15:45 CET 2014
vlc | branch: master | Matthias Keiser <matthias at tristan-inc.com> | Thu Mar 6 01:12:25 2014 +0100| [88660f191b735418ed6210ef3f9da45880c1c9c2] | committer: Rémi Denis-Courmont
video output: support rotated movies
Signed-off-by: Rémi Denis-Courmont <remi at remlab.net>
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=88660f191b735418ed6210ef3f9da45880c1c9c2
---
include/vlc_vout_display.h | 13 +++++++++
src/libvlccore.sym | 1 +
src/video_output/display.c | 67 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 81 insertions(+)
diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
index d99cf7e..f5f6817 100644
--- a/include/vlc_vout_display.h
+++ b/include/vlc_vout_display.h
@@ -436,5 +436,18 @@ typedef struct {
*/
VLC_API void vout_display_PlacePicture(vout_display_place_t *place, const video_format_t *source, const vout_display_cfg_t *cfg, bool do_clipping);
+
+/**
+ * Helper function that applies the necessary transforms to the mouse position
+ * and then calls vout_display_SendEventMouseMoved.
+ *
+ * \param vd vout_display_t.
+ * \param orient_display The orientation of the picture as seen on screen (probably ORIENT_NORMAL).
+ * \param m_x Mouse x position (relative to place, origin is top left).
+ * \param m_y Mouse y position (relative to place, origin is top left).
+ * \param place Place of the picture.
+ */
+VLC_API void vout_display_SendMouseMovedDisplayCoordinates(vout_display_t *vd, video_orientation_t orient_display, int m_x, int m_y,
+ vout_display_place_t *place);
#endif /* VLC_VOUT_DISPLAY_H */
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index af5e7bf..e583c21 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -636,6 +636,7 @@ vout_SetDisplayAspect
vout_SetDisplayCrop
vout_display_GetDefaultDisplaySize
vout_display_PlacePicture
+vout_display_SendMouseMovedDisplayCoordinates
xml_Create
text_style_Copy
text_style_Delete
diff --git a/src/video_output/display.c b/src/video_output/display.c
index 906bca0..af1cf61 100644
--- a/src/video_output/display.c
+++ b/src/video_output/display.c
@@ -197,6 +197,13 @@ void vout_display_GetDefaultDisplaySize(unsigned *width, unsigned *height,
*width = *width * cfg->zoom.num / cfg->zoom.den;
*height = *height * cfg->zoom.num / cfg->zoom.den;
+
+ if (ORIENT_IS_SWAP(source->orientation)) {
+
+ unsigned store = *width;
+ *width = *height;
+ *height = store;
+ }
}
/* */
@@ -214,6 +221,10 @@ void vout_display_PlacePicture(vout_display_place_t *place,
unsigned display_width;
unsigned display_height;
+ video_format_t source_rot;
+ video_format_ApplyRotation(source, &source_rot);
+ source = &source_rot;
+
if (cfg->is_display_filled) {
display_width = cfg->display.width;
display_height = cfg->display.height;
@@ -273,6 +284,62 @@ void vout_display_PlacePicture(vout_display_place_t *place,
}
}
+void vout_display_SendMouseMovedDisplayCoordinates(vout_display_t *vd, video_orientation_t orient_display, int m_x, int m_y, vout_display_place_t *place)
+{
+ video_format_t source_rot = vd->source;
+ video_format_TransformTo(&source_rot, orient_display);
+
+ if (place->width > 0 && place->height > 0) {
+
+ int x = (int)(source_rot.i_x_offset +
+ (int64_t)(m_x - place->x) * source_rot.i_visible_width / place->width);
+ int y = (int)(source_rot.i_y_offset +
+ (int64_t)(m_y - place->y) * source_rot.i_visible_height/ place->height);
+
+ video_transform_t transform = video_format_GetTransform(vd->source.orientation, orient_display);
+
+ int store;
+
+ switch (transform) {
+
+ case TRANSFORM_R90:
+ store = x;
+ x = y;
+ y = vd->source.i_visible_height - store;
+ break;
+ case TRANSFORM_R180:
+ x = vd->source.i_visible_width - x;
+ y = vd->source.i_visible_height - y;
+ break;
+ case TRANSFORM_R270:
+ store = x;
+ x = vd->source.i_visible_width - y;
+ y = store;
+ break;
+ case TRANSFORM_HFLIP:
+ x = vd->source.i_visible_width - x;
+ break;
+ case TRANSFORM_VFLIP:
+ y = vd->source.i_visible_height - y;
+ break;
+ case TRANSFORM_TRANSPOSE:
+ store = x;
+ x = y;
+ y = store;
+ break;
+ case TRANSFORM_ANTI_TRANSPOSE:
+ store = x;
+ x = vd->source.i_visible_width - y;
+ y = vd->source.i_visible_height - store;
+ break;
+ default:
+ break;
+ }
+
+ vout_display_SendEventMouseMoved (vd, x, y);
+ }
+}
+
struct vout_display_owner_sys_t {
vout_thread_t *vout;
bool is_wrapper; /* Is the current display a wrapper */
More information about the vlc-commits
mailing list