xref: /rockchip-linux_mpp/kmpp/base/kmpp_venc_cfg.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1 /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2 /*
3  * Copyright (c) 2024 Rockchip Electronics Co., Ltd.
4  */
5 
6 #define MODULE_TAG "kmpp_venc_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_venc_kcfg.h"
19 
20 #define VENC_KCFG_DBG_FUNC              (0x00000001)
21 #define VENC_KCFG_DBG_INFO              (0x00000002)
22 #define VENC_KCFG_DBG_SET               (0x00000004)
23 #define VENC_KCFG_DBG_GET               (0x00000008)
24 
25 #define venc_kcfg_dbg(flag, fmt, ...)   _mpp_dbg_f(venc_kcfg_debug, flag, fmt, ## __VA_ARGS__)
26 
27 #define venc_kcfg_dbg_func(fmt, ...)    venc_kcfg_dbg(VENC_KCFG_DBG_FUNC, fmt, ## __VA_ARGS__)
28 #define venc_kcfg_dbg_info(fmt, ...)    venc_kcfg_dbg(VENC_KCFG_DBG_INFO, fmt, ## __VA_ARGS__)
29 #define venc_kcfg_dbg_set(fmt, ...)     venc_kcfg_dbg(VENC_KCFG_DBG_SET, fmt, ## __VA_ARGS__)
30 #define venc_kcfg_dbg_get(fmt, ...)     venc_kcfg_dbg(VENC_KCFG_DBG_GET, fmt, ## __VA_ARGS__)
31 
32 static RK_U32 venc_kcfg_debug = 0;
33 
34 static char *kcfg_names[] = {
35     [MPP_VENC_KCFG_TYPE_INIT]   = "KmppVencInitCfg",
36     [MPP_VENC_KCFG_TYPE_DEINIT] = "KmppVencDeinitCfg",
37     [MPP_VENC_KCFG_TYPE_RESET]  = "KmppVencResetCfg",
38     [MPP_VENC_KCFG_TYPE_START]  = "KmppVencStartCfg",
39     [MPP_VENC_KCFG_TYPE_STOP]   = "KmppVencStopCfg",
40     [MPP_VENC_KCFG_TYPE_ST_CFG] = "KmppVencStCfg",
41 };
42 static KmppObjDef kcfg_defs[MPP_VENC_KCFG_TYPE_BUTT] = {NULL};
43 
mpp_venc_kcfg_def_init(void)44 static void mpp_venc_kcfg_def_init(void)
45 {
46     RK_U32 i;
47 
48     for (i = 0; i < MPP_VENC_KCFG_TYPE_BUTT; i++) {
49         kmpp_objdef_get(&kcfg_defs[i], 0, kcfg_names[i]);
50     }
51 }
52 
mpp_venc_kcfg_def_deinit(void)53 static void mpp_venc_kcfg_def_deinit(void)
54 {
55     RK_U32 i;
56 
57     for (i = 0; i < MPP_VENC_KCFG_TYPE_BUTT; i++) {
58         if (kcfg_defs[i]) {
59             kmpp_objdef_put(kcfg_defs[i]);
60             kcfg_defs[i] = NULL;
61         }
62     }
63 }
64 
MPP_SINGLETON(MPP_SGLN_KMPP_VENC_CFG,kmpp_venc_cfg,mpp_venc_kcfg_def_init,mpp_venc_kcfg_def_deinit)65 MPP_SINGLETON(MPP_SGLN_KMPP_VENC_CFG, kmpp_venc_cfg, mpp_venc_kcfg_def_init, mpp_venc_kcfg_def_deinit)
66 
67 MPP_RET mpp_venc_kcfg_init(MppVencKcfg *cfg, MppVencKcfgType type)
68 {
69     KmppObj obj = NULL;
70 
71     if (!cfg) {
72         mpp_err_f("invalid NULL input config\n");
73         return MPP_ERR_NULL_PTR;
74     }
75 
76     if (type >= MPP_VENC_KCFG_TYPE_BUTT) {
77         mpp_err_f("invalid config type %d\n", type);
78         return MPP_ERR_VALUE;
79     }
80 
81     mpp_env_get_u32("venc_kcfg_debug", &venc_kcfg_debug, 0);
82 
83     if (kcfg_defs[type])
84         kmpp_obj_get_f(&obj, kcfg_defs[type]);
85 
86     *cfg = obj;
87 
88     return obj ? MPP_OK : MPP_NOK;
89 }
90 
mpp_venc_kcfg_init_by_name(MppVencKcfg * cfg,const char * name)91 MPP_RET mpp_venc_kcfg_init_by_name(MppVencKcfg *cfg, const char *name)
92 {
93     KmppObj obj = NULL;
94     MppVencKcfgType type = MPP_VENC_KCFG_TYPE_BUTT;
95     RK_U32 i;
96 
97     if (!cfg) {
98         mpp_err_f("invalid NULL input config\n");
99         return MPP_ERR_NULL_PTR;
100     }
101 
102     for (i = 0; i < MPP_VENC_KCFG_TYPE_BUTT; i++) {
103         if (!strncmp(name, kcfg_names[i], strlen(kcfg_names[i]))) {
104             type = i;
105             break;
106         }
107     }
108 
109     if (type >= MPP_VENC_KCFG_TYPE_BUTT) {
110         mpp_err_f("invalid config name %s\n", name);
111         return MPP_ERR_VALUE;
112     }
113 
114     mpp_env_get_u32("venc_kcfg_debug", &venc_kcfg_debug, 0);
115 
116     kmpp_obj_get_f(&obj, kcfg_defs[type]);
117 
118     *cfg = obj;
119 
120     return obj ? MPP_OK : MPP_NOK;
121 }
122 
mpp_venc_kcfg_deinit(MppVencKcfg cfg)123 MPP_RET mpp_venc_kcfg_deinit(MppVencKcfg cfg)
124 {
125     KmppObj obj = cfg;
126 
127     if (!cfg) {
128         mpp_err_f("invalid NULL input config\n");
129         return MPP_ERR_NULL_PTR;
130     }
131 
132     return kmpp_obj_put_f(obj);
133 }
134 
135 #define MPP_VENC_KCFG_ACCESS(set_type, get_type, cfg_type) \
136     MPP_RET mpp_venc_kcfg_set_##cfg_type(MppVencKcfg cfg, const char *name, set_type val) \
137     { \
138         if (!cfg || !name) { \
139             mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \
140             return MPP_ERR_NULL_PTR; \
141         } \
142         KmppObj obj = (KmppObj)cfg; \
143         MPP_RET ret = (MPP_RET)kmpp_obj_set_##cfg_type(obj, name, val); \
144         return ret; \
145     } \
146     MPP_RET mpp_venc_kcfg_get_##cfg_type(MppVencKcfg cfg, const char *name, get_type val) \
147     { \
148         if (!cfg || !name) { \
149             mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \
150             return MPP_ERR_NULL_PTR; \
151         } \
152         KmppObj obj = (KmppObj)cfg; \
153         MPP_RET ret = (MPP_RET)kmpp_obj_get_##cfg_type(obj, name, val); \
154         return ret; \
155     }
156 
157 MPP_VENC_KCFG_ACCESS(RK_S32, RK_S32*, s32);
158 MPP_VENC_KCFG_ACCESS(RK_U32, RK_U32*, u32);
159 MPP_VENC_KCFG_ACCESS(RK_S64, RK_S64*, s64);
160 MPP_VENC_KCFG_ACCESS(RK_U64, RK_U64*, u64);
161 MPP_VENC_KCFG_ACCESS(void *, void **, ptr);
162 MPP_VENC_KCFG_ACCESS(void *, void  *, st);
163 
mpp_venc_kcfg_show(MppVencKcfg cfg)164 void mpp_venc_kcfg_show(MppVencKcfg cfg)
165 {
166     KmppObj obj = cfg;
167 
168     if (!cfg) {
169         mpp_err_f("invalid NULL input config\n");
170         return;
171     }
172 
173     kmpp_obj_udump(obj);
174 }
175