From c71fe3f75d04ceb5185a53d25747d7c3283b86fe Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Wed, 12 Nov 2008 11:55:14 +0000 Subject: [PATCH] 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=utf8 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. --- ChangeLog | 12 ++++++++++++ gst/qtdemux/qtdemux.c | 32 +++++++++++++++++++++----------- gst/qtdemux/qtdemux.h | 1 + 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1b33eba..235fcd8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-11-12 Andy Wingo + + * 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. + 2008-11-11 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: (qtdemux_tag_add_tmpo), diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index 2dddd27..0876dc6 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; diff --git a/gst/qtdemux/qtdemux.h b/gst/qtdemux/qtdemux.h index c887df7..cb67096 100644 --- a/gst/qtdemux/qtdemux.h +++ b/gst/qtdemux/qtdemux.h @@ -89,6 +89,7 @@ struct _GstQTDemux { /* configured playback region */ GstSegment segment; gboolean segment_running; + GstEvent *pending_newsegment; }; struct _GstQTDemuxClass { -- 2.7.4