vulkanupload: refactor frame copy in a single function

Avoiding code duplication

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9222>
This commit is contained in:
Víctor Manuel Jáquez Leal 2025-06-13 17:23:21 +02:00 committed by GStreamer Marge Bot
parent bcf97b088f
commit 743c425f64

View File

@ -239,13 +239,33 @@ _raw_to_buffer_propose_allocation (gpointer impl, GstQuery * decide_query,
_buffer_propose_allocation (impl, decide_query, query);
}
static gboolean
_copy_frames (const GstVideoInfo * vinfo, GstBuffer * inbuf, GstBuffer * outbuf)
{
GstVideoFrame in_frame, out_frame;
gboolean copied;
if (!gst_video_frame_map (&in_frame, vinfo, inbuf, GST_MAP_READ))
return FALSE;
if (!gst_video_frame_map (&out_frame, vinfo, outbuf, GST_MAP_WRITE)) {
gst_video_frame_unmap (&in_frame);
return FALSE;
}
copied = gst_video_frame_copy (&out_frame, &in_frame);
gst_video_frame_unmap (&in_frame);
gst_video_frame_unmap (&out_frame);
return copied;
}
static GstFlowReturn
_raw_to_buffer_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf)
{
struct RawToBufferUpload *raw = impl;
GstVideoFrame v_frame, out_frame;
GstFlowReturn ret = GST_FLOW_ERROR;
gboolean copied;
GstBufferPool *pool;
pool = gst_base_transform_get_buffer_pool
@ -258,29 +278,12 @@ _raw_to_buffer_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf)
!= GST_FLOW_OK)
goto out;
if (!gst_video_frame_map (&v_frame, &raw->in_info, inbuf, GST_MAP_READ)) {
ret = _copy_frames (&raw->in_info, inbuf, *outbuf);
if (!ret) {
GST_ELEMENT_ERROR (raw->upload, RESOURCE, NOT_FOUND,
("%s", "Failed to map input buffer"), NULL);
goto out;
}
if (!gst_video_frame_map (&out_frame, &raw->in_info, *outbuf,
GST_MAP_WRITE)) {
gst_video_frame_unmap (&v_frame);
GST_WARNING_OBJECT (raw->upload, "Failed to map input buffer");
goto out;
}
copied = gst_video_frame_copy (&out_frame, &v_frame);
gst_video_frame_unmap (&v_frame);
gst_video_frame_unmap (&out_frame);
if (!copied)
GST_WARNING_OBJECT (raw->upload, "Failed to copy input buffer");
else
ret = GST_FLOW_OK;
out:
gst_object_unref (pool);
return ret;
@ -768,8 +771,6 @@ _raw_to_image_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf)
g_assert (gst_is_vulkan_buffer_memory (in_mem));
buf_mem = (GstVulkanBufferMemory *) in_mem;
} else {
GstVideoFrame in_frame, out_frame;
GST_TRACE_OBJECT (raw->upload,
"Copying input to a new GstVulkanBufferMemory");
if (!raw->in_pool) {
@ -794,28 +795,11 @@ _raw_to_image_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf)
goto unlock_error;
}
if (!gst_video_frame_map (&in_frame, &raw->in_info, inbuf, GST_MAP_READ)) {
GST_WARNING_OBJECT (raw->upload, "Failed to map input buffer");
if (!_copy_frames (&raw->in_info, inbuf, *outbuf)) {
GST_ERROR_OBJECT (raw->upload, "Failed to copy to Vulkan buffer");
goto unlock_error;
}
if (!gst_video_frame_map (&out_frame, &raw->in_info, in_vk_copy,
GST_MAP_WRITE)) {
gst_video_frame_unmap (&in_frame);
GST_WARNING_OBJECT (raw->upload, "Failed to map input buffer");
goto unlock_error;
}
if (!gst_video_frame_copy (&out_frame, &in_frame)) {
gst_video_frame_unmap (&in_frame);
gst_video_frame_unmap (&out_frame);
GST_WARNING_OBJECT (raw->upload, "Failed to copy input buffer");
goto unlock_error;
}
gst_video_frame_unmap (&in_frame);
gst_video_frame_unmap (&out_frame);
in_mem = gst_buffer_peek_memory (in_vk_copy, i);
buf_mem = (GstVulkanBufferMemory *) in_mem;
}