forked from asticode/go-astits
-
Notifications
You must be signed in to change notification settings - Fork 0
/
data_sdt.go
70 lines (57 loc) · 2.05 KB
/
data_sdt.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package astits
// Running statuses
const (
RunningStatusNotRunning = 1
RunningStatusPausing = 3
RunningStatusRunning = 4
RunningStatusServiceOffAir = 5
RunningStatusStartsInAFewSeconds = 2
RunningStatusUndefined = 0
)
// SDTData represents an SDT data
// Page: 33 | Chapter: 5.2.3 | Link: https://www.dvb.org/resources/public/standards/a38_dvb-si_specification.pdf
type SDTData struct {
OriginalNetworkID uint16
Services []*SDTDataService
TransportStreamID uint16
}
// SDTDataService represents an SDT data service
type SDTDataService struct {
Descriptors []*Descriptor
HasEITPresentFollowing bool // When true indicates that EIT present/following information for the service is present in the current TS
HasEITSchedule bool // When true indicates that EIT schedule information for the service is present in the current TS
HasFreeCSAMode bool // When true indicates that access to one or more streams may be controlled by a CA system.
RunningStatus uint8
ServiceID uint16
}
// parseSDTSection parses an SDT section
func parseSDTSection(i []byte, offset *int, offsetSectionsEnd int, tableIDExtension uint16) (d *SDTData) {
// Init
d = &SDTData{TransportStreamID: tableIDExtension}
// Original network ID
d.OriginalNetworkID = uint16(i[*offset])<<8 | uint16(i[*offset+1])
*offset += 2
// Reserved for future use
*offset += 1
// Loop until end of section data is reached
for *offset < offsetSectionsEnd {
// Service ID
var s = &SDTDataService{}
s.ServiceID = uint16(i[*offset])<<8 | uint16(i[*offset+1])
*offset += 2
// EIT schedule flag
s.HasEITSchedule = uint8(i[*offset]&0x2) > 0
// EIT present/following flag
s.HasEITPresentFollowing = uint8(i[*offset]&0x1) > 0
*offset += 1
// Running status
s.RunningStatus = uint8(i[*offset]) >> 5
// Free CA mode
s.HasFreeCSAMode = uint8(i[*offset]&0x10) > 0
// Descriptors
s.Descriptors = parseDescriptors(i, offset)
// Append service
d.Services = append(d.Services, s)
}
return
}