#include "gstglbufferpool.h"
+/**
+ * SECTION:gstglbufferpool
+ * @short_description: buffer pool for #GstGLMemory objects
+ * @see_also: #GstBufferPool, #GstGLMemory
+ *
+ * a #GstGLBufferPool is an object that allocates buffers with #GstGLMemory
+ *
+ * A #GstGLBufferPool is created with gst_gl_buffer_pool_new()
+ *
+ * #GstGLBufferPool implements the VideoMeta buffer pool option
+ * #GST_BUFFER_POOL_OPTION_VIDEO_META
+ */
+
/* bufferpool */
struct _GstGLBufferPoolPrivate
{
gst_buffer_append_memory (buf, gl_mem);
if (priv->add_videometa) {
- GST_DEBUG_OBJECT (pool, "adding GstGLMeta");
+ GST_DEBUG_OBJECT (pool, "adding GstVideoMeta");
/* these are just the defaults for now */
gst_buffer_add_video_meta (buf, 0,
GST_VIDEO_INFO_FORMAT (info), GST_VIDEO_INFO_WIDTH (info),
mem_create_failed:
{
- GST_WARNING_OBJECT (pool, "Could create GL Memory");
+ GST_WARNING_OBJECT (pool, "Could not create GL Memory");
return GST_FLOW_ERROR;
}
}
+/**
+ * gst_gl_buffer_pool_new:
+ * @display: the #GstGLDisplay to use
+ *
+ * Returns: a #GstBufferPool that allocates buffers with #GstGLMemory
+ */
GstBufferPool *
gst_gl_buffer_pool_new (GstGLDisplay * display)
{
typedef struct _GstGLBufferPoolPrivate GstGLBufferPoolPrivate;
/* buffer pool functions */
+GType gst_gl_buffer_pool_get_type (void);
#define GST_TYPE_GL_BUFFER_POOL (gst_gl_buffer_pool_get_type())
#define GST_IS_GL_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_BUFFER_POOL))
#define GST_GL_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_BUFFER_POOL, GstGLBufferPool))
#define GST_GL_BUFFER_POOL_CAST(obj) ((GstGLBufferPool*)(obj))
+/**
+ * GstGLBufferPool:
+ *
+ * Opaque GstGLBufferPool struct
+ */
struct _GstGLBufferPool
{
GstBufferPool bufferpool;
GstGLBufferPoolPrivate *priv;
};
+/**
+ * GstGLBufferPoolClass:
+ *
+ * The #GstGLBufferPoolClass structure contains only private data
+ */
struct _GstGLBufferPoolClass
{
GstBufferPoolClass parent_class;
};
-GType gst_gl_buffer_pool_get_type (void);
GstBufferPool *gst_gl_buffer_pool_new (GstGLDisplay * display);
G_END_DECLS
G_BEGIN_DECLS
-#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) \
+GType gst_gl_display_get_type (void);
+#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) \
+#define GST_IS_GL_DISPLAY(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GL_DISPLAY))
-#define GST_IS_GL_DISPLAY_CLASS(klass) \
+#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;
-//Color space conversion method
+/**
+ * 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, //ARB_fragment_shade
- GST_GL_DISPLAY_CONVERSION_MATRIX, //ARB_imaging
- GST_GL_DISPLAY_CONVERSION_MESA, //MESA_ycbcr_texture
+ GST_GL_DISPLAY_CONVERSION_GLSL,
+ GST_GL_DISPLAY_CONVERSION_MATRIX,
+ GST_GL_DISPLAY_CONVERSION_MESA,
} GstGLDisplayConversion;
-
-//Projection type
+/**
+ * GstGLDisplayProjection:
+ *
+ * %GST_GL_DISPLAY_PROJECTION_ORTHO2D: Orthogonal projection
+ * %GST_GL_DISPLAY_CONVERSION_MATRIX: Perspective projection
+ */
typedef enum
{
GST_GL_DISPLAY_PROJECTION_ORTHO2D,
GST_GL_DISPLAY_PROJECTION_PERSPECTIVE
} GstGLDisplayProjection;
-//Texture pool elements
-typedef struct _GstGLDisplayTex
-{
- GLuint texture;
-} GstGLDisplayTex;
-
-
-//Client callbacks
-typedef void (*CRCB) (GLuint, GLuint, gpointer);
-typedef gboolean (*CDCB) (GLuint, GLuint, GLuint, gpointer);
-
+/**
+ * CRCB:
+ * @width: new width
+ * @height: new height:
+ * @data: user data
+ *
+ * client reshape callback
+ */
+typedef void (*CRCB) (GLuint width, GLuint height, gpointer data);
+/**
+ * CDCB:
+ * @texture: texture to draw
+ * @width: new width
+ * @height: new height:
+ * @data: user data
+ *
+ * client draw callback
+ */
+typedef gboolean (*CDCB) (GLuint texture, GLuint width, GLuint height, gpointer data);
+/**
+ * GstGLDisplayThreadFunc:
+ * @display: a #GstGLDisplay
+ * @data: user data
+ *
+ * Represents a function to run in the GL thread
+ */
typedef void (*GstGLDisplayThreadFunc) (GstGLDisplay * display, gpointer data);
-//opengl scene callback
+/**
+ * GLCB:
+ * @width: the width
+ * @height: the height
+ * @texture: texture
+ * @stuff: user data
+ *
+ * callback definition for operating on textures
+ */
typedef void (*GLCB) (gint, gint, guint, gpointer stuff);
+/**
+ * GLCB_V2:
+ * @stuff: user data
+ *
+ * callback definition for operating through a Framebuffer object
+ */
typedef void (*GLCB_V2) (gpointer stuff);
#define GST_GL_DISPLAY_ERR_MSG(obj) ("%s", GST_GL_DISPLAY_CAST(obj)->error_message)
+/**
+ * GstGLDisplay:
+ *
+ * the contents of a #GstGLDisplay are private and should only be accessed
+ * through the provided API
+ */
struct _GstGLDisplay
{
- GObject object;
-
- //thread safe
- GMutex *mutex;
-
- //gl context
- GThread *gl_thread;
- GstGLWindow *gl_window;
- gboolean isAlive;
- GHashTable *texture_pool;
-
- //conditions
- GCond *cond_create_context;
- GCond *cond_destroy_context;
-
- //generic gl code
- GstGLDisplayThreadFunc generic_callback;
- gpointer data;
-
- //action redisplay
- GLuint redisplay_texture;
- GLuint redisplay_texture_width;
- GLuint redisplay_texture_height;
- gboolean keep_aspect_ratio;
+ GObject object;
+
+ /* thread safe */
+ GMutex *mutex;
+
+ /* gl context */
+ GThread *gl_thread;
+ GstGLWindow *gl_window;
+ gboolean isAlive;
+
+ /* conditions */
+ GCond *cond_create_context;
+ GCond *cond_destroy_context;
+
+ /* generic gl code */
+ GstGLDisplayThreadFunc generic_callback;
+ gpointer data;
+
+ /* action redisplay */
+ GLuint redisplay_texture;
+ GLuint redisplay_texture_width;
+ GLuint redisplay_texture_height;
+ gboolean keep_aspect_ratio;
#ifdef OPENGL_ES2
- GstGLShader *redisplay_shader;
- gchar *redisplay_vertex_shader_str;
- gchar *redisplay_fragment_shader_str;
- GLint redisplay_attr_position_loc;
- GLint redisplay_attr_texture_loc;
+ GstGLShader *redisplay_shader;
+ gchar *redisplay_vertex_shader_str;
+ gchar *redisplay_fragment_shader_str;
+ GLint redisplay_attr_position_loc;
+ GLint redisplay_attr_texture_loc;
#endif
- //action gen and del texture
- GLuint gen_texture;
- GLuint gen_texture_width;
- GLuint gen_texture_height;
+ /* action gen and del texture */
+ GLuint gen_texture;
+ GLuint gen_texture_width;
+ GLuint gen_texture_height;
GstVideoFormat gen_texture_video_format;
- //client callbacks
- CRCB clientReshapeCallback;
- CDCB clientDrawCallback;
- gpointer client_data;
+ /* client callbacks */
+ CRCB clientReshapeCallback;
+ CDCB clientDrawCallback;
+ gpointer client_data;
GstGLDisplayConversion colorspace_conversion;
- GSList *uploads;
- GSList *downloads;
-
- //foreign gl context
- gulong external_gl_context;
-
- //filter gen fbo
- GLuint gen_fbo_width;
- GLuint gen_fbo_height;
- GLuint generated_fbo;
- GLuint generated_depth_buffer;
-
- //filter use fbo
- GLuint use_fbo;
- GLuint use_depth_buffer;
- GLuint use_fbo_texture;
- GLuint use_fbo_width;
- GLuint use_fbo_height;
- GLCB use_fbo_scene_cb;
- GLCB_V2 use_fbo_scene_cb_v2;
- gdouble use_fbo_proj_param1;
- gdouble use_fbo_proj_param2;
- gdouble use_fbo_proj_param3;
- gdouble use_fbo_proj_param4;
+ GSList *uploads;
+ GSList *downloads;
+
+ /* foreign gl context */
+ gulong external_gl_context;
+
+ /* filter gen fbo */
+ GLuint gen_fbo_width;
+ GLuint gen_fbo_height;
+ GLuint generated_fbo;
+ GLuint generated_depth_buffer;
+
+ /* filter use fbo */
+ GLuint use_fbo;
+ GLuint use_depth_buffer;
+ GLuint use_fbo_texture;
+ GLuint use_fbo_width;
+ GLuint use_fbo_height;
+ GLCB use_fbo_scene_cb;
+ GLCB_V2 use_fbo_scene_cb_v2;
+ gdouble use_fbo_proj_param1;
+ gdouble use_fbo_proj_param2;
+ gdouble use_fbo_proj_param3;
+ gdouble use_fbo_proj_param4;
GstGLDisplayProjection use_fbo_projection;
- gpointer *use_fbo_stuff;
- GLuint input_texture_width;
- GLuint input_texture_height;
- GLuint input_texture;
-
- //filter del fbo
- GLuint del_fbo;
- GLuint del_depth_buffer;
+ gpointer *use_fbo_stuff;
+ GLuint input_texture_width;
+ GLuint input_texture_height;
+ GLuint input_texture;
- //action gen and del shader
- const gchar *gen_shader_fragment_source;
- const gchar *gen_shader_vertex_source;
- GstGLShader *gen_shader;
- GstGLShader *del_shader;
+ /* filter del fbo */
+ GLuint del_fbo;
+ GLuint del_depth_buffer;
- //fragement shader upload
- gchar *text_shader_upload_YUY2_UYVY;
- GstGLShader *shader_upload_YUY2;
- GstGLShader *shader_upload_UYVY;
-
- gchar *text_shader_upload_I420_YV12;
- GstGLShader *shader_upload_I420_YV12;
-
- gchar *text_shader_upload_AYUV;
- GstGLShader *shader_upload_AYUV;
-
-#ifdef OPENGL_ES2
- gchar *text_vertex_shader_upload;
- GLint shader_upload_attr_position_loc;
- GLint shader_upload_attr_texture_loc;
-#endif
+ /* action gen and del shader */
+ const gchar *gen_shader_fragment_source;
+ const gchar *gen_shader_vertex_source;
+ GstGLShader *gen_shader;
+ GstGLShader *del_shader;
gchar *error_message;
-
};
GObjectClass object_class;
};
-GType gst_gl_display_get_type (void);
-
-//------------------------------------------------------------
-//-------------------- Public declarations ------------------
-//------------------------------------------------------------
+/*-----------------------------------------------------------*\
+ -------------------- Public declarations -------------------
+\*-----------------------------------------------------------*/
GstGLDisplay *gst_gl_display_new (void);
gboolean gst_gl_display_create_context (GstGLDisplay * display,
GstVideoFormat v_format, GLint width, GLint height);
void gst_gl_display_del_texture (GstGLDisplay * display, GLuint * pTexture);
-gboolean gst_gl_display_init_upload (GstGLDisplay * display,
- GstVideoFormat video_format, guint gl_width, guint gl_height,
- gint video_width, gint video_height);
-gboolean gst_gl_display_do_upload (GstGLDisplay * display, GLuint texture,
- GstVideoFrame * frame);
-
gboolean gst_gl_display_gen_fbo (GstGLDisplay * display, gint width, gint height,
GLuint * fbo, GLuint * depthbuffer);
gboolean gst_gl_display_use_fbo (GstGLDisplay * display, gint texture_fbo_width,
#include "gstgldownload.h"
#include "gstglmemory.h"
+/**
+ * SECTION:gstgldownload
+ * @short_description: an object that downloads GL textures
+ * @see_also: #GstGLUpload, #GstGLMemory
+ *
+ * #GstGLDownload is an object that downloads GL textures into system memory.
+ *
+ * A #GstGLDownload can be created with gst_gl_download_new() or found with
+ * gst_gl_display_find_download().
+ *
+ * All of the _thread() variants should only be called within the GL thread
+ * they don't try to take a lock on the associated #GstGLDisplay and
+ * don't dispatch to the GL thread. Rather they run the required code in the
+ * calling thread.
+ */
+
static void _do_download (GstGLDisplay * display, GstGLDownload * download);
static void _do_download_draw_rgb (GstGLDisplay * display,
GstGLDownload * download);
gst_video_info_init (&download->info);
}
+/**
+ * gst_gl_download_new:
+ * @display: a #GstGLDisplay
+ *
+ * Returns: a new #GstGLDownload object
+ */
GstGLDownload *
gst_gl_download_new (GstGLDisplay * display)
{
return TRUE;
}
+/**
+ * gst_gl_download_init_format:
+ * @download: a #GstGLDownload
+ * @v_format: a #GstVideoFormat
+ * @out_width: the width to download to
+ * @out_height: the height to download to
+ *
+ * Initializes @download with the information required for download.
+ *
+ * Returns: whether the initialization was successful
+ */
gboolean
gst_gl_download_init_format (GstGLDownload * download, GstVideoFormat v_format,
guint out_width, guint out_height)
return TRUE;
}
+/**
+ * gst_gl_download_init_format_thread:
+ * @download: a #GstGLDownload
+ * @v_format: a #GstVideoFormat
+ * @out_width: the width to download to
+ * @out_height: the height to download to
+ *
+ * Initializes @download with the information required for download.
+ *
+ * Returns: whether the initialization was successful
+ */
gboolean
gst_gl_download_init_format_thread (GstGLDownload * download,
GstVideoFormat v_format, guint out_width, guint out_height)
return TRUE;
}
+/**
+ * gst_gl_download_perform_with_memory:
+ * @download: a #GstGLDownload
+ * @gl_mem: a #GstGLMemory
+ *
+ * Downloads the texture in @gl_mem
+ *
+ * Returns: whether the download was successful
+ */
gboolean
gst_gl_download_perform_with_memory (GstGLDownload * download,
GstGLMemory * gl_mem)
return ret;
}
+/**
+ * gst_gl_download_perform_with_data:
+ * @download: a #GstGLDownload
+ * @texture_id: the texture id to download
+ * @data: (out): where the downloaded data should go
+ *
+ * Downloads @texture_id into @data. @data size and format is specified by
+ * the #GstVideoFormat passed to gst_gl_download_init_format()
+ *
+ * Returns: whether the download was successful
+ */
gboolean
gst_gl_download_perform_with_data (GstGLDownload * download, GLuint texture_id,
gpointer data[GST_VIDEO_MAX_PLANES])
return TRUE;
}
+/**
+ * gst_gl_download_perform_with_memory_thread:
+ * @download: a #GstGLDownload
+ * @gl_mem: a #GstGLMemory
+ *
+ * Downloads the texture in @gl_mem
+ *
+ * Returns: whether the download was successful
+ */
gboolean
gst_gl_download_perform_with_memory_thread (GstGLDownload * download,
GstGLMemory * gl_mem)
return ret;
}
+/**
+ * gst_gl_download_perform_with_data_thread:
+ * @download: a #GstGLDownload
+ * @texture_id: the texture id to download
+ * @data: (out): where the downloaded data should go
+ *
+ * Downloads @texture_id into @data. @data size and format is specified by
+ * the #GstVideoFormat passed to gst_gl_download_init_format()
+ *
+ * Returns: whether the download was successful
+ */
gboolean
gst_gl_download_perform_with_data_thread (GstGLDownload * download,
GLuint texture_id, gpointer data[GST_VIDEO_MAX_PLANES])
return TRUE;
}
+/**
+ * gst_gl_display_find_download_unlocked:
+ * @display: a #GstGLDisplay
+ * @v_format: a #GstVideoFormat
+ * @out_width: the width to download to
+ * @out_height: the height to download to
+ *
+ * Finds a #GstGLDownload with the required download settings, creating one
+ * if needed. The returned object may not be initialized so you still
+ * have to call gst_gl_download_init_format.
+ *
+ * This function is safe to be called in the GL thread
+ *
+ * Returns: a #GstGLDownload object with the required settings
+ */
GstGLDownload *
gst_gl_display_find_download_unlocked (GstGLDisplay * display,
GstVideoFormat v_format, guint out_width, guint out_height)
return ret;
}
+/**
+ * gst_gl_display_find_download:
+ * @display: a #GstGLDisplay
+ * @v_format: a #GstVideoFormat
+ * @out_width: the width to download to
+ * @out_height: the height to download to
+ *
+ * Finds a #GstGLDownload with the required download settings, creating one
+ * if needed. The returned object may not be initialized so you still
+ * have to call gst_gl_download_init_format.
+ *
+ * Returns: a #GstGLDownload object with the required settings
+ */
GstGLDownload *
gst_gl_display_find_download (GstGLDisplay * display, GstVideoFormat v_format,
guint out_width, guint out_height)
typedef struct _GstGLDownload GstGLDownload;
typedef struct _GstGLDownloadClass GstGLDownloadClass;
+/**
+ * GstGLDownload
+ * @parent: the parent object
+ * @lock: thread safety
+ * @display: a #GstGLDisplay
+ * @info: the output video info
+ *
+ * Download information about GL textures
+ */
struct _GstGLDownload
{
GObject parent;
GstGLDisplay *display;
+ /* output data */
+ GstVideoInfo info;
+
+ /* <private> */
gpointer data[GST_VIDEO_MAX_PLANES];
gboolean initted;
GLint shader_attr_texture_loc;
#endif
- /* output data */
- GstVideoInfo info;
-
- /* <private> */
gpointer _reserved[GST_PADDING];
};
+/**
+ * GstGLDownloadClass:
+ *
+ * The #GstGLDownloadClass struct only contains private data
+ */
struct _GstGLDownloadClass
{
GObjectClass object_class;
};
+/**
+ * GST_GL_DOWNLOAD_FORMATS:
+ *
+ * The currently supported formats that can be downloaded
+ */
#ifndef OPENGL_ES2
# define GST_GL_DOWNLOAD_FORMATS "{ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, " \
"xBGR, ARGB, ABGR, I420, YV12, YUY2, UYVY, AYUV }"
# define GST_GL_DOWNLOAD_FORMATS "{ RGB, RGBx, RGBA, I420, YV12, YUY2, UYVY, AYUV }"
#endif /* !OPENGL_ES2 */
+/**
+ * GST_GL_DOWNLOAD_VIDEO_CAPS:
+ *
+ * The currently supported #GstCaps that can be downloaded
+ */
#define GST_GL_DOWNLOAD_VIDEO_CAPS GST_VIDEO_CAPS_MAKE (GST_GL_DOWNLOAD_FORMATS)
GstGLDownload * gst_gl_download_new (GstGLDisplay * display);
return TRUE;
}
+/**
+ * gst_gl_filter_filter_texture:
+ * @filter: a #GstGLFilter
+ * @inbuf: an input buffer
+ * @outbuf: an output buffer
+ *
+ * Perform automatic upload if needed, call filter_texture vfunc and then an
+ * automatic download if needed.
+ *
+ * Returns: whether the transformation succeeded
+ */
gboolean
gst_gl_filter_filter_texture (GstGLFilter * filter, GstBuffer * inbuf,
GstBuffer * outbuf)
* @target: the output texture
* @shader: the shader to use.
*
- * Transforms @input into @output using @shader on through FBO. @resize should
+ * Transforms @input into @output using @shader on FBO. @resize should
* only ever be %TRUE whenever @input is the input texture of @filter.
*
- * See also: #gst_gl_filter_render_to_target()
+ * See also: gst_gl_filter_render_to_target()
*/
/* attach target to a FBO, use shader, pass input as "tex" uniform to
* the shader, render input to a quad */
G_BEGIN_DECLS
+GType gst_gl_filter_get_type(void);
#define GST_TYPE_GL_FILTER (gst_gl_filter_get_type())
#define GST_GL_FILTER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GL_FILTER,GstGLFilter))
#define GST_IS_GL_FILTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GL_FILTER))
#define GST_GL_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_GL_FILTER,GstGLFilterClass))
#define GST_IS_GL_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_GL_FILTER))
#define GST_GL_FILTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_GL_FILTER,GstGLFilterClass))
+
typedef struct _GstGLFilter GstGLFilter;
typedef struct _GstGLFilterClass GstGLFilterClass;
-
-typedef gboolean (*GstGLFilterSetCaps) (GstGLFilter* filter,
- GstCaps* incaps, GstCaps* outcaps);
-typedef gboolean (*GstGLFilterProcessFunc) (GstGLFilter *filter,
- GstBuffer *inbuf, GstBuffer *outbuf);
-typedef gboolean (*GstGLFilterProcessTexture) (GstGLFilter *filter,
- guint in_tex, guint out_tex);
-typedef gboolean (*GstGLFilterOnInitFBO) (GstGLFilter *filter);
-typedef void (*GstGLFilterOnReset) (GstGLFilter *filter);
-typedef void (*GstGLFilterOnStart) (GstGLFilter *filter);
-typedef void (*GstGLFilterOnStop) (GstGLFilter *filter);
-
-typedef void (*GstGLFilterGLStartFunc) (GstGLFilter *filter);
-typedef void (*GstGLFilterGLStopFunc) (GstGLFilter *filter);
-
+/**
+ * GstGLFilter:
+ * @base_transform: parent #GstBaseTransform
+ * @pool: the currently configured #GstBufferPool
+ * @display: the currently configured #GstGLDisplay
+ * @in_info: the video info for input buffers
+ * @out_info: the video info for output buffers
+ * @fbo: GL Framebuffer object used for transformations
+ * @depthbuffer: GL renderbuffer attached to @fbo
+ * @upload: the object used for uploading data, if needed
+ * @download: the object used for downloading data, if needed
+ *
+ * #GstGLFilter is a base class that provides the logic of getting the GL context
+ * from downstream and automatic upload/download for non-#GstGLMemory
+ * #GstBuffer<!-- -->s.
+ */
struct _GstGLFilter
{
- GstBaseTransform base_transform;
+ GstBaseTransform base_transform;
- GstBufferPool *pool;
+ GstBufferPool *pool;
- GstGLDisplay *display;
+ GstGLDisplay *display;
- GstVideoInfo in_info;
- GstVideoInfo out_info;
- GLuint fbo;
- GLuint depthbuffer;
+ GstVideoInfo in_info;
+ GstVideoInfo out_info;
+ GLuint fbo;
+ GLuint depthbuffer;
- GstGLShader *default_shader;
+ GstGLUpload *upload;
+ GstGLDownload *download;
- GLuint in_tex_id;
- GLuint out_tex_id;
- GstGLUpload *upload;
- GstGLDownload *download;
+ /* <private> */
+ GLuint in_tex_id;
+ GLuint out_tex_id;
- gulong external_gl_context;
+ GstGLShader *default_shader;
+
+ gulong external_gl_context;
};
+/**
+ * GstGLFilterClass:
+ * @base_transform_class: parent class
+ * @set_caps: mirror from #GstBaseTransform
+ * @filter: perform operations on the input and output buffers. In general,
+ * you should avoid using this method if at all possible. One valid
+ * use-case for using this is keeping previous buffers for future calculations.
+ * Note: If @filter exists, then @filter_texture is not run
+ * @filter_texture: given @in_tex, transform it into @out_tex. Not used
+ * if @filter exists
+ * @onInitFBO: perform initialization when the Framebuffer object is created
+ * @onStart: called when element activates see also #GstBaseTransform
+ * @onStop: called when the element deactivates e also #GstBaseTransform
+ * @onReset: called on inizialation and after @onStop
+ * @display_init_cb: execute arbitrary gl code on start
+ * @display_reset_cb: execute arbitrary gl code at stop
+ */
struct _GstGLFilterClass
{
GstBaseTransformClass base_transform_class;
- GstGLFilterSetCaps set_caps;
- GstGLFilterProcessFunc filter;
- GstGLFilterProcessTexture filter_texture;
- GstGLFilterOnInitFBO onInitFBO;
- GstGLFilterOnStart onStart;
- GstGLFilterOnStop onStop;
- GstGLFilterOnReset onReset;
+ gboolean (*set_caps) (GstGLFilter* filter, GstCaps* incaps, GstCaps* outcaps);
+ gboolean (*filter) (GstGLFilter *filter, GstBuffer *inbuf, GstBuffer *outbuf);
+ gboolean (*filter_texture) (GstGLFilter *filter, guint in_tex, guint out_tex);
+ gboolean (*onInitFBO) (GstGLFilter *filter);
+
+ void (*onStart) (GstGLFilter *filter);
+ void (*onStop) (GstGLFilter *filter);
+ void (*onReset) (GstGLFilter *filter);
/* useful to init and cleanup custom gl resources */
- GstGLFilterGLStartFunc display_init_cb; /* run arbitrary gl code at start */
- GstGLFilterGLStopFunc display_reset_cb; /* run arbitrary gl code at stop */
+ void (*display_init_cb) (GstGLFilter *filter);
+ void (*display_reset_cb) (GstGLFilter *filter);
};
-GType gst_gl_filter_get_type(void);
-
gboolean gst_gl_filter_filter_texture (GstGLFilter * filter, GstBuffer * inbuf,
GstBuffer * outbuf);
-void
-gst_gl_filter_render_to_target (GstGLFilter *filter, gboolean resize, GLuint input,
- GLuint target, GLCB func, gpointer data);
+void gst_gl_filter_render_to_target (GstGLFilter *filter, gboolean resize, GLuint input,
+ GLuint target, GLCB func, gpointer data);
#ifndef OPENGL_ES2
-void
-gst_gl_filter_render_to_target_with_shader (GstGLFilter * filter, gboolean resize,
- GLuint input, GLuint target, GstGLShader *shader);
+void gst_gl_filter_render_to_target_with_shader (GstGLFilter * filter, gboolean resize,
+ GLuint input, GLuint target, GstGLShader *shader);
void gst_gl_filter_draw_texture (GstGLFilter *filter, GLuint texture, guint width, guint height);
-#endif
+#endif /* !OPENGL_ES2 */
G_END_DECLS
-#endif
-
+#endif /* _GST_GL_FILTER_H_ */
#include "gstglmemory.h"
+/**
+ * SECTION:gstglmemory
+ * @short_description: memory subclass for GL textures
+ * @see_also: #GstMemory, #GstAllocator, #GstGLBufferPool
+ *
+ * GstGLMemory is a #GstMemory subclass providing support for the mapping of
+ * GL textures.
+ *
+ * #GstGLMemory is created through gst_gl_memory_alloc() or system memory can
+ * be wrapped through gst_gl_memory_wrapped().
+ *
+ * Data is uploaded or downloaded from the GPU as is necessary.
+ */
+
GST_DEBUG_CATEGORY_STATIC (GST_CAT_GL_MEMORY);
#define GST_CAT_DEFUALT GST_CAT_GL_MEMORY
* @format: the format for the texture
* @width: width of the texture
* @height: height of the texture
- *
- * Returns: a GstMemory object with a GL texture specified by @format, @width and @height
+ *
+ * Returns: a #GstMemory object with a GL texture specified by @format, @width and @height
* from @display
*/
GstMemory *
* @user_data: data called with for @notify
* @notify: function called with @user_data when @data needs to be freed
*
- * Returns: a GstMemory object with a GL texture specified by @format, @width and @height
+ * Returns: a #GstGLMemory object with a GL texture specified by @format, @width and @height
* from @display and contents specified by @data
*/
GstGLMemory *
* gst_is_gl_memory:
* @mem:a #GstMemory
*
- * Returns: whether the memory in @mem is a #GstGLMemory
+ * Returns: whether the memory at @mem is a #GstGLMemory
*/
gboolean
gst_is_gl_memory (GstMemory * mem)
G_BEGIN_DECLS
-typedef struct _GstGLUpload GstGLUpload;
-typedef struct _GstGLDownload GstGLDownload;
-
#define GST_TYPE_GL_ALLOCATOR (gst_gl_allocator_get_type())
GType gst_gl_allocator_get_type(void);
typedef struct _GstGLAllocator GstGLAllocator;
typedef struct _GstGLAllocatorClass GstGLAllocatorClass;
+/**
+ * GstGLMemoryFlags:
+ *
+ * Flags indicating the current state of a #GstGLMemory
+ */
typedef enum
{
GST_GL_MEMORY_FLAG_DOWNLOAD_INITTED = (GST_MEMORY_FLAG_LAST << 0),
/**
* GstGLMemory:
* @mem: the parent object
- * @display: the #GstGLDisplay to use
- * @tex_id: the texture id
+ * @display: the #GstGLDisplay to use for GL operations
+ * @tex_id: the texture id for this memory
+ * @v_format: the video format of this texture
* @gl_format: the format of the texture
* @width: width of the texture
* @height: height of the texture
+ * @download: the object used to download this texture into @v_format
+ * @upload: the object used to upload this texture from @v_format
*
* Represents information about a GL texture
*/
GLuint height;
GstGLDownload *download;
- GLenum render_target;
GstGLUpload *upload;
+ /* <private> */
GstMapFlags map_flags;
gpointer data;
gpointer user_data;
};
+/**
+ * GST_GL_MEMORY_ALLOCATOR:
+ *
+ * The name of the GL memore allocator
+ */
#define GST_GL_MEMORY_ALLOCATOR "GLMemory"
+/**
+ * GST_GL_MEMORY_FLAGS:
+ * @mem: a #GstGLMemory
+ *
+ * Get the currently set flags on @mem
+ */
#define GST_GL_MEMORY_FLAGS(mem) GST_MEMORY_FLAGS(mem)
+
+/**
+ * GST_GL_MEMORY_FLAG_IS_SET:
+ * @mem: a #GstGLMemory
+ * @flag: a flag
+ *
+ * Returns: Whether @flag is set on @mem
+ */
#define GST_GL_MEMORY_FLAG_IS_SET(mem,flag) GST_MEMORY_FLAG_IS_SET(mem,flag)
+
+/**
+ * GST_GL_MEMORY_FLAG_SET:
+ * @mem: a #GstGLMemory
+ * @flag: a flag
+ *
+ * Set @flag on @mem
+ */
#define GST_GL_MEMORY_FLAG_SET(mem,flag) GST_MINI_OBJECT_FLAG_SET(mem,flag)
+
+/**
+ * GST_GL_MEMORY_FLAG_UNSET:
+ * @mem: a #GstGLMemory
+ * @flag: a flag
+ *
+ * Unset @flag on @mem
+ */
#define GST_GL_MEMORY_FLAG_UNSET(mem,flag) GST_MEMORY_FLAG_UNSET(mem,flag)
void gst_gl_memory_init (void);
gboolean gst_is_gl_memory (GstMemory * mem);
+/**
+ * GstGLAllocator
+ *
+ * Opaque #GstGLAllocator struct
+ */
struct _GstGLAllocator
{
GstAllocator parent;
};
+/**
+ * GstGLAllocatorClass:
+ *
+ * The #GstGLAllocatorClass only contains private data
+ */
struct _GstGLAllocatorClass
{
GstAllocatorClass parent_class;
#include "gstglupload.h"
#include "gstglmemory.h"
+/**
+ * SECTION:gstglupload
+ * @short_description: an object that uploads to GL textures
+ * @see_also: #GstGLDownload, #GstGLMemory
+ *
+ * #GstGLUpload is an object that uploads data from system memory into GL textures.
+ *
+ * A #GstGLUpload can be created with gst_gl_upload_new() or found with
+ * gst_gl_display_find_upload().
+ *
+ * All of the _thread() variants should only be called within the GL thread
+ * they don't try to take a lock on the associated #GstGLDisplay and
+ * don't dispatch to the GL thread. Rather they run the required code in the
+ * calling thread.
+ */
+
static void _do_upload (GstGLDisplay * display, GstGLUpload * upload);
static void _do_upload_draw (GstGLDisplay * display, GstGLUpload * upload);
static void _do_upload_fill (GstGLDisplay * display, GstGLUpload * upload);
gst_video_info_init (&upload->info);
}
+/**
+ * gst_gl_upload_new:
+ * @display: a #GstGLDisplay
+ *
+ * Returns: a new #GstGLUpload object
+ */
GstGLUpload *
gst_gl_upload_new (GstGLDisplay * display)
{
}
}
+/**
+ * gst_gl_upload_init_format:
+ * @upload: a #GstGLUpload
+ * @v_format: a #GstVideoFormat
+ * @in_width: the width of the data to upload
+ * @in_height: the height of the data to upload
+ * @out_width: the width to upload to
+ * @out_height: the height to upload to
+ *
+ * Initializes @upload with the information required for upload.
+ *
+ * Returns: whether the initialization was successful
+ */
gboolean
gst_gl_upload_init_format (GstGLUpload * upload, GstVideoFormat v_format,
guint in_width, guint in_height, guint out_width, guint out_height)
return TRUE;
}
+/**
+ * gst_gl_upload_init_format:
+ * @upload: a #GstGLUpload
+ * @v_format: a #GstVideoFormat
+ * @in_width: the width of the data to upload
+ * @in_height: the height of the data to upload
+ * @out_width: the width to upload to
+ * @out_height: the height to upload to
+ *
+ * Initializes @upload with the information required for upload.
+ *
+ * Returns: whether the initialization was successful
+ */
gboolean
gst_gl_upload_init_format_thread (GstGLUpload * upload, GstVideoFormat v_format,
guint in_width, guint in_height, guint out_width, guint out_height)
return TRUE;
}
+/**
+ * gst_gl_upload_perform_with_memory:
+ * @upload: a #GstGLUpload
+ * @gl_mem: a #GstGLMemory
+ *
+ * Uploads the texture in @gl_mem
+ *
+ * Returns: whether the upload was successful
+ */
gboolean
gst_gl_upload_perform_with_memory (GstGLUpload * upload, GstGLMemory * gl_mem)
{
return ret;
}
+/**
+ * gst_gl_upload_perform_with_data:
+ * @upload: a #GstGLUpload
+ * @texture_id: the texture id to download
+ * @data: where the downloaded data should go
+ *
+ * Uploads @data into @texture_id. @data size and format is specified by
+ * the #GstVideoFormat passed to gst_gl_upload_init_format()
+ *
+ * Returns: whether the upload was successful
+ */
gboolean
gst_gl_upload_perform_with_data (GstGLUpload * upload, GLuint texture_id,
gpointer data[GST_VIDEO_MAX_PLANES])
return TRUE;
}
+/**
+ * gst_gl_upload_perform_with_memory_thread:
+ * @upload: a #GstGLUpload
+ * @gl_mem: a #GstGLMemory
+ *
+ * Uploads the texture in @gl_mem
+ *
+ * Returns: whether the upload was successful
+ */
gboolean
gst_gl_upload_perform_with_memory_thread (GstGLUpload * upload,
GstGLMemory * gl_mem)
return ret;
}
+/**
+ * gst_gl_upload_perform_with_data_thread:
+ * @upload: a #GstGLUpload
+ * @texture_id: the texture id to download
+ * @data: where the downloaded data should go
+ *
+ * Uploads @data into @texture_id. @data size and format is specified by
+ * the #GstVideoFormat passed to gst_gl_upload_init_format()
+ *
+ * Returns: whether the upload was successful
+ */
gboolean
gst_gl_upload_perform_with_data_thread (GstGLUpload * upload, GLuint texture_id,
gpointer data[GST_VIDEO_MAX_PLANES])
return TRUE;
}
+/**
+ * gst_gl_display_find_upload_unlocked:
+ * @display: a #GstGLDisplay
+ * @v_format: a #GstVideoFormat
+ * @in_width: the width of the data to upload
+ * @in_height: the height of the data to upload
+ * @out_width: the width to upload to
+ * @out_height: the height to upload to
+ *
+ * Finds a #GstGLDownload with the required upload settings, creating one
+ * if needed. The returned object may not be initialized so you still
+ * have to call gst_gl_upload_init_format.
+ *
+ * This function is safe to be called in the GL thread
+ *
+ * Returns: a #GstGLUpload object with the required settings
+ */
GstGLUpload *
gst_gl_display_find_upload_unlocked (GstGLDisplay * display,
GstVideoFormat v_format, guint in_width, guint in_height,
return ret;
}
+/**
+ * gst_gl_display_find_upload:
+ * @display: a #GstGLDisplay
+ * @v_format: a #GstVideoFormat
+ * @in_width: the width of the data to upload
+ * @in_height: the height of the data to upload
+ * @out_width: the width to upload to
+ * @out_height: the height to upload to
+ *
+ * Finds a #GstGLDownload with the required upload settings, creating one
+ * if needed. The returned object may not be initialized so you still
+ * have to call gst_gl_upload_init_format.
+ *
+ * Returns: a #GstGLUpload object with the required settings
+ */
GstGLUpload *
gst_gl_display_find_upload (GstGLDisplay * display, GstVideoFormat v_format,
guint in_width, guint in_height, guint out_width, guint out_height)
typedef struct _GstGLUpload GstGLUpload;
typedef struct _GstGLUploadClass GstGLUploadClass;
+/**
+ * GstGLUpload
+ * @parent: the parent object
+ * @lock: thread safety
+ * @display: a #GstGLDisplay
+ * @info: the output video info
+ *
+ * Upload information for GL textures
+ */
struct _GstGLUpload
{
GObject parent;
GstGLDisplay *display;
+ /* input data */
+ GstVideoInfo info;
+
+ /* <private> */
gpointer data[GST_VIDEO_MAX_PLANES];
gboolean initted;
GLint shader_attr_texture_loc;
#endif
- /* input data */
- GstVideoInfo info;
-
/* <private> */
gpointer _reserved[GST_PADDING];
};
+/**
+ * GstGLUploadClass:
+ *
+ * The #GstGLUploadClass struct only contains private data
+ */
struct _GstGLUploadClass
{
GObjectClass object_class;
};
+/**
+ * GST_GL_UPLOAD_FORMATS:
+ *
+ * The currently supported formats that can be uploaded
+ */
#ifndef OPENGL_ES2
# define GST_GL_UPLOAD_FORMATS "{ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, " \
"xBGR, ARGB, ABGR, I420, YV12, YUY2, UYVY, AYUV }"
# define GST_GL_UPLOAD_FORMATS "{ RGB, RGBx, RGBA, I420, YV12, YUY2, UYVY, AYUV }"
#endif
+/**
+ * GST_GL_UPLOAD_VIDEO_CAPS:
+ *
+ * The currently supported #GstCaps that can be uploaded
+ */
#define GST_GL_UPLOAD_VIDEO_CAPS GST_VIDEO_CAPS_MAKE (GST_GL_UPLOAD_FORMATS)
GstGLUpload * gst_gl_upload_new (GstGLDisplay * display);