From 30538f0731574428fd785695737a30997eab0ae8 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 1 Feb 2017 15:55:56 -0500 Subject: improve video startup performance --- .../LiveTv/TunerHosts/MulticastStream.cs | 37 ++++++++++++++-------- 1 file changed, 24 insertions(+), 13 deletions(-) (limited to 'Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs') diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs index 7b88be19c1..a7e1b3cf3b 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; @@ -11,10 +12,11 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts { public class MulticastStream { - private readonly List _outputStreams = new List(); + private readonly ConcurrentDictionary _outputStreams = new ConcurrentDictionary(); private const int BufferSize = 81920; private CancellationToken _cancellationToken; private readonly ILogger _logger; + private readonly ConcurrentQueue _sharedBuffer = new ConcurrentQueue(); public MulticastStream(ILogger logger) { @@ -35,17 +37,19 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts { byte[] copy = new byte[bytesRead]; Buffer.BlockCopy(buffer, 0, copy, 0, bytesRead); - - List streams = null; - lock (_outputStreams) + _sharedBuffer.Enqueue(copy); + + while (_sharedBuffer.Count > 3000) { - streams = _outputStreams.ToList(); + byte[] bytes; + _sharedBuffer.TryDequeue(out bytes); } - foreach (var stream in streams) + var allStreams = _outputStreams.ToList(); + foreach (var stream in allStreams) { - stream.Queue(copy); + stream.Value.Queue(copy); } if (onStarted != null) @@ -70,11 +74,20 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts OnFinished = OnFinished }; - lock (_outputStreams) + var initial = _sharedBuffer.ToList(); + var list = new List(); + + foreach (var bytes in initial) { - _outputStreams.Add(result); + list.AddRange(bytes); } + _logger.Info("QueueStream started with {0} initial bytes", list.Count); + + result.Queue(list.ToArray()); + + _outputStreams.TryAdd(result.Id, result); + result.Start(_cancellationToken); return result.TaskCompletion.Task; @@ -82,10 +95,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts public void RemoveOutputStream(QueueStream stream) { - lock (_outputStreams) - { - _outputStreams.Remove(stream); - } + QueueStream removed; + _outputStreams.TryRemove(stream.Id, out removed); } private void OnFinished(QueueStream queueStream) -- cgit v1.2.3