[vlc-commits] vout: add helpers for OpenGL context without video output
Rémi Denis-Courmont
git at videolan.org
Thu Oct 16 19:26:08 CEST 2014
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Oct 12 22:44:00 2014 +0300| [39f52871791f36d28c48750c0793358c9d1077e0] | committer: Rémi Denis-Courmont
vout: add helpers for OpenGL context without video output
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=39f52871791f36d28c48750c0793358c9d1077e0
---
include/vlc_opengl.h | 7 ++++
include/vlc_vout_window.h | 2 +-
src/libvlccore.sym | 3 ++
src/video_output/opengl.c | 101 +++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 112 insertions(+), 1 deletion(-)
diff --git a/include/vlc_opengl.h b/include/vlc_opengl.h
index 1cc8ca2..12d1b93 100644
--- a/include/vlc_opengl.h
+++ b/include/vlc_opengl.h
@@ -30,6 +30,7 @@
*/
struct vout_window_t;
+struct vout_window_cfg_t;
/**
* A VLC GL context (and its underlying surface)
@@ -92,4 +93,10 @@ static inline void *vlc_gl_GetProcAddress(vlc_gl_t *gl, const char *name)
return (gl->getProcAddress != NULL) ? gl->getProcAddress(gl, name) : NULL;
}
+VLC_API vlc_gl_t *vlc_gl_surface_Create(vlc_object_t *,
+ const struct vout_window_cfg_t *,
+ struct vout_window_t **) VLC_USED;
+VLC_API bool vlc_gl_surface_CheckSize(vlc_gl_t *, unsigned *w, unsigned *h);
+VLC_API void vlc_gl_surface_Destroy(vlc_gl_t *);
+
#endif /* VLC_GL_H */
diff --git a/include/vlc_vout_window.h b/include/vlc_vout_window.h
index 6f38df4..1b766f5 100644
--- a/include/vlc_vout_window.h
+++ b/include/vlc_vout_window.h
@@ -61,7 +61,7 @@ enum {
VOUT_WINDOW_SET_FULLSCREEN, /* int b_fullscreen */
};
-typedef struct {
+typedef struct vout_window_cfg_t {
/* If true, a standalone window is requested */
bool is_standalone;
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 1a35103..e3a90e6 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -601,6 +601,9 @@ vlc_epg_SetCurrent
vlc_epg_Merge
vlc_gl_Create
vlc_gl_Destroy
+vlc_gl_surface_Create
+vlc_gl_surface_CheckSize
+vlc_gl_surface_Destroy
vlm_Control
vlm_Delete
vlm_ExecuteCommand
diff --git a/src/video_output/opengl.c b/src/video_output/opengl.c
index 95b6121..eedc04b 100644
--- a/src/video_output/opengl.c
+++ b/src/video_output/opengl.c
@@ -22,6 +22,9 @@
# include <config.h>
#endif
+#include <assert.h>
+#include <stdlib.h>
+
#include <vlc_common.h>
#include <vlc_opengl.h>
#include "libvlc.h"
@@ -80,3 +83,101 @@ void vlc_gl_Destroy(vlc_gl_t *gl)
module_unneed(gl, gl->module);
vlc_object_release(gl);
}
+
+#include <vlc_vout_window.h>
+
+typedef struct vlc_gl_surface
+{
+ int width;
+ int height;
+ vlc_mutex_t lock;
+} vlc_gl_surface_t;
+
+static void vlc_gl_surface_ResizeNotify(vout_window_t *surface,
+ unsigned width, unsigned height)
+{
+ vlc_gl_surface_t *sys = surface->owner.sys;
+
+ msg_Dbg(surface, "resized to %ux%u", width, height);
+
+ vlc_mutex_lock(&sys->lock);
+ sys->width = width;
+ sys->height = height;
+ vlc_mutex_unlock(&sys->lock);
+}
+
+vlc_gl_t *vlc_gl_surface_Create(vlc_object_t *obj,
+ const vout_window_cfg_t *cfg,
+ struct vout_window_t **restrict wp)
+{
+ vlc_gl_surface_t *sys = malloc(sizeof (*sys));
+ if (unlikely(sys == NULL))
+ return NULL;
+
+ sys->width = cfg->width;
+ sys->height = cfg->height;
+ vlc_mutex_init(&sys->lock);
+
+ vout_window_owner_t owner = {
+ .sys = sys,
+ .resized = vlc_gl_surface_ResizeNotify,
+ };
+
+ vout_window_t *surface = vout_window_New(obj, "$window", cfg, &owner);
+ if (surface == NULL)
+ goto error;
+ if (wp != NULL)
+ *wp = surface;
+
+ /* TODO: support ES? */
+ vlc_gl_t *gl = vlc_gl_Create(surface, VLC_OPENGL, "glx");
+ if (gl == NULL) {
+ vout_window_Delete(surface);
+ goto error;
+ }
+ return gl;
+
+error:
+ vlc_mutex_destroy(&sys->lock);
+ free(sys);
+ return NULL;
+}
+
+/**
+ * Checks if the dimensions of the surface used by the OpenGL context have
+ * changed (since the previous call), and the OpenGL viewport should be
+ * updated.
+ * \return true if at least one dimension has changed, false otherwise
+ * \warning This function is intrinsically race-prone.
+ * The dimensions can change asynchronously.
+ */
+bool vlc_gl_surface_CheckSize(vlc_gl_t *gl, unsigned *restrict width,
+ unsigned *restrict height)
+{
+ vout_window_t *surface = gl->surface;
+ vlc_gl_surface_t *sys = surface->owner.sys;
+ bool ret = false;
+
+ vlc_mutex_lock(&sys->lock);
+ if (sys->width >= 0 && sys->height >= 0)
+ {
+ *width = sys->width;
+ *height = sys->height;
+ sys->width = -1;
+ sys->height = -1;
+ ret = true;
+ }
+ vlc_mutex_unlock(&sys->lock);
+ return ret;
+}
+
+void vlc_gl_surface_Destroy(vlc_gl_t *gl)
+{
+ vout_window_t *surface = gl->surface;
+ vlc_gl_surface_t *sys = surface->owner.sys;
+
+ vlc_gl_Destroy(gl);
+ vout_window_Delete(surface);
+ vlc_mutex_destroy(&sys->lock);
+ free(sys);
+}
More information about the vlc-commits
mailing list