• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * GStreamer
3  * Copyright (C) 2015 Matthew Waters <matthew@centricular.com>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20 
21 #ifndef _GST_GL_MEMORY_H_
22 #define _GST_GL_MEMORY_H_
23 
24 #include <gst/gl/gstglbasememory.h>
25 #include <gst/gl/gstglformat.h>
26 
27 G_BEGIN_DECLS
28 
29 #define GST_TYPE_GL_MEMORY_ALLOCATOR (gst_gl_memory_allocator_get_type())
30 GST_GL_API
31 GType gst_gl_memory_allocator_get_type(void);
32 
33 #define GST_IS_GL_MEMORY_ALLOCATOR(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_MEMORY_ALLOCATOR))
34 #define GST_IS_GL_MEMORY_ALLOCATOR_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GL_MEMORY_ALLOCATOR))
35 #define GST_GL_MEMORY_ALLOCATOR_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GL_MEMORY_ALLOCATOR, GstGLMemoryAllocatorClass))
36 #define GST_GL_MEMORY_ALLOCATOR(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_MEMORY_ALLOCATOR, GstGLMemoryAllocator))
37 #define GST_GL_MEMORY_ALLOCATOR_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GL_MEMORY_ALLOCATOR, GstGLMemoryAllocatorClass))
38 #define GST_GL_MEMORY_ALLOCATOR_CAST(obj)            ((GstGLMemoryAllocator *)(obj))
39 
40 #define GST_GL_MEMORY_CAST(obj) ((GstGLMemory *) obj)
41 
42 /**
43  * GST_CAPS_FEATURE_MEMORY_GL_MEMORY:
44  *
45  * Name of the caps feature for indicating the use of #GstGLMemory
46  */
47 #define GST_CAPS_FEATURE_MEMORY_GL_MEMORY "memory:GLMemory"
48 /**
49  * GST_GL_MEMORY_VIDEO_EXT_FORMATS: (skip)
50  */
51 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
52 #define GST_GL_MEMORY_VIDEO_EXT_FORMATS \
53     ", BGR10A2_LE, RGB10A2_LE, P010_10LE, P012_LE, P016_LE, Y212_LE, Y412_LE"
54 #else
55 #define GST_GL_MEMORY_VIDEO_EXT_FORMATS \
56     ", P010_10BE, P012_BE, P016_BE, Y212_BE, Y412_BE"
57 #endif
58 
59 /**
60  * GST_GL_MEMORY_VIDEO_FORMATS_STR:
61  *
62  * List of video formats that are supported by #GstGLMemory
63  */
64 #define GST_GL_MEMORY_VIDEO_FORMATS_STR \
65     "{ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, GBRA, GBR, RGBP, BGRP, RGB, BGR, RGB16, BGR16, " \
66     "AYUV, VUYA, Y410, I420, YV12, NV12, NV21, NV16, NV61, YUY2, UYVY, Y210, Y41B, " \
67     "Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE, ARGB64, A420, AV12" \
68     GST_GL_MEMORY_VIDEO_EXT_FORMATS "}"
69 
70 /**
71  * GstGLMemory:
72  * @mem: the parent #GstGLBaseMemory object
73  * @tex_id: the GL texture id for this memory
74  * @tex_target: the GL texture target for this memory
75  * @tex_format: the texture type
76  * @info: the texture's #GstVideoInfo
77  * @valign: data alignment for system memory mapping
78  * @plane: data plane in @info
79  * @tex_scaling: GL shader scaling parameters for @valign and/or width/height
80  *
81  * Represents information about a GL texture
82  */
83 struct _GstGLMemory
84 {
85   GstGLBaseMemory           mem;
86 
87   guint                     tex_id;
88   GstGLTextureTarget        tex_target;
89   GstGLFormat               tex_format;
90   GstVideoInfo              info;
91   GstVideoAlignment         valign;
92   guint                     plane;
93   gfloat                    tex_scaling[2];
94 
95   /*< protected >*/
96   gboolean                  texture_wrapped;
97   guint                     unpack_length;
98   guint                     tex_width;
99 
100   /*< private >*/
101   gpointer                  _padding[GST_PADDING];
102 };
103 
104 
105 #define GST_TYPE_GL_VIDEO_ALLOCATION_PARAMS (gst_gl_video_allocation_params_get_type())
106 GST_GL_API
107 GType gst_gl_video_allocation_params_get_type (void);
108 
109 typedef struct _GstGLVideoAllocationParams GstGLVideoAllocationParams;
110 
111 /**
112  * GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO:
113  *
114  * GL allocation flag indicating the allocation of 2D video frames
115  */
116 #define GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO (1 << 3)
117 
118 /**
119  * GstGLVideoAllocationParams:
120  * @parent: the parent #GstGLAllocationParams structure
121  * @v_info: the #GstVideoInfo to allocate
122  * @plane: the video plane index to allocate
123  * @valign: the #GstVideoAlignment to align the system representation to (may be %NULL for the default)
124  * @target: the #GstGLTextureTarget to allocate
125  * @tex_format: the #GstGLFormat to allocate
126  */
127 struct _GstGLVideoAllocationParams
128 {
129   GstGLAllocationParams  parent;
130 
131   GstVideoInfo          *v_info;
132   guint                  plane;
133   GstVideoAlignment     *valign;
134   GstGLTextureTarget     target;
135   GstGLFormat            tex_format;
136 
137   /*< private >*/
138   gpointer               _padding[GST_PADDING];
139 };
140 
141 GST_GL_API
142 gboolean        gst_gl_video_allocation_params_init_full        (GstGLVideoAllocationParams * params,
143                                                                  gsize struct_size,
144                                                                  guint alloc_flags,
145                                                                  GstGLAllocationParamsCopyFunc copy,
146                                                                  GstGLAllocationParamsFreeFunc free,
147                                                                  GstGLContext * context,
148                                                                  const GstAllocationParams * alloc_params,
149                                                                  const GstVideoInfo * v_info,
150                                                                  guint plane,
151                                                                  const GstVideoAlignment * valign,
152                                                                  GstGLTextureTarget target,
153                                                                  GstGLFormat tex_format,
154                                                                  gpointer wrapped_data,
155                                                                  gpointer gl_handle,
156                                                                  gpointer user_data,
157                                                                  GDestroyNotify notify);
158 GST_GL_API
159 GstGLVideoAllocationParams * gst_gl_video_allocation_params_new (GstGLContext * context,
160                                                                  const GstAllocationParams * alloc_params,
161                                                                  const GstVideoInfo * v_info,
162                                                                  guint plane,
163                                                                  const GstVideoAlignment * valign,
164                                                                  GstGLTextureTarget target,
165                                                                  GstGLFormat tex_format);
166 GST_GL_API
167 GstGLVideoAllocationParams * gst_gl_video_allocation_params_new_wrapped_data    (GstGLContext * context,
168                                                                                  const GstAllocationParams * alloc_params,
169                                                                                  const GstVideoInfo * v_info,
170                                                                                  guint plane,
171                                                                                  const GstVideoAlignment * valign,
172                                                                                  GstGLTextureTarget target,
173                                                                                  GstGLFormat tex_format,
174                                                                                  gpointer wrapped_data,
175                                                                                  gpointer user_data,
176                                                                                  GDestroyNotify notify);
177 
178 GST_GL_API
179 GstGLVideoAllocationParams * gst_gl_video_allocation_params_new_wrapped_texture (GstGLContext * context,
180                                                                                  const GstAllocationParams * alloc_params,
181                                                                                  const GstVideoInfo * v_info,
182                                                                                  guint plane,
183                                                                                  const GstVideoAlignment * valign,
184                                                                                  GstGLTextureTarget target,
185                                                                                  GstGLFormat tex_format,
186                                                                                  guint tex_id,
187                                                                                  gpointer user_data,
188                                                                                  GDestroyNotify notify);
189 
190 GST_GL_API
191 GstGLVideoAllocationParams * gst_gl_video_allocation_params_new_wrapped_gl_handle (GstGLContext * context,
192                                                                                  const GstAllocationParams * alloc_params,
193                                                                                  const GstVideoInfo * v_info,
194                                                                                  guint plane,
195                                                                                  const GstVideoAlignment * valign,
196                                                                                  GstGLTextureTarget target,
197                                                                                  GstGLFormat tex_format,
198                                                                                  gpointer gl_handle,
199                                                                                  gpointer user_data,
200                                                                                  GDestroyNotify notify);
201 
202 /* subclass usage */
203 GST_GL_API
204 void            gst_gl_video_allocation_params_free_data    (GstGLVideoAllocationParams * params);
205 /* subclass usage */
206 GST_GL_API
207 void            gst_gl_video_allocation_params_copy_data    (GstGLVideoAllocationParams * src_vid,
208                                                              GstGLVideoAllocationParams * dest_vid);
209 
210 /**
211  * GstGLMemoryAllocator
212  *
213  * Opaque #GstGLMemoryAllocator struct
214  */
215 struct _GstGLMemoryAllocator
216 {
217   /*< private >*/
218   GstGLBaseMemoryAllocator parent;
219 
220   gpointer _padding[GST_PADDING];
221 };
222 
223 /**
224  * GstGLMemoryAllocatorClass:
225  * @map: provide a custom map implementation
226  * @copy: provide a custom copy implementation
227  * @unmap: provide a custom unmap implementation
228  */
229 struct _GstGLMemoryAllocatorClass
230 {
231   /*< private >*/
232   GstGLBaseMemoryAllocatorClass             parent_class;
233 
234   /*< public >*/
235   GstGLBaseMemoryAllocatorMapFunction       map;
236   GstGLBaseMemoryAllocatorCopyFunction      copy;
237   GstGLBaseMemoryAllocatorUnmapFunction     unmap;
238 
239   /*< private >*/
240   gpointer                                  _padding[GST_PADDING];
241 };
242 
243 #include <gst/gl/gstglbasememory.h>
244 
245 /**
246  * GST_GL_MEMORY_ALLOCATOR_NAME:
247  *
248  * The name of the GL memory allocator
249  */
250 #define GST_GL_MEMORY_ALLOCATOR_NAME   "GLMemory"
251 
252 /**
253  * GST_TYPE_GL_MEMORY:
254  *
255  * Since: 1.20
256  */
257 #define GST_TYPE_GL_MEMORY (gst_gl_memory_get_type())
258 GST_GL_API
259 GType gst_gl_memory_get_type(void);
260 
261 GST_GL_API
262 void            gst_gl_memory_init_once (void);
263 GST_GL_API
264 gboolean        gst_is_gl_memory (GstMemory * mem);
265 
266 GST_GL_API
267 void            gst_gl_memory_init              (GstGLMemory * mem,
268                                                  GstAllocator * allocator,
269                                                  GstMemory * parent,
270                                                  GstGLContext * context,
271                                                  GstGLTextureTarget target,
272                                                  GstGLFormat tex_format,
273                                                  const GstAllocationParams *params,
274                                                  const GstVideoInfo * info,
275                                                  guint plane,
276                                                  const GstVideoAlignment *valign,
277                                                  gpointer user_data,
278                                                  GDestroyNotify notify);
279 
280 GST_GL_API
281 gboolean        gst_gl_memory_copy_into         (GstGLMemory *gl_mem,
282                                                  guint tex_id,
283                                                  GstGLTextureTarget target,
284                                                  GstGLFormat tex_format,
285                                                  gint width,
286                                                  gint height);
287 GST_GL_API
288 gboolean        gst_gl_memory_copy_teximage     (GstGLMemory * src,
289                                                  guint tex_id,
290                                                  GstGLTextureTarget out_target,
291                                                  GstGLFormat out_tex_format,
292                                                  gint out_width,
293                                                  gint out_height);
294 
295 GST_GL_API
296 gboolean        gst_gl_memory_read_pixels       (GstGLMemory * gl_mem,
297                                                  gpointer write_pointer);
298 GST_GL_API
299 void            gst_gl_memory_texsubimage       (GstGLMemory * gl_mem,
300                                                  gpointer read_pointer);
301 
302 /* accessors */
303 GST_GL_API
304 gint                    gst_gl_memory_get_texture_width     (GstGLMemory * gl_mem);
305 GST_GL_API
306 gint                    gst_gl_memory_get_texture_height    (GstGLMemory * gl_mem);
307 GST_GL_API
308 GstGLFormat             gst_gl_memory_get_texture_format    (GstGLMemory * gl_mem);
309 GST_GL_API
310 GstGLTextureTarget      gst_gl_memory_get_texture_target    (GstGLMemory * gl_mem);
311 GST_GL_API
312 guint                   gst_gl_memory_get_texture_id        (GstGLMemory * gl_mem);
313 
314 GST_GL_API
315 gboolean                gst_gl_memory_setup_buffer          (GstGLMemoryAllocator * allocator,
316                                                              GstBuffer * buffer,
317                                                              GstGLVideoAllocationParams * params,
318                                                              GstGLFormat *tex_formats,
319                                                              gpointer *wrapped_data,
320                                                              gsize n_wrapped_pointers);
321 
322 GST_GL_API
323 GstGLMemoryAllocator *  gst_gl_memory_allocator_get_default (GstGLContext *context);
324 
325 G_END_DECLS
326 
327 #endif /* _GST_GL_MEMORY_H_ */
328