bufferlist: foreach: always remove as parent if buffer is changed
authorMiguel Paris <mparisdiaz@gmail.com>
Tue, 3 Mar 2020 14:36:26 +0000 (15:36 +0100)
committerMiguel Paris <mparisdiaz@gmail.com>
Wed, 18 Mar 2020 13:43:08 +0000 (14:43 +0100)
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.

gst/gstbufferlist.c
tests/check/gst/gstbufferlist.c

index 59fbcafc5f9ab649ebbd99fef365bd2a2eb068c4..0bfdcd5dbfda75ec50c02603db409de2521af887 100644 (file)
@@ -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),
index 1a483d93a7c3329ae2ece64faa1777c7bcac5d44..74a21d4f31baa93bf9b0a37315ea85c5b3569418 100644 (file)
@@ -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;
 }