You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 line
3.9 KiB

  1. using JT1078.Hls.Enums;
  2. using JT1078.Hls.Interfaces;
  3. using JT1078.Hls.MessagePack;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. namespace JT1078.Hls
  9. {
  10. /// <summary>
  11. /// 业务描述服务描述
  12. /// </summary>
  13. public class TS_SDT_Service_Descriptor : ITSMessagePackFormatter
  14. {
  15. public TS_Header Header { get; set; }
  16. /// <summary>
  17. /// PAT表固定为0x00
  18. /// 8bit
  19. /// </summary>
  20. public byte TableId { get; set; } = 0x42;
  21. /// <summary>
  22. /// 固定为二进制1
  23. /// 1bit
  24. /// </summary>
  25. internal byte SectionSyntaxIndicator { get; set; }
  26. /// <summary>
  27. ///
  28. /// 1bit
  29. /// </summary>
  30. internal byte ReservedFutureUse1 { get; set; }
  31. /// <summary>
  32. ///
  33. /// 2bit
  34. /// </summary>
  35. internal byte Reserved1 { get; set; }
  36. /// <summary>
  37. /// 后面数据的长度
  38. /// 12bit
  39. /// </summary>
  40. public ushort SectionLength { get; set; }
  41. /// <summary>
  42. /// 传输流ID
  43. /// 16bit
  44. /// </summary>
  45. internal ushort TransportStreamId { get; set; } = 0x0001;
  46. /// <summary>
  47. ///
  48. /// 2bit
  49. /// </summary>
  50. internal byte Reserved2 { get; set; }
  51. /// <summary>
  52. /// 版本号,
  53. /// 5bit
  54. /// </summary>
  55. public byte VersionNumber { get; set; }
  56. /// <summary>
  57. ///
  58. /// 1bit
  59. /// </summary>
  60. public byte CurrentNextIndicator { get; set; }
  61. /// <summary>
  62. ///
  63. /// bit8
  64. /// </summary>
  65. internal byte SectionNumber { get; set; }
  66. /// <summary>
  67. ///
  68. /// bit8
  69. /// </summary>
  70. internal byte LastSectionNumber { get; set; }
  71. /// <summary>
  72. ///
  73. /// bit8
  74. /// </summary>
  75. internal ushort OriginalNetworkId { get; set; }
  76. /// <summary>
  77. ///
  78. /// 1Byte
  79. /// </summary>
  80. internal byte ReservedFutureUse2 { get; set; }
  81. public List<TS_PAT_Program> Services { get; set; }
  82. /// <summary>
  83. /// 前面数据的CRC32校验码
  84. /// </summary>
  85. public uint CRC32 { get; set; }
  86. public void ToBuffer(ref TSMessagePackWriter writer)
  87. {
  88. Header.PackageType = PackageType.PAT;
  89. Header.ToBuffer(ref writer);
  90. writer.WriteByte(TableId);
  91. //SectionSyntaxIndicator Zero Reserved1 SectionLength
  92. //1 0 11 0000 0000 0000
  93. //(ushort)(0b_1011_0000_0000_0000 | SectionLength)
  94. writer.Skip(2, out int SectionLengthPosition);
  95. writer.WriteUInt16(TransportStreamId);
  96. //Reserved2 VersionNumber CurrentNextIndicator
  97. //11 00000 1
  98. var a = 0xC0 & (Reserved2 << 6);
  99. var b = 0x3E & (VersionNumber << 3);
  100. var c = (byte)(a | b | CurrentNextIndicator);
  101. writer.WriteByte(c);
  102. writer.WriteByte(SectionNumber);
  103. writer.WriteByte(LastSectionNumber);
  104. //if (Programs != null)
  105. //{
  106. // foreach (var program in Programs)
  107. // {
  108. // program.ToBuffer(ref writer);
  109. // }
  110. //}
  111. const int crcLength= 4;
  112. writer.WriteUInt16Return((ushort)(0b_1011_0000_0000_0000 | (ushort)(writer.GetCurrentPosition() - SectionLengthPosition - 2)+ crcLength), SectionLengthPosition);
  113. //打包ts流时PAT和PMT表是没有adaptation field的,不够的长度直接补0xff即可。
  114. //ts header(4B) + adaptation field length(1)
  115. writer.WriteCRC32(5);
  116. var size = TSConstants.FiexdPackageLength - writer.GetCurrentPosition();
  117. writer.WriteArray(Enumerable.Range(0, size).Select(s => (byte)0xFF).ToArray());
  118. }
  119. }
  120. }