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