summaryrefslogtreecommitdiff
path: root/gst/interleave
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2013-07-01 11:37:00 +0200
committerSebastian Dröge <slomo@circular-chaos.org>2013-07-01 11:37:00 +0200
commit5f6469fe2ae0705f593a59ed7b7805e4a1af1bc2 (patch)
tree6a959ce6cc0409a2a4cc413a8a145620ff86f0b0 /gst/interleave
parent75b5a54f172970ac5cf9a7ee43eb350120e906ab (diff)
downloadgstreamer-plugins-good-5f6469fe2ae0705f593a59ed7b7805e4a1af1bc2.tar.gz
deinterleave: Don't hold object lock while sending events downstream
Based on a patch by Kishore Arepalli <kishore.arepalli@gmail.com> https://bugzilla.gnome.org/show_bug.cgi?id=703114
Diffstat (limited to 'gst/interleave')
-rw-r--r--gst/interleave/deinterleave.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/gst/interleave/deinterleave.c b/gst/interleave/deinterleave.c
index 83a05f225..507423122 100644
--- a/gst/interleave/deinterleave.c
+++ b/gst/interleave/deinterleave.c
@@ -685,29 +685,28 @@ gst_deinterleave_process (GstDeinterleave * self, GstBuffer * buf)
GstBuffer **buffers_out = g_new0 (GstBuffer *, channels);
guint8 *in, *out;
GstMapInfo read_info;
-
- gst_buffer_map (buf, &read_info, GST_MAP_READ);
+ GList *pending_events, *l;
/* Send any pending events to all src pads */
GST_OBJECT_LOCK (self);
- if (self->pending_events) {
- GList *events;
+ pending_events = self->pending_events;
+ self->pending_events = NULL;
+ GST_OBJECT_UNLOCK (self);
+
+ if (pending_events) {
GstEvent *event;
GST_DEBUG_OBJECT (self, "Sending pending events to all src pads");
-
- for (events = self->pending_events; events != NULL; events = events->next) {
- event = GST_EVENT (events->data);
-
+ for (l = pending_events; l; l = l->next) {
+ event = l->data;
for (srcs = self->srcpads; srcs != NULL; srcs = srcs->next)
gst_pad_push_event (GST_PAD (srcs->data), gst_event_ref (event));
gst_event_unref (event);
}
-
- g_list_free (self->pending_events);
- self->pending_events = NULL;
+ g_list_free (pending_events);
}
- GST_OBJECT_UNLOCK (self);
+
+ gst_buffer_map (buf, &read_info, GST_MAP_READ);
/* Allocate buffers */
for (srcs = self->srcpads, i = 0; srcs; srcs = srcs->next, i++) {