diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-03-04 14:09:45 +0200 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-03-04 14:09:45 +0200 |
| commit | 565e48de649d3d14e6b82012b6aa2e3819a3c82c (patch) | |
| tree | 16e766f6bd45e62c48d6046a21841526aafaed73 /Software/Visual_Studio/Tango.RemoteDesktop | |
| parent | b0ccae10fa6025838195c42fa6c9dd72b4321579 (diff) | |
| download | Tango-565e48de649d3d14e6b82012b6aa2e3819a3c82c.tar.gz Tango-565e48de649d3d14e6b82012b6aa2e3819a3c82c.zip | |
Improved BitmapCliper.
Implemented auto throw when max differences reached.
Implemented fallback TurboJpeg encoder.
Fixed issue with UpdateMachine.xml script removing DISPENSERS before IDS_PACKS.
Added GlobalHost.Configuration.MaxIncomingWebSocketMessageSize for WebSockets support for large messages on SignalR.
Diffstat (limited to 'Software/Visual_Studio/Tango.RemoteDesktop')
17 files changed, 339 insertions, 23 deletions
diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/Clipping/BitmapCliper.cs b/Software/Visual_Studio/Tango.RemoteDesktop/Clipping/BitmapCliper.cs index 8866f6d9a..f2e500e4e 100644 --- a/Software/Visual_Studio/Tango.RemoteDesktop/Clipping/BitmapCliper.cs +++ b/Software/Visual_Studio/Tango.RemoteDesktop/Clipping/BitmapCliper.cs @@ -30,8 +30,7 @@ namespace Tango.RemoteDesktop.Clipping //determine top for (int i = 0; i < rgbValues.Length; i++) { - int color = rgbValues[i] & 0xffffff; - if (color != 0x0) + if (rgbValues[i] != 16777215) { int r = i / bd.Width; int c = i % bd.Width; @@ -53,8 +52,7 @@ namespace Tango.RemoteDesktop.Clipping //determine bottom for (int i = rgbValues.Length - 1; i >= 0; i--) { - int color = rgbValues[i] & 0xffffff; - if (color != 0x0) + if (rgbValues[i] != 16777215) { int r = i / bd.Width; int c = i % bd.Width; @@ -79,8 +77,7 @@ namespace Tango.RemoteDesktop.Clipping //determine left for (int c = 0; c < left; c++) { - int color = rgbValues[r * bd.Width + c] & 0xffffff; - if (color != 0x0) + if (rgbValues[r * bd.Width + c] != 16777215) { if (left > c) { @@ -93,8 +90,7 @@ namespace Tango.RemoteDesktop.Clipping //determine right for (int c = bd.Width - 1; c > right; c--) { - int color = rgbValues[r * bd.Width + c] & 0xffffff; - if (color != 0x0) + if (rgbValues[r * bd.Width + c] != 16777215) { if (right < c) { @@ -128,7 +124,9 @@ namespace Tango.RemoteDesktop.Clipping //create new image Bitmap newImage = new Bitmap(width, height, PixelFormat.Format32bppArgb); - BitmapData nbd = newImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); + BitmapData nbd + = newImage.LockBits(new Rectangle(0, 0, width, height), + ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); Marshal.Copy(imgData, 0, nbd.Scan0, imgData.Length); newImage.UnlockBits(nbd); diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/Comparers/RasterBitmapComparer.cs b/Software/Visual_Studio/Tango.RemoteDesktop/Comparers/RasterBitmapComparer.cs index b1b186065..7aa6a07a0 100644 --- a/Software/Visual_Studio/Tango.RemoteDesktop/Comparers/RasterBitmapComparer.cs +++ b/Software/Visual_Studio/Tango.RemoteDesktop/Comparers/RasterBitmapComparer.cs @@ -16,6 +16,12 @@ namespace Tango.RemoteDesktop.Comparers public class RasterBitmapComparer : IBitmapComparer<RasterFrame> { /// <summary> + /// When max number of differences reached, the comparer will immediately return the current difference frame. + /// This should enforce the screen capture engine to report 'No Difference Available'. + /// </summary> + public long? MaxDifferencesThrow { get; set; } + + /// <summary> /// Creates the difference as <see cref="RasterFrame"/>. /// </summary> /// <param name="previousBitmap">The previous bitmap.</param> @@ -94,6 +100,15 @@ namespace Tango.RemoteDesktop.Comparers if (same != 4) { count++; + + if (MaxDifferencesThrow != null && count > MaxDifferencesThrow.Value) + { + previousBitmap.UnlockBits(data1); + currentBitmap.UnlockBits(data2); + diffImage.UnlockBits(diffData); + diffImage.Dispose(); + throw new MaxDifferencesReachedException(); + } } } diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/Comparers/VectorBitmapComparer.cs b/Software/Visual_Studio/Tango.RemoteDesktop/Comparers/VectorBitmapComparer.cs index 7f6dd9ccf..338318177 100644 --- a/Software/Visual_Studio/Tango.RemoteDesktop/Comparers/VectorBitmapComparer.cs +++ b/Software/Visual_Studio/Tango.RemoteDesktop/Comparers/VectorBitmapComparer.cs @@ -17,6 +17,12 @@ namespace Tango.RemoteDesktop.Comparers public class VectorBitmapComparer : IBitmapComparer<VectorFrame> { /// <summary> + /// When max number of differences reached, the comparer will immediately return the current difference frame. + /// This should enforce the screen capture engine to report 'No Difference Available'. + /// </summary> + public long? MaxDifferencesThrow { get; set; } + + /// <summary> /// Creates the difference as <see cref="VectorFrame"/>. /// </summary> /// <param name="previousBitmap">The previous bitmap.</param> @@ -105,6 +111,13 @@ namespace Tango.RemoteDesktop.Comparers }); count++; + + if (MaxDifferencesThrow != null && count > MaxDifferencesThrow.Value) + { + previousBitmap.UnlockBits(data1); + currentBitmap.UnlockBits(data2); + throw new MaxDifferencesReachedException(); + } } } diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/Encoders/JpegEncoder.cs b/Software/Visual_Studio/Tango.RemoteDesktop/Encoders/JpegEncoder.cs index 744849977..c72f1afc4 100644 --- a/Software/Visual_Studio/Tango.RemoteDesktop/Encoders/JpegEncoder.cs +++ b/Software/Visual_Studio/Tango.RemoteDesktop/Encoders/JpegEncoder.cs @@ -58,11 +58,5 @@ namespace Tango.RemoteDesktop.Encoders return ms.ToArray(); } } - - private ImageCodecInfo GetEncoder(ImageFormat format) - { - ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); - return codecs.Single(codec => codec.FormatID == format.Guid); - } } } diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/Encoders/TurboJpegEncoder.cs b/Software/Visual_Studio/Tango.RemoteDesktop/Encoders/TurboJpegEncoder.cs new file mode 100644 index 000000000..b3909911f --- /dev/null +++ b/Software/Visual_Studio/Tango.RemoteDesktop/Encoders/TurboJpegEncoder.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TurboJpegWrapper; + +namespace Tango.RemoteDesktop.Encoders +{ + public class TurboJpegEncoder : FrameEncoder + { + private TJCompressor _compressor; + + /// <summary> + /// Initializes a new instance of the <see cref="TurboJpegEncoder"/> class. + /// </summary> + /// <param name="frame">The frame.</param> + public TurboJpegEncoder(IFrame frame) : base(frame) + { + _compressor = new TJCompressor(); + } + + /// <summary> + /// Returns a stream containing the encoded frame. + /// </summary> + /// <returns></returns> + public override MemoryStream ToStream() + { + return ToStream(100); + } + + /// <summary> + /// Returns a byte array containing the encoded frame. + /// </summary> + /// <returns></returns> + public override byte[] ToArray() + { + return ToArray(100); + } + + /// <summary> + /// Returns a stream containing the encoded frame with the specified quality. + /// </summary> + /// <param name="quality">The quality.</param> + /// <returns></returns> + public virtual MemoryStream ToStream(int quality) + { + return new MemoryStream(ToArray(quality)); + } + + /// <summary> + /// Returns a byte array containing the encoded frame with the specified quality. + /// </summary> + /// <param name="quality">The quality.</param> + /// <returns></returns> + public byte[] ToArray(int quality) + { + return _compressor.Compress(Frame.ToBitmap(), TJSubsamplingOption.Chrominance411, quality, TJFlags.None); + } + } +} diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/Frame.cs b/Software/Visual_Studio/Tango.RemoteDesktop/Frame.cs index e871d5da2..105a99134 100644 --- a/Software/Visual_Studio/Tango.RemoteDesktop/Frame.cs +++ b/Software/Visual_Studio/Tango.RemoteDesktop/Frame.cs @@ -76,9 +76,9 @@ namespace Tango.RemoteDesktop /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> - public IFrameEncoder ToEncoder<T>() where T : IFrameEncoder + public T ToEncoder<T>() where T : IFrameEncoder { - return Activator.CreateInstance(typeof(T), new object[] { this }) as IFrameEncoder; + return (T)Activator.CreateInstance(typeof(T), new object[] { this }); } /// <summary> diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/FrameEncoder.cs b/Software/Visual_Studio/Tango.RemoteDesktop/FrameEncoder.cs index a1413d9c9..dd5f5c064 100644 --- a/Software/Visual_Studio/Tango.RemoteDesktop/FrameEncoder.cs +++ b/Software/Visual_Studio/Tango.RemoteDesktop/FrameEncoder.cs @@ -39,7 +39,7 @@ namespace Tango.RemoteDesktop /// Returns a byte array containing the encoded frame. /// </summary> /// <returns></returns> - public byte[] ToArray() + public virtual byte[] ToArray() { using (var ms = ToStream()) { diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/IBitmapComparer.cs b/Software/Visual_Studio/Tango.RemoteDesktop/IBitmapComparer.cs index 6e1f8e999..21ba15c29 100644 --- a/Software/Visual_Studio/Tango.RemoteDesktop/IBitmapComparer.cs +++ b/Software/Visual_Studio/Tango.RemoteDesktop/IBitmapComparer.cs @@ -20,5 +20,12 @@ namespace Tango.RemoteDesktop /// <param name="currentBitmap">The current bitmap.</param> /// <returns></returns> BitmapComparerResult<TFrame> CreateDifference(Bitmap previousBitmap, Bitmap currentBitmap); + + /// <summary> + /// When max number of differences reached, the comparer will immediately return the current difference frame. + /// This should enforce the screen capture engine to report 'No Difference Available'. + /// The value of null (default) means infinite. + /// </summary> + long? MaxDifferencesThrow { get; set; } } } diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/IFrame.cs b/Software/Visual_Studio/Tango.RemoteDesktop/IFrame.cs index f5a69218d..1bdfd7650 100644 --- a/Software/Visual_Studio/Tango.RemoteDesktop/IFrame.cs +++ b/Software/Visual_Studio/Tango.RemoteDesktop/IFrame.cs @@ -48,6 +48,6 @@ namespace Tango.RemoteDesktop /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> - IFrameEncoder ToEncoder<T>() where T : IFrameEncoder; + T ToEncoder<T>() where T : IFrameEncoder; } } diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/MaxDifferencesReachedException.cs b/Software/Visual_Studio/Tango.RemoteDesktop/MaxDifferencesReachedException.cs new file mode 100644 index 000000000..e93a8eff1 --- /dev/null +++ b/Software/Visual_Studio/Tango.RemoteDesktop/MaxDifferencesReachedException.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.RemoteDesktop +{ + public class MaxDifferencesReachedException : Exception + { + public MaxDifferencesReachedException() : base("The number of differences exceeded the maximum value. You should return the whole frame.") + { + + } + } +} diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/ScreenCaptureEngine.cs b/Software/Visual_Studio/Tango.RemoteDesktop/ScreenCaptureEngine.cs index 17f54369c..81efb6a30 100644 --- a/Software/Visual_Studio/Tango.RemoteDesktop/ScreenCaptureEngine.cs +++ b/Software/Visual_Studio/Tango.RemoteDesktop/ScreenCaptureEngine.cs @@ -157,10 +157,19 @@ namespace Tango.RemoteDesktop } else { - var result = Comparer.CreateDifference(_previousBitmap, bitmap); - _previousBitmap.Dispose(); - _previousBitmap = bitmap.Clone() as Bitmap; - OnFrameReceived(bitmap, result.Frame, result.DifferenceCount); + try + { + BitmapComparerResult<TFrame> result = Comparer.CreateDifference(_previousBitmap, bitmap); + _previousBitmap.Dispose(); + _previousBitmap = bitmap.Clone() as Bitmap; + OnFrameReceived(bitmap, result.Frame, result.DifferenceCount); + } + catch (MaxDifferencesReachedException) + { + _previousBitmap.Dispose(); + _previousBitmap = bitmap.Clone() as Bitmap; + OnFrameReceived(bitmap, null, (uint)(bitmap.Width * bitmap.Height)); + } } } else diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/Tango.RemoteDesktop.csproj b/Software/Visual_Studio/Tango.RemoteDesktop/Tango.RemoteDesktop.csproj index 87674b42b..b0feb438d 100644 --- a/Software/Visual_Studio/Tango.RemoteDesktop/Tango.RemoteDesktop.csproj +++ b/Software/Visual_Studio/Tango.RemoteDesktop/Tango.RemoteDesktop.csproj @@ -34,6 +34,9 @@ <ItemGroup> <Reference Include="PresentationCore" /> <Reference Include="PresentationFramework" /> + <Reference Include="Quamotion.TurboJpegWrapper, Version=1.5.0.0, Culture=neutral, PublicKeyToken=c6aab54697744588, processorArchitecture=MSIL"> + <HintPath>..\packages\Quamotion.TurboJpegWrapper.1.5.69\lib\net45\Quamotion.TurboJpegWrapper.dll</HintPath> + </Reference> <Reference Include="SharpDX, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> <HintPath>..\Referenced Assemblies\SharpDX\SharpDX.dll</HintPath> @@ -75,10 +78,12 @@ <Compile Include="Comparers\VectorBitmapComparer.cs" /> <Compile Include="Encoders\GifEncoder.cs" /> <Compile Include="Encoders\Png8BitEncoder.cs" /> + <Compile Include="Encoders\TurboJpegEncoder.cs" /> <Compile Include="Engines\RasterScreenCaptureEngine.cs" /> <Compile Include="Engines\VectorScreenCaptureEngine.cs" /> <Compile Include="Frames\VectorFrameColor.cs" /> <Compile Include="IScreenCaptureEngine.cs" /> + <Compile Include="MaxDifferencesReachedException.cs" /> <Compile Include="Network\RemoteDesktopPacket.cs" /> <Compile Include="Network\StartRemoteDesktopSessionRequest.cs" /> <Compile Include="Network\StartRemoteDesktopSessionResponse.cs" /> @@ -109,5 +114,24 @@ <Compile Include="Frames\VectorFrame.cs" /> <Compile Include="Frames\VectorFramePixel.cs" /> </ItemGroup> + <ItemGroup> + <Content Include="win7-x64\turbojpeg.dll"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + <Content Include="win7-x86\turbojpeg.dll"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + </ItemGroup> + <ItemGroup> + <Content Include="win7-x64\turbojpeg.dll.meta"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + <Content Include="win7-x86\turbojpeg.dll.meta"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + </ItemGroup> + <ItemGroup> + <None Include="packages.config" /> + </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/packages.config b/Software/Visual_Studio/Tango.RemoteDesktop/packages.config new file mode 100644 index 000000000..2cbb3038a --- /dev/null +++ b/Software/Visual_Studio/Tango.RemoteDesktop/packages.config @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<packages> + <package id="Quamotion.TurboJpegWrapper" version="1.5.69" targetFramework="net461" /> +</packages>
\ No newline at end of file diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/win7-x64/turbojpeg.dll b/Software/Visual_Studio/Tango.RemoteDesktop/win7-x64/turbojpeg.dll Binary files differnew file mode 100644 index 000000000..da956aad6 --- /dev/null +++ b/Software/Visual_Studio/Tango.RemoteDesktop/win7-x64/turbojpeg.dll diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/win7-x64/turbojpeg.dll.meta b/Software/Visual_Studio/Tango.RemoteDesktop/win7-x64/turbojpeg.dll.meta new file mode 100644 index 000000000..9ee42ad7b --- /dev/null +++ b/Software/Visual_Studio/Tango.RemoteDesktop/win7-x64/turbojpeg.dll.meta @@ -0,0 +1,87 @@ +fileFormatVersion: 2 +guid: 8320357f84e101f4bbdd0775df156e89 +timeCreated: 1522943063 +licenseType: Pro +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: x86_64 + DefaultValueInitialized: true + - first: + Facebook: Win + second: + enabled: 0 + settings: + CPU: None + - first: + Facebook: Win64 + second: + enabled: 1 + settings: + CPU: AnyCPU + - first: + Standalone: Linux + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: + CPU: x86_64 + - first: + Standalone: LinuxUniversal + second: + enabled: 1 + settings: + CPU: x86_64 + - first: + Standalone: OSXIntel + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: OSXIntel64 + second: + enabled: 1 + settings: + CPU: AnyCPU + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: x86_64 + - first: + Standalone: Win + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: Win64 + second: + enabled: 1 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/win7-x86/turbojpeg.dll b/Software/Visual_Studio/Tango.RemoteDesktop/win7-x86/turbojpeg.dll Binary files differnew file mode 100644 index 000000000..4d9f76dff --- /dev/null +++ b/Software/Visual_Studio/Tango.RemoteDesktop/win7-x86/turbojpeg.dll diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/win7-x86/turbojpeg.dll.meta b/Software/Visual_Studio/Tango.RemoteDesktop/win7-x86/turbojpeg.dll.meta new file mode 100644 index 000000000..acfd633cc --- /dev/null +++ b/Software/Visual_Studio/Tango.RemoteDesktop/win7-x86/turbojpeg.dll.meta @@ -0,0 +1,87 @@ +fileFormatVersion: 2 +guid: 617193c2aec53e04c844c2c778c162b2 +timeCreated: 1523070844 +licenseType: Pro +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: x86 + DefaultValueInitialized: true + - first: + Facebook: Win + second: + enabled: 1 + settings: + CPU: AnyCPU + - first: + Facebook: Win64 + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: Linux + second: + enabled: 1 + settings: + CPU: x86 + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: LinuxUniversal + second: + enabled: 1 + settings: + CPU: x86 + - first: + Standalone: OSXIntel + second: + enabled: 1 + settings: + CPU: AnyCPU + - first: + Standalone: OSXIntel64 + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: x86 + - first: + Standalone: Win + second: + enabled: 1 + settings: + CPU: AnyCPU + - first: + Standalone: Win64 + second: + enabled: 0 + settings: + CPU: None + userData: + assetBundleName: + assetBundleVariant: |
