2019-11-05 05:06:27 +03:00
|
|
|
/*
|
|
|
|
DESCRIPTION
|
|
|
|
file.go provides an implementation of the AVDevice interface for media files.
|
|
|
|
|
|
|
|
AUTHORS
|
|
|
|
Saxon A. Nelson-Milton <saxon@ausocean.org>
|
|
|
|
|
|
|
|
LICENSE
|
|
|
|
Copyright (C) 2019 the Australian Ocean Lab (AusOcean)
|
|
|
|
|
|
|
|
It is free software: you can redistribute it and/or modify them
|
|
|
|
under the terms of the GNU General Public License as published by the
|
|
|
|
Free Software Foundation, either version 3 of the License, or (at your
|
|
|
|
option) any later version.
|
|
|
|
|
|
|
|
It is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
in gpl.txt. If not, see http://www.gnu.org/licenses.
|
|
|
|
*/
|
|
|
|
|
2019-11-06 09:57:10 +03:00
|
|
|
package file
|
2019-11-05 05:06:27 +03:00
|
|
|
|
|
|
|
import (
|
2019-11-05 12:44:04 +03:00
|
|
|
"errors"
|
2019-11-05 05:06:27 +03:00
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"os"
|
2019-11-06 09:57:10 +03:00
|
|
|
|
|
|
|
"bitbucket.org/ausocean/av/revid/config"
|
2019-11-05 05:06:27 +03:00
|
|
|
)
|
|
|
|
|
2019-11-05 12:44:04 +03:00
|
|
|
// AVFile is an implementation of the AVDevice interface for a file containg
|
|
|
|
// audio or video data.
|
2019-11-05 05:06:27 +03:00
|
|
|
type AVFile struct {
|
|
|
|
f io.ReadCloser
|
2019-11-06 09:57:10 +03:00
|
|
|
cfg config.Config
|
2019-11-05 05:06:27 +03:00
|
|
|
}
|
|
|
|
|
2019-11-05 12:44:04 +03:00
|
|
|
// NewAVFile returns a new AVFile.
|
2019-11-12 08:34:07 +03:00
|
|
|
func New() *AVFile { return &AVFile{} }
|
2019-11-05 05:06:27 +03:00
|
|
|
|
2019-11-22 03:25:13 +03:00
|
|
|
// Name returns the name of the device.
|
|
|
|
func (m *AVFile) Name() string {
|
|
|
|
return "File"
|
|
|
|
}
|
|
|
|
|
2019-11-05 12:44:04 +03:00
|
|
|
// Set simply sets the AVFile's config to the passed config.
|
2019-11-06 09:57:10 +03:00
|
|
|
func (m *AVFile) Set(c config.Config) error {
|
2019-11-05 05:06:27 +03:00
|
|
|
m.cfg = c
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2019-11-05 12:44:04 +03:00
|
|
|
// Start will open the file at the location of the InputPath field of the
|
|
|
|
// config struct.
|
2019-11-05 05:06:27 +03:00
|
|
|
func (m *AVFile) Start() error {
|
|
|
|
var err error
|
|
|
|
m.f, err = os.Open(m.cfg.InputPath)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("could not open media file: %w", err)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
2019-11-05 12:44:04 +03:00
|
|
|
|
|
|
|
// Stop will close the file such that any further reads will fail.
|
|
|
|
func (m *AVFile) Stop() error { return m.f.Close() }
|
|
|
|
|
|
|
|
// Read implements io.Reader. If start has not been called, or Start has been
|
|
|
|
// called and Stop has since been called, an error is returned.
|
|
|
|
func (m *AVFile) Read(p []byte) (int, error) {
|
|
|
|
if m.f != nil {
|
|
|
|
return m.f.Read(p)
|
|
|
|
}
|
|
|
|
return 0, errors.New("AV file is closed")
|
|
|
|
}
|