Skip to content

Commit 55f9577

Browse files
webcam: infinite captures works
1 parent d5a1127 commit 55f9577

File tree

1 file changed

+6
-61
lines changed

1 file changed

+6
-61
lines changed

c_mpos/src/webcam.c

Lines changed: 6 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
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
3131
typedef 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-
401346
static MP_DEFINE_CONST_DICT(webcam_module_globals, webcam_module_globals_table);
402347

403348
// Webcam type definition

0 commit comments

Comments
 (0)