bufferlist: add new api gst_buffer_list_copy_deep

https://bugzilla.gnome.org/show_bug.cgi?id=751420
This commit is contained in:
Hyunjun Ko 2015-06-24 14:18:47 +09:00 committed by Sebastian Dröge
parent fabe966b0a
commit 7ecef53dbb
5 changed files with 83 additions and 0 deletions

View file

@ -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

View file

@ -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;
}

View file

@ -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));

View file

@ -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);

View file

@ -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