mirror of https://bitbucket.org/ausocean/av.git
added video buffer and improved logging
This commit is contained in:
parent
18b9a3dbab
commit
014230a274
|
@ -55,6 +55,7 @@ USAGE
|
|||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"os"
|
||||
"runtime/pprof"
|
||||
|
@ -72,7 +73,6 @@ import (
|
|||
"bitbucket.org/ausocean/av/turbidity"
|
||||
"bitbucket.org/ausocean/iot/pi/netlogger"
|
||||
"bitbucket.org/ausocean/iot/pi/netsender"
|
||||
"bitbucket.org/ausocean/iot/pi/sds"
|
||||
"bitbucket.org/ausocean/utils/logger"
|
||||
)
|
||||
|
||||
|
@ -135,6 +135,7 @@ type turbidityProbe struct {
|
|||
ticker time.Ticker
|
||||
ts *turbidity.TurbiditySensor
|
||||
log logger.Logger
|
||||
buffer *bytes.Buffer
|
||||
}
|
||||
|
||||
// NewTurbidityProbe returns a new turbidity probe.
|
||||
|
@ -143,6 +144,7 @@ func NewTurbidityProbe(log logger.Logger, delay time.Duration) (*turbidityProbe,
|
|||
tp.log = log
|
||||
tp.delay = delay
|
||||
tp.ticker = *time.NewTicker(delay)
|
||||
tp.buffer = bytes.NewBuffer(*new([]byte))
|
||||
|
||||
// Create the turbidity sensor.
|
||||
standard := gocv.IMRead("../../turbidity/images/template.jpg", gocv.IMReadGrayScale)
|
||||
|
@ -158,6 +160,7 @@ func NewTurbidityProbe(log logger.Logger, delay time.Duration) (*turbidityProbe,
|
|||
// Write, reads input h264 frames in the form of a byte stream and writes the the sharpness and contrast
|
||||
// scores of a video to the the turbidity probe.
|
||||
func (tp *turbidityProbe) Write(p []byte) (int, error) {
|
||||
tp.buffer.Write(p)
|
||||
select {
|
||||
case <-tp.ticker.C:
|
||||
var imgs []gocv.Mat
|
||||
|
@ -170,12 +173,12 @@ func (tp *turbidityProbe) Write(p []byte) (int, error) {
|
|||
return len(p), err
|
||||
}
|
||||
defer os.Remove(file.Name())
|
||||
_, err = file.Write(p)
|
||||
_, err = file.Write(tp.buffer.Bytes())
|
||||
if err != nil {
|
||||
tp.log.Error("failed to write to temporary file", "error", err.Error())
|
||||
return len(p), err
|
||||
}
|
||||
|
||||
tp.buffer.Reset()
|
||||
// Read the file and store each frame.
|
||||
vc, err := gocv.VideoCaptureFile(file.Name())
|
||||
if err != nil {
|
||||
|
@ -185,11 +188,15 @@ func (tp *turbidityProbe) Write(p []byte) (int, error) {
|
|||
for vc.Read(&img) && len(imgs) < maxImages {
|
||||
imgs = append(imgs, img.Clone())
|
||||
}
|
||||
if len(imgs) <= 0 {
|
||||
tp.log.Log(logger.Info, "no frames found")
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
// Process video data to get saturation and contrast scores.
|
||||
res, err := tp.ts.Evaluate(imgs)
|
||||
if err != nil {
|
||||
tp.log.Error("evaluate failed", "errror", err.Error())
|
||||
tp.log.Error("evaluate failed", "error", err.Error())
|
||||
return len(p), err
|
||||
}
|
||||
tp.contrast = stat.Mean(res.Contrast, nil)
|
||||
|
@ -236,7 +243,7 @@ func main() {
|
|||
p, err := NewTurbidityProbe(*log, 60*time.Second)
|
||||
|
||||
log.Log(logger.Debug, "initialising netsender client")
|
||||
ns, err := netsender.New(log, nil, readPin(p, rv), nil, createVarMap())
|
||||
ns, err := netsender.New(log, nil, readPin(p, rv, log), nil, createVarMap())
|
||||
if err != nil {
|
||||
log.Log(logger.Fatal, pkg+"could not initialise netsender client: "+err.Error())
|
||||
}
|
||||
|
@ -375,7 +382,7 @@ func sleep(ns *netsender.Sender, l *logger.Logger) {
|
|||
|
||||
// readPin provides a callback function of consistent signature for use by
|
||||
// netsender to retrieve software defined pin values e.g. revid bitrate.
|
||||
func readPin(p *turbidityProbe, rv *revid.Revid) func(pin *netsender.Pin) error {
|
||||
func readPin(p *turbidityProbe, rv *revid.Revid, l *logger.Logger) func(pin *netsender.Pin) error {
|
||||
return func(pin *netsender.Pin) error {
|
||||
switch {
|
||||
case pin.Name == bitratePin:
|
||||
|
@ -383,16 +390,16 @@ func readPin(p *turbidityProbe, rv *revid.Revid) func(pin *netsender.Pin) error
|
|||
if rv != nil {
|
||||
pin.Value = rv.Bitrate()
|
||||
}
|
||||
case pin.Name[0] == 'X':
|
||||
return sds.ReadSystem(pin)
|
||||
case pin.Name == sharpnessPin:
|
||||
pin.Value = -1
|
||||
if p != nil {
|
||||
l.Debug("setting sharpness value", "sharpness", p.sharpness*1000)
|
||||
pin.Value = int(p.sharpness * 1000)
|
||||
}
|
||||
case pin.Name == contrastPin:
|
||||
pin.Value = -1
|
||||
if p != nil {
|
||||
l.Debug("setting contrast pin", "contrast", p.contrast)
|
||||
pin.Value = int(p.contrast * 100)
|
||||
}
|
||||
default:
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
NAME
|
||||
audio_OSX.go
|
||||
audio_darwin.go
|
||||
|
||||
AUTHORS
|
||||
Russell Stanley <russell@ausocean.org>
|
Loading…
Reference in New Issue