summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlessandro Decina <alessandro.d@gmail.com>2008-11-18 16:52:11 +0000
committerAlessandro Decina <alessandro.d@gmail.com>2008-11-18 16:52:11 +0000
commita49918b152aa7b0e998e0f159d4b0128c297c347 (patch)
tree90cb2d74c61e1cb27ffc19274c11ef1645dbda7d
parent6edbddd2d9cd98b568071c1766e5cb7a0a2be836 (diff)
downloadgst-plugins-bad-a49918b152aa7b0e998e0f159d4b0128c297c347.tar.gz
gst-plugins-bad-a49918b152aa7b0e998e0f159d4b0128c297c347.tar.bz2
gst-plugins-bad-a49918b152aa7b0e998e0f159d4b0128c297c347.zip
ext/metadata/gstbasemetadata.c: Avoid deadlock during pad activation.
Original commit message from CVS: * ext/metadata/gstbasemetadata.c: Avoid deadlock during pad activation. Fixes #561241.
-rw-r--r--ChangeLog6
-rw-r--r--ext/metadata/gstbasemetadata.c20
2 files changed, 20 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 857c672d..31348bbe 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-11-18 Alessandro Decina <alessandro.d@gmail.com>
+
+ * ext/metadata/gstbasemetadata.c:
+ Avoid deadlock during pad activation.
+ Fixes #561241.
+
2008-11-17 David Schleef <ds@schleef.org>
* gst/qtmux/gstqtmux.c: Quiet a debugging message that I recently
diff --git a/ext/metadata/gstbasemetadata.c b/ext/metadata/gstbasemetadata.c
index e86c9ce1..0e4eb512 100644
--- a/ext/metadata/gstbasemetadata.c
+++ b/ext/metadata/gstbasemetadata.c
@@ -1807,16 +1807,24 @@ gst_base_metadata_sink_activate (GstPad * pad)
}
if (ret) {
- gst_pad_activate_pull (pad, FALSE);
- gst_pad_activate_push (filter->srcpad, FALSE);
- if (!gst_pad_is_active (pad)) {
- ret = gst_pad_activate_push (filter->srcpad, TRUE);
- ret = ret && gst_pad_activate_push (pad, TRUE);
+ GstActivateMode mode;
+
+ /* in gst_base_metadata_pull_range_parse() we could have triggered
+ * negotiation and plugged new downstream elements.
+ * If GST_PAD_ACTIVATE_MODE (filter->srcpad) is GST_ACTIVATE_PULL it means
+ * that downstream is active in pull mode so we don't deactivate pull mode.
+ */
+ GST_OBJECT_LOCK (filter->srcpad);
+ mode = GST_PAD_ACTIVATE_MODE (filter->srcpad);
+ GST_OBJECT_UNLOCK (filter->srcpad);
+
+ if (mode != GST_ACTIVATE_PULL) {
+ /* change from PULL to PUSH */
+ gst_pad_activate_push (pad, TRUE);
}
}
return ret;
-
}
static gboolean