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
27G_BEGIN_DECLS
28
29#define GST_TYPE_GL_MEMORY_ALLOCATOR (gst_gl_memory_allocator_get_type())
30GST_GL_API
31GType 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_FORMATS_STR:
50 *
51 * List of video formats that are supported by #GstGLMemory
52 */
53#define GST_GL_MEMORY_VIDEO_FORMATS_STR \
54 "{ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, " \
55 "AYUV, VUYA, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, " \
56 "GRAY8, GRAY16_LE, GRAY16_BE, ARGB64 }"
57
58/**
59 * GstGLMemory:
60 * @mem: the parent #GstGLBaseMemory object
61 * @tex_id: the GL texture id for this memory
62 * @tex_target: the GL texture target for this memory
63 * @tex_format: the texture type
64 * @info: the texture's #GstVideoInfo
65 * @valign: data alignment for system memory mapping
66 * @plane: data plane in @info
67 * @tex_scaling: GL shader scaling parameters for @valign and/or width/height
68 *
69 * Represents information about a GL texture
70 */
71struct _GstGLMemory
72{
73 GstGLBaseMemory mem;
74
75 guint tex_id;
76 GstGLTextureTarget tex_target;
77 GstGLFormat tex_format;
78 GstVideoInfo info;
79 GstVideoAlignment valign;
80 guint plane;
81 gfloat tex_scaling[2];
82
83 /* <protected> */
84 gboolean texture_wrapped;
85 guint unpack_length;
86 guint tex_width;
87
88 /* <private> */
89 gpointer _padding[GST_PADDING];
90};
91
92
93#define GST_TYPE_GL_VIDEO_ALLOCATION_PARAMS (gst_gl_video_allocation_params_get_type())
94GST_GL_API
95GType gst_gl_video_allocation_params_get_type (void);
96
97typedef struct _GstGLVideoAllocationParams GstGLVideoAllocationParams;
98
99/**
100 * GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO:
101 *
102 * GL allocation flag indicating the allocation of 2D video frames
103 */
104#define GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO (1 << 3)
105
106/**
107 * GstGLVideoAllocationParams:
108 * @parent: the parent #GstGLAllocationParams structure
109 * @v_info: the #GstVideoInfo to allocate
110 * @plane: the video plane index to allocate
111 * @valign: the #GstVideoAlignment to align the system representation to (may be %NULL for the default)
112 * @target: the #GstGLTextureTarget to allocate
113 * @tex_format: the #GstGLFormat to allocate
114 */
115struct _GstGLVideoAllocationParams
116{
117 GstGLAllocationParams parent;
118
119 GstVideoInfo *v_info;
120 guint plane;
121 GstVideoAlignment *valign;
122 GstGLTextureTarget target;
123 GstGLFormat tex_format;
124
125 /* <private> */
126 gpointer _padding[GST_PADDING];
127};
128
129GST_GL_API
130gboolean gst_gl_video_allocation_params_init_full (GstGLVideoAllocationParams * params,
131 gsize struct_size,
132 guint alloc_flags,
133 GstGLAllocationParamsCopyFunc copy,
134 GstGLAllocationParamsFreeFunc free,
135 GstGLContext * context,
136 GstAllocationParams * alloc_params,
137 GstVideoInfo * v_info,
138 guint plane,
139 GstVideoAlignment * valign,
140 GstGLTextureTarget target,
141 GstGLFormat tex_format,
142 gpointer wrapped_data,
143 gpointer gl_handle,
144 gpointer user_data,
145 GDestroyNotify notify);
146GST_GL_API
147GstGLVideoAllocationParams * gst_gl_video_allocation_params_new (GstGLContext * context,
148 GstAllocationParams * alloc_params,
149 GstVideoInfo * v_info,
150 guint plane,
151 GstVideoAlignment * valign,
152 GstGLTextureTarget target,
153 GstGLFormat tex_format);
154GST_GL_API
155GstGLVideoAllocationParams * gst_gl_video_allocation_params_new_wrapped_data (GstGLContext * context,
156 GstAllocationParams * alloc_params,
157 GstVideoInfo * v_info,
158 guint plane,
159 GstVideoAlignment * valign,
160 GstGLTextureTarget target,
161 GstGLFormat tex_format,
162 gpointer wrapped_data,
163 gpointer user_data,
164 GDestroyNotify notify);
165
166GST_GL_API
167GstGLVideoAllocationParams * gst_gl_video_allocation_params_new_wrapped_texture (GstGLContext * context,
168 GstAllocationParams * alloc_params,
169 GstVideoInfo * v_info,
170 guint plane,
171 GstVideoAlignment * valign,
172 GstGLTextureTarget target,
173 GstGLFormat tex_format,
174 guint tex_id,
175 gpointer user_data,
176 GDestroyNotify notify);
177
178GST_GL_API
179GstGLVideoAllocationParams * gst_gl_video_allocation_params_new_wrapped_gl_handle (GstGLContext * context,
180 GstAllocationParams * alloc_params,
181 GstVideoInfo * v_info,
182 guint plane,
183 GstVideoAlignment * valign,
184 GstGLTextureTarget target,
185 GstGLFormat tex_format,
186 gpointer gl_handle,
187 gpointer user_data,
188 GDestroyNotify notify);
189
190/* subclass usage */
191GST_GL_API
192void gst_gl_video_allocation_params_free_data (GstGLVideoAllocationParams * params);
193/* subclass usage */
194GST_GL_API
195void gst_gl_video_allocation_params_copy_data (GstGLVideoAllocationParams * src_vid,
196 GstGLVideoAllocationParams * dest_vid);
197
198/**
199 * GstGLMemoryAllocator
200 *
201 * Opaque #GstGLMemoryAllocator struct
202 */
203struct _GstGLMemoryAllocator
204{
205 /* <private> */
206 GstGLBaseMemoryAllocator parent;
207
208 gpointer _padding[GST_PADDING];
209};
210
211/**
212 * GstGLMemoryAllocatorClass:
213 * @map: provide a custom map implementation
214 * @copy: provide a custom copy implementation
215 * @unmap: provide a custom unmap implementation
216 */
217struct _GstGLMemoryAllocatorClass
218{
219 /* <private> */
220 GstGLBaseMemoryAllocatorClass parent_class;
221
222 /* <public> */
223 GstGLBaseMemoryAllocatorMapFunction map;
224 GstGLBaseMemoryAllocatorCopyFunction copy;
225 GstGLBaseMemoryAllocatorUnmapFunction unmap;
226
227 /* <private> */
228 gpointer _padding[GST_PADDING];
229};
230
231#include <gst/gl/gstglbasememory.h>
232
233/**
234 * GST_GL_MEMORY_ALLOCATOR_NAME:
235 *
236 * The name of the GL memory allocator
237 */
238#define GST_GL_MEMORY_ALLOCATOR_NAME "GLMemory"
239
240GST_GL_API
241void gst_gl_memory_init_once (void);
242GST_GL_API
243gboolean gst_is_gl_memory (GstMemory * mem);
244
245GST_GL_API
246void gst_gl_memory_init (GstGLMemory * mem,
247 GstAllocator * allocator,
248 GstMemory * parent,
249 GstGLContext * context,
250 GstGLTextureTarget target,
251 GstGLFormat tex_format,
252 GstAllocationParams *params,
253 GstVideoInfo * info,
254 guint plane,
255 GstVideoAlignment *valign,
256 gpointer user_data,
257 GDestroyNotify notify);
258
259GST_GL_API
260gboolean gst_gl_memory_copy_into (GstGLMemory *gl_mem,
261 guint tex_id,
262 GstGLTextureTarget target,
263 GstGLFormat tex_format,
264 gint width,
265 gint height);
266GST_GL_API
267gboolean gst_gl_memory_copy_teximage (GstGLMemory * src,
268 guint tex_id,
269 GstGLTextureTarget out_target,
270 GstGLFormat out_tex_format,
271 gint out_width,
272 gint out_height);
273
274GST_GL_API
275gboolean gst_gl_memory_read_pixels (GstGLMemory * gl_mem,
276 gpointer read_pointer);
277GST_GL_API
278void gst_gl_memory_texsubimage (GstGLMemory * gl_mem,
279 gpointer read_pointer);
280
281/* accessors */
282GST_GL_API
283gint gst_gl_memory_get_texture_width (GstGLMemory * gl_mem);
284GST_GL_API
285gint gst_gl_memory_get_texture_height (GstGLMemory * gl_mem);
286GST_GL_API
287GstGLFormat gst_gl_memory_get_texture_format (GstGLMemory * gl_mem);
288GST_GL_API
289GstGLTextureTarget gst_gl_memory_get_texture_target (GstGLMemory * gl_mem);
290GST_GL_API
291guint gst_gl_memory_get_texture_id (GstGLMemory * gl_mem);
292
293GST_GL_API
294gboolean gst_gl_memory_setup_buffer (GstGLMemoryAllocator * allocator,
295 GstBuffer * buffer,
296 GstGLVideoAllocationParams * params,
297 GstGLFormat *tex_formats,
298 gpointer *wrapped_data,
299 gsize n_wrapped_pointers);
300
301GST_GL_API
302GstGLMemoryAllocator * gst_gl_memory_allocator_get_default (GstGLContext *context);
303
304G_END_DECLS
305
306#endif /* _GST_GL_MEMORY_H_ */
307