summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHyunjun Ko <zzoon.ko@samsung.com>2015-06-24 14:18:47 +0900
committerSebastian Dröge <sebastian@centricular.com>2015-06-24 10:52:56 +0200
commit7ecef53dbb46c5938ef3019fcf79f162c3caa845 (patch)
tree4219395b73dfc4842422c33d30168798c91c2703
parentfabe966b0a3be259dc2261109811c9de855b7652 (diff)
bufferlist: add new api gst_buffer_list_copy_deep
https://bugzilla.gnome.org/show_bug.cgi?id=751420
-rw-r--r--docs/gst/gstreamer-sections.txt1
-rw-r--r--gst/gstbufferlist.c30
-rw-r--r--gst/gstbufferlist.h1
-rw-r--r--tests/check/gst/gstbufferlist.c50
-rw-r--r--win32/common/libgstreamer.def1
5 files changed, 83 insertions, 0 deletions
diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt
index c8643d199..d13cbbbd1 100644
--- a/docs/gst/gstreamer-sections.txt
+++ b/docs/gst/gstreamer-sections.txt
@@ -372,6 +372,7 @@ gst_buffer_list_remove
gst_buffer_list_ref
gst_buffer_list_unref
gst_buffer_list_copy
+gst_buffer_list_copy_deep
gst_buffer_list_is_writable
gst_buffer_list_make_writable
diff --git a/gst/gstbufferlist.c b/gst/gstbufferlist.c
index 3b2b9a0d8..2ae3f2f48 100644
--- a/gst/gstbufferlist.c
+++ b/gst/gstbufferlist.c
@@ -364,3 +364,33 @@ gst_buffer_list_remove (GstBufferList * list, guint idx, guint length)
gst_buffer_list_remove_range_internal (list, idx, length, TRUE);
}
+
+/**
+ * gst_buffer_list_copy_deep:
+ * @list: a #GstBufferList
+ *
+ * Create a copy of the given buffer list. This will make a newly allocated
+ * copy of the buffer that the source buffer list contains.
+ *
+ * Returns: (transfer full): a new copy of @list.
+ *
+ * Since: 1.6
+ */
+GstBufferList *
+gst_buffer_list_copy_deep (const GstBufferList * list)
+{
+ guint i, len;
+ GstBufferList *result = NULL;
+
+ g_return_val_if_fail (GST_IS_BUFFER_LIST (list), NULL);
+
+ result = gst_buffer_list_new ();
+
+ len = list->n_buffers;
+ for (i = 0; i < len; i++) {
+ GstBuffer *old = list->buffers[i];
+ gst_buffer_list_insert (result, i, gst_buffer_copy_deep (old));
+ }
+
+ return result;
+}
diff --git a/gst/gstbufferlist.h b/gst/gstbufferlist.h
index e5ddb0892..96ea72761 100644
--- a/gst/gstbufferlist.h
+++ b/gst/gstbufferlist.h
@@ -158,6 +158,7 @@ void gst_buffer_list_remove (GstBufferList *l
gboolean gst_buffer_list_foreach (GstBufferList *list,
GstBufferListFunc func,
gpointer user_data);
+GstBufferList * gst_buffer_list_copy_deep (const GstBufferList * list);
#define gst_buffer_list_add(l,b) gst_buffer_list_insert((l),-1,(b));
diff --git a/tests/check/gst/gstbufferlist.c b/tests/check/gst/gstbufferlist.c
index 9d5c2dff9..6220d0286 100644
--- a/tests/check/gst/gstbufferlist.c
+++ b/tests/check/gst/gstbufferlist.c
@@ -195,6 +195,55 @@ GST_START_TEST (test_copy)
GST_END_TEST;
+GST_START_TEST (test_copy_deep)
+{
+ GstBufferList *list_copy;
+ GstMapInfo info, sinfo;
+ GstBuffer *buf1;
+ GstBuffer *buf2;
+ GstBuffer *buf_copy;
+
+ /* add buffers to the list */
+ buf1 = gst_buffer_new_allocate (NULL, 1, NULL);
+ gst_buffer_list_add (list, buf1);
+
+ buf2 = gst_buffer_new_allocate (NULL, 2, NULL);
+ gst_buffer_list_add (list, buf2);
+
+ /* make a copy */
+ list_copy = gst_buffer_list_copy_deep (list);
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (list) == 1);
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (list_copy) == 1);
+ fail_unless (list_copy != list);
+ fail_unless_equals_int (gst_buffer_list_length (list_copy), 2);
+
+ buf_copy = gst_buffer_list_get (list_copy, 0);
+ /* each buffer in the list is copied and must point to different memory */
+ fail_unless (buf_copy != buf1);
+ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1);
+ fail_unless_equals_int (gst_buffer_get_size (buf1), 1);
+
+ buf_copy = gst_buffer_list_get (list_copy, 1);
+ fail_unless (buf_copy != buf2);
+ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 1);
+ fail_unless_equals_int (gst_buffer_get_size (buf2), 2);
+
+ fail_unless (gst_buffer_map (buf2, &info, GST_MAP_READ));
+ fail_unless (gst_buffer_map (buf_copy, &sinfo, GST_MAP_READ));
+
+ /* NOTE that data is refcounted */
+ fail_unless (info.size == sinfo.size);
+ /* copy_deep() forces new GstMemory to be used */
+ fail_unless (info.data != sinfo.data);
+
+ gst_buffer_unmap (buf_copy, &sinfo);
+ gst_buffer_unmap (buf2, &info);
+
+ gst_buffer_list_unref (list_copy);
+}
+
+GST_END_TEST;
+
typedef struct
{
GstBuffer *buf[2];
@@ -390,6 +439,7 @@ gst_buffer_list_suite (void)
tcase_add_test (tc_chain, test_remove);
tcase_add_test (tc_chain, test_make_writable);
tcase_add_test (tc_chain, test_copy);
+ tcase_add_test (tc_chain, test_copy_deep);
tcase_add_test (tc_chain, test_foreach);
tcase_add_test (tc_chain, test_expand_and_remove);
diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def
index d76ab7965..d742ddb85 100644
--- a/win32/common/libgstreamer.def
+++ b/win32/common/libgstreamer.def
@@ -149,6 +149,7 @@ EXPORTS
gst_buffer_list_new
gst_buffer_list_new_sized
gst_buffer_list_remove
+ gst_buffer_list_copy_deep
gst_buffer_map
gst_buffer_map_range
gst_buffer_memcmp