diff --git a/stream/mts/psi/psi.go b/stream/mts/psi/psi.go index 3047106f..05cd2c3e 100644 --- a/stream/mts/psi/psi.go +++ b/stream/mts/psi/psi.go @@ -5,6 +5,8 @@ const ( DescDefLen = 2 PMTDefLen = 4 PATLen = 4 + TSSDefLen = 5 + PSIDefLen = 3 ) // Program specific information @@ -16,17 +18,17 @@ type PSI struct { 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 + crc uint32 // crc32 of entire table excluding pointer field, pointer filler bytes and the trailing CRC32 } // Table syntax section type TSS struct { - tie uint16 // Table ID extension - v byte // Version number - cni bool // Current/next indicator - sn byte // Section number - lsn byte // Last section number - sd SD // Specific data PAT/PMT - crc []byte // crc32 of entire table excluding pointer field, pointer filler bytes and the trailing CRC32 + tide uint16 // Table ID extension + v byte // Version number + cni bool // Current/next indicator + sn byte // Section number + lsn byte // Last section number + sd SD // Specific data PAT/PMT } // Specific Data, (could be PAT or PMT) @@ -63,15 +65,35 @@ type Desc struct { dd []byte // Descriptor data } +// TODO: Implement this func ReadPSI(data []byte) *PSI { return nil } -func (p *PSI) Bytes() (out []byte) { +func (p *PSI) Bytes() []byte { + l := 1 + len(p.pfb) + out := make([]byte, l+PSIDefLen) + out[0] = p.pf + for i, b := range p.pfb { + out[1+i] = b + } + out[l] = p.tid + out[l+1] = 0x80 | 0x40 | 0x30 | (0x03 & byte(p.sl>>8)) + out[l+2] = byte(p.sl) + out = append(out, p.tss.Bytes()...) + crc32 := crc32_op() return nil } -func (t *TSS) Fill(s []byte) { +func (t *TSS) Bytes() []byte { + out := make([]byte, TSSDefLen) + out[0] = byte(t.tide >> 8) + out[1] = byte(t.tide) + out[2] = 0xc0 | (0x3e & (t.v << 1)) | (0x01 & boolToByte(t.cni)) + out[3] = t.sn + out[4] = t.lsn + out = append(out, t.sd.Bytes()...) + return out } func (p *PAT) Bytes() []byte { @@ -118,3 +140,10 @@ func (e *ESSD) Bytes() []byte { } return out } + +func boolToByte(b bool) byte { + if b { + return 0x01 + } + return 0x00 +}