From d24780a03bcdf6f8ea6ef91f1f08b8af18f73dc8 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 19 Mar 2007 10:52:50 +0000 Subject: [PATCH] gst/playback/gstdecodebin.c: Don't post STATE_DIRTY anymore. 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 | 12 +++++++ gst/playback/gstdecodebin.c | 3 -- gst/playback/gstplaybin.c | 68 +++++++------------------------------ 3 files changed, 24 insertions(+), 59 deletions(-) diff --git a/ChangeLog b/ChangeLog index 936d4010e5..31588abddd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2007-03-19 Wim Taymans + + * 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 * REQUIREMENTS: Update this file, change the formatting to make diff --git a/gst/playback/gstdecodebin.c b/gst/playback/gstdecodebin.c index 35f75c9606..804d03c890 100644 --- a/gst/playback/gstdecodebin.c +++ b/gst/playback/gstdecodebin.c @@ -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))); } } diff --git a/gst/playback/gstplaybin.c b/gst/playback/gstplaybin.c index 8f548c3339..e7a7da9c11 100644 --- a/gst/playback/gstplaybin.c +++ b/gst/playback/gstplaybin.c @@ -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) {