[vlc-commits] vlc_opengl: refactor vlc_gl_t creation

Filip Roséen git at videolan.org
Mon Dec 19 15:04:07 CET 2016


vlc | branch: master | Filip Roséen <filip at atch.se> | Mon Dec 19 03:07:43 2016 +0100| [79b2187631f2786f46a8225b538f3ec7ae7d1c9e] | committer: Thomas Guillem

vlc_opengl: refactor vlc_gl_t creation

Given that there are places in the codebase that just require a
created object of type vlc_gl_t ("gl"), these changes split the object
creation into two functions:

 - vlc_gl_Create: a simple wrapper around vlc_custom_create
 - vlc_gl_ModuleCreate: creates a vlc_gl_t with an associated
                        module/surface.

refs #17795

Signed-off-by: Thomas Guillem <thomas at gllm.fr>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=79b2187631f2786f46a8225b538f3ec7ae7d1c9e
---

 include/vlc_opengl.h                  | 22 ++++++++++++++-
 modules/video_output/opengl/display.c |  2 +-
 src/libvlccore.sym                    |  1 +
 src/video_output/opengl.c             | 51 ++++++++++++++++-------------------
 4 files changed, 46 insertions(+), 30 deletions(-)

diff --git a/include/vlc_opengl.h b/include/vlc_opengl.h
index 53d73d0..f7704bc 100644
--- a/include/vlc_opengl.h
+++ b/include/vlc_opengl.h
@@ -58,7 +58,27 @@ enum {
     VLC_OPENGL_ES2,
 };
 
-VLC_API vlc_gl_t *vlc_gl_Create(struct vout_window_t *, unsigned, const char *) VLC_USED;
+/**
+ * Create a VLC OpenGL object
+ *
+ * @note The allocated resource, if any, shall be released
+ *       with a call to \ref vlc_gl_Destroy.
+ * @return a created object on success, NULL on failure.
+ **/
+VLC_API vlc_gl_t *vlc_gl_Create(vlc_object_t* parent);
+
+/**
+ * Creates a VLC OpenGL object with associated surface and module
+ *
+ * @note In most cases, you should vlc_gl_MakeCurrent() afterward.
+ *
+ * @param wnd window to use as OpenGL surface
+ * @param flags OpenGL context type
+ * @param name module name (or NULL for auto)
+ * @return a new context, or NULL on failure
+ */
+VLC_API vlc_gl_t *vlc_gl_ModuleCreate(struct vout_window_t *wnd, unsigned flags,
+                                      const char *name) VLC_USED;
 VLC_API void vlc_gl_Destroy(vlc_gl_t *);
 
 static inline int vlc_gl_MakeCurrent(vlc_gl_t *gl)
diff --git a/modules/video_output/opengl/display.c b/modules/video_output/opengl/display.c
index eefb5cf..68418b3 100644
--- a/modules/video_output/opengl/display.c
+++ b/modules/video_output/opengl/display.c
@@ -107,7 +107,7 @@ static int Open (vlc_object_t *obj)
         goto error;
     }
 
-    sys->gl = vlc_gl_Create (surface, API, "$" MODULE_VARNAME);
+    sys->gl = vlc_gl_ModuleCreate (surface, API, "$" MODULE_VARNAME);
     if (sys->gl == NULL)
         goto error;
 
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 7b9657a..b65f538 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -691,6 +691,7 @@ vlc_fifo_GetCount
 vlc_fifo_GetBytes
 vlc_gl_Create
 vlc_gl_Destroy
+vlc_gl_ModuleCreate
 vlc_gl_surface_Create
 vlc_gl_surface_CheckSize
 vlc_gl_surface_Destroy
diff --git a/src/video_output/opengl.c b/src/video_output/opengl.c
index ac16c3f..6459cbf 100644
--- a/src/video_output/opengl.c
+++ b/src/video_output/opengl.c
@@ -29,47 +29,43 @@
 #include <vlc_opengl.h>
 #include "libvlc.h"
 #include <vlc_modules.h>
+#include <vlc_vout_window.h>
 
-#undef vlc_gl_Create
-/**
- * Creates an OpenGL context (and its underlying surface).
- *
- * @note In most cases, you should vlc_gl_MakeCurrent() afterward.
- *
- * @param wnd window to use as OpenGL surface
- * @param flags OpenGL context type
- * @param name module name (or NULL for auto)
- * @return a new context, or NULL on failure
- */
-vlc_gl_t *vlc_gl_Create(struct vout_window_t *wnd, unsigned flags,
-                        const char *name)
+vlc_gl_t *vlc_gl_Create(vlc_object_t* parent)
 {
-    vlc_object_t *parent = (vlc_object_t *)wnd;
-    vlc_gl_t *gl;
-    const char *type;
+    return vlc_custom_create(parent, sizeof(vlc_gl_t), "gl");
+}
 
-    switch (flags /*& VLC_OPENGL_API_MASK*/)
+vlc_gl_t *vlc_gl_ModuleCreate(struct vout_window_t *wnd, unsigned flags,
+                              const char *module_name)
+{
+    const char *module_type;
+
+    switch (flags)
     {
         case VLC_OPENGL:
-            type = "opengl";
+            module_type = "opengl";
             break;
         case VLC_OPENGL_ES:
-            type = "opengl es";
+            module_type = "opengl es";
             break;
         case VLC_OPENGL_ES2:
-            type = "opengl es2";
+            module_type = "opengl es2";
             break;
+
         default:
             return NULL;
     }
 
-    gl = vlc_custom_create(parent, sizeof (*gl), "gl");
-    if (unlikely(gl == NULL))
+    vlc_gl_t *gl = vlc_gl_Create(VLC_OBJECT(wnd));
+
+    if( unlikely( !gl ) )
         return NULL;
 
     gl->surface = wnd;
-    gl->module = module_need(gl, type, name, true);
-    if (gl->module == NULL)
+    gl->module = module_need(gl, module_type, module_name, true);
+
+    if (gl->module == NULL )
     {
         vlc_object_release(gl);
         return NULL;
@@ -80,12 +76,11 @@ vlc_gl_t *vlc_gl_Create(struct vout_window_t *wnd, unsigned flags,
 
 void vlc_gl_Destroy(vlc_gl_t *gl)
 {
-    module_unneed(gl, gl->module);
+    if(gl->module)
+        module_unneed(gl, gl->module);
     vlc_object_release(gl);
 }
 
-#include <vlc_vout_window.h>
-
 typedef struct vlc_gl_surface
 {
     int width;
@@ -130,7 +125,7 @@ vlc_gl_t *vlc_gl_surface_Create(vlc_object_t *obj,
         *wp = surface;
 
     /* TODO: support ES? */
-    vlc_gl_t *gl = vlc_gl_Create(surface, VLC_OPENGL, NULL);
+    vlc_gl_t *gl = vlc_gl_ModuleCreate(surface, VLC_OPENGL, NULL);
     if (gl == NULL) {
         vout_window_Delete(surface);
         return NULL;



More information about the vlc-commits mailing list