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