[MOVED FROM GST-P-FARSIGHT] Push out a simple newsegment event
authorOlivier Crete <olivier.crete@collabora.co.uk>
Mon, 31 Mar 2008 18:44:21 +0000 (18:44 +0000)
committerEdward Hervey <bilboed@bilboed.com>
Tue, 17 Feb 2009 18:29:03 +0000 (19:29 +0100)
20080331184421-3e2dc-69544b5b03ae3bb8c1e3f967974fd250d04056b5.gz

gst/liveadder/liveadder.c
gst/liveadder/liveadder.h

index 1cbf6ad..808fdca 100644 (file)
@@ -547,6 +547,9 @@ gst_live_adder_sink_event (GstPad * pad, GstEvent * event)
     case GST_EVENT_FLUSH_STOP:
       ret = gst_pad_push_event (adder->srcpad, event);
       ret = gst_live_adder_src_activate_push (adder->srcpad, TRUE);
+      GST_OBJECT_LOCK (adder);
+      adder->segment_pending = TRUE;
+      GST_OBJECT_UNLOCK (adder);
       break;
     case GST_EVENT_EOS:
     {
@@ -927,6 +930,7 @@ gst_live_adder_loop (gpointer data)
   GstClockReturn ret;
   GstBuffer *buffer = NULL;
   GstFlowReturn result;
+  GstEvent *newseg_event = NULL;
 
   GST_OBJECT_LOCK (adder);
 
@@ -1016,8 +1020,27 @@ gst_live_adder_loop (gpointer data)
   adder->next_timestamp = GST_BUFFER_TIMESTAMP (buffer) +
       GST_BUFFER_DURATION (buffer);
 
+  if (adder->segment_pending)
+  {
+    /*
+     * We should probably loop through all of the sinks that have a segment
+     * and take the min of the starts and the max of the stops
+     * and convert them to running times and use these are start/stop.
+     * And so something smart about the positions with seeks that I dont
+     * understand yet.
+     */
+     newseg_event = gst_event_new_new_segment_full (FALSE, 1.0,
+        1.0, GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (buffer), -1,
+        0);
+
+    adder->segment_pending = FALSE;
+  }
+
   GST_OBJECT_UNLOCK (adder);
 
+  if (newseg_event)
+    gst_pad_push_event (adder->srcpad, newseg_event);
+
   result = gst_pad_push (adder->srcpad, buffer);
   if (result != GST_FLOW_OK)
     goto pause;
@@ -1188,6 +1211,7 @@ gst_live_adder_change_state (GstElement * element, GstStateChange transition)
     case GST_STATE_CHANGE_READY_TO_PAUSED:
       {
         GST_OBJECT_LOCK (adder);
+        adder->segment_pending = TRUE;
         adder->peer_latency = 0;
         adder->next_timestamp = GST_CLOCK_TIME_NONE;
         g_list_foreach (adder->sinkpads, reset_pad_private, adder);
index 3cb3684..0ad93e5 100644 (file)
@@ -90,6 +90,8 @@ struct _GstLiveAdder {
 
   GstClockTime    latency_ms;
   GstClockTime    peer_latency;
+
+  gboolean        segment_pending;
 };
 
 struct _GstLiveAdderClass {