gst/gstevent.c: Fix gst_mini_object_make_writable() and gst_event_copy() for events...
authorAlessandro Decina <alessandro@nnva.org>
Mon, 2 Oct 2006 08:37:24 +0000 (08:37 +0000)
committerTim-Philipp Müller <tim@centricular.net>
Mon, 2 Oct 2006 08:37:24 +0000 (08:37 +0000)
Original commit message from CVS:
Patch by: Alessandro Decina  <alessandro at nnva org>
* gst/gstevent.c: (_gst_event_copy):
Fix gst_mini_object_make_writable() and gst_event_copy() for events
with event structures by setting the parent refcount address of the
copied structure to the address of the refcount member of the newly
copied event rather than the address of the refcount member of the
original event. Fixes #358737.
* tests/check/gst/gstevent.c: (GST_START_TEST):
Unit test for the above.

ChangeLog
gst/gstevent.c
tests/check/gst/gstevent.c

index 245ede1..9eff6e5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2006-10-02  Tim-Philipp Müller  <tim at centricular dot net>
+
+       Patch by: Alessandro Decina  <alessandro at nnva org>
+
+       * gst/gstevent.c: (_gst_event_copy):
+         Fix gst_mini_object_make_writable() and gst_event_copy() for events
+         with event structures by setting the parent refcount address of the
+         copied structure to the address of the refcount member of the newly
+         copied event rather than the address of the refcount member of the
+         original event. Fixes #358737.
+
+       * tests/check/gst/gstevent.c: (GST_START_TEST):
+         Unit test for the above.
+
 2006-09-29  Stefan Kost  <ensonic@users.sf.net>
 
        * docs/design/Makefile.am:
index 27eb5da..52cedd2 100644 (file)
@@ -269,7 +269,7 @@ _gst_event_copy (GstEvent * event)
   if (event->structure) {
     copy->structure = gst_structure_copy (event->structure);
     gst_structure_set_parent_refcount (copy->structure,
-        &event->mini_object.refcount);
+        &copy->mini_object.refcount);
   }
   return copy;
 }
index 8e06419..307c232 100644 (file)
@@ -217,6 +217,32 @@ GST_START_TEST (create_custom_events)
     /* The structure should have been duplicated */
     fail_if (gst_event_get_structure (event) ==
         gst_event_get_structure (event2));
+
+    gst_event_unref (event);
+    gst_event_unref (event2);
+  }
+
+  /* Make events writable */
+  {
+    structure = gst_structure_empty_new ("application/x-custom");
+    fail_if (structure == NULL);
+    event = gst_event_new_custom (GST_EVENT_CUSTOM_BOTH, structure);
+    /* ref the event so that it becomes non-writable */
+    gst_event_ref (event);
+    gst_event_ref (event);
+    /* this should fail if the structure isn't writable */
+    ASSERT_CRITICAL (gst_structure_remove_all_fields ((GstStructure *)
+            gst_event_get_structure (event)));
+
+    /* now make writable */
+    event2 =
+        GST_EVENT (gst_mini_object_make_writable (GST_MINI_OBJECT (event)));
+    fail_unless (event != event2);
+    /* this fail if the structure isn't writable */
+    gst_structure_remove_all_fields ((GstStructure *)
+        gst_event_get_structure (event2));
+
+    gst_event_unref (event);
     gst_event_unref (event);
     gst_event_unref (event2);
   }