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.

107 lines
3.4 KiB

  1. using JT1078.Hls.Formatters;
  2. using JT1078.Hls.MessagePack;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Text;
  6. namespace JT1078.Hls
  7. {
  8. /// <summary>
  9. /// 格式节目关联表
  10. /// </summary>
  11. public class TS_PAT_Package : ITSMessagePackFormatter
  12. {
  13. /// <summary>
  14. /// PAT表固定为0x00
  15. /// 8bit
  16. /// </summary>
  17. public byte TableId { get; set; } = 0x00;
  18. /// <summary>
  19. /// 固定为二进制1
  20. /// 1bit
  21. /// </summary>
  22. internal byte SectionSyntaxIndicator { get; set; } = 0x01;
  23. /// <summary>
  24. /// 固定为二进制0
  25. /// 1bit
  26. /// </summary>
  27. internal byte Zero { get; set; } = 0x00;
  28. /// <summary>
  29. /// 固定为二进制3
  30. /// 2bit
  31. /// </summary>
  32. internal byte Reserved1 { get; set; } = 0x03;
  33. /// <summary>
  34. /// 后面数据的长度
  35. /// 12bit
  36. /// </summary>
  37. public ushort SectionLength { get; set; }
  38. /// <summary>
  39. /// 传输流ID
  40. /// 16bit
  41. /// </summary>
  42. internal ushort TransportStreamId { get; set; } = 0x0001;
  43. /// <summary>
  44. /// 固定为二进制3
  45. /// 2bit
  46. /// </summary>
  47. internal byte Reserved2 { get; set; } = 0x03;
  48. /// <summary>
  49. /// 版本号,固定为二进制00000,如果PAT有变化则版本号加1
  50. /// 5bit
  51. /// </summary>
  52. public byte VersionNumber { get; set; } = 0x00;
  53. /// <summary>
  54. /// 固定为二进制1,表示这个PAT表可以用,如果为0则要等待下一个PAT表
  55. /// 1bit
  56. /// </summary>
  57. public byte CurrentNextIndicator { get; set; } = 1;
  58. /// <summary>
  59. /// 固定为0x00
  60. /// bit8
  61. /// </summary>
  62. internal byte SectionNumber { get; set; } = 0x00;
  63. /// <summary>
  64. /// 固定为0x00
  65. /// bit8
  66. /// </summary>
  67. internal byte LastSectionNumber { get; set; } = 0x00;
  68. public List<TS_PAT_Program> Programs { get; set; }
  69. /// <summary>
  70. /// 前面数据的CRC32校验码
  71. /// </summary>
  72. public uint CRC32 { get; set; }
  73. public void ToBuffer(ref TSMessagePackWriter writer)
  74. {
  75. writer.WriteByte(TableId);
  76. //SectionSyntaxIndicator Zero Reserved1 SectionLength
  77. //1 0 11 0000 0000 0000
  78. //(ushort)(1011_0000_0000_0000 | SectionLength)
  79. // todo:
  80. //writer.WriteUInt16((ushort)(1011_0000_0000_0000 | SectionLength));
  81. writer.Skip(2, out int SectionLengthPosition);
  82. writer.WriteUInt16(TransportStreamId);
  83. //Reserved2 VersionNumber CurrentNextIndicator
  84. //11 00000 1
  85. var a = Reserved2 & 0xC0;
  86. var b = VersionNumber & 0x3E;
  87. var c = (byte)(a | b | CurrentNextIndicator);
  88. writer.WriteByte(c);
  89. writer.WriteByte(SectionNumber);
  90. writer.WriteByte(LastSectionNumber);
  91. if (Programs != null)
  92. {
  93. foreach (var program in Programs)
  94. {
  95. program.ToBuffer(ref writer);
  96. }
  97. }
  98. writer.WriteUInt16Return((ushort)(1011_0000_0000_0000 | (ushort)(writer.GetCurrentPosition() - SectionLengthPosition - 2)), SectionLengthPosition);
  99. writer.WriteCRC32(SectionLengthPosition);
  100. }
  101. }
  102. }