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