summaryrefslogtreecommitdiff
path: root/gst-libs/gst/adaptivedemux
diff options
context:
space:
mode:
authorEdward Hervey <edward@centricular.com>2016-11-15 08:13:27 +0100
committerEdward Hervey <bilboed@bilboed.com>2017-05-18 19:04:57 +0200
commit3f42783857b0f22a33c37872c9a1a13af1d052b7 (patch)
tree91184ebeeb8c3c2a4f1afa0d7ef26ac956e96ce4 /gst-libs/gst/adaptivedemux
parent2379dc3f5b1c55d9e5cafcbd1a4df8ffb2de1c2a (diff)
downloadgstreamer-plugins-bad-3f42783857b0f22a33c37872c9a1a13af1d052b7.tar.gz
adaptivedemux: Store QoS time
Allows subclasses to know where downstream is and make decisions based upon that
Diffstat (limited to 'gst-libs/gst/adaptivedemux')
-rw-r--r--gst-libs/gst/adaptivedemux/gstadaptivedemux.c26
-rw-r--r--gst-libs/gst/adaptivedemux/gstadaptivedemux.h3
2 files changed, 29 insertions, 0 deletions
diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
index a71987489..2153d22f0 100644
--- a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
+++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
@@ -1182,6 +1182,7 @@ gst_adaptive_demux_prepare_streams (GstAdaptiveDemux * demux,
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",
@@ -1298,6 +1299,7 @@ gst_adaptive_demux_stream_new (GstAdaptiveDemux * demux, GstPad * pad)
stream->fragment_bitrates =
g_malloc0 (sizeof (guint64) * NUM_LOOKBACK_FRAGMENTS);
gst_pad_set_element_private (pad, stream);
+ stream->qos_earliest_time = GST_CLOCK_TIME_NONE;
g_mutex_lock (&demux->priv->preroll_lock);
stream->do_block = TRUE;
@@ -1738,6 +1740,7 @@ gst_adaptive_demux_handle_seek_event (GstAdaptiveDemux * demux, GstPad * pad,
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;
}
GST_ADAPTIVE_DEMUX_SEGMENT_UNLOCK (demux);
@@ -1805,6 +1808,28 @@ gst_adaptive_demux_src_event (GstPad * pad, GstObject * parent,
gst_event_unref (event);
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, &timestamp);
+ /* 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);
+ break;
+ }
default:
break;
}
@@ -2049,6 +2074,7 @@ gst_adaptive_demux_stop_tasks (GstAdaptiveDemux * demux)
stream->download_error_count = 0;
stream->need_header = TRUE;
+ stream->qos_earliest_time = GST_CLOCK_TIME_NONE;
}
}
diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.h b/gst-libs/gst/adaptivedemux/gstadaptivedemux.h
index d59fa0e63..da9730140 100644
--- a/gst-libs/gst/adaptivedemux/gstadaptivedemux.h
+++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.h
@@ -181,6 +181,9 @@ struct _GstAdaptiveDemuxStream
guint moving_index;
guint64 *fragment_bitrates;
+ /* QoS data */
+ GstClockTime qos_earliest_time;
+
GstAdaptiveDemuxStreamFragment fragment;
guint download_error_count;