2323#define CAPTURE_HEIGHT 480
2424#define OUTPUT_WIDTH 240 // Resize to 240x240
2525#define OUTPUT_HEIGHT 240
26- #define NUM_BUFFERS 3 // Use 5 buffers, as it achieved 5 captures
27- #define QUEUE_RETRIES 3 // Number of retry attempts for queueing
28- #define QUEUE_RETRY_DELAY_US 100000 // 100ms delay between retries
26+ #define NUM_BUFFERS 2 // Revert to 2 buffers, as it achieved 2 captures
27+ #define QUEUE_RETRIES 10 // Increase retries for robustness
28+ #define QUEUE_RETRY_DELAY_US 200000 // 200ms delay between retries
2929
3030// Webcam object type
3131typedef struct _webcam_obj_t {
@@ -81,26 +81,8 @@ static void webcam_reset_streaming(webcam_obj_t *self) {
8181 self -> streaming = false;
8282 }
8383
84- // Re-queue all buffers
85- for (size_t i = 0 ; i < self -> num_buffers ; i ++ ) {
86- struct v4l2_buffer buf = {0 };
87- buf .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
88- buf .memory = V4L2_MEMORY_MMAP ;
89- buf .index = i ;
90-
91- // Query buffer state
92- WEBCAM_DEBUG_PRINT ("webcam: Querying buffer state during reset (index=%zu)\n" , i );
93- if (ioctl (self -> fd , VIDIOC_QUERYBUF , & buf ) < 0 ) {
94- WEBCAM_DEBUG_PRINT ("webcam: Failed to query buffer state (index=%zu, errno=%d)\n" , i , errno );
95- continue ;
96- }
97-
98- // Queue buffer
99- WEBCAM_DEBUG_PRINT ("webcam: Re-queuing buffer during reset (index=%zu)\n" , i );
100- if (ioctl (self -> fd , VIDIOC_QBUF , & buf ) < 0 ) {
101- WEBCAM_DEBUG_PRINT ("webcam: Failed to re-queue buffer during reset (index=%zu, errno=%d)\n" , i , errno );
102- }
103- }
84+ // Delay to allow device to settle
85+ usleep (100000 ); // 100ms delay
10486
10587 // Restart streaming
10688 enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
@@ -126,13 +108,6 @@ static mp_obj_t webcam_capture_grayscale(mp_obj_t self_in) {
126108 buf .memory = V4L2_MEMORY_MMAP ;
127109 buf .index = i ;
128110
129- // Query buffer state
130- WEBCAM_DEBUG_PRINT ("webcam: Querying buffer state (index=%zu, attempt=%d)\n" , i , attempt + 1 );
131- if (ioctl (self -> fd , VIDIOC_QUERYBUF , & buf ) < 0 ) {
132- WEBCAM_DEBUG_PRINT ("webcam: Failed to query buffer state (index=%zu, errno=%d)\n" , i , errno );
133- continue ;
134- }
135-
136111 WEBCAM_DEBUG_PRINT ("webcam: Attempting to queue buffer (index=%zu, attempt=%d)\n" , i , attempt + 1 );
137112 if (ioctl (self -> fd , VIDIOC_QBUF , & buf ) == 0 ) {
138113 WEBCAM_DEBUG_PRINT ("webcam: Successfully queued buffer (index=%zu)\n" , i );
@@ -143,7 +118,7 @@ static mp_obj_t webcam_capture_grayscale(mp_obj_t self_in) {
143118 }
144119 if (!queued && attempt < QUEUE_RETRIES - 1 ) {
145120 WEBCAM_DEBUG_PRINT ("webcam: No buffers available, retrying after delay\n" );
146- usleep (QUEUE_RETRY_DELAY_US ); // Wait 100ms
121+ usleep (QUEUE_RETRY_DELAY_US ); // Wait 200ms
147122 }
148123 }
149124
@@ -157,12 +132,6 @@ static mp_obj_t webcam_capture_grayscale(mp_obj_t self_in) {
157132 buf .memory = V4L2_MEMORY_MMAP ;
158133 buf .index = i ;
159134
160- WEBCAM_DEBUG_PRINT ("webcam: Querying buffer state after reset (index=%zu)\n" , i );
161- if (ioctl (self -> fd , VIDIOC_QUERYBUF , & buf ) < 0 ) {
162- WEBCAM_DEBUG_PRINT ("webcam: Failed to query buffer state after reset (index=%zu, errno=%d)\n" , i , errno );
163- continue ;
164- }
165-
166135 WEBCAM_DEBUG_PRINT ("webcam: Attempting to queue buffer after reset (index=%zu)\n" , i );
167136 if (ioctl (self -> fd , VIDIOC_QBUF , & buf ) == 0 ) {
168137 WEBCAM_DEBUG_PRINT ("webcam: Successfully queued buffer after reset (index=%zu)\n" , i );
@@ -231,10 +200,6 @@ static mp_obj_t webcam_capture_grayscale(mp_obj_t self_in) {
231200 buf .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
232201 buf .memory = V4L2_MEMORY_MMAP ;
233202 buf .index = buf_index ;
234- WEBCAM_DEBUG_PRINT ("webcam: Querying buffer state before re-queue (index=%zu)\n" , buf_index );
235- if (ioctl (self -> fd , VIDIOC_QUERYBUF , & buf ) < 0 ) {
236- WEBCAM_DEBUG_PRINT ("webcam: Failed to query buffer state before re-queue (index=%zu, errno=%d)\n" , buf_index , errno );
237- }
238203 WEBCAM_DEBUG_PRINT ("webcam: Re-queuing buffer (index=%zu)\n" , buf_index );
239204 if (ioctl (self -> fd , VIDIOC_QBUF , & buf ) < 0 ) {
240205 WEBCAM_DEBUG_PRINT ("webcam: Failed to re-queue buffer (index=%zu, errno=%d)\n" , buf_index , errno );
@@ -365,23 +330,6 @@ static mp_obj_t webcam_init(void) {
365330 close (self -> fd );
366331 mp_raise_OSError (errno );
367332 }
368-
369- // Queue buffer upfront
370- memset (& buf , 0 , sizeof (buf ));
371- buf .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
372- buf .memory = V4L2_MEMORY_MMAP ;
373- buf .index = i ;
374- WEBCAM_DEBUG_PRINT ("webcam: Initial queuing of buffer %zu\n" , i );
375- if (ioctl (self -> fd , VIDIOC_QBUF , & buf ) < 0 ) {
376- WEBCAM_DEBUG_PRINT ("webcam: Failed to queue buffer %zu initially (errno=%d)\n" , i , errno );
377- for (size_t j = 0 ; j <= i ; j ++ ) {
378- if (self -> buffers [j ].start != NULL ) {
379- munmap (self -> buffers [j ].start , self -> buffers [j ].length );
380- }
381- }
382- close (self -> fd );
383- mp_raise_OSError (errno );
384- }
385333 }
386334
387335 return mp_obj_new_tuple (3 , (mp_obj_t []){MP_OBJ_FROM_PTR (self ), MP_OBJ_FROM_PTR (& webcam_capture_grayscale_obj ), MP_OBJ_FROM_PTR (& webcam_deinit_obj )});
@@ -395,9 +343,6 @@ static const mp_rom_map_elem_t webcam_module_globals_table[] = {
395343 { MP_ROM_QSTR (MP_QSTR_capture_grayscale ), MP_ROM_PTR (& webcam_capture_grayscale_obj ) },
396344 { MP_ROM_QSTR (MP_QSTR_deinit ), MP_ROM_PTR (& webcam_deinit_obj ) },
397345};
398-
399-
400-
401346static MP_DEFINE_CONST_DICT (webcam_module_globals , webcam_module_globals_table ) ;
402347
403348// Webcam type definition
0 commit comments