@@ -68,29 +68,38 @@ static void resize_640x480_to_240x240(uint8_t *src, uint8_t *dst) {
6868static mp_obj_t webcam_capture_grayscale (mp_obj_t self_in ) {
6969 webcam_obj_t * self = MP_OBJ_TO_PTR (self_in );
7070
71- // Queue the buffer
71+ // Initialize buffer structure
7272 struct v4l2_buffer buf = {0 };
7373 buf .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
7474 buf .memory = V4L2_MEMORY_MMAP ;
7575 buf .index = 0 ;
76+
77+ // Queue the buffer
78+ WEBCAM_DEBUG_PRINT ("webcam: Queuing buffer (index=%d)\n" , buf .index );
7679 if (ioctl (self -> fd , VIDIOC_QBUF , & buf ) < 0 ) {
77- WEBCAM_DEBUG_PRINT ("webcam: Failed to queue buffer for capture\n" );
80+ WEBCAM_DEBUG_PRINT ("webcam: Failed to queue buffer for capture (errno=%d) \n" , errno );
7881 mp_raise_OSError (errno );
7982 }
8083
8184 // Start streaming if not already started
8285 if (!self -> streaming ) {
8386 enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
87+ WEBCAM_DEBUG_PRINT ("webcam: Starting video streaming\n" );
8488 if (ioctl (self -> fd , VIDIOC_STREAMON , & type ) < 0 ) {
85- WEBCAM_DEBUG_PRINT ("webcam: Failed to start video streaming\n" );
89+ WEBCAM_DEBUG_PRINT ("webcam: Failed to start video streaming (errno=%d) \n" , errno );
8690 mp_raise_OSError (errno );
8791 }
8892 self -> streaming = true;
8993 }
9094
9195 // Dequeue the buffer (capture frame)
96+ memset (& buf , 0 , sizeof (buf )); // Clear buffer for dequeue
97+ buf .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
98+ buf .memory = V4L2_MEMORY_MMAP ;
99+ buf .index = 0 ;
100+ WEBCAM_DEBUG_PRINT ("webcam: Dequeuing buffer\n" );
92101 if (ioctl (self -> fd , VIDIOC_DQBUF , & buf ) < 0 ) {
93- WEBCAM_DEBUG_PRINT ("webcam: Failed to dequeue captured frame\n" );
102+ WEBCAM_DEBUG_PRINT ("webcam: Failed to dequeue captured frame (errno=%d) \n" , errno );
94103 mp_raise_OSError (errno );
95104 }
96105
@@ -121,8 +130,13 @@ static mp_obj_t webcam_capture_grayscale(mp_obj_t self_in) {
121130 free (resized_buf );
122131
123132 // Re-queue the buffer for the next capture
133+ memset (& buf , 0 , sizeof (buf )); // Clear buffer for re-queue
134+ buf .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
135+ buf .memory = V4L2_MEMORY_MMAP ;
136+ buf .index = 0 ;
137+ WEBCAM_DEBUG_PRINT ("webcam: Re-queuing buffer (index=%d)\n" , buf .index );
124138 if (ioctl (self -> fd , VIDIOC_QBUF , & buf ) < 0 ) {
125- WEBCAM_DEBUG_PRINT ("webcam: Failed to re-queue buffer after capture\n" );
139+ WEBCAM_DEBUG_PRINT ("webcam: Failed to re-queue buffer after capture (errno=%d) \n" , errno );
126140 mp_raise_OSError (errno );
127141 }
128142
@@ -137,22 +151,25 @@ static mp_obj_t webcam_deinit(mp_obj_t self_in) {
137151 // Stop streaming if active
138152 if (self -> streaming ) {
139153 enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
154+ WEBCAM_DEBUG_PRINT ("webcam: Stopping video streaming\n" );
140155 if (ioctl (self -> fd , VIDIOC_STREAMOFF , & type ) < 0 ) {
141- WEBCAM_DEBUG_PRINT ("webcam: Failed to stop video streaming\n" );
156+ WEBCAM_DEBUG_PRINT ("webcam: Failed to stop video streaming (errno=%d) \n" , errno );
142157 mp_raise_OSError (errno );
143158 }
144159 self -> streaming = false;
145160 }
146161
147162 // Unmap buffer
148163 if (self -> buffer != NULL && self -> buffer != MAP_FAILED ) {
164+ WEBCAM_DEBUG_PRINT ("webcam: Unmapping buffer\n" );
149165 munmap (self -> buffer , self -> buffer_length );
150166 self -> buffer = NULL ;
151167 self -> buffer_length = 0 ;
152168 }
153169
154170 // Close device
155171 if (self -> fd >= 0 ) {
172+ WEBCAM_DEBUG_PRINT ("webcam: Closing device\n" );
156173 close (self -> fd );
157174 self -> fd = -1 ;
158175 }
@@ -171,9 +188,10 @@ static mp_obj_t webcam_init(void) {
171188 self -> streaming = false;
172189
173190 // Open the webcam device
191+ WEBCAM_DEBUG_PRINT ("webcam: Opening device %s\n" , VIDEO_DEVICE );
174192 self -> fd = open (VIDEO_DEVICE , O_RDWR );
175193 if (self -> fd < 0 ) {
176- WEBCAM_DEBUG_PRINT ("webcam: Failed to open device %s\n" , VIDEO_DEVICE );
194+ WEBCAM_DEBUG_PRINT ("webcam: Failed to open device %s (errno=%d) \n" , VIDEO_DEVICE , errno );
177195 mp_raise_OSError (errno );
178196 }
179197
@@ -184,8 +202,9 @@ static mp_obj_t webcam_init(void) {
184202 fmt .fmt .pix .height = CAPTURE_HEIGHT ;
185203 fmt .fmt .pix .pixelformat = V4L2_PIX_FMT_YUYV ;
186204 fmt .fmt .pix .field = V4L2_FIELD_ANY ;
205+ WEBCAM_DEBUG_PRINT ("webcam: Setting format to YUYV %dx%d\n" , CAPTURE_WIDTH , CAPTURE_HEIGHT );
187206 if (ioctl (self -> fd , VIDIOC_S_FMT , & fmt ) < 0 ) {
188- WEBCAM_DEBUG_PRINT ("webcam: Failed to set YUYV format at %dx%d\n" , CAPTURE_WIDTH , CAPTURE_HEIGHT );
207+ WEBCAM_DEBUG_PRINT ("webcam: Failed to set YUYV format at %dx%d (errno=%d) \n" , CAPTURE_WIDTH , CAPTURE_HEIGHT , errno );
189208 close (self -> fd );
190209 mp_raise_OSError (errno );
191210 }
@@ -195,8 +214,9 @@ static mp_obj_t webcam_init(void) {
195214 req .count = 1 ;
196215 req .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
197216 req .memory = V4L2_MEMORY_MMAP ;
217+ WEBCAM_DEBUG_PRINT ("webcam: Requesting one memory-mapped buffer\n" );
198218 if (ioctl (self -> fd , VIDIOC_REQBUFS , & req ) < 0 ) {
199- WEBCAM_DEBUG_PRINT ("webcam: Failed to request memory-mapped buffer\n" );
219+ WEBCAM_DEBUG_PRINT ("webcam: Failed to request memory-mapped buffer (errno=%d) \n" , errno );
200220 close (self -> fd );
201221 mp_raise_OSError (errno );
202222 }
@@ -206,16 +226,18 @@ static mp_obj_t webcam_init(void) {
206226 buf .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
207227 buf .memory = V4L2_MEMORY_MMAP ;
208228 buf .index = 0 ;
229+ WEBCAM_DEBUG_PRINT ("webcam: Querying buffer properties\n" );
209230 if (ioctl (self -> fd , VIDIOC_QUERYBUF , & buf ) < 0 ) {
210- WEBCAM_DEBUG_PRINT ("webcam: Failed to query buffer properties\n" );
231+ WEBCAM_DEBUG_PRINT ("webcam: Failed to query buffer properties (errno=%d) \n" , errno );
211232 close (self -> fd );
212233 mp_raise_OSError (errno );
213234 }
214235
215236 self -> buffer_length = buf .length ;
237+ WEBCAM_DEBUG_PRINT ("webcam: Mapping buffer of length %zu\n" , self -> buffer_length );
216238 self -> buffer = mmap (NULL , buf .length , PROT_READ | PROT_WRITE , MAP_SHARED , self -> fd , buf .m .offset );
217239 if (self -> buffer == MAP_FAILED ) {
218- WEBCAM_DEBUG_PRINT ("webcam: Failed to map buffer memory\n" );
240+ WEBCAM_DEBUG_PRINT ("webcam: Failed to map buffer memory (errno=%d) \n" , errno );
219241 close (self -> fd );
220242 mp_raise_OSError (errno );
221243 }
0 commit comments