1 /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2 /*
3 * Copyright (c) 2025 Rockchip Electronics Co., Ltd.
4 */
5
6 #define MODULE_TAG "kmpp_vdec_cfg"
7
8 #include <string.h>
9 #include <pthread.h>
10
11 #include "mpp_env.h"
12 #include "mpp_mem.h"
13 #include "mpp_debug.h"
14 #include "mpp_common.h"
15 #include "mpp_singleton.h"
16
17 #include "kmpp_obj.h"
18 #include "rk_vdec_kcfg.h"
19
20 #define VDEC_KCFG_DBG_FUNC (0x00000001)
21 #define VDEC_KCFG_DBG_INFO (0x00000002)
22 #define VDEC_KCFG_DBG_SET (0x00000004)
23 #define VDEC_KCFG_DBG_GET (0x00000008)
24
25 #define vdec_kcfg_dbg(flag, fmt, ...) _mpp_dbg_f(vdec_kcfg_debug, flag, fmt, ## __VA_ARGS__)
26
27 #define vdec_kcfg_dbg_func(fmt, ...) vdec_kcfg_dbg(VDEC_KCFG_DBG_FUNC, fmt, ## __VA_ARGS__)
28 #define vdec_kcfg_dbg_info(fmt, ...) vdec_kcfg_dbg(VDEC_KCFG_DBG_INFO, fmt, ## __VA_ARGS__)
29 #define vdec_kcfg_dbg_set(fmt, ...) vdec_kcfg_dbg(VDEC_KCFG_DBG_SET, fmt, ## __VA_ARGS__)
30 #define vdec_kcfg_dbg_get(fmt, ...) vdec_kcfg_dbg(VDEC_KCFG_DBG_GET, fmt, ## __VA_ARGS__)
31
32 static RK_U32 vdec_kcfg_debug = 0;
33
34 static char *kcfg_names[] = {
35 [MPP_VDEC_KCFG_TYPE_INIT] = "KmppVdecInitCfg",
36 [MPP_VDEC_KCFG_TYPE_DEINIT] = "KmppVdecDeinitCfg",
37 [MPP_VDEC_KCFG_TYPE_RESET] = "KmppVdecResetCfg",
38 [MPP_VDEC_KCFG_TYPE_START] = "KmppVdecStartCfg",
39 [MPP_VDEC_KCFG_TYPE_STOP] = "KmppVdecStopCfg",
40 };
41 static KmppObjDef kcfg_defs[MPP_VDEC_KCFG_TYPE_BUTT] = {NULL};
42
mpp_vdec_kcfg_def_init(void)43 static void mpp_vdec_kcfg_def_init(void)
44 {
45 RK_U32 i;
46
47 for (i = 0; i < MPP_VDEC_KCFG_TYPE_BUTT; i++) {
48 kmpp_objdef_get(&kcfg_defs[i], 0, kcfg_names[i]);
49 }
50 }
51
mpp_vdec_kcfg_def_deinit(void)52 static void mpp_vdec_kcfg_def_deinit(void)
53 {
54 RK_U32 i;
55
56 for (i = 0; i < MPP_VDEC_KCFG_TYPE_BUTT; i++) {
57 if (kcfg_defs[i]) {
58 kmpp_objdef_put(kcfg_defs[i]);
59 kcfg_defs[i] = NULL;
60 }
61 }
62 }
63
MPP_SINGLETON(MPP_SGLN_KMPP_VDEC_CFG,kmpp_vdec_cfg,mpp_vdec_kcfg_def_init,mpp_vdec_kcfg_def_deinit)64 MPP_SINGLETON(MPP_SGLN_KMPP_VDEC_CFG, kmpp_vdec_cfg, mpp_vdec_kcfg_def_init, mpp_vdec_kcfg_def_deinit)
65
66 MPP_RET mpp_vdec_kcfg_init(MppVdecKcfg *cfg, MppVdecKcfgType type)
67 {
68 KmppObj obj = NULL;
69
70 if (!cfg) {
71 mpp_err_f("invalid NULL input config\n");
72 return MPP_ERR_NULL_PTR;
73 }
74
75 if (type >= MPP_VDEC_KCFG_TYPE_BUTT) {
76 mpp_err_f("invalid config type %d\n", type);
77 return MPP_ERR_VALUE;
78 }
79
80 mpp_env_get_u32("vdec_kcfg_debug", &vdec_kcfg_debug, 0);
81
82 if (kcfg_defs[type])
83 kmpp_obj_get_f(&obj, kcfg_defs[type]);
84
85 *cfg = obj;
86
87 return obj ? MPP_OK : MPP_NOK;
88 }
89
mpp_vdec_kcfg_init_by_name(MppVdecKcfg * cfg,const char * name)90 MPP_RET mpp_vdec_kcfg_init_by_name(MppVdecKcfg *cfg, const char *name)
91 {
92 KmppObj obj = NULL;
93 MppVdecKcfgType type = MPP_VDEC_KCFG_TYPE_BUTT;
94 RK_U32 i;
95
96 if (!cfg) {
97 mpp_err_f("invalid NULL input config\n");
98 return MPP_ERR_NULL_PTR;
99 }
100
101 for (i = 0; i < MPP_VDEC_KCFG_TYPE_BUTT; i++) {
102 if (!strncmp(name, kcfg_names[i], strlen(kcfg_names[i]))) {
103 type = i;
104 break;
105 }
106 }
107
108 if (type >= MPP_VDEC_KCFG_TYPE_BUTT) {
109 mpp_err_f("invalid config name %s\n", name);
110 return MPP_ERR_VALUE;
111 }
112
113 mpp_env_get_u32("vdec_kcfg_debug", &vdec_kcfg_debug, 0);
114
115 kmpp_obj_get_f(&obj, kcfg_defs[type]);
116
117 *cfg = obj;
118
119 return obj ? MPP_OK : MPP_NOK;
120 }
121
mpp_vdec_kcfg_deinit(MppVdecKcfg cfg)122 MPP_RET mpp_vdec_kcfg_deinit(MppVdecKcfg cfg)
123 {
124 KmppObj obj = cfg;
125
126 if (!cfg) {
127 mpp_err_f("invalid NULL input config\n");
128 return MPP_ERR_NULL_PTR;
129 }
130
131 return kmpp_obj_put_f(obj);
132 }
133
134 #define MPP_VDEC_KCFG_ACCESS(set_type, get_type, cfg_type) \
135 MPP_RET mpp_vdec_kcfg_set_##cfg_type(MppVdecKcfg cfg, const char *name, set_type val) \
136 { \
137 if (!cfg || !name) { \
138 mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \
139 return MPP_ERR_NULL_PTR; \
140 } \
141 KmppObj obj = (KmppObj)cfg; \
142 MPP_RET ret = (MPP_RET)kmpp_obj_set_##cfg_type(obj, name, val); \
143 return ret; \
144 } \
145 MPP_RET mpp_vdec_kcfg_get_##cfg_type(MppVdecKcfg cfg, const char *name, get_type val) \
146 { \
147 if (!cfg || !name) { \
148 mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \
149 return MPP_ERR_NULL_PTR; \
150 } \
151 KmppObj obj = (KmppObj)cfg; \
152 MPP_RET ret = (MPP_RET)kmpp_obj_get_##cfg_type(obj, name, val); \
153 return ret; \
154 }
155
156 MPP_VDEC_KCFG_ACCESS(RK_S32, RK_S32*, s32);
157 MPP_VDEC_KCFG_ACCESS(RK_U32, RK_U32*, u32);
158 MPP_VDEC_KCFG_ACCESS(RK_S64, RK_S64*, s64);
159 MPP_VDEC_KCFG_ACCESS(RK_U64, RK_U64*, u64);
160 MPP_VDEC_KCFG_ACCESS(void *, void **, ptr);
161 MPP_VDEC_KCFG_ACCESS(void *, void *, st);
162
mpp_vdec_kcfg_show(MppVdecKcfg cfg)163 void mpp_vdec_kcfg_show(MppVdecKcfg cfg)
164 {
165 KmppObj obj = cfg;
166
167 if (!cfg) {
168 mpp_err_f("invalid NULL input config\n");
169 return;
170 }
171
172 kmpp_obj_udump(obj);
173 }
174