dashdemux: use a separate GstUriDownloader per stream
Avoids one download having to wait for another to finish before starting
This commit is contained in:
parent
f33c52377f
commit
be54766975
@ -620,6 +620,7 @@ gst_dash_demux_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
|||||||
GstDashDemuxStream *stream = iter->data;
|
GstDashDemuxStream *stream = iter->data;
|
||||||
gst_data_queue_set_flushing (stream->queue, FALSE);
|
gst_data_queue_set_flushing (stream->queue, FALSE);
|
||||||
stream->last_ret = GST_FLOW_OK;
|
stream->last_ret = GST_FLOW_OK;
|
||||||
|
gst_uri_downloader_reset (stream->downloader);
|
||||||
}
|
}
|
||||||
demux->timestamp_offset = 0;
|
demux->timestamp_offset = 0;
|
||||||
demux->need_segment = TRUE;
|
demux->need_segment = TRUE;
|
||||||
@ -750,6 +751,7 @@ gst_dash_demux_setup_all_streams (GstDashDemux * demux)
|
|||||||
gst_task_set_lock (stream->download_task, &stream->download_task_lock);
|
gst_task_set_lock (stream->download_task, &stream->download_task_lock);
|
||||||
g_cond_init (&stream->download_cond);
|
g_cond_init (&stream->download_cond);
|
||||||
g_mutex_init (&stream->download_mutex);
|
g_mutex_init (&stream->download_mutex);
|
||||||
|
stream->downloader = gst_uri_downloader_new ();
|
||||||
|
|
||||||
stream->index = i;
|
stream->index = i;
|
||||||
stream->input_caps = caps;
|
stream->input_caps = caps;
|
||||||
@ -1065,6 +1067,8 @@ gst_dash_demux_stop (GstDashDemux * demux)
|
|||||||
stream->need_header = TRUE;
|
stream->need_header = TRUE;
|
||||||
gst_task_stop (stream->download_task);
|
gst_task_stop (stream->download_task);
|
||||||
GST_TASK_SIGNAL (stream->download_task);
|
GST_TASK_SIGNAL (stream->download_task);
|
||||||
|
gst_uri_downloader_cancel (stream->downloader);
|
||||||
|
|
||||||
gst_task_join (stream->download_task);
|
gst_task_join (stream->download_task);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1440,6 +1444,10 @@ gst_dash_demux_stream_free (GstDashDemuxStream * stream)
|
|||||||
g_cond_clear (&stream->download_cond);
|
g_cond_clear (&stream->download_cond);
|
||||||
g_mutex_clear (&stream->download_mutex);
|
g_mutex_clear (&stream->download_mutex);
|
||||||
|
|
||||||
|
if (stream->downloader != NULL) {
|
||||||
|
g_object_unref (stream->downloader);
|
||||||
|
}
|
||||||
|
|
||||||
g_free (stream);
|
g_free (stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1952,8 +1960,9 @@ gst_dash_demux_stream_select_representation_unlocked (GstDashDemuxStream *
|
|||||||
}
|
}
|
||||||
|
|
||||||
static GstBuffer *
|
static GstBuffer *
|
||||||
gst_dash_demux_download_header_fragment (GstDashDemux * demux, guint stream_idx,
|
gst_dash_demux_download_header_fragment (GstDashDemux * demux,
|
||||||
gchar * path, gint64 range_start, gint64 range_end)
|
GstDashDemuxStream * stream, gchar * path, gint64 range_start,
|
||||||
|
gint64 range_end)
|
||||||
{
|
{
|
||||||
GstBuffer *buffer = NULL;
|
GstBuffer *buffer = NULL;
|
||||||
gchar *next_header_uri;
|
gchar *next_header_uri;
|
||||||
@ -1961,14 +1970,14 @@ gst_dash_demux_download_header_fragment (GstDashDemux * demux, guint stream_idx,
|
|||||||
|
|
||||||
if (strncmp (path, "http://", 7) != 0) {
|
if (strncmp (path, "http://", 7) != 0) {
|
||||||
next_header_uri =
|
next_header_uri =
|
||||||
g_strconcat (gst_mpdparser_get_baseURL (demux->client, stream_idx),
|
g_strconcat (gst_mpdparser_get_baseURL (demux->client, stream->index),
|
||||||
path, NULL);
|
path, NULL);
|
||||||
g_free (path);
|
g_free (path);
|
||||||
} else {
|
} else {
|
||||||
next_header_uri = path;
|
next_header_uri = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
fragment = gst_uri_downloader_fetch_uri_with_range (demux->downloader,
|
fragment = gst_uri_downloader_fetch_uri_with_range (stream->downloader,
|
||||||
next_header_uri, range_start, range_end);
|
next_header_uri, range_start, range_end);
|
||||||
g_free (next_header_uri);
|
g_free (next_header_uri);
|
||||||
if (fragment) {
|
if (fragment) {
|
||||||
@ -1979,30 +1988,31 @@ gst_dash_demux_download_header_fragment (GstDashDemux * demux, guint stream_idx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static GstBuffer *
|
static GstBuffer *
|
||||||
gst_dash_demux_get_next_header (GstDashDemux * demux, guint stream_idx)
|
gst_dash_demux_get_next_header (GstDashDemux * demux,
|
||||||
|
GstDashDemuxStream * stream)
|
||||||
{
|
{
|
||||||
gchar *initializationURL;
|
gchar *initializationURL;
|
||||||
GstBuffer *header_buffer, *index_buffer = NULL;
|
GstBuffer *header_buffer, *index_buffer = NULL;
|
||||||
gint64 range_start, range_end;
|
gint64 range_start, range_end;
|
||||||
|
|
||||||
if (!gst_mpd_client_get_next_header (demux->client, &initializationURL,
|
if (!gst_mpd_client_get_next_header (demux->client, &initializationURL,
|
||||||
stream_idx, &range_start, &range_end))
|
stream->index, &range_start, &range_end))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
GST_INFO_OBJECT (demux, "Fetching header %s %" G_GINT64_FORMAT "-%"
|
GST_INFO_OBJECT (demux, "Fetching header %s %" G_GINT64_FORMAT "-%"
|
||||||
G_GINT64_FORMAT, initializationURL, range_start, range_end);
|
G_GINT64_FORMAT, initializationURL, range_start, range_end);
|
||||||
header_buffer = gst_dash_demux_download_header_fragment (demux, stream_idx,
|
header_buffer = gst_dash_demux_download_header_fragment (demux, stream,
|
||||||
initializationURL, range_start, range_end);
|
initializationURL, range_start, range_end);
|
||||||
|
|
||||||
/* check if we have an index */
|
/* check if we have an index */
|
||||||
if (header_buffer
|
if (header_buffer
|
||||||
&& gst_mpd_client_get_next_header_index (demux->client,
|
&& gst_mpd_client_get_next_header_index (demux->client,
|
||||||
&initializationURL, stream_idx, &range_start, &range_end)) {
|
&initializationURL, stream->index, &range_start, &range_end)) {
|
||||||
GST_INFO_OBJECT (demux,
|
GST_INFO_OBJECT (demux,
|
||||||
"Fetching index %s %" G_GINT64_FORMAT "-%" G_GINT64_FORMAT,
|
"Fetching index %s %" G_GINT64_FORMAT "-%" G_GINT64_FORMAT,
|
||||||
initializationURL, range_start, range_end);
|
initializationURL, range_start, range_end);
|
||||||
index_buffer =
|
index_buffer =
|
||||||
gst_dash_demux_download_header_fragment (demux, stream_idx,
|
gst_dash_demux_download_header_fragment (demux, stream,
|
||||||
initializationURL, range_start, range_end);
|
initializationURL, range_start, range_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2222,7 +2232,7 @@ gst_dash_demux_get_next_fragment_for_stream (GstDashDemux * demux,
|
|||||||
GST_TIME_ARGS (fragment.duration),
|
GST_TIME_ARGS (fragment.duration),
|
||||||
fragment.range_start, fragment.range_end);
|
fragment.range_start, fragment.range_end);
|
||||||
|
|
||||||
download = gst_uri_downloader_fetch_uri_with_range (demux->downloader,
|
download = gst_uri_downloader_fetch_uri_with_range (stream->downloader,
|
||||||
fragment.uri, fragment.range_start, fragment.range_end);
|
fragment.uri, fragment.range_start, fragment.range_end);
|
||||||
|
|
||||||
if (download == NULL) {
|
if (download == NULL) {
|
||||||
@ -2254,7 +2264,7 @@ gst_dash_demux_get_next_fragment_for_stream (GstDashDemux * demux,
|
|||||||
G_GINT64_FORMAT, uri, fragment.index_range_start,
|
G_GINT64_FORMAT, uri, fragment.index_range_start,
|
||||||
fragment.index_range_end);
|
fragment.index_range_end);
|
||||||
download =
|
download =
|
||||||
gst_uri_downloader_fetch_uri_with_range (demux->downloader, uri,
|
gst_uri_downloader_fetch_uri_with_range (stream->downloader, uri,
|
||||||
fragment.index_range_start, fragment.index_range_end);
|
fragment.index_range_start, fragment.index_range_end);
|
||||||
if (download) {
|
if (download) {
|
||||||
index_buffer = gst_fragment_get_buffer (download);
|
index_buffer = gst_fragment_get_buffer (download);
|
||||||
@ -2267,7 +2277,7 @@ gst_dash_demux_get_next_fragment_for_stream (GstDashDemux * demux,
|
|||||||
if (stream->need_header) {
|
if (stream->need_header) {
|
||||||
/* We need to fetch a new header */
|
/* We need to fetch a new header */
|
||||||
if ((header_buffer =
|
if ((header_buffer =
|
||||||
gst_dash_demux_get_next_header (demux, stream_idx)) != NULL) {
|
gst_dash_demux_get_next_header (demux, stream)) != NULL) {
|
||||||
buffer = gst_buffer_append (header_buffer, buffer);
|
buffer = gst_buffer_append (header_buffer, buffer);
|
||||||
}
|
}
|
||||||
stream->need_header = FALSE;
|
stream->need_header = FALSE;
|
||||||
|
@ -105,6 +105,7 @@ struct _GstDashDemuxStream
|
|||||||
GCond download_cond;
|
GCond download_cond;
|
||||||
GstTask *download_task;
|
GstTask *download_task;
|
||||||
GRecMutex download_task_lock;
|
GRecMutex download_task_lock;
|
||||||
|
GstUriDownloader *downloader;
|
||||||
|
|
||||||
GstDownloadRate dnl_rate;
|
GstDownloadRate dnl_rate;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user