using JT1078.Hls.Enums; using JT1078.Hls.Interfaces; using JT1078.Hls.MessagePack; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace JT1078.Hls { /// /// 业务描述服务描述 /// public class TS_SDT_Service_Descriptor : ITSMessagePackFormatter { public TS_Header Header { get; set; } /// /// PAT表固定为0x00 /// 8bit /// public byte TableId { get; set; } = 0x42; /// /// 固定为二进制1 /// 1bit /// internal byte SectionSyntaxIndicator { get; set; } /// /// /// 1bit /// internal byte ReservedFutureUse1 { get; set; } /// /// /// 2bit /// internal byte Reserved1 { get; set; } /// /// 后面数据的长度 /// 12bit /// public ushort SectionLength { get; set; } /// /// 传输流ID /// 16bit /// internal ushort TransportStreamId { get; set; } = 0x0001; /// /// /// 2bit /// internal byte Reserved2 { get; set; } /// /// 版本号, /// 5bit /// public byte VersionNumber { get; set; } /// /// /// 1bit /// public byte CurrentNextIndicator { get; set; } /// /// /// bit8 /// internal byte SectionNumber { get; set; } /// /// /// bit8 /// internal byte LastSectionNumber { get; set; } /// /// /// bit8 /// internal ushort OriginalNetworkId { get; set; } /// /// /// 1Byte /// internal byte ReservedFutureUse2 { get; set; } public List Services { get; set; } /// /// 前面数据的CRC32校验码 /// public uint CRC32 { get; set; } public void ToBuffer(ref TSMessagePackWriter writer) { Header.PackageType = PackageType.PAT; Header.ToBuffer(ref writer); writer.WriteByte(TableId); //SectionSyntaxIndicator Zero Reserved1 SectionLength //1 0 11 0000 0000 0000 //(ushort)(0b_1011_0000_0000_0000 | SectionLength) writer.Skip(2, out int SectionLengthPosition); writer.WriteUInt16(TransportStreamId); //Reserved2 VersionNumber CurrentNextIndicator //11 00000 1 var a = 0xC0 & (Reserved2 << 6); var b = 0x3E & (VersionNumber << 3); var c = (byte)(a | b | CurrentNextIndicator); writer.WriteByte(c); writer.WriteByte(SectionNumber); writer.WriteByte(LastSectionNumber); //if (Programs != null) //{ // foreach (var program in Programs) // { // program.ToBuffer(ref writer); // } //} const int crcLength= 4; writer.WriteUInt16Return((ushort)(0b_1011_0000_0000_0000 | (ushort)(writer.GetCurrentPosition() - SectionLengthPosition - 2)+ crcLength), SectionLengthPosition); //打包ts流时PAT和PMT表是没有adaptation field的,不够的长度直接补0xff即可。 //ts header(4B) + adaptation field length(1) writer.WriteCRC32(5); var size = TSConstants.FiexdPackageLength - writer.GetCurrentPosition(); writer.WriteArray(Enumerable.Range(0, size).Select(s => (byte)0xFF).ToArray()); } } }