mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-02 21:48:55 +00:00
adaptivedemux: answer duration queries for live streams
For duration queries on live streams, adaptivedemux ignores the query. The problem then is that the query is answered by the downstream qtdemux element, with the duration of the currently passing fragment. This commit changes the behaviour of adaptivedemux to answer the duration queries for live streams, returning GST_CLOCK_TIME_NONE. https://bugzilla.gnome.org/show_bug.cgi?id=753879
This commit is contained in:
parent
b2e9891f8a
commit
e1b68d9a65
6 changed files with 24 additions and 29 deletions
|
@ -5483,18 +5483,12 @@ gst_mpd_client_get_next_fragment_duration (GstMpdClient * client,
|
|||
GstClockTime
|
||||
gst_mpd_client_get_media_presentation_duration (GstMpdClient * client)
|
||||
{
|
||||
GstClockTime duration;
|
||||
|
||||
g_return_val_if_fail (client != NULL, GST_CLOCK_TIME_NONE);
|
||||
|
||||
if (client->mpd_node->mediaPresentationDuration != -1) {
|
||||
duration = client->mpd_node->mediaPresentationDuration * GST_MSECOND;
|
||||
} else {
|
||||
/* We can only get the duration for on-demand streams */
|
||||
duration = GST_CLOCK_TIME_NONE;
|
||||
}
|
||||
|
||||
return duration;
|
||||
/* Note: adaptivedemux makes sure we only get duration queries for on-demand streams */
|
||||
g_return_val_if_fail (client->mpd_node->mediaPresentationDuration != -1,
|
||||
GST_CLOCK_TIME_NONE);
|
||||
return client->mpd_node->mediaPresentationDuration * GST_MSECOND;
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
|
|
@ -1015,9 +1015,7 @@ gst_m3u8_get_duration (GstM3U8 * m3u8)
|
|||
|
||||
GST_M3U8_LOCK (m3u8);
|
||||
|
||||
/* We can only get the duration for on-demand streams */
|
||||
if (!m3u8->endlist)
|
||||
goto out;
|
||||
/* Note: adaptivedemux makes sure we only get duration queries for on-demand streams */
|
||||
|
||||
if (!GST_CLOCK_TIME_IS_VALID (m3u8->duration) && m3u8->files != NULL) {
|
||||
GList *f;
|
||||
|
@ -1028,8 +1026,6 @@ gst_m3u8_get_duration (GstM3U8 * m3u8)
|
|||
}
|
||||
duration = m3u8->duration;
|
||||
|
||||
out:
|
||||
|
||||
GST_M3U8_UNLOCK (m3u8);
|
||||
|
||||
return duration;
|
||||
|
|
|
@ -934,7 +934,7 @@ guint64
|
|||
gst_mss_manifest_get_duration (GstMssManifest * manifest)
|
||||
{
|
||||
gchar *duration;
|
||||
guint64 dur = -1;
|
||||
guint64 dur = GST_CLOCK_TIME_NONE;
|
||||
|
||||
/* try the property */
|
||||
duration =
|
||||
|
|
|
@ -1748,12 +1748,12 @@ gst_adaptive_demux_src_query (GstPad * pad, GstObject * parent,
|
|||
GST_MANIFEST_LOCK (demux);
|
||||
|
||||
if (fmt == GST_FORMAT_TIME && demux->priv->have_manifest) {
|
||||
duration = demux_class->get_duration (demux);
|
||||
|
||||
if (GST_CLOCK_TIME_IS_VALID (duration) && duration > 0) {
|
||||
gst_query_set_duration (query, GST_FORMAT_TIME, duration);
|
||||
ret = TRUE;
|
||||
}
|
||||
if (gst_adaptive_demux_is_live (demux))
|
||||
duration = GST_CLOCK_TIME_NONE;
|
||||
else
|
||||
duration = demux_class->get_duration (demux);
|
||||
gst_query_set_duration (query, GST_FORMAT_TIME, duration);
|
||||
ret = TRUE;
|
||||
}
|
||||
|
||||
GST_MANIFEST_UNLOCK (demux);
|
||||
|
|
|
@ -293,6 +293,18 @@ struct _GstAdaptiveDemuxClass
|
|||
GstFlowReturn (*update_manifest_data) (GstAdaptiveDemux * demux, GstBuffer * buf);
|
||||
|
||||
gboolean (*is_live) (GstAdaptiveDemux * demux);
|
||||
|
||||
/**
|
||||
* get_duration:
|
||||
* @demux: #GstAdaptiveDemux
|
||||
*
|
||||
* For non-live streams, this will be called to query the duration of the
|
||||
* stream.
|
||||
*
|
||||
* Returns: The duration of the stream, or #GST_CLOCK_TIME_NONE if the
|
||||
* duration is unknown
|
||||
* Since: 1.6
|
||||
*/
|
||||
GstClockTime (*get_duration) (GstAdaptiveDemux * demux);
|
||||
|
||||
/**
|
||||
|
|
|
@ -838,13 +838,6 @@ GST_START_TEST (test_get_duration)
|
|||
|
||||
assert_equals_uint64 (gst_m3u8_get_duration (pl), 40 * GST_SECOND);
|
||||
gst_hls_master_playlist_unref (master);
|
||||
|
||||
/* Test duration for live playlists */
|
||||
master = load_playlist (LIVE_PLAYLIST);
|
||||
pl = master->default_variant->m3u8;
|
||||
assert_equals_uint64 (gst_m3u8_get_duration (pl), GST_CLOCK_TIME_NONE);
|
||||
|
||||
gst_hls_master_playlist_unref (master);
|
||||
}
|
||||
|
||||
GST_END_TEST;
|
||||
|
|
Loading…
Reference in a new issue