summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <david.schleef@rd.io>2013-11-06 00:19:22 -0800
committerDavid Schleef <david.schleef@rd.io>2013-11-07 21:16:45 -0800
commit240ac0dfd5ca4f8d668ea9f45de4f815aa84cd23 (patch)
treee19f1ebb71b6c8ec534923928c79ed2cfee9ec31
parented6a39b243de70eaf634afcf564246c0da5ed020 (diff)
adaptive: make dash range requests async
-rw-r--r--gst-streaming-server/gss-adaptive.c77
1 files changed, 55 insertions, 22 deletions
diff --git a/gst-streaming-server/gss-adaptive.c b/gst-streaming-server/gss-adaptive.c
index 3bd5d8e..0ce0c82 100644
--- a/gst-streaming-server/gss-adaptive.c
+++ b/gst-streaming-server/gss-adaptive.c
@@ -62,6 +62,9 @@ static void gss_adaptive_async_assemble_chunk (GssTransaction * t,
gpointer priv);
static void gss_adaptive_async_assemble_chunk_finish (GssTransaction * t,
gpointer priv);
+static void gss_adaptive_dash_range_async (GssTransaction * t, gpointer priv);
+static void gss_adaptive_dash_range_async_finish (GssTransaction * t,
+ gpointer priv);
static guint8 *
@@ -414,10 +417,6 @@ gss_adaptive_resource_get_dash_range_fragment (GssTransaction * t,
int index;
GssAdaptiveLevel *level;
gsize start, end;
- int i;
- guint64 offset;
- guint64 n_bytes;
- guint64 header_size;
/* skip over content/ */
path += 8;
@@ -468,8 +467,46 @@ gss_adaptive_resource_get_dash_range_fragment (GssTransaction * t,
t->start = start;
t->end = end;
- offset = start;
- n_bytes = end - start;
+ if (have_range) {
+ soup_message_headers_set_content_range (t->msg->response_headers,
+ ranges[0].start, ranges[0].end, level->track->dash_size);
+
+ soup_message_set_status (t->msg, SOUP_STATUS_PARTIAL_CONTENT);
+
+ soup_message_headers_free_ranges (t->msg->response_headers, ranges);
+ } else {
+ soup_message_set_status (t->msg, SOUP_STATUS_OK);
+ }
+
+ soup_message_headers_replace (t->msg->response_headers, "Content-Type",
+ (path[0] == 'v') ? "video/mp4" : "audio/mp4");
+
+ {
+ GssAdaptiveQuery *query;
+
+ soup_server_pause_message (t->soupserver, t->msg);
+
+ query = g_malloc0 (sizeof (GssAdaptiveQuery));
+ query->adaptive = adaptive;
+ query->level = level;
+
+ gss_transaction_process_async (t, gss_adaptive_dash_range_async,
+ gss_adaptive_dash_range_async_finish, query);
+ }
+}
+
+static void
+gss_adaptive_dash_range_async (GssTransaction * t, gpointer priv)
+{
+ GssAdaptiveQuery *query = priv;
+ guint64 offset;
+ guint64 n_bytes;
+ guint64 header_size;
+ GssAdaptiveLevel *level = query->level;
+ int i;
+
+ offset = t->start;
+ n_bytes = t->end - t->start;
if (ranges_overlap (offset, n_bytes, 0,
level->track->dash_header_and_sidx_size)) {
@@ -495,10 +532,11 @@ gss_adaptive_resource_get_dash_range_fragment (GssTransaction * t,
if (ranges_overlap (offset, n_bytes, header_size + fragment->offset +
fragment->moof_size, fragment->mdat_size)) {
- mdat_data = gss_adaptive_assemble_chunk (t, adaptive, level, fragment);
- if (adaptive->drm_type != GSS_DRM_CLEAR) {
+ mdat_data = gss_adaptive_assemble_chunk (t, query->adaptive, level,
+ fragment);
+ if (query->adaptive->drm_type != GSS_DRM_CLEAR) {
gss_playready_encrypt_samples (fragment, mdat_data,
- adaptive->content_key);
+ query->adaptive->content_key);
}
gss_soup_message_body_append_clipped (t->msg->response_body,
@@ -509,21 +547,16 @@ gss_adaptive_resource_get_dash_range_fragment (GssTransaction * t,
}
}
- soup_message_body_complete (t->msg->response_body);
-
- if (have_range) {
- soup_message_headers_set_content_range (t->msg->response_headers,
- ranges[0].start, ranges[0].end, level->track->dash_size);
-
- soup_message_set_status (t->msg, SOUP_STATUS_PARTIAL_CONTENT);
+}
- soup_message_headers_free_ranges (t->msg->response_headers, ranges);
- } else {
- soup_message_set_status (t->msg, SOUP_STATUS_OK);
- }
+static void
+gss_adaptive_dash_range_async_finish (GssTransaction * t, gpointer priv)
+{
+ GssAdaptiveQuery *query = priv;
- soup_message_headers_replace (t->msg->response_headers, "Content-Type",
- (path[0] == 'v') ? "video/mp4" : "audio/mp4");
+ soup_message_body_complete (t->msg->response_body);
+ soup_server_unpause_message (t->soupserver, t->msg);
+ g_free (query);
}
static void