diff options
author | Hyunjun Ko <zzoon.ko@samsung.com> | 2015-06-24 14:18:47 +0900 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2015-06-24 10:52:56 +0200 |
commit | 7ecef53dbb46c5938ef3019fcf79f162c3caa845 (patch) | |
tree | 4219395b73dfc4842422c33d30168798c91c2703 | |
parent | fabe966b0a3be259dc2261109811c9de855b7652 (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.txt | 1 | ||||
-rw-r--r-- | gst/gstbufferlist.c | 30 | ||||
-rw-r--r-- | gst/gstbufferlist.h | 1 | ||||
-rw-r--r-- | tests/check/gst/gstbufferlist.c | 50 | ||||
-rw-r--r-- | win32/common/libgstreamer.def | 1 |
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 |