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