adaptivedemux2: Make download mechanism overrideable

Make the mechanism by which DownloadRequests are fulfilled overrideable by the
subclass, in case it has an internal mechanism it can use (such as blocking
preloads in HLS)

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3883>
This commit is contained in:
Jan Schmidt 2022-10-13 14:49:35 +11:00 committed by GStreamer Marge Bot
parent cb27c05ca7
commit a14f4f7054
2 changed files with 56 additions and 17 deletions

View file

@ -50,6 +50,9 @@ gst_adaptive_demux2_stream_update_current_bitrate (GstAdaptiveDemux2Stream *
stream); stream);
static void gst_adaptive_demux2_stream_update_track_ids (GstAdaptiveDemux2Stream static void gst_adaptive_demux2_stream_update_track_ids (GstAdaptiveDemux2Stream
* stream); * stream);
static GstFlowReturn
gst_adaptive_demux2_stream_submit_request_default (GstAdaptiveDemux2Stream *
stream, DownloadRequest * download_req);
#define gst_adaptive_demux2_stream_parent_class parent_class #define gst_adaptive_demux2_stream_parent_class parent_class
G_DEFINE_ABSTRACT_TYPE (GstAdaptiveDemux2Stream, gst_adaptive_demux2_stream, G_DEFINE_ABSTRACT_TYPE (GstAdaptiveDemux2Stream, gst_adaptive_demux2_stream,
@ -64,6 +67,7 @@ gst_adaptive_demux2_stream_class_init (GstAdaptiveDemux2StreamClass * klass)
klass->data_received = gst_adaptive_demux2_stream_data_received_default; klass->data_received = gst_adaptive_demux2_stream_data_received_default;
klass->finish_fragment = gst_adaptive_demux2_stream_finish_fragment_default; klass->finish_fragment = gst_adaptive_demux2_stream_finish_fragment_default;
klass->submit_request = gst_adaptive_demux2_stream_submit_request_default;
} }
static GType tsdemux_type = 0; static GType tsdemux_type = 0;
@ -193,9 +197,8 @@ static void
gst_adaptive_demux2_stream_handle_playlist_eos (GstAdaptiveDemux2Stream * gst_adaptive_demux2_stream_handle_playlist_eos (GstAdaptiveDemux2Stream *
stream); stream);
static GstFlowReturn static GstFlowReturn
gst_adaptive_demux2_stream_begin_download_uri (GstAdaptiveDemux * demux, gst_adaptive_demux2_stream_begin_download_uri (GstAdaptiveDemux2Stream * stream,
GstAdaptiveDemux2Stream * stream, const gchar * uri, gint64 start, const gchar * uri, gint64 start, gint64 end);
gint64 end);
#ifndef GST_DISABLE_GST_DEBUG #ifndef GST_DISABLE_GST_DEBUG
static const char * static const char *
@ -213,7 +216,6 @@ uritype (GstAdaptiveDemux2Stream * s)
static gboolean static gboolean
schedule_another_chunk (GstAdaptiveDemux2Stream * stream) schedule_another_chunk (GstAdaptiveDemux2Stream * stream)
{ {
GstAdaptiveDemux *demux = stream->demux;
DownloadRequest *request = stream->download_request; DownloadRequest *request = stream->download_request;
GstFlowReturn ret; GstFlowReturn ret;
@ -256,7 +258,7 @@ schedule_another_chunk (GstAdaptiveDemux2Stream * stream)
" chunk_size %" G_GINT64_FORMAT, uri, range_start, chunk_end, chunk_size); " chunk_size %" G_GINT64_FORMAT, uri, range_start, chunk_end, chunk_size);
ret = ret =
gst_adaptive_demux2_stream_begin_download_uri (demux, stream, uri, gst_adaptive_demux2_stream_begin_download_uri (stream, uri,
range_start, chunk_end); range_start, chunk_end);
if (ret != GST_FLOW_OK) { if (ret != GST_FLOW_OK) {
GST_DEBUG_OBJECT (stream, GST_DEBUG_OBJECT (stream,
@ -1389,18 +1391,40 @@ on_download_complete (DownloadRequest * request, DownloadRequestState state,
gst_adaptive_demux2_stream_finish_download (stream, ret, NULL); gst_adaptive_demux2_stream_finish_download (stream, ret, NULL);
} }
static GstFlowReturn
gst_adaptive_demux2_stream_submit_request_default (GstAdaptiveDemux2Stream *
stream, DownloadRequest * download_req)
{
GstAdaptiveDemux *demux = stream->demux;
if (!downloadhelper_submit_request (demux->download_helper,
demux->manifest_uri, DOWNLOAD_FLAG_NONE, download_req, NULL))
return GST_FLOW_ERROR;
return GST_FLOW_OK;
}
static GstFlowReturn
gst_adaptive_demux2_stream_submit_request (GstAdaptiveDemux2Stream * stream,
DownloadRequest * download_req)
{
GstAdaptiveDemux2StreamClass *klass =
GST_ADAPTIVE_DEMUX2_STREAM_GET_CLASS (stream);
g_assert (klass->submit_request != NULL);
return klass->submit_request (stream, download_req);
}
/* must be called from the scheduler context /* must be called from the scheduler context
* *
* Will submit the request only, which will complete asynchronously * Will submit the request only, which will complete asynchronously
*/ */
static GstFlowReturn static GstFlowReturn
gst_adaptive_demux2_stream_begin_download_uri (GstAdaptiveDemux * demux, gst_adaptive_demux2_stream_begin_download_uri (GstAdaptiveDemux2Stream * stream,
GstAdaptiveDemux2Stream * stream, const gchar * uri, gint64 start, const gchar * uri, gint64 start, gint64 end)
gint64 end)
{ {
DownloadRequest *request = stream->download_request; DownloadRequest *request = stream->download_request;
GST_DEBUG_OBJECT (demux, GST_DEBUG_OBJECT (stream,
"Downloading %s uri: %s, range:%" G_GINT64_FORMAT " - %" G_GINT64_FORMAT, "Downloading %s uri: %s, range:%" G_GINT64_FORMAT " - %" G_GINT64_FORMAT,
uritype (stream), uri, start, end); uritype (stream), uri, start, end);
@ -1424,13 +1448,15 @@ gst_adaptive_demux2_stream_begin_download_uri (GstAdaptiveDemux * demux,
(DownloadRequestEventCallback) on_download_progress, stream); (DownloadRequestEventCallback) on_download_progress, stream);
} }
if (!downloadhelper_submit_request (demux->download_helper,
demux->manifest_uri, DOWNLOAD_FLAG_NONE, request, NULL))
return GST_FLOW_ERROR;
stream->download_active = TRUE; stream->download_active = TRUE;
GstFlowReturn ret =
gst_adaptive_demux2_stream_submit_request (stream, request);
if (ret != GST_FLOW_OK) {
stream->download_active = FALSE;
}
return GST_FLOW_OK; return ret;
} }
/* must be called from the scheduler context */ /* must be called from the scheduler context */
@ -1469,7 +1495,7 @@ gst_adaptive_demux2_stream_download_fragment (GstAdaptiveDemux2Stream * stream)
stream->downloading_header = TRUE; stream->downloading_header = TRUE;
return gst_adaptive_demux2_stream_begin_download_uri (demux, stream, return gst_adaptive_demux2_stream_begin_download_uri (stream,
stream->fragment.header_uri, stream->fragment.header_range_start, stream->fragment.header_uri, stream->fragment.header_range_start,
stream->fragment.header_range_end); stream->fragment.header_range_end);
} }
@ -1483,7 +1509,7 @@ gst_adaptive_demux2_stream_download_fragment (GstAdaptiveDemux2Stream * stream)
stream->downloading_index = TRUE; stream->downloading_index = TRUE;
return gst_adaptive_demux2_stream_begin_download_uri (demux, stream, return gst_adaptive_demux2_stream_begin_download_uri (stream,
stream->fragment.index_uri, stream->fragment.index_range_start, stream->fragment.index_uri, stream->fragment.index_range_start,
stream->fragment.index_range_end); stream->fragment.index_range_end);
} }
@ -1516,14 +1542,14 @@ gst_adaptive_demux2_stream_download_fragment (GstAdaptiveDemux2Stream * stream)
GST_DEBUG_OBJECT (stream, GST_DEBUG_OBJECT (stream,
"Starting chunked download %s %" G_GINT64_FORMAT "-%" G_GINT64_FORMAT, "Starting chunked download %s %" G_GINT64_FORMAT "-%" G_GINT64_FORMAT,
url, range_start, chunk_end); url, range_start, chunk_end);
return gst_adaptive_demux2_stream_begin_download_uri (demux, stream, url, return gst_adaptive_demux2_stream_begin_download_uri (stream, url,
range_start, chunk_end); range_start, chunk_end);
} }
/* regular single chunk download */ /* regular single chunk download */
stream->fragment.chunk_size = 0; stream->fragment.chunk_size = 0;
return gst_adaptive_demux2_stream_begin_download_uri (demux, stream, url, return gst_adaptive_demux2_stream_begin_download_uri (stream, url,
stream->fragment.range_start, stream->fragment.range_end); stream->fragment.range_start, stream->fragment.range_end);
no_url_error: no_url_error:

View file

@ -106,6 +106,19 @@ struct _GstAdaptiveDemux2StreamClass
*/ */
GstFlowReturn (*update_fragment_info) (GstAdaptiveDemux2Stream * stream); GstFlowReturn (*update_fragment_info) (GstAdaptiveDemux2Stream * stream);
/**
* submit_request:
* @stream: #GstAdaptiveDemux2Stream
* @download_req: #DownloadRequest
*
* Requests the stream submit the provided download request for processing,
* either through the DownloadHelper (default), or through some sub-class
* mechanism
*
* Returns: #GST_FLOW_OK in success, #GST_FLOW_ERROR on error
*/
GstFlowReturn (*submit_request) (GstAdaptiveDemux2Stream * stream, DownloadRequest * download_req);
/** /**
* finish_fragment: * finish_fragment:
* @stream: #GstAdaptiveDemux2Stream * @stream: #GstAdaptiveDemux2Stream