From ff77cbbe1d188b4a274ec072fbba7770aab2cceb Mon Sep 17 00:00:00 2001 From: danielgrabowski Date: Tue, 5 Nov 2019 10:30:31 +0100 Subject: [PATCH] Fix memory leaks while streaming --- Squirrowse.Client/Service/Camera.cs | 2 +- Squirrowse.Client/Service/CameraService.cs | 15 ++++++--------- Squirrowse.Client/Service/StreamService.cs | 10 ++++------ Squirrowse.Client/Worker.cs | 11 +++++++---- Squirrowse.Core/Services/ImgExtensions.cs | 2 +- Squirrowse.Service/Hubs/StreamHub.cs | 12 +++++++++--- 6 files changed, 28 insertions(+), 24 deletions(-) diff --git a/Squirrowse.Client/Service/Camera.cs b/Squirrowse.Client/Service/Camera.cs index 1a83f47..54e1946 100644 --- a/Squirrowse.Client/Service/Camera.cs +++ b/Squirrowse.Client/Service/Camera.cs @@ -9,7 +9,7 @@ namespace Squirrowse.Client.Service private readonly int Height; private readonly int Width; - public Camera(int height = 480, int width = 640, double fps = 15f) + public Camera(int height = 480, int width = 640, double fps = 30f) { Height = height; Width = width; diff --git a/Squirrowse.Client/Service/CameraService.cs b/Squirrowse.Client/Service/CameraService.cs index 685355d..3a3d148 100644 --- a/Squirrowse.Client/Service/CameraService.cs +++ b/Squirrowse.Client/Service/CameraService.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; +using System.Collections.Generic; using System.Threading.Tasks; using OpenCvSharp; using Squirrowse.Core.Services; @@ -10,6 +8,7 @@ namespace Squirrowse.Client.Service public class CameraService : ICameraService { private readonly VideoCapture _videoCapture; + public CameraService(CameraFactory cam) { _videoCapture = cam.GetCamera(); @@ -17,18 +16,16 @@ namespace Squirrowse.Client.Service public async Task GetFrame() - { + { var video = _videoCapture.RetrieveMat(); return video; } public async IAsyncEnumerable GetFramesAsyncEnumerator() { - while (true) - { - var fr = await GetFrame(); - yield return fr.ConvertToJpgByte(); - } + using var fr = await GetFrame(); + yield return fr.ConvertToJpgByte(); + //fr.Dispose(); } } } \ No newline at end of file diff --git a/Squirrowse.Client/Service/StreamService.cs b/Squirrowse.Client/Service/StreamService.cs index a8652b3..f05d66c 100644 --- a/Squirrowse.Client/Service/StreamService.cs +++ b/Squirrowse.Client/Service/StreamService.cs @@ -27,12 +27,10 @@ namespace Squirrowse.Client.Service public async Task SendStreamAsync(IAsyncEnumerable asb) { - while (true) - { - - logger.LogInformation($"{nameof(SendStreamAsync)} Start stream"); - await session.SendAsync("UploadByteStream", asb); - } + logger.LogInformation($"{nameof(SendStreamAsync)} Start stream"); + await session.SendAsync("UploadByteStream", asb); + + logger.LogInformation($"{nameof(SendStreamAsync)} End stream"); } } } \ No newline at end of file diff --git a/Squirrowse.Client/Worker.cs b/Squirrowse.Client/Worker.cs index bf7ab9e..8bcc13f 100644 --- a/Squirrowse.Client/Worker.cs +++ b/Squirrowse.Client/Worker.cs @@ -3,6 +3,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using OpenCvSharp; using Squirrowse.Client.Service; namespace Squirrowse.Client @@ -22,14 +23,16 @@ namespace Squirrowse.Client protected override async Task ExecuteAsync(CancellationToken stoppingToken) { - + + while (!stoppingToken.IsCancellationRequested) + { logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); await streamService.SendStreamAsync(camera.GetFramesAsyncEnumerator()); - - // await Task.Delay(1000, stoppingToken); - + + // await Task.Delay(50, stoppingToken); + } } } } \ No newline at end of file diff --git a/Squirrowse.Core/Services/ImgExtensions.cs b/Squirrowse.Core/Services/ImgExtensions.cs index 26382fa..bcca8d5 100644 --- a/Squirrowse.Core/Services/ImgExtensions.cs +++ b/Squirrowse.Core/Services/ImgExtensions.cs @@ -13,7 +13,7 @@ namespace Squirrowse.Core.Services public static Mat ConvertByteToMat(this byte[] bytearr) { - using var tempMat = Cv2.ImDecode(bytearr, ImreadModes.Unchanged); //keep as disposable + var tempMat = Cv2.ImDecode(bytearr, ImreadModes.Unchanged); //keep as disposable return tempMat ?? new Mat(); } } diff --git a/Squirrowse.Service/Hubs/StreamHub.cs b/Squirrowse.Service/Hubs/StreamHub.cs index 9a18994..a2f7fbe 100644 --- a/Squirrowse.Service/Hubs/StreamHub.cs +++ b/Squirrowse.Service/Hubs/StreamHub.cs @@ -3,7 +3,9 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.Logging; +using OpenCvSharp; using Squirrowse.Core.Models; +using Squirrowse.Core.Services; namespace Squirrowse.Service.Hubs { @@ -59,13 +61,17 @@ namespace Squirrowse.Service.Hubs await client.SendAsync("Stop"); } - + public Window okno = new Window("test"); public async Task UploadByteStream(IAsyncEnumerable stream) { + await foreach (var frame in stream) { - logger.LogInformation($"Got frame size: {frame.Length} "); - await Task.Delay(100); //leave some delay for debug purpose + using var imgbuffer = frame.ConvertByteToMat(); + okno.ShowImage(imgbuffer); + Cv2.WaitKey(1); + // logger.LogInformation($"Got frame size: {frame.Length} "); + // await Task.Delay(100); //leave some delay for debug purpose } } }