|
|
|
@ -82,57 +82,35 @@ func check64bit(fpath string) error { |
|
|
|
return nil |
|
|
|
return nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func setupSymlink(name string) error { |
|
|
|
|
|
|
|
lib, err := findLibrary(name) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return err |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if runtime.GOARCH == "arm" { |
|
|
|
|
|
|
|
err := check64bit(lib) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return err |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
os.Remove("/dev/shm/" + name + ".so.x.x.x") |
|
|
|
|
|
|
|
return os.Symlink(lib, "/dev/shm/"+name+".so.x.x.x") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var ( |
|
|
|
var ( |
|
|
|
mutex sync.Mutex |
|
|
|
mutex sync.Mutex |
|
|
|
setupped bool |
|
|
|
checked bool |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
func setupLibcameraOnce() error { |
|
|
|
func checkLibraries64Bit() error { |
|
|
|
mutex.Lock() |
|
|
|
mutex.Lock() |
|
|
|
defer mutex.Unlock() |
|
|
|
defer mutex.Unlock() |
|
|
|
|
|
|
|
|
|
|
|
if !setupped { |
|
|
|
if checked { |
|
|
|
err := setupSymlink("libcamera") |
|
|
|
return nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for _, name := range []string{"libcamera", "libcamera-base"} { |
|
|
|
|
|
|
|
lib, err := findLibrary(name) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
return err |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
err = setupSymlink("libcamera-base") |
|
|
|
err = check64bit(lib) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
return err |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
setupped = true |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
checked = true |
|
|
|
return nil |
|
|
|
return nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Cleanup cleanups files created by the camera implementation.
|
|
|
|
|
|
|
|
func Cleanup() { |
|
|
|
|
|
|
|
if setupped { |
|
|
|
|
|
|
|
os.Remove("/dev/shm/libcamera-base.so.x.x.x") |
|
|
|
|
|
|
|
os.Remove("/dev/shm/libcamera.so.x.x.x") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type RPICamera struct { |
|
|
|
type RPICamera struct { |
|
|
|
onData func(time.Duration, [][]byte) |
|
|
|
onData func(time.Duration, [][]byte) |
|
|
|
|
|
|
|
|
|
|
|
@ -148,15 +126,18 @@ func New( |
|
|
|
params Params, |
|
|
|
params Params, |
|
|
|
onData func(time.Duration, [][]byte), |
|
|
|
onData func(time.Duration, [][]byte), |
|
|
|
) (*RPICamera, error) { |
|
|
|
) (*RPICamera, error) { |
|
|
|
err := setupLibcameraOnce() |
|
|
|
if runtime.GOARCH == "arm" { |
|
|
|
if err != nil { |
|
|
|
err := checkLibraries64Bit() |
|
|
|
return nil, err |
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return nil, err |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
c := &RPICamera{ |
|
|
|
c := &RPICamera{ |
|
|
|
onData: onData, |
|
|
|
onData: onData, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var err error |
|
|
|
c.pipeConf, err = newPipe() |
|
|
|
c.pipeConf, err = newPipe() |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
return nil, err |
|
|
|
@ -169,7 +150,6 @@ func New( |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
env := []string{ |
|
|
|
env := []string{ |
|
|
|
"LD_LIBRARY_PATH=/dev/shm", |
|
|
|
|
|
|
|
"PIPE_CONF_FD=" + strconv.FormatInt(int64(c.pipeConf.readFD), 10), |
|
|
|
"PIPE_CONF_FD=" + strconv.FormatInt(int64(c.pipeConf.readFD), 10), |
|
|
|
"PIPE_VIDEO_FD=" + strconv.FormatInt(int64(c.pipeVideo.writeFD), 10), |
|
|
|
"PIPE_VIDEO_FD=" + strconv.FormatInt(int64(c.pipeVideo.writeFD), 10), |
|
|
|
} |
|
|
|
} |
|
|
|
|