streamsynchronizer: Unblock EOS wait when track switching.
authorSong Bing <b06498@freescale.com>
Wed, 17 Jun 2015 10:03:09 +0000 (18:03 +0800)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 23 Jun 2015 13:28:49 +0000 (15:28 +0200)
sink_event () will blocked on EOS event. which will cause can't
send event when switch EOS track to non-EOS one.

https://bugzilla.gnome.org/show_bug.cgi?id=750761

gst/playback/gststreamsynchronizer.c

index d417670..b55e328 100644 (file)
@@ -513,6 +513,25 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
       GST_STREAM_SYNCHRONIZER_UNLOCK (self);
       break;
     }
+      /* unblocking EOS wait when track switch. */
+    case GST_EVENT_CUSTOM_DOWNSTREAM_OOB:{
+      if (gst_event_has_name (event, "playsink-custom-video-flush")
+          || gst_event_has_name (event, "playsink-custom-audio-flush")
+          || gst_event_has_name (event, "playsink-custom-subtitle-flush")) {
+        GstStream *stream;
+
+        GST_STREAM_SYNCHRONIZER_LOCK (self);
+        stream = gst_pad_get_element_private (pad);
+        if (stream) {
+          stream->is_eos = FALSE;
+          stream->eos_sent = FALSE;
+          stream->wait = FALSE;
+          g_cond_broadcast (&stream->stream_finish_cond);
+        }
+        GST_STREAM_SYNCHRONIZER_UNLOCK (self);
+      }
+      break;
+    }
     case GST_EVENT_EOS:{
       GstStream *stream;
       GList *l;