* GstDashDemuxStream->actual_position.
*
* The downstream position of the pipeline is obtained via QoS events and
- * is stored in GstAdaptiveDemuxStream->qos_earliest_time (note: it's a
- * running time value).
+ * is stored in GstAdaptiveDemux (note: it's a running time value).
*
* The estimated buffering level between dashdemux and downstream is
* therefore:
GstClockTimeDiff diff;
GstClockTime ret = cur_position;
GstClockTime deadline;
+ GstClockTime upstream_earliest_time;
GstClockTime earliest_time = GST_CLOCK_TIME_NONE;
g_assert (min_skip > 0);
* flush, as otherwise base_time and clock might not be correct because of a
* still pre-rolling sink
*/
- if (stream->qos_earliest_time != GST_CLOCK_TIME_NONE) {
+ upstream_earliest_time =
+ gst_adaptive_demux_get_qos_earliest_time ((GstAdaptiveDemux *) dashdemux);
+ if (upstream_earliest_time != GST_CLOCK_TIME_NONE) {
GstClock *clock;
clock = gst_element_get_clock (GST_ELEMENT_CAST (dashdemux));
gst_object_unref (clock);
- earliest_time = MAX (now_time, stream->qos_earliest_time);
+ earliest_time = MAX (now_time, upstream_earliest_time);
} else {
- earliest_time = stream->qos_earliest_time;
+ earliest_time = upstream_earliest_time;
}
}
* without needing to stop tasks when they just want to
* update the segment boundaries */
GMutex segment_lock;
+
+ GstClockTime qos_earliest_time;
};
typedef struct _GstAdaptiveDemuxTimer
stream->pending_segment = gst_event_new_segment (&stream->segment);
gst_event_set_seqnum (stream->pending_segment, demux->priv->segment_seqnum);
- stream->qos_earliest_time = GST_CLOCK_TIME_NONE;
GST_DEBUG_OBJECT (demux,
"Prepared segment %" GST_SEGMENT_FORMAT " for stream %p",
&stream->segment, stream);
}
+ demux->priv->qos_earliest_time = GST_CLOCK_TIME_NONE;
return TRUE;
}
gst_event_unref (seg_evt);
/* Make sure the first buffer after a seek has the discont flag */
stream->discont = TRUE;
- stream->qos_earliest_time = GST_CLOCK_TIME_NONE;
}
+ demux->priv->qos_earliest_time = GST_CLOCK_TIME_NONE;
}
#define IS_SNAP_SEEK(f) (f & (GST_SEEK_FLAG_SNAP_BEFORE | \
return TRUE;
}
case GST_EVENT_QOS:{
- GstAdaptiveDemuxStream *stream;
-
- GST_MANIFEST_LOCK (demux);
- stream = gst_adaptive_demux_find_stream_for_pad (demux, pad);
-
- if (stream) {
- GstClockTimeDiff diff;
- GstClockTime timestamp;
-
- gst_event_parse_qos (event, NULL, NULL, &diff, ×tamp);
- /* Only take into account lateness if late */
- if (diff > 0)
- stream->qos_earliest_time = timestamp + 2 * diff;
- else
- stream->qos_earliest_time = timestamp;
- GST_DEBUG_OBJECT (stream->pad, "qos_earliest_time %" GST_TIME_FORMAT,
- GST_TIME_ARGS (stream->qos_earliest_time));
- }
- GST_MANIFEST_UNLOCK (demux);
+ GstClockTimeDiff diff;
+ GstClockTime timestamp;
+
+ gst_event_parse_qos (event, NULL, NULL, &diff, ×tamp);
+ /* Only take into account lateness if late */
+ GST_OBJECT_LOCK (demux);
+ if (diff > 0)
+ demux->priv->qos_earliest_time = timestamp + 2 * diff;
+ else
+ demux->priv->qos_earliest_time = timestamp;
+ GST_OBJECT_UNLOCK (demux);
+ GST_DEBUG_OBJECT (demux, "qos_earliest_time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (demux->priv->qos_earliest_time));
break;
}
default:
stream->download_error_count = 0;
stream->need_header = TRUE;
- stream->qos_earliest_time = GST_CLOCK_TIME_NONE;
}
list_to_process = demux->prepared_streams;
}
+ demux->priv->qos_earliest_time = GST_CLOCK_TIME_NONE;
}
/* must be called with manifest_lock taken */
g_mutex_unlock (timer->mutex);
return TRUE;
}
+
+/**
+ * gst_adaptive_demux_get_qos_earliest_time:
+ *
+ * Returns: The QOS earliest time
+ *
+ * Since: 1.18
+ */
+GstClockTime
+gst_adaptive_demux_get_qos_earliest_time (GstAdaptiveDemux * demux)
+{
+ GstClockTime earliest;
+
+ GST_OBJECT_LOCK (demux);
+ earliest = demux->priv->qos_earliest_time;
+ GST_OBJECT_UNLOCK (demux);
+
+ return earliest;
+}