@@ -107,7 +107,7 @@ static int init_webcam(webcam_obj_t *self, const char *device) {
107107 buf .memory = V4L2_MEMORY_MMAP ;
108108 buf .index = i ;
109109 if (ioctl (self -> fd , VIDIOC_QBUF , & buf ) < 0 ) {
110- fprintf (stderr , "Cannot queue buffer: %s\n" , strerror (errno ));
110+ fprintf (stderr , "Cannot queue buffer: %s\n" , strerror (errno ));
111111 return -1 ;
112112 }
113113 }
@@ -149,6 +149,14 @@ static void deinit_webcam(webcam_obj_t *self) {
149149 self -> fd = -1 ;
150150}
151151
152+ static mp_obj_t free_buffer (webcam_obj_t * self ) {
153+ if (self -> gray_buffer ) {
154+ free (self -> gray_buffer );
155+ self -> gray_buffer = NULL ;
156+ }
157+ return mp_const_none ;
158+ }
159+
152160static mp_obj_t capture_frame (webcam_obj_t * self ) {
153161 struct v4l2_buffer buf = {0 };
154162 buf .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
@@ -158,7 +166,10 @@ static mp_obj_t capture_frame(webcam_obj_t *self) {
158166 }
159167
160168 if (!self -> gray_buffer ) {
161- mp_raise_OSError (MP_ENOMEM );
169+ self -> gray_buffer = (unsigned char * )malloc (OUTPUT_WIDTH * OUTPUT_HEIGHT );
170+ if (!self -> gray_buffer ) {
171+ mp_raise_OSError (MP_ENOMEM );
172+ }
162173 }
163174
164175 yuyv_to_grayscale_240x240 (self -> buffers [buf .index ], self -> gray_buffer , WIDTH , HEIGHT );
@@ -167,7 +178,7 @@ static mp_obj_t capture_frame(webcam_obj_t *self) {
167178 snprintf (filename , sizeof (filename ), "frame_%03d.raw" , self -> frame_count ++ );
168179 save_raw (filename , self -> gray_buffer , OUTPUT_WIDTH , OUTPUT_HEIGHT );
169180
170- mp_obj_t result = mp_obj_new_memoryview ( 0x01 , OUTPUT_WIDTH * OUTPUT_HEIGHT , self -> gray_buffer );
181+ mp_obj_t result = mp_obj_new_bytes ( self -> gray_buffer , OUTPUT_WIDTH * OUTPUT_HEIGHT );
171182
172183 if (ioctl (self -> fd , VIDIOC_QBUF , & buf ) < 0 ) {
173184 mp_raise_OSError (MP_EIO );
@@ -203,6 +214,12 @@ static mp_obj_t webcam_deinit(mp_obj_t self_in) {
203214}
204215MP_DEFINE_CONST_FUN_OBJ_1 (webcam_deinit_obj , webcam_deinit );
205216
217+ static mp_obj_t webcam_free_buffer (mp_obj_t self_in ) {
218+ webcam_obj_t * self = MP_OBJ_TO_PTR (self_in );
219+ return free_buffer (self );
220+ }
221+ MP_DEFINE_CONST_FUN_OBJ_1 (webcam_free_buffer_obj , webcam_free_buffer );
222+
206223static mp_obj_t webcam_capture_frame (mp_obj_t self_in ) {
207224 webcam_obj_t * self = MP_OBJ_TO_PTR (self_in );
208225 if (self -> fd < 0 ) {
@@ -223,6 +240,7 @@ static const mp_rom_map_elem_t mp_module_webcam_globals_table[] = {
223240 { MP_ROM_QSTR (MP_QSTR_init ), MP_ROM_PTR (& webcam_init_obj ) },
224241 { MP_ROM_QSTR (MP_QSTR_capture_frame ), MP_ROM_PTR (& webcam_capture_frame_obj ) },
225242 { MP_ROM_QSTR (MP_QSTR_deinit ), MP_ROM_PTR (& webcam_deinit_obj ) },
243+ { MP_ROM_QSTR (MP_QSTR_free_buffer ), MP_ROM_PTR (& webcam_free_buffer_obj ) },
226244};
227245static MP_DEFINE_CONST_DICT (mp_module_webcam_globals , mp_module_webcam_globals_table ) ;
228246
0 commit comments