@@ -149,6 +149,34 @@ static void deinit_webcam(webcam_obj_t *self) {
149149 self -> fd = -1 ;
150150}
151151
152+ static mp_obj_t recapture_frame (webcam_obj_t * self ) {
153+ struct v4l2_buffer buf = {0 };
154+ buf .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
155+ buf .memory = V4L2_MEMORY_MMAP ;
156+ if (ioctl (self -> fd , VIDIOC_DQBUF , & buf ) < 0 ) {
157+ mp_raise_OSError (MP_EIO );
158+ }
159+
160+ if (!self -> gray_buffer ) {
161+ mp_raise_OSError (MP_ENOMEM );
162+ }
163+
164+ yuyv_to_grayscale_240x240 (self -> buffers [buf .index ], self -> gray_buffer , WIDTH , HEIGHT );
165+
166+ //char filename[32];
167+ //snprintf(filename, sizeof(filename), "frame_%03d.raw", self->frame_count++);
168+ //save_raw(filename, self->gray_buffer, OUTPUT_WIDTH, OUTPUT_HEIGHT);
169+
170+ //mp_obj_t result = mp_obj_new_memoryview(0x01, OUTPUT_WIDTH * OUTPUT_HEIGHT, self->gray_buffer);
171+ mp_obj_t result = mp_const_none ;
172+
173+ if (ioctl (self -> fd , VIDIOC_QBUF , & buf ) < 0 ) {
174+ mp_raise_OSError (MP_EIO );
175+ }
176+
177+ return result ;
178+ }
179+
152180static mp_obj_t capture_frame (webcam_obj_t * self ) {
153181 struct v4l2_buffer buf = {0 };
154182 buf .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
@@ -212,6 +240,16 @@ static mp_obj_t webcam_capture_frame(mp_obj_t self_in) {
212240}
213241MP_DEFINE_CONST_FUN_OBJ_1 (webcam_capture_frame_obj , webcam_capture_frame );
214242
243+ static mp_obj_t webcam_recapture_frame (mp_obj_t self_in ) {
244+ webcam_obj_t * self = MP_OBJ_TO_PTR (self_in );
245+ if (self -> fd < 0 ) {
246+ mp_raise_OSError (MP_EIO );
247+ }
248+ return recapture_frame (self );
249+ }
250+ MP_DEFINE_CONST_FUN_OBJ_1 (webcam_recapture_frame_obj , webcam_recapture_frame );
251+
252+
215253static const mp_obj_type_t webcam_type = {
216254 { & mp_type_type },
217255 .name = MP_QSTR_Webcam ,
@@ -222,6 +260,7 @@ static const mp_rom_map_elem_t mp_module_webcam_globals_table[] = {
222260 { MP_ROM_QSTR (MP_QSTR_Webcam ), MP_ROM_PTR (& webcam_type ) },
223261 { MP_ROM_QSTR (MP_QSTR_init ), MP_ROM_PTR (& webcam_init_obj ) },
224262 { MP_ROM_QSTR (MP_QSTR_capture_frame ), MP_ROM_PTR (& webcam_capture_frame_obj ) },
263+ { MP_ROM_QSTR (MP_QSTR_recapture_frame ), MP_ROM_PTR (& webcam_recapture_frame_obj ) },
225264 { MP_ROM_QSTR (MP_QSTR_deinit ), MP_ROM_PTR (& webcam_deinit_obj ) },
226265};
227266static MP_DEFINE_CONST_DICT (mp_module_webcam_globals , mp_module_webcam_globals_table ) ;
0 commit comments