From c4931a8ec37678fb5ecedcc749ffe3c9f4c890fe Mon Sep 17 00:00:00 2001
From: yedajiang44 <602830483@qq.com>
Date: Sat, 31 Dec 2022 17:48:16 +0800
Subject: [PATCH] =?UTF-8?q?=E7=BB=84=E5=8C=85=E6=97=B6=E9=9C=80=E8=A6=81?=
=?UTF-8?q?=E6=8C=87=E5=AE=9A=E5=8C=85=E7=B1=BB=E5=9E=8B=EF=BC=8C=E5=8C=BA?=
=?UTF-8?q?=E5=88=86=E5=AE=9E=E6=97=B6=E3=80=81=E5=8E=86=E5=8F=B2=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Extensions/JT1078PackageExtensionsTest.cs | 5 ++-
.../H264/H264DecoderTest.cs | 5 ++-
.../JT1078SerializerTest.cs | 2 +-
src/JT1078.Protocol/Enums/JT808ChannelType.cs | 17 ++++++++
src/JT1078.Protocol/JT1078Serializer.cs | 39 +++++++++++++------
5 files changed, 51 insertions(+), 17 deletions(-)
create mode 100644 src/JT1078.Protocol/Enums/JT808ChannelType.cs
diff --git a/src/JT1078.Protocol.Test/Extensions/JT1078PackageExtensionsTest.cs b/src/JT1078.Protocol.Test/Extensions/JT1078PackageExtensionsTest.cs
index 0033236..0290a71 100644
--- a/src/JT1078.Protocol.Test/Extensions/JT1078PackageExtensionsTest.cs
+++ b/src/JT1078.Protocol.Test/Extensions/JT1078PackageExtensionsTest.cs
@@ -1,4 +1,5 @@
-using JT1078.Protocol.Extensions;
+using JT1078.Protocol.Enums;
+using JT1078.Protocol.Extensions;
using System;
using System.Collections.Generic;
using System.IO;
@@ -23,7 +24,7 @@ namespace JT1078.Protocol.Test.Extensions
var bytes = data[6].ToHexBytes();
JT1078Package package = JT1078Serializer.Deserialize(bytes);
mergeBodyLength += package.DataBodyLength;
- merge = JT1078Serializer.Merge(package);
+ merge = JT1078Serializer.Merge(package,JT808ChannelType.Live);
}
var packages = merge.Bodies.ConvertVideo(merge.SIM, merge.LogicChannelNumber, merge.Label2.PT, merge.Label3.DataType,
merge.Timestamp, merge.LastFrameInterval, merge.LastFrameInterval);
diff --git a/src/JT1078.Protocol.Test/H264/H264DecoderTest.cs b/src/JT1078.Protocol.Test/H264/H264DecoderTest.cs
index 00aa8ee..d4da921 100644
--- a/src/JT1078.Protocol.Test/H264/H264DecoderTest.cs
+++ b/src/JT1078.Protocol.Test/H264/H264DecoderTest.cs
@@ -9,6 +9,7 @@ using Newtonsoft.Json;
using JT1078.Protocol.H264;
using JT808.Protocol.Extensions;
using JT1078.Protocol.MessagePack;
+using JT1078.Protocol.Enums;
namespace JT1078.Protocol.Test.H264
{
@@ -41,7 +42,7 @@ namespace JT1078.Protocol.Test.H264
var bytes = data[6].ToHexBytes();
JT1078Package package = JT1078Serializer.Deserialize(bytes);
mergeBodyLength += package.DataBodyLength;
- Package = JT1078Serializer.Merge(package);
+ Package = JT1078Serializer.Merge(package,JT808ChannelType.Live);
}
H264Decoder decoder = new H264Decoder();
var nalus = decoder.ParseNALU(Package);
@@ -128,7 +129,7 @@ namespace JT1078.Protocol.Test.H264
{
var bytes = line.ToHexBytes();
JT1078Package package = JT1078Serializer.Deserialize(bytes);
- var packageMerge = JT1078Serializer.Merge(package);
+ var packageMerge = JT1078Serializer.Merge(package,JT808ChannelType.Live);
if (packageMerge != null)
{
var nalus = decoder.ParseNALU(packageMerge);
diff --git a/src/JT1078.Protocol.Test/JT1078SerializerTest.cs b/src/JT1078.Protocol.Test/JT1078SerializerTest.cs
index eda06ee..30c7e5d 100644
--- a/src/JT1078.Protocol.Test/JT1078SerializerTest.cs
+++ b/src/JT1078.Protocol.Test/JT1078SerializerTest.cs
@@ -345,7 +345,7 @@ namespace JT1078.Protocol.Test
var bytes = data[6].ToHexBytes();
JT1078Package package = JT1078Serializer.Deserialize(bytes);
mergeBodyLength += package.DataBodyLength;
- merge = JT1078Serializer.Merge(package);
+ merge = JT1078Serializer.Merge(package,JT808ChannelType.Live);
}
Assert.NotNull(merge);
Assert.Equal(mergeBodyLength, merge.Bodies.Length);
diff --git a/src/JT1078.Protocol/Enums/JT808ChannelType.cs b/src/JT1078.Protocol/Enums/JT808ChannelType.cs
new file mode 100644
index 0000000..e3c2772
--- /dev/null
+++ b/src/JT1078.Protocol/Enums/JT808ChannelType.cs
@@ -0,0 +1,17 @@
+namespace JT1078.Protocol.Enums
+{
+ ///
+ /// data channel type
+ ///
+ public enum JT808ChannelType
+ {
+ ///
+ /// live channel
+ ///
+ Live,
+ ///
+ /// history channel
+ ///
+ History
+ }
+}
\ No newline at end of file
diff --git a/src/JT1078.Protocol/JT1078Serializer.cs b/src/JT1078.Protocol/JT1078Serializer.cs
index 819d727..18f6753 100644
--- a/src/JT1078.Protocol/JT1078Serializer.cs
+++ b/src/JT1078.Protocol/JT1078Serializer.cs
@@ -1,19 +1,19 @@
-using JT1078.Protocol.Enums;
-using JT1078.Protocol.Extensions;
-using JT1078.Protocol.MessagePack;
-using System;
+using System;
using System.Collections.Concurrent;
-using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.Json;
+using JT1078.Protocol.Enums;
+using JT1078.Protocol.Extensions;
+using JT1078.Protocol.MessagePack;
namespace JT1078.Protocol
{
public static class JT1078Serializer
{
- private readonly static ConcurrentDictionary JT1078PackageGroupDict = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase);
+ private readonly static ConcurrentDictionary livePackageGroup = new(StringComparer.OrdinalIgnoreCase);
+ private readonly static ConcurrentDictionary historyPackageGroup = new(StringComparer.OrdinalIgnoreCase);
public static byte[] Serialize(JT1078Package package, int minBufferSize = 4096)
{
byte[] buffer = JT1078ArrayPool.Rent(minBufferSize);
@@ -72,18 +72,33 @@ namespace JT1078.Protocol
jT1078Package.Bodies = jT1078MessagePackReader.ReadRemainArray().ToArray();
return jT1078Package;
}
- public static JT1078Package Merge(JT1078Package jT1078Package)
+
+ ///
+ /// merge package
+ /// due to the agreement cannot distinguish the Stream type, so need clear Stream type at the time of merger, avoid confusion
+ ///
+ /// package of jt1078
+ /// package type is live or history
+ ///
+ ///
+ public static JT1078Package Merge(JT1078Package jT1078Package,JT808ChannelType channelType)
{
string cacheKey = jT1078Package.GetKey();
+ var packageGroup = channelType switch
+ {
+ JT808ChannelType.Live=>livePackageGroup,
+ JT808ChannelType.History=>historyPackageGroup,
+ _=>throw new Exception("channel type error")
+ };
if (jT1078Package.Label3.SubpackageType == JT1078SubPackageType.分包处理时的第一个包)
{
- JT1078PackageGroupDict.TryRemove(cacheKey, out _);
- JT1078PackageGroupDict.TryAdd(cacheKey, jT1078Package);
+ packageGroup.TryRemove(cacheKey, out _);
+ packageGroup.TryAdd(cacheKey, jT1078Package);
return default;
}
else if (jT1078Package.Label3.SubpackageType == JT1078SubPackageType.分包处理时的中间包)
{
- if (JT1078PackageGroupDict.TryGetValue(cacheKey, out var tmpPackage))
+ if (packageGroup.TryGetValue(cacheKey, out var tmpPackage))
{
var totalLength = tmpPackage.Bodies.Length + jT1078Package.Bodies.Length;
byte[] poolBytes = JT1078ArrayPool.Rent(totalLength);
@@ -92,13 +107,13 @@ namespace JT1078.Protocol
jT1078Package.Bodies.CopyTo(tmpSpan.Slice(tmpPackage.Bodies.Length));
tmpPackage.Bodies = tmpSpan.Slice(0, totalLength).ToArray();
JT1078ArrayPool.Return(poolBytes);
- JT1078PackageGroupDict[cacheKey] = tmpPackage;
+ packageGroup[cacheKey] = tmpPackage;
}
return default;
}
else if (jT1078Package.Label3.SubpackageType == JT1078SubPackageType.分包处理时的最后一个包)
{
- if (JT1078PackageGroupDict.TryRemove(cacheKey, out var tmpPackage))
+ if (packageGroup.TryRemove(cacheKey, out var tmpPackage))
{
var totalLength = tmpPackage.Bodies.Length + jT1078Package.Bodies.Length;
byte[] poolBytes = JT1078ArrayPool.Rent(totalLength);