Skip to content

Commit 7b1d6b3

Browse files
committed
first beta
1 parent d6b2465 commit 7b1d6b3

File tree

3 files changed

+40
-12
lines changed

3 files changed

+40
-12
lines changed

src/modcamera.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ void mp_camera_hal_reconfigure(mp_camera_obj_t *self, mp_camera_framesize_t fram
247247
}
248248
}
249249

250-
mp_obj_t mp_camera_hal_capture(mp_camera_obj_t *self, int8_t out_format) {
250+
mp_obj_t mp_camera_hal_capture(mp_camera_obj_t *self, mp_camera_pixformat_t out_format) {
251251
if (!self->initialized) {
252252
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("Failed to capture image: Camera not initialized"));
253253
}
@@ -271,7 +271,7 @@ mp_obj_t mp_camera_hal_capture(mp_camera_obj_t *self, int8_t out_format) {
271271
return mp_const_none;
272272
}
273273

274-
if (out_format >= 0 && (mp_camera_pixformat_t)out_format != self->camera_config.pixel_format) {
274+
if (out_format != self->camera_config.pixel_format) {
275275
switch (out_format) {
276276
case PIXFORMAT_JPEG:
277277
if (frame2jpg(self->captured_buffer, self->camera_config.jpeg_quality, &out_buf, &out_len)) {
@@ -297,20 +297,29 @@ mp_obj_t mp_camera_hal_capture(mp_camera_obj_t *self, int8_t out_format) {
297297
return mp_const_none;
298298
}
299299

300-
default:
301-
ESP_LOGI(TAG, "Returning image as bitmap");
302-
if (frame2bmp(self->captured_buffer, &out_buf, &out_len)) {
303-
esp_camera_fb_return(self->captured_buffer);
304-
mp_obj_t result = mp_obj_new_memoryview('b', out_len, out_buf);
305-
return result;
300+
case PIXFORMAT_RGB565:
301+
if(self->camera_config.pixel_format == PIXFORMAT_JPEG){
302+
if (jpg2rgb565(self->captured_buffer->buf, self->captured_buffer->len, out_buf, JPG_SCALE_NONE)) {
303+
esp_camera_fb_return(self->captured_buffer);
304+
mp_obj_t result = mp_obj_new_memoryview('b', out_len, out_buf);
305+
return result;
306+
} else {
307+
return mp_const_none;
308+
}
306309
} else {
310+
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("Can only convert JPEG to RGB565"));
307311
return mp_const_none;
308312
}
313+
314+
default:
315+
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("Unsupported pixel format for conversion"));
316+
return mp_const_none;
317+
309318
}
310319
}
311320

312-
if (self->camera_config.pixel_format == PIXFORMAT_JPEG) {
313-
ESP_LOGI(TAG, "Captured image in JPEG format");
321+
if (self->bmp_out == false) {
322+
ESP_LOGI(TAG, "Returning imgae without conversion");
314323
return mp_obj_new_memoryview('b', self->captured_buffer->len, self->captured_buffer->buf);
315324
} else {
316325
ESP_LOGI(TAG, "Returning image as bitmap");
@@ -319,6 +328,7 @@ mp_obj_t mp_camera_hal_capture(mp_camera_obj_t *self, int8_t out_format) {
319328
mp_obj_t result = mp_obj_new_memoryview('b', out_len, out_buf);
320329
return result;
321330
} else {
331+
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("Failed to convert image to BMP"));
322332
return mp_const_none;
323333
}
324334
}

src/modcamera.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ typedef struct hal_camera_obj {
106106
camera_config_t camera_config;
107107
bool initialized;
108108
camera_fb_t *captured_buffer;
109+
bool bmp_out;
109110
} hal_camera_obj_t;
110111

111112
#endif // CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
@@ -197,7 +198,7 @@ extern void mp_camera_hal_reconfigure(mp_camera_obj_t *self, mp_camera_framesize
197198
* @param out_format Output pixelformat format.
198199
* @return Captured image as micropython object.
199200
*/
200-
extern mp_obj_t mp_camera_hal_capture(mp_camera_obj_t *self, int8_t out_format);
201+
extern mp_obj_t mp_camera_hal_capture(mp_camera_obj_t *self, mp_camera_pixformat_t out_format);
201202

202203
/**
203204
* @brief Table mapping pixel formats API to their corresponding values at HAL.

src/modcamera_api.c

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const mp_obj_type_t camera_type;
4040

4141
//Constructor
4242
static mp_obj_t mp_camera_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
43-
enum { ARG_data_pins, ARG_pixel_clock_pin, ARG_vsync_pin, ARG_href_pin, ARG_sda_pin, ARG_scl_pin, ARG_xclock_pin, ARG_xclock_frequency, ARG_powerdown_pin, ARG_reset_pin, ARG_pixel_format, ARG_frame_size, ARG_jpeg_quality, ARG_fb_count, ARG_grab_mode, ARG_init, NUM_ARGS };
43+
enum { ARG_data_pins, ARG_pixel_clock_pin, ARG_vsync_pin, ARG_href_pin, ARG_sda_pin, ARG_scl_pin, ARG_xclock_pin, ARG_xclock_frequency, ARG_powerdown_pin, ARG_reset_pin, ARG_pixel_format, ARG_frame_size, ARG_jpeg_quality, ARG_fb_count, ARG_grab_mode, ARG_init, ARG_bmp_out, NUM_ARGS };
4444
static const mp_arg_t allowed_args[] = {
4545
#ifdef MICROPY_CAMERA_ALL_REQ_PINS_DEFINED
4646
{ MP_QSTR_data_pins, MP_ARG_OBJ | MP_ARG_KW_ONLY , { .u_obj = MP_ROM_NONE } },
@@ -68,6 +68,7 @@ static mp_obj_t mp_camera_make_new(const mp_obj_type_t *type, size_t n_args, siz
6868
{ MP_QSTR_fb_count, MP_ARG_INT | MP_ARG_KW_ONLY, { .u_int = MICROPY_CAMERA_FB_COUNT } },
6969
{ MP_QSTR_grab_mode, MP_ARG_INT | MP_ARG_KW_ONLY, { .u_int = MICROPY_CAMERA_GRAB_MODE } },
7070
{ MP_QSTR_init, MP_ARG_BOOL | MP_ARG_KW_ONLY, { .u_bool = true } },
71+
{ MP_QSTR_bmp_out, MP_ARG_BOOL | MP_ARG_KW_ONLY, { .u_bool = false } },
7172
};
7273

7374
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
@@ -128,6 +129,7 @@ static mp_obj_t mp_camera_make_new(const mp_obj_type_t *type, size_t n_args, siz
128129

129130
mp_camera_obj_t *self = mp_obj_malloc_with_finaliser(mp_camera_obj_t, &camera_type);
130131
self->base.type = &camera_type;
132+
self->bmp_out = args[ARG_bmp_out].u_bool;
131133

132134
mp_camera_hal_construct(self, data_pins, xclock_pin, pixel_clock_pin, vsync_pin, href_pin, powerdown_pin, reset_pin,
133135
sda_pin, scl_pin, xclock_frequency, pixel_format, frame_size, jpeg_quality, fb_count, grab_mode);
@@ -205,6 +207,20 @@ static mp_obj_t mp_camera_deinit(mp_obj_t self_in) {
205207
}
206208
static MP_DEFINE_CONST_FUN_OBJ_1(mp_camera_deinit_obj, mp_camera_deinit);
207209

210+
static mp_obj_t camera_get_bmp_out(mp_obj_t self_in) {
211+
mp_camera_obj_t *self = MP_OBJ_TO_PTR(self_in);
212+
return mp_obj_new_bool(self->bmp_out);
213+
}
214+
static MP_DEFINE_CONST_FUN_OBJ_1(camera_get_bmp_out_obj, camera_get_bmp_out);
215+
216+
static mp_obj_t camera_set_bmp_out(mp_obj_t self_in, mp_obj_t arg) {
217+
mp_camera_obj_t *self = MP_OBJ_TO_PTR(self_in);
218+
self->bmp_out = mp_obj_is_true(arg);
219+
return mp_const_none;
220+
}
221+
static MP_DEFINE_CONST_FUN_OBJ_2(camera_set_bmp_out_obj, camera_set_bmp_out);
222+
223+
// Destructor
208224
static mp_obj_t mp_camera_obj___exit__(size_t n_args, const mp_obj_t *args) {
209225
(void)n_args;
210226
return mp_camera_deinit(args[0]);
@@ -316,6 +332,7 @@ static const mp_rom_map_elem_t camera_camera_locals_table[] = {
316332
ADD_PROPERTY_TO_TABLE(wpc),
317333
ADD_PROPERTY_TO_TABLE(raw_gma),
318334
ADD_PROPERTY_TO_TABLE(lenc),
335+
ADD_PROPERTY_TO_TABLE(bmp_out),
319336
};
320337
static MP_DEFINE_CONST_DICT(camera_camera_locals_dict, camera_camera_locals_table);
321338

0 commit comments

Comments
 (0)