summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@ocrete.ca>2015-03-07 22:08:40 -0500
committerOlivier CrĂȘte <olivier.crete@collabora.com>2015-03-16 14:31:50 -0400
commitff9be3ba34b62e064432244b779d524adf7fe84c (patch)
treeda157d3d49121612853e1fc0a4a45cf83934fd4f
parent2d553d1b25863a5c0d2bec99957aa3cd00301a13 (diff)
audiomixer: Release pad object lock before dropping buffer
Otherwise, the locking order is violated and deadlocks happen. https://bugzilla.gnome.org/show_bug.cgi?id=745768
-rw-r--r--gst/audiomixer/gstaudiomixer.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/gst/audiomixer/gstaudiomixer.c b/gst/audiomixer/gstaudiomixer.c
index 4ea631035..d1daff652 100644
--- a/gst/audiomixer/gstaudiomixer.c
+++ b/gst/audiomixer/gstaudiomixer.c
@@ -1141,6 +1141,7 @@ gst_audio_mixer_mix_buffer (GstAudioMixer * audiomixer, GstAudioMixerPad * pad,
GstMapInfo inmap;
gint bpf;
guint blocksize;
+ gboolean drop_buf = FALSE;
GstAggregatorPad *aggpad = GST_AGGREGATOR_PAD (pad);
@@ -1176,9 +1177,11 @@ gst_audio_mixer_mix_buffer (GstAudioMixer * audiomixer, GstAudioMixerPad * pad,
if (pad->position >= pad->size) {
/* Buffer done, drop it */
gst_buffer_replace (&pad->buffer, NULL);
- gst_aggregator_pad_drop_buffer (aggpad);
+ drop_buf = TRUE;
}
GST_OBJECT_UNLOCK (pad);
+ if (drop_buf)
+ gst_aggregator_pad_drop_buffer (aggpad);
return;
}
@@ -1189,8 +1192,8 @@ gst_audio_mixer_mix_buffer (GstAudioMixer * audiomixer, GstAudioMixerPad * pad,
pad->output_offset += pad->size / bpf;
/* Buffer done, drop it */
gst_buffer_replace (&pad->buffer, NULL);
- gst_aggregator_pad_drop_buffer (aggpad);
GST_OBJECT_UNLOCK (pad);
+ gst_aggregator_pad_drop_buffer (aggpad);
return;
}
@@ -1300,11 +1303,14 @@ gst_audio_mixer_mix_buffer (GstAudioMixer * audiomixer, GstAudioMixerPad * pad,
if (pad->position == pad->size) {
/* Buffer done, drop it */
gst_buffer_replace (&pad->buffer, NULL);
- gst_aggregator_pad_drop_buffer (aggpad);
GST_DEBUG_OBJECT (pad, "Finished mixing buffer, waiting for next");
+ drop_buf = TRUE;
}
GST_OBJECT_UNLOCK (pad);
+
+ if (drop_buf)
+ gst_aggregator_pad_drop_buffer (aggpad);
}
static GstFlowReturn