From 03e2bc7198b28d8ebcd902e771a0a622b6410719 Mon Sep 17 00:00:00 2001 From: 7illusions Date: Mon, 7 Apr 2014 12:29:37 +0200 Subject: Fixes DirectStreaming for Microsoft players --- .../HttpServer/RangeRequestWriter.cs | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) (limited to 'MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs') diff --git a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs index 312e718e1..08e9403aa 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs @@ -64,7 +64,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer { throw new ArgumentNullException("contentType"); } - + RangeHeader = rangeHeader; SourceStream = source; IsHeadRequest = isHeadRequest; @@ -98,11 +98,11 @@ namespace MediaBrowser.Server.Implementations.HttpServer RangeStart = requestedRange.Key; RangeLength = 1 + RangeEnd - RangeStart; - + // Content-Length is the length of what we're serving, not the original content Options["Content-Length"] = RangeLength.ToString(UsCulture); Options["Content-Range"] = string.Format("bytes {0}-{1}/{2}", RangeStart, RangeEnd, TotalContentLength); - + if (RangeStart > 0) { SourceStream.Position = RangeStart; @@ -178,19 +178,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer using (var source = SourceStream) { - // If the requested range is "0-", we can optimize by just doing a stream copy - if (RangeEnd == TotalContentLength - 1) - { - await source.CopyToAsync(responseStream).ConfigureAwait(false); - } - else - { - // Read the bytes we need - var buffer = new byte[Convert.ToInt32(RangeLength)]; - await source.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false); - - await responseStream.WriteAsync(buffer, 0, Convert.ToInt32(RangeLength)).ConfigureAwait(false); - } + //Since we've already set the postion of the sourcestream, just copy the remains to the output + await source.CopyToAsync(responseStream).ConfigureAwait(false); } } -- cgit v1.2.3 From 63aea3d90836765ceb38f0b9b130970af9b132d9 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 7 Apr 2014 12:48:57 -0400 Subject: Remove buffering from RangeRequestWriter --- .../HttpServer/RangeRequestWriter.cs | 36 +++++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) (limited to 'MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs') diff --git a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs index 08e9403aa..1ff199eb4 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs @@ -1,4 +1,5 @@ -using ServiceStack.Web; +using System.Threading; +using ServiceStack.Web; using System; using System.Collections.Generic; using System.Globalization; @@ -178,8 +179,35 @@ namespace MediaBrowser.Server.Implementations.HttpServer using (var source = SourceStream) { - //Since we've already set the postion of the sourcestream, just copy the remains to the output - await source.CopyToAsync(responseStream).ConfigureAwait(false); + // If the requested range is "0-", we can optimize by just doing a stream copy + if (RangeEnd >= TotalContentLength - 1) + { + await source.CopyToAsync(responseStream).ConfigureAwait(false); + } + else + { + await CopyToAsyncInternal(source, responseStream, Convert.ToInt32(RangeLength), CancellationToken.None).ConfigureAwait(false); + } + } + } + + private async Task CopyToAsyncInternal(Stream source, Stream destination, int copyLength, CancellationToken cancellationToken) + { + const int bufferSize = 81920; + var array = new byte[bufferSize]; + int count; + while ((count = await source.ReadAsync(array, 0, array.Length, cancellationToken).ConfigureAwait(false)) != 0) + { + var bytesToCopy = Math.Min(count, copyLength); + + await destination.WriteAsync(array, 0, bytesToCopy, cancellationToken).ConfigureAwait(false); + + copyLength -= bytesToCopy; + + if (copyLength <= 0) + { + break; + } } } @@ -201,4 +229,4 @@ namespace MediaBrowser.Server.Implementations.HttpServer public string StatusDescription { get; set; } } -} +} \ No newline at end of file -- cgit v1.2.3