public void ToBuffer(ref TSMessagePackWriter writer) { 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()); }
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); writer.WriteByte((byte)(Reserved2 << 6 | VersionNumber << 1 | CurrentNextIndicator)); writer.WriteByte(SectionNumber); writer.WriteByte(LastSectionNumber); writer.WriteUInt16(OriginalNetworkId); writer.WriteByte(ReservedFutureUse2); foreach (var service in Services) { service.ToBuffer(ref writer); } ushort servicesLength = (ushort)(writer.GetCurrentPosition() - SectionLengthPosition - 2); const int crcLength = 4; 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()); }