選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

78 行
3.0 KiB

  1. using JT1078.Hls.Descriptors;
  2. using JT1078.Hls.Enums;
  3. using JT1078.Hls.Interfaces;
  4. using JT1078.Hls.MessagePack;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. namespace JT1078.Hls
  10. {
  11. /// <summary>
  12. /// 业务描述服务
  13. /// </summary>
  14. public class TS_SDT_Service : ITSMessagePackFormatter
  15. {
  16. /// <summary>
  17. /// 业务标识符
  18. /// 用于在 TS 流中识别不同的业务。service_id 与program_map_section 中的 program_number 取同一值
  19. /// 16bit
  20. /// </summary>
  21. internal ushort ServiceId { get; set; }
  22. /// <summary>
  23. /// 保留将来使用
  24. /// 6bit
  25. /// </summary>
  26. internal byte ReservedFutureUse { get; set; } = 0x3F;
  27. /// <summary>
  28. /// EIT 时间表标志
  29. /// 置“1”时,表示业务的 EIT 时间表信息存在于当前 TS 中(一个 EIT 时间表子表两次出现的最大时间间隔信息见 ETR 211)。
  30. /// 置“0”时,表示业务的 EIT 时间表信息不在当前 TS 中
  31. /// 1bit
  32. /// </summary>
  33. internal byte EITScheduleFlag { get; set; } = 0x00;
  34. /// <summary>
  35. /// EIT 当前后续标志
  36. /// 置“1”时,表示业务的 EIT 当前后续信息存在于当前 TS 中(一个 EIT 当前后续子表两次出现的最大时间间隔信息见ETR 211)
  37. /// 置“0”时,表示业务的 EIT 当前后续信息不在当前 TS 中。
  38. /// 1bit
  39. /// </summary>
  40. public byte EITPresentFollowingFlag { get; set; } = 0x00;
  41. /// <summary>
  42. /// 运行状态
  43. /// 对于一个 NVOD 业务,running_status 的值都置“0”
  44. /// 3bit
  45. /// </summary>
  46. internal TS_SDT_Service_RunningStatus RunningStatus { get; set; }
  47. /// <summary>
  48. /// 自由条件接收模式
  49. /// 置“0”时,表示业务的所有组件都未被加扰
  50. /// 置“1”时,表示一路或多路码流的接收由 CA 系统控制。
  51. /// 1bit
  52. /// </summary>
  53. internal byte FreeCAMode { get; set; } = 0x00;
  54. /// <summary>
  55. /// 描述符循环长度
  56. /// 指出从本字段的下一个字节开始的描述符的总字节长度。
  57. /// 12bit
  58. /// </summary>
  59. public ushort DescriptorsLoopLength { get; set; }
  60. public List<TS_SDT_Service_Descriptor> Descriptors { get; set; }
  61. public void ToBuffer(ref TSMessagePackWriter writer)
  62. {
  63. writer.WriteUInt16(ServiceId);
  64. writer.WriteByte((byte)(ReservedFutureUse << 2 | EITScheduleFlag << 1 | EITPresentFollowingFlag));
  65. writer.Skip(2, out var position);
  66. foreach (var descriptor in Descriptors)
  67. {
  68. descriptor.ToBuffer(ref writer);
  69. }
  70. DescriptorsLoopLength = (ushort)(writer.GetCurrentPosition() - position-2);
  71. writer.WriteUInt16Return((ushort)((ushort)RunningStatus << 13 | (ushort)FreeCAMode << 12 | DescriptorsLoopLength), position);
  72. }
  73. }
  74. }