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