From 9ef92d67b86c2796804a24acf8a7b3490cd218c4 Mon Sep 17 00:00:00 2001 From: Jared Goodwin Date: Sat, 9 Mar 2019 21:46:46 -0800 Subject: [PATCH] Change encoding and image diffing. --- Remotely_ScreenCast/Capture/ImageUtils.cs | 156 +++++++++++++----- Remotely_ScreenCast/Capture/ScreenCaster.cs | 50 ++++-- Remotely_ScreenCast/Models/Viewer.cs | 37 ++++- .../Sockets/MessageHandlers.cs | 2 +- .../Sockets/OutgoingMessages.cs | 4 +- .../Services/RCBrowserSocketHub.cs | 4 +- Remotely_Server/Services/RCDeviceSocketHub.cs | 4 +- .../scripts/RemoteControl/RCBrowserSockets.js | 10 +- .../RemoteControl/RCBrowserSockets.js.map | 2 +- .../scripts/RemoteControl/RCBrowserSockets.ts | 10 +- 10 files changed, 206 insertions(+), 73 deletions(-) diff --git a/Remotely_ScreenCast/Capture/ImageUtils.cs b/Remotely_ScreenCast/Capture/ImageUtils.cs index adc6577a..407dda81 100644 --- a/Remotely_ScreenCast/Capture/ImageUtils.cs +++ b/Remotely_ScreenCast/Capture/ImageUtils.cs @@ -14,16 +14,107 @@ namespace Remotely_ScreenCast.Capture { public class ImageUtils { - private static EncoderParameters EncoderParams { get; } = new EncoderParameters() - { - Param = new EncoderParameter[] - { - new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 0L), - new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 8L) - } - }; + private static ImageCodecInfo CodecInfo { get; } = ImageCodecInfo.GetImageEncoders().FirstOrDefault(x => x.FormatID == ImageFormat.Jpeg.Guid); - private static ImageCodecInfo CodecInfo { get; } = ImageCodecInfo.GetImageEncoders().FirstOrDefault(x => x.FormatID == ImageFormat.Png.Guid); + public static byte[] EncodeBitmap(Bitmap bitmap, EncoderParameters encoderParams) + { + using (var ms = new MemoryStream()) + { + bitmap.Save(ms, CodecInfo, encoderParams); + return ms.ToArray(); + } + } + + public static Rectangle GetDiffArea(Bitmap currentFrame, Bitmap previousFrame, bool captureFullscreen) + { + if (captureFullscreen) + { + return new Rectangle(new Point(0, 0), currentFrame.Size); + } + if (currentFrame.Height != previousFrame.Height || currentFrame.Width != previousFrame.Width) + { + throw new Exception("Bitmaps are not of equal dimensions."); + } + if (!Bitmap.IsAlphaPixelFormat(currentFrame.PixelFormat) || !Bitmap.IsAlphaPixelFormat(previousFrame.PixelFormat) || + !Bitmap.IsCanonicalPixelFormat(currentFrame.PixelFormat) || !Bitmap.IsCanonicalPixelFormat(previousFrame.PixelFormat)) + { + throw new Exception("Bitmaps must be 32 bits per pixel and contain alpha channel."); + } + var width = currentFrame.Width; + var height = currentFrame.Height; + int left = int.MaxValue; + int top = int.MaxValue; + int right = int.MinValue; + int bottom = int.MinValue; + + var bd1 = previousFrame.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, currentFrame.PixelFormat); + var bd2 = currentFrame.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, previousFrame.PixelFormat); + + // Get the address of the first line. + IntPtr ptr1 = bd1.Scan0; + IntPtr ptr2 = bd2.Scan0; + + + // Declare an array to hold the bytes of the bitmap. + int arraySize = Math.Abs(bd1.Stride) * currentFrame.Height; + var rgbValues1 = new byte[arraySize]; + var rgbValues2 = new byte[arraySize]; + + // Copy the RGBA values into the array. + Marshal.Copy(ptr1, rgbValues1, 0, arraySize); + Marshal.Copy(ptr2, rgbValues2, 0, arraySize); + + // Check RGBA value for each pixel. + for (int counter = 0; counter < rgbValues1.Length - 4; counter += 4) + { + if (rgbValues1[counter] != rgbValues2[counter] || + rgbValues1[counter + 1] != rgbValues2[counter + 1] || + rgbValues1[counter + 2] != rgbValues2[counter + 2] || + rgbValues1[counter + 3] != rgbValues2[counter + 3]) + { + // Change was found. + var pixel = counter / 4; + var row = (int)Math.Floor((double)pixel / bd1.Width); + var column = pixel % bd1.Width; + if (row < top) + { + top = row; + } + if (row > bottom) + { + bottom = row; + } + if (column < left) + { + left = column; + } + if (column > right) + { + right = column; + } + } + } + if (left < right && top < bottom) + { + // Bounding box is valid. + + left = Math.Max(left - 20, 0); + top = Math.Max(top - 20, 0); + right = Math.Min(right + 20, width); + bottom = Math.Min(bottom + 20, height); + + currentFrame.UnlockBits(bd1); + previousFrame.UnlockBits(bd2); + + return new Rectangle(left, top, right - left, bottom - top); + } + else + { + currentFrame.UnlockBits(bd1); + previousFrame.UnlockBits(bd2); + return Rectangle.Empty; + } + } public static Bitmap GetImageDiff(Bitmap currentFrame, Bitmap previousFrame, bool captureFullscreen) { @@ -48,22 +139,22 @@ namespace Remotely_ScreenCast.Capture var bd1 = previousFrame.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, currentFrame.PixelFormat); var bd2 = currentFrame.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, previousFrame.PixelFormat); - var bd3 = mergedFrame.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, currentFrame.PixelFormat); + var bd3 = mergedFrame.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, currentFrame.PixelFormat); - // Get the address of the first line. - IntPtr ptr1 = bd1.Scan0; + // Get the address of the first line. + IntPtr ptr1 = bd1.Scan0; IntPtr ptr2 = bd2.Scan0; - IntPtr ptr3 = bd3.Scan0; + IntPtr ptr3 = bd3.Scan0; - // Declare an array to hold the bytes of the bitmap. - int arraySize = Math.Abs(bd1.Stride) * currentFrame.Height; + // Declare an array to hold the bytes of the bitmap. + int arraySize = Math.Abs(bd1.Stride) * currentFrame.Height; var rgbValues1 = new byte[arraySize]; var rgbValues2 = new byte[arraySize]; - var rgbValues3 = new byte[arraySize]; + var rgbValues3 = new byte[arraySize]; - // Copy the RGBA values into the array. - Marshal.Copy(ptr1, rgbValues1, 0, arraySize); + // Copy the RGBA values into the array. + Marshal.Copy(ptr1, rgbValues1, 0, arraySize); Marshal.Copy(ptr2, rgbValues2, 0, arraySize); // Check RGBA value for each pixel. @@ -74,31 +165,22 @@ namespace Remotely_ScreenCast.Capture rgbValues1[counter + 2] != rgbValues2[counter + 2] || rgbValues1[counter + 3] != rgbValues2[counter + 3]) { - // Change was found. - rgbValues3[counter] = rgbValues2[counter]; - rgbValues3[counter + 1] = rgbValues2[counter + 1]; - rgbValues3[counter + 2] = rgbValues2[counter + 2]; - rgbValues3[counter + 3] = rgbValues2[counter + 3]; - } + // Change was found. + rgbValues3[counter] = rgbValues2[counter]; + rgbValues3[counter + 1] = rgbValues2[counter + 1]; + rgbValues3[counter + 2] = rgbValues2[counter + 2]; + rgbValues3[counter + 3] = rgbValues2[counter + 3]; + } } - // Copy merged frame to bitmap. - Marshal.Copy(rgbValues3, 0, ptr3, rgbValues3.Length); + // Copy merged frame to bitmap. + Marshal.Copy(rgbValues3, 0, ptr3, rgbValues3.Length); - previousFrame.UnlockBits(bd1); + previousFrame.UnlockBits(bd1); currentFrame.UnlockBits(bd2); - mergedFrame.UnlockBits(bd3); + mergedFrame.UnlockBits(bd3); return mergedFrame; } - - public static byte[] EncodeBitmap(Bitmap bitmap) - { - using (var ms = new MemoryStream()) - { - bitmap.Save(ms, CodecInfo, EncoderParams); - return ms.ToArray(); - } - } } } diff --git a/Remotely_ScreenCast/Capture/ScreenCaster.cs b/Remotely_ScreenCast/Capture/ScreenCaster.cs index c3fab4d2..9ff2e0f3 100644 --- a/Remotely_ScreenCast/Capture/ScreenCaster.cs +++ b/Remotely_ScreenCast/Capture/ScreenCaster.cs @@ -1,9 +1,11 @@ using Microsoft.AspNetCore.SignalR.Client; +using Remotely_ScreenCast.Models; using Remotely_ScreenCast.Sockets; using Remotely_ScreenCast.Utilities; using System; using System.Collections.Generic; using System.Drawing; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -20,6 +22,8 @@ namespace Remotely_ScreenCast.Capture { ICapturer capturer; CaptureMode captureMode; + Viewer viewer; + var success = false; try { @@ -48,16 +52,16 @@ namespace Remotely_ScreenCast.Capture Logger.Write($"Starting screen cast. Requester: {requesterName}. Viewer ID: {viewerID}. Capture Mode: {captureMode.ToString()}. App Mode: {Program.Mode} Desktop: {Program.CurrentDesktopName}"); - var viewer = new Models.Viewer() + viewer = new Viewer() { Capturer = capturer, DisconnectRequested = false, Name = requesterName, ViewerConnectionID = viewerID, - HasControl = Program.Mode == Enums.AppMode.Unattended + HasControl = Program.Mode == Enums.AppMode.Unattended, + ImageQuality = 1 }; - var success = false; while (!success) { success = Program.Viewers.TryAdd(viewerID, viewer); @@ -97,35 +101,47 @@ namespace Remotely_ScreenCast.Capture while (viewer.PendingFrames > 10) { + Logger.Write("Waiting on pending frames."); await Task.Delay(1); } capturer.Capture(); - var newImage = ImageUtils.GetImageDiff(capturer.CurrentFrame, capturer.PreviousFrame, capturer.CaptureFullscreen); + var diffArea = ImageUtils.GetDiffArea(capturer.CurrentFrame, capturer.PreviousFrame, capturer.CaptureFullscreen); - - if (viewer.PendingFrames > 5) - { - var reductionRatio = (double)5 / viewer.PendingFrames; - Logger.Write($"Reducing image quality to {reductionRatio}."); - - newImage = new Bitmap( - capturer.CurrentFrame, - (int)(capturer.CurrentScreenBounds.Width * reductionRatio), - (int)(capturer.CurrentScreenBounds.Height * reductionRatio)); - } + var newImage = capturer.CurrentFrame.Clone(diffArea, System.Drawing.Imaging.PixelFormat.Format32bppArgb); if (capturer.CaptureFullscreen) { capturer.CaptureFullscreen = false; } - var img = ImageUtils.EncodeBitmap(newImage); + long newQuality; + if (viewer.PendingFrames < 5) + { + newQuality = (long)Math.Min(1, viewer.ImageQuality + .1); + } + else + { + newQuality = (long)Math.Max(.1, viewer.ImageQuality - .1); + } + Logger.Write($"New quality: {newQuality}"); + if (newQuality != viewer.ImageQuality) + { + viewer.ImageQuality = newQuality; + viewer.FullScreenRefreshNeeded = true; + } + else + { + capturer.CaptureFullscreen = true; + viewer.FullScreenRefreshNeeded = false; + } + + var img = ImageUtils.EncodeBitmap(newImage, viewer.EncoderParams); if (img?.Length > 0) { - await outgoingMessages.SendScreenCapture(img, viewerID, DateTime.UtcNow); + await outgoingMessages.SendScreenCapture(img, viewerID, diffArea.Left, diffArea.Top, diffArea.Width, diffArea.Height, DateTime.UtcNow); viewer.PendingFrames++; } } diff --git a/Remotely_ScreenCast/Models/Viewer.cs b/Remotely_ScreenCast/Models/Viewer.cs index 0307298c..dfb58000 100644 --- a/Remotely_ScreenCast/Models/Viewer.cs +++ b/Remotely_ScreenCast/Models/Viewer.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Drawing; +using System.Drawing.Imaging; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -15,7 +16,41 @@ namespace Remotely_ScreenCast.Models public ICapturer Capturer { get; set; } public bool DisconnectRequested { get; set; } public bool HasControl { get; set; } - public double Latency { get; set; } + public double Latency { get; set; } = 1; public int PendingFrames { get; set; } + + private long imageQuality = 1; + public long ImageQuality + { + get + { + return imageQuality; + } + set + { + if (imageQuality > 100 || imageQuality < 0) + { + return; + } + imageQuality = value; + EncoderParams = new EncoderParameters() + { + Param = new EncoderParameter[] + { + new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, value) + } + }; + } + } + public bool FullScreenRefreshNeeded { get; internal set; } + + public EncoderParameters EncoderParams { get; private set; } = new EncoderParameters() + { + Param = new EncoderParameter[] + { + new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 75L) + } + }; + } } diff --git a/Remotely_ScreenCast/Sockets/MessageHandlers.cs b/Remotely_ScreenCast/Sockets/MessageHandlers.cs index 144cceed..e71e557b 100644 --- a/Remotely_ScreenCast/Sockets/MessageHandlers.cs +++ b/Remotely_ScreenCast/Sockets/MessageHandlers.cs @@ -169,7 +169,7 @@ namespace Remotely_ScreenCast.Sockets } await hubConnection.InvokeAsync("ViewerDisconnected", viewerID); }); - hubConnection.On("LatencyUpdate", (double latency, double payloadSize, string viewerID) => + hubConnection.On("LatencyUpdate", (double latency, string viewerID) => { if (Program.Viewers.TryGetValue(viewerID, out var viewer)) { diff --git a/Remotely_ScreenCast/Sockets/OutgoingMessages.cs b/Remotely_ScreenCast/Sockets/OutgoingMessages.cs index 4bf63251..c7434cff 100644 --- a/Remotely_ScreenCast/Sockets/OutgoingMessages.cs +++ b/Remotely_ScreenCast/Sockets/OutgoingMessages.cs @@ -22,9 +22,9 @@ namespace Remotely_ScreenCast.Sockets await Connection.SendAsync("SendScreenSize", width, height, viewerID); } - public async Task SendScreenCapture(byte[] captureBytes, string viewerID, DateTime captureTime) + public async Task SendScreenCapture(byte[] captureBytes, string viewerID, int left, int top, int width, int height, DateTime captureTime) { - await Connection.SendAsync("SendScreenCapture", captureBytes, viewerID, captureTime); + await Connection.SendAsync("SendScreenCapture", captureBytes, viewerID, left, top, width, height, captureTime); } internal async Task SendScreenCount(int primaryScreenIndex, int screenCount, string viewerID) diff --git a/Remotely_Server/Services/RCBrowserSocketHub.cs b/Remotely_Server/Services/RCBrowserSocketHub.cs index f78c80df..0a46308e 100644 --- a/Remotely_Server/Services/RCBrowserSocketHub.cs +++ b/Remotely_Server/Services/RCBrowserSocketHub.cs @@ -159,9 +159,9 @@ namespace Remotely_Server.Services await RCDeviceHub.Clients.Client(screenCasterID).SendAsync("GetScreenCast", Context.ConnectionId, requesterName); } - public async Task SendLatencyUpdate(double latency, double payloadSize) + public async Task SendLatencyUpdate(double latency) { - await RCDeviceHub.Clients.Client(ScreenCasterID).SendAsync("LatencyUpdate", latency, payloadSize, Context.ConnectionId); + await RCDeviceHub.Clients.Client(ScreenCasterID).SendAsync("LatencyUpdate", latency, Context.ConnectionId); } public async Task SendSharedFileIDs(List fileIDs) { diff --git a/Remotely_Server/Services/RCDeviceSocketHub.cs b/Remotely_Server/Services/RCDeviceSocketHub.cs index c0884a3c..b9990024 100644 --- a/Remotely_Server/Services/RCDeviceSocketHub.cs +++ b/Remotely_Server/Services/RCDeviceSocketHub.cs @@ -106,9 +106,9 @@ namespace Remotely_Server.Services await RCBrowserHub.Clients.Client(rcBrowserHubConnectionID).SendAsync("ScreenSize", width, height); } - public Task SendScreenCapture(byte[] captureBytes, string rcBrowserHubConnectionID, DateTime captureTime) + public Task SendScreenCapture(byte[] captureBytes, string rcBrowserHubConnectionID, int left, int top, int width, int height, DateTime captureTime) { - return RCBrowserHub.Clients.Client(rcBrowserHubConnectionID).SendAsync("ScreenCapture", captureBytes, captureTime); + return RCBrowserHub.Clients.Client(rcBrowserHubConnectionID).SendAsync("ScreenCapture", captureBytes, left, top, width, height, captureTime); } public async Task NotifyRequesterUnattendedReady(string browserHubConnectionID) diff --git a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js index fd416826..86d29d78 100644 --- a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js +++ b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js @@ -31,8 +31,8 @@ export class RCBrowserSockets { SendScreenCastRequestToDevice() { return this.Connection.invoke("SendScreenCastRequestToDevice", RemoteControl.ClientID, RemoteControl.RequesterName, RemoteControl.Mode); } - SendLatencyUpdate(latency, payloadSize) { - this.Connection.invoke("SendLatencyUpdate", latency, payloadSize); + SendLatencyUpdate(latency) { + this.Connection.invoke("SendLatencyUpdate", latency); } SendSelectScreen(index) { return this.Connection.invoke("SelectScreen", index); @@ -104,13 +104,13 @@ export class RCBrowserSockets { UI.ScreenViewer.height = height; UI.Screen2DContext.clearRect(0, 0, width, height); }); - hubConnection.on("ScreenCapture", (buffer, captureTime) => { + hubConnection.on("ScreenCapture", (buffer, left, top, width, height, captureTime) => { var latency = Date.now() - new Date(captureTime).getTime(); - this.SendLatencyUpdate(latency, buffer.length); + this.SendLatencyUpdate(latency); var url = window.URL.createObjectURL(new Blob([buffer])); var img = document.createElement("img"); img.onload = () => { - UI.Screen2DContext.drawImage(img, 0, 0, UI.ScreenViewer.width, UI.ScreenViewer.height); + UI.Screen2DContext.drawImage(img, left, top, width, height); window.URL.revokeObjectURL(url); }; img.src = url; diff --git a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js.map b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js.map index 979a6c1b..13997fb3 100644 --- a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js.map +++ b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js.map @@ -1 +1 @@ -{"version":3,"file":"RCBrowserSockets.js","sourceRoot":"","sources":["RCBrowserSockets.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"RCBrowserSockets.js","sourceRoot":"","sources":["RCBrowserSockets.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.ts b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.ts index 055e5c62..7597e725 100644 --- a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.ts +++ b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.ts @@ -38,8 +38,8 @@ export class RCBrowserSockets { SendScreenCastRequestToDevice() { return this.Connection.invoke("SendScreenCastRequestToDevice", RemoteControl.ClientID, RemoteControl.RequesterName, RemoteControl.Mode); } - SendLatencyUpdate(latency: number, payloadSize: number) { - this.Connection.invoke("SendLatencyUpdate", latency, payloadSize); + SendLatencyUpdate(latency: number) { + this.Connection.invoke("SendLatencyUpdate", latency); } SendSelectScreen(index: number) { return this.Connection.invoke("SelectScreen", index); @@ -112,14 +112,14 @@ export class RCBrowserSockets { UI.ScreenViewer.height = height; UI.Screen2DContext.clearRect(0, 0, width, height); }); - hubConnection.on("ScreenCapture", (buffer: Uint8Array, captureTime: Date) => { + hubConnection.on("ScreenCapture", (buffer: Uint8Array, left:number, top:number, width:number, height:number, captureTime: Date) => { var latency = Date.now() - new Date(captureTime).getTime(); - this.SendLatencyUpdate(latency, buffer.length); + this.SendLatencyUpdate(latency); var url = window.URL.createObjectURL(new Blob([buffer])); var img = document.createElement("img"); img.onload = () => { - UI.Screen2DContext.drawImage(img, 0, 0, UI.ScreenViewer.width, UI.ScreenViewer.height); + UI.Screen2DContext.drawImage(img, left, top, width, height); window.URL.revokeObjectURL(url); }; img.src = url;