diff --git a/camera.go b/camera.go index 642b35a..0163e83 100644 --- a/camera.go +++ b/camera.go @@ -58,7 +58,6 @@ func (camera *Camera) SetFrameBuffer(buffer []byte) error { if len(buffer) < size { return fmt.Errorf("buffer size %d is smaller than frame size %d", len(buffer), size) } - camera.framebuffer = buffer return nil } @@ -95,6 +94,7 @@ func NewCamera(stream int) (*Camera, error) { if err := camera.getCameraData(device); err != nil { return nil, err } + return camera, nil } @@ -148,18 +148,21 @@ func (camera *Camera) getCameraData(device string) error { if err != nil { return err } + cmd := exec.Command( "ffmpeg", "-hide_banner", "-f", webcamDeviceName, "-i", device, ) + // The command will fail since we do not give a file to write to, therefore // it will write the meta data to Stderr. pipe, err := cmd.StderrPipe() if err != nil { return err } + // Start the command. if err := cmd.Start(); err != nil { return err @@ -233,11 +236,13 @@ func (camera *Camera) Read() bool { return false } } + total := 0 for total < camera.width*camera.height*camera.depth { n, _ := (*camera.pipe).Read(camera.framebuffer[total:]) total += n } + return true } diff --git a/utils.go b/utils.go index c129b76..c8423f2 100644 --- a/utils.go +++ b/utils.go @@ -29,13 +29,11 @@ func exists(filename string) bool { // Checks if the given program is installed. func installed(program string) error { cmd := exec.Command(program, "-version") - errmsg := fmt.Errorf("%s is not installed", program) - if err := cmd.Start(); err != nil { - return errmsg - } - if err := cmd.Wait(); err != nil { - return errmsg + + if err := cmd.Run(); err != nil { + return fmt.Errorf("%s is not installed", program) } + return nil } @@ -60,6 +58,7 @@ func ffprobe(filename, stype string) ([]map[string]string, error) { if err := cmd.Start(); err != nil { return nil, err } + // Read ffprobe output from Stdout. builder := bytes.Buffer{} buffer := make([]byte, 1024) @@ -70,6 +69,7 @@ func ffprobe(filename, stype string) ([]map[string]string, error) { break } } + // Wait for ffprobe command to complete. if err := cmd.Wait(); err != nil { return nil, err @@ -122,7 +122,6 @@ func webcam() (string, error) { // For webcam streaming on windows, ffmpeg requires a device name. // All device names are parsed and returned by this function. func parseDevices(buffer string) []string { - index := strings.Index(strings.ToLower(buffer), "directshow video device") if index != -1 { buffer = buffer[index:] @@ -189,10 +188,12 @@ func getDevicesWindows() ([]string, error) { "-f", "dshow", "-i", "dummy", ) + pipe, err := cmd.StderrPipe() if err != nil { return nil, err } + if err := cmd.Start(); err != nil { return nil, err } @@ -209,6 +210,7 @@ func getDevicesWindows() ([]string, error) { } cmd.Wait() + devices := parseDevices(builder.String()) return devices, nil } diff --git a/video.go b/video.go index a0738cc..b5715b4 100644 --- a/video.go +++ b/video.go @@ -209,6 +209,7 @@ func (video *Video) init() error { return err } video.pipe = &pipe + if err := cmd.Start(); err != nil { return err } @@ -229,6 +230,7 @@ func (video *Video) Read() bool { return false } } + total := 0 for total < video.width*video.height*video.depth { n, err := (*video.pipe).Read(video.framebuffer[total:]) @@ -238,6 +240,7 @@ func (video *Video) Read() bool { } total += n } + return true } diff --git a/videowriter.go b/videowriter.go index 456c1b9..68edf6c 100644 --- a/videowriter.go +++ b/videowriter.go @@ -280,6 +280,7 @@ func (writer *VideoWriter) init() error { return err } writer.pipe = &pipe + if err := cmd.Start(); err != nil { return err } @@ -295,6 +296,7 @@ func (writer *VideoWriter) Write(frame []byte) error { return err } } + total := 0 for total < len(frame) { n, err := (*writer.pipe).Write(frame[total:]) @@ -303,6 +305,7 @@ func (writer *VideoWriter) Write(frame []byte) error { } total += n } + return nil }