@@ -108,10 +108,11 @@ static void save_raw_rgb565(const char *filename, uint16_t *data, int width, int
108108}
109109
110110static int init_webcam (webcam_obj_t * self , const char * device ) {
111+ //WEBCAM_DEBUG_PRINT("webcam.c: init_webcam\n");
111112 self -> fd = open (device , O_RDWR );
112113 if (self -> fd < 0 ) {
113114 WEBCAM_DEBUG_PRINT ("Cannot open device: %s\n" , strerror (errno ));
114- return -1 ;
115+ return - errno ;
115116 }
116117
117118 struct v4l2_format fmt = {0 };
@@ -123,7 +124,7 @@ static int init_webcam(webcam_obj_t *self, const char *device) {
123124 if (ioctl (self -> fd , VIDIOC_S_FMT , & fmt ) < 0 ) {
124125 WEBCAM_DEBUG_PRINT ("Cannot set format: %s\n" , strerror (errno ));
125126 close (self -> fd );
126- return -1 ;
127+ return - errno ;
127128 }
128129
129130 struct v4l2_requestbuffers req = {0 };
@@ -133,7 +134,7 @@ static int init_webcam(webcam_obj_t *self, const char *device) {
133134 if (ioctl (self -> fd , VIDIOC_REQBUFS , & req ) < 0 ) {
134135 WEBCAM_DEBUG_PRINT ("Cannot request buffers: %s\n" , strerror (errno ));
135136 close (self -> fd );
136- return -1 ;
137+ return - errno ;
137138 }
138139
139140 for (int i = 0 ; i < NUM_BUFFERS ; i ++ ) {
@@ -144,14 +145,14 @@ static int init_webcam(webcam_obj_t *self, const char *device) {
144145 if (ioctl (self -> fd , VIDIOC_QUERYBUF , & buf ) < 0 ) {
145146 WEBCAM_DEBUG_PRINT ("Cannot query buffer: %s\n" , strerror (errno ));
146147 close (self -> fd );
147- return -1 ;
148+ return - errno ;
148149 }
149150 self -> buffer_length = buf .length ;
150151 self -> buffers [i ] = mmap (NULL , buf .length , PROT_READ | PROT_WRITE , MAP_SHARED , self -> fd , buf .m .offset );
151152 if (self -> buffers [i ] == MAP_FAILED ) {
152153 WEBCAM_DEBUG_PRINT ("Cannot map buffer: %s\n" , strerror (errno ));
153154 close (self -> fd );
154- return -1 ;
155+ return - errno ;
155156 }
156157 }
157158
@@ -162,14 +163,14 @@ static int init_webcam(webcam_obj_t *self, const char *device) {
162163 buf .index = i ;
163164 if (ioctl (self -> fd , VIDIOC_QBUF , & buf ) < 0 ) {
164165 WEBCAM_DEBUG_PRINT ("Cannot queue buffer: %s\n" , strerror (errno ));
165- return -1 ;
166+ return - errno ;
166167 }
167168 }
168169
169170 enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
170171 if (ioctl (self -> fd , VIDIOC_STREAMON , & type ) < 0 ) {
171172 WEBCAM_DEBUG_PRINT ("Cannot start streaming: %s\n" , strerror (errno ));
172- return -1 ;
173+ return - errno ;
173174 }
174175
175176 self -> frame_count = 0 ;
@@ -180,7 +181,7 @@ static int init_webcam(webcam_obj_t *self, const char *device) {
180181 free (self -> gray_buffer );
181182 free (self -> rgb565_buffer );
182183 close (self -> fd );
183- return -1 ;
184+ return - errno ;
184185 }
185186 return 0 ;
186187}
@@ -215,12 +216,14 @@ static mp_obj_t free_buffer(webcam_obj_t *self) {
215216}
216217
217218static mp_obj_t capture_frame (mp_obj_t self_in , mp_obj_t format ) {
219+ int res = 0 ;
218220 webcam_obj_t * self = MP_OBJ_TO_PTR (self_in );
219221 struct v4l2_buffer buf = {0 };
220222 buf .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
221223 buf .memory = V4L2_MEMORY_MMAP ;
222- if (ioctl (self -> fd , VIDIOC_DQBUF , & buf ) < 0 ) {
223- mp_raise_OSError (MP_EIO );
224+ res = ioctl (self -> fd , VIDIOC_DQBUF , & buf );
225+ if (res < 0 ) {
226+ mp_raise_OSError (- res );
224227 }
225228
226229 if (!self -> gray_buffer ) {
@@ -243,8 +246,9 @@ static mp_obj_t capture_frame(mp_obj_t self_in, mp_obj_t format) {
243246 // snprintf(filename, sizeof(filename), "frame_%03d.raw", self->frame_count++);
244247 // save_raw(filename, self->gray_buffer, OUTPUT_WIDTH, OUTPUT_HEIGHT);
245248 mp_obj_t result = mp_obj_new_memoryview ('B' , OUTPUT_WIDTH * OUTPUT_HEIGHT , self -> gray_buffer );
246- if (ioctl (self -> fd , VIDIOC_QBUF , & buf ) < 0 ) {
247- mp_raise_OSError (MP_EIO );
249+ res = ioctl (self -> fd , VIDIOC_QBUF , & buf );
250+ if (res < 0 ) {
251+ mp_raise_OSError (- res );
248252 }
249253 return result ;
250254 } else {
@@ -253,8 +257,9 @@ static mp_obj_t capture_frame(mp_obj_t self_in, mp_obj_t format) {
253257 // snprintf(filename, sizeof(filename), "frame_%03d.rgb565", self->frame_count++);
254258 // save_raw_rgb565(filename, self->rgb565_buffer, OUTPUT_WIDTH, OUTPUT_HEIGHT);
255259 mp_obj_t result = mp_obj_new_memoryview ('H' , OUTPUT_WIDTH * OUTPUT_HEIGHT , self -> rgb565_buffer );
256- if (ioctl (self -> fd , VIDIOC_QBUF , & buf ) < 0 ) {
257- mp_raise_OSError (MP_EIO );
260+ res = ioctl (self -> fd , VIDIOC_QBUF , & buf );
261+ if (res < 0 ) {
262+ mp_raise_OSError (- res );
258263 }
259264 return result ;
260265 }
@@ -273,8 +278,9 @@ static mp_obj_t webcam_init(size_t n_args, const mp_obj_t *args) {
273278 self -> gray_buffer = NULL ;
274279 self -> rgb565_buffer = NULL ;
275280
276- if (init_webcam (self , device ) < 0 ) {
277- mp_raise_OSError (MP_EIO );
281+ int res = init_webcam (self , device );
282+ if (res < 0 ) {
283+ mp_raise_OSError (- res );
278284 }
279285
280286 return MP_OBJ_FROM_PTR (self );
0 commit comments