diff options
author | Miguel Paris <mparisdiaz@gmail.com> | 2020-03-03 15:36:26 +0100 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2020-06-04 21:49:02 +0000 |
commit | 687c0f0ce712e74a450a8392409d65a0137df63a (patch) | |
tree | 74d08ec2cecea77e28165e2eb9322d2ff42b44a6 | |
parent | e3afb0ea8eb3322441efc8d66e0c9ddc64ee887b (diff) | |
download | gstreamer-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.c | 5 | ||||
-rw-r--r-- | tests/check/gst/gstbufferlist.c | 20 |
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; } |