* Copyright (C) 2007 David A. Schleef <ds@schleef.org>
* Copyright (C) 2008 Julien Isorce <julien.isorce@gmail.com>
* Copyright (C) 2008 Filippo Argiolas <filippo.argiolas@gmail.com>
+ * Copyright (C) 2013 Matthew Waters <ystreet00@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
DEBUG_INIT);
#define GST_GL_DISPLAY_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE((o), GST_GL_TYPE_DISPLAY, GstGLDisplayPrivate))
+ (G_TYPE_INSTANCE_GET_PRIVATE((o), GST_TYPE_GL_DISPLAY, GstGLDisplayPrivate))
static void gst_gl_display_finalize (GObject * object);
-/* Called in the gl thread, protected by lock and unlock */
-gpointer gst_gl_display_thread_create_context (GstGLDisplay * display);
-void gst_gl_display_thread_destroy_context (GstGLDisplay * display);
-void gst_gl_display_thread_run_generic (GstGLDisplay * display);
-
struct _GstGLDisplayPrivate
{
- GstGLWindow *window;
-
/* generic gl code */
GstGLDisplayThreadFunc generic_callback;
gpointer data;
{
display->priv = GST_GL_DISPLAY_GET_PRIVATE (display);
- /* thread safe */
- g_mutex_init (&display->mutex);
-
display->gl_vtable = g_slice_alloc0 (sizeof (GstGLFuncs));
+ display->gl_api = GST_GL_API_NONE;
+
gst_gl_memory_init ();
}
{
GstGLDisplay *display = GST_GL_DISPLAY (object);
- g_mutex_clear (&display->mutex);
-
if (display->gl_vtable) {
g_slice_free (GstGLFuncs, display->gl_vtable);
display->gl_vtable = NULL;
}
- if (display->priv->window) {
- gst_object_unref (display->priv->window);
- display->priv->window = NULL;
+ if (display->window) {
+ gst_object_unref (display->window);
+ display->window = NULL;
}
G_OBJECT_CLASS (gst_gl_display_parent_class)->finalize (object);
}
-//------------------------------------------------------------
-//------------------ BEGIN GL THREAD PROCS -------------------
-//------------------------------------------------------------
-
-/* Called in the gl thread */
-
void
gst_gl_display_thread_run_generic (GstGLDisplay * display)
{
display->priv->generic_callback (display, display->priv->data);
}
-/*------------------------------------------------------------
- --------------------- BEGIN PUBLIC -------------------------
- ----------------------------------------------------------*/
-
-void
-gst_gl_display_lock (GstGLDisplay * display)
-{
- g_mutex_lock (&display->mutex);
-}
-
-void
-gst_gl_display_unlock (GstGLDisplay * display)
-{
- g_mutex_unlock (&display->mutex);
-}
-
-/* Called by the first gl element of a video/x-raw-gl flow */
GstGLDisplay *
gst_gl_display_new (void)
{
- return g_object_new (GST_GL_TYPE_DISPLAY, NULL);
+ return g_object_new (GST_TYPE_GL_DISPLAY, NULL);
}
void
GstGLDisplayThreadFunc func, gpointer data)
{
g_return_if_fail (GST_IS_GL_DISPLAY (display));
- g_return_if_fail (GST_GL_IS_WINDOW (display->priv->window));
+ g_return_if_fail (GST_GL_IS_WINDOW (display->window));
g_return_if_fail (func != NULL);
gst_gl_display_lock (display);
display->priv->data = data;
display->priv->generic_callback = func;
- gst_gl_window_send_message (display->priv->window,
+ gst_gl_window_send_message (display->window,
GST_GL_WINDOW_CB (gst_gl_display_thread_run_generic), display);
gst_gl_display_unlock (display);
}
-guintptr
-gst_gl_display_get_internal_gl_context (GstGLDisplay * display)
-{
- g_return_val_if_fail (GST_IS_GL_DISPLAY (display), 0);
- g_return_val_if_fail (GST_GL_IS_WINDOW (display->priv->window), 0);
-
- return gst_gl_window_get_gl_context (display->priv->window);
-}
-
GstGLAPI
gst_gl_display_get_gl_api (GstGLDisplay * display)
{
g_return_val_if_fail (GST_IS_GL_DISPLAY (display), GST_GL_API_NONE);
+ g_return_val_if_fail (GST_GL_IS_WINDOW (display->window), GST_GL_API_NONE);
- return display->gl_api;
+ return gst_gl_window_get_gl_api (display->window);
}
gpointer
gst_gl_display_lock (display);
- if (display->priv->window)
- gst_object_unref (display->priv->window);
+ if (display->window)
+ gst_object_unref (display->window);
- display->priv->window = gst_object_ref (window);
+ display->window = gst_object_ref (window);
gst_gl_display_unlock (display);
}
gst_gl_display_lock (display);
- window =
- display->priv->window ? gst_object_ref (display->priv->window) : NULL;
+ window = display->window ? gst_object_ref (display->window) : NULL;
gst_gl_display_unlock (display);
{
g_return_val_if_fail (GST_IS_GL_DISPLAY (display), NULL);
- return display->priv->window ? gst_object_ref (display->priv->window) : NULL;
+ return display->window ? gst_object_ref (display->window) : NULL;
+}
+
+void
+gst_context_set_gl_display (GstContext * context, GstGLDisplay * display)
+{
+ GstStructure *s;
+
+ s = gst_context_writable_structure (context);
+ gst_structure_set (s, GST_GL_DISPLAY_CONTEXT_TYPE, GST_TYPE_GL_DISPLAY,
+ display, NULL);
+}
+
+gboolean
+gst_context_get_gl_display (GstContext * context, GstGLDisplay ** display)
+{
+ const GstStructure *s;
+
+ s = gst_context_get_structure (context);
+ return gst_structure_get (s, GST_GL_DISPLAY_CONTEXT_TYPE,
+ GST_TYPE_GL_DISPLAY, display, NULL);
}
* Copyright (C) 2007 David A. Schleef <ds@schleef.org>
* Copyright (C) 2008 Julien Isorce <julien.isorce@gmail.com>
* Copyright (C) 2008 Filippo Argiolas <filippo.argiolas@gmail.com>
+ * Copyright (C) 2013 Matthew Waters <ystreet00@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* Boston, MA 02110-1301, USA.
*/
-#ifndef __GST_GL_H__
-#define __GST_GL_H__
+#ifndef __GST_GL_DISPLAY_H__
+#define __GST_GL_DISPLAY_H__
#include "gstglconfig.h"
-#include <gst/video/video.h>
-
-typedef struct _GstGLShader GstGLShader;
typedef struct _GstGLWindow GstGLWindow;
#include "gstglwindow.h"
-#include "gstglshader.h"
#include "gstglutils.h"
G_BEGIN_DECLS
GType gst_gl_display_get_type (void);
-#define GST_GL_TYPE_DISPLAY (gst_gl_display_get_type())
-#define GST_GL_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_GL_TYPE_DISPLAY,GstGLDisplay))
-#define GST_GL_DISPLAY_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass),GST_GL_TYPE_DISPLAY,GstGLDisplayClass))
-#define GST_IS_GL_DISPLAY(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_GL_TYPE_DISPLAY))
-#define GST_IS_GL_DISPLAY_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE((klass),GST_GL_TYPE_DISPLAY))
-#define GST_GL_DISPLAY_CAST(obj) ((GstGLDisplay*)(obj))
+
+#define GST_TYPE_GL_DISPLAY (gst_gl_display_get_type())
+#define GST_GL_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GL_DISPLAY,GstGLDisplay))
+#define GST_GL_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_GL_DISPLAY,GstGLDisplayClass))
+#define GST_IS_GL_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GL_DISPLAY))
+#define GST_IS_GL_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_GL_DISPLAY))
+#define GST_GL_DISPLAY_CAST(obj) ((GstGLDisplay*)(obj))
typedef struct _GstGLDisplay GstGLDisplay;
typedef struct _GstGLDisplayClass GstGLDisplayClass;
typedef struct _GstGLDisplayPrivate GstGLDisplayPrivate;
/**
- * GstGLDisplayConversion:
- *
- * %GST_GL_DISPLAY_CONVERSION_GLSL: Convert using GLSL (shaders)
- * %GST_GL_DISPLAY_CONVERSION_MATRIX: Convert using the ARB_imaging extension (not implemented)
- * %GST_GL_DISPLAY_CONVERSION_MESA: Convert using support in MESA
- */
-typedef enum
-{
- GST_GL_DISPLAY_CONVERSION_GLSL,
- GST_GL_DISPLAY_CONVERSION_MATRIX,
- GST_GL_DISPLAY_CONVERSION_MESA,
-} GstGLDisplayConversion;
-
-
-/**
* GstGLDisplayThreadFunc:
* @display: a #GstGLDisplay
* @data: user data
*/
struct _GstGLDisplay
{
- GObject object;
+ GstObject object;
- /* thread safe */
- GMutex mutex;
+ /* <private> */
+ GstGLWindow *window;
+ GstGLAPI gl_api;
- /* gl API we are using */
- GstGLAPI gl_api;
- /* foreign gl context */
- gulong external_gl_context;
+ GstGLFuncs *gl_vtable;
- GstGLFuncs *gl_vtable;
-
- GstGLDisplayPrivate *priv;
+ GstGLDisplayPrivate *priv;
};
-
struct _GstGLDisplayClass
{
GObjectClass object_class;
GstGLDisplay *gst_gl_display_new (void);
-void gst_gl_display_thread_add (GstGLDisplay * display,
- GstGLDisplayThreadFunc func, gpointer data);
+#define gst_gl_display_lock(display) GST_OBJECT_LOCK (display)
+#define gst_gl_display_unlock(display) GST_OBJECT_UNLOCK (display)
-gulong gst_gl_display_get_internal_gl_context (GstGLDisplay * display);
+GstGLAPI gst_gl_display_get_gl_api (GstGLDisplay * display);
+gpointer gst_gl_display_get_gl_vtable (GstGLDisplay * display);
+void gst_gl_display_set_window (GstGLDisplay * display, GstGLWindow * window);
+GstGLWindow * gst_gl_display_get_window (GstGLDisplay * display);
+GstGLWindow * gst_gl_display_get_window_unlocked (GstGLDisplay * display);
-void gst_gl_display_lock (GstGLDisplay * display);
-void gst_gl_display_unlock (GstGLDisplay * display);
-GstGLAPI gst_gl_display_get_gl_api (GstGLDisplay * display);
-
-gpointer gst_gl_display_get_gl_vtable (GstGLDisplay * display);
+void gst_gl_display_thread_add (GstGLDisplay * display,
+ GstGLDisplayThreadFunc func, gpointer data);
-void gst_gl_display_set_window (GstGLDisplay * display, GstGLWindow * window);
-GstGLWindow * gst_gl_display_get_window (GstGLDisplay * display);
-GstGLWindow * gst_gl_display_get_window_unlocked (GstGLDisplay * display);
+#define GST_GL_DISPLAY_CONTEXT_TYPE "gst.gl.GLDisplay"
+void gst_context_set_gl_display (GstContext * context,
+ GstGLDisplay * display);
+gboolean gst_context_get_gl_display (GstContext * context,
+ GstGLDisplay ** display);
G_END_DECLS
-#endif /* __GST_GL_H__ */
+#endif /* __GST_GL_DISPLAY_H__ */
#include <gst/base/gstcollectpads.h>
#include "gstgldisplay.h"
-#include <gst/gl/gstglupload.h>
+#include "gstglupload.h"
G_BEGIN_DECLS
#define __GST_GL_UTILS_H__
typedef struct _GstGLDisplay GstGLDisplay;
+typedef struct _GstGLShader GstGLShader;
+
+#include <gst/video/video.h>
#include "gstgldisplay.h"
+#include "gstglshader.h"
/**
* GstGLDisplayProjection:
GstGLAPI
gst_gl_window_get_gl_api (GstGLWindow * window)
{
- GstGLAPI ret;
GstGLWindowClass *window_class;
g_return_val_if_fail (GST_GL_IS_WINDOW (window), GST_GL_API_NONE);
window_class = GST_GL_WINDOW_GET_CLASS (window);
g_return_val_if_fail (window_class->get_gl_api != NULL, GST_GL_API_NONE);
- GST_GL_WINDOW_LOCK (window);
-
- ret = window_class->get_gl_api (window);
-
- GST_GL_WINDOW_UNLOCK (window);
-
- return ret;
+ return window_class->get_gl_api (window);
}
gpointer