From a09674dd6d86ae9d4b8200002522177b801f3d51 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Sun, 10 Nov 2019 20:02:09 -0500 Subject: [PATCH] gldownload: Refactor download mode selection This introduces an enum in order to cleanup how we select the transfer mode. It also fixes the case where we callback to PBO but we didn't execute the PBO. That was not causing any issue, just that the processing latency would be delayed to the next element, which can be confusing. --- ext/gl/gstgldownloadelement.c | 79 +++++++++++++++++++++++++++---------------- ext/gl/gstgldownloadelement.h | 9 ++++- 2 files changed, 58 insertions(+), 30 deletions(-) diff --git a/ext/gl/gstgldownloadelement.c b/ext/gl/gstgldownloadelement.c index 8ece34d..4a87e94 100644 --- a/ext/gl/gstgldownloadelement.c +++ b/ext/gl/gstgldownloadelement.c @@ -39,6 +39,8 @@ G_DEFINE_TYPE_WITH_CODE (GstGLDownloadElement, gst_gl_download_element, GST_DEBUG_CATEGORY_INIT (gst_gl_download_element_debug, "gldownloadelement", 0, "download element");); +static gboolean gst_gl_download_element_start (GstBaseTransform * bt); +static gboolean gst_gl_download_element_stop (GstBaseTransform * bt); static gboolean gst_gl_download_element_get_unit_size (GstBaseTransform * trans, GstCaps * caps, gsize * size); static GstCaps *gst_gl_download_element_transform_caps (GstBaseTransform * bt, @@ -52,6 +54,10 @@ static GstFlowReturn gst_gl_download_element_transform (GstBaseTransform * bt, GstBuffer * buffer, GstBuffer * outbuf); static gboolean gst_gl_download_element_decide_allocation (GstBaseTransform * trans, GstQuery * query); +static gboolean gst_gl_download_element_sink_event (GstBaseTransform * bt, + GstEvent * event); +static gboolean gst_gl_download_element_src_event (GstBaseTransform * bt, + GstEvent * event); static void gst_gl_download_element_finalize (GObject * object); #if GST_GL_HAVE_PLATFORM_EGL && GST_GL_HAVE_DMABUF @@ -80,6 +86,8 @@ gst_gl_download_element_class_init (GstGLDownloadElementClass * klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); + bt_class->start = gst_gl_download_element_start; + bt_class->stop = gst_gl_download_element_stop; bt_class->transform_caps = gst_gl_download_element_transform_caps; bt_class->set_caps = gst_gl_download_element_set_caps; bt_class->get_unit_size = gst_gl_download_element_get_unit_size; @@ -110,6 +118,31 @@ gst_gl_download_element_init (GstGLDownloadElement * download) } static gboolean +gst_gl_download_element_start (GstBaseTransform * bt) +{ +#if GST_GL_HAVE_PLATFORM_EGL && GST_GL_HAVE_DMABUF + GstGLDownloadElement *dl = GST_GL_DOWNLOAD_ELEMENT (bt); + + dl->dmabuf_allocator = gst_dmabuf_allocator_new (); +#endif + + return TRUE; +} + +static gboolean +gst_gl_download_element_stop (GstBaseTransform * bt) +{ + GstGLDownloadElement *dl = GST_GL_DOWNLOAD_ELEMENT (bt); + + if (dl->dmabuf_allocator) { + gst_object_unref (GST_OBJECT (dl->dmabuf_allocator)); + dl->dmabuf_allocator = NULL; + } + + return TRUE; +} + +static gboolean gst_gl_download_element_set_caps (GstBaseTransform * bt, GstCaps * in_caps, GstCaps * out_caps) { @@ -122,27 +155,16 @@ gst_gl_download_element_set_caps (GstBaseTransform * bt, GstCaps * in_caps, features = gst_caps_get_features (out_caps, 0); - dl->do_pbo_transfers = FALSE; - if (dl->dmabuf_allocator) { - gst_object_unref (GST_OBJECT (dl->dmabuf_allocator)); - dl->dmabuf_allocator = NULL; - } - - if (!features) { - dl->do_pbo_transfers = TRUE; - return TRUE; - } - if (gst_caps_features_contains (features, GST_CAPS_FEATURE_MEMORY_GL_MEMORY)) { - /* do nothing with the buffer */ + dl->mode = GST_GL_DOWNLOAD_MODE_PASSTHROUGH; #if GST_GL_HAVE_PLATFORM_EGL && GST_GL_HAVE_DMABUF } else if (gst_caps_features_contains (features, GST_CAPS_FEATURE_MEMORY_DMABUF)) { - dl->dmabuf_allocator = gst_dmabuf_allocator_new (); + dl->mode = GST_GL_DOWNLOAD_MODE_DMABUF_EXPORTS; #endif - } else if (gst_caps_features_contains (features, - GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY)) { - dl->do_pbo_transfers = TRUE; + } else { + /* System Memory */ + dl->mode = GST_GL_DOWNLOAD_MODE_PBO_TRANSFERS; } return TRUE; @@ -403,17 +425,8 @@ gst_gl_download_element_prepare_output_buffer (GstBaseTransform * bt, *outbuf = inbuf; - if (dl->do_pbo_transfers) { - n = gst_buffer_n_memory (*outbuf); - for (i = 0; i < n; i++) { - GstMemory *mem = gst_buffer_peek_memory (*outbuf, i); - - if (gst_is_gl_memory_pbo (mem)) - gst_gl_memory_pbo_download_transfer ((GstGLMemoryPBO *) mem); - } - } #if GST_GL_HAVE_PLATFORM_EGL && GST_GL_HAVE_DMABUF - else if (dl->dmabuf_allocator) { + if (dl->mode == GST_GL_DOWNLOAD_MODE_DMABUF_EXPORTS) { GstBuffer *buffer = _try_export_dmabuf (dl, inbuf); if (buffer) { @@ -436,13 +449,11 @@ gst_gl_download_element_prepare_output_buffer (GstBaseTransform * bt, GstCaps *src_caps; GstCapsFeatures *features; - gst_object_unref (dl->dmabuf_allocator); - dl->dmabuf_allocator = NULL; - src_caps = gst_pad_get_current_caps (bt->srcpad); src_caps = gst_caps_make_writable (src_caps); features = gst_caps_get_features (src_caps, 0); gst_caps_features_remove (features, GST_CAPS_FEATURE_MEMORY_DMABUF); + dl->mode = GST_GL_DOWNLOAD_MODE_PBO_TRANSFERS; if (!gst_base_transform_update_src_caps (bt, src_caps)) { GST_ERROR_OBJECT (bt, "DMABuf exportation didn't work and system " @@ -453,6 +464,16 @@ gst_gl_download_element_prepare_output_buffer (GstBaseTransform * bt, } #endif + if (dl->mode == GST_GL_DOWNLOAD_MODE_PBO_TRANSFERS) { + n = gst_buffer_n_memory (*outbuf); + for (i = 0; i < n; i++) { + GstMemory *mem = gst_buffer_peek_memory (*outbuf, i); + + if (gst_is_gl_memory_pbo (mem)) + gst_gl_memory_pbo_download_transfer ((GstGLMemoryPBO *) mem); + } + } + return GST_FLOW_OK; } diff --git a/ext/gl/gstgldownloadelement.h b/ext/gl/gstgldownloadelement.h index 9e5ef06..8f4f8f1 100644 --- a/ext/gl/gstgldownloadelement.h +++ b/ext/gl/gstgldownloadelement.h @@ -39,11 +39,18 @@ GType gst_gl_download_element_get_type (void); typedef struct _GstGLDownloadElement GstGLDownloadElement; typedef struct _GstGLDownloadElementClass GstGLDownloadElementClass; +typedef enum +{ + GST_GL_DOWNLOAD_MODE_PASSTHROUGH, + GST_GL_DOWNLOAD_MODE_PBO_TRANSFERS, + GST_GL_DOWNLOAD_MODE_DMABUF_EXPORTS +} GstGlDownloadMode; + struct _GstGLDownloadElement { GstGLBaseFilter parent; - gboolean do_pbo_transfers; + GstGlDownloadMode mode; GstAllocator * dmabuf_allocator; gboolean add_videometa; }; -- 2.7.4