mirror of https://bitbucket.org/ausocean/av.git
stream/mts: undo changes to encoder.go
stream/rtp/encoder.go: undoing changes
This commit is contained in:
parent
383b2962af
commit
7951575771
|
@ -30,9 +30,9 @@ package mts
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
"sync"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"bitbucket.org/ausocean/av/stream/mts/meta"
|
||||||
"bitbucket.org/ausocean/av/stream/mts/pes"
|
"bitbucket.org/ausocean/av/stream/mts/pes"
|
||||||
"bitbucket.org/ausocean/av/stream/mts/psi"
|
"bitbucket.org/ausocean/av/stream/mts/psi"
|
||||||
)
|
)
|
||||||
|
@ -82,93 +82,21 @@ var (
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// standardPmtTimeLocation is a standard PMT with time and location
|
|
||||||
// descriptors, but time and location fields zeroed out.
|
|
||||||
standardPmtTimeLocation = psi.PSI{
|
|
||||||
Pf: 0x00,
|
|
||||||
Tid: 0x02,
|
|
||||||
Ssi: true,
|
|
||||||
Sl: 0x3e,
|
|
||||||
Tss: &psi.TSS{
|
|
||||||
Tide: 0x01,
|
|
||||||
V: 0,
|
|
||||||
Cni: true,
|
|
||||||
Sn: 0,
|
|
||||||
Lsn: 0,
|
|
||||||
Sd: &psi.PMT{
|
|
||||||
Pcrpid: 0x0100,
|
|
||||||
Pil: psi.PmtTimeLocationPil,
|
|
||||||
Pd: []psi.Desc{
|
|
||||||
{
|
|
||||||
Dt: psi.TimeDescTag,
|
|
||||||
Dl: psi.TimeDataSize,
|
|
||||||
Dd: make([]byte, psi.TimeDataSize),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Dt: psi.LocationDescTag,
|
|
||||||
Dl: psi.LocationDataSize,
|
|
||||||
Dd: make([]byte, psi.LocationDataSize),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Essd: &psi.ESSD{
|
|
||||||
St: 0x1b,
|
|
||||||
Epid: 0x0100,
|
|
||||||
Esil: 0x00,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
psiInterval = 1 * time.Second
|
psiInterval = 1 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
// timeLocation holds time and location data
|
// Meta allows addition of metadata to encoded mts from outside of this pkg.
|
||||||
type timeLocation struct {
|
// See meta pkg for usage.
|
||||||
mu sync.RWMutex
|
//
|
||||||
time uint64
|
// TODO: make this not global.
|
||||||
location string
|
var Meta *meta.Data
|
||||||
}
|
|
||||||
|
|
||||||
// SetTimeStamp sets the time field of a TimeLocation.
|
|
||||||
func (tl *timeLocation) SetTimeStamp(t uint64) {
|
|
||||||
tl.mu.Lock()
|
|
||||||
tl.time = t
|
|
||||||
tl.mu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetTimeStamp returns the location of a TimeLocation.
|
|
||||||
func (tl *timeLocation) TimeStamp() uint64 {
|
|
||||||
tl.mu.RLock()
|
|
||||||
t := tl.time
|
|
||||||
tl.mu.RUnlock()
|
|
||||||
return t
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetLocation sets the location of a TimeLocation.
|
|
||||||
func (tl *timeLocation) SetLocation(l string) {
|
|
||||||
tl.mu.Lock()
|
|
||||||
tl.location = l
|
|
||||||
tl.mu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetLocation returns the location of a TimeLocation.
|
|
||||||
func (tl *timeLocation) Location() string {
|
|
||||||
tl.mu.RLock()
|
|
||||||
l := tl.location
|
|
||||||
tl.mu.RUnlock()
|
|
||||||
return l
|
|
||||||
}
|
|
||||||
|
|
||||||
// MetData will hold time and location data which may be set externally if
|
|
||||||
// this data is available. It is then inserted into mpegts packets outputted.
|
|
||||||
var MetaData timeLocation
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
patTable = standardPat.Bytes()
|
patTable = standardPat.Bytes()
|
||||||
pmtTable = standardPmtTimeLocation.Bytes()
|
pmtTable = standardPmt.Bytes()
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -288,33 +216,27 @@ func (e *Encoder) writePSI() error {
|
||||||
// Write PAT.
|
// Write PAT.
|
||||||
patPkt := Packet{
|
patPkt := Packet{
|
||||||
PUSI: true,
|
PUSI: true,
|
||||||
PID: patPid,
|
PID: PatPid,
|
||||||
CC: e.ccFor(patPid),
|
CC: e.ccFor(PatPid),
|
||||||
AFC: hasPayload,
|
AFC: HasPayload,
|
||||||
Payload: patTable,
|
Payload: psi.AddPadding(patTable),
|
||||||
}
|
}
|
||||||
_, err := e.dst.Write(patPkt.Bytes(e.tsSpace[:PacketSize]))
|
_, err := e.dst.Write(patPkt.Bytes(e.tsSpace[:PacketSize]))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
pmtTable, err = updateMeta(pmtTable)
|
||||||
// Update pmt table time and location.
|
|
||||||
err = psi.UpdateTime(pmtTable, MetaData.TimeStamp())
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = psi.UpdateLocation(pmtTable, MetaData.Location())
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create mts packet from pmt table.
|
// Create mts packet from pmt table.
|
||||||
pmtPkt := Packet{
|
pmtPkt := Packet{
|
||||||
PUSI: true,
|
PUSI: true,
|
||||||
PID: pmtPid,
|
PID: PmtPid,
|
||||||
CC: e.ccFor(pmtPid),
|
CC: e.ccFor(PmtPid),
|
||||||
AFC: hasPayload,
|
AFC: HasPayload,
|
||||||
Payload: pmtTable,
|
Payload: psi.AddPadding(pmtTable),
|
||||||
}
|
}
|
||||||
_, err = e.dst.Write(pmtPkt.Bytes(e.tsSpace[:PacketSize]))
|
_, err = e.dst.Write(pmtPkt.Bytes(e.tsSpace[:PacketSize]))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -345,3 +267,11 @@ func (e *Encoder) ccFor(pid int) byte {
|
||||||
e.continuity[pid] = (cc + 1) & continuityCounterMask
|
e.continuity[pid] = (cc + 1) & continuityCounterMask
|
||||||
return cc
|
return cc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// updateMeta adds/updates a metaData descriptor in the given psi bytes using data
|
||||||
|
// contained in the global Meta struct.
|
||||||
|
func updateMeta(b []byte) ([]byte, error) {
|
||||||
|
p := psi.PSIBytes(b)
|
||||||
|
err := p.AddDescriptor(psi.MetadataTag, Meta.Encode())
|
||||||
|
return []byte(p), err
|
||||||
|
}
|
||||||
|
|
|
@ -73,8 +73,8 @@ func NewEncoder(dst io.Writer, fps int) *Encoder {
|
||||||
func (e *Encoder) Write(data []byte) (int, error) {
|
func (e *Encoder) Write(data []byte) (int, error) {
|
||||||
e.buffer = append(e.buffer, data...)
|
e.buffer = append(e.buffer, data...)
|
||||||
for len(e.buffer) >= sendLen {
|
for len(e.buffer) >= sendLen {
|
||||||
e.Encode(e.buffer)
|
e.Encode(e.buffer[:sendLen])
|
||||||
e.buffer = e.buffer[:0]
|
e.buffer = e.buffer[sendLen:]
|
||||||
}
|
}
|
||||||
return len(data), nil
|
return len(data), nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue