static gboolean
gst_base_sink_get_sync_times (GstBaseSink * basesink, GstMiniObject * obj,
GstClockTime * rsstart, GstClockTime * rsstop,
- GstClockTime * rrstart, GstClockTime * rrstop, gboolean * do_sync,
- gboolean * stepped, GstStepInfo * step, gboolean * step_end)
+ GstClockTime * rrstart, GstClockTime * rrstop, GstClockTime * rrnext,
+ gboolean * do_sync, gboolean * stepped, GstStepInfo * step,
+ gboolean * step_end)
{
GstBaseSinkClass *bclass;
GstClockTime start, stop; /* raw start/stop timestamps */
guint64 cstart, cstop; /* clipped raw timestamps */
- guint64 rstart, rstop; /* clipped timestamps converted to running time */
+ guint64 rstart, rstop, rnext; /* clipped timestamps converted to running time */
GstClockTime sstart, sstop; /* clipped timestamps converted to stream time */
GstFormat format;
GstBaseSinkPrivate *priv;
}
}
- rstart = rstop = priv->eos_rtime;
+ rstart = rstop = rnext = priv->eos_rtime;
*do_sync = rstart != -1;
GST_DEBUG_OBJECT (basesink, "sync times for EOS %" GST_TIME_FORMAT,
GST_TIME_ARGS (rstart));
rstart = gst_segment_to_running_time (segment, format, cstart);
rstop = gst_segment_to_running_time (segment, format, cstop);
+ if (GST_CLOCK_TIME_IS_VALID (stop))
+ rnext = rstop;
+ else
+ rnext = rstart;
+
if (G_UNLIKELY (step->valid)) {
if (!(*step_end = handle_stepping (basesink, segment, step, &cstart, &cstop,
&rstart, &rstop))) {
*rsstop = sstop;
*rrstart = rstart;
*rrstop = rstop;
+ *rrnext = rnext;
/* buffers and EOS always need syncing and preroll */
return TRUE;
/* FIXME: Casting to GstClockEntry only works because the types
* are the same */
if (G_LIKELY (sink->priv->cached_clock_id != NULL
- && GST_CLOCK_ENTRY_CLOCK ((GstClockEntry *) sink->priv->
- cached_clock_id) == clock)) {
+ && GST_CLOCK_ENTRY_CLOCK ((GstClockEntry *) sink->
+ priv->cached_clock_id) == clock)) {
if (!gst_clock_single_shot_id_reinit (clock, sink->priv->cached_clock_id,
time)) {
gst_clock_id_unref (sink->priv->cached_clock_id);
GstClockTimeDiff jitter = 0;
gboolean syncable;
GstClockReturn status = GST_CLOCK_OK;
- GstClockTime rstart, rstop, sstart, sstop, stime;
+ GstClockTime rstart, rstop, rnext, sstart, sstop, stime;
gboolean do_sync;
GstBaseSinkPrivate *priv;
GstFlowReturn ret;
priv = basesink->priv;
do_step:
- sstart = sstop = rstart = rstop = GST_CLOCK_TIME_NONE;
+ sstart = sstop = rstart = rstop = rnext = GST_CLOCK_TIME_NONE;
do_sync = TRUE;
stepped = FALSE;
/* get timing information for this object against the render segment */
syncable = gst_base_sink_get_sync_times (basesink, obj,
- &sstart, &sstop, &rstart, &rstop, &do_sync, &stepped, current, step_end);
+ &sstart, &sstop, &rstart, &rstop, &rnext, &do_sync, &stepped, current,
+ step_end);
if (G_UNLIKELY (stepped))
goto step_skipped;
priv->current_rstop = (GST_CLOCK_TIME_IS_VALID (rstop) ? rstop : rstart);
/* save sync time for eos when the previous object needed sync */
- priv->eos_rtime = (do_sync ? priv->current_rstop : GST_CLOCK_TIME_NONE);
+ priv->eos_rtime = (do_sync ? rnext : GST_CLOCK_TIME_NONE);
/* calculate inter frame spacing */
if (G_UNLIKELY (priv->prev_rstart != -1 && priv->prev_rstart < rstart)) {
if (bclass->prepare || bclass->prepare_list) {
gboolean late = FALSE;
gboolean do_sync = TRUE, stepped = FALSE, step_end = FALSE, syncable = TRUE;
- GstClockTime sstart, sstop, rstart, rstop;
+ GstClockTime sstart, sstop, rstart, rstop, rnext;
GstStepInfo *current;
current = &priv->current_step;
syncable =
gst_base_sink_get_sync_times (basesink, obj, &sstart, &sstop, &rstart,
- &rstop, &do_sync, &stepped, current, &step_end);
+ &rstop, &rnext, &do_sync, &stepped, current, &step_end);
if (!stepped && syncable && do_sync)
late =