1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <sys/ioctl.h>
5
6 #include "HaasLog.h"
7 #include "aos/kernel.h"
8 #include "k_api.h"
9 #include "py/mperrno.h"
10 #include "py/mphal.h"
11 #include "py/nlr.h"
12 #include "py/runtime.h"
13 #include "py/runtime0.h"
14 #include "py/stream.h"
15 #include "timer.h"
16 #include "videocommon.h"
17
18 extern const mp_obj_type_t video_camera_type;
19
video_camera_print(const mp_print_t * print,mp_obj_t self_in,mp_print_kind_t kind)20 void video_camera_print(const mp_print_t *print, mp_obj_t self_in,
21 mp_print_kind_t kind)
22 {
23 mp_video_camera_obj_t *self = MP_OBJ_TO_PTR(self_in);
24 mp_printf(print, "modName(%s)", self->mname);
25 }
26
video_camera_new(const mp_obj_type_t * type,size_t n_args,size_t n_kw,const mp_obj_t * args)27 static mp_obj_t video_camera_new(const mp_obj_type_t *type, size_t n_args,
28 size_t n_kw, const mp_obj_t *args)
29 {
30 mp_video_camera_obj_t *camera_obj = m_new_obj(mp_video_camera_obj_t);
31
32 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_ENOMEM, "obj alloc fail");
33
34 camera_obj->base.type = &video_camera_type;
35 camera_obj->mname = "video-camera";
36 camera_obj->camera_idx = -1;
37 camera_obj->frame_rate = CAMERA_DEFAULT_FPS;
38 camera_obj->frame_release = 0;
39 camera_obj->frame = NULL;
40
41 return MP_OBJ_FROM_PTR(camera_obj);
42 }
43
video_camera_open(size_t n_args,const mp_obj_t * args)44 static mp_obj_t video_camera_open(size_t n_args, const mp_obj_t *args)
45 {
46 int ret = -1;
47 int camera_idx = 0;
48 mp_video_camera_obj_t *camera_obj;
49
50 VIDEO_CAMERA_PARAM_CHK(n_args, 2, "args num is illegal");
51
52 if ((camera_idx = mp_obj_get_int(args[1])) < 0) {
53 LOG_E("%s: camera_idx(%d) is illegal\n", __func__, camera_idx);
54 mp_raise_OSError(MP_EINVAL);
55 return mp_const_none;
56 }
57
58 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
59 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
60
61 if (camera_obj->frame == NULL) {
62 camera_obj->frame = m_new_obj(isp_frame_t);
63 if (camera_obj->frame) {
64 #if MICROPY_GC_CONSERVATIVE_CLEAR
65 memset(camera_obj->frame, 0, sizeof(isp_frame_t));
66 #endif
67 camera_obj->camera_idx = camera_idx;
68 camera_obj->frame_release = 0;
69 }
70 VIDEO_CAMERA_OBJ_INIT_CHK(camera_obj, MP_ENOMEM, "frame alloc failed");
71 py_video_camera_open(camera_obj->camera_idx, camera_obj->frame_rate);
72 }
73
74 return mp_const_none;
75 }
76 static MP_DEFINE_CONST_FUN_OBJ_VAR(video_camera_open_obj, 2, video_camera_open);
77
video_camera_close(size_t n_args,const mp_obj_t * args)78 static mp_obj_t video_camera_close(size_t n_args, const mp_obj_t *args)
79 {
80 mp_video_camera_obj_t *camera_obj;
81
82 VIDEO_CAMERA_PARAM_CHK(n_args, 1, "args num is illegal");
83
84 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
85 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
86
87 if (camera_obj->frame) {
88 if (camera_obj->frame_release) {
89 py_video_camera_frame_release(camera_obj->frame);
90 }
91 camera_obj->frame_release = 0;
92
93 if (camera_obj->camera_idx >= 0) {
94 py_video_camera_close(camera_obj->camera_idx);
95 }
96 camera_obj->camera_idx = -1;
97
98 m_del_obj(isp_frame_t, camera_obj->frame);
99 camera_obj->frame = NULL;
100 m_del_obj(mp_video_camera_obj_t, camera_obj);
101 }
102
103 return mp_const_none;
104 }
105 static MP_DEFINE_CONST_FUN_OBJ_VAR(video_camera_close_obj, 1,
106 video_camera_close);
107
video_camera_preview(size_t n_args,const mp_obj_t * args)108 static mp_obj_t video_camera_preview(size_t n_args, const mp_obj_t *args)
109 {
110 uint32_t keep_time_second;
111 mp_video_camera_obj_t *camera_obj;
112
113 VIDEO_CAMERA_PARAM_CHK(n_args, 2, "args num is illegal");
114
115 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
116 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
117
118 keep_time_second = mp_obj_get_int(args[1]);
119
120 if (camera_obj->frame == NULL || camera_obj->camera_idx < 0) {
121 mp_raise_OSError(MP_EINVAL);
122 return mp_const_none;
123 }
124
125 py_usbcam_video_init(VIDEO_DEV0, VIDEO_CHN0);
126
127 while (keep_time_second != 0) {
128 aos_msleep(1000);
129 keep_time_second--;
130 }
131 py_usbcam_video_deinit();
132
133 return mp_const_none;
134 }
135 static MP_DEFINE_CONST_FUN_OBJ_VAR(video_camera_preview_obj, 2,
136 video_camera_preview);
137
video_camera_capture(size_t n_args,const mp_obj_t * args)138 STATIC mp_obj_t video_camera_capture(size_t n_args, const mp_obj_t *args)
139 {
140 mp_video_camera_obj_t *camera_obj;
141
142 VIDEO_CAMERA_PARAM_CHK(n_args, 1, "args num is illegal");
143
144 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
145 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
146
147 if (camera_obj->frame != NULL && camera_obj->camera_idx >= 0) {
148 if (camera_obj->frame_release) {
149 py_video_camera_frame_release(camera_obj->frame);
150 }
151 if (py_video_camera_frame_get(camera_obj->frame) != 0) {
152 return MP_OBJ_FROM_PTR(NULL);
153 }
154 camera_obj->frame_release = 1;
155 }
156
157 return MP_OBJ_FROM_PTR(camera_obj->frame);
158 }
159 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR(video_camera_capture_obj, 1,
160 video_camera_capture);
161
video_camera_save(size_t n_args,const mp_obj_t * args)162 STATIC mp_obj_t video_camera_save(size_t n_args, const mp_obj_t *args)
163 {
164 int pic_typ;
165 char *file_prefix;
166 isp_frame_t *frame;
167 mp_video_camera_obj_t *camera_obj;
168
169 VIDEO_CAMERA_PARAM_CHK(n_args, 4, "args num is illegal");
170
171 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
172 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
173
174 frame = (isp_frame_t *)MP_OBJ_TO_PTR(args[1]);
175 VIDEO_CAMERA_OBJ_CHK(frame, MP_EINVAL, "frame is NULL");
176
177 pic_typ = mp_obj_get_int(args[2]);
178 if (pic_typ != VIDEO_MEDIA_TYPE_YUV && pic_typ != VIDEO_MEDIA_TYPE_JPEG) {
179 LOG_E("%s, picture type not support\n", __func__);
180 mp_raise_OSError(MP_EINVAL);
181 return mp_const_none;
182 }
183
184 file_prefix = (char *)mp_obj_str_get_str(args[3]);
185 VIDEO_CAMERA_OBJ_CHK(frame, MP_EINVAL, "save file_prefix is NULL");
186
187 // transfer raw frame to destination picture with type of pic_type;
188 // save destination picture to file of file_prefix;
189 py_video_camera_save(frame, pic_typ, (const char *)file_prefix);
190
191 return mp_const_none;
192 }
193 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR(video_camera_save_obj, 4, video_camera_save);
194
video_camera_config_set(size_t n_args,const mp_obj_t * args)195 STATIC mp_obj_t video_camera_config_set(size_t n_args, const mp_obj_t *args)
196 {
197 int prod_id;
198 void *prod_val;
199 mp_video_camera_obj_t *camera_obj;
200
201 VIDEO_CAMERA_PARAM_CHK(n_args, 3, "args num is illegal");
202
203 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
204 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
205
206 prod_id = mp_obj_get_int(args[1]);
207 prod_val = (void *)MP_OBJ_TO_PTR(args[2]);
208
209 // set config according to prod id and value;
210
211 return mp_const_none;
212 }
213 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR(video_camera_config_set_obj, 3,
214 video_camera_config_set);
215
video_camera_config_get(size_t n_args,const mp_obj_t * args)216 STATIC mp_obj_t video_camera_config_get(size_t n_args, const mp_obj_t *args)
217 {
218 int prod_id;
219 void *prod_val;
220 mp_video_camera_obj_t *camera_obj;
221
222 VIDEO_CAMERA_PARAM_CHK(n_args, 3, "args num is illegal");
223
224 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
225 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
226
227 prod_id = mp_obj_get_int(args[1]);
228 prod_val = (void *)MP_OBJ_TO_PTR(args[2]);
229
230 // get config according to prod id and save value to prod_val;
231
232 return mp_const_none;
233 }
234 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR(video_camera_config_get_obj, 3,
235 video_camera_config_get);
236
237 STATIC const mp_rom_map_elem_t video_camera_globals_table[] = {
238 { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_camera) },
239 /* original YUV */
240 { MP_OBJ_NEW_QSTR(MP_QSTR_YUV), MP_ROM_INT(VIDEO_MEDIA_TYPE_YUV) },
241 { MP_OBJ_NEW_QSTR(MP_QSTR_JPEG), MP_ROM_INT(VIDEO_MEDIA_TYPE_JPEG) },
242 { MP_OBJ_NEW_QSTR(MP_QSTR_H264), MP_ROM_INT(VIDEO_MEDIA_TYPE_H264) },
243 /* H265 or HEVC */
244 { MP_OBJ_NEW_QSTR(MP_QSTR_HEVC), MP_ROM_INT(VIDEO_MEDIA_TYPE_HEVC) },
245 /* camera.save(frame, pic_type, path) */
246 { MP_ROM_QSTR(MP_QSTR_save), MP_ROM_PTR(&video_camera_save_obj) },
247 /* camera.open(camara_idx) */
248 { MP_ROM_QSTR(MP_QSTR_open), MP_ROM_PTR(&video_camera_open_obj) },
249 /* camera.close() */
250 { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&video_camera_close_obj) },
251 /* camera.preview() */
252 { MP_ROM_QSTR(MP_QSTR_preview), MP_ROM_PTR(&video_camera_preview_obj) },
253 /* frame = camera.capture() */
254 { MP_ROM_QSTR(MP_QSTR_capture), MP_ROM_PTR(&video_camera_capture_obj) },
255 /* camera.set(proID, val) */
256 { MP_ROM_QSTR(MP_QSTR_set), MP_ROM_PTR(&video_camera_config_set_obj) },
257 /* camera.get(proID, val) */
258 { MP_ROM_QSTR(MP_QSTR_get), MP_ROM_PTR(&video_camera_config_get_obj) },
259 };
260 STATIC MP_DEFINE_CONST_DICT(video_camera_globals, video_camera_globals_table);
261
262 const mp_obj_type_t video_camera_type = {
263 .base = { &mp_type_type },
264 .name = MP_QSTR_camera,
265 .print = video_camera_print,
266 .make_new = video_camera_new,
267 .locals_dict = (mp_obj_dict_t *)&video_camera_globals,
268 };
269