2018-12-04 08:33:04 +03:00
|
|
|
package psi
|
|
|
|
|
2018-12-05 14:16:06 +03:00
|
|
|
const (
|
|
|
|
ESSDHeadLen = 5
|
|
|
|
DescriptorHeadLen = 2
|
|
|
|
)
|
|
|
|
|
2018-12-04 08:33:04 +03:00
|
|
|
// Program specific information
|
|
|
|
type PSI struct {
|
2018-12-05 12:01:29 +03:00
|
|
|
pf byte // Point field
|
2018-12-05 14:16:06 +03:00
|
|
|
pfb []byte // Pointer filler bytes
|
2018-12-05 12:01:29 +03:00
|
|
|
tid byte // Table ID
|
|
|
|
ssi bool // Sectiopn syntax indicator (1 for PAT, PMT, CAT)
|
|
|
|
pb bool // Private bit (0 for PAT, PMT, CAT)
|
|
|
|
sl uint16 // Section length
|
|
|
|
tss *TSS // Table syntax section (length defined by SL) if length 0 then nil
|
2018-12-04 08:33:04 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Table syntax section
|
|
|
|
type TSS struct {
|
2018-12-05 12:01:29 +03:00
|
|
|
tie uint16 // Table ID extension
|
|
|
|
v byte // Version number
|
|
|
|
cni bool // Current/next indicator
|
|
|
|
sn byte // Section number
|
|
|
|
lsn byte // Last section number
|
2018-12-05 14:16:06 +03:00
|
|
|
sd SD // Specific data PAT/PMT
|
2018-12-05 12:01:29 +03:00
|
|
|
crc []byte // crc32 of entire table excluding pointer field, pointer filler bytes and the trailing CRC32
|
2018-12-04 08:33:04 +03:00
|
|
|
}
|
|
|
|
|
2018-12-05 12:01:29 +03:00
|
|
|
// Specific Data, (could be PAT or PMT)
|
2018-12-04 08:33:04 +03:00
|
|
|
type SD interface {
|
2018-12-05 12:01:29 +03:00
|
|
|
Bytes() []byte
|
2018-12-04 08:33:04 +03:00
|
|
|
}
|
|
|
|
|
2018-12-05 12:01:29 +03:00
|
|
|
// Program association table, implements SD
|
|
|
|
type PAT struct {
|
|
|
|
pn uint16 // Program Number
|
2018-12-05 14:16:06 +03:00
|
|
|
pmpid uint16 // Program map PID
|
|
|
|
}
|
|
|
|
|
|
|
|
// Program mapping table, implements SD
|
|
|
|
type PMT struct {
|
|
|
|
pcrpid uint16 // Program clock reference pid
|
|
|
|
pil uint16 // Program info length
|
|
|
|
pd []Descriptor // Program descriptors
|
|
|
|
essd []ESSD // Elementary stream specific data
|
2018-12-04 08:33:04 +03:00
|
|
|
}
|
|
|
|
|
2018-12-05 14:16:06 +03:00
|
|
|
// Elementary stream specific data
|
|
|
|
type ESSD struct {
|
|
|
|
st byte // Stream type
|
|
|
|
epid byte // Elementary pid
|
|
|
|
esil uint16 // Elementary stream
|
|
|
|
esd []Descriptor // Elementary stream desriptors
|
|
|
|
}
|
|
|
|
|
|
|
|
// Descriptor
|
|
|
|
type Desc struct {
|
2018-12-05 12:01:29 +03:00
|
|
|
dt byte // Descriptor tag
|
|
|
|
dl byte // Descriptor length
|
|
|
|
dd []byte // Descriptor data
|
|
|
|
}
|
|
|
|
|
2018-12-05 14:16:06 +03:00
|
|
|
func ReadPSI(data []byte) *PSI {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *PSI) Bytes() (out []byte) {
|
|
|
|
return nil
|
2018-12-05 12:01:29 +03:00
|
|
|
}
|
|
|
|
|
2018-12-05 14:16:06 +03:00
|
|
|
func (t *TSS) Fill(space []byte) error {
|
2018-12-05 12:01:29 +03:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-12-05 14:16:06 +03:00
|
|
|
func (p *PAT) Fill(space []byte) error {
|
2018-12-05 12:01:29 +03:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-12-05 14:16:06 +03:00
|
|
|
func (p *PMT) Fill(space []byte) error {
|
|
|
|
checkSpace(space)
|
2018-12-05 12:01:29 +03:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-12-05 14:16:06 +03:00
|
|
|
func (d *Descriptor) Fill(space []byte) error {
|
|
|
|
checkSpace(space, DescriptorHeadLen+int(d.dl))
|
|
|
|
space[0] = d.dt
|
|
|
|
space[1] = d.dl
|
|
|
|
copy(space[2:], d.dd)
|
|
|
|
return out
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *ESSD) Fill(space []byte) error {
|
|
|
|
checkSpace(space, ESSDHeadLen+e.esil)
|
2018-12-04 08:33:04 +03:00
|
|
|
return nil
|
|
|
|
}
|
2018-12-05 14:16:06 +03:00
|
|
|
|
|
|
|
func checkSpace(s []byte, c uint) {
|
|
|
|
if s == nil {
|
|
|
|
panic("Slice provided is nil")
|
|
|
|
} else if len(s) != 0 {
|
|
|
|
panic("Slice provided already has something in it")
|
|
|
|
} else if cap(s) != c {
|
|
|
|
panic("Slice provided has wrong capacity")
|
|
|
|
}
|
|
|
|
}
|