[gst-cvs] gst-plugins-ugly: asfdemux: 0-base timestamps consistently ( whether or not streaming)
Mark Nauwelaerts
mnauw at kemper.freedesktop.org
Tue May 5 13:47:01 PDT 2009
Module: gst-plugins-ugly
Branch: master
Commit: 8b2812ca2efb477a9326f3d710cfd876aa609c9a
URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-ugly/commit/?id=8b2812ca2efb477a9326f3d710cfd876aa609c9a
Author: Mark Nauwelaerts <mark.nauwelaerts at collabora.co.uk>
Date: Sat May 2 16:51:11 2009 +0200
asfdemux: 0-base timestamps consistently (whether or not streaming)
This also makes timestamps (more) consistent before and after a possible
seek, and moreover makes for reasonable position reporting in live stream
(whose payload timestamps should not be taken for granted).
---
gst/asfdemux/asfpacket.c | 28 +++++++++++++++++-----------
gst/asfdemux/gstasfdemux.c | 5 +++--
gst/asfdemux/gstasfdemux.h | 1 +
3 files changed, 21 insertions(+), 13 deletions(-)
diff --git a/gst/asfdemux/asfpacket.c b/gst/asfdemux/asfpacket.c
index 8b86653..f7972d2 100644
--- a/gst/asfdemux/asfpacket.c
+++ b/gst/asfdemux/asfpacket.c
@@ -129,20 +129,13 @@ gst_asf_payload_queue_for_stream (GstASFDemux * demux, AsfPayload * payload,
GST_DEBUG_OBJECT (demux, "first ts: %" GST_TIME_FORMAT,
GST_TIME_ARGS (payload->ts));
demux->first_ts = payload->ts;
- if (demux->streaming) {
- gst_segment_set_seek (&demux->segment, demux->segment.rate,
- GST_FORMAT_TIME, demux->segment.flags, GST_SEEK_TYPE_SET,
- demux->first_ts, GST_SEEK_TYPE_NONE, 0, NULL);
- }
}
/* make timestamps start from 0 */
- if (!demux->streaming) {
- if (demux->first_ts < payload->ts)
- payload->ts -= demux->first_ts;
- else
- payload->ts = 0;
- }
+ if (demux->first_ts < payload->ts)
+ payload->ts -= demux->first_ts;
+ else
+ payload->ts = 0;
/* remove any incomplete payloads that will never be completed */
while (stream->payloads->len > 0) {
@@ -190,6 +183,19 @@ gst_asf_payload_queue_for_stream (GstASFDemux * demux, AsfPayload * payload,
GST_BUFFER_FLAG_SET (payload->buf, GST_BUFFER_FLAG_DISCONT);
}
+ /* remember the first queued timestamp for the segment */
+ if (!GST_CLOCK_TIME_IS_VALID (demux->segment_ts) &&
+ GST_CLOCK_TIME_IS_VALID (payload->ts)) {
+ GST_DEBUG_OBJECT (demux, "segment ts: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (payload->ts));
+ demux->segment_ts = payload->ts;
+ /* always note, but only determines segment when streaming */
+ if (demux->streaming)
+ gst_segment_set_seek (&demux->segment, demux->segment.rate,
+ GST_FORMAT_TIME, demux->segment.flags, GST_SEEK_TYPE_SET,
+ demux->segment_ts, GST_SEEK_TYPE_NONE, 0, NULL);
+ }
+
g_array_append_vals (stream->payloads, payload, 1);
}
diff --git a/gst/asfdemux/gstasfdemux.c b/gst/asfdemux/gstasfdemux.c
index 67fed5b..3a92700 100644
--- a/gst/asfdemux/gstasfdemux.c
+++ b/gst/asfdemux/gstasfdemux.c
@@ -207,6 +207,7 @@ gst_asf_demux_reset (GstASFDemux * demux)
demux->num_streams = 0;
demux->activated_streams = FALSE;
demux->first_ts = GST_CLOCK_TIME_NONE;
+ demux->segment_ts = GST_CLOCK_TIME_NONE;
demux->state = GST_ASF_DEMUX_STATE_HEADER;
demux->seekable = FALSE;
demux->broadcast = FALSE;
@@ -313,7 +314,7 @@ gst_asf_demux_sink_event (GstPad * pad, GstEvent * event)
/* in either case, clear some state and generate newsegment later on */
GST_OBJECT_LOCK (demux);
- demux->first_ts = GST_CLOCK_TIME_NONE;
+ demux->segment_ts = GST_CLOCK_TIME_NONE;
demux->need_newsegment = TRUE;
gst_asf_demux_reset_stream_state_after_discont (demux);
GST_OBJECT_UNLOCK (demux);
@@ -1185,7 +1186,7 @@ gst_asf_demux_push_complete_payloads (GstASFDemux * demux, gboolean force)
if (demux->need_newsegment) {
/* wait until we had a chance to "lock on" some payload's timestamp */
- if (!GST_CLOCK_TIME_IS_VALID (demux->first_ts))
+ if (!GST_CLOCK_TIME_IS_VALID (demux->segment_ts))
return GST_FLOW_OK;
if (demux->segment.stop == GST_CLOCK_TIME_NONE &&
diff --git a/gst/asfdemux/gstasfdemux.h b/gst/asfdemux/gstasfdemux.h
index 37fd413..86a3cfb 100644
--- a/gst/asfdemux/gstasfdemux.h
+++ b/gst/asfdemux/gstasfdemux.h
@@ -169,6 +169,7 @@ struct _GstASFDemux {
GstSegment segment; /* configured play segment */
gboolean need_newsegment; /* do we need to send a new-segment event? */
+ GstClockTime segment_ts; /* streaming; timestamp for segment start */
gboolean segment_running; /* if we've started the current segment */
gboolean streaming; /* TRUE if we are operating chain-based */
GstClockTime latency;
More information about the Gstreamer-commits
mailing list