diff options
author | Olivier CrĂȘte <olivier.crete@ocrete.ca> | 2015-03-07 22:08:40 -0500 |
---|---|---|
committer | Olivier CrĂȘte <olivier.crete@collabora.com> | 2015-03-16 14:31:50 -0400 |
commit | ff9be3ba34b62e064432244b779d524adf7fe84c (patch) | |
tree | da157d3d49121612853e1fc0a4a45cf83934fd4f | |
parent | 2d553d1b25863a5c0d2bec99957aa3cd00301a13 (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.c | 12 |
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 |