From c71fe3f75d04ceb5185a53d25747d7c3283b86fe Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Wed, 12 Nov 2008 11:55:14 +0000 Subject: gst/qtdemux/qtdemux.*: Queue up new segment events instead of sending them from the seeking thread. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Original commit message from CVS: * gst/qtdemux/qtdemux.h (struct _GstQTDemux): * gst/qtdemux/qtdemux.c (gst_qtdemux_do_seek): Queue up new segment events instead of sending them from the seeking thread. Fixes #559288. (gst_qtdemux_push_pending_newsegment): New helper, sends out queued newsegment events. (gst_qtdemux_loop_state_movie): VoilĂ , call it here. Only need to call it here, as we only seek when looping, and only push in the movie state. --- gst/qtdemux/qtdemux.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) (limited to 'gst/qtdemux/qtdemux.c') diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index 2dddd27b..0876dc60 100644 --- a/gst/qtdemux/qtdemux.c +++ b/gst/qtdemux/qtdemux.c @@ -554,6 +554,16 @@ gst_qtdemux_push_event (GstQTDemux * qtdemux, GstEvent * event) gst_event_unref (event); } +/* push a pending newsegment event, if any from the streaming thread */ +static void +gst_qtdemux_push_pending_newsegment (GstQTDemux * qtdemux) +{ + if (qtdemux->pending_newsegment) { + gst_qtdemux_push_event (qtdemux, qtdemux->pending_newsegment); + qtdemux->pending_newsegment = NULL; + } +} + /* find the index of the sample that includes the data for @media_time * * Returns the index of the sample or n_samples when the sample was not @@ -884,23 +894,21 @@ gst_qtdemux_do_seek (GstQTDemux * qtdemux, GstPad * pad, GstEvent * event) qtdemux->segment.last_stop); if (qtdemux->segment.rate >= 0) { - /* FIXME, needs to be done from the streaming thread. Also, the rate is the - * product of the global rate and the (quicktime) segment rate. */ - gst_qtdemux_push_event (qtdemux, - gst_event_new_new_segment (TRUE, - qtdemux->segment.rate, qtdemux->segment.format, - qtdemux->segment.start, qtdemux->segment.last_stop, - qtdemux->segment.time)); + /* FIXME, rate is the product of the global rate and the (quicktime) + * segment rate. */ + qtdemux->pending_newsegment = gst_event_new_new_segment (TRUE, + qtdemux->segment.rate, qtdemux->segment.format, + qtdemux->segment.start, qtdemux->segment.last_stop, + qtdemux->segment.time); } else { /* For Reverse Playback */ guint64 stop; if ((stop = qtdemux->segment.stop) == -1) stop = qtdemux->segment.duration; /* for reverse playback, we played from stop to last_stop. */ - gst_qtdemux_push_event (qtdemux, - gst_event_new_new_segment (TRUE, - qtdemux->segment.rate, qtdemux->segment.format, - qtdemux->segment.last_stop, stop, qtdemux->segment.last_stop)); + qtdemux->pending_newsegment = gst_event_new_new_segment (TRUE, + qtdemux->segment.rate, qtdemux->segment.format, + qtdemux->segment.last_stop, stop, qtdemux->segment.last_stop); } } @@ -1764,6 +1772,8 @@ gst_qtdemux_loop_state_movie (GstQTDemux * qtdemux) gint index; gint i; + gst_qtdemux_push_pending_newsegment (qtdemux); + /* Figure out the next stream sample to output, min_time is expressed in * global time and runs over the edit list segments. */ min_time = G_MAXUINT64; -- cgit