2017-12-11 08:20:24 +03:00
|
|
|
/*
|
|
|
|
NAME
|
|
|
|
MpegTs.go - provides a data structure intended to encapsulate the properties
|
|
|
|
of an MpegTs packet.
|
|
|
|
|
|
|
|
DESCRIPTION
|
|
|
|
See Readme.md
|
|
|
|
|
|
|
|
AUTHOR
|
|
|
|
Saxon Nelson-Milton <saxon.milton@gmail.com>
|
|
|
|
|
|
|
|
LICENSE
|
|
|
|
MpegTs.go is Copyright (C) 2017 the Australian Ocean Lab (AusOcean)
|
|
|
|
|
|
|
|
It is free software: you can redistribute it and/or modify them
|
|
|
|
under the terms of the GNU General Public License as published by the
|
|
|
|
Free Software Foundation, either version 3 of the License, or (at your
|
|
|
|
option) any later version.
|
2017-12-11 07:54:49 +03:00
|
|
|
|
2017-12-11 08:20:24 +03:00
|
|
|
It is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with revid in gpl.txt. If not, see [GNU licenses](http://www.gnu.org/licenses).
|
|
|
|
*/
|
|
|
|
|
|
|
|
package packet
|
2017-12-11 07:54:49 +03:00
|
|
|
|
2017-12-11 09:38:09 +03:00
|
|
|
import (
|
|
|
|
"strconv"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Length of some fields in bits
|
|
|
|
const (
|
|
|
|
SyncByteLength = 8
|
|
|
|
TEILength = 1
|
|
|
|
PUSILength = 1
|
|
|
|
PriorityLength = 1
|
|
|
|
PIDLength = 13
|
|
|
|
TSCLength = 2
|
|
|
|
AFCLength = 2
|
|
|
|
CCLength = 4
|
|
|
|
)
|
|
|
|
|
|
|
|
// Index of the fields
|
|
|
|
const (
|
|
|
|
SyncByteIndex = 0
|
|
|
|
TEIIndex = SyncByteIndex + SyncByteLength
|
|
|
|
PUSIIndex = TEIIndex + TEILength
|
|
|
|
PriorityIndex = PUSIIndex + PUSILength
|
|
|
|
PIDIndex = PriorityIndex + PriorityLength
|
|
|
|
TSCIndex = PIDIndex + PIDLength
|
|
|
|
AFCIndex = TSCIndex + TSCLength
|
|
|
|
CCIndex = AFCIndex + AFCLength
|
|
|
|
AFIndex = CCIndex + CCLength
|
|
|
|
)
|
|
|
|
|
2017-12-11 07:54:49 +03:00
|
|
|
type MpegTsPacket struct {
|
2017-12-11 09:38:09 +03:00
|
|
|
SyncByte byte
|
|
|
|
TEI bool // Transport Error Indicator
|
|
|
|
PUSI bool // Payload Unit Start Indicator
|
|
|
|
Priority bool
|
|
|
|
PID int
|
|
|
|
TSC byte // Transport Scrambling Control
|
|
|
|
AFC byte // Adaption Field Control
|
|
|
|
CC int // Continuity Counter
|
|
|
|
AF []byte // Adaption Field
|
|
|
|
Payload []byte
|
2017-12-11 08:20:24 +03:00
|
|
|
}
|
|
|
|
|
2017-12-12 02:10:30 +03:00
|
|
|
func boolToByte( in bool ) (out uint){
|
2017-12-11 09:48:46 +03:00
|
|
|
if in { out = 1 }
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-12-12 02:10:30 +03:00
|
|
|
// bool to int, shift accordigly, int to string, string binary to int
|
|
|
|
func (p *MpegTsPacket) toByteSlice() (output [188]byte) {
|
2017-12-11 09:38:09 +03:00
|
|
|
output[0] = p.SyncByte
|
2017-12-12 02:10:30 +03:00
|
|
|
output[1] =( boolToByte(TEI) << (8-TEIIndex%8) ) | ( boolToByte(PUSI) << (8-PUSIIndex%8) ) |
|
|
|
|
( boolToByte(Priority) << (8-PriorityIndex%8) )
|
2017-12-11 07:54:49 +03:00
|
|
|
}
|