summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2008-11-12 11:55:14 +0000
committerAndy Wingo <wingo@pobox.com>2008-11-12 11:55:14 +0000
commitc71fe3f75d04ceb5185a53d25747d7c3283b86fe (patch)
tree0639af3d99b392f033b0d1a10837c4b82c7238ec
parent03ab3610c76eae0223a02c8871f6f58d114446ed (diff)
gst/qtdemux/qtdemux.*: Queue up new segment events instead of sending them from the seeking thread.
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.
-rw-r--r--ChangeLog12
-rw-r--r--gst/qtdemux/qtdemux.c32
-rw-r--r--gst/qtdemux/qtdemux.h1
3 files changed, 34 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 1b33eba0..235fcd87 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2008-11-12 Andy Wingo <wingo@pobox.com>
+
+ * 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 <mark.nauwelaerts@collabora.co.uk>
* gst/qtdemux/qtdemux.c: (qtdemux_tag_add_tmpo),
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;
diff --git a/gst/qtdemux/qtdemux.h b/gst/qtdemux/qtdemux.h
index c887df7c..cb67096b 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 {