| From 7c30b4ac59a9cb69221a86f2f0723f5fdf035b2a Mon Sep 17 00:00:00 2001 |
| From: Thibault Saunier <tsaunier@igalia.com> |
| 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 bc6db7e0a..67ec4f4e9 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 74bff2b83..eff2f18ba 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.21.0 |
| |