-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
73 lines (64 loc) · 1.61 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package main
import (
"bufio"
"context"
"flag"
"fmt"
"log"
"net/http"
"os"
"strings"
)
func maybefail(err error, xf string, args ...interface{}) {
if err == nil {
return
}
fmt.Fprintf(os.Stderr, xf+"\n", args...)
os.Exit(1)
}
var defaultcmd = `{"cmd":["libcamera-vid", "-t", "60000", "-n", "--framerate", "7", "--codec", "mjpeg", "--awb", "auto", "--width", "1920", "--height", "1080", "-o", "-"], "retry":"500ms"}`
func main() {
var cmd string
flag.StringVar(&cmd, "cmd", defaultcmd, "json {\"cmd\":[], \"retry\":\"1000ms\"}, may be json literal or filename or \"-\" for stdin json")
var addr string
flag.StringVar(&addr, "addr", ":8412", "host:port for http serving")
flag.Parse()
ctx := context.Background()
if len(cmd) == 0 {
fmt.Fprintf(os.Stderr, "-cmd is required")
os.Exit(1)
}
var source *commandMJPEGSource
var err error
if cmd == "-" {
source, err = JsonCmd(ctx, os.Stdin)
maybefail(err, "stdin: %v", err)
} else if cmd[0] == '{' {
source, err = JsonCmd(ctx, strings.NewReader(cmd))
maybefail(err, "-cmd: %v", err)
} else {
jsf, err := os.Open(cmd)
maybefail(err, "%s: %v", cmd, err)
source, err = JsonCmd(ctx, jsf)
maybefail(err, "%s: %v", cmd, err)
}
source.Init()
go source.Run()
br := bufio.NewReader(source)
jpegBlobs := make(chan []byte, 1)
go func() {
me := breakBinaryMJPEGStream(br, jpegBlobs)
fmt.Printf("mjpeg stream err: %v\n", me)
}()
js := jpegServer{
incoming: jpegBlobs,
}
go js.reader(nil)
server := &http.Server{
Addr: addr,
Handler: &js,
}
log.Printf("serving on %s", addr)
err = server.ListenAndServe()
maybefail(err, "http: %v", err)
}