Skip to content

Commit 34ee0fa

Browse files
committed
Improvement (untested)
1 parent 5a65c13 commit 34ee0fa

File tree

2 files changed

+22
-15
lines changed

2 files changed

+22
-15
lines changed

.github/workflows/ESP32.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ on:
77
- 'src/**'
88
- '.github/workflows/*.yml'
99
tags-ignore:
10-
- '**'
10+
- 'v*'
1111
pull_request:
1212
branches:
1313
- master

src/modcamera.c

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)