revid: add v4l properties and fix default device handling

Also fix logging typos found during work.
This commit is contained in:
Dan Kortschak 2019-01-17 16:04:04 +10:30
parent 7d989a17f2
commit 35d63f664f
3 changed files with 39 additions and 12 deletions

View File

@ -148,10 +148,10 @@ func handleFlags() revid.Config {
} }
switch *inputPtr { switch *inputPtr {
case "Webcam":
cfg.Input = revid.Webcam
case "Raspivid": case "Raspivid":
cfg.Input = revid.Raspivid cfg.Input = revid.Raspivid
case "v4l":
cfg.Input = revid.V4L
case "File": case "File":
cfg.Input = revid.File cfg.Input = revid.File
case "": case "":

View File

@ -75,6 +75,7 @@ type Config struct {
const ( const (
NothingDefined = iota NothingDefined = iota
Raspivid Raspivid
V4L
H264Codec H264Codec
File File
Http Http
@ -94,7 +95,6 @@ const (
Udp Udp
MpegtsRtp MpegtsRtp
Rtp Rtp
Webcam
) )
// Default config settings // Default config settings
@ -132,9 +132,7 @@ func (c *Config) Validate(r *Revid) error {
} }
switch c.Input { switch c.Input {
case Raspivid: case Raspivid, V4L, File:
case File:
case Webcam:
case NothingDefined: case NothingDefined:
c.Logger.Log(logger.Warning, pkg+"no input type defined, defaulting", "input", c.Logger.Log(logger.Warning, pkg+"no input type defined, defaulting", "input",
defaultInput) defaultInput)

View File

@ -246,10 +246,10 @@ func (r *Revid) reset(config Config) error {
} }
switch r.config.Input { switch r.config.Input {
case Webcam:
r.setupInput = r.startWebcam
case Raspivid: case Raspivid:
r.setupInput = r.startRaspivid r.setupInput = r.startRaspivid
case V4L:
r.setupInput = r.startV4L
case File: case File:
r.setupInput = r.setupInputForFile r.setupInput = r.setupInputForFile
} }
@ -367,10 +367,10 @@ loop:
if err == nil { if err == nil {
r.config.Logger.Log(logger.Debug, pkg+"sent clip to output "+strconv.Itoa(i)) r.config.Logger.Log(logger.Debug, pkg+"sent clip to output "+strconv.Itoa(i))
} else if r.config.SendRetry == false { } else if r.config.SendRetry == false {
r.config.Logger.Log(logger.Warning, pkg+"send to output "+strconv.Itoa(i)+"failed", "error", err.Error()) r.config.Logger.Log(logger.Warning, pkg+"send to output "+strconv.Itoa(i)+" failed", "error", err.Error())
} else { } else {
r.config.Logger.Log(logger.Error, pkg+"send to output "+strconv.Itoa(i)+ r.config.Logger.Log(logger.Error, pkg+"send to output "+strconv.Itoa(i)+
"failed, trying again", "error", err.Error()) " failed, trying again", "error", err.Error())
err = dest.send() err = dest.send()
if err != nil && chunk.Len() > 11 { if err != nil && chunk.Len() > 11 {
r.config.Logger.Log(logger.Error, pkg+"second send attempted failed, restarting connection", "error", err.Error()) r.config.Logger.Log(logger.Error, pkg+"second send attempted failed, restarting connection", "error", err.Error())
@ -479,9 +479,38 @@ func (r *Revid) startRaspivid() error {
return err return err
} }
func (r *Revid) startWebcam() error { func (r *Revid) startV4L() error {
const defaultVideo = "/dev/video0"
r.config.Logger.Log(logger.Info, pkg+"starting webcam") r.config.Logger.Log(logger.Info, pkg+"starting webcam")
r.cmd = exec.Command("ffmpeg", "-i", r.config.InputFileName, "-r", "25", "-f", "h264", "-") if r.config.InputFileName == "" {
r.config.Logger.Log(logger.Info, pkg+"using default video device", "device", defaultVideo)
r.config.InputFileName = defaultVideo
}
args := []string{
"-i", r.config.InputFileName,
"-f", "h264",
"-r", fmt.Sprint(r.config.FrameRate),
}
switch {
case r.config.FlipHorizontal && r.config.FlipVertical:
args = append(args, "-vf", "hflip,vflip")
case r.config.FlipHorizontal:
args = append(args, "-vf", "hflip")
case r.config.FlipVertical:
args = append(args, "-vf", "vflip")
}
args = append(args,
"-b:v", fmt.Sprint(r.config.Bitrate),
"-maxrate", fmt.Sprint(r.config.Bitrate),
"-bufsize", fmt.Sprint(r.config.Bitrate/2),
"-s", fmt.Sprintf("%dx%d", r.config.Width, r.config.Height),
"-",
)
r.config.Logger.Log(logger.Info, pkg+"ffmpeg args", "args", strings.Join(args, " "))
r.cmd = exec.Command("ffmpeg", args...)
delay := time.Second / time.Duration(r.config.FrameRate) delay := time.Second / time.Duration(r.config.FrameRate)
stdout, err := r.cmd.StdoutPipe() stdout, err := r.cmd.StdoutPipe()