summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel Paris <mparisdiaz@gmail.com>2020-03-03 15:36:26 +0100
committerTim-Philipp Müller <tim@centricular.com>2020-06-04 21:49:02 +0000
commit687c0f0ce712e74a450a8392409d65a0137df63a (patch)
tree74d08ec2cecea77e28165e2eb9322d2ff42b44a6
parente3afb0ea8eb3322441efc8d66e0c9ddc64ee887b (diff)
downloadgstreamer-687c0f0ce712e74a450a8392409d65a0137df63a.tar.gz
bufferlist: foreach: always remove as parent if buffer is changed
In case the buffer is not writable, the parent (the BufferList) is not removed before calling func. So if it is changed, the parent (the BufferList) of the previous buffer should be removed after calling func.
-rw-r--r--gst/gstbufferlist.c5
-rw-r--r--tests/check/gst/gstbufferlist.c20
2 files changed, 24 insertions, 1 deletions
diff --git a/gst/gstbufferlist.c b/gst/gstbufferlist.c
index 2c1359769e..f419b3c32d 100644
--- a/gst/gstbufferlist.c
+++ b/gst/gstbufferlist.c
@@ -307,8 +307,11 @@ gst_buffer_list_foreach (GstBufferList * list, GstBufferListFunc func,
gst_buffer_list_remove_range_internal (list, i, 1, !was_writable);
--len;
} else {
- if (!was_writable)
+ if (!was_writable) {
+ gst_mini_object_remove_parent (GST_MINI_OBJECT_CAST (buf),
+ GST_MINI_OBJECT_CAST (list));
gst_buffer_unref (buf);
+ }
list->buffers[i] = buf_ret;
gst_mini_object_add_parent (GST_MINI_OBJECT_CAST (buf_ret),
diff --git a/tests/check/gst/gstbufferlist.c b/tests/check/gst/gstbufferlist.c
index 1a483d93a7..74a21d4f31 100644
--- a/tests/check/gst/gstbufferlist.c
+++ b/tests/check/gst/gstbufferlist.c
@@ -539,6 +539,24 @@ GST_START_TEST (test_foreach_modify_non_writeable_list)
GST_END_TEST;
+GST_START_TEST (test_foreach_modify_writeable_list)
+{
+ GstBufferList *b = gst_buffer_list_new_sized (1);
+ GstBuffer *buf;
+
+ buf = gst_buffer_new ();
+ gst_buffer_list_add (b, gst_buffer_ref (buf));
+
+ fail_unless (gst_buffer_list_is_writable (b));
+
+ gst_buffer_list_foreach (b, foreach_replace_buffer, NULL);
+
+ gst_buffer_list_unref (b);
+ gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
static Suite *
gst_buffer_list_suite (void)
{
@@ -546,6 +564,7 @@ gst_buffer_list_suite (void)
TCase *tc_chain = tcase_create ("general");
suite_add_tcase (s, tc_chain);
+
tcase_add_checked_fixture (tc_chain, setup, cleanup);
tcase_add_test (tc_chain, test_add_and_iterate);
tcase_add_test (tc_chain, test_remove);
@@ -559,6 +578,7 @@ gst_buffer_list_suite (void)
tcase_add_test (tc_chain, test_new_sized_0);
tcase_add_test (tc_chain, test_multiple_mutable_buffer_references);
tcase_add_test (tc_chain, test_foreach_modify_non_writeable_list);
+ tcase_add_test (tc_chain, test_foreach_modify_writeable_list);
return s;
}