@@ -214,38 +214,45 @@ void mp_camera_hal_reconfigure(mp_camera_obj_t *self, mp_camera_framesize_t fram
214214 ESP_LOGI (TAG , "Camera reconfigured successfully" );
215215}
216216
217- static bool mp_camera_convert (mp_obj_t self_in , mp_camera_pixformat_t out_format ) {
218- mp_camera_obj_t * self = MP_OBJ_TO_PTR (self_in );
219- ESP_LOGI (TAG , "Converting image to pixel format: %d" , out_format );
217+ static bool ensure_buffer (mp_camera_obj_t self , size_t req_len ) {
218+ if (self -> converted_buffer .len == req_len ) {
219+ return true;
220+ }
220221
221222 if (self -> converted_buffer .len > 0 || self -> converted_buffer .buf ) {
222223 free (self -> converted_buffer .buf );
224+ }
225+ self -> converted_buffer .buf = (uint8_t * )malloc (req_len );
226+ if (!self -> converted_buffer .buf ) {
223227 self -> converted_buffer .len = 0 ;
224- self -> converted_buffer .buf = NULL ;
228+ ESP_LOGE (TAG , "converted_buffer malloc failed" );
229+ return false;
225230 }
231+ self -> converted_buffer .len = req_len ;
232+ return true;
233+ }
234+
235+ static bool mp_camera_convert (mp_camera_obj_t self , mp_camera_pixformat_t out_format ) {
236+ ESP_LOGI (TAG , "Converting image to pixel format: %d" , out_format );
226237
227238 switch (out_format ) {
228239 case PIXFORMAT_JPEG :
229240 return frame2jpg (self -> captured_buffer , self -> camera_config .jpeg_quality , self -> converted_buffer .buf , & self -> converted_buffer .len );
230241
231242 case PIXFORMAT_RGB888 :
232- self -> converted_buffer .len = self -> captured_buffer -> width * self -> captured_buffer -> height * 3 ;
233- self -> converted_buffer .buf = (uint8_t * )malloc (self -> converted_buffer .len );
234- if (!self -> converted_buffer .buf ) {
235- ESP_LOGE (TAG , "converted_buffer malloc failed" );
243+ if (ensure_buffer (self , self -> captured_buffer -> width * self -> captured_buffer -> height * 3 )) {
244+ return fmt2rgb888 (self -> captured_buffer -> buf , self -> captured_buffer -> len , self -> captured_buffer -> format , self -> converted_buffer .buf );
245+ } else {
236246 return false;
237247 }
238- return fmt2rgb888 (self -> captured_buffer -> buf , self -> captured_buffer -> len , self -> captured_buffer -> format , self -> converted_buffer .buf );
239248
240249 case PIXFORMAT_RGB565 :
241250 if (self -> camera_config .pixel_format == PIXFORMAT_JPEG ) {
242- self -> converted_buffer .len = self -> captured_buffer -> width * self -> captured_buffer -> height * 2 ;
243- self -> converted_buffer .buf = (uint8_t * )malloc (self -> converted_buffer .len );
244- if (!self -> converted_buffer .buf ) {
245- ESP_LOGE (TAG , "converted_buffer malloc failed" );
251+ if (ensure_buffer (self , self -> captured_buffer -> width * self -> captured_buffer -> height * 2 )) {
252+ return jpg2rgb565 (self -> captured_buffer -> buf , self -> captured_buffer -> len , self -> converted_buffer .buf , JPG_SCALE_NONE );
253+ } else {
246254 return false;
247255 }
248- return jpg2rgb565 (self -> captured_buffer -> buf , self -> captured_buffer -> len , self -> converted_buffer .buf , JPG_SCALE_NONE );
249256 } else {
250257 mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("Can only convert JPEG to RGB565" ));
251258 }
0 commit comments