gst/buffer: add a new function for wrapping GBytes
authorMatthew Waters <matthew@centricular.com>
Thu, 27 Sep 2018 09:13:35 +0000 (19:13 +1000)
committerMatthew Waters <matthew@centricular.com>
Tue, 6 Nov 2018 05:12:42 +0000 (16:12 +1100)
One restriction on the GBytes is that the data cannot be NULL as this is
explicitly forbidden by GstMemory.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/issues/318

docs/gst/gstreamer-sections.txt
gst/gstbuffer.c
gst/gstbuffer.h
tests/check/gst/gstbuffer.c

index 267b154..b810e04 100644 (file)
@@ -193,6 +193,7 @@ GST_BUFFER_IS_DISCONT
 gst_buffer_new
 gst_buffer_new_allocate
 gst_buffer_new_wrapped
+gst_buffer_new_wrapped_bytes
 gst_buffer_new_wrapped_full
 
 gst_buffer_ref
index e18e9bb..8e61307 100644 (file)
@@ -979,6 +979,33 @@ gst_buffer_new_wrapped (gpointer data, gsize size)
 }
 
 /**
+ * gst_buffer_new_wrapped_bytes:
+ * @bytes: (transfer none): a #GBytes to wrap
+ *
+ * Creates a new #GstBuffer that wraps the given @bytes. The data inside
+ * @bytes cannot be %NULL and the resulting buffer will be marked as read only.
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): a new #GstBuffer wrapping @bytes
+ *
+ * Since: 1.16
+ */
+GstBuffer *
+gst_buffer_new_wrapped_bytes (GBytes * bytes)
+{
+  guint8 *bytes_data;
+  gsize size;
+
+  g_return_val_if_fail (bytes != NULL, NULL);
+  bytes_data = (guint8 *) g_bytes_get_data (bytes, &size);
+  g_return_val_if_fail (bytes_data != NULL, NULL);
+
+  return gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, bytes_data,
+      size, 0, size, g_bytes_ref (bytes), (GDestroyNotify) g_bytes_unref);
+}
+
+/**
  * gst_buffer_n_memory:
  * @buffer: a #GstBuffer.
  *
index 2c6eceb..fafd365 100644 (file)
@@ -297,6 +297,8 @@ 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);
 
 /* memory blocks */
 
index a3fddd0..449d262 100644 (file)
@@ -905,6 +905,23 @@ GST_START_TEST (test_writable_memory)
 
 GST_END_TEST;
 
+GST_START_TEST (test_wrapped_bytes)
+{
+  GBytes *bytes = g_bytes_new_static (ro_memory, sizeof (ro_memory));
+  GstBuffer *buf;
+  GstMemory *mem;
+
+  buf = gst_buffer_new_wrapped_bytes (bytes);
+
+  /* the memory should not be writable */
+  mem = gst_buffer_peek_memory (buf, 0);
+  fail_unless (GST_MEMORY_IS_READONLY (mem));
+
+  gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
 static Suite *
 gst_buffer_suite (void)
 {
@@ -929,6 +946,7 @@ gst_buffer_suite (void)
   tcase_add_test (tc_chain, test_fill);
   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);
 
   return s;
 }