@@ -32,15 +32,18 @@ uint32_t FrameBuffer::getBufferSize() {
3232    if  (this ->vbuf ) {
3333        return  this ->vbuf ->bytesused ;
3434    }
35+     return  0 ;
3536}
3637
3738uint8_t * FrameBuffer::getBuffer () {
3839    if  (this ->vbuf ) {
3940        return  this ->vbuf ->buffer ;
4041    }
42+     return  nullptr ;
4143}
4244
43- Camera::Camera () : vdev(NULL ), byte_swap(false ), yuv_to_gray(false ) {
45+ Camera::Camera () : vdev(NULL ), byte_swap(false ), yuv_to_gray(false ),
46+          snapshot_mode(CONFIG_VIDEO_BUFFER_POOL_NUM_MAX <= 1 ) {
4447	for  (size_t  i = 0 ; i < ARRAY_SIZE (this ->vbuf ); i++) {
4548		this ->vbuf [i] = NULL ;
4649    }
@@ -95,6 +98,7 @@ bool Camera::begin(uint32_t width, uint32_t height, uint32_t crop_width, uint32_
9598
9699    //  Set format.
97100    static  struct  video_format  fmt = {
101+         .type  = VIDEO_BUF_TYPE_OUTPUT,
98102        .pixelformat  = pixformat,
99103        .width  = width,
100104        .height  = height,
@@ -124,6 +128,16 @@ bool Camera::begin(uint32_t width, uint32_t height, uint32_t crop_width, uint32_
124128    //  this should compute the sizes needed.
125129    video_get_format (this ->vdev , &fmt);
126130
131+ 
132+     //  If we are in snapshot mode, try starting the video stream with no buffers
133+     //  to tell it that we want snapshot...
134+     if  (snapshot_mode) {
135+         if  (video_stream_start (this ->vdev , VIDEO_BUF_TYPE_OUTPUT)) {
136+             Serial.println (" Snapshot mode Failed to start capture" 
137+             // return false;
138+         }
139+     }
140+ 
127141	//  Allocate video buffers.
128142	for  (size_t  i = 0 ; i < ARRAY_SIZE (this ->vbuf ); i++) {
129143		this ->vbuf [i] = video_buffer_aligned_alloc (fmt.pitch  * fmt.height ,
@@ -137,11 +151,12 @@ bool Camera::begin(uint32_t width, uint32_t height, uint32_t crop_width, uint32_
137151	}
138152
139153	//  Start video capture
140- 	if  (video_stream_start (this ->vdev , VIDEO_BUF_TYPE_OUTPUT)) {
141-         Serial.println (" Failed to start capture" 
142- 		return  false ;
143- 	}
144- 
154+     if  (!snapshot_mode) {
155+     	if  (video_stream_start (this ->vdev , VIDEO_BUF_TYPE_OUTPUT)) {
156+             Serial.println (" Failed to start capture" 
157+     		return  false ;
158+     	}
159+     }
145160    return  true ;
146161}
147162
@@ -179,7 +194,7 @@ bool Camera::releaseFrame(FrameBuffer &fb) {
179194
180195    int  ret;
181196    // printk("Camera::ReleaseFrame called\n");
182-     if  (ret = video_enqueue (this ->vdev , fb.vbuf )) {
197+     if  (( ret = video_enqueue (this ->vdev , fb.vbuf )) !=  0 ) {
183198        printk (" Failed to enqueue buffer %d\n " 
184199        return  false ;
185200	}
@@ -226,22 +241,28 @@ int Camera::getSelection(struct video_selection *sel) {
226241 * 
227242 * @param snapshot_mode pointer to Turn Snaphsot mode on or off.. 
228243 */  
229- int  Camera::getSnapshotMode (bool  *snapshot_mode) {            
230-     #if  DT_HAS_CHOSEN(zephyr_camera)
231-     this ->vdev  = DEVICE_DT_GET (DT_CHOSEN (zephyr_camera));
232-     #endif 
233-     return  video_get_snapshot_mode (vdev, snapshot_mode);
244+ bool  Camera::getSnapshotMode () {
245+     return  snapshot_mode;
234246}
235247
236248/* *
237-  * @brief Function pointer type for video_set_snapshot_mode() 
249+  * @brief returns if snapshot mode is turned on or off. 
250+  *  
251+  * Must be called before begin to take effect. 
252+  *  
253+  * @param snap_shot mode if true. 
238254 * 
239-  * @param snapshot_mode Turn Snaphsot mode on or off. . 
255+  * @retval 0 is successful . 
240256 */  
241- int  Camera::setSnapshotMode (bool  snapshot_mode) {
242-     #if  DT_HAS_CHOSEN(zephyr_camera)
243-     this ->vdev  = DEVICE_DT_GET (DT_CHOSEN (zephyr_camera));
244-     #endif 
245-     return  video_set_snapshot_mode (vdev, snapshot_mode);
257+ int  Camera::setSnapshotMode (bool  snap_shot) {
258+     if  (snap_shot) {
259+         snapshot_mode = snap_shot;
260+         return  0 ;
261+     } else  {
262+         #if  CONFIG_VIDEO_BUFFER_POOL_NUM_MAX <= 1
263+         return  -EINVAL;
264+         #endif 
265+         snapshot_mode = snap_shot;
266+         return  0 ;
267+     }
246268}
247- 
0 commit comments