container/mts: using RealTime type from utils package instead of global vars with mutator functions

This commit is contained in:
Saxon 2019-08-26 13:29:07 +09:30
parent 24e9ed69ca
commit e57e14678a
2 changed files with 41 additions and 74 deletions

View File

@ -29,7 +29,6 @@ import (
"fmt" "fmt"
"io" "io"
"strconv" "strconv"
"sync"
"time" "time"
"bitbucket.org/ausocean/av/codec/h264" "bitbucket.org/ausocean/av/codec/h264"
@ -37,8 +36,43 @@ import (
"bitbucket.org/ausocean/av/container/mts/meta" "bitbucket.org/ausocean/av/container/mts/meta"
"bitbucket.org/ausocean/av/container/mts/pes" "bitbucket.org/ausocean/av/container/mts/pes"
"bitbucket.org/ausocean/av/container/mts/psi" "bitbucket.org/ausocean/av/container/mts/psi"
"bitbucket.org/ausocean/utils/realtime"
) )
// Media type values.
// TODO: reference relevant specifications.
const (
H264ID = 27
H265ID = 36
audioStreamID = 0xc0 // First audio stream ID.
)
// Constants used to communicate which media codec will be packetized.
const (
EncodeH264 = iota
EncodeH265
EncodeAudio
)
// Time-related constants.
const (
// ptsOffset is the offset added to the clock to determine
// the current presentation timestamp.
ptsOffset = 700 * time.Millisecond
// PCRFrequency is the base Program Clock Reference frequency in Hz.
PCRFrequency = 90000
// PTSFrequency is the presentation timestamp frequency in Hz.
PTSFrequency = 90000
// MaxPTS is the largest PTS value (i.e., for a 33-bit unsigned integer).
MaxPTS = (1 << 33) - 1
)
// If we are not using NAL based PSI intervals then we will send PSI every 7 packets.
const psiSendCount = 7
// Some common manifestations of PSI. // Some common manifestations of PSI.
var ( var (
// StandardPAT is a minimal PAT. // StandardPAT is a minimal PAT.
@ -77,87 +111,20 @@ var (
} }
) )
const (
psiInterval = 1 * time.Second
psiSendCount = 7
)
// Meta allows addition of metadata to encoded mts from outside of this pkg. // Meta allows addition of metadata to encoded mts from outside of this pkg.
// See meta pkg for usage. // See meta pkg for usage.
// //
// TODO: make this not global. // TODO: make this not global.
var Meta *meta.Data var Meta *meta.Data
// This will help us obtain a realtime for timestamp meta encoding.
var RealTime = realtime.NewRealTime()
var ( var (
patTable = StandardPAT.Bytes() patTable = StandardPAT.Bytes()
pmtTable []byte pmtTable []byte
) )
const (
H264ID = 27
H265ID = 36
audioStreamID = 0xc0 // First audio stream ID.
)
// Constants used to communicate which media codec will be packetized.
const (
EncodeH264 = iota
EncodeH265
EncodeAudio
)
// Time-related constants.
const (
// ptsOffset is the offset added to the clock to determine
// the current presentation timestamp.
ptsOffset = 700 * time.Millisecond
// PCRFrequency is the base Program Clock Reference frequency in Hz.
PCRFrequency = 90000
// PTSFrequency is the presentation timestamp frequency in Hz.
PTSFrequency = 90000
// MaxPTS is the largest PTS value (i.e., for a 33-bit unsigned integer).
MaxPTS = (1 << 33) - 1
)
// Globals for use in keeping real time.
var (
realRefTime time.Time // Holds a reference real time given to SetTime.
sysRefTime time.Time // Holds a system reference time set when realRefTime is obtained.
timeIsSet bool // Indicates if the time has been set.
mu = sync.Mutex{} // Used when accessing/mutating above time vars.
)
// SetTime allows setting of current time. This is useful if the system running
// this encoder does not have time keeping. The user may wish to obtain an
// accurate time from an NTP server or local machine and pass to this function.
func SetTime(t time.Time) {
mu.Lock()
realRefTime = t
sysRefTime = time.Now()
timeIsSet = true
mu.Unlock()
}
// Time provides either a real time that has been calculated from a reference
// set by SetTime, or using the current system time.
func Time() time.Time {
mu.Lock()
t := realRefTime.Add(time.Now().Sub(sysRefTime))
mu.Unlock()
return t
}
// TimeIsSet returns true if SetTime has been used to set a real reference time.
func TimeIsSet() bool {
mu.Lock()
b := timeIsSet
mu.Unlock()
return b
}
// Encoder encapsulates properties of an MPEG-TS generator. // Encoder encapsulates properties of an MPEG-TS generator.
type Encoder struct { type Encoder struct {
dst io.WriteCloser dst io.WriteCloser
@ -373,8 +340,8 @@ func (e *Encoder) ccFor(pid int) byte {
// contained in the global Meta struct. // contained in the global Meta struct.
func updateMeta(b []byte) ([]byte, error) { func updateMeta(b []byte) ([]byte, error) {
p := psi.PSIBytes(b) p := psi.PSIBytes(b)
if TimeIsSet() { if RealTime.IsSet() {
Meta.Add("ts", strconv.Itoa(int(Time().Unix()))) Meta.Add("ts", strconv.Itoa(int(RealTime.Get().Unix())))
} }
err := p.AddDescriptor(psi.MetadataTag, Meta.Encode()) err := p.AddDescriptor(psi.MetadataTag, Meta.Encode())
return []byte(p), err return []byte(p), err

View File

@ -118,7 +118,7 @@ func extractMeta(r string, log func(lvl int8, msg string, args ...interface{}))
log(logger.Warning, pkg+"No timestamp in reply") log(logger.Warning, pkg+"No timestamp in reply")
} else { } else {
log(logger.Debug, fmt.Sprintf("%v got timestamp: %v", pkg, t)) log(logger.Debug, fmt.Sprintf("%v got timestamp: %v", pkg, t))
mts.SetTime(time.Unix(int64(t), 0)) mts.RealTime.Set(time.Unix(int64(t), 0))
} }
// Extract location from reply // Extract location from reply