streamsynchronizer: Send GAP events from the pads' streaming threads
authorSong Bing <b06498@freescale.com>
Mon, 12 Jan 2015 09:40:25 +0000 (17:40 +0800)
committerSebastian Dröge <sebastian@centricular.com>
Mon, 16 Feb 2015 12:12:28 +0000 (14:12 +0200)
Change the GAP events that are currently sent from the chain function of
the current pad to all other EOS pads. They should instead be sent from
their own streaming threads.

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

gst/playback/gststreamsynchronizer.c

index dfc955f..50fc7b9 100644 (file)
@@ -70,6 +70,7 @@ typedef struct
   gboolean eos_sent;            /* when EOS was sent downstream */
   gboolean flushing;            /* set after flush-start and before flush-stop */
   gboolean seen_data;
+  GstClockTime gap_duration;
 
   GCond stream_finish_cond;
 
@@ -231,8 +232,13 @@ gst_stream_synchronizer_wait (GstStreamSynchronizer * self, GstPad * pad)
         continue;
       }
 
-      event = gst_event_new_gap (stream->segment.position, GST_CLOCK_TIME_NONE);
-      GST_DEBUG_OBJECT (pad, "Send GAP event");
+      event =
+          gst_event_new_gap (stream->segment.position, stream->gap_duration);
+      GST_DEBUG_OBJECT (pad,
+          "Send GAP event, position: %" GST_TIME_FORMAT " duration: %"
+          GST_TIME_FORMAT, GST_TIME_ARGS (stream->segment.position),
+          GST_TIME_ARGS (stream->gap_duration));
+
       /* drop lock when sending GAP event, which may block in e.g. preroll */
       GST_STREAM_SYNCHRONIZER_UNLOCK (self);
       ret = gst_pad_push_event (pad, event);
@@ -545,6 +551,7 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
       } else {
         if (seen_data) {
           self->send_gap_event = TRUE;
+          stream->gap_duration = GST_CLOCK_TIME_NONE;
           ret = gst_stream_synchronizer_wait (self, srcpad);
         }
       }
@@ -689,8 +696,9 @@ gst_stream_synchronizer_sink_chain (GstPad * pad, GstObject * parent,
 
         ostream->segment.position = new_start;
 
-        gst_pad_push_event (ostream->srcpad,
-            gst_event_new_gap (position, new_start - position));
+        self->send_gap_event = TRUE;
+        ostream->gap_duration = new_start - position;
+        g_cond_broadcast (&ostream->stream_finish_cond);
       }
     }
     GST_STREAM_SYNCHRONIZER_UNLOCK (self);
@@ -912,6 +920,7 @@ gst_stream_synchronizer_change_state (GstElement * element,
          * which reach EOS to send GAP event. */
         if (stream->is_eos && !stream->eos_sent) {
           self->send_gap_event = TRUE;
+          stream->gap_duration = GST_CLOCK_TIME_NONE;
           g_cond_broadcast (&stream->stream_finish_cond);
         }
       }
@@ -930,6 +939,7 @@ gst_stream_synchronizer_change_state (GstElement * element,
         GstStream *stream = l->data;
 
         gst_segment_init (&stream->segment, GST_FORMAT_UNDEFINED);
+        stream->gap_duration = GST_CLOCK_TIME_NONE;
         stream->wait = FALSE;
         stream->new_stream = FALSE;
         stream->is_eos = FALSE;