diff --git a/README.md b/README.md index d59470e..50bcfe9 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ FPS() float64 Codec() string AudioCodec() string FrameBuffer() []byte -SetFrameBuffer(buffer []byte) +SetFrameBuffer(buffer []byte) error Read() bool Close() @@ -54,7 +54,7 @@ Depth() int FPS() float64 Codec() string FrameBuffer() []byte -SetFrameBuffer(buffer []byte) +SetFrameBuffer(buffer []byte) error Read() bool Close() diff --git a/camera.go b/camera.go index e955400..4e585bd 100644 --- a/camera.go +++ b/camera.go @@ -51,10 +51,14 @@ func (camera *Camera) FrameBuffer() []byte { return camera.framebuffer } -// Sets the framebuffer to the given byte array. Note that "buffer" must be large enough -// to store one frame of video data which is width*height*3. -func (camera *Camera) SetFrameBuffer(buffer []byte) { +func (camera *Camera) SetFrameBuffer(buffer []byte) error { + size := camera.width * camera.height * camera.depth + if len(buffer) < size { + return fmt.Errorf("buffer size %d is smaller than frame size %d", len(buffer), size) + } + camera.framebuffer = buffer + return nil } // Returns the webcam device name. @@ -200,7 +204,10 @@ func initCamera(camera *Camera) error { return err } - camera.framebuffer = make([]byte, camera.width*camera.height*camera.depth) + if camera.framebuffer == nil { + camera.framebuffer = make([]byte, camera.width*camera.height*camera.depth) + } + return nil } diff --git a/video.go b/video.go index 9368e97..0b05aa4 100644 --- a/video.go +++ b/video.go @@ -72,10 +72,14 @@ func (video *Video) FrameBuffer() []byte { return video.framebuffer } -// Sets the framebuffer to the given byte array. Note that "buffer" must be large enough -// to store one frame of video data which is width*height*3. -func (video *Video) SetFrameBuffer(buffer []byte) { +func (video *Video) SetFrameBuffer(buffer []byte) error { + size := video.width * video.height * video.depth + if len(buffer) < size { + return fmt.Errorf("buffer size %d is smaller than frame size %d", len(buffer), size) + } + video.framebuffer = buffer + return nil } // Creates a new Video struct. @@ -136,7 +140,10 @@ func initVideo(video *Video) error { return err } - video.framebuffer = make([]byte, video.width*video.height*video.depth) + if video.framebuffer == nil { + video.framebuffer = make([]byte, video.width*video.height*video.depth) + } + return nil } diff --git a/vidio_test.go b/vidio_test.go index e2d904f..a2c5c26 100644 --- a/vidio_test.go +++ b/vidio_test.go @@ -12,6 +12,23 @@ func assertEquals(actual, expected interface{}) { } } +func TestSetBuffer(t *testing.T) { + video, err := NewVideo("test/koala.mp4") + if err != nil { + panic(err) + } + defer video.Close() + + size := video.width*video.height*video.depth + 101 + video.SetFrameBuffer(make([]uint8, size)) + + video.Read() + + assertEquals(len(video.framebuffer), size) + + fmt.Println("Set Buffer Test Passed") +} + func TestVideoMetaData(t *testing.T) { video, err := NewVideo("test/koala.mp4") if err != nil {