mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-29 21:21:12 +00:00
basesink: Update start time when we lose our state
Otherwise we report not the correct position while the state is lost.
This commit is contained in:
parent
f7b71d3007
commit
ba943a82c0
1 changed files with 40 additions and 0 deletions
|
@ -2856,6 +2856,44 @@ gst_base_sink_do_render_stats (GstBaseSink * basesink, gboolean start)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_base_sink_update_start_time (GstBaseSink * basesink)
|
||||||
|
{
|
||||||
|
GstClock *clock;
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (basesink);
|
||||||
|
if ((clock = GST_ELEMENT_CLOCK (basesink))) {
|
||||||
|
GstClockTime now;
|
||||||
|
|
||||||
|
gst_object_ref (clock);
|
||||||
|
GST_OBJECT_UNLOCK (basesink);
|
||||||
|
|
||||||
|
/* calculate the time when we stopped */
|
||||||
|
now = gst_clock_get_time (clock);
|
||||||
|
gst_object_unref (clock);
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (basesink);
|
||||||
|
/* store the current running time */
|
||||||
|
if (GST_ELEMENT_START_TIME (basesink) != GST_CLOCK_TIME_NONE) {
|
||||||
|
if (now != GST_CLOCK_TIME_NONE)
|
||||||
|
GST_ELEMENT_START_TIME (basesink) =
|
||||||
|
now - GST_ELEMENT_CAST (basesink)->base_time;
|
||||||
|
else
|
||||||
|
GST_WARNING_OBJECT (basesink,
|
||||||
|
"Clock %s returned invalid time, can't calculate "
|
||||||
|
"running_time when going to the PAUSED state",
|
||||||
|
GST_OBJECT_NAME (clock));
|
||||||
|
}
|
||||||
|
GST_DEBUG_OBJECT (basesink,
|
||||||
|
"start_time=%" GST_TIME_FORMAT ", now=%" GST_TIME_FORMAT
|
||||||
|
", base_time %" GST_TIME_FORMAT,
|
||||||
|
GST_TIME_ARGS (GST_ELEMENT_START_TIME (basesink)),
|
||||||
|
GST_TIME_ARGS (now),
|
||||||
|
GST_TIME_ARGS (GST_ELEMENT_CAST (basesink)->base_time));
|
||||||
|
}
|
||||||
|
GST_OBJECT_UNLOCK (basesink);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_base_sink_flush_start (GstBaseSink * basesink, GstPad * pad)
|
gst_base_sink_flush_start (GstBaseSink * basesink, GstPad * pad)
|
||||||
{
|
{
|
||||||
|
@ -2872,6 +2910,7 @@ gst_base_sink_flush_start (GstBaseSink * basesink, GstPad * pad)
|
||||||
* prerolled buffer */
|
* prerolled buffer */
|
||||||
basesink->playing_async = TRUE;
|
basesink->playing_async = TRUE;
|
||||||
if (basesink->priv->async_enabled) {
|
if (basesink->priv->async_enabled) {
|
||||||
|
gst_base_sink_update_start_time (basesink);
|
||||||
gst_element_lost_state (GST_ELEMENT_CAST (basesink));
|
gst_element_lost_state (GST_ELEMENT_CAST (basesink));
|
||||||
} else {
|
} else {
|
||||||
/* start time reset in above case as well;
|
/* start time reset in above case as well;
|
||||||
|
@ -3819,6 +3858,7 @@ gst_base_sink_perform_step (GstBaseSink * sink, GstPad * pad, GstEvent * event)
|
||||||
sink->playing_async = TRUE;
|
sink->playing_async = TRUE;
|
||||||
priv->pending_step.need_preroll = TRUE;
|
priv->pending_step.need_preroll = TRUE;
|
||||||
sink->need_preroll = FALSE;
|
sink->need_preroll = FALSE;
|
||||||
|
gst_base_sink_update_start_time (sink);
|
||||||
gst_element_lost_state (GST_ELEMENT_CAST (sink));
|
gst_element_lost_state (GST_ELEMENT_CAST (sink));
|
||||||
} else {
|
} else {
|
||||||
sink->priv->have_latency = TRUE;
|
sink->priv->have_latency = TRUE;
|
||||||
|
|
Loading…
Reference in a new issue