summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Dufresne <nicolas.dufresne@collabora.com>2017-08-01 13:22:43 (GMT)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>2017-08-01 13:48:46 (GMT)
commitba8aa440bb5100e00d9ba85b1a420c0b9c6d352f (patch)
tree854ef906e04732120044d61bfd97ab0c605b3028
parent2c7dfff047716d57001149e6ae28fbda6dd90c55 (diff)
downloadgst-plugins-good-ba8aa440bb5100e00d9ba85b1a420c0b9c6d352f.tar.gz
gst-plugins-good-ba8aa440bb5100e00d9ba85b1a420c0b9c6d352f.tar.xz
v4l2bufferpool: Copy flags and timestamp when importing
Whenever we import from downstream pool (userptr or dmabuf-import), we should copy over the flags and timestamp, otherwise downstream will not get proper synchronization or will not be able to notice frames that has corruption in it. https://bugzilla.gnome.org/show_bug.cgi?id=785680
-rw-r--r--sys/v4l2/gstv4l2bufferpool.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/sys/v4l2/gstv4l2bufferpool.c b/sys/v4l2/gstv4l2bufferpool.c
index cf8c29e..6ed429b 100644
--- a/sys/v4l2/gstv4l2bufferpool.c
+++ b/sys/v4l2/gstv4l2bufferpool.c
@@ -1823,12 +1823,20 @@ gst_v4l2_buffer_pool_process (GstV4l2BufferPool * pool, GstBuffer ** buf)
case GST_V4L2_IO_USERPTR:
{
struct UserPtrData *data;
+ GstBuffer *tmp;
/* Replace our buffer with downstream allocated buffer */
data = gst_mini_object_steal_qdata (GST_MINI_OBJECT (*buf),
GST_V4L2_IMPORT_QUARK);
- gst_buffer_replace (buf, data->buffer);
+ tmp = gst_buffer_ref (data->buffer);
_unmap_userptr_frame (data);
+
+ /* Now tmp is writable, copy the flags and timestamp */
+ gst_buffer_copy_into (tmp, *buf,
+ GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS, 0, -1);
+
+ gst_buffer_replace (buf, tmp);
+ gst_buffer_unref (tmp);
break;
}
@@ -1839,6 +1847,10 @@ gst_v4l2_buffer_pool_process (GstV4l2BufferPool * pool, GstBuffer ** buf)
/* Replace our buffer with downstream allocated buffer */
tmp = gst_mini_object_steal_qdata (GST_MINI_OBJECT (*buf),
GST_V4L2_IMPORT_QUARK);
+
+ gst_buffer_copy_into (tmp, *buf,
+ GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS, 0, -1);
+
gst_buffer_replace (buf, tmp);
gst_buffer_unref (tmp);
break;