Commit 8d32de09 authored by Thibault Saunier's avatar Thibault Saunier Committed by Thibault Saunier

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.
parent 99391499
Pipeline #68036 failed with stages
in 47 minutes and 26 seconds
......@@ -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;
}
......
......@@ -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");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment