gst/playback/gstdecodebin.c: Don't post STATE_DIRTY anymore.
authorWim Taymans <wim.taymans@gmail.com>
Mon, 19 Mar 2007 10:52:50 +0000 (10:52 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Mon, 19 Mar 2007 10:52:50 +0000 (10:52 +0000)
Original commit message from CVS:
* gst/playback/gstdecodebin.c: (remove_fakesink):
Don't post STATE_DIRTY anymore.
* gst/playback/gstplaybin.c: (add_sink), (gst_play_bin_send_event),
(gst_play_bin_change_state):
Remove stream_time reset in seek handling, core does that now.
Disable clocking for live pipelines by forcing a NULL clock to the
complete pipeline, core is too smart now for our previous hack.
We can always autoplug in PAUSED now.

ChangeLog
gst/playback/gstdecodebin.c
gst/playback/gstplaybin.c

index 936d401..31588ab 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2007-03-19  Wim Taymans  <wim@fluendo.com>
+
+       * gst/playback/gstdecodebin.c: (remove_fakesink):
+       Don't post STATE_DIRTY anymore.
+
+       * gst/playback/gstplaybin.c: (add_sink), (gst_play_bin_send_event),
+       (gst_play_bin_change_state):
+       Remove stream_time reset in seek handling, core does that now.
+       Disable clocking for live pipelines by forcing a NULL clock to the
+       complete pipeline, core is too smart now for our previous hack.
+       We can always autoplug in PAUSED now.
+
 2007-03-17  David Schleef  <ds@schleef.org>
 
        * REQUIREMENTS:  Update this file, change the formatting to make
index 35f75c9..804d03c 100644 (file)
@@ -622,9 +622,6 @@ remove_fakesink (GstDecodeBin * decode_bin)
 
   if (removed_fakesink) {
     free_pad_probes (decode_bin);
-
-    gst_element_post_message (GST_ELEMENT_CAST (decode_bin),
-        gst_message_new_state_dirty (GST_OBJECT_CAST (decode_bin)));
   }
 }
 
index 8f548c3..e7a7da9 100644 (file)
@@ -1137,8 +1137,8 @@ link_failed:
  * visualisation ouput.  The idea is to split the audio using tee, then 
  * sending the output to the regular audio bin and the other output to
  * the vis plugin that transforms it into a video that is rendered with the
- * normal video bin. The video bin is run in a thread to make sure it does
- * not block the audio playback pipeline.
+ * normal video bin. The video and audio bins are run in threads to make sure
+ * they don't block eachother.
  *
  *  +-----------------------------------------------------------------------+
  *  | visbin                                                                |
@@ -1154,7 +1154,7 @@ link_failed:
  *  |   |  |      |                                                         |
  *  |   |  +------+                                                         |
  * sink-+                                                                   |
  +------------------------------------------------------------------------+
*  +-----------------------------------------------------------------------+
  */
 static GstElement *
 gen_vis_element (GstPlayBin * play_bin)
@@ -1407,12 +1407,7 @@ add_sink (GstPlayBin * play_bin, GstElement * sink, GstPad * srcpad,
 
   g_return_val_if_fail (sink != NULL, FALSE);
 
-  /* For live pipelines we need to add the bin in the same state as the 
-   * parent so that it starts as soon as it is prerolled. */
-  if (play_bin->is_live)
-    state = GST_STATE_PLAYING;
-  else
-    state = GST_STATE_PAUSED;
+  state = GST_STATE_PAUSED;
 
   /* this is only for debugging */
   parent = gst_pad_get_parent_element (srcpad);
@@ -1425,10 +1420,12 @@ add_sink (GstPlayBin * play_bin, GstElement * sink, GstPad * srcpad,
 
   /* for live pipelines, disable the sync in the sinks until core handles this
    * correctly. */
-  if (play_bin->is_live)
+  if (play_bin->is_live) {
+    gst_pipeline_use_clock (GST_PIPELINE (play_bin), NULL);
     gst_element_set_clock (sink, NULL);
+  }
 
-  /* bring it to the PAUSED state so we can link to the peer without
+  /* bring it to the required state so we can link to the peer without
    * breaking the flow */
   stateret = gst_element_set_state (sink, state);
   if (stateret == GST_STATE_CHANGE_FAILURE)
@@ -1677,48 +1674,6 @@ gst_play_bin_send_event_to_sink (GstPlayBin * play_bin, GstEvent * event)
   return res;
 }
 
-static gboolean
-do_playbin_seek (GstElement * element, GstEvent * event)
-{
-  gdouble rate;
-  GstSeekFlags flags;
-  gboolean flush;
-  gboolean was_playing = FALSE;
-  gboolean res;
-
-  gst_event_parse_seek (event, &rate, NULL, &flags, NULL, NULL, NULL, NULL);
-
-  flush = flags & GST_SEEK_FLAG_FLUSH;
-
-  if (flush) {
-    GstState state;
-
-    /* need to call _get_state() since a bin state is only updated
-     * with this call. */
-    gst_element_get_state (element, &state, NULL, 0);
-    was_playing = state == GST_STATE_PLAYING;
-
-    if (was_playing) {
-      gst_element_set_state (element, GST_STATE_PAUSED);
-      gst_element_get_state (element, NULL, NULL, 50 * GST_MSECOND);
-    }
-  }
-
-  GST_DEBUG_OBJECT (element, "Sending seek event to a sink");
-  res = gst_play_bin_send_event_to_sink (GST_PLAY_BIN (element), event);
-
-  if (flush) {
-    /* need to reset the stream time to 0 after a flushing seek */
-    if (res)
-      gst_pipeline_set_new_stream_time (GST_PIPELINE (element), 0);
-
-    if (was_playing)
-      /* and continue playing */
-      gst_element_set_state (element, GST_STATE_PLAYING);
-  }
-  return res;
-}
-
 /* We only want to send the event to a single sink (overriding GstBin's 
  * behaviour), but we want to keep GstPipeline's behaviour - wrapping seek
  * events appropriately. So, this is a messy duplication of code. */
@@ -1728,13 +1683,13 @@ gst_play_bin_send_event (GstElement * element, GstEvent * event)
   gboolean res = FALSE;
   GstEventType event_type = GST_EVENT_TYPE (event);
 
-
   switch (event_type) {
     case GST_EVENT_SEEK:
-      res = do_playbin_seek (element, event);
+      GST_DEBUG_OBJECT (element, "Sending seek event to a sink");
+      res = gst_play_bin_send_event_to_sink (GST_PLAY_BIN (element), event);
       break;
     default:
-      res = gst_play_bin_send_event_to_sink (GST_PLAY_BIN (element), event);
+      res = parent_class->send_event (element, event);
       break;
   }
 
@@ -1886,6 +1841,7 @@ gst_play_bin_change_state (GstElement * element, GstStateChange transition)
 
   switch (transition) {
     case GST_STATE_CHANGE_READY_TO_PAUSED:
+      gst_pipeline_auto_clock (GST_PIPELINE (play_bin));
       /* this really is the easiest way to make the state change return
        * ASYNC until we added the sinks */
       if (!play_bin->fakesink) {