From e068058868780129edb96408ad47fc66de037eb9 Mon Sep 17 00:00:00 2001 From: JacekNaruniec Date: Fri, 13 Jan 2017 21:05:01 +0100 Subject: [PATCH] Added zstd frame compression option (about 25% less frame size for compression level = 2). --- LiveScanClient/KinectClient.vcxproj | 4 +- LiveScanServer/KinectSettings.cs | 4 + LiveScanServer/KinectSocket.cs | 17 +- LiveScanServer/LiveScanServer.csproj | 7 +- LiveScanServer/SettingsForm.Designer.cs | 318 +++++++---- LiveScanServer/SettingsForm.cs | 18 + LiveScanServer/ZSTDDecompressor.cs | 41 ++ bin/libzstd.dll | Bin 0 -> 326656 bytes include/LiveScanClient/liveScanClient.h | 2 + include/zstd.h | 692 ++++++++++++++++++++++++ lib/libzstd.lib | Bin 0 -> 29012 bytes lib/libzstdd.lib | Bin 0 -> 29012 bytes src/LiveScanClient/liveScanClient.cpp | 36 +- 13 files changed, 1004 insertions(+), 135 deletions(-) create mode 100644 LiveScanServer/ZSTDDecompressor.cs create mode 100644 bin/libzstd.dll create mode 100644 include/zstd.h create mode 100644 lib/libzstd.lib create mode 100644 lib/libzstdd.lib diff --git a/LiveScanClient/KinectClient.vcxproj b/LiveScanClient/KinectClient.vcxproj index cfff532..9c01116 100644 --- a/LiveScanClient/KinectClient.vcxproj +++ b/LiveScanClient/KinectClient.vcxproj @@ -91,7 +91,7 @@ true c:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\Lib\x86\;D:\opencv\build\x86\vc12\lib;$(KINECTSDK20_DIR)\lib\x86;$(SolutionDir)lib - opencv_highgui248d.lib;opencv_calib3d248d.lib;opencv_imgproc248d.lib;opencv_core248d.lib;kinect20.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + opencv_highgui248d.lib;opencv_calib3d248d.lib;opencv_imgproc248d.lib;opencv_core248d.lib;kinect20.lib;kernel32.lib;libzstdd.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) NotSet @@ -111,7 +111,7 @@ true true true - opencv_highgui248.lib;opencv_calib3d248.lib;opencv_imgproc248.lib;opencv_core248.lib;kinect20.lib;%(AdditionalDependencies) + opencv_highgui248.lib;opencv_calib3d248.lib;opencv_imgproc248.lib;opencv_core248.lib;kinect20.lib;libzstd.lib;%(AdditionalDependencies) c:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\Lib\x86\;D:\opencv\build\x86\vc12\lib;$(KINECTSDK20_DIR)\lib\x86;$(SolutionDir)lib diff --git a/LiveScanServer/KinectSettings.cs b/LiveScanServer/KinectSettings.cs index 5366760..f5ed1d8 100644 --- a/LiveScanServer/KinectSettings.cs +++ b/LiveScanServer/KinectSettings.cs @@ -35,6 +35,7 @@ namespace KinectServer public bool bStreamOnlyBodies = false; public bool bShowSkeletons = true; + public int iCompressionLevel = 2; // 0 for no compression, 2 is recommended public int nNumICPIterations = 10; public int nNumRefineIters = 2; @@ -96,6 +97,9 @@ namespace KinectServer else lData.Add(0); + bTemp = BitConverter.GetBytes(iCompressionLevel); + lData.AddRange(bTemp); + return lData; } } diff --git a/LiveScanServer/KinectSocket.cs b/LiveScanServer/KinectSocket.cs index b962ba9..39b8d6d 100644 --- a/LiveScanServer/KinectSocket.cs +++ b/LiveScanServer/KinectSocket.cs @@ -42,7 +42,7 @@ namespace KinectServer public List lFrameRGB = new List(); public List lFrameVerts = new List(); - public List lBodies = new List(); + public List lBodies = new List(); public event SocketChangedHandler eChanged; @@ -165,19 +165,16 @@ namespace KinectServer return; } - oSocket.Receive(buffer, 4, SocketFlags.None); - - //string result = System.Text.Encoding.UTF8.GetString(buffer); - //n_to_read = Int32.Parse(result); - + oSocket.Receive(buffer, 8, SocketFlags.None); nToRead = BitConverter.ToInt32(buffer, 0); + int iCompressed = BitConverter.ToInt32(buffer, 4); if (nToRead == -1) { bNoMoreStoredFrames = true; return; } - + buffer = new byte[nToRead]; int nAlreadyRead = 0; @@ -192,6 +189,12 @@ namespace KinectServer nAlreadyRead += oSocket.Receive(buffer, nAlreadyRead, nToRead - nAlreadyRead, SocketFlags.None); } + + + + if (iCompressed == 1) + buffer = ZSTDDecompressor.Decompress(buffer); + //Receive depth and color data int startIdx = 0; diff --git a/LiveScanServer/LiveScanServer.csproj b/LiveScanServer/LiveScanServer.csproj index 18c2276..a86cd5a 100644 --- a/LiveScanServer/LiveScanServer.csproj +++ b/LiveScanServer/LiveScanServer.csproj @@ -32,7 +32,10 @@ 4 - + + False + ..\bin\OpenTK.dll + @@ -68,8 +71,10 @@ + MainWindowForm.cs + Designer ResXFileCodeGenerator diff --git a/LiveScanServer/SettingsForm.Designer.cs b/LiveScanServer/SettingsForm.Designer.cs index ef9c06c..0a4a91b 100644 --- a/LiveScanServer/SettingsForm.Designer.cs +++ b/LiveScanServer/SettingsForm.Designer.cs @@ -34,7 +34,7 @@ this.txtICPIters = new System.Windows.Forms.TextBox(); this.grClient = new System.Windows.Forms.GroupBox(); this.grBody = new System.Windows.Forms.GroupBox(); - this.label1 = new System.Windows.Forms.Label(); + this.chSkeletons = new System.Windows.Forms.CheckBox(); this.chBodyData = new System.Windows.Forms.CheckBox(); this.grMarkers = new System.Windows.Forms.GroupBox(); this.lbX2 = new System.Windows.Forms.Label(); @@ -77,7 +77,8 @@ this.rAsciiPly = new System.Windows.Forms.RadioButton(); this.txtRefinIters = new System.Windows.Forms.TextBox(); this.lbOuterIters = new System.Windows.Forms.Label(); - this.chSkeletons = new System.Windows.Forms.CheckBox(); + this.label2 = new System.Windows.Forms.Label(); + this.cbCompressionLevel = new System.Windows.Forms.ComboBox(); this.grClient.SuspendLayout(); this.grBody.SuspendLayout(); this.grMarkers.SuspendLayout(); @@ -89,18 +90,20 @@ // lbMerge // this.lbMerge.AutoSize = true; - this.lbMerge.Location = new System.Drawing.Point(6, 49); + this.lbMerge.Location = new System.Drawing.Point(7, 69); + this.lbMerge.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbMerge.Name = "lbMerge"; - this.lbMerge.Size = new System.Drawing.Size(69, 13); + this.lbMerge.Size = new System.Drawing.Size(99, 20); this.lbMerge.TabIndex = 22; this.lbMerge.Text = "Scan saving:"; // // chMerge // this.chMerge.AutoSize = true; - this.chMerge.Location = new System.Drawing.Point(98, 48); + this.chMerge.Location = new System.Drawing.Point(156, 70); + this.chMerge.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.chMerge.Name = "chMerge"; - this.chMerge.Size = new System.Drawing.Size(86, 17); + this.chMerge.Size = new System.Drawing.Size(126, 24); this.chMerge.TabIndex = 23; this.chMerge.Text = "merge scans"; this.chMerge.UseVisualStyleBackColor = true; @@ -109,17 +112,19 @@ // lbICPIters // this.lbICPIters.AutoSize = true; - this.lbICPIters.Location = new System.Drawing.Point(6, 26); + this.lbICPIters.Location = new System.Drawing.Point(7, 34); + this.lbICPIters.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbICPIters.Name = "lbICPIters"; - this.lbICPIters.Size = new System.Drawing.Size(86, 13); + this.lbICPIters.Size = new System.Drawing.Size(128, 20); this.lbICPIters.TabIndex = 24; this.lbICPIters.Text = "Num of ICP iters:"; // // txtICPIters // - this.txtICPIters.Location = new System.Drawing.Point(98, 23); + this.txtICPIters.Location = new System.Drawing.Point(156, 31); + this.txtICPIters.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtICPIters.Name = "txtICPIters"; - this.txtICPIters.Size = new System.Drawing.Size(38, 20); + this.txtICPIters.Size = new System.Drawing.Size(55, 26); this.txtICPIters.TabIndex = 25; this.txtICPIters.TextChanged += new System.EventHandler(this.txtICPIters_TextChanged); // @@ -129,9 +134,11 @@ this.grClient.Controls.Add(this.grMarkers); this.grClient.Controls.Add(this.grBounding); this.grClient.Controls.Add(this.grFiltering); - this.grClient.Location = new System.Drawing.Point(12, 12); + this.grClient.Location = new System.Drawing.Point(18, 18); + this.grClient.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.grClient.Name = "grClient"; - this.grClient.Size = new System.Drawing.Size(632, 327); + this.grClient.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.grClient.Size = new System.Drawing.Size(948, 447); this.grClient.TabIndex = 43; this.grClient.TabStop = false; this.grClient.Text = "KinectClient settings"; @@ -139,30 +146,35 @@ // grBody // this.grBody.Controls.Add(this.chSkeletons); - this.grBody.Controls.Add(this.label1); this.grBody.Controls.Add(this.chBodyData); - this.grBody.Location = new System.Drawing.Point(9, 211); + this.grBody.Location = new System.Drawing.Point(14, 325); + this.grBody.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.grBody.Name = "grBody"; - this.grBody.Size = new System.Drawing.Size(249, 110); + this.grBody.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.grBody.Size = new System.Drawing.Size(374, 101); this.grBody.TabIndex = 47; this.grBody.TabStop = false; this.grBody.Text = "Body data"; // - // label1 + // chSkeletons // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(8, 61); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(187, 13); - this.label1.TabIndex = 20; - this.label1.Text = "More features will be added here soon"; + this.chSkeletons.AutoSize = true; + this.chSkeletons.Location = new System.Drawing.Point(16, 63); + this.chSkeletons.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.chSkeletons.Name = "chSkeletons"; + this.chSkeletons.Size = new System.Drawing.Size(220, 24); + this.chSkeletons.TabIndex = 21; + this.chSkeletons.Text = "show skeletons in live view"; + this.chSkeletons.UseVisualStyleBackColor = true; + this.chSkeletons.CheckedChanged += new System.EventHandler(this.chSkeletons_CheckedChanged); // // chBodyData // this.chBodyData.AutoSize = true; - this.chBodyData.Location = new System.Drawing.Point(11, 19); + this.chBodyData.Location = new System.Drawing.Point(16, 29); + this.chBodyData.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.chBodyData.Name = "chBodyData"; - this.chBodyData.Size = new System.Drawing.Size(113, 17); + this.chBodyData.Size = new System.Drawing.Size(167, 24); this.chBodyData.TabIndex = 19; this.chBodyData.Text = "stream only bodies"; this.chBodyData.UseVisualStyleBackColor = true; @@ -186,9 +198,11 @@ this.grMarkers.Controls.Add(this.txtTranslationX); this.grMarkers.Controls.Add(this.lisMarkers); this.grMarkers.Controls.Add(this.txtTranslationY); - this.grMarkers.Location = new System.Drawing.Point(271, 19); + this.grMarkers.Location = new System.Drawing.Point(406, 29); + this.grMarkers.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.grMarkers.Name = "grMarkers"; - this.grMarkers.Size = new System.Drawing.Size(353, 185); + this.grMarkers.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.grMarkers.Size = new System.Drawing.Size(530, 285); this.grMarkers.TabIndex = 45; this.grMarkers.TabStop = false; this.grMarkers.Text = "Calibration markers"; @@ -196,17 +210,19 @@ // lbX2 // this.lbX2.AutoSize = true; - this.lbX2.Location = new System.Drawing.Point(230, 19); + this.lbX2.Location = new System.Drawing.Point(345, 29); + this.lbX2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbX2.Name = "lbX2"; - this.lbX2.Size = new System.Drawing.Size(14, 13); + this.lbX2.Size = new System.Drawing.Size(20, 20); this.lbX2.TabIndex = 49; this.lbX2.Text = "X"; // // btRemove // - this.btRemove.Location = new System.Drawing.Point(233, 127); + this.btRemove.Location = new System.Drawing.Point(350, 195); + this.btRemove.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.btRemove.Name = "btRemove"; - this.btRemove.Size = new System.Drawing.Size(92, 23); + this.btRemove.Size = new System.Drawing.Size(138, 35); this.btRemove.TabIndex = 59; this.btRemove.Text = "Remove marker"; this.btRemove.UseVisualStyleBackColor = true; @@ -214,68 +230,76 @@ // // txtOrientationZ // - this.txtOrientationZ.Location = new System.Drawing.Point(305, 38); + this.txtOrientationZ.Location = new System.Drawing.Point(458, 58); + this.txtOrientationZ.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtOrientationZ.Name = "txtOrientationZ"; - this.txtOrientationZ.Size = new System.Drawing.Size(38, 20); + this.txtOrientationZ.Size = new System.Drawing.Size(55, 26); this.txtOrientationZ.TabIndex = 48; this.txtOrientationZ.TextChanged += new System.EventHandler(this.txtOrientationZ_TextChanged); // // txtId // - this.txtId.Location = new System.Drawing.Point(217, 93); + this.txtId.Location = new System.Drawing.Point(326, 143); + this.txtId.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtId.Name = "txtId"; - this.txtId.Size = new System.Drawing.Size(38, 20); + this.txtId.Size = new System.Drawing.Size(55, 26); this.txtId.TabIndex = 58; this.txtId.TextChanged += new System.EventHandler(this.txtId_TextChanged); // // lbY2 // this.lbY2.AutoSize = true; - this.lbY2.Location = new System.Drawing.Point(274, 19); + this.lbY2.Location = new System.Drawing.Point(411, 29); + this.lbY2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbY2.Name = "lbY2"; - this.lbY2.Size = new System.Drawing.Size(14, 13); + this.lbY2.Size = new System.Drawing.Size(20, 20); this.lbY2.TabIndex = 50; this.lbY2.Text = "Y"; // // txtOrientationY // - this.txtOrientationY.Location = new System.Drawing.Point(261, 38); + this.txtOrientationY.Location = new System.Drawing.Point(392, 58); + this.txtOrientationY.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtOrientationY.Name = "txtOrientationY"; - this.txtOrientationY.Size = new System.Drawing.Size(38, 20); + this.txtOrientationY.Size = new System.Drawing.Size(55, 26); this.txtOrientationY.TabIndex = 47; this.txtOrientationY.TextChanged += new System.EventHandler(this.txtOrientationY_TextChanged); // // lbId // this.lbId.AutoSize = true; - this.lbId.Location = new System.Drawing.Point(132, 96); + this.lbId.Location = new System.Drawing.Point(198, 148); + this.lbId.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbId.Name = "lbId"; - this.lbId.Size = new System.Drawing.Size(54, 13); + this.lbId.Size = new System.Drawing.Size(78, 20); this.lbId.TabIndex = 57; this.lbId.Text = "Marker id:"; // // lbZ2 // this.lbZ2.AutoSize = true; - this.lbZ2.Location = new System.Drawing.Point(317, 19); + this.lbZ2.Location = new System.Drawing.Point(476, 29); + this.lbZ2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbZ2.Name = "lbZ2"; - this.lbZ2.Size = new System.Drawing.Size(14, 13); + this.lbZ2.Size = new System.Drawing.Size(19, 20); this.lbZ2.TabIndex = 51; this.lbZ2.Text = "Z"; // // txtOrientationX // - this.txtOrientationX.Location = new System.Drawing.Point(217, 38); + this.txtOrientationX.Location = new System.Drawing.Point(326, 58); + this.txtOrientationX.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtOrientationX.Name = "txtOrientationX"; - this.txtOrientationX.Size = new System.Drawing.Size(38, 20); + this.txtOrientationX.Size = new System.Drawing.Size(55, 26); this.txtOrientationX.TabIndex = 46; this.txtOrientationX.TextChanged += new System.EventHandler(this.txtOrientationX_TextChanged); // // btAdd // - this.btAdd.Location = new System.Drawing.Point(135, 127); + this.btAdd.Location = new System.Drawing.Point(202, 195); + this.btAdd.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.btAdd.Name = "btAdd"; - this.btAdd.Size = new System.Drawing.Size(92, 23); + this.btAdd.Size = new System.Drawing.Size(138, 35); this.btAdd.TabIndex = 56; this.btAdd.Text = "Add marker"; this.btAdd.UseVisualStyleBackColor = true; @@ -284,51 +308,58 @@ // lbTranslation // this.lbTranslation.AutoSize = true; - this.lbTranslation.Location = new System.Drawing.Point(132, 68); + this.lbTranslation.Location = new System.Drawing.Point(198, 105); + this.lbTranslation.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbTranslation.Name = "lbTranslation"; - this.lbTranslation.Size = new System.Drawing.Size(62, 13); + this.lbTranslation.Size = new System.Drawing.Size(91, 20); this.lbTranslation.TabIndex = 52; this.lbTranslation.Text = "Translation:"; // // lbOrientation // this.lbOrientation.AutoSize = true; - this.lbOrientation.Location = new System.Drawing.Point(132, 41); + this.lbOrientation.Location = new System.Drawing.Point(198, 63); + this.lbOrientation.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbOrientation.Name = "lbOrientation"; - this.lbOrientation.Size = new System.Drawing.Size(61, 13); + this.lbOrientation.Size = new System.Drawing.Size(91, 20); this.lbOrientation.TabIndex = 45; this.lbOrientation.Text = "Orientation:"; // // txtTranslationZ // - this.txtTranslationZ.Location = new System.Drawing.Point(305, 65); + this.txtTranslationZ.Location = new System.Drawing.Point(458, 100); + this.txtTranslationZ.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtTranslationZ.Name = "txtTranslationZ"; - this.txtTranslationZ.Size = new System.Drawing.Size(38, 20); + this.txtTranslationZ.Size = new System.Drawing.Size(55, 26); this.txtTranslationZ.TabIndex = 55; this.txtTranslationZ.TextChanged += new System.EventHandler(this.txtTranslationZ_TextChanged); // // txtTranslationX // - this.txtTranslationX.Location = new System.Drawing.Point(217, 65); + this.txtTranslationX.Location = new System.Drawing.Point(326, 100); + this.txtTranslationX.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtTranslationX.Name = "txtTranslationX"; - this.txtTranslationX.Size = new System.Drawing.Size(38, 20); + this.txtTranslationX.Size = new System.Drawing.Size(55, 26); this.txtTranslationX.TabIndex = 53; this.txtTranslationX.TextChanged += new System.EventHandler(this.txtTranslationX_TextChanged); // // lisMarkers // this.lisMarkers.FormattingEnabled = true; - this.lisMarkers.Location = new System.Drawing.Point(6, 41); + this.lisMarkers.ItemHeight = 20; + this.lisMarkers.Location = new System.Drawing.Point(9, 63); + this.lisMarkers.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.lisMarkers.Name = "lisMarkers"; - this.lisMarkers.Size = new System.Drawing.Size(120, 108); + this.lisMarkers.Size = new System.Drawing.Size(178, 164); this.lisMarkers.TabIndex = 43; this.lisMarkers.SelectedIndexChanged += new System.EventHandler(this.lisMarkers_SelectedIndexChanged); // // txtTranslationY // - this.txtTranslationY.Location = new System.Drawing.Point(261, 65); + this.txtTranslationY.Location = new System.Drawing.Point(392, 100); + this.txtTranslationY.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtTranslationY.Name = "txtTranslationY"; - this.txtTranslationY.Size = new System.Drawing.Size(38, 20); + this.txtTranslationY.Size = new System.Drawing.Size(55, 26); this.txtTranslationY.TabIndex = 54; this.txtTranslationY.TextChanged += new System.EventHandler(this.txtTranslationY_TextChanged); // @@ -345,9 +376,11 @@ this.grBounding.Controls.Add(this.lbZ); this.grBounding.Controls.Add(this.lbY); this.grBounding.Controls.Add(this.lbX); - this.grBounding.Location = new System.Drawing.Point(9, 19); + this.grBounding.Location = new System.Drawing.Point(14, 29); + this.grBounding.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.grBounding.Name = "grBounding"; - this.grBounding.Size = new System.Drawing.Size(249, 91); + this.grBounding.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.grBounding.Size = new System.Drawing.Size(374, 140); this.grBounding.TabIndex = 46; this.grBounding.TabStop = false; this.grBounding.Text = "Bounding box"; @@ -355,93 +388,104 @@ // lbMin // this.lbMin.AutoSize = true; - this.lbMin.Location = new System.Drawing.Point(8, 38); + this.lbMin.Location = new System.Drawing.Point(12, 58); + this.lbMin.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbMin.Name = "lbMin"; - this.lbMin.Size = new System.Drawing.Size(65, 13); + this.lbMin.Size = new System.Drawing.Size(95, 20); this.lbMin.TabIndex = 13; this.lbMin.Text = "Min bounds:"; // // txtMaxZ // - this.txtMaxZ.Location = new System.Drawing.Point(181, 62); + this.txtMaxZ.Location = new System.Drawing.Point(272, 95); + this.txtMaxZ.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtMaxZ.Name = "txtMaxZ"; - this.txtMaxZ.Size = new System.Drawing.Size(38, 20); + this.txtMaxZ.Size = new System.Drawing.Size(55, 26); this.txtMaxZ.TabIndex = 23; this.txtMaxZ.TextChanged += new System.EventHandler(this.txtMaxZ_TextChanged); // // txtMaxY // - this.txtMaxY.Location = new System.Drawing.Point(137, 62); + this.txtMaxY.Location = new System.Drawing.Point(206, 95); + this.txtMaxY.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtMaxY.Name = "txtMaxY"; - this.txtMaxY.Size = new System.Drawing.Size(38, 20); + this.txtMaxY.Size = new System.Drawing.Size(55, 26); this.txtMaxY.TabIndex = 22; this.txtMaxY.TextChanged += new System.EventHandler(this.txtMaxY_TextChanged); // // txtMinX // - this.txtMinX.Location = new System.Drawing.Point(93, 35); + this.txtMinX.Location = new System.Drawing.Point(140, 54); + this.txtMinX.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtMinX.Name = "txtMinX"; - this.txtMinX.Size = new System.Drawing.Size(38, 20); + this.txtMinX.Size = new System.Drawing.Size(55, 26); this.txtMinX.TabIndex = 14; this.txtMinX.TextChanged += new System.EventHandler(this.txtMinX_TextChanged); // // txtMaxX // - this.txtMaxX.Location = new System.Drawing.Point(93, 62); + this.txtMaxX.Location = new System.Drawing.Point(140, 95); + this.txtMaxX.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtMaxX.Name = "txtMaxX"; - this.txtMaxX.Size = new System.Drawing.Size(38, 20); + this.txtMaxX.Size = new System.Drawing.Size(55, 26); this.txtMaxX.TabIndex = 21; this.txtMaxX.TextChanged += new System.EventHandler(this.txtMaxX_TextChanged); // // txtMinY // - this.txtMinY.Location = new System.Drawing.Point(137, 35); + this.txtMinY.Location = new System.Drawing.Point(206, 54); + this.txtMinY.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtMinY.Name = "txtMinY"; - this.txtMinY.Size = new System.Drawing.Size(38, 20); + this.txtMinY.Size = new System.Drawing.Size(55, 26); this.txtMinY.TabIndex = 15; this.txtMinY.TextChanged += new System.EventHandler(this.txtMinY_TextChanged); // // lbMax // this.lbMax.AutoSize = true; - this.lbMax.Location = new System.Drawing.Point(8, 65); + this.lbMax.Location = new System.Drawing.Point(12, 100); + this.lbMax.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbMax.Name = "lbMax"; - this.lbMax.Size = new System.Drawing.Size(68, 13); + this.lbMax.Size = new System.Drawing.Size(99, 20); this.lbMax.TabIndex = 20; this.lbMax.Text = "Max bounds:"; // // txtMinZ // - this.txtMinZ.Location = new System.Drawing.Point(181, 35); + this.txtMinZ.Location = new System.Drawing.Point(272, 54); + this.txtMinZ.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtMinZ.Name = "txtMinZ"; - this.txtMinZ.Size = new System.Drawing.Size(38, 20); + this.txtMinZ.Size = new System.Drawing.Size(55, 26); this.txtMinZ.TabIndex = 16; this.txtMinZ.TextChanged += new System.EventHandler(this.txtMinZ_TextChanged); // // lbZ // this.lbZ.AutoSize = true; - this.lbZ.Location = new System.Drawing.Point(193, 16); + this.lbZ.Location = new System.Drawing.Point(290, 25); + this.lbZ.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbZ.Name = "lbZ"; - this.lbZ.Size = new System.Drawing.Size(14, 13); + this.lbZ.Size = new System.Drawing.Size(19, 20); this.lbZ.TabIndex = 19; this.lbZ.Text = "Z"; // // lbY // this.lbY.AutoSize = true; - this.lbY.Location = new System.Drawing.Point(150, 16); + this.lbY.Location = new System.Drawing.Point(225, 25); + this.lbY.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbY.Name = "lbY"; - this.lbY.Size = new System.Drawing.Size(14, 13); + this.lbY.Size = new System.Drawing.Size(20, 20); this.lbY.TabIndex = 18; this.lbY.Text = "Y"; // // lbX // this.lbX.AutoSize = true; - this.lbX.Location = new System.Drawing.Point(106, 16); + this.lbX.Location = new System.Drawing.Point(159, 25); + this.lbX.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbX.Name = "lbX"; - this.lbX.Size = new System.Drawing.Size(14, 13); + this.lbX.Size = new System.Drawing.Size(20, 20); this.lbX.TabIndex = 17; this.lbX.Text = "X"; // @@ -452,27 +496,31 @@ this.grFiltering.Controls.Add(this.lbFilterNeighbors); this.grFiltering.Controls.Add(this.lbFilterDistance); this.grFiltering.Controls.Add(this.txtFilterDistance); - this.grFiltering.Location = new System.Drawing.Point(9, 116); + this.grFiltering.Location = new System.Drawing.Point(14, 178); + this.grFiltering.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.grFiltering.Name = "grFiltering"; - this.grFiltering.Size = new System.Drawing.Size(249, 88); + this.grFiltering.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.grFiltering.Size = new System.Drawing.Size(374, 135); this.grFiltering.TabIndex = 45; this.grFiltering.TabStop = false; this.grFiltering.Text = "Filtering"; // // txtFilterNeighbors // - this.txtFilterNeighbors.Location = new System.Drawing.Point(93, 39); + this.txtFilterNeighbors.Location = new System.Drawing.Point(140, 60); + this.txtFilterNeighbors.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtFilterNeighbors.Name = "txtFilterNeighbors"; - this.txtFilterNeighbors.Size = new System.Drawing.Size(38, 20); + this.txtFilterNeighbors.Size = new System.Drawing.Size(55, 26); this.txtFilterNeighbors.TabIndex = 20; this.txtFilterNeighbors.TextChanged += new System.EventHandler(this.txtFilterNeighbors_TextChanged); // // chFilter // this.chFilter.AutoSize = true; - this.chFilter.Location = new System.Drawing.Point(93, 16); + this.chFilter.Location = new System.Drawing.Point(140, 25); + this.chFilter.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.chFilter.Name = "chFilter"; - this.chFilter.Size = new System.Drawing.Size(100, 17); + this.chFilter.Size = new System.Drawing.Size(147, 24); this.chFilter.TabIndex = 18; this.chFilter.Text = "filtering enabled"; this.chFilter.UseVisualStyleBackColor = true; @@ -481,31 +529,36 @@ // lbFilterNeighbors // this.lbFilterNeighbors.AutoSize = true; - this.lbFilterNeighbors.Location = new System.Drawing.Point(8, 42); + this.lbFilterNeighbors.Location = new System.Drawing.Point(12, 65); + this.lbFilterNeighbors.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbFilterNeighbors.Name = "lbFilterNeighbors"; - this.lbFilterNeighbors.Size = new System.Drawing.Size(67, 13); + this.lbFilterNeighbors.Size = new System.Drawing.Size(98, 20); this.lbFilterNeighbors.TabIndex = 19; this.lbFilterNeighbors.Text = "N neighbors:"; // // lbFilterDistance // this.lbFilterDistance.AutoSize = true; - this.lbFilterDistance.Location = new System.Drawing.Point(8, 68); + this.lbFilterDistance.Location = new System.Drawing.Point(12, 105); + this.lbFilterDistance.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbFilterDistance.Name = "lbFilterDistance"; - this.lbFilterDistance.Size = new System.Drawing.Size(73, 13); + this.lbFilterDistance.Size = new System.Drawing.Size(106, 20); this.lbFilterDistance.TabIndex = 21; this.lbFilterDistance.Text = "Max distance:"; // // txtFilterDistance // - this.txtFilterDistance.Location = new System.Drawing.Point(93, 65); + this.txtFilterDistance.Location = new System.Drawing.Point(140, 100); + this.txtFilterDistance.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtFilterDistance.Name = "txtFilterDistance"; - this.txtFilterDistance.Size = new System.Drawing.Size(38, 20); + this.txtFilterDistance.Size = new System.Drawing.Size(55, 26); this.txtFilterDistance.TabIndex = 22; this.txtFilterDistance.TextChanged += new System.EventHandler(this.txtFilterDistance_TextChanged); // // grServer // + this.grServer.Controls.Add(this.cbCompressionLevel); + this.grServer.Controls.Add(this.label2); this.grServer.Controls.Add(this.rBinaryPly); this.grServer.Controls.Add(this.lbFormat); this.grServer.Controls.Add(this.rAsciiPly); @@ -515,9 +568,11 @@ this.grServer.Controls.Add(this.txtICPIters); this.grServer.Controls.Add(this.chMerge); this.grServer.Controls.Add(this.lbICPIters); - this.grServer.Location = new System.Drawing.Point(12, 345); + this.grServer.Location = new System.Drawing.Point(18, 478); + this.grServer.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.grServer.Name = "grServer"; - this.grServer.Size = new System.Drawing.Size(632, 111); + this.grServer.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.grServer.Size = new System.Drawing.Size(948, 175); this.grServer.TabIndex = 44; this.grServer.TabStop = false; this.grServer.Text = "KinectServer settings"; @@ -525,9 +580,10 @@ // rBinaryPly // this.rBinaryPly.AutoSize = true; - this.rBinaryPly.Location = new System.Drawing.Point(179, 71); + this.rBinaryPly.Location = new System.Drawing.Point(277, 105); + this.rBinaryPly.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.rBinaryPly.Name = "rBinaryPly"; - this.rBinaryPly.Size = new System.Drawing.Size(76, 17); + this.rBinaryPly.Size = new System.Drawing.Size(110, 24); this.rBinaryPly.TabIndex = 30; this.rBinaryPly.TabStop = true; this.rBinaryPly.Text = "binary PLY"; @@ -537,18 +593,20 @@ // lbFormat // this.lbFormat.AutoSize = true; - this.lbFormat.Location = new System.Drawing.Point(6, 73); + this.lbFormat.Location = new System.Drawing.Point(7, 106); + this.lbFormat.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbFormat.Name = "lbFormat"; - this.lbFormat.Size = new System.Drawing.Size(58, 13); + this.lbFormat.Size = new System.Drawing.Size(88, 20); this.lbFormat.TabIndex = 29; this.lbFormat.Text = "File format:"; // // rAsciiPly // this.rAsciiPly.AutoSize = true; - this.rAsciiPly.Location = new System.Drawing.Point(98, 71); + this.rAsciiPly.Location = new System.Drawing.Point(156, 105); + this.rAsciiPly.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.rAsciiPly.Name = "rAsciiPly"; - this.rAsciiPly.Size = new System.Drawing.Size(75, 17); + this.rAsciiPly.Size = new System.Drawing.Size(111, 24); this.rAsciiPly.TabIndex = 28; this.rAsciiPly.TabStop = true; this.rAsciiPly.Text = "ASCII PLY"; @@ -557,40 +615,63 @@ // // txtRefinIters // - this.txtRefinIters.Location = new System.Drawing.Point(266, 23); + this.txtRefinIters.Location = new System.Drawing.Point(408, 31); + this.txtRefinIters.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.txtRefinIters.Name = "txtRefinIters"; - this.txtRefinIters.Size = new System.Drawing.Size(38, 20); + this.txtRefinIters.Size = new System.Drawing.Size(55, 26); this.txtRefinIters.TabIndex = 27; this.txtRefinIters.TextChanged += new System.EventHandler(this.txtRefinIters_TextChanged); // // lbOuterIters // this.lbOuterIters.AutoSize = true; - this.lbOuterIters.Location = new System.Drawing.Point(142, 26); + this.lbOuterIters.Location = new System.Drawing.Point(222, 36); + this.lbOuterIters.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lbOuterIters.Name = "lbOuterIters"; - this.lbOuterIters.Size = new System.Drawing.Size(118, 13); + this.lbOuterIters.Size = new System.Drawing.Size(178, 20); this.lbOuterIters.TabIndex = 26; this.lbOuterIters.Text = "Num of refinement iters:"; // - // chSkeletons + // label2 // - this.chSkeletons.AutoSize = true; - this.chSkeletons.Location = new System.Drawing.Point(11, 41); - this.chSkeletons.Name = "chSkeletons"; - this.chSkeletons.Size = new System.Drawing.Size(154, 17); - this.chSkeletons.TabIndex = 21; - this.chSkeletons.Text = "show skeletons in live view"; - this.chSkeletons.UseVisualStyleBackColor = true; - this.chSkeletons.CheckedChanged += new System.EventHandler(this.chSkeletons_CheckedChanged); + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(8, 139); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(141, 20); + this.label2.TabIndex = 31; + this.label2.Text = "Compression level:"; + // + // cbCompressionLevel + // + this.cbCompressionLevel.FormattingEnabled = true; + this.cbCompressionLevel.Items.AddRange(new object[] { + "0 (no compression)", + "1", + "2 (recommended)", + "3", + "5", + "7", + "9", + "11", + "13", + "15", + "17", + "19"}); + this.cbCompressionLevel.Location = new System.Drawing.Point(154, 136); + this.cbCompressionLevel.Name = "cbCompressionLevel"; + this.cbCompressionLevel.Size = new System.Drawing.Size(169, 28); + this.cbCompressionLevel.TabIndex = 32; + this.cbCompressionLevel.SelectedIndexChanged += new System.EventHandler(this.cbCompressionLevel_SelectedIndexChanged); // // SettingsForm // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(656, 468); + this.ClientSize = new System.Drawing.Size(984, 663); this.Controls.Add(this.grServer); this.Controls.Add(this.grClient); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.MaximizeBox = false; this.Name = "SettingsForm"; this.Text = "Settings"; @@ -657,11 +738,12 @@ private System.Windows.Forms.Label lbX; private System.Windows.Forms.GroupBox grBody; private System.Windows.Forms.CheckBox chBodyData; - private System.Windows.Forms.Label label1; private System.Windows.Forms.RadioButton rBinaryPly; private System.Windows.Forms.Label lbFormat; private System.Windows.Forms.RadioButton rAsciiPly; private System.Windows.Forms.CheckBox chSkeletons; + private System.Windows.Forms.ComboBox cbCompressionLevel; + private System.Windows.Forms.Label label2; } } \ No newline at end of file diff --git a/LiveScanServer/SettingsForm.cs b/LiveScanServer/SettingsForm.cs index 0ec42c6..20c2c9b 100644 --- a/LiveScanServer/SettingsForm.cs +++ b/LiveScanServer/SettingsForm.cs @@ -54,6 +54,8 @@ namespace KinectServer chBodyData.Checked = oSettings.bStreamOnlyBodies; chSkeletons.Checked = oSettings.bShowSkeletons; + cbCompressionLevel.SelectedText = oSettings.iCompressionLevel.ToString(); + chMerge.Checked = oSettings.bMergeScansForSave; txtICPIters.Text = oSettings.nNumICPIterations.ToString(); txtRefinIters.Text = oSettings.nNumRefineIters.ToString(); @@ -316,5 +318,21 @@ namespace KinectServer { oSettings.bShowSkeletons = chSkeletons.Checked; } + + private void cbCompressionLevel_SelectedIndexChanged(object sender, EventArgs e) + { + int index = cbCompressionLevel.SelectedIndex; + if (index == 0) + oSettings.iCompressionLevel = 0; + else if (index == 2) + oSettings.iCompressionLevel = 2; + else + { + string value = cbCompressionLevel.SelectedItem.ToString(); + bool tryParse = Int32.TryParse(value, out oSettings.iCompressionLevel); + if (!tryParse) + oSettings.iCompressionLevel = 0; + } + } } } diff --git a/LiveScanServer/ZSTDDecompressor.cs b/LiveScanServer/ZSTDDecompressor.cs new file mode 100644 index 0000000..7e3af98 --- /dev/null +++ b/LiveScanServer/ZSTDDecompressor.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Runtime.InteropServices; +using size_t = System.UIntPtr; + +namespace KinectServer +{ + static class ZSTDDecompressor + { + private const string dllName = "libzstd.dll"; + + [DllImport(dllName, CallingConvention = CallingConvention.Cdecl)] + public static extern ulong ZSTD_getDecompressedSize(IntPtr src, size_t srcSize); + + [DllImport(dllName, CallingConvention = CallingConvention.Cdecl)] + public static extern size_t ZSTD_decompress(IntPtr dst, size_t dstSize, + IntPtr src, size_t srcSize); + + public static byte[] Decompress(byte []array) + { + int size = array.Count(); + IntPtr ptr = Marshal.AllocHGlobal(size); + Marshal.Copy(array, 0, ptr, size); + + int outSize = (int)ZSTD_getDecompressedSize(ptr, (size_t)size); + + IntPtr outPtr = Marshal.AllocHGlobal(outSize); + ZSTD_decompress(outPtr, (size_t)outSize, ptr, (size_t)size); + + byte[] outArray = new byte[outSize]; + Marshal.Copy(outPtr, outArray, 0, outSize); + + Marshal.FreeHGlobal(ptr); + Marshal.FreeHGlobal(outPtr); + return outArray; + } + } +} diff --git a/bin/libzstd.dll b/bin/libzstd.dll new file mode 100644 index 0000000000000000000000000000000000000000..94f9dc123677639ef4f53fd10bf5d8ddc9239031 GIT binary patch literal 326656 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

-g&$OiU1v~wDB`MXI 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 sOFQY!%({OhD>8`I;- literal 0 HcmV?d00001 diff --git a/include/LiveScanClient/liveScanClient.h b/include/LiveScanClient/liveScanClient.h index 4f4628d..9c83d7f 100644 --- a/include/LiveScanClient/liveScanClient.h +++ b/include/LiveScanClient/liveScanClient.h @@ -52,6 +52,8 @@ private: bool m_bConfirmCaptured; bool m_bConfirmCalibrated; bool m_bShowDepth; + bool m_bFrameCompression; + int m_iCompressionLevel; SocketClient *m_pClientSocket; std::vector m_vBounds; diff --git a/include/zstd.h b/include/zstd.h new file mode 100644 index 0000000..333feff --- /dev/null +++ b/include/zstd.h @@ -0,0 +1,692 @@ +/* + * Copyright (c) 2016-present, Yann Collet, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#if defined (__cplusplus) +extern "C" { +#endif + +#ifndef ZSTD_H_235446 +#define ZSTD_H_235446 + +/* ====== Dependency ======*/ +#include /* size_t */ + + +/* ===== ZSTDLIB_API : control library symbols visibility ===== */ +#if defined(__GNUC__) && (__GNUC__ >= 4) +# define ZSTDLIB_VISIBILITY __attribute__ ((visibility ("default"))) +#else +# define ZSTDLIB_VISIBILITY +#endif +#if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZSTDLIB_API __declspec(dllexport) ZSTDLIB_VISIBILITY +#elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZSTDLIB_API __declspec(dllimport) ZSTDLIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define ZSTDLIB_API ZSTDLIB_VISIBILITY +#endif + + +/******************************************************************************************************* + Introduction + + zstd, short for Zstandard, is a fast lossless compression algorithm, targeting real-time compression scenarios + at zlib-level and better compression ratios. The zstd compression library provides in-memory compression and + decompression functions. The library supports compression levels from 1 up to ZSTD_maxCLevel() which is 22. + Levels >= 20, labelled `--ultra`, should be used with caution, as they require more memory. + Compression can be done in: + - a single step (described as Simple API) + - a single step, reusing a context (described as Explicit memory management) + - unbounded multiple steps (described as Streaming compression) + The compression ratio achievable on small data can be highly improved using compression with a dictionary in: + - a single step (described as Simple dictionary API) + - a single step, reusing a dictionary (described as Fast dictionary API) + + Advanced experimental functions can be accessed using #define ZSTD_STATIC_LINKING_ONLY before including zstd.h. + These APIs shall never be used with a dynamic library. + They are not "stable", their definition may change in the future. Only static linking is allowed. +*********************************************************************************************************/ + +/*------ Version ------*/ +#define ZSTD_VERSION_MAJOR 1 +#define ZSTD_VERSION_MINOR 1 +#define ZSTD_VERSION_RELEASE 3 + +#define ZSTD_LIB_VERSION ZSTD_VERSION_MAJOR.ZSTD_VERSION_MINOR.ZSTD_VERSION_RELEASE +#define ZSTD_QUOTE(str) #str +#define ZSTD_EXPAND_AND_QUOTE(str) ZSTD_QUOTE(str) +#define ZSTD_VERSION_STRING ZSTD_EXPAND_AND_QUOTE(ZSTD_LIB_VERSION) + +#define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE) +ZSTDLIB_API unsigned ZSTD_versionNumber(void); /**< library version number; to be used when checking dll version */ + + +/*************************************** +* Simple API +***************************************/ +/*! ZSTD_compress() : + Compresses `src` content as a single zstd compressed frame into already allocated `dst`. + Hint : compression runs faster if `dstCapacity` >= `ZSTD_compressBound(srcSize)`. + @return : compressed size written into `dst` (<= `dstCapacity), + or an error code if it fails (which can be tested using ZSTD_isError()). */ +ZSTDLIB_API size_t ZSTD_compress( void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + int compressionLevel); + +/*! ZSTD_decompress() : + `compressedSize` : must be the _exact_ size of a single compressed frame. + `dstCapacity` is an upper bound of originalSize. + If user cannot imply a maximum upper bound, it's better to use streaming mode to decompress data. + @return : the number of bytes decompressed into `dst` (<= `dstCapacity`), + or an errorCode if it fails (which can be tested using ZSTD_isError()). */ +ZSTDLIB_API size_t ZSTD_decompress( void* dst, size_t dstCapacity, + const void* src, size_t compressedSize); + +/*! ZSTD_getDecompressedSize() : +* 'src' is the start of a zstd compressed frame. +* @return : content size to be decompressed, as a 64-bits value _if known_, 0 otherwise. +* note 1 : decompressed size is an optional field, that may not be present, especially in streaming mode. +* When `return==0`, data to decompress could be any size. +* In which case, it's necessary to use streaming mode to decompress data. +* Optionally, application can still use ZSTD_decompress() while relying on implied limits. +* (For example, data may be necessarily cut into blocks <= 16 KB). +* note 2 : decompressed size is always present when compression is done with ZSTD_compress() +* note 3 : decompressed size can be very large (64-bits value), +* potentially larger than what local system can handle as a single memory segment. +* In which case, it's necessary to use streaming mode to decompress data. +* note 4 : If source is untrusted, decompressed size could be wrong or intentionally modified. +* Always ensure result fits within application's authorized limits. +* Each application can set its own limits. +* note 5 : when `return==0`, if precise failure cause is needed, use ZSTD_getFrameParams() to know more. */ +ZSTDLIB_API unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize); + + +/*====== Helper functions ======*/ +ZSTDLIB_API int ZSTD_maxCLevel(void); /*!< maximum compression level available */ +ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case scenario */ +ZSTDLIB_API unsigned ZSTD_isError(size_t code); /*!< tells if a `size_t` function result is an error code */ +ZSTDLIB_API const char* ZSTD_getErrorName(size_t code); /*!< provides readable string from an error code */ + + +/*************************************** +* Explicit memory management +***************************************/ +/*= Compression context +* When compressing many times, +* it is recommended to allocate a context just once, and re-use it for each successive compression operation. +* This will make workload friendlier for system's memory. +* Use one context per thread for parallel execution in multi-threaded environments. */ +typedef struct ZSTD_CCtx_s ZSTD_CCtx; +ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx(void); +ZSTDLIB_API size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx); + +/*! ZSTD_compressCCtx() : + Same as ZSTD_compress(), requires an allocated ZSTD_CCtx (see ZSTD_createCCtx()). */ +ZSTDLIB_API size_t ZSTD_compressCCtx(ZSTD_CCtx* ctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize, int compressionLevel); + +/*= Decompression context */ +typedef struct ZSTD_DCtx_s ZSTD_DCtx; +ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx(void); +ZSTDLIB_API size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); + +/*! ZSTD_decompressDCtx() : +* Same as ZSTD_decompress(), requires an allocated ZSTD_DCtx (see ZSTD_createDCtx()). */ +ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* ctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + + +/************************** +* Simple dictionary API +***************************/ +/*! ZSTD_compress_usingDict() : +* Compression using a predefined Dictionary (see dictBuilder/zdict.h). +* Note : This function loads the dictionary, resulting in significant startup delay. +* Note : When `dict == NULL || dictSize < 8` no dictionary is used. */ +ZSTDLIB_API size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize, + int compressionLevel); + +/*! ZSTD_decompress_usingDict() : +* Decompression using a predefined Dictionary (see dictBuilder/zdict.h). +* Dictionary must be identical to the one used during compression. +* Note : This function loads the dictionary, resulting in significant startup delay. +* Note : When `dict == NULL || dictSize < 8` no dictionary is used. */ +ZSTDLIB_API size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize); + + +/**************************** +* Fast dictionary API +****************************/ +typedef struct ZSTD_CDict_s ZSTD_CDict; + +/*! ZSTD_createCDict() : +* When compressing multiple messages / blocks with the same dictionary, it's recommended to load it just once. +* ZSTD_createCDict() will create a digested dictionary, ready to start future compression operations without startup delay. +* ZSTD_CDict can be created once and used by multiple threads concurrently, as its usage is read-only. +* `dictBuffer` can be released after ZSTD_CDict creation, as its content is copied within CDict */ +ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict(const void* dictBuffer, size_t dictSize, int compressionLevel); + +/*! ZSTD_freeCDict() : +* Function frees memory allocated by ZSTD_createCDict(). */ +ZSTDLIB_API size_t ZSTD_freeCDict(ZSTD_CDict* CDict); + +/*! ZSTD_compress_usingCDict() : +* Compression using a digested Dictionary. +* Faster startup than ZSTD_compress_usingDict(), recommended when same dictionary is used multiple times. +* Note that compression level is decided during dictionary creation. */ +ZSTDLIB_API size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_CDict* cdict); + + +typedef struct ZSTD_DDict_s ZSTD_DDict; + +/*! ZSTD_createDDict() : +* Create a digested dictionary, ready to start decompression operation without startup delay. +* dictBuffer can be released after DDict creation, as its content is copied inside DDict */ +ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict(const void* dictBuffer, size_t dictSize); + +/*! ZSTD_freeDDict() : +* Function frees memory allocated with ZSTD_createDDict() */ +ZSTDLIB_API size_t ZSTD_freeDDict(ZSTD_DDict* ddict); + +/*! ZSTD_decompress_usingDDict() : +* Decompression using a digested Dictionary. +* Faster startup than ZSTD_decompress_usingDict(), recommended when same dictionary is used multiple times. */ +ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_DDict* ddict); + + +/**************************** +* Streaming +****************************/ + +typedef struct ZSTD_inBuffer_s { + const void* src; /**< start of input buffer */ + size_t size; /**< size of input buffer */ + size_t pos; /**< position where reading stopped. Will be updated. Necessarily 0 <= pos <= size */ +} ZSTD_inBuffer; + +typedef struct ZSTD_outBuffer_s { + void* dst; /**< start of output buffer */ + size_t size; /**< size of output buffer */ + size_t pos; /**< position where writing stopped. Will be updated. Necessarily 0 <= pos <= size */ +} ZSTD_outBuffer; + + + +/*-*********************************************************************** +* Streaming compression - HowTo +* +* A ZSTD_CStream object is required to track streaming operation. +* Use ZSTD_createCStream() and ZSTD_freeCStream() to create/release resources. +* ZSTD_CStream objects can be reused multiple times on consecutive compression operations. +* It is recommended to re-use ZSTD_CStream in situations where many streaming operations will be achieved consecutively, +* since it will play nicer with system's memory, by re-using already allocated memory. +* Use one separate ZSTD_CStream per thread for parallel execution. +* +* Start a new compression by initializing ZSTD_CStream. +* Use ZSTD_initCStream() to start a new compression operation. +* Use ZSTD_initCStream_usingDict() or ZSTD_initCStream_usingCDict() for a compression which requires a dictionary (experimental section) +* +* Use ZSTD_compressStream() repetitively to consume input stream. +* The function will automatically update both `pos` fields. +* Note that it may not consume the entire input, in which case `pos < size`, +* and it's up to the caller to present again remaining data. +* @return : a size hint, preferred nb of bytes to use as input for next function call +* or an error code, which can be tested using ZSTD_isError(). +* Note 1 : it's just a hint, to help latency a little, any other value will work fine. +* Note 2 : size hint is guaranteed to be <= ZSTD_CStreamInSize() +* +* At any moment, it's possible to flush whatever data remains within internal buffer, using ZSTD_flushStream(). +* `output->pos` will be updated. +* Note that some content might still be left within internal buffer if `output->size` is too small. +* @return : nb of bytes still present within internal buffer (0 if it's empty) +* or an error code, which can be tested using ZSTD_isError(). +* +* ZSTD_endStream() instructs to finish a frame. +* It will perform a flush and write frame epilogue. +* The epilogue is required for decoders to consider a frame completed. +* Similar to ZSTD_flushStream(), it may not be able to flush the full content if `output->size` is too small. +* In which case, call again ZSTD_endStream() to complete the flush. +* @return : nb of bytes still present within internal buffer (0 if it's empty, hence compression completed) +* or an error code, which can be tested using ZSTD_isError(). +* +* *******************************************************************/ + +typedef struct ZSTD_CStream_s ZSTD_CStream; +ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream(void); +ZSTDLIB_API size_t ZSTD_freeCStream(ZSTD_CStream* zcs); + +ZSTDLIB_API size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel); +ZSTDLIB_API size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input); +ZSTDLIB_API size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); +ZSTDLIB_API size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); + +ZSTDLIB_API size_t ZSTD_CStreamInSize(void); /**< recommended size for input buffer */ +ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block in all circumstances. */ + + + +/*-*************************************************************************** +* Streaming decompression - HowTo +* +* A ZSTD_DStream object is required to track streaming operations. +* Use ZSTD_createDStream() and ZSTD_freeDStream() to create/release resources. +* ZSTD_DStream objects can be re-used multiple times. +* +* Use ZSTD_initDStream() to start a new decompression operation, +* or ZSTD_initDStream_usingDict() if decompression requires a dictionary. +* @return : recommended first input size +* +* Use ZSTD_decompressStream() repetitively to consume your input. +* The function will update both `pos` fields. +* If `input.pos < input.size`, some input has not been consumed. +* It's up to the caller to present again remaining data. +* If `output.pos < output.size`, decoder has flushed everything it could. +* @return : 0 when a frame is completely decoded and fully flushed, +* an error code, which can be tested using ZSTD_isError(), +* any other value > 0, which means there is still some decoding to do to complete current frame. +* The return value is a suggested next input size (a hint to improve latency) that will never load more than the current frame. +* *******************************************************************************/ + +typedef struct ZSTD_DStream_s ZSTD_DStream; +ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream(void); +ZSTDLIB_API size_t ZSTD_freeDStream(ZSTD_DStream* zds); + +ZSTDLIB_API size_t ZSTD_initDStream(ZSTD_DStream* zds); +ZSTDLIB_API size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input); + +ZSTDLIB_API size_t ZSTD_DStreamInSize(void); /*!< recommended size for input buffer */ +ZSTDLIB_API size_t ZSTD_DStreamOutSize(void); /*!< recommended size for output buffer. Guarantee to successfully flush at least one complete block in all circumstances. */ + +#endif /* ZSTD_H_235446 */ + + +#if defined(ZSTD_STATIC_LINKING_ONLY) && !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY) +#define ZSTD_H_ZSTD_STATIC_LINKING_ONLY + +/**************************************************************************************** + * START OF ADVANCED AND EXPERIMENTAL FUNCTIONS + * The definitions in this section are considered experimental. + * They should never be used with a dynamic library, as they may change in the future. + * They are provided for advanced usages. + * Use them only in association with static linking. + * ***************************************************************************************/ + +/* --- Constants ---*/ +#define ZSTD_MAGICNUMBER 0xFD2FB528 /* >= v0.8.0 */ +#define ZSTD_MAGIC_SKIPPABLE_START 0x184D2A50U + +#define ZSTD_WINDOWLOG_MAX_32 25 +#define ZSTD_WINDOWLOG_MAX_64 27 +#define ZSTD_WINDOWLOG_MAX ((U32)(MEM_32bits() ? ZSTD_WINDOWLOG_MAX_32 : ZSTD_WINDOWLOG_MAX_64)) +#define ZSTD_WINDOWLOG_MIN 10 +#define ZSTD_HASHLOG_MAX ZSTD_WINDOWLOG_MAX +#define ZSTD_HASHLOG_MIN 6 +#define ZSTD_CHAINLOG_MAX (ZSTD_WINDOWLOG_MAX+1) +#define ZSTD_CHAINLOG_MIN ZSTD_HASHLOG_MIN +#define ZSTD_HASHLOG3_MAX 17 +#define ZSTD_SEARCHLOG_MAX (ZSTD_WINDOWLOG_MAX-1) +#define ZSTD_SEARCHLOG_MIN 1 +#define ZSTD_SEARCHLENGTH_MAX 7 /* only for ZSTD_fast, other strategies are limited to 6 */ +#define ZSTD_SEARCHLENGTH_MIN 3 /* only for ZSTD_btopt, other strategies are limited to 4 */ +#define ZSTD_TARGETLENGTH_MIN 4 +#define ZSTD_TARGETLENGTH_MAX 999 + +#define ZSTD_FRAMEHEADERSIZE_MAX 18 /* for static allocation */ +#define ZSTD_FRAMEHEADERSIZE_MIN 6 +static const size_t ZSTD_frameHeaderSize_prefix = 5; +static const size_t ZSTD_frameHeaderSize_min = ZSTD_FRAMEHEADERSIZE_MIN; +static const size_t ZSTD_frameHeaderSize_max = ZSTD_FRAMEHEADERSIZE_MAX; +static const size_t ZSTD_skippableHeaderSize = 8; /* magic number + skippable frame length */ + + +/*--- Advanced types ---*/ +typedef enum { ZSTD_fast, ZSTD_dfast, ZSTD_greedy, ZSTD_lazy, ZSTD_lazy2, ZSTD_btlazy2, ZSTD_btopt, ZSTD_btopt2 } ZSTD_strategy; /* from faster to stronger */ + +typedef struct { + unsigned windowLog; /**< largest match distance : larger == more compression, more memory needed during decompression */ + unsigned chainLog; /**< fully searched segment : larger == more compression, slower, more memory (useless for fast) */ + unsigned hashLog; /**< dispatch table : larger == faster, more memory */ + unsigned searchLog; /**< nb of searches : larger == more compression, slower */ + unsigned searchLength; /**< match length searched : larger == faster decompression, sometimes less compression */ + unsigned targetLength; /**< acceptable match size for optimal parser (only) : larger == more compression, slower */ + ZSTD_strategy strategy; +} ZSTD_compressionParameters; + +typedef struct { + unsigned contentSizeFlag; /**< 1: content size will be in frame header (if known). */ + unsigned checksumFlag; /**< 1: will generate a 22-bits checksum at end of frame, to be used for error detection by decompressor */ + unsigned noDictIDFlag; /**< 1: no dict ID will be saved into frame header (if dictionary compression) */ +} ZSTD_frameParameters; + +typedef struct { + ZSTD_compressionParameters cParams; + ZSTD_frameParameters fParams; +} ZSTD_parameters; + +/*= Custom memory allocation functions */ +typedef void* (*ZSTD_allocFunction) (void* opaque, size_t size); +typedef void (*ZSTD_freeFunction) (void* opaque, void* address); +typedef struct { ZSTD_allocFunction customAlloc; ZSTD_freeFunction customFree; void* opaque; } ZSTD_customMem; + + +/*************************************** +* Advanced compression functions +***************************************/ +/*! ZSTD_estimateCCtxSize() : + * Gives the amount of memory allocated for a ZSTD_CCtx given a set of compression parameters. + * `frameContentSize` is an optional parameter, provide `0` if unknown */ +ZSTDLIB_API size_t ZSTD_estimateCCtxSize(ZSTD_compressionParameters cParams); + +/*! ZSTD_createCCtx_advanced() : + * Create a ZSTD compression context using external alloc and free functions */ +ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem); + +/*! ZSTD_sizeofCCtx() : + * Gives the amount of memory used by a given ZSTD_CCtx */ +ZSTDLIB_API size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx); + +/*! ZSTD_createCDict_byReference() : + * Create a digested dictionary for compression + * Dictionary content is simply referenced, and therefore stays in dictBuffer. + * It is important that dictBuffer outlives CDict, it must remain read accessible throughout the lifetime of CDict */ +ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel); + +/*! ZSTD_createCDict_advanced() : + * Create a ZSTD_CDict using external alloc and free, and customized compression parameters */ +ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize, unsigned byReference, + ZSTD_parameters params, ZSTD_customMem customMem); + +/*! ZSTD_sizeof_CDict() : + * Gives the amount of memory used by a given ZSTD_sizeof_CDict */ +ZSTDLIB_API size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict); + +/*! ZSTD_getCParams() : +* @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize. +* `estimatedSrcSize` value is optional, select 0 if not known */ +ZSTDLIB_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); + +/*! ZSTD_getParams() : +* same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`. +* All fields of `ZSTD_frameParameters` are set to default (0) */ +ZSTDLIB_API ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); + +/*! ZSTD_checkCParams() : +* Ensure param values remain within authorized range */ +ZSTDLIB_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params); + +/*! ZSTD_adjustCParams() : +* optimize params for a given `srcSize` and `dictSize`. +* both values are optional, select `0` if unknown. */ +ZSTDLIB_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize); + +/*! ZSTD_compress_advanced() : +* Same as ZSTD_compress_usingDict(), with fine-tune control of each compression parameter */ +ZSTDLIB_API size_t ZSTD_compress_advanced (ZSTD_CCtx* ctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize, + ZSTD_parameters params); + + +/*--- Advanced decompression functions ---*/ + +/*! ZSTD_isFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier. + * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. + * Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled. + * Note 3 : Skippable Frame Identifiers are considered valid. */ +ZSTDLIB_API unsigned ZSTD_isFrame(const void* buffer, size_t size); + +/*! ZSTD_estimateDCtxSize() : + * Gives the potential amount of memory allocated to create a ZSTD_DCtx */ +ZSTDLIB_API size_t ZSTD_estimateDCtxSize(void); + +/*! ZSTD_createDCtx_advanced() : + * Create a ZSTD decompression context using external alloc and free functions */ +ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem); + +/*! ZSTD_sizeof_DCtx() : + * Gives the amount of memory used by a given ZSTD_DCtx */ +ZSTDLIB_API size_t ZSTD_sizeof_DCtx(const ZSTD_DCtx* dctx); + +/*! ZSTD_createDDict_byReference() : + * Create a digested dictionary, ready to start decompression operation without startup delay. + * Dictionary content is simply referenced, and therefore stays in dictBuffer. + * It is important that dictBuffer outlives DDict, it must remain read accessible throughout the lifetime of DDict */ +ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize); + +ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_advanced(const void* dict, size_t dictSize, + unsigned byReference, ZSTD_customMem customMem); + +/*! ZSTD_sizeof_DDict() : + * Gives the amount of memory used by a given ZSTD_DDict */ +ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); + +/*! ZSTD_getDictID_fromDict() : + * Provides the dictID stored within dictionary. + * if @return == 0, the dictionary is not conformant with Zstandard specification. + * It can still be loaded, but as a content-only dictionary. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize); + +/*! ZSTD_getDictID_fromDDict() : + * Provides the dictID of the dictionary loaded into `ddict`. + * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. + * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict); + +/*! ZSTD_getDictID_fromFrame() : + * Provides the dictID required to decompressed the frame stored within `src`. + * If @return == 0, the dictID could not be decoded. + * This could for one of the following reasons : + * - The frame does not require a dictionary to be decoded (most common case). + * - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden information. + * Note : this use case also happens when using a non-conformant dictionary. + * - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`). + * - This is not a Zstandard frame. + * When identifying the exact failure cause, it's possible to used ZSTD_getFrameParams(), which will provide a more precise error code. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize); + + +/******************************************************************** +* Advanced streaming functions +********************************************************************/ + +/*===== Advanced Streaming compression functions =====*/ +ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem); +ZSTDLIB_API size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, int compressionLevel, unsigned long long pledgedSrcSize); /**< pledgedSrcSize must be correct */ +ZSTDLIB_API size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, const void* dict, size_t dictSize, int compressionLevel); +ZSTDLIB_API size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs, const void* dict, size_t dictSize, + ZSTD_parameters params, unsigned long long pledgedSrcSize); /**< pledgedSrcSize is optional and can be zero == unknown */ +ZSTDLIB_API size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict); /**< note : cdict will just be referenced, and must outlive compression session */ +ZSTDLIB_API size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize); /**< re-use compression parameters from previous init; skip dictionary loading stage; zcs must be init at least once before */ +ZSTDLIB_API size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs); + + +/*===== Advanced Streaming decompression functions =====*/ +typedef enum { ZSTDdsp_maxWindowSize } ZSTD_DStreamParameter_e; +ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem); +ZSTDLIB_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); +ZSTDLIB_API size_t ZSTD_setDStreamParameter(ZSTD_DStream* zds, ZSTD_DStreamParameter_e paramType, unsigned paramValue); +ZSTDLIB_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict); /**< note : ddict will just be referenced, and must outlive decompression session */ +ZSTDLIB_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); /**< re-use decompression parameters from previous init; saves dictionary loading */ +ZSTDLIB_API size_t ZSTD_sizeof_DStream(const ZSTD_DStream* zds); + + +/********************************************************************* +* Buffer-less and synchronous inner streaming functions +* +* This is an advanced API, giving full control over buffer management, for users which need direct control over memory. +* But it's also a complex one, with many restrictions (documented below). +* Prefer using normal streaming API for an easier experience +********************************************************************* */ + +/** + Buffer-less streaming compression (synchronous mode) + + A ZSTD_CCtx object is required to track streaming operations. + Use ZSTD_createCCtx() / ZSTD_freeCCtx() to manage resource. + ZSTD_CCtx object can be re-used multiple times within successive compression operations. + + Start by initializing a context. + Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression, + or ZSTD_compressBegin_advanced(), for finer parameter control. + It's also possible to duplicate a reference context which has already been initialized, using ZSTD_copyCCtx() + + Then, consume your input using ZSTD_compressContinue(). + There are some important considerations to keep in mind when using this advanced function : + - ZSTD_compressContinue() has no internal buffer. It uses externally provided buffer only. + - Interface is synchronous : input is consumed entirely and produce 1+ (or more) compressed blocks. + - Caller must ensure there is enough space in `dst` to store compressed data under worst case scenario. + Worst case evaluation is provided by ZSTD_compressBound(). + ZSTD_compressContinue() doesn't guarantee recover after a failed compression. + - ZSTD_compressContinue() presumes prior input ***is still accessible and unmodified*** (up to maximum distance size, see WindowLog). + It remembers all previous contiguous blocks, plus one separated memory segment (which can itself consists of multiple contiguous blocks) + - ZSTD_compressContinue() detects that prior input has been overwritten when `src` buffer overlaps. + In which case, it will "discard" the relevant memory section from its history. + + Finish a frame with ZSTD_compressEnd(), which will write the last block(s) and optional checksum. + It's possible to use a NULL,0 src content, in which case, it will write a final empty block to end the frame, + Without last block mark, frames will be considered unfinished (broken) by decoders. + + You can then reuse `ZSTD_CCtx` (ZSTD_compressBegin()) to compress some new frame. +*/ + +/*===== Buffer-less streaming compression functions =====*/ +ZSTDLIB_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel); +ZSTDLIB_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel); +ZSTDLIB_API size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize); +ZSTDLIB_API size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); +ZSTDLIB_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTDLIB_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + + + +/*- + Buffer-less streaming decompression (synchronous mode) + + A ZSTD_DCtx object is required to track streaming operations. + Use ZSTD_createDCtx() / ZSTD_freeDCtx() to manage it. + A ZSTD_DCtx object can be re-used multiple times. + + First typical operation is to retrieve frame parameters, using ZSTD_getFrameParams(). + It fills a ZSTD_frameParams structure which provide important information to correctly decode the frame, + such as the minimum rolling buffer size to allocate to decompress data (`windowSize`), + and the dictionary ID used. + (Note : content size is optional, it may not be present. 0 means : content size unknown). + Note that these values could be wrong, either because of data malformation, or because an attacker is spoofing deliberate false information. + As a consequence, check that values remain within valid application range, especially `windowSize`, before allocation. + Each application can set its own limit, depending on local restrictions. For extended interoperability, it is recommended to support at least 8 MB. + Frame parameters are extracted from the beginning of the compressed frame. + Data fragment must be large enough to ensure successful decoding, typically `ZSTD_frameHeaderSize_max` bytes. + @result : 0 : successful decoding, the `ZSTD_frameParams` structure is correctly filled. + >0 : `srcSize` is too small, please provide at least @result bytes on next attempt. + errorCode, which can be tested using ZSTD_isError(). + + Start decompression, with ZSTD_decompressBegin() or ZSTD_decompressBegin_usingDict(). + Alternatively, you can copy a prepared context, using ZSTD_copyDCtx(). + + Then use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue() alternatively. + ZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize' to ZSTD_decompressContinue(). + ZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will fail. + + @result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity). + It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some metadata item. + It can also be an error code, which can be tested with ZSTD_isError(). + + ZSTD_decompressContinue() needs previous data blocks during decompression, up to `windowSize`. + They should preferably be located contiguously, prior to current block. + Alternatively, a round buffer of sufficient size is also possible. Sufficient size is determined by frame parameters. + ZSTD_decompressContinue() is very sensitive to contiguity, + if 2 blocks don't follow each other, make sure that either the compressor breaks contiguity at the same place, + or that previous contiguous segment is large enough to properly handle maximum back-reference. + + A frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero. + Context can then be reset to start a new decompression. + + Note : it's possible to know if next input to present is a header or a block, using ZSTD_nextInputType(). + This information is not required to properly decode a frame. + + == Special case : skippable frames == + + Skippable frames allow integration of user-defined data into a flow of concatenated frames. + Skippable frames will be ignored (skipped) by a decompressor. The format of skippable frames is as follows : + a) Skippable frame ID - 4 Bytes, Little endian format, any value from 0x184D2A50 to 0x184D2A5F + b) Frame Size - 4 Bytes, Little endian format, unsigned 32-bits + c) Frame Content - any content (User Data) of length equal to Frame Size + For skippable frames ZSTD_decompressContinue() always returns 0. + For skippable frames ZSTD_getFrameParams() returns fparamsPtr->windowLog==0 what means that a frame is skippable. + It also returns Frame Size as fparamsPtr->frameContentSize. +*/ + +typedef struct { + unsigned long long frameContentSize; + unsigned windowSize; + unsigned dictID; + unsigned checksumFlag; +} ZSTD_frameParams; + +/*===== Buffer-less streaming decompression functions =====*/ +ZSTDLIB_API size_t ZSTD_getFrameParams(ZSTD_frameParams* fparamsPtr, const void* src, size_t srcSize); /**< doesn't consume input, see details below */ +ZSTDLIB_API size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx); +ZSTDLIB_API size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); +ZSTDLIB_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); +ZSTDLIB_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx); +ZSTDLIB_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e; +ZSTDLIB_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); + +/** + Block functions + + Block functions produce and decode raw zstd blocks, without frame metadata. + Frame metadata cost is typically ~18 bytes, which can be non-negligible for very small blocks (< 100 bytes). + User will have to take in charge required information to regenerate data, such as compressed and content sizes. + + A few rules to respect : + - Compressing and decompressing require a context structure + + Use ZSTD_createCCtx() and ZSTD_createDCtx() + - It is necessary to init context before starting + + compression : ZSTD_compressBegin() + + decompression : ZSTD_decompressBegin() + + variants _usingDict() are also allowed + + copyCCtx() and copyDCtx() work too + - Block size is limited, it must be <= ZSTD_getBlockSizeMax() + + If you need to compress more, cut data into multiple blocks + + Consider using the regular ZSTD_compress() instead, as frame metadata costs become negligible when source size is large. + - When a block is considered not compressible enough, ZSTD_compressBlock() result will be zero. + In which case, nothing is produced into `dst`. + + User must test for such outcome and deal directly with uncompressed data + + ZSTD_decompressBlock() doesn't accept uncompressed data as input !!! + + In case of multiple successive blocks, decoder must be informed of uncompressed block existence to follow proper history. + Use ZSTD_insertBlock() in such a case. +*/ + +#define ZSTD_BLOCKSIZE_ABSOLUTEMAX (128 * 1024) /* define, for static allocation */ +/*===== Raw zstd block functions =====*/ +ZSTDLIB_API size_t ZSTD_getBlockSizeMax(ZSTD_CCtx* cctx); +ZSTDLIB_API size_t ZSTD_compressBlock (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTDLIB_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTDLIB_API size_t ZSTD_insertBlock(ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize); /**< insert block into `dctx` history. Useful for uncompressed blocks */ + + +#endif /* ZSTD_H_ZSTD_STATIC_LINKING_ONLY */ + +#if defined (__cplusplus) +} +#endif diff --git a/lib/libzstd.lib b/lib/libzstd.lib new file mode 100644 index 0000000000000000000000000000000000000000..630ef992bd40567ef35c446c3d4d190ad3044d0f GIT binary patch literal 29012 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 literal 0 HcmV?d00001 diff --git a/src/LiveScanClient/liveScanClient.cpp b/src/LiveScanClient/liveScanClient.cpp index 96e2b8a..825aa93 100644 --- a/src/LiveScanClient/liveScanClient.cpp +++ b/src/LiveScanClient/liveScanClient.cpp @@ -19,6 +19,7 @@ #include #include #include +#include "zstd.h" std::mutex m_mSocketThreadMutex; @@ -57,6 +58,8 @@ LiveScanClient::LiveScanClient() : m_bConfirmCalibrated(false), m_bShowDepth(false), m_bSocketThread(true), + m_bFrameCompression(true), + m_iCompressionLevel(2), m_pClientSocket(NULL), m_nFilterNeighbors(10), m_fFilterThreshold(0.01f) @@ -130,7 +133,7 @@ int LiveScanClient::Run(HINSTANCE hInstance, int nCmdShow) MSG msg = {0}; WNDCLASS wc; - // Dialog custom window class + // Dialog custom window class ZeroMemory(&wc, sizeof(wc)); wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbWndExtra = DLGWINDOWEXTRA; @@ -499,10 +502,13 @@ void LiveScanClient::HandleSocket() } m_bStreamOnlyBodies = (received[i] != 0); - i++; + i += 1; - //so that we do not lose the next character in the stream - i--; + m_iCompressionLevel = *(int*)(received.c_str() + i); + if (m_iCompressionLevel > 0) + m_bFrameCompression = true; + else + m_bFrameCompression = false; } //send stored frame else if (received[i] == MSG_REQUEST_STORED_FRAME) @@ -634,7 +640,7 @@ void LiveScanClient::SendFrame(vector vertices, vector RGB, vector ptr2 += sizeof(short) * 3; pos += sizeof(short) * 3; } - + int nBodies = body.size(); size += sizeof(nBodies); for (int i = 0; i < nBodies; i++) @@ -682,9 +688,25 @@ void LiveScanClient::SendFrame(vector vertices, vector RGB, vector } } - m_pClientSocket->SendBytes((char*)&size, sizeof(int)); - m_pClientSocket->SendBytes(buffer.data(), size); + int iCompression = static_cast(m_bFrameCompression); + if (m_bFrameCompression) + { + char buf[8]; + // *2, because according to zstd documentation, increasing the size of the output buffer above a + // bound should speed up the compression. + int cBuffSize = ZSTD_compressBound(size) * 2; + vector compressedBuffer(cBuffSize); + int cSize = ZSTD_compress(compressedBuffer.data(), cBuffSize, buffer.data(), size, m_iCompressionLevel); + size = cSize; + buffer = compressedBuffer; + } + char header[8]; + memcpy(header, (char*)&size, sizeof(size)); + memcpy(header + 4, (char*)&iCompression, sizeof(iCompression)); + + m_pClientSocket->SendBytes((char*)&header, sizeof(int) * 2); + m_pClientSocket->SendBytes(buffer.data(), size); } void LiveScanClient::StoreFrame(Point3f *vertices, Point2f *mapping, RGB *color, vector &bodies, BYTE* bodyIndex)