summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim.muller@collabora.co.uk>2010-05-24 17:26:42 +0100
committerTim-Philipp Müller <tim.muller@collabora.co.uk>2010-05-26 00:05:54 +0100
commit6a9983cd20c48b96396229b3f94d0254a05ddf48 (patch)
treec05c745197e6da09966a92d6d5271bf8b65f9bdd
parent49463a37cbaa952e1401291f0a2623de6cab3880 (diff)
avimux, flvmux, matroskamux: don't crash if tags arrive on multiple input pads at the same time
This is a temporary fix for the release only. Fixes #619533.
-rw-r--r--gst/avi/gstavimux.c10
-rw-r--r--gst/flv/gstflvmux.c10
-rw-r--r--gst/matroska/matroska-mux.c6
3 files changed, 24 insertions, 2 deletions
diff --git a/gst/avi/gstavimux.c b/gst/avi/gstavimux.c
index 8a7d843e6..17ec92db2 100644
--- a/gst/avi/gstavimux.c
+++ b/gst/avi/gstavimux.c
@@ -1166,7 +1166,10 @@ gst_avi_mux_riff_get_avi_header (GstAviMux * avimux)
else {
/* need to make snapshot of current state of tags to ensure the same set
* is used next time around during header rewrite at the end */
+ /* FIXME: remove locking again after GstTagSetter has been fixed */
+ GST_OBJECT_LOCK (avimux);
tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (avimux));
+ GST_OBJECT_UNLOCK (avimux);
if (tags)
tags = avimux->tags_snap = gst_tag_list_copy (tags);
}
@@ -1919,10 +1922,15 @@ gst_avi_mux_handle_event (GstPad * pad, GstEvent * event)
case GST_EVENT_TAG:{
GstTagList *list;
GstTagSetter *setter = GST_TAG_SETTER (avimux);
- const GstTagMergeMode mode = gst_tag_setter_get_tag_merge_mode (setter);
+ GstTagMergeMode mode;
gst_event_parse_tag (event, &list);
+
+ /* FIXME: remove locking again after GstTagSetter has been fixed */
+ GST_OBJECT_LOCK (avimux);
+ mode = gst_tag_setter_get_tag_merge_mode (setter);
gst_tag_setter_merge_tags (setter, list, mode);
+ GST_OBJECT_UNLOCK (avimux);
break;
}
default:
diff --git a/gst/flv/gstflvmux.c b/gst/flv/gstflvmux.c
index 883ebb756..1addaa4b0 100644
--- a/gst/flv/gstflvmux.c
+++ b/gst/flv/gstflvmux.c
@@ -256,10 +256,15 @@ gst_flv_mux_handle_sink_event (GstPad * pad, GstEvent * event)
case GST_EVENT_TAG:{
GstTagList *list;
GstTagSetter *setter = GST_TAG_SETTER (mux);
- const GstTagMergeMode mode = gst_tag_setter_get_tag_merge_mode (setter);
+ GstTagMergeMode mode;
gst_event_parse_tag (event, &list);
+
+ /* FIXME: remove locking again after GstTagSetter has been fixed */
+ GST_OBJECT_LOCK (mux);
+ mode = gst_tag_setter_get_tag_merge_mode (setter);
gst_tag_setter_merge_tags (setter, list, mode);
+ GST_OBJECT_UNLOCK (mux);
break;
}
case GST_EVENT_NEWSEGMENT:
@@ -634,7 +639,10 @@ gst_flv_mux_create_metadata (GstFlvMux * mux)
guint8 *data;
gint i, n_tags, tags_written = 0;
+ /* FIXME: remove locking again after GstTagSetter has been fixed */
+ GST_OBJECT_LOCK (mux);
tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (mux));
+ GST_OBJECT_UNLOCK (mux);
GST_DEBUG_OBJECT (mux, "tags = %" GST_PTR_FORMAT, tags);
diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c
index e21e763c6..15441a183 100644
--- a/gst/matroska/matroska-mux.c
+++ b/gst/matroska/matroska-mux.c
@@ -625,8 +625,11 @@ gst_matroska_mux_handle_sink_event (GstPad * pad, GstEvent * event)
g_free (lang);
}
+ /* FIXME: remove locking again after GstTagSetter has been fixed */
+ GST_OBJECT_LOCK (mux);
gst_tag_setter_merge_tags (GST_TAG_SETTER (mux), list,
gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (mux)));
+ GST_OBJECT_UNLOCK (mux);
break;
}
case GST_EVENT_NEWSEGMENT:
@@ -2205,7 +2208,10 @@ gst_matroska_mux_finish (GstMatroskaMux * mux)
}
/* tags */
+ /* FIXME: remove locking again after GstTagSetter has been fixed */
+ GST_OBJECT_LOCK (mux);
tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (mux));
+ GST_OBJECT_UNLOCK (mux);
if (tags != NULL && !gst_tag_list_is_empty (tags)) {
guint64 master_tags, master_tag;