Add mpegts Reader

This commit is contained in:
Alexey Khit
2023-02-13 15:45:26 +03:00
parent a22c33fd4e
commit 830baafffe
3 changed files with 275 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
package mpegts
import (
"time"
)
const (
PacketSize = 188
SyncByte = 0x47
)
const (
StreamTypeH264 = 0x1B
StreamTypePCMA = 0x90
)
type Packet struct {
StreamType byte
PTS time.Duration
DTS time.Duration
Payload []byte
}
// PES - Packetized Elementary Stream
type PES struct {
StreamType byte
StreamID byte
Payload []byte
}
func (p *PES) Packet() *Packet {
// parse Optional PES header
const minHeaderSize = 3
pkt := &Packet{StreamType: p.StreamType}
// fist byte also flags
flags := p.Payload[1]
hSize := p.Payload[2] // optional fields
const hasPTS = 0b1000_0000
if flags&hasPTS != 0 {
pkt.PTS = ParseTime(p.Payload[minHeaderSize:])
const hasDTS = 0b0100_0000
if flags&hasDTS != 0 {
pkt.DTS = ParseTime(p.Payload[minHeaderSize+5:])
}
}
pkt.Payload = p.Payload[minHeaderSize+hSize:]
return pkt
}
func ParseTime(b []byte) time.Duration {
ts := (uint64(b[0]) >> 1 & 0x7 << 30) | (uint64(b[1]) << 22) | (uint64(b[2]) >> 1 & 0x7F << 15) | (uint64(b[3]) << 7) | (uint64(b[4]) >> 1 & 0x7F)
return time.Duration(ts)
}