| 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_BASE_MEMORY_H_ | 
| 22 | #define _GST_GL_BASE_MEMORY_H_ | 
| 23 |  | 
| 24 | #include <gst/gst.h> | 
| 25 | #include <gst/gstallocator.h> | 
| 26 | #include <gst/gstmemory.h> | 
| 27 |  | 
| 28 | #include <gst/gl/gstgl_fwd.h> | 
| 29 |  | 
| 30 | G_BEGIN_DECLS | 
| 31 |  | 
| 32 | #define GST_TYPE_GL_BASE_MEMORY (gst_gl_base_memory_get_type()) | 
| 33 | GST_GL_API | 
| 34 | GType gst_gl_base_memory_get_type(void); | 
| 35 |  | 
| 36 | #define GST_TYPE_GL_BASE_MEMORY_ALLOCATOR (gst_gl_base_memory_allocator_get_type()) | 
| 37 | GST_GL_API | 
| 38 | GType gst_gl_base_memory_allocator_get_type(void); | 
| 39 |  | 
| 40 | #define GST_IS_GL_BASE_MEMORY_ALLOCATOR(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_BASE_MEMORY_ALLOCATOR)) | 
| 41 | #define GST_IS_GL_BASE_MEMORY_ALLOCATOR_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GL_BASE_MEMORY_ALLOCATOR)) | 
| 42 | #define GST_GL_BASE_MEMORY_ALLOCATOR_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GL_BASE_MEMORY_ALLOCATOR, GstGLBaseMemoryAllocatorClass)) | 
| 43 | #define GST_GL_BASE_MEMORY_ALLOCATOR(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_BASE_MEMORY_ALLOCATOR, GstGLBaseMemoryAllocator)) | 
| 44 | #define GST_GL_BASE_MEMORY_ALLOCATOR_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GL_BASE_MEMORY_ALLOCATOR, GstGLBaseMemoryAllocatorClass)) | 
| 45 | #define GST_GL_BASE_MEMORY_ALLOCATOR_CAST(obj)            ((GstGLBaseMemoryAllocator *)(obj)) | 
| 46 |  | 
| 47 | #define GST_GL_BASE_MEMORY_CAST(mem) ((GstGLBaseMemory *)mem) | 
| 48 |  | 
| 49 | GST_GL_API | 
| 50 | GQuark gst_gl_base_memory_error_quark (void); | 
| 51 | /** | 
| 52 |  * GST_GL_BASE_MEMORY_ERROR: | 
| 53 |  * | 
| 54 |  * Error domain for GStreamer's GL memory module. Errors in this domain will be | 
| 55 |  * from the #GstGLBaseMemoryError enumeration | 
| 56 |  */ | 
| 57 | #define GST_GL_BASE_MEMORY_ERROR (gst_gl_base_memory_error_quark ()) | 
| 58 |  | 
| 59 | /** | 
| 60 |  * GstGLBaseMemoryError: | 
| 61 |  * @GST_GL_BASE_MEMORY_ERROR_FAILED: generic failure | 
| 62 |  * @GST_GL_BASE_MEMORY_ERROR_OLD_LIBS: the implementation is too old and doesn't | 
| 63 |  *                                     implement enough features | 
| 64 |  * @GST_GL_BASE_MEMORY_ERROR_RESOURCE_UNAVAILABLE: a resource could not be found | 
| 65 |  */ | 
| 66 | typedef enum | 
| 67 | { | 
| 68 |   GST_GL_BASE_MEMORY_ERROR_FAILED, | 
| 69 |   GST_GL_BASE_MEMORY_ERROR_OLD_LIBS, | 
| 70 |   GST_GL_BASE_MEMORY_ERROR_RESOURCE_UNAVAILABLE, | 
| 71 | } GstGLBaseMemoryError; | 
| 72 |  | 
| 73 | /** | 
| 74 |  * GstGLBaseMemoryTransfer: | 
| 75 |  * @GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD: the texture needs downloading | 
| 76 |  *                                             to the data pointer | 
| 77 |  * @GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD:   the data pointer needs uploading | 
| 78 |  *                                             to the texture | 
| 79 |  */ | 
| 80 | typedef enum | 
| 81 | { | 
| 82 |   GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD   = (GST_MEMORY_FLAG_LAST << 0), | 
| 83 |   GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD     = (GST_MEMORY_FLAG_LAST << 1) | 
| 84 | } GstGLBaseMemoryTransfer; | 
| 85 |  | 
| 86 | /** | 
| 87 |  * GST_MAP_GL: | 
| 88 |  * | 
| 89 |  * Flag indicating that we should map the GL object instead of to system memory. | 
| 90 |  * | 
| 91 |  * Combining #GST_MAP_GL with #GST_MAP_WRITE has the same semantics as though | 
| 92 |  * you are writing to OpenGL. Conversely, combining #GST_MAP_GL with | 
| 93 |  * #GST_MAP_READ has the same semantics as though you are reading from OpenGL. | 
| 94 |  */ | 
| 95 | #define GST_MAP_GL (GST_MAP_FLAG_LAST << 1) | 
| 96 |  | 
| 97 | /** | 
| 98 |  * GstGLBaseMemory: | 
| 99 |  * @mem: the parent object | 
| 100 |  * @context: the #GstGLContext to use for GL operations | 
| 101 |  * | 
| 102 |  * Represents information about a GL memory object | 
| 103 |  */ | 
| 104 | struct _GstGLBaseMemory | 
| 105 | { | 
| 106 |   GstMemory             mem; | 
| 107 |  | 
| 108 |   GstGLContext         *context; | 
| 109 |  | 
| 110 |   /*< protected >*/ | 
| 111 |   GMutex                lock; | 
| 112 |  | 
| 113 |   GstMapFlags           map_flags;       /* cumulative map flags */ | 
| 114 |   gint                  map_count; | 
| 115 |   gint                  gl_map_count; | 
| 116 |  | 
| 117 |   gpointer              data; | 
| 118 |  | 
| 119 |   GstGLQuery           *query; | 
| 120 |  | 
| 121 |   /*< private >*/ | 
| 122 |   gsize                 alloc_size;     /* because maxsize is used for mapping */ | 
| 123 |   gpointer              alloc_data; | 
| 124 |  | 
| 125 |   GDestroyNotify        notify; | 
| 126 |   gpointer              user_data; | 
| 127 |  | 
| 128 |   gpointer              _padding[GST_PADDING]; | 
| 129 | }; | 
| 130 |  | 
| 131 | typedef struct _GstGLAllocationParams GstGLAllocationParams; | 
| 132 | /** | 
| 133 |  * GstGLAllocationParamsCopyFunc: | 
| 134 |  * @src: the source #GstGLAllocationParams to copy from | 
| 135 |  * @dest: the source #GstGLAllocationParams to copy | 
| 136 |  * | 
| 137 |  * Copies the parameters from @src into @dest.  The subclass must compose copy | 
| 138 |  * functions from the superclass. | 
| 139 |  */ | 
| 140 | typedef void    (*GstGLAllocationParamsCopyFunc)    (GstGLAllocationParams * src, GstGLAllocationParams * dest); | 
| 141 | /** | 
| 142 |  * GstGLAllocationParamsFreeFunc: | 
| 143 |  * @params: a #GstGLAllocationParams | 
| 144 |  * | 
| 145 |  * Free any dynamically allocated data.  The subclass must call the superclass' | 
| 146 |  * free. | 
| 147 |  */ | 
| 148 | typedef void    (*GstGLAllocationParamsFreeFunc)    (gpointer params); | 
| 149 |  | 
| 150 | #define GST_TYPE_GL_ALLOCATION_PARAMS (gst_gl_allocation_params_get_type()) | 
| 151 | GST_GL_API | 
| 152 | GType gst_gl_allocation_params_get_type (void); | 
| 153 |  | 
| 154 | /** | 
| 155 |  * GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_ALLOC: | 
| 156 |  * | 
| 157 |  * GL Allocation flag indicating that the implementation should allocate the | 
| 158 |  * necessary resources. | 
| 159 |  */ | 
| 160 | #define GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_ALLOC (1 << 0) | 
| 161 |  | 
| 162 | /** | 
| 163 |  * GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_SYSMEM: | 
| 164 |  * | 
| 165 |  * GL Allocation flag for using the provided system memory data as storage. | 
| 166 |  */ | 
| 167 | #define GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_SYSMEM (1 << 1) | 
| 168 |  | 
| 169 | /** | 
| 170 |  * GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE: | 
| 171 |  * | 
| 172 |  * GL Allocation flag for using the provided GPU handle as storage. | 
| 173 |  */ | 
| 174 | #define GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE (1 << 2) | 
| 175 |  | 
| 176 | /** | 
| 177 |  * GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_USER: | 
| 178 |  * | 
| 179 |  * Values >= than #GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_USER can be used for | 
| 180 |  * user-defined purposes. | 
| 181 |  */ | 
| 182 | #define GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_USER (1 << 16) | 
| 183 |  | 
| 184 | /** | 
| 185 |  * GstGLAllocationParams: | 
| 186 |  * @struct_size: the size of the struct (including and subclass data) | 
| 187 |  * @copy: a #GstGLAllocationParamsCopyFunc | 
| 188 |  * @free: a #GstGLAllocationParamsFreeFunc | 
| 189 |  * @alloc_flags: allocation flags | 
| 190 |  * @alloc_size: the allocation size | 
| 191 |  * @alloc_params: the #GstAllocationParams | 
| 192 |  * @context: a #GstGLContext | 
| 193 |  * @notify: a #GDestroyNotify | 
| 194 |  * @user_data: argument to call @notify with | 
| 195 |  * @wrapped_data: the wrapped data pointer | 
| 196 |  * @gl_handle: the wrapped OpenGL handle | 
| 197 |  */ | 
| 198 | /* Because GstAllocationParams is not subclassable, start our own subclass | 
| 199 |  * chain.  FIXME: 2.0 make GstAllocationParams subclassable */ | 
| 200 | struct _GstGLAllocationParams | 
| 201 | { | 
| 202 |   gsize                             struct_size; | 
| 203 |   GstGLAllocationParamsCopyFunc     copy; | 
| 204 |   GstGLAllocationParamsFreeFunc     free; | 
| 205 |  | 
| 206 |   guint                             alloc_flags; | 
| 207 |   gsize                             alloc_size; | 
| 208 |   GstAllocationParams              *alloc_params; | 
| 209 |   GstGLContext                     *context; | 
| 210 |   GDestroyNotify                    notify; | 
| 211 |   gpointer                          user_data; | 
| 212 |  | 
| 213 |   /* GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_SYSMEM only */ | 
| 214 |   gpointer                          wrapped_data; | 
| 215 |   /* GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE only */ | 
| 216 |   gpointer                          gl_handle; | 
| 217 |  | 
| 218 |   /*< private >*/ | 
| 219 |   gpointer                          _padding[GST_PADDING]; | 
| 220 | }; | 
| 221 |  | 
| 222 | GST_GL_API | 
| 223 | gboolean                gst_gl_allocation_params_init       (GstGLAllocationParams * params, | 
| 224 |                                                              gsize struct_size, | 
| 225 |                                                              guint alloc_flags, | 
| 226 |                                                              GstGLAllocationParamsCopyFunc copy, | 
| 227 |                                                              GstGLAllocationParamsFreeFunc free, | 
| 228 |                                                              GstGLContext * context, | 
| 229 |                                                              gsize alloc_size, | 
| 230 |                                                              const GstAllocationParams * alloc_params, | 
| 231 |                                                              gpointer wrapped_data, | 
| 232 |                                                              gpointer gl_handle, | 
| 233 |                                                              gpointer user_data, | 
| 234 |                                                              GDestroyNotify notify); | 
| 235 |  | 
| 236 | /* free with gst_gl_allocation_params_free */ | 
| 237 | GST_GL_API | 
| 238 | GstGLAllocationParams * gst_gl_allocation_params_copy       (GstGLAllocationParams * src); | 
| 239 |  | 
| 240 | GST_GL_API | 
| 241 | void                    gst_gl_allocation_params_free       (GstGLAllocationParams * params); | 
| 242 |  | 
| 243 | /* subclass usage */ | 
| 244 | GST_GL_API | 
| 245 | void                    gst_gl_allocation_params_free_data  (GstGLAllocationParams * params); | 
| 246 |  | 
| 247 | /* subclass usage */ | 
| 248 | GST_GL_API | 
| 249 | void                    gst_gl_allocation_params_copy_data  (GstGLAllocationParams * src, | 
| 250 |                                                              GstGLAllocationParams * dest); | 
| 251 |  | 
| 252 | /** | 
| 253 |  * GstGLBaseMemoryAllocatorAllocFunction: | 
| 254 |  * @allocator: a #GstGLBaseMemoryAllocator | 
| 255 |  * @params: the #GstGLAllocationParams to allocate the memory with | 
| 256 |  * | 
| 257 |  * Note: not called with a GL context current | 
| 258 |  * | 
| 259 |  * Returns: a newly allocated #GstGLBaseMemory from @allocator and @params | 
| 260 |  * | 
| 261 |  * Since: 1.8 | 
| 262 |  */ | 
| 263 | typedef GstGLBaseMemory *   (*GstGLBaseMemoryAllocatorAllocFunction)        (GstGLBaseMemoryAllocator * allocator, | 
| 264 |                                                                              GstGLAllocationParams * params); | 
| 265 |  | 
| 266 | /** | 
| 267 |  * GstGLBaseMemoryAllocatorCreateFunction: | 
| 268 |  * @mem: a #GstGLBaseMemory | 
| 269 |  * @error: a #GError to use on failure | 
| 270 |  * | 
| 271 |  * As this virtual method is called with an OpenGL context current, use this | 
| 272 |  * function to allocate and OpenGL resources needed for your application | 
| 273 |  * | 
| 274 |  * Returns: whether the creation succeeded | 
| 275 |  * | 
| 276 |  * Since: 1.8 | 
| 277 |  */ | 
| 278 | typedef gboolean            (*GstGLBaseMemoryAllocatorCreateFunction)       (GstGLBaseMemory * mem, | 
| 279 |                                                                              GError ** error); | 
| 280 |  | 
| 281 | /** | 
| 282 |  * GstGLBaseMemoryAllocatorMapFunction: | 
| 283 |  * @mem: a #GstGLBaseMemory | 
| 284 |  * @info: a #GstMapInfo to map with | 
| 285 |  * @maxsize: the size to map | 
| 286 |  * | 
| 287 |  * Also see gst_memory_map(); | 
| 288 |  * | 
| 289 |  * Returns: the mapped pointer | 
| 290 |  * | 
| 291 |  * Since: 1.8 | 
| 292 |  */ | 
| 293 | typedef gpointer            (*GstGLBaseMemoryAllocatorMapFunction)          (GstGLBaseMemory * mem, | 
| 294 |                                                                              GstMapInfo * info, | 
| 295 |                                                                              gsize maxsize); | 
| 296 | /** | 
| 297 |  * GstGLBaseMemoryAllocatorUnmapFunction: | 
| 298 |  * @mem: a #GstGLBaseMemory | 
| 299 |  * @info: a #GstMapInfo to map with | 
| 300 |  * | 
| 301 |  * Also see gst_memory_unmap(); | 
| 302 |  * | 
| 303 |  * Since: 1.8 | 
| 304 |  */ | 
| 305 | typedef void                (*GstGLBaseMemoryAllocatorUnmapFunction)        (GstGLBaseMemory * mem, | 
| 306 |                                                                              GstMapInfo * info); | 
| 307 |  | 
| 308 | /** | 
| 309 |  * GstGLBaseMemoryAllocatorCopyFunction: | 
| 310 |  * @mem: a #GstGLBaseMemory | 
| 311 |  * @offset: the offset to copy from | 
| 312 |  * @size: the number of bytes to copy | 
| 313 |  * | 
| 314 |  * Also see gst_memory_copy(); | 
| 315 |  * | 
| 316 |  * Returns: the newly copied #GstGLMemory or %NULL | 
| 317 |  * | 
| 318 |  * Since: 1.8 | 
| 319 |  */ | 
| 320 | typedef GstGLBaseMemory *   (*GstGLBaseMemoryAllocatorCopyFunction)         (GstGLBaseMemory * mem, | 
| 321 |                                                                              gssize offset, | 
| 322 |                                                                              gssize size); | 
| 323 |  | 
| 324 | /** | 
| 325 |  * GstGLBaseMemoryAllocatorDestroyFunction: | 
| 326 |  * @mem: a #GstGLBaseMemory | 
| 327 |  * | 
| 328 |  * Destroy any resources allocated throughout the lifetime of @mem | 
| 329 |  * | 
| 330 |  * Since: 1.8 | 
| 331 |  */ | 
| 332 | typedef void                (*GstGLBaseMemoryAllocatorDestroyFunction)      (GstGLBaseMemory * mem); | 
| 333 |  | 
| 334 | /** | 
| 335 |  * GstGLBaseMemoryAllocator: | 
| 336 |  * | 
| 337 |  * Opaque #GstGLBaseMemoryAllocator struct | 
| 338 |  * | 
| 339 |  * Since: 1.8 | 
| 340 |  */ | 
| 341 | struct _GstGLBaseMemoryAllocator | 
| 342 | { | 
| 343 |   /*< private >*/ | 
| 344 |   GstAllocator parent; | 
| 345 |   GstMemoryCopyFunction fallback_mem_copy; | 
| 346 |  | 
| 347 |   gpointer _padding[GST_PADDING]; | 
| 348 | }; | 
| 349 |  | 
| 350 | /** | 
| 351 |  * GstGLBaseMemoryAllocatorClass: | 
| 352 |  * @parent_class: the parent class | 
| 353 |  * @alloc: a #GstGLBaseMemoryAllocatorAllocFunction | 
| 354 |  * @create: a #GstGLBaseMemoryAllocatorCreateFunction | 
| 355 |  * @map: a #GstGLBaseMemoryAllocatorMapFunction | 
| 356 |  * @unmap: a #GstGLBaseMemoryAllocatorUnmapFunction | 
| 357 |  * @copy: a #GstGLBaseMemoryAllocatorCopyFunction | 
| 358 |  * @destroy: a #GstGLBaseMemoryAllocatorDestroyFunction | 
| 359 |  * | 
| 360 |  * Since: 1.8 | 
| 361 |  */ | 
| 362 | struct _GstGLBaseMemoryAllocatorClass | 
| 363 | { | 
| 364 |   GstAllocatorClass parent_class; | 
| 365 |  | 
| 366 |   GstGLBaseMemoryAllocatorAllocFunction         alloc; | 
| 367 |  | 
| 368 |   GstGLBaseMemoryAllocatorCreateFunction        create; | 
| 369 |   GstGLBaseMemoryAllocatorMapFunction           map; | 
| 370 |   GstGLBaseMemoryAllocatorUnmapFunction         unmap; | 
| 371 |   GstGLBaseMemoryAllocatorCopyFunction          copy; | 
| 372 |   GstGLBaseMemoryAllocatorDestroyFunction       destroy; | 
| 373 |  | 
| 374 |   /*< private >*/ | 
| 375 |   gpointer                                      _padding[GST_PADDING]; | 
| 376 | }; | 
| 377 |  | 
| 378 | #include <gst/gl/gstglconfig.h> | 
| 379 | #include <gst/gl/gstglformat.h> | 
| 380 |  | 
| 381 | /** | 
| 382 |  * GST_GL_BASE_MEMORY_ALLOCATOR_NAME: | 
| 383 |  * | 
| 384 |  * The name of the GL buffer allocator | 
| 385 |  * | 
| 386 |  * Since: 1.8 | 
| 387 |  */ | 
| 388 | #define GST_GL_BASE_MEMORY_ALLOCATOR_NAME   "GLBaseMemory" | 
| 389 |  | 
| 390 | GST_GL_API | 
| 391 | void          gst_gl_base_memory_init_once (void); | 
| 392 |  | 
| 393 | GST_GL_API | 
| 394 | gboolean      gst_is_gl_base_memory        (GstMemory * mem); | 
| 395 |  | 
| 396 | GST_GL_API | 
| 397 | void          gst_gl_base_memory_init      (GstGLBaseMemory * mem, | 
| 398 |                                             GstAllocator * allocator, | 
| 399 |                                             GstMemory * parent, | 
| 400 |                                             GstGLContext * context, | 
| 401 |                                             const GstAllocationParams * params, | 
| 402 |                                             gsize size, | 
| 403 |                                             gpointer user_data, | 
| 404 |                                             GDestroyNotify notify); | 
| 405 |  | 
| 406 | GST_GL_API | 
| 407 | gboolean      gst_gl_base_memory_alloc_data (GstGLBaseMemory * gl_mem); | 
| 408 |  | 
| 409 | GST_GL_API | 
| 410 | gboolean      gst_gl_base_memory_memcpy     (GstGLBaseMemory * src, | 
| 411 |                                              GstGLBaseMemory * dest, | 
| 412 |                                              gssize offset, | 
| 413 |                                              gssize size); | 
| 414 |  | 
| 415 | GST_GL_API | 
| 416 | GstGLBaseMemory *   gst_gl_base_memory_alloc    (GstGLBaseMemoryAllocator * allocator, | 
| 417 |                                                  GstGLAllocationParams * params); | 
| 418 |  | 
| 419 | G_END_DECLS | 
| 420 |  | 
| 421 | #endif /* _GST_GL_BUFFER_H_ */ | 
| 422 |  |