mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-20 00:31:13 +00:00
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.
This commit is contained in:
parent
9939149933
commit
8d32de0905
2 changed files with 13 additions and 21 deletions
|
@ -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.context = raw->upload->context;
|
||||
if (gst_gl_memory_setup_buffer ((GstGLMemoryAllocator *) allocator, *outbuf,
|
||||
raw->params, NULL, raw->in_frame->frame.data, n_mem)) {
|
||||
|
||||
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_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");
|
||||
|
|
Loading…
Reference in a new issue