using JT1078.Hls.Descriptors;
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
{
///
/// 业务描述服务
///
public class TS_SDT_Service : ITSMessagePackFormatter
{
///
/// 业务标识符
/// 用于在 TS 流中识别不同的业务。service_id 与program_map_section 中的 program_number 取同一值
/// 16bit
///
internal ushort ServiceId { get; set; }
///
/// 保留将来使用
/// 6bit
///
internal byte ReservedFutureUse { get; set; } = 0x3F;
///
/// EIT 时间表标志
/// 置“1”时,表示业务的 EIT 时间表信息存在于当前 TS 中(一个 EIT 时间表子表两次出现的最大时间间隔信息见 ETR 211)。
/// 置“0”时,表示业务的 EIT 时间表信息不在当前 TS 中
/// 1bit
///
internal byte EITScheduleFlag { get; set; } = 0x00;
///
/// EIT 当前后续标志
/// 置“1”时,表示业务的 EIT 当前后续信息存在于当前 TS 中(一个 EIT 当前后续子表两次出现的最大时间间隔信息见ETR 211)
/// 置“0”时,表示业务的 EIT 当前后续信息不在当前 TS 中。
/// 1bit
///
public byte EITPresentFollowingFlag { get; set; } = 0x00;
///
/// 运行状态
/// 对于一个 NVOD 业务,running_status 的值都置“0”
/// 3bit
///
internal TS_SDT_Service_RunningStatus RunningStatus { get; set; }
///
/// 自由条件接收模式
/// 置“0”时,表示业务的所有组件都未被加扰
/// 置“1”时,表示一路或多路码流的接收由 CA 系统控制。
/// 1bit
///
internal byte FreeCAMode { get; set; } = 0x00;
///
/// 描述符循环长度
/// 指出从本字段的下一个字节开始的描述符的总字节长度。
/// 12bit
///
public ushort DescriptorsLoopLength { get; set; }
public List Descriptors { get; set; }
public void ToBuffer(ref TSMessagePackWriter writer)
{
writer.WriteUInt16(ServiceId);
writer.WriteByte((byte)(ReservedFutureUse << 2 | EITScheduleFlag << 1 | EITPresentFollowingFlag));
writer.Skip(2, out var position);
foreach (var descriptor in Descriptors)
{
descriptor.ToBuffer(ref writer);
}
DescriptorsLoopLength = (ushort)(writer.GetCurrentPosition() - position-2);
writer.WriteUInt16Return((ushort)((ushort)RunningStatus << 13 | (ushort)FreeCAMode << 12 | DescriptorsLoopLength), position);
}
}
}