diff options
author | Mathieu Duponchelle <mathieu@centricular.com> | 2021-05-11 20:02:28 +0300 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2021-05-14 19:12:57 +0300 |
commit | 96800c0b4a4983774499eff528aa3d1d42f6df80 (patch) | |
tree | 03c56c235cd8f6d4e3474a2acbf0bd64c4ffd96a | |
parent | ab4ec53d5647248bb68db88e3a09cdd367439a87 (diff) |
concat: fix locking in SEGMENT event handler
concat->current_start_offset needs the lock taken for safe access,
as it can be accessed from outside of the streaming thread, eg
in release_pad.
An early break is also added for an error case.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/822>
-rw-r--r-- | plugins/elements/gstconcat.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/plugins/elements/gstconcat.c b/plugins/elements/gstconcat.c index 049554605a..1558e70cb1 100644 --- a/plugins/elements/gstconcat.c +++ b/plugins/elements/gstconcat.c @@ -556,7 +556,6 @@ gst_concat_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) self->format = spad->segment.format; GST_DEBUG_OBJECT (self, "Operating in %s format", gst_format_get_name (self->format)); - g_mutex_unlock (&self->lock); } else if (self->format != spad->segment.format) { g_mutex_unlock (&self->lock); GST_ELEMENT_ERROR (self, CORE, FAILED, (NULL), @@ -564,16 +563,19 @@ gst_concat_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) gst_format_get_name (self->format), gst_format_get_name (spad->segment.format))); ret = FALSE; - } else { - g_mutex_unlock (&self->lock); + break; } + g_mutex_unlock (&self->lock); + if (!gst_concat_pad_wait (spad, self)) { ret = FALSE; } else { GstSegment segment = spad->segment; GstEvent *topush; + g_mutex_lock (&self->lock); + if (adjust_base) { /* We know no duration */ segment.duration = -1; @@ -607,6 +609,8 @@ gst_concat_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) topush = gst_event_new_segment (&segment); gst_event_set_seqnum (topush, gst_event_get_seqnum (event)); + g_mutex_unlock (&self->lock); + gst_pad_push_event (self->srcpad, topush); } break; |