@@ -0,0 +1,123 @@ | |||||
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 | |||||
{ | |||||
/// <summary> | |||||
/// 业务描述表 | |||||
/// </summary> | |||||
public class TS_SDT_Package : ITSMessagePackFormatter | |||||
{ | |||||
public TS_Header Header { get; set; } | |||||
/// <summary> | |||||
/// PAT表固定为0x00 | |||||
/// 8bit | |||||
/// </summary> | |||||
public byte TableId { get; set; } = 0x42; | |||||
/// <summary> | |||||
/// 固定为二进制1 | |||||
/// 1bit | |||||
/// </summary> | |||||
internal byte SectionSyntaxIndicator { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// 1bit | |||||
/// </summary> | |||||
internal byte ReservedFutureUse1 { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// 2bit | |||||
/// </summary> | |||||
internal byte Reserved1 { get; set; } | |||||
/// <summary> | |||||
/// 后面数据的长度 | |||||
/// 12bit | |||||
/// </summary> | |||||
public ushort SectionLength { get; set; } | |||||
/// <summary> | |||||
/// 传输流ID | |||||
/// 16bit | |||||
/// </summary> | |||||
internal ushort TransportStreamId { get; set; } = 0x0001; | |||||
/// <summary> | |||||
/// | |||||
/// 2bit | |||||
/// </summary> | |||||
internal byte Reserved2 { get; set; } | |||||
/// <summary> | |||||
/// 版本号, | |||||
/// 5bit | |||||
/// </summary> | |||||
public byte VersionNumber { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// 1bit | |||||
/// </summary> | |||||
public byte CurrentNextIndicator { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// bit8 | |||||
/// </summary> | |||||
internal byte SectionNumber { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// bit8 | |||||
/// </summary> | |||||
internal byte LastSectionNumber { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// bit8 | |||||
/// </summary> | |||||
internal ushort OriginalNetworkId { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// 1Byte | |||||
/// </summary> | |||||
internal byte ReservedFutureUse2 { get; set; } | |||||
public List<TS_SDT_Service_Descriptor> Services { get; set; } | |||||
/// <summary> | |||||
/// 前面数据的CRC32校验码 | |||||
/// </summary> | |||||
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()); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,123 @@ | |||||
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 | |||||
{ | |||||
/// <summary> | |||||
/// 业务描述服务 | |||||
/// </summary> | |||||
public class TS_SDT_Service : ITSMessagePackFormatter | |||||
{ | |||||
public TS_Header Header { get; set; } | |||||
/// <summary> | |||||
/// PAT表固定为0x00 | |||||
/// 8bit | |||||
/// </summary> | |||||
public byte TableId { get; set; } = 0x42; | |||||
/// <summary> | |||||
/// 固定为二进制1 | |||||
/// 1bit | |||||
/// </summary> | |||||
internal byte SectionSyntaxIndicator { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// 1bit | |||||
/// </summary> | |||||
internal byte ReservedFutureUse1 { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// 2bit | |||||
/// </summary> | |||||
internal byte Reserved1 { get; set; } | |||||
/// <summary> | |||||
/// 后面数据的长度 | |||||
/// 12bit | |||||
/// </summary> | |||||
public ushort SectionLength { get; set; } | |||||
/// <summary> | |||||
/// 传输流ID | |||||
/// 16bit | |||||
/// </summary> | |||||
internal ushort TransportStreamId { get; set; } = 0x0001; | |||||
/// <summary> | |||||
/// | |||||
/// 2bit | |||||
/// </summary> | |||||
internal byte Reserved2 { get; set; } | |||||
/// <summary> | |||||
/// 版本号, | |||||
/// 5bit | |||||
/// </summary> | |||||
public byte VersionNumber { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// 1bit | |||||
/// </summary> | |||||
public byte CurrentNextIndicator { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// bit8 | |||||
/// </summary> | |||||
internal byte SectionNumber { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// bit8 | |||||
/// </summary> | |||||
internal byte LastSectionNumber { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// bit8 | |||||
/// </summary> | |||||
internal ushort OriginalNetworkId { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// 1Byte | |||||
/// </summary> | |||||
internal byte ReservedFutureUse2 { get; set; } | |||||
public List<TS_PAT_Program> Services { get; set; } | |||||
/// <summary> | |||||
/// 前面数据的CRC32校验码 | |||||
/// </summary> | |||||
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()); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,123 @@ | |||||
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 | |||||
{ | |||||
/// <summary> | |||||
/// 业务描述服务描述 | |||||
/// </summary> | |||||
public class TS_SDT_Service_Descriptor : ITSMessagePackFormatter | |||||
{ | |||||
public TS_Header Header { get; set; } | |||||
/// <summary> | |||||
/// PAT表固定为0x00 | |||||
/// 8bit | |||||
/// </summary> | |||||
public byte TableId { get; set; } = 0x42; | |||||
/// <summary> | |||||
/// 固定为二进制1 | |||||
/// 1bit | |||||
/// </summary> | |||||
internal byte SectionSyntaxIndicator { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// 1bit | |||||
/// </summary> | |||||
internal byte ReservedFutureUse1 { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// 2bit | |||||
/// </summary> | |||||
internal byte Reserved1 { get; set; } | |||||
/// <summary> | |||||
/// 后面数据的长度 | |||||
/// 12bit | |||||
/// </summary> | |||||
public ushort SectionLength { get; set; } | |||||
/// <summary> | |||||
/// 传输流ID | |||||
/// 16bit | |||||
/// </summary> | |||||
internal ushort TransportStreamId { get; set; } = 0x0001; | |||||
/// <summary> | |||||
/// | |||||
/// 2bit | |||||
/// </summary> | |||||
internal byte Reserved2 { get; set; } | |||||
/// <summary> | |||||
/// 版本号, | |||||
/// 5bit | |||||
/// </summary> | |||||
public byte VersionNumber { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// 1bit | |||||
/// </summary> | |||||
public byte CurrentNextIndicator { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// bit8 | |||||
/// </summary> | |||||
internal byte SectionNumber { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// bit8 | |||||
/// </summary> | |||||
internal byte LastSectionNumber { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// bit8 | |||||
/// </summary> | |||||
internal ushort OriginalNetworkId { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// 1Byte | |||||
/// </summary> | |||||
internal byte ReservedFutureUse2 { get; set; } | |||||
public List<TS_PAT_Program> Services { get; set; } | |||||
/// <summary> | |||||
/// 前面数据的CRC32校验码 | |||||
/// </summary> | |||||
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()); | |||||
} | |||||
} | |||||
} |