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