From a6f751eb3507f8de19a7c2796ca854af5c0c063b Mon Sep 17 00:00:00 2001 From: waterliu99 Date: Wed, 20 May 2020 13:49:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84sdt=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E5=8C=85=E5=8F=8A=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/JT1078.Hls.Test/TS_SDT_Package_Test.cs | 41 +++++++++++ .../TS_SDT_Service_Descriptor.cs | 16 ++--- src/JT1078.Hls/Enums/PackageType.cs | 1 + .../TS_SDT_Service_Descriptor_ServiceType.cs | 26 +++++++ ...tus.cs => TS_SDT_Service_RunningStatus.cs} | 2 +- src/JT1078.Hls/TS_Header.cs | 5 +- src/JT1078.Hls/TS_SDT_Package.cs | 69 +++++++++++-------- src/JT1078.Hls/TS_SDT_Service.cs | 17 ++--- 8 files changed, 130 insertions(+), 47 deletions(-) rename src/JT1078.Hls/{ => Descriptors}/TS_SDT_Service_Descriptor.cs (78%) create mode 100644 src/JT1078.Hls/Enums/TS_SDT_Service_Descriptor_ServiceType.cs rename src/JT1078.Hls/Enums/{RunningStatus.cs => TS_SDT_Service_RunningStatus.cs} (86%) diff --git a/src/JT1078.Hls.Test/TS_SDT_Package_Test.cs b/src/JT1078.Hls.Test/TS_SDT_Package_Test.cs index 7348366..6e0a97b 100644 --- a/src/JT1078.Hls.Test/TS_SDT_Package_Test.cs +++ b/src/JT1078.Hls.Test/TS_SDT_Package_Test.cs @@ -15,6 +15,47 @@ namespace JT1078.Hls.Test [Fact] public void ToBufferTest() { + TS_SDT_Package package = new TS_SDT_Package(); + package.Header = new TS_Header(); + package.Header.PID = 0x0011; + package.Header.AdaptationFieldControl = AdaptationFieldControl.无自适应域_仅含有效负载; + package.Header.ContinuityCounter = 0; + package.TableId = 0x42; + package.TransportStreamId = 0x0001; + package.VersionNumber = 0; + package.CurrentNextIndicator = 0x01; + package.SectionNumber = 0x00; + package.LastSectionNumber = 0x00; + package.OriginalNetworkId = 0xFF01; + package.Services = new List(); + package.Services.Add(new TS_SDT_Service() + { + ServiceId = 0x0001, + EITScheduleFlag = 0x00, + EITPresentFollowingFlag = 0x00, + RunningStatus = TS_SDT_Service_RunningStatus.运行, + FreeCAMode = 0x00, + Descriptors = new List { + new Descriptors.TS_SDT_Service_Descriptor{ + DescriptorTag=0x48, + ServiceType= TS_SDT_Service_Descriptor_ServiceType.数字电视业务, + ServiceProvider="FFmpeg", + ServiceName="Service01" + } + } + }) ; + + TSMessagePackWriter writer = new TSMessagePackWriter(new byte[188]); + package.ToBuffer(ref writer); + var patData = writer.FlushAndGetArray().ToHexString(); + Assert.Equal("47 40 11 10 00 42 F0 25 00 01 C1 00 00 FF 01 FF 00 01 FC 80 14 48 12 01 06 46 46 6D 70 65 67 09 53 65 72 76 69 63 65 30 31 77 7C 43 CA FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF".Replace(" ", ""), patData); + + } + + [Fact] + public void Test() { + byte a = 0x01; + var b = (ushort)(a << 15); } } } diff --git a/src/JT1078.Hls/TS_SDT_Service_Descriptor.cs b/src/JT1078.Hls/Descriptors/TS_SDT_Service_Descriptor.cs similarity index 78% rename from src/JT1078.Hls/TS_SDT_Service_Descriptor.cs rename to src/JT1078.Hls/Descriptors/TS_SDT_Service_Descriptor.cs index 0c501a4..0d44811 100644 --- a/src/JT1078.Hls/TS_SDT_Service_Descriptor.cs +++ b/src/JT1078.Hls/Descriptors/TS_SDT_Service_Descriptor.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; -namespace JT1078.Hls +namespace JT1078.Hls.Descriptors { /// /// 涓氬姟鎻忚堪鏈嶅姟鎻忚堪 @@ -14,7 +14,7 @@ namespace JT1078.Hls public class TS_SDT_Service_Descriptor : ITSMessagePackFormatter { /// - /// + /// 涓氬姟鎻忚堪绗 /// 8bit /// public byte DescriptorTag { get; set; } = 0x48; @@ -22,12 +22,12 @@ namespace JT1078.Hls /// /// 8bit /// - internal byte DescriptorLength { get; set; } = 0x12; + internal byte DescriptorLength { get; set; } /// /// /// 8bit /// - internal byte ServiceType { get; set; } = 0x01; + internal TS_SDT_Service_Descriptor_ServiceType ServiceType { get; set; } = TS_SDT_Service_Descriptor_ServiceType.鏁板瓧鐢佃涓氬姟; /// /// /// 8bit @@ -52,14 +52,14 @@ namespace JT1078.Hls { writer.WriteByte(DescriptorTag); writer.Skip(1,out var position); - writer.WriteByte(ServiceType); + writer.WriteByte((byte)ServiceType); writer.Skip(1, out var serviceProviderLengthPosition); writer.WriteString(ServiceProvider); - writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - serviceProviderLengthPosition), serviceProviderLengthPosition); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - serviceProviderLengthPosition-1), serviceProviderLengthPosition); writer.Skip(1, out int SeviceNameLengthPosition); writer.WriteString(ServiceName); - writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - SeviceNameLengthPosition), SeviceNameLengthPosition); - writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - position), position); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - SeviceNameLengthPosition-1), SeviceNameLengthPosition); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - position-1), position); } } } diff --git a/src/JT1078.Hls/Enums/PackageType.cs b/src/JT1078.Hls/Enums/PackageType.cs index e49f831..f35bf1c 100644 --- a/src/JT1078.Hls/Enums/PackageType.cs +++ b/src/JT1078.Hls/Enums/PackageType.cs @@ -11,5 +11,6 @@ namespace JT1078.Hls.Enums Data_Start=3, Data_Segment = 4, Data_End = 5, + SDT=6 } } diff --git a/src/JT1078.Hls/Enums/TS_SDT_Service_Descriptor_ServiceType.cs b/src/JT1078.Hls/Enums/TS_SDT_Service_Descriptor_ServiceType.cs new file mode 100644 index 0000000..6b9f3e1 --- /dev/null +++ b/src/JT1078.Hls/Enums/TS_SDT_Service_Descriptor_ServiceType.cs @@ -0,0 +1,26 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Text; + +namespace JT1078.Hls.Enums +{ + /// + /// 鏈嶅姟鎻忚堪绫诲瀷 + /// + public enum TS_SDT_Service_Descriptor_ServiceType:byte + { + 淇濈暀浠ュ悗浣跨敤=0x00, + 鏁板瓧鐢佃涓氬姟 = 0x01, + 鏁板瓧鏃犵嚎澹伴煶涓氬姟 = 0x02, + 鍥炬枃鐢佃涓氬姟 = 0x03, + NVOD鍙傝冧笟鍔 = 0x04, + NVOD鏃堕棿骞崇Щ涓氬姟 = 0x05, + 闀跺祵涓氬姟 = 0x06, + PAL缂栫爜淇″彿 = 0x07, + SECAM缂栫爜淇″彿 = 0x08, + D_D2_MAC = 0x09, + FM鏃犵嚎 = 0x0A, + NTSC缂栫爜淇″彿 = 0x0B, + 鏁版嵁骞挎挱涓氬姟 = 0x0C, + } +} diff --git a/src/JT1078.Hls/Enums/RunningStatus.cs b/src/JT1078.Hls/Enums/TS_SDT_Service_RunningStatus.cs similarity index 86% rename from src/JT1078.Hls/Enums/RunningStatus.cs rename to src/JT1078.Hls/Enums/TS_SDT_Service_RunningStatus.cs index 92d06e4..aa3b8ea 100644 --- a/src/JT1078.Hls/Enums/RunningStatus.cs +++ b/src/JT1078.Hls/Enums/TS_SDT_Service_RunningStatus.cs @@ -7,7 +7,7 @@ namespace JT1078.Hls.Enums /// /// 杩愯鐘舵 /// - public enum RunningStatus + public enum TS_SDT_Service_RunningStatus { 鏈畾涔=0, 鏈繍琛=1, diff --git a/src/JT1078.Hls/TS_Header.cs b/src/JT1078.Hls/TS_Header.cs index 71794c0..4ea04c8 100644 --- a/src/JT1078.Hls/TS_Header.cs +++ b/src/JT1078.Hls/TS_Header.cs @@ -32,7 +32,7 @@ namespace JT1078.Hls /// pid鍊 /// 13bit /// - public ushort PID { get; set; } + public ushort PID { get; set; } = 0x0011; /// /// 浼犺緭鍔犳壈鎺у埗 /// 2bit @@ -69,7 +69,8 @@ namespace JT1078.Hls if(PackageType== PackageType.PAT || PackageType == PackageType.PMT || PackageType == PackageType.Data_Start || - PackageType == PackageType.Data_End) + PackageType == PackageType.Data_End || + PackageType == PackageType.SDT) { if (Adaptation != null) { diff --git a/src/JT1078.Hls/TS_SDT_Package.cs b/src/JT1078.Hls/TS_SDT_Package.cs index 5610478..54e4888 100644 --- a/src/JT1078.Hls/TS_SDT_Package.cs +++ b/src/JT1078.Hls/TS_SDT_Package.cs @@ -16,70 +16,81 @@ namespace JT1078.Hls { public TS_Header Header { get; set; } /// - /// + /// 琛ㄦ爣璇嗙 + /// 鍙互鏄0x42,琛ㄧず鎻忚堪鐨勬槸褰撳墠娴佺殑淇℃伅,涔熷彲浠ユ槸0x46,琛ㄧず鏄叾浠栨祦鐨勪俊鎭 /// 8bit /// public byte TableId { get; set; } = 0x42; /// - /// + /// 娈佃娉曟寚绀虹 /// 1bit /// - internal byte SectionSyntaxIndicator { get; set; } + internal byte SectionSyntaxIndicator { get; set; } = 0x01; /// - /// + /// 淇濈暀鏈潵浣跨敤 /// 1bit /// - internal byte ReservedFutureUse1 { get; set; } + internal byte ReservedFutureUse1 { get; set; } = 0x01; /// - /// + /// 淇濈暀浣,闃叉鎺у埗瀛楀啿绐,涓鑸槸''0'',涔熸湁鍙兘鏄''1'' /// 2bit /// - internal byte Reserved1 { get; set; } + internal byte Reserved1 { get; set; } = 0x03; /// - /// 鍚庨潰鏁版嵁鐨勯暱搴 + /// 娈甸暱搴 浠巘ransport_stream_id寮濮,鍒癈RC_32缁撴潫(鍖呭惈) /// 12bit /// public ushort SectionLength { get; set; } /// - /// 浼犺緭娴両D + /// 浼犺緭娴佹爣璇嗙 + /// 鍚 PAT琛ㄤ腑鐨 TransportStreamId 鍜孭MT琛ㄤ腑 ProgramNumber /// 16bit /// - internal ushort TransportStreamId { get; set; } + internal ushort TransportStreamId { get; set; } /// - /// + /// 淇濈暀浣 /// 2bit /// - internal byte Reserved2 { get; set; } + internal byte Reserved2 { get; set; }= 0x03; /// - /// + /// 鐗堟湰鍙 + /// 鏍囪瘑瀛愯〃鐨勭増鏈彿銆傚綋瀛愯〃鍖呭惈鐨勪俊鎭彂鐢熷彉鍖栨椂锛 version_number 鍔 1銆傚綋鍊煎鑷 31 鏃讹紝澶嶄綅涓 0銆 + /// 褰 current_next_indicator 缃1鈥濇椂锛屽垯 version_number 涓哄綋鍓嶄娇鐢ㄧ殑瀛愯〃鐨勭増鏈彿銆 + /// 褰 current_next_indicator 缃0鈥濇椂锛屽垯 version_number 涓轰笅涓涓娇鐢ㄧ殑瀛愯〃鐨勭増鏈彿銆 /// 5bit /// - public byte VersionNumber { get; set; } + public byte VersionNumber { get; set; } = 0x00; /// - /// + /// 褰撳墠鍚庣画鎸囩ず绗 + /// 褰撹缃1鈥濇椂锛岃〃绀哄綋鍓嶅瓙琛 姝h浣跨敤銆 + /// 褰撳叾缃0鈥濇椂锛岃〃绀烘墍浼犲瓙琛ㄥ皻鏈浣跨敤锛屽畠鏄笅涓涓皢琚娇鐢ㄧ殑瀛愯〃銆 /// 1bit /// - public byte CurrentNextIndicator { get; set; } + public byte CurrentNextIndicator { get; set; } = 0x00; /// - /// + /// 娈靛彿 + /// 瀛愯〃涓殑绗竴涓鐨 section_number 鏍 涓 鈥 0x00 鈥濄 + /// 姣忓鍔犱竴涓叿鏈夌浉鍚岀殑 table_id 銆 transport_stream_id 鍜宱riginal_network_id 鐨勬锛宻ection_number 灏卞姞 1銆 /// bit8 /// - internal byte SectionNumber { get; set; } + internal byte SectionNumber { get; set; }=0x00; /// - /// + /// 鏈鍚庢鍙 + /// 琛ㄧず鎵灞炵殑瀛愯〃鐨勬渶鍚庝竴涓锛堝嵆娈靛彿鏈澶х殑娈碉級鐨勬鍙枫 /// bit8 /// - internal byte LastSectionNumber { get; set; } + internal byte LastSectionNumber { get; set; } = 0x00; /// - /// - /// bit8 + /// 鍘熷缃戠粶鏍囪瘑绗 + /// 鍘熷浼犺緭绯荤粺鐨 network_id + /// bit16 /// - internal ushort OriginalNetworkId { get; set; } + internal ushort OriginalNetworkId { get; set; } /// - /// - /// 1Byte + /// 淇濈暀鏈潵浣跨敤浣 + /// bit8 /// - internal byte ReservedFutureUse2 { get; set; } + internal byte ReservedFutureUse2 { get; set; } = 0xFF; public List Services { get; set; } /// @@ -89,6 +100,8 @@ namespace JT1078.Hls public void ToBuffer(ref TSMessagePackWriter writer) { + Header.PackageType = PackageType.SDT; + Header.ToBuffer(ref writer); writer.WriteByte(TableId); writer.Skip(2, out int SectionLengthPosition); writer.WriteUInt16(TransportStreamId); @@ -101,9 +114,9 @@ namespace JT1078.Hls { service.ToBuffer(ref writer); } - ushort servicesLength =(ushort)( writer.GetCurrentPosition() - SectionLengthPosition); + ushort servicesLength =(ushort)( writer.GetCurrentPosition() - SectionLengthPosition-2); const int crcLength = 4; - writer.WriteUInt16Return((ushort)(SectionSyntaxIndicator<<15 | ReservedFutureUse1<<14 | servicesLength+ crcLength), SectionLengthPosition); + writer.WriteUInt16Return((ushort)(SectionSyntaxIndicator<<15 | ReservedFutureUse1<<14| Reserved1<<12 | servicesLength+ crcLength), SectionLengthPosition); writer.WriteCRC32(5); var size = TSConstants.FiexdPackageLength - writer.GetCurrentPosition(); writer.WriteArray(Enumerable.Range(0, size).Select(s => (byte)0xFF).ToArray()); diff --git a/src/JT1078.Hls/TS_SDT_Service.cs b/src/JT1078.Hls/TS_SDT_Service.cs index 1b6525a..46abe97 100644 --- a/src/JT1078.Hls/TS_SDT_Service.cs +++ b/src/JT1078.Hls/TS_SDT_Service.cs @@ -1,4 +1,5 @@ -锘縰sing JT1078.Hls.Enums; +锘縰sing JT1078.Hls.Descriptors; +using JT1078.Hls.Enums; using JT1078.Hls.Interfaces; using JT1078.Hls.MessagePack; using System; @@ -20,37 +21,37 @@ namespace JT1078.Hls /// internal ushort ServiceId { get; set; } /// - /// + /// 淇濈暀灏嗘潵浣跨敤 /// 6bit /// - internal byte ReservedFutureUse { get; set; } + internal byte ReservedFutureUse { get; set; } = 0x3F; /// /// EIT 鏃堕棿琛ㄦ爣蹇 /// 缃1鈥濇椂锛岃〃绀轰笟鍔$殑 EIT 鏃堕棿琛ㄤ俊鎭瓨鍦ㄤ簬褰撳墠 TS 涓紙涓涓 EIT 鏃堕棿琛ㄥ瓙琛ㄤ袱娆″嚭鐜扮殑鏈澶ф椂闂撮棿闅斾俊鎭 ETR 211锛夈 /// 缃0鈥濇椂锛岃〃绀轰笟鍔$殑 EIT 鏃堕棿琛ㄤ俊鎭笉鍦ㄥ綋鍓 TS 涓 /// 1bit /// - internal byte EITScheduleFlag { get; set; } + internal byte EITScheduleFlag { get; set; } = 0x00; /// /// EIT 褰撳墠鍚庣画鏍囧織 /// 缃1鈥濇椂锛岃〃绀轰笟鍔$殑 EIT 褰撳墠鍚庣画淇℃伅瀛樺湪浜庡綋鍓 TS 涓紙涓涓 EIT 褰撳墠鍚庣画瀛愯〃涓ゆ鍑虹幇鐨勬渶澶ф椂闂撮棿闅斾俊鎭ETR 211锛 /// 缃0鈥濇椂锛岃〃绀轰笟鍔$殑 EIT 褰撳墠鍚庣画淇℃伅涓嶅湪褰撳墠 TS 涓 /// 1bit /// - public byte EITPresentFollowingFlag { get; set; } + public byte EITPresentFollowingFlag { get; set; } = 0x00; /// /// 杩愯鐘舵 /// 瀵逛簬涓涓 NVOD 涓氬姟锛宺unning_status 鐨勫奸兘缃0鈥 /// 3bit /// - internal RunningStatus RunningStatus { get; set; } + internal TS_SDT_Service_RunningStatus RunningStatus { get; set; } /// /// 鑷敱鏉′欢鎺ユ敹妯″紡 /// 缃0鈥濇椂锛岃〃绀轰笟鍔$殑鎵鏈夌粍浠堕兘鏈鍔犳壈 /// 缃1鈥濇椂锛岃〃绀轰竴璺垨澶氳矾鐮佹祦鐨勬帴鏀剁敱 CA 绯荤粺鎺у埗銆 /// 1bit /// - internal byte FreeCAMode { get; set; } + internal byte FreeCAMode { get; set; } = 0x00; /// /// 鎻忚堪绗﹀惊鐜暱搴 /// 鎸囧嚭浠庢湰瀛楁鐨勪笅涓涓瓧鑺傚紑濮嬬殑鎻忚堪绗︾殑鎬诲瓧鑺傞暱搴︺ @@ -69,7 +70,7 @@ namespace JT1078.Hls { descriptor.ToBuffer(ref writer); } - DescriptorsLoopLength = (ushort)(writer.GetCurrentPosition() - position); + DescriptorsLoopLength = (ushort)(writer.GetCurrentPosition() - position-2); writer.WriteUInt16Return((ushort)((ushort)RunningStatus << 13 | (ushort)FreeCAMode << 12 | DescriptorsLoopLength), position); } }