Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/GStreamer/gstreamer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.com>2021-05-22 21:32:55 +0300
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2021-05-23 10:32:09 +0300
commit04fe2233f09a58deabd6b7d26182c81b1b6758c3 (patch)
tree9dec48f7b9dcb6ef0bcd958d9f3d2058a1926986
parentcaa608e5c0c5829f67a4fbe82e0abc28b24aa150 (diff)
buffer: add gst_buffer_new_copy() convenience function
More convenient and discoverable variant of the fairly widely-used gst_buffer_new_wrapped(g_memdup(data,size),size). Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/826>
-rw-r--r--gst/gstbuffer.c19
-rw-r--r--gst/gstbuffer.h4
-rw-r--r--tests/check/gst/gstbuffer.c22
3 files changed, 45 insertions, 0 deletions
diff --git a/gst/gstbuffer.c b/gst/gstbuffer.c
index 2d91d4e5e2..97b1b9fc31 100644
--- a/gst/gstbuffer.c
+++ b/gst/gstbuffer.c
@@ -1040,6 +1040,25 @@ gst_buffer_new_wrapped_bytes (GBytes * bytes)
}
/**
+ * gst_buffer_new_copy:
+ * @data: (array length=size) (element-type guint8) (transfer none): data to copy into new buffer
+ * @size: size of @data in bytes
+ *
+ * Creates a new buffer of size @size and fills it with a copy of @data.
+ *
+ * Returns: (transfer full): a new #GstBuffer
+ *
+ * Since: 1.20
+ */
+GstBuffer *
+gst_buffer_new_copy (gconstpointer data, gsize size)
+{
+ gpointer data2 = g_memdup (data, size);
+
+ return gst_buffer_new_wrapped_full (0, data2, size, 0, size, data2, g_free);
+}
+
+/**
* gst_buffer_n_memory:
* @buffer: a #GstBuffer.
*
diff --git a/gst/gstbuffer.h b/gst/gstbuffer.h
index 83eba10c84..0b9e77da57 100644
--- a/gst/gstbuffer.h
+++ b/gst/gstbuffer.h
@@ -314,9 +314,13 @@ GstBuffer * gst_buffer_new_wrapped_full (GstMemoryFlags flags, gpointer data,
GDestroyNotify notify);
GST_API
GstBuffer * gst_buffer_new_wrapped (gpointer data, gsize size);
+
GST_API
GstBuffer * gst_buffer_new_wrapped_bytes (GBytes * bytes);
+GST_API
+GstBuffer * gst_buffer_new_copy (gconstpointer data, gsize size);
+
/* memory blocks */
GST_API
diff --git a/tests/check/gst/gstbuffer.c b/tests/check/gst/gstbuffer.c
index 99a6f9a5b9..6a2ed31b5b 100644
--- a/tests/check/gst/gstbuffer.c
+++ b/tests/check/gst/gstbuffer.c
@@ -923,6 +923,27 @@ GST_START_TEST (test_wrapped_bytes)
GST_END_TEST;
+GST_START_TEST (test_new_copy)
+{
+ GstBuffer *buf;
+ GstMemory *mem;
+
+ buf = gst_buffer_new_copy (ro_memory, sizeof (ro_memory));
+
+ fail_if (gst_buffer_memcmp (buf, 0, ro_memory, sizeof (ro_memory)));
+ fail_unless_equals_int (gst_buffer_get_size (buf), sizeof (ro_memory));
+
+ /* the memory should be writable */
+ mem = gst_buffer_peek_memory (buf, 0);
+ fail_unless (gst_memory_is_writable (mem));
+ fail_unless (gst_buffer_is_writable (buf));
+ gst_buffer_memset (buf, 0, 0xaa, sizeof (ro_memory));
+
+ gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
static Suite *
gst_buffer_suite (void)
{
@@ -948,6 +969,7 @@ gst_buffer_suite (void)
tcase_add_test (tc_chain, test_parent_buffer_meta);
tcase_add_test (tc_chain, test_writable_memory);
tcase_add_test (tc_chain, test_wrapped_bytes);
+ tcase_add_test (tc_chain, test_new_copy);
return s;
}