mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-30 20:59:44 +00:00
libs/gst/base/gstbasesink.c: Store the sync time of the buffer end position separatly in a new variable eos_rtime so ...
Original commit message from CVS: * libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times), (gst_base_sink_do_sync), (gst_base_sink_chain_unlocked), (gst_base_sink_get_position), (gst_base_sink_change_state): Store the sync time of the buffer end position separatly in a new variable eos_rtime so we can properly sync the EOS event. Fixes #340697. Fix the docs for gst_base_sink_set_qos_enabled(). Don't set segment start to invalid value when we receive a non TIME newsegment. get closer to handling position reporting for negative rates correctly.
This commit is contained in:
parent
4322a015c1
commit
029c8d820b
2 changed files with 41 additions and 13 deletions
20
ChangeLog
20
ChangeLog
|
@ -1,10 +1,24 @@
|
||||||
|
2006-05-08 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
* libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times),
|
||||||
|
(gst_base_sink_do_sync), (gst_base_sink_chain_unlocked),
|
||||||
|
(gst_base_sink_get_position), (gst_base_sink_change_state):
|
||||||
|
Store the sync time of the buffer end position separatly in a
|
||||||
|
new variable eos_rtime so we can properly sync the EOS event.
|
||||||
|
Fixes #340697.
|
||||||
|
Fix the docs for gst_base_sink_set_qos_enabled().
|
||||||
|
Don't set segment start to invalid value when we receive a
|
||||||
|
non TIME newsegment.
|
||||||
|
get closer to handling position reporting for negative rates
|
||||||
|
correctly.
|
||||||
|
|
||||||
2006-05-07 Stefan Kost <ensonic@users.sf.net>
|
2006-05-07 Stefan Kost <ensonic@users.sf.net>
|
||||||
|
|
||||||
* gst/gstcaps.c:
|
* gst/gstcaps.c:
|
||||||
Docs about how to print caps for debug purposes.
|
Docs about how to print caps for debug purposes.
|
||||||
|
|
||||||
* gst/gstpadtemplate.c: (gst_static_pad_template_get):
|
* gst/gstpadtemplate.c: (gst_static_pad_template_get):
|
||||||
use gst_caps_make_writable instead of gst_caps_copy, Fixes #340608
|
use gst_caps_make_writable instead of gst_caps_copy, Fixes #340608
|
||||||
|
|
||||||
2006-05-07 Stefan Kost <ensonic@users.sf.net>
|
2006-05-07 Stefan Kost <ensonic@users.sf.net>
|
||||||
|
|
||||||
|
|
|
@ -161,6 +161,9 @@ struct _GstBaseSinkPrivate
|
||||||
GstClockTime current_rstop;
|
GstClockTime current_rstop;
|
||||||
GstClockTimeDiff current_jitter;
|
GstClockTimeDiff current_jitter;
|
||||||
|
|
||||||
|
/* EOS sync time in running time */
|
||||||
|
GstClockTime eos_rtime;
|
||||||
|
|
||||||
/* last buffer that arrived in time, running time */
|
/* last buffer that arrived in time, running time */
|
||||||
GstClockTime last_in_time;
|
GstClockTime last_in_time;
|
||||||
/* when the last buffer left the sink, running time */
|
/* when the last buffer left the sink, running time */
|
||||||
|
@ -560,7 +563,7 @@ gst_base_sink_get_max_lateness (GstBaseSink * sink)
|
||||||
/**
|
/**
|
||||||
* gst_base_sink_set_qos_enabled:
|
* gst_base_sink_set_qos_enabled:
|
||||||
* @sink: the sink
|
* @sink: the sink
|
||||||
* @qos: the new qos value.
|
* @enabled: the new qos value.
|
||||||
*
|
*
|
||||||
* Configures @sink to send QoS events upstream.
|
* Configures @sink to send QoS events upstream.
|
||||||
*
|
*
|
||||||
|
@ -872,7 +875,10 @@ gst_base_sink_get_sync_times (GstBaseSink * basesink, GstMiniObject * obj,
|
||||||
/* EOS event needs syncing */
|
/* EOS event needs syncing */
|
||||||
case GST_EVENT_EOS:
|
case GST_EVENT_EOS:
|
||||||
sstart = sstop = basesink->priv->current_sstop;
|
sstart = sstop = basesink->priv->current_sstop;
|
||||||
rstart = rstop = basesink->priv->current_rstop;
|
rstart = rstop = basesink->priv->eos_rtime;
|
||||||
|
*do_sync = rstart != -1;
|
||||||
|
GST_DEBUG_OBJECT (basesink, "sync times for EOS %" GST_TIME_FORMAT,
|
||||||
|
GST_TIME_ARGS (rstart));
|
||||||
goto done;
|
goto done;
|
||||||
/* other events do not need syncing */
|
/* other events do not need syncing */
|
||||||
/* FIXME, maybe NEWSEGMENT might need synchronisation
|
/* FIXME, maybe NEWSEGMENT might need synchronisation
|
||||||
|
@ -902,7 +908,8 @@ gst_base_sink_get_sync_times (GstBaseSink * basesink, GstMiniObject * obj,
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (basesink, "got times start: %" GST_TIME_FORMAT
|
GST_DEBUG_OBJECT (basesink, "got times start: %" GST_TIME_FORMAT
|
||||||
", stop: %" GST_TIME_FORMAT, GST_TIME_ARGS (start), GST_TIME_ARGS (stop));
|
", stop: %" GST_TIME_FORMAT ", do_sync %d", GST_TIME_ARGS (start),
|
||||||
|
GST_TIME_ARGS (stop), *do_sync);
|
||||||
|
|
||||||
/* collect segment and format for code clarity */
|
/* collect segment and format for code clarity */
|
||||||
segment = &basesink->segment;
|
segment = &basesink->segment;
|
||||||
|
@ -1073,6 +1080,9 @@ gst_base_sink_do_sync (GstBaseSink * basesink, GstPad * pad,
|
||||||
/* store timing info for current object */
|
/* store timing info for current object */
|
||||||
basesink->priv->current_rstart = rstart;
|
basesink->priv->current_rstart = rstart;
|
||||||
basesink->priv->current_rstop = (rstop != -1 ? rstop : rstart);
|
basesink->priv->current_rstop = (rstop != -1 ? rstop : rstart);
|
||||||
|
/* save sync time for eos when the previous object needed sync */
|
||||||
|
basesink->priv->eos_rtime = (do_sync ? basesink->priv->current_rstop : -1);
|
||||||
|
|
||||||
/* lock because we read this when answering the POSITION
|
/* lock because we read this when answering the POSITION
|
||||||
* query. */
|
* query. */
|
||||||
GST_OBJECT_LOCK (basesink);
|
GST_OBJECT_LOCK (basesink);
|
||||||
|
@ -1868,11 +1878,10 @@ gst_base_sink_chain_unlocked (GstBaseSink * basesink, GstPad * pad,
|
||||||
}
|
}
|
||||||
|
|
||||||
basesink->have_newsegment = TRUE;
|
basesink->have_newsegment = TRUE;
|
||||||
/* this means this sink will not use segment info for sync */
|
/* this means this sink will assume timestamps start from 0 */
|
||||||
clip_segment->start = -1;
|
clip_segment->start = 0;
|
||||||
clip_segment->stop = -1;
|
clip_segment->stop = -1;
|
||||||
/* and we set the rendering segment to invalid as well */
|
basesink->segment.start = 0;
|
||||||
basesink->segment.start = -1;
|
|
||||||
basesink->segment.stop = -1;
|
basesink->segment.stop = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2251,7 +2260,7 @@ gst_base_sink_get_position (GstBaseSink * basesink, GstFormat format,
|
||||||
{
|
{
|
||||||
GstClockTime now, base;
|
GstClockTime now, base;
|
||||||
gint64 time, accum;
|
gint64 time, accum;
|
||||||
gdouble abs_rate;
|
gdouble rate;
|
||||||
gint64 last;
|
gint64 last;
|
||||||
|
|
||||||
/* we can answer time format */
|
/* we can answer time format */
|
||||||
|
@ -2280,7 +2289,7 @@ gst_base_sink_get_position (GstBaseSink * basesink, GstFormat format,
|
||||||
|
|
||||||
base = GST_ELEMENT_CAST (basesink)->base_time;
|
base = GST_ELEMENT_CAST (basesink)->base_time;
|
||||||
accum = basesink->segment.accum;
|
accum = basesink->segment.accum;
|
||||||
abs_rate = basesink->segment.abs_rate;
|
rate = basesink->segment.rate;
|
||||||
gst_base_sink_get_position_last (basesink, &last);
|
gst_base_sink_get_position_last (basesink, &last);
|
||||||
|
|
||||||
gst_object_ref (clock);
|
gst_object_ref (clock);
|
||||||
|
@ -2290,9 +2299,13 @@ gst_base_sink_get_position (GstBaseSink * basesink, GstFormat format,
|
||||||
GST_OBJECT_UNLOCK (basesink);
|
GST_OBJECT_UNLOCK (basesink);
|
||||||
|
|
||||||
now = gst_clock_get_time (clock);
|
now = gst_clock_get_time (clock);
|
||||||
|
/* subtract base time and accumulated time from the clock time.
|
||||||
|
* Make sure we don't go negative. This is the current time in
|
||||||
|
* the segment which we need to scale with the rate */
|
||||||
base += accum;
|
base += accum;
|
||||||
base = MIN (now, base);
|
base = MIN (now, base);
|
||||||
*cur = gst_guint64_to_gdouble (now - base) * abs_rate + time;
|
/* for negative rate this will count back from the segment time */
|
||||||
|
*cur = time + gst_guint64_to_gdouble (now - base) * rate;
|
||||||
|
|
||||||
/* never report more than last seen position */
|
/* never report more than last seen position */
|
||||||
if (last != -1)
|
if (last != -1)
|
||||||
|
@ -2429,6 +2442,7 @@ gst_base_sink_change_state (GstElement * element, GstStateChange transition)
|
||||||
basesink->playing_async = TRUE;
|
basesink->playing_async = TRUE;
|
||||||
basesink->priv->current_sstart = 0;
|
basesink->priv->current_sstart = 0;
|
||||||
basesink->priv->current_sstop = 0;
|
basesink->priv->current_sstop = 0;
|
||||||
|
basesink->priv->eos_rtime = -1;
|
||||||
basesink->eos = FALSE;
|
basesink->eos = FALSE;
|
||||||
gst_base_sink_reset_qos (basesink);
|
gst_base_sink_reset_qos (basesink);
|
||||||
ret = GST_STATE_CHANGE_ASYNC;
|
ret = GST_STATE_CHANGE_ASYNC;
|
||||||
|
|
Loading…
Reference in a new issue