1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #include "HaasLog.h"
6 #include "ak_common.h"
7 #include "ak_mem.h"
8 #include "ak_vi.h"
9 #include "k_api.h"
10 #include "py/mperrno.h"
11 #include "py/mphal.h"
12 #include "py/nlr.h"
13 #include "py/runtime.h"
14 #include "py/runtime0.h"
15 #include "py/stream.h"
16 #include "videocommon.h"
17
18 extern const mp_obj_type_t video_player_type;
19
video_player_print(const mp_print_t * print,mp_obj_t self_in,mp_print_kind_t kind)20 void video_player_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_player_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_player_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_player_type;
35 camera_obj->mname = "video-player";
36 camera_obj->camera_idx = -1;
37 camera_obj->frame = NULL;
38
39 return MP_OBJ_FROM_PTR(camera_obj);
40 }
41
video_player_open(size_t n_args,const mp_obj_t * args)42 static mp_obj_t video_player_open(size_t n_args, const mp_obj_t *args)
43 {
44 int ret = -1;
45 int camera_idx = 0;
46 mp_video_camera_obj_t *camera_obj;
47
48 VIDEO_CAMERA_PARAM_CHK(n_args, 2, "args num is illegal");
49
50 if ((camera_idx = mp_obj_get_int(args[1])) < 0) {
51 LOG_E("%s: camera_idx(%d) is illegal\n", __func__, camera_idx);
52 mp_raise_OSError(MP_EINVAL);
53 return mp_const_none;
54 }
55
56 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
57 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
58
59 if (camera_obj->frame == NULL) {
60 camera_obj->frame = m_new_obj(isp_frame_t);
61 if (camera_obj->frame) {
62 #if MICROPY_GC_CONSERVATIVE_CLEAR
63 memset(camera_obj->frame, 0, sizeof(isp_frame_t));
64 #endif
65 camera_obj->camera_idx = camera_idx;
66 }
67 }
68
69 VIDEO_CAMERA_OBJ_INIT_CHK(camera_obj, MP_ENOMEM, "frame alloc failed");
70
71 do {
72 sdk_run_config config;
73 memset(&config, 0, sizeof(config));
74 config.mem_trace_flag = SDK_RUN_NORMAL;
75 ak_sdk_init(&config);
76 } while (0);
77
78 if (ak_vi_open(camera_obj->camera_idx) != 0) {
79 LOG_E("ak_vi_open failed\n");
80 mp_raise_OSError(MP_ENOMEM);
81 return mp_const_none;
82 }
83
84 return mp_const_none;
85 }
86 static MP_DEFINE_CONST_FUN_OBJ_VAR(video_player_open_obj, 2, video_player_open);
87
video_player_close(size_t n_args,const mp_obj_t * args)88 static mp_obj_t video_player_close(size_t n_args, const mp_obj_t *args)
89 {
90 mp_video_camera_obj_t *camera_obj;
91
92 VIDEO_CAMERA_PARAM_CHK(n_args, 1, "args num is illegal");
93
94 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
95 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
96
97 if (camera_obj->frame) {
98 if (camera_obj->camera_idx >= 0)
99 ak_vi_close(camera_obj->camera_idx);
100 camera_obj->camera_idx = -1;
101 m_del_obj(isp_frame_t, camera_obj->frame);
102 camera_obj->frame = NULL;
103 }
104 m_del_obj(mp_video_camera_obj_t, camera_obj);
105
106 return mp_const_none;
107 }
108 static MP_DEFINE_CONST_FUN_OBJ_VAR(video_player_close_obj, 1,
109 video_player_close);
110
video_player_start(size_t n_args,const mp_obj_t * args)111 static mp_obj_t video_player_start(size_t n_args, const mp_obj_t *args)
112 {
113 mp_video_camera_obj_t *camera_obj;
114
115 VIDEO_CAMERA_PARAM_CHK(n_args, 1, "args num is illegal");
116
117 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
118 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
119
120 return mp_const_none;
121 }
122 static MP_DEFINE_CONST_FUN_OBJ_VAR(video_player_start_obj, 1,
123 video_player_start);
124
video_player_stop(size_t n_args,const mp_obj_t * args)125 static mp_obj_t video_player_stop(size_t n_args, const mp_obj_t *args)
126 {
127 mp_video_camera_obj_t *camera_obj;
128
129 VIDEO_CAMERA_PARAM_CHK(n_args, 1, "args num is illegal");
130
131 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
132 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
133
134 return MP_OBJ_FROM_PTR(camera_obj->frame);
135 }
136 static MP_DEFINE_CONST_FUN_OBJ_VAR(video_player_stop_obj, 1, video_player_stop);
137
video_player_save(size_t n_args,const mp_obj_t * args)138 static mp_obj_t video_player_save(size_t n_args, const mp_obj_t *args)
139 {
140 int pic_typ;
141 char *save_path;
142 isp_frame_t *frame;
143 mp_video_camera_obj_t *camera_obj;
144
145 VIDEO_CAMERA_PARAM_CHK(n_args, 4, "args num is illegal");
146
147 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
148 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
149
150 frame = (isp_frame_t *)MP_OBJ_TO_PTR(args[1]);
151 pic_typ = mp_obj_get_int(args[2]);
152 save_path = (char *)MP_OBJ_TO_PTR(args[3]);
153
154 // transfer raw frame to destination picture with type of pic_type;
155 // save destination picture to file of save_path;
156
157 return mp_const_none;
158 }
159 static MP_DEFINE_CONST_FUN_OBJ_VAR(video_player_save_obj, 4, video_player_save);
160
video_player_config_set(size_t n_args,const mp_obj_t * args)161 static mp_obj_t video_player_config_set(size_t n_args, const mp_obj_t *args)
162 {
163 int prod_id;
164 void *prod_val;
165 mp_video_camera_obj_t *camera_obj;
166
167 VIDEO_CAMERA_PARAM_CHK(n_args, 3, "args num is illegal");
168
169 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
170 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
171
172 prod_id = mp_obj_get_int(args[1]);
173 prod_val = (void *)MP_OBJ_TO_PTR(args[2]);
174
175 // set config according to prod id and value;
176
177 return mp_const_none;
178 }
179 static MP_DEFINE_CONST_FUN_OBJ_VAR(video_player_config_set_obj, 3,
180 video_player_config_set);
181
video_player_config_get(size_t n_args,const mp_obj_t * args)182 static mp_obj_t video_player_config_get(size_t n_args, const mp_obj_t *args)
183 {
184 int prod_id;
185 void *prod_val;
186 mp_video_camera_obj_t *camera_obj;
187
188 VIDEO_CAMERA_PARAM_CHK(n_args, 3, "args num is illegal");
189
190 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
191 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
192
193 prod_id = mp_obj_get_int(args[1]);
194 prod_val = (void *)MP_OBJ_TO_PTR(args[2]);
195
196 // get config according to prod id and save value to prod_val;
197
198 return mp_const_none;
199 }
200 static MP_DEFINE_CONST_FUN_OBJ_VAR(video_player_config_get_obj, 3,
201 video_player_config_get);
202
203 static const mp_rom_map_elem_t video_player_globals_table[] = {
204 { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_Player) },
205 /* player.save(path) */
206 { MP_ROM_QSTR(MP_QSTR_save), MP_ROM_PTR(&video_player_save_obj) },
207 /* player.open(camera_idx)
208 * player.open(url, media_type)
209 * player.open(path, media_type)
210 */
211 { MP_ROM_QSTR(MP_QSTR_open), MP_ROM_PTR(&video_player_open_obj) },
212 /* player.close() */
213 { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&video_player_close_obj) },
214 /* player.start() */
215 { MP_ROM_QSTR(MP_QSTR_start), MP_ROM_PTR(&video_player_start_obj) },
216 /* player.stop() */
217 { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&video_player_stop_obj) },
218 /* player.set(proID, val) */
219 { MP_ROM_QSTR(MP_QSTR_set), MP_ROM_PTR(&video_player_config_set_obj) },
220 /* player.get(proID, val) */
221 { MP_ROM_QSTR(MP_QSTR_get), MP_ROM_PTR(&video_player_config_get_obj) },
222 };
223 static MP_DEFINE_CONST_DICT(video_player_globals, video_player_globals_table);
224
225 const mp_obj_type_t video_player_type = {
226 .base = { &mp_type_type },
227 .name = MP_QSTR_Player,
228 .print = video_player_print,
229 .make_new = video_player_new,
230 .locals_dict = (mp_obj_dict_t *)&video_player_globals,
231 };
232