[libdmapsharing] Fix serving large videos
- From: W. Michael Petullo <wmpetullo src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libdmapsharing] Fix serving large videos
- Date: Fri, 5 Jul 2013 02:55:20 +0000 (UTC)
commit 9bbad5a272f9a8724926ae0486ca0118c0fb9069
Author: W. Michael Petullo <mike flyn org>
Date: Thu Jul 4 21:55:11 2013 -0500
Fix serving large videos
Signed-off-by: W. Michael Petullo <mike flyn org>
libdmapsharing/daap-share.c | 75 +++++++++++++++++++++----------------------
1 files changed, 37 insertions(+), 38 deletions(-)
---
diff --git a/libdmapsharing/daap-share.c b/libdmapsharing/daap-share.c
index af1ea9c..9867e1c 100644
--- a/libdmapsharing/daap-share.c
+++ b/libdmapsharing/daap-share.c
@@ -373,6 +373,21 @@ static struct DMAPMetaDataMap meta_data_map[] = {
#define DAAP_ITEM_KIND_AUDIO 2
#define DAAP_SONG_DATA_KIND_NONE 0
+static gboolean should_transcode (const gchar *format, const gboolean has_video, const gchar
*transcode_mimetype)
+{
+ gboolean fnval;
+ char *format2 = NULL;
+
+ // Not presently transcoding videos (see also same comments elsewhere).
+ fnval = has_video
+ || transcode_mimetype == NULL
+ || ((format2 = dmap_mime_to_format (transcode_mimetype)) && strcmp (format, format2));
+
+ g_debug (" Should%s transcode %s %s", fnval ? "" : " not", format, format2 ? format2 : "[no target
format]");
+
+ return fnval;
+}
+
static void
send_chunked_file (SoupServer * server, SoupMessage * message,
DAAPRecord * record, guint64 filesize, guint64 offset,
@@ -416,25 +431,17 @@ send_chunked_file (SoupServer * server, SoupMessage * message,
}
// Not presently transcoding videos (see also same comments elsewhere).
- char *format2 = NULL;
- if (has_video
- || transcode_mimetype == NULL
- || (format2 = dmap_mime_to_format (transcode_mimetype)) && !strcmp (format, format2)) {
- g_debug ("Not transcoding %s", location);
- cd->stream = stream;
+ if (should_transcode (format, has_video, transcode_mimetype)) {
#ifdef HAVE_GSTREAMERAPP
- } else {
- cd->stream =
- dmap_gst_input_stream_new (transcode_mimetype,
- stream);
- }
+ cd->stream = dmap_gst_input_stream_new (transcode_mimetype, stream);
#else
+ g_warning ("Transcode format %s not supported", transcode_mimetype);
+ cd->stream = stream;
+#endif /* HAVE_GSTREAMERAPP */
} else {
- g_warning ("Transcode format %s not supported",
- transcode_mimetype);
+ g_debug ("Not transcoding %s", location);
cd->stream = stream;
}
-#endif /* HAVE_GSTREAMERAPP */
if (cd->stream == NULL) {
g_warning ("Could not set up input stream");
@@ -452,42 +459,34 @@ send_chunked_file (SoupServer * server, SoupMessage * message,
/* Free memory after each chunk sent out over network. */
soup_message_body_set_accumulate (message->response_body, FALSE);
- // Not presently transcoding videos (see also same comments elsewhere).
- if (has_video
- /* NOTE: iTunes seems to require this or it stops reading
- * video data after about 2.5MB. Perhaps this is so iTunes
- * knows how much data to buffer.
- */
- || transcode_mimetype == NULL) {
- /* NOTE: iTunes 8 (and other versions?) will not seek
- * properly without a Content-Length header.
- */
+ if (! should_transcode (format, has_video, transcode_mimetype)) {
+ /* NOTE: iTunes seems to require this or it stops reading
+ * video data after about 2.5MB. Perhaps this is so iTunes
+ * knows how much data to buffer.
+ */
g_debug ("Using HTTP 1.1 content length encoding.");
- soup_message_headers_set_encoding (message->response_headers,
- SOUP_ENCODING_CONTENT_LENGTH);
- g_debug ("Content length is %" G_GUINT64_FORMAT ".",
- filesize);
- soup_message_headers_set_content_length
- (message->response_headers, filesize);
+ soup_message_headers_set_encoding (message->response_headers, SOUP_ENCODING_CONTENT_LENGTH);
+
+ /* NOTE: iTunes 8 (and other versions?) will not seek
+ * properly without a Content-Length header.
+ */
+ g_debug ("Content length is %" G_GUINT64_FORMAT ".", filesize);
+ soup_message_headers_set_content_length (message->response_headers, filesize);
} else if (soup_message_get_http_version (message) == SOUP_HTTP_1_0) {
/* NOTE: Roku clients support only HTTP 1.0. */
#ifdef HAVE_ENCODING_EOF
g_debug ("Using HTTP 1.0 encoding.");
- soup_message_headers_set_encoding (message->response_headers,
- SOUP_ENCODING_EOF);
+ soup_message_headers_set_encoding (message->response_headers, SOUP_ENCODING_EOF);
#else
- g_warning
- ("Received HTTP 1.0 request, but not built with HTTP 1.0 support");
- soup_message_headers_set_encoding (message->response_headers,
- SOUP_ENCODING_CHUNKED);
+ g_warning ("Received HTTP 1.0 request, but not built with HTTP 1.0 support");
+ soup_message_headers_set_encoding (message->response_headers, SOUP_ENCODING_CHUNKED);
#endif
} else {
/* NOTE: Can not provide Content-Length when performing
* real-time transcoding.
*/
g_debug ("Using HTTP 1.1 chunked encoding.");
- soup_message_headers_set_encoding (message->response_headers,
- SOUP_ENCODING_CHUNKED);
+ soup_message_headers_set_encoding (message->response_headers, SOUP_ENCODING_CHUNKED);
}
soup_message_headers_append (message->response_headers, "Connection",
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]