static gboolean _gst_gl_sync_meta_transform (GstBuffer * dest, GstMeta * meta, GstBuffer * buffer, GQuark type, gpointer data) { GstGLSyncMeta *dmeta, *smeta; smeta = (GstGLSyncMeta *) meta; if (GST_META_TRANSFORM_IS_COPY (type)) { GstMetaTransformCopy *copy = data; if (!copy->region) { /* only copy if the complete data is copied as well */ dmeta = gst_buffer_add_gl_sync_meta (smeta->context, dest); if (!dmeta) return FALSE; GST_LOG ("copy sync object %p from meta %p to %p", smeta->glsync, smeta, dmeta); /* Setting a sync point here relies on GstBuffer copying * metas after data */ gst_gl_sync_meta_set_sync_point (dmeta, smeta->context); } } else { /* return FALSE, if transform type is not supported */ return FALSE; } return TRUE; }
/* This function handles GstBuffer creation */ static GstFlowReturn gst_gl_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer, GstBufferPoolAcquireParams * params) { GstGLMemoryAllocator *alloc; GstGLBufferPool *glpool = GST_GL_BUFFER_POOL_CAST (pool); GstGLBufferPoolPrivate *priv = glpool->priv; GstBuffer *buf; if (!(buf = gst_buffer_new ())) { goto no_buffer; } #if GST_GL_HAVE_PLATFORM_EGL if (priv->want_eglimage) { /* alloc and append memories, also add video_meta and * texture_upload_meta */ if (!gst_egl_image_memory_setup_buffer (glpool->context, priv->gl_params->v_info, buf)) goto egl_image_mem_create_failed; *buffer = buf; return GST_FLOW_OK; } #endif alloc = GST_GL_MEMORY_ALLOCATOR (priv->allocator); if (!gst_gl_memory_setup_buffer (alloc, buf, priv->gl_params)) goto mem_create_failed; if (priv->add_glsyncmeta) gst_buffer_add_gl_sync_meta (glpool->context, buf); *buffer = buf; return GST_FLOW_OK; /* ERROR */ no_buffer: { GST_WARNING_OBJECT (pool, "can't create image"); return GST_FLOW_ERROR; } mem_create_failed: { GST_WARNING_OBJECT (pool, "Could not create GL Memory"); return GST_FLOW_ERROR; } #if GST_GL_HAVE_PLATFORM_EGL egl_image_mem_create_failed: { GST_WARNING_OBJECT (pool, "Could not create EGLImage Memory"); return GST_FLOW_ERROR; } #endif }
/* This function handles GstBuffer creation */ static GstFlowReturn gst_gl_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer, GstBufferPoolAcquireParams * params) { GstGLMemoryAllocator *alloc; GstGLBufferPool *glpool = GST_GL_BUFFER_POOL_CAST (pool); GstGLBufferPoolPrivate *priv = glpool->priv; GstBuffer *buf; if (!(buf = gst_buffer_new ())) { goto no_buffer; } alloc = GST_GL_MEMORY_ALLOCATOR (priv->allocator); if (!gst_gl_memory_setup_buffer (alloc, buf, priv->gl_params, NULL, NULL, 0)) goto mem_create_failed; if (priv->add_glsyncmeta) gst_buffer_add_gl_sync_meta (glpool->context, buf); *buffer = buf; return GST_FLOW_OK; /* ERROR */ no_buffer: { GST_WARNING_OBJECT (pool, "can't create image"); return GST_FLOW_ERROR; } mem_create_failed: { GST_WARNING_OBJECT (pool, "Could not create GL Memory"); return GST_FLOW_ERROR; } }
/* This function handles GstBuffer creation */ static GstFlowReturn gst_gl_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer, GstBufferPoolAcquireParams * params) { GstGLBufferPool *glpool = GST_GL_BUFFER_POOL_CAST (pool); GstGLBufferPoolPrivate *priv = glpool->priv; GstVideoInfo *info; GstVideoAlignment *valign; GstBuffer *buf; info = &priv->info; valign = &priv->valign; if (!(buf = gst_buffer_new ())) { goto no_buffer; } #if GST_GL_HAVE_PLATFORM_EGL if (priv->want_eglimage) { /* alloc and append memories, also add video_meta and * texture_upload_meta */ if (!gst_egl_image_memory_setup_buffer (glpool->context, info, buf)) goto egl_image_mem_create_failed; *buffer = buf; return GST_FLOW_OK; } #endif if (!gst_gl_memory_setup_buffer (glpool->context, priv->tex_target, &priv->params, info, valign, buf)) goto mem_create_failed; if (priv->add_uploadmeta) gst_gl_upload_meta_add_to_buffer (glpool->upload, buf); if (priv->add_glsyncmeta) gst_buffer_add_gl_sync_meta (glpool->context, buf); *buffer = buf; return GST_FLOW_OK; /* ERROR */ no_buffer: { GST_WARNING_OBJECT (pool, "can't create image"); return GST_FLOW_ERROR; } mem_create_failed: { GST_WARNING_OBJECT (pool, "Could not create GL Memory"); return GST_FLOW_ERROR; } #if GST_GL_HAVE_PLATFORM_EGL egl_image_mem_create_failed: { GST_WARNING_OBJECT (pool, "Could not create EGLImage Memory"); return GST_FLOW_ERROR; } #endif }