matroskademux: only seek when in proper state
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Tue, 23 Mar 2010 16:47:48 +0000 (17:47 +0100)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Fri, 26 Mar 2010 10:45:47 +0000 (11:45 +0100)
... and data structures can be thread-safely accessed.

See #601617.

gst/matroska/matroska-demux.c

index 9375717edbd0b9f12c05c3acb4daf6db90a1929c..d7d69e960315bfb4198c1e60baac0cf07edf5aab 100644 (file)
@@ -2090,7 +2090,6 @@ gst_matroska_demux_send_event (GstMatroskaDemux * demux, GstEvent * event)
 
   is_newsegment = (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT);
 
-  /* FIXME: access to demux->src is not thread-safe here */
   g_assert (demux->src->len == demux->num_streams);
   for (i = 0; i < demux->src->len; i++) {
     GstMatroskaTrackContext *stream;
@@ -2153,7 +2152,6 @@ gst_matroska_demux_get_seek_track (GstMatroskaDemux * demux,
   if (track && track->type == GST_MATROSKA_TRACK_TYPE_VIDEO)
     return track;
 
-  /*  FIXME thread safety */
   for (i = 0; i < demux->src->len; i++) {
     GstMatroskaTrackContext *stream;
 
@@ -2231,6 +2229,12 @@ gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux,
   GstSegment seeksegment = { 0, };
   gboolean update;
 
+  /* no seeking until we are (safely) ready */
+  if (demux->state != GST_MATROSKA_DEMUX_STATE_DATA) {
+    GST_DEBUG_OBJECT (demux, "not ready for seeking yet");
+    return FALSE;
+  }
+
   if (pad)
     track = gst_pad_get_element_private (pad);