| 1 | /* | 
| 2 |  * GStreamer | 
| 3 |  * Copyright (C) 2008 Julien Isorce <julien.isorce@gmail.com> | 
| 4 |  * Copyright (C) 2012 Matthew Waters <ystreet00@gmail.com> | 
| 5 |  * | 
| 6 |  * This library is free software; you can redistribute it and/or | 
| 7 |  * modify it under the terms of the GNU Library General Public | 
| 8 |  * License as published by the Free Software Foundation; either | 
| 9 |  * version 2 of the License, or (at your option) any later version. | 
| 10 |  * | 
| 11 |  * This library is distributed in the hope that it will be useful, | 
| 12 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 13 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
| 14 |  * Library General Public License for more details. | 
| 15 |  * | 
| 16 |  * You should have received a copy of the GNU Library General Public | 
| 17 |  * License along with this library; if not, write to the | 
| 18 |  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, | 
| 19 |  * Boston, MA 02110-1301, USA. | 
| 20 |  */ | 
| 21 |  | 
| 22 | #ifndef __GST_GL_WINDOW_H__ | 
| 23 | #define __GST_GL_WINDOW_H__ | 
| 24 |  | 
| 25 | #include <gst/gst.h> | 
| 26 |  | 
| 27 | #include <gst/gl/gstgl_fwd.h> | 
| 28 | #include <gst/gl/gstglcontext.h> | 
| 29 | #include <gst/gl/gstgldisplay.h> | 
| 30 |  | 
| 31 | G_BEGIN_DECLS | 
| 32 |  | 
| 33 | GST_GL_API | 
| 34 | GType gst_gl_window_get_type       (void); | 
| 35 | #define GST_TYPE_GL_WINDOW         (gst_gl_window_get_type()) | 
| 36 |  | 
| 37 | #define GST_GL_WINDOW(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_TYPE_GL_WINDOW, GstGLWindow)) | 
| 38 | #define GST_GL_WINDOW_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), GST_TYPE_GL_WINDOW, GstGLWindowClass)) | 
| 39 | #define GST_IS_GL_WINDOW(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_TYPE_GL_WINDOW)) | 
| 40 | #define GST_IS_GL_WINDOW_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_TYPE_GL_WINDOW)) | 
| 41 | #define GST_GL_WINDOW_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_TYPE_GL_WINDOW, GstGLWindowClass)) | 
| 42 |  | 
| 43 | #define GST_GL_WINDOW_LOCK(w) g_mutex_lock(&GST_GL_WINDOW(w)->lock) | 
| 44 | #define GST_GL_WINDOW_UNLOCK(w) g_mutex_unlock(&GST_GL_WINDOW(w)->lock) | 
| 45 | #define GST_GL_WINDOW_GET_LOCK(w) (&GST_GL_WINDOW(w)->lock) | 
| 46 |  | 
| 47 | GST_GL_API | 
| 48 | GQuark gst_gl_window_error_quark (void); | 
| 49 | /** | 
| 50 |  * GST_GL_WINDOW_ERROR: | 
| 51 |  * | 
| 52 |  * Error domain for GStreamer's GL window module. Errors in this domain will be | 
| 53 |  * from the #GstGLWindowError enumeration | 
| 54 |  */ | 
| 55 | #define GST_GL_WINDOW_ERROR (gst_gl_window_error_quark ()) | 
| 56 |  | 
| 57 | /** | 
| 58 |  * GstGLWindowError: | 
| 59 |  * @GST_GL_WINDOW_ERROR_FAILED: failed for a unspecified reason | 
| 60 |  * @GST_GL_WINDOW_ERROR_OLD_LIBS: the implementation is too old | 
| 61 |  * @GST_GL_WINDOW_ERROR_RESOURCE_UNAVAILABLE: no such resource was found | 
| 62 |  */ | 
| 63 | typedef enum | 
| 64 | { | 
| 65 |   GST_GL_WINDOW_ERROR_FAILED, | 
| 66 |   GST_GL_WINDOW_ERROR_OLD_LIBS, | 
| 67 |   GST_GL_WINDOW_ERROR_RESOURCE_UNAVAILABLE, | 
| 68 | } GstGLWindowError; | 
| 69 |  | 
| 70 | typedef void (*GstGLWindowCB) (gpointer data); | 
| 71 | typedef void (*GstGLWindowResizeCB) (gpointer data, guint width, guint height); | 
| 72 |  | 
| 73 | /** | 
| 74 |  * GST_GL_WINDOW_CB: | 
| 75 |  * @f: the function to cast | 
| 76 |  * | 
| 77 |  * Cast to the current function type for generic window callbacks | 
| 78 |  */ | 
| 79 | #define	GST_GL_WINDOW_CB(f)			 ((GstGLWindowCB) (f)) | 
| 80 |  | 
| 81 | /** | 
| 82 |  * GST_GL_WINDOW_RESIZE_CB: | 
| 83 |  * @f: the function to cast | 
| 84 |  * | 
| 85 |  * Cast to the current function type for window resize callbacks | 
| 86 |  */ | 
| 87 | #define	GST_GL_WINDOW_RESIZE_CB(f)		 ((GstGLWindowResizeCB) (f)) | 
| 88 |  | 
| 89 | /** | 
| 90 |  * GstGLWindow: | 
| 91 |  * | 
| 92 |  * #GstGLWindow is an opaque struct and should only be accessed through the | 
| 93 |  * provided api. | 
| 94 |  */ | 
| 95 | struct _GstGLWindow { | 
| 96 |   /*< private >*/ | 
| 97 |   GstObject parent; | 
| 98 |  | 
| 99 |   GMutex        lock; | 
| 100 |  | 
| 101 |   GstGLDisplay *display; | 
| 102 |   GWeakRef      context_ref; | 
| 103 |  | 
| 104 |   /*< protected >*/ | 
| 105 |   gboolean      is_drawing; | 
| 106 |  | 
| 107 |   GstGLWindowCB         draw; | 
| 108 |   gpointer              draw_data; | 
| 109 |   GDestroyNotify        draw_notify; | 
| 110 |   GstGLWindowCB         close; | 
| 111 |   gpointer              close_data; | 
| 112 |   GDestroyNotify        close_notify; | 
| 113 |   GstGLWindowResizeCB   resize; | 
| 114 |   gpointer              resize_data; | 
| 115 |   GDestroyNotify        resize_notify; | 
| 116 |  | 
| 117 |   gboolean              queue_resize; | 
| 118 |  | 
| 119 |   GMainContext         *main_context; /* default main_context */ | 
| 120 |  | 
| 121 |   /*< private >*/ | 
| 122 |   GstGLWindowPrivate *priv; | 
| 123 |  | 
| 124 |   gpointer _reserved[GST_PADDING]; | 
| 125 | }; | 
| 126 |  | 
| 127 | /** | 
| 128 |  * GstGLWindowClass: | 
| 129 |  * @parent_class: Parent class | 
| 130 |  * @get_display: Gets the current windowing system display connection | 
| 131 |  * @set_window_handle: Set a window handle to render into | 
| 132 |  * @get_window_handle: Gets the current window handle that this #GstGLWindow is | 
| 133 |  *                     rendering into.  This may return a different value to | 
| 134 |  *                     what is passed into @set_window_handle | 
| 135 |  * @draw: redraw the window with the specified dimensions | 
| 136 |  * @run: run the mainloop | 
| 137 |  * @quit: send a quit to the mainloop | 
| 138 |  * @send_message: invoke a function on the window thread.  Required to be reentrant. | 
| 139 |  * @send_message_async: invoke a function on the window thread. @run may or may | 
| 140 |  *                      not have been called.  Required to be reentrant. | 
| 141 |  * @open: open the connection to the display | 
| 142 |  * @close: close the connection to the display | 
| 143 |  * @handle_events: whether to handle 'extra' events from the windowing system. | 
| 144 |  *                 Basic events like surface moves and resizes are still valid | 
| 145 |  *                 things to listen for. | 
| 146 |  * @set_preferred_size: request that the window change surface size.  The | 
| 147 |  *                      implementation is free to ignore this information. | 
| 148 |  * @show: request that the window be shown to the user | 
| 149 |  * @set_render_rectangle: request a rectangle to render into.  See #GstVideoOverlay | 
| 150 |  * @queue_resize: request a resize to occur when possible | 
| 151 |  * @controls_viewport: Whether the window takes care of glViewport setup. | 
| 152 |  *                     and the user does not need to deal with viewports | 
| 153 |  * @has_output_surface: Whether the window has output surface or not. (Since: 1.18) | 
| 154 |  */ | 
| 155 | struct _GstGLWindowClass { | 
| 156 |   GstObjectClass parent_class; | 
| 157 |  | 
| 158 |   guintptr (*get_display)        (GstGLWindow *window); | 
| 159 |   void     (*set_window_handle)  (GstGLWindow *window, guintptr handle); | 
| 160 |   guintptr (*get_window_handle)  (GstGLWindow *window); | 
| 161 |   void     (*draw)               (GstGLWindow *window); | 
| 162 |   void     (*run)                (GstGLWindow *window); | 
| 163 |   void     (*quit)               (GstGLWindow *window); | 
| 164 |   void     (*send_message)       (GstGLWindow *window, GstGLWindowCB callback, gpointer data); | 
| 165 |   void     (*send_message_async) (GstGLWindow *window, GstGLWindowCB callback, gpointer data, GDestroyNotify destroy); | 
| 166 |  | 
| 167 |   gboolean (*open)               (GstGLWindow *window, GError **error); | 
| 168 |   void     (*close)              (GstGLWindow *window); | 
| 169 |   void     (*handle_events)      (GstGLWindow *window, gboolean handle_events); | 
| 170 |   void     (*set_preferred_size) (GstGLWindow *window, gint width, gint height); | 
| 171 |   void     (*show)               (GstGLWindow *window); | 
| 172 |   gboolean (*set_render_rectangle)(GstGLWindow *window, gint x, gint y, gint width, gint height); | 
| 173 |   void     (*queue_resize)       (GstGLWindow *window); | 
| 174 |   gboolean (*controls_viewport)  (GstGLWindow *window); | 
| 175 |   gboolean (*has_output_surface) (GstGLWindow *window); | 
| 176 |  | 
| 177 |   /*< private >*/ | 
| 178 |   gpointer _reserved[GST_PADDING-2]; | 
| 179 | }; | 
| 180 |  | 
| 181 | GST_GL_API | 
| 182 | GstGLWindow * gst_gl_window_new  (GstGLDisplay *display); | 
| 183 |  | 
| 184 | /* callbacks */ | 
| 185 | GST_GL_API | 
| 186 | void     gst_gl_window_set_draw_callback    (GstGLWindow *window, | 
| 187 |                                              GstGLWindowCB callback, | 
| 188 |                                              gpointer data, | 
| 189 |                                              GDestroyNotify destroy_notify); | 
| 190 | GST_GL_API | 
| 191 | void     gst_gl_window_set_resize_callback  (GstGLWindow *window, | 
| 192 |                                              GstGLWindowResizeCB callback, | 
| 193 |                                              gpointer data, | 
| 194 |                                              GDestroyNotify destroy_notify); | 
| 195 | GST_GL_API | 
| 196 | void     gst_gl_window_set_close_callback   (GstGLWindow *window, | 
| 197 |                                              GstGLWindowCB callback, | 
| 198 |                                              gpointer data, | 
| 199 |                                              GDestroyNotify destroy_notify); | 
| 200 |  | 
| 201 | GST_GL_API | 
| 202 | void     gst_gl_window_set_window_handle    (GstGLWindow *window, guintptr handle); | 
| 203 | GST_GL_API | 
| 204 | guintptr gst_gl_window_get_window_handle    (GstGLWindow *window); | 
| 205 |  | 
| 206 | /* loop/events */ | 
| 207 | GST_GL_API | 
| 208 | void     gst_gl_window_run                  (GstGLWindow *window); | 
| 209 | GST_GL_API | 
| 210 | void     gst_gl_window_quit                 (GstGLWindow *window); | 
| 211 | GST_GL_API | 
| 212 | void     gst_gl_window_send_message         (GstGLWindow *window, | 
| 213 |                                              GstGLWindowCB callback, | 
| 214 |                                              gpointer data); | 
| 215 | GST_GL_API | 
| 216 | void     gst_gl_window_send_message_async   (GstGLWindow *window, | 
| 217 |                                              GstGLWindowCB callback, | 
| 218 |                                              gpointer data, | 
| 219 |                                              GDestroyNotify destroy); | 
| 220 |  | 
| 221 | /* navigation */ | 
| 222 | GST_GL_API | 
| 223 | void     gst_gl_window_handle_events        (GstGLWindow * window, | 
| 224 |                                              gboolean handle_events); | 
| 225 |  | 
| 226 | GST_GL_API | 
| 227 | void     gst_gl_window_send_key_event       (GstGLWindow * window, | 
| 228 |                                              const char * event_type, | 
| 229 |                                              const char * key_str); | 
| 230 | GST_GL_API | 
| 231 | void     gst_gl_window_send_mouse_event     (GstGLWindow * window, | 
| 232 |                                              const char * event_type, | 
| 233 |                                              int button, | 
| 234 |                                              double posx, | 
| 235 |                                              double posy); | 
| 236 |  | 
| 237 | GST_GL_API | 
| 238 | void     gst_gl_window_send_scroll_event    (GstGLWindow * window, | 
| 239 |                                              double posx, | 
| 240 |                                              double posy, | 
| 241 |                                              double delta_x, | 
| 242 |                                              double delta_y); | 
| 243 |  | 
| 244 | /* surfaces/rendering */ | 
| 245 | GST_GL_API | 
| 246 | void     gst_gl_window_queue_resize         (GstGLWindow *window); | 
| 247 | GST_GL_API | 
| 248 | void     gst_gl_window_draw                 (GstGLWindow *window); | 
| 249 | GST_GL_API | 
| 250 | void     gst_gl_window_show                 (GstGLWindow *window); | 
| 251 | GST_GL_API | 
| 252 | void     gst_gl_window_set_preferred_size   (GstGLWindow * window, | 
| 253 |                                              gint width, | 
| 254 |                                              gint height); | 
| 255 | GST_GL_API | 
| 256 | void     gst_gl_window_get_surface_dimensions (GstGLWindow * window, | 
| 257 |                                                guint * width, | 
| 258 |                                                guint * height); | 
| 259 | GST_GL_API | 
| 260 | gboolean gst_gl_window_set_render_rectangle   (GstGLWindow * window, | 
| 261 |                                                gint x, | 
| 262 |                                                gint y, | 
| 263 |                                                gint width, | 
| 264 |                                                gint height); | 
| 265 | GST_GL_API | 
| 266 | gboolean gst_gl_window_controls_viewport      (GstGLWindow * window); | 
| 267 |  | 
| 268 | /* subclass usage only */ | 
| 269 | GST_GL_API | 
| 270 | void     gst_gl_window_resize               (GstGLWindow *window, guint width, guint height); | 
| 271 |  | 
| 272 | GST_GL_API | 
| 273 | GstGLContext * gst_gl_window_get_context    (GstGLWindow *window); | 
| 274 | GST_GL_API | 
| 275 | guintptr       gst_gl_window_get_display    (GstGLWindow *window); | 
| 276 |  | 
| 277 | GST_GL_API | 
| 278 | gboolean       gst_gl_window_has_output_surface (GstGLWindow *window); | 
| 279 |  | 
| 280 | G_END_DECLS | 
| 281 |  | 
| 282 | #endif /* __GST_GL_WINDOW_H__ */ | 
| 283 |  |