mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-25 16:48:11 +00:00
gst/playback/gstplaybin.c: Override send_event differently, so that we can takes bits of functionality from GstPipeli...
Original commit message from CVS: * gst/playback/gstplaybin.c: (gst_play_bin_send_event_to_sink), (do_playbin_seek), (gst_play_bin_send_event): Override send_event differently, so that we can takes bits of functionality from GstPipeline (special handling for seeks, including pausing/resuming, and resetting stream time) and still get the appropriate behaviour of only forwarding event to a single sink, rather than all of them. Unfortunately requires a lot of code duplication, but the alternatives are equally ugly in the end.
This commit is contained in:
parent
e784ac83b6
commit
70b42a65cb
2 changed files with 80 additions and 7 deletions
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
2005-10-11 Michael Smith <msmith@fluendo.com>
|
||||||
|
|
||||||
|
* gst/playback/gstplaybin.c: (gst_play_bin_send_event_to_sink),
|
||||||
|
(do_playbin_seek), (gst_play_bin_send_event):
|
||||||
|
Override send_event differently, so that we can takes bits of
|
||||||
|
functionality from GstPipeline (special handling for seeks,
|
||||||
|
including pausing/resuming, and resetting stream time) and still get
|
||||||
|
the appropriate behaviour of only forwarding event to a single sink,
|
||||||
|
rather than all of them.
|
||||||
|
Unfortunately requires a lot of code duplication, but the
|
||||||
|
alternatives are equally ugly in the end.
|
||||||
|
|
||||||
2005-10-11 Thomas Vander Stichele <thomas at apestaart dot org>
|
2005-10-11 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||||
|
|
||||||
* check/elements/audioconvert.c: (setup_audioconvert),
|
* check/elements/audioconvert.c: (setup_audioconvert),
|
||||||
|
|
|
@ -858,16 +858,15 @@ setup_sinks (GstPlayBaseBin * play_base_bin, GstPlayBaseGroup * group)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Send an event to our sinks until one of them works; don't then send to the
|
||||||
|
* remaining sinks (unlike GstBin)
|
||||||
|
*/
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_play_bin_send_event (GstElement * element, GstEvent * event)
|
gst_play_bin_send_event_to_sink (GstPlayBin * play_bin, GstEvent * event)
|
||||||
{
|
{
|
||||||
GstPlayBin *play_bin;
|
GList *sinks = play_bin->sinks;
|
||||||
GList *sinks;
|
gboolean res = TRUE;
|
||||||
gboolean res = FALSE;
|
|
||||||
|
|
||||||
play_bin = GST_PLAY_BIN (element);
|
|
||||||
|
|
||||||
sinks = play_bin->sinks;
|
|
||||||
while (sinks) {
|
while (sinks) {
|
||||||
GstElement *sink = GST_ELEMENT_CAST (sinks->data);
|
GstElement *sink = GST_ELEMENT_CAST (sinks->data);
|
||||||
|
|
||||||
|
@ -883,6 +882,68 @@ gst_play_bin_send_event (GstElement * element, GstEvent * event)
|
||||||
return res;
|
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;
|
||||||
|
GTimeVal timeout;
|
||||||
|
|
||||||
|
GST_TIME_TO_TIMEVAL (0, timeout);
|
||||||
|
/* need to call _get_state() since a bin state is only updated
|
||||||
|
* with this call. */
|
||||||
|
gst_element_get_state (element, &state, NULL, &timeout);
|
||||||
|
was_playing = state == GST_STATE_PLAYING;
|
||||||
|
|
||||||
|
if (was_playing) {
|
||||||
|
gst_element_set_state (element, GST_STATE_PAUSED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res = gst_play_bin_send_event_to_sink (GST_PLAY_BIN (element), event);
|
||||||
|
|
||||||
|
if (flush && res) {
|
||||||
|
/* need to reset the stream time to 0 after a flushing seek */
|
||||||
|
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. */
|
||||||
|
static gboolean
|
||||||
|
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);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
res = gst_play_bin_send_event_to_sink (GST_PLAY_BIN (element), event);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
static GstStateChangeReturn
|
static GstStateChangeReturn
|
||||||
gst_play_bin_change_state (GstElement * element, GstStateChange transition)
|
gst_play_bin_change_state (GstElement * element, GstStateChange transition)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue