mirror of https://bitbucket.org/ausocean/av.git
Merged in fix-loop (pull request #483)
revid & device/file: removing Loop mode which was conflicting with Loop variable, and improve file input with logging and robustness Resolves issue #374 Approved-by: Trek Hopton
This commit is contained in:
commit
f9fddcf0e8
|
@ -32,6 +32,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"bitbucket.org/ausocean/av/revid/config"
|
"bitbucket.org/ausocean/av/revid/config"
|
||||||
|
"bitbucket.org/ausocean/utils/logging"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AVFile is an implementation of the AVDevice interface for a file containg
|
// AVFile is an implementation of the AVDevice interface for a file containg
|
||||||
|
@ -40,10 +41,11 @@ type AVFile struct {
|
||||||
f *os.File
|
f *os.File
|
||||||
cfg config.Config
|
cfg config.Config
|
||||||
isRunning bool
|
isRunning bool
|
||||||
|
log logging.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewAVFile returns a new AVFile.
|
// NewAVFile returns a new AVFile.
|
||||||
func New() *AVFile { return &AVFile{} }
|
func New(l logging.Logger) *AVFile { return &AVFile{log: l} }
|
||||||
|
|
||||||
// Name returns the name of the device.
|
// Name returns the name of the device.
|
||||||
func (m *AVFile) Name() string {
|
func (m *AVFile) Name() string {
|
||||||
|
@ -83,20 +85,23 @@ func (m *AVFile) Stop() error {
|
||||||
func (m *AVFile) Read(p []byte) (int, error) {
|
func (m *AVFile) Read(p []byte) (int, error) {
|
||||||
if m.f != nil {
|
if m.f != nil {
|
||||||
n, err := m.f.Read(p)
|
n, err := m.f.Read(p)
|
||||||
if err != nil {
|
if err != nil && err != io.EOF {
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n < len(p) || err == io.EOF) && m.cfg.Loop {
|
||||||
|
m.log.Info("looping input file")
|
||||||
// In the case that we reach end of file but loop is true, we want to
|
// In the case that we reach end of file but loop is true, we want to
|
||||||
// seek to start and keep reading from there.
|
// seek to start and keep reading from there.
|
||||||
if err == io.EOF && m.cfg.Loop {
|
_, err = m.f.Seek(0, io.SeekStart)
|
||||||
_, err = m.f.Seek(0, io.SeekStart)
|
if err != nil {
|
||||||
if err != nil {
|
return 0, fmt.Errorf("could not seek to start of file for input loop: %w", err)
|
||||||
return 0, fmt.Errorf("could not seek to start of file for input loop: %w", err)
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Now that we've seeked to start, let's try reading again.
|
// Now that we've seeked to start, let's try reading again.
|
||||||
n, err = m.f.Read(p)
|
n, err = m.f.Read(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return n, fmt.Errorf("could not read after start seek: %w", err)
|
return n, fmt.Errorf("could not read after start seek: %w", err)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return n, err
|
return n, err
|
||||||
|
|
|
@ -418,13 +418,8 @@ var Variables = []struct {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: KeyMode,
|
Name: KeyMode,
|
||||||
Type: "enum:Normal,Paused,Burst,Loop",
|
Type: "enum:Normal,Paused,Burst",
|
||||||
Update: func(c *Config, v string) {
|
Update: func(c *Config, v string) {},
|
||||||
c.Loop = false
|
|
||||||
if v == KeyLoop {
|
|
||||||
c.Loop = true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: KeyMotionDownscaling,
|
Name: KeyMotionDownscaling,
|
||||||
|
|
|
@ -301,7 +301,7 @@ func (r *Revid) setupPipeline(mtsEnc func(dst io.WriteCloser, rate float64) (io.
|
||||||
|
|
||||||
case config.InputFile:
|
case config.InputFile:
|
||||||
r.cfg.Logger.Debug("using file input")
|
r.cfg.Logger.Debug("using file input")
|
||||||
r.input = file.New()
|
r.input = file.New(r.cfg.Logger)
|
||||||
err = r.setLexer(r.cfg.InputCodec, false)
|
err = r.setLexer(r.cfg.InputCodec, false)
|
||||||
|
|
||||||
case config.InputRTSP:
|
case config.InputRTSP:
|
||||||
|
|
Loading…
Reference in New Issue