xref: /rockchip-linux_mpp/kmpp/base/kmpp_vdec_cfg.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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