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_recorder_type;
19
video_recorder_print(const mp_print_t * print,mp_obj_t self_in,mp_print_kind_t kind)20 void video_recorder_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_recorder_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_recorder_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_recorder_type;
35 camera_obj->mname = "video-recorder";
36 camera_obj->frame_rate = CAMERA_DEFAULT_FPS;
37 camera_obj->frame_release = 0;
38 camera_obj->camera_idx = -1;
39 camera_obj->frame = NULL;
40
41 return MP_OBJ_FROM_PTR(camera_obj);
42 }
43
video_recorder_open(size_t n_args,const mp_obj_t * args)44 static mp_obj_t video_recorder_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 int media_type = VIDEO_MEDIA_TYPE_H264;
50
51 if (n_args < 2 || n_args > 3) {
52 LOG_E("%s: n_args(%d) is illegal\n", __func__, n_args);
53 mp_raise_OSError(MP_EINVAL);
54 return mp_const_none;
55 }
56
57 if ((camera_idx = mp_obj_get_int(args[1])) < 0) {
58 LOG_E("%s: camera_idx(%d) is illegal\n", __func__, camera_idx);
59 mp_raise_OSError(MP_EINVAL);
60 return mp_const_none;
61 }
62
63 if (n_args == 3) {
64 media_type = mp_obj_get_int(args[2]);
65 }
66
67 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
68 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
69
70 if (camera_obj->frame == NULL) {
71 camera_obj->frame = m_new_obj(isp_frame_t);
72 if (camera_obj->frame) {
73 #if MICROPY_GC_CONSERVATIVE_CLEAR
74 memset(camera_obj->frame, 0, sizeof(isp_frame_t));
75 #endif
76 camera_obj->camera_idx = camera_idx;
77 camera_obj->frame_release = 0;
78 }
79 VIDEO_CAMERA_OBJ_INIT_CHK(camera_obj, MP_ENOMEM, "frame alloc failed");
80 py_rtsp_open(camera_obj->camera_idx, media_type, camera_obj->frame_rate,
81 NULL);
82 }
83
84 return mp_const_none;
85 }
86 static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(video_recorder_open_obj, 2, 3,
87 video_recorder_open);
88
video_recorder_close(size_t n_args,const mp_obj_t * args)89 static mp_obj_t video_recorder_close(size_t n_args, const mp_obj_t *args)
90 {
91 mp_video_camera_obj_t *camera_obj;
92
93 VIDEO_CAMERA_PARAM_CHK(n_args, 1, "args num is illegal");
94
95 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
96 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
97
98 if (camera_obj->frame) {
99 if (camera_obj->camera_idx >= 0)
100 py_rtsp_close();
101 camera_obj->camera_idx = -1;
102 m_del_obj(isp_frame_t, camera_obj->frame);
103 camera_obj->frame = NULL;
104 }
105 m_del_obj(mp_video_camera_obj_t, camera_obj);
106
107 return mp_const_none;
108 }
109 static MP_DEFINE_CONST_FUN_OBJ_VAR(video_recorder_close_obj, 1,
110 video_recorder_close);
111
video_recorder_pause(size_t n_args,const mp_obj_t * args)112 static mp_obj_t video_recorder_pause(size_t n_args, const mp_obj_t *args)
113 {
114 mp_video_camera_obj_t *camera_obj;
115
116 VIDEO_CAMERA_PARAM_CHK(n_args, 1, "args num is illegal");
117
118 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
119 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
120 py_rtsp_pause();
121
122 return mp_const_none;
123 }
124 static MP_DEFINE_CONST_FUN_OBJ_VAR(video_recorder_pause_obj, 1,
125 video_recorder_pause);
126
video_recorder_resume(size_t n_args,const mp_obj_t * args)127 static mp_obj_t video_recorder_resume(size_t n_args, const mp_obj_t *args)
128 {
129 mp_video_camera_obj_t *camera_obj;
130
131 VIDEO_CAMERA_PARAM_CHK(n_args, 1, "args num is illegal");
132
133 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
134 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
135
136 py_rtsp_resume();
137
138 return mp_const_none;
139 }
140 static MP_DEFINE_CONST_FUN_OBJ_VAR(video_recorder_resume_obj, 1,
141 video_recorder_resume);
142
video_recorder_start(size_t n_args,const mp_obj_t * args)143 static mp_obj_t video_recorder_start(size_t n_args, const mp_obj_t *args)
144 {
145 mp_video_camera_obj_t *camera_obj;
146
147 VIDEO_CAMERA_PARAM_CHK(n_args, 1, "args num is illegal");
148
149 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
150 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
151
152 py_rtsp_start();
153
154 return mp_const_none;
155 }
156 static MP_DEFINE_CONST_FUN_OBJ_VAR(video_recorder_start_obj, 1,
157 video_recorder_start);
158
video_recorder_stop(size_t n_args,const mp_obj_t * args)159 static mp_obj_t video_recorder_stop(size_t n_args, const mp_obj_t *args)
160 {
161 mp_video_camera_obj_t *camera_obj;
162
163 VIDEO_CAMERA_PARAM_CHK(n_args, 1, "args num is illegal");
164
165 camera_obj = (mp_video_camera_obj_t *)MP_OBJ_TO_PTR(args[0]);
166 VIDEO_CAMERA_OBJ_CHK(camera_obj, MP_EINVAL, "obj not init");
167
168 py_rtsp_stop();
169
170 return mp_const_none;
171 }
172 static MP_DEFINE_CONST_FUN_OBJ_VAR(video_recorder_stop_obj, 1,
173 video_recorder_stop);
174
175 static const mp_rom_map_elem_t video_recorder_globals_table[] = {
176 { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_Recorder) },
177 { MP_OBJ_NEW_QSTR(MP_QSTR_H264), MP_ROM_INT(VIDEO_MEDIA_TYPE_H264) },
178 /* H265 or HEVC */
179 { MP_OBJ_NEW_QSTR(MP_QSTR_HEVC), MP_ROM_INT(VIDEO_MEDIA_TYPE_HEVC) },
180 /* recorder.start() */
181 { MP_ROM_QSTR(MP_QSTR_start), MP_ROM_PTR(&video_recorder_start_obj) },
182 /* recorder.stop() */
183 { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&video_recorder_stop_obj) },
184 /* recorder.open(camera_idx, media_type)
185 * recorder.open(url)
186 */
187 { MP_ROM_QSTR(MP_QSTR_open), MP_ROM_PTR(&video_recorder_open_obj) },
188 /* recorder.close() */
189 { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&video_recorder_close_obj) },
190 /* recorder.pause() */
191 { MP_ROM_QSTR(MP_QSTR_pause), MP_ROM_PTR(&video_recorder_pause_obj) },
192 /* recorder.resume() */
193 { MP_ROM_QSTR(MP_QSTR_resume), MP_ROM_PTR(&video_recorder_resume_obj) },
194 };
195 static MP_DEFINE_CONST_DICT(video_recorder_globals,
196 video_recorder_globals_table);
197
198 const mp_obj_type_t video_recorder_type = {
199 .base = { &mp_type_type },
200 .name = MP_QSTR_Recorder,
201 .print = video_recorder_print,
202 .make_new = video_recorder_new,
203 .locals_dict = (mp_obj_dict_t *)&video_recorder_globals,
204 };
205