mirror of https://bitbucket.org/ausocean/av.git
Improving handling of send errors
This commit is contained in:
parent
6f602479e2
commit
ab31f0bd67
|
@ -71,6 +71,9 @@ const (
|
||||||
rtmpConnectionTimout = 10
|
rtmpConnectionTimout = 10
|
||||||
outputChanSize = 10000
|
outputChanSize = 10000
|
||||||
cameraRetryPeriod = 5 * time.Second
|
cameraRetryPeriod = 5 * time.Second
|
||||||
|
sendFailedDelay = 5
|
||||||
|
maxSendFailedErrorCount = 500
|
||||||
|
clipsSizeThreshold = 11
|
||||||
)
|
)
|
||||||
|
|
||||||
// Log Types
|
// Log Types
|
||||||
|
@ -115,6 +118,7 @@ type revid struct {
|
||||||
sendClip func(clip []byte) error
|
sendClip func(clip []byte) error
|
||||||
rtmpInst rtmp.RTMPSession
|
rtmpInst rtmp.RTMPSession
|
||||||
mutex sync.Mutex
|
mutex sync.Mutex
|
||||||
|
currentBitrate int64
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewRevid returns a pointer to a new revid with the desired
|
// NewRevid returns a pointer to a new revid with the desired
|
||||||
|
@ -135,6 +139,12 @@ func NewRevid(config Config) (r *revid, err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns the currently saved bitrate from the most recent bitrate check
|
||||||
|
// check bitrate output delay in consts for this period
|
||||||
|
func (r *revid) GetBitrate() int64 {
|
||||||
|
return r.currentBitrate
|
||||||
|
}
|
||||||
|
|
||||||
// GetConfigRef returns a pointer to the revidInst's Config struct object
|
// GetConfigRef returns a pointer to the revidInst's Config struct object
|
||||||
func (r *revid) GetConfigRef() *Config {
|
func (r *revid) GetConfigRef() *Config {
|
||||||
return &r.config
|
return &r.config
|
||||||
|
@ -357,13 +367,21 @@ func (r *revid) outputClips() {
|
||||||
if clip, err := r.ringBuffer.Read(); err == nil {
|
if clip, err := r.ringBuffer.Read(); err == nil {
|
||||||
bytes += len(clip)
|
bytes += len(clip)
|
||||||
errorCount := 0
|
errorCount := 0
|
||||||
for err := r.sendClip(clip); err != nil; errorCount++ {
|
err := r.sendClip(clip)
|
||||||
if len(clip) >= 11 {
|
for ; err != nil; errorCount++ {
|
||||||
r.Log(Warning, "Send failed trying again!")
|
r.Log(Warning, "Send failed trying again!")
|
||||||
|
// If the clip size is not bigger than the threshold then we classify
|
||||||
|
// it as junk and we don't try to send it off again.
|
||||||
|
if len(clip) >= clipSizeThreshold {
|
||||||
err = r.sendClip(clip)
|
err = r.sendClip(clip)
|
||||||
} else {
|
} else {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
// So that we don't fill up the log, once we reach the maxSendFailedErrorCount
|
||||||
|
// we will add some delay to slow things down until we have a connection again
|
||||||
|
if errorCount > maxSendFailedErrorCount {
|
||||||
|
time.Sleep(time.Duration(sendFailedDelay) * time.Second)
|
||||||
|
}
|
||||||
r.Log(Error, err.Error())
|
r.Log(Error, err.Error())
|
||||||
if r.config.Output == NativeRtmp && errorCount > 5 {
|
if r.config.Output == NativeRtmp && errorCount > 5 {
|
||||||
r.reboot()
|
r.reboot()
|
||||||
|
@ -378,7 +396,8 @@ func (r *revid) outputClips() {
|
||||||
now = time.Now()
|
now = time.Now()
|
||||||
deltaTime := now.Sub(prevTime)
|
deltaTime := now.Sub(prevTime)
|
||||||
if deltaTime > time.Duration(bitrateTime)*time.Second {
|
if deltaTime > time.Duration(bitrateTime)*time.Second {
|
||||||
r.Log(Info, fmt.Sprintf("Bitrate: %v bits/s\n", int64(float64(bytes*8)/float64(deltaTime/1e9))))
|
r.currentBitrate = int64(float64(bytes*8)/float64(deltaTime/1e9)))
|
||||||
|
r.Log(Info, fmt.Sprintf("Bitrate: %v bits/s\n", r.currentBitrate )
|
||||||
r.Log(Info, fmt.Sprintf("Ring buffer size: %v\n", r.ringBuffer.GetNoOfElements()))
|
r.Log(Info, fmt.Sprintf("Ring buffer size: %v\n", r.ringBuffer.GetNoOfElements()))
|
||||||
prevTime = now
|
prevTime = now
|
||||||
bytes = 0
|
bytes = 0
|
||||||
|
|
Loading…
Reference in New Issue