summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibault Saunier <tsaunier@igalia.com>2019-09-27 11:10:43 -0300
committerTim-Philipp Müller <tim@centricular.com>2019-10-05 12:34:58 +0000
commit869fc917a5784ade2b4c58e122900029e0069257 (patch)
treee77e5b0c5c3f5a0ae15c256ca83d8c29208b5606
parentb2361cb477a9209ee2130536f1aab43ceb5474be (diff)
downloadgstreamer-plugins-base-869fc917a5784ade2b4c58e122900029e0069257.tar.gz
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.
-rw-r--r--gst-libs/gst/gl/gstglupload.c32
-rw-r--r--tests/check/libs/gstglupload.c2
2 files changed, 13 insertions, 21 deletions
diff --git a/gst-libs/gst/gl/gstglupload.c b/gst-libs/gst/gl/gstglupload.c
index 8849e9de1..e3e02ebb7 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 516655fcb..0fa6ac302 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");