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:
Saxon Milton 2022-09-01 05:58:45 +00:00
commit f9fddcf0e8
3 changed files with 20 additions and 20 deletions

View File

@ -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

View File

@ -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,

View File

@ -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: