From 869fc917a5784ade2b4c58e122900029e0069257 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 27 Sep 2019 11:10:43 -0300 Subject: [PATCH] glupload: Add VideoMetas and GLSyncMeta to the raw uploaded buffers This is done by reusing `gst_gl_memory_setup_buffer` avoiding to duplicate code. Without a VideoMeta, mapping those buffers lead to GstBuffer mapping the buffer in system memory even when specifying the GL flags (through the buffer merging mechanism) making the result totally broken. --- gst-libs/gst/gl/gstglupload.c | 32 +++++++++++--------------------- tests/check/libs/gstglupload.c | 2 ++ 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/gst-libs/gst/gl/gstglupload.c b/gst-libs/gst/gl/gstglupload.c index 8849e9d..e3e02eb 100644 --- a/gst-libs/gst/gl/gstglupload.c +++ b/gst-libs/gst/gl/gstglupload.c @@ -1293,33 +1293,23 @@ _raw_data_upload_perform (gpointer impl, GstBuffer * buffer, (raw->upload->context)); /* FIXME Use a buffer pool to cache the generated textures */ - /* FIXME: multiview support with separated left/right frames? */ *outbuf = gst_buffer_new (); - for (i = 0; i < n_mem; i++) { - GstGLBaseMemory *tex; - - raw->params->parent.wrapped_data = raw->in_frame->frame.data[i]; - raw->params->plane = i; - raw->params->tex_format = - gst_gl_format_from_video_info (raw->upload->context, in_info, i); - - tex = - gst_gl_base_memory_alloc (allocator, - (GstGLAllocationParams *) raw->params); - if (!tex) { - gst_buffer_unref (*outbuf); - *outbuf = NULL; - GST_ERROR_OBJECT (raw->upload, "Failed to allocate wrapped texture"); - return GST_GL_UPLOAD_ERROR; - } + raw->params->parent.context = raw->upload->context; + if (gst_gl_memory_setup_buffer ((GstGLMemoryAllocator *) allocator, *outbuf, + raw->params, NULL, raw->in_frame->frame.data, n_mem)) { - _raw_upload_frame_ref (raw->in_frame); - gst_buffer_append_memory (*outbuf, (GstMemory *) tex); + for (i = 0; i < n_mem; i++) + _raw_upload_frame_ref (raw->in_frame); + gst_buffer_add_gl_sync_meta (raw->upload->context, *outbuf); + } else { + GST_ERROR_OBJECT (raw->upload, "Failed to allocate wrapped texture"); + gst_buffer_unref (*outbuf); + return GST_GL_UPLOAD_ERROR; } gst_object_unref (allocator); - _raw_upload_frame_unref (raw->in_frame); raw->in_frame = NULL; + return GST_GL_UPLOAD_DONE; } diff --git a/tests/check/libs/gstglupload.c b/tests/check/libs/gstglupload.c index 516655f..0fa6ac3 100644 --- a/tests/check/libs/gstglupload.c +++ b/tests/check/libs/gstglupload.c @@ -281,6 +281,8 @@ GST_START_TEST (test_upload_data) res = gst_gl_upload_perform_with_buffer (upload, inbuf, &outbuf); fail_unless (res == GST_GL_UPLOAD_DONE, "Failed to upload buffer"); fail_unless (GST_IS_BUFFER (outbuf)); + fail_unless (gst_buffer_get_video_meta (outbuf)); + fail_unless (gst_buffer_get_gl_sync_meta (outbuf)); res = gst_buffer_map (outbuf, &map_info, GST_MAP_READ | GST_MAP_GL); fail_if (res == FALSE, "Failed to map gl memory"); -- 2.7.4