refactor[sys_cfg]: Refactor C++ sys_cfg to C

Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
Change-Id: I59f4e3b13ba5e49ae34bb1b4886f37bd3341ce56
This commit is contained in:
Herman Chen
2025-09-03 11:47:22 +08:00
parent ced006c2a8
commit aa15b9b5bd
4 changed files with 136 additions and 95 deletions

View File

@@ -8,8 +8,8 @@ add_library(mpp_base OBJECT
mpp_enc_ref.cpp
mpp_enc_cfg.c
mpp_dec_cfg.c
mpp_sys_cfg.cpp
mpp_sys_cfg_st.cpp
mpp_sys_cfg.c
mpp_sys_cfg_st.c
mpp_cluster.cpp
mpp_buf_slot.cpp
mpp_buffer_impl.c

View File

@@ -11,16 +11,17 @@
#include "mpp_env.h"
#include "mpp_mem.h"
#include "mpp_list.h"
#include "mpp_time.h"
#include "mpp_debug.h"
#include "mpp_common.h"
#include "mpp_thread.h"
#include "mpp_list.h"
#include "mpp_singleton.h"
#include "mpp_cfg.h"
#include "mpp_soc.h"
#include "mpp_trie.h"
#include "mpp_sys_cfg.h"
#include "mpp_soc.h"
#include "mpp_mem_pool.h"
#include "mpp_compat_impl.h"
@@ -38,40 +39,27 @@
#define sys_cfg_dbg_get(fmt, ...) sys_cfg_dbg(SYS_CFG_DBG_GET, fmt, ## __VA_ARGS__)
#define sys_cfg_dbg_dec_buf(fmt, ...) sys_cfg_dbg(SYS_CFG_DBG_DEC_BUF, fmt, ## __VA_ARGS__)
#define SYS_CFG_CNT 3
#define get_srv_sys_cfg_f() \
({ \
MppSysCfgSrv *__tmp; \
if (srv_sys_cfg) { \
__tmp = srv_sys_cfg; \
} else { \
mpp_sys_cfg_srv_init(); \
__tmp = srv_sys_cfg; \
if (!__tmp) \
mpp_err("mpp sys cfg srv not init at %s\n", __FUNCTION__); \
} \
__tmp; \
})
RK_U32 mpp_sys_cfg_debug = 0;
static MppMemPool mpp_sys_cfg_pool = mpp_mem_pool_init(MODULE_TAG, sizeof(MppSysCfgSet), NULL);
typedef struct MppSysCfgSrv_t {
MppTrie trie;
MppMemPool pool;
} MppSysCfgSrv;
class MppSysCfgService
{
private:
MppSysCfgService();
~MppSysCfgService();
MppSysCfgService(const MppSysCfgService &);
MppSysCfgService &operator=(const MppSysCfgService &);
MppCfgInfoHead mHead;
MppTrie mTrie;
public:
static MppSysCfgService *get_ins() {
static MppSysCfgService instance;
return &instance;
}
MppSysCfgSet *get_cfg();
MPP_RET put_cfg(MppSysCfgSet *);
MppTrieInfo *get_info(const char *name);
MppTrieInfo *get_info_first();
MppTrieInfo *get_info_next(MppTrieInfo *info);
RK_S32 get_node_count() { return mHead.node_count; };
RK_S32 get_info_count() { return mHead.info_count; };
RK_S32 get_info_size() { return mHead.info_size; };
};
static MppSysCfgSrv *srv_sys_cfg = NULL;
static RK_U32 mpp_sys_cfg_debug = 0;
#define EXPAND_AS_TRIE(base, name, cfg_type, in_type, flag, field_change, field_data) \
do { \
@@ -82,7 +70,7 @@ public:
(RK_U32)((long)&(((MppSysCfgSet *)0)->field_change.field_data)), \
sizeof((((MppSysCfgSet *)0)->field_change.field_data)), \
}; \
mpp_trie_add_info(mTrie, #base":"#name, &tmp, sizeof(tmp)); \
mpp_trie_add_info(srv->trie, #base":"#name, &tmp, sizeof(tmp)); \
} while (0);
#define ENTRY_TABLE(ENTRY) \
@@ -113,83 +101,114 @@ public:
ENTRY(dec_buf_chk, size_metadata, U32, RK_U32, 0, dec_buf_chk, size_metadata) \
ENTRY(dec_buf_chk, size_thumbnail, U32, RK_U32, 0, dec_buf_chk, size_thumbnail)
MppSysCfgService::MppSysCfgService() :
mTrie(NULL)
static void mpp_sys_cfg_srv_init()
{
rk_s32 ret = mpp_trie_init(&mTrie, "MppSysCfg");
if (ret) {
mpp_err_f("failed to init dec cfg set trie\n");
MppSysCfgSrv *srv = srv_sys_cfg;
mpp_env_get_u32("mpp_sys_cfg_debug", &mpp_sys_cfg_debug, mpp_sys_cfg_debug);
if (srv)
return ;
srv = mpp_calloc(MppSysCfgSrv, 1);
if (!srv) {
mpp_err_f("failed to allocate sys cfg set service\n");
return ;
}
ENTRY_TABLE(EXPAND_AS_TRIE)
mpp_trie_add_info(mTrie, NULL, NULL, 0);
mHead.node_count = mpp_trie_get_node_count(mTrie);
mHead.info_count = mpp_trie_get_info_count(mTrie);
mHead.info_size = mpp_trie_get_buf_size(mTrie);
sys_cfg_dbg_func("node cnt: %d\n", mHead.node_count);
}
MppSysCfgService::~MppSysCfgService()
{
if (mTrie) {
mpp_trie_deinit(mTrie);
mTrie = NULL;
mpp_trie_init(&srv->trie, "MppSysCfg");
srv->pool = mpp_mem_pool_init_f(MODULE_TAG, sizeof(MppSysCfgSet));
if (!srv->trie || !srv->pool) {
mpp_err_f("failed to init sys cfg set service\n");
if (srv->trie) {
mpp_trie_deinit(srv->trie);
srv->trie = NULL;
}
if (srv->pool) {
mpp_mem_pool_deinit_f(srv->pool);
srv->pool = NULL;
}
MPP_FREE(srv);
return ;
}
srv_sys_cfg = srv;
ENTRY_TABLE(EXPAND_AS_TRIE)
mpp_trie_add_info(srv->trie, NULL, NULL, 0);
sys_cfg_dbg_func("info cnt %d node cnt %d size %d\n",
mpp_trie_get_info_count(srv->trie),
mpp_trie_get_node_count(srv->trie),
mpp_trie_get_buf_size(srv->trie));
}
MppSysCfgSet *MppSysCfgService::get_cfg()
static void mpp_sys_cfg_srv_deinit()
{
MppSysCfgSet *node;
MppSysCfgSrv *srv = srv_sys_cfg;
if (!srv)
return ;
if (srv->trie) {
mpp_trie_deinit(srv->trie);
srv->trie = NULL;
}
if (srv->pool) {
mpp_mem_pool_deinit_f(srv->pool);
srv->pool = NULL;
}
MPP_FREE(srv_sys_cfg);
}
MPP_SINGLETON(MPP_SGLN_SYS_CFG, mpp_sys_cfg, mpp_sys_cfg_srv_init, mpp_sys_cfg_srv_deinit)
static MppSysCfgSet *srv_get_cfg(MppSysCfgSrv *srv)
{
MppSysCfgSet *node = (MppSysCfgSet*)mpp_mem_pool_get_f(srv->pool);
node = (MppSysCfgSet*)mpp_mem_pool_get_f(mpp_sys_cfg_pool);
node->dec_buf_chk.type = MPP_VIDEO_CodingUnused;
return node;
}
MPP_RET MppSysCfgService::put_cfg(MppSysCfgSet *node)
static MPP_RET srv_put_cfg(MppSysCfgSrv *srv, MppSysCfgSet *node)
{
mpp_mem_pool_put_f(mpp_sys_cfg_pool, node);
mpp_mem_pool_put_f(srv->pool, node);
return MPP_OK;
}
MppTrieInfo *MppSysCfgService::get_info(const char *name)
{
return mpp_trie_get_info(mTrie, name);
}
MppTrieInfo *MppSysCfgService::get_info_first()
{
return mpp_trie_get_info_first(mTrie);
}
MppTrieInfo *MppSysCfgService::get_info_next(MppTrieInfo *info)
{
return mpp_trie_get_info_next(mTrie, info);
}
MPP_RET mpp_sys_cfg_get(MppSysCfg *cfg)
{
if (NULL == cfg) {
MppSysCfgSrv *srv = get_srv_sys_cfg_f();
if (!cfg) {
mpp_err_f("invalid NULL input config\n");
return MPP_ERR_NULL_PTR;
}
mpp_env_get_u32("mpp_sys_cfg_debug", &mpp_sys_cfg_debug, 0);
*cfg = NULL;
*cfg = MppSysCfgService::get_ins()->get_cfg();
if (!srv)
return MPP_NOK;
mpp_env_get_u32("mpp_sys_cfg_debug", &mpp_sys_cfg_debug, mpp_sys_cfg_debug);
*cfg = srv_get_cfg(srv);
return *cfg ? MPP_OK : MPP_NOK;
}
MPP_RET mpp_sys_cfg_put(MppSysCfg cfg)
{
return MppSysCfgService::get_ins()->put_cfg((MppSysCfgSet *)cfg);
MppSysCfgSrv *srv = get_srv_sys_cfg_f();
if (!srv)
return MPP_NOK;
return srv_put_cfg(srv, (MppSysCfgSet *)cfg);
}
typedef enum SysCfgAlignType_e {
@@ -612,13 +631,19 @@ MPP_RET mpp_sys_cfg_ioctl(MppSysCfg cfg)
#define MPP_CFG_SET_ACCESS(func_name, in_type, cfg_type) \
MPP_RET func_name(MppSysCfg cfg, const char *name, in_type val) \
{ \
if (NULL == cfg || NULL == name) { \
MppSysCfgSrv *srv = get_srv_sys_cfg_f(); \
MppSysCfgSet *p; \
MppTrieInfo *node; \
MppCfgInfo *info; \
if (!srv) \
return MPP_NOK; \
if (!cfg || !name) { \
mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \
return MPP_ERR_NULL_PTR; \
} \
MppSysCfgSet *p = (MppSysCfgSet *)cfg; \
MppTrieInfo *node = MppSysCfgService::get_ins()->get_info(name); \
MppCfgInfo *info = (MppCfgInfo *)mpp_trie_info_ctx(node); \
p = (MppSysCfgSet *)cfg; \
node = mpp_trie_get_info(srv->trie, name); \
info = (MppCfgInfo *)mpp_trie_info_ctx(node); \
if (CHECK_CFG_INFO(info, name, CFG_FUNC_TYPE_##cfg_type)) { \
return MPP_NOK; \
} \
@@ -642,13 +667,19 @@ MPP_CFG_SET_ACCESS(mpp_sys_cfg_set_st, void *, St);
#define MPP_CFG_GET_ACCESS(func_name, in_type, cfg_type) \
MPP_RET func_name(MppSysCfg cfg, const char *name, in_type *val) \
{ \
if (NULL == cfg || NULL == name) { \
MppSysCfgSrv *srv = get_srv_sys_cfg_f(); \
MppSysCfgSet *p; \
MppTrieInfo *node; \
MppCfgInfo *info; \
if (!srv) \
return MPP_NOK; \
if (!cfg || !name) { \
mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \
return MPP_ERR_NULL_PTR; \
} \
MppSysCfgSet *p = (MppSysCfgSet *)cfg; \
MppTrieInfo *node = MppSysCfgService::get_ins()->get_info(name); \
MppCfgInfo *info = (MppCfgInfo *)mpp_trie_info_ctx(node); \
p = (MppSysCfgSet *)cfg; \
node = mpp_trie_get_info(srv->trie, name); \
info = (MppCfgInfo *)mpp_trie_info_ctx(node); \
if (CHECK_CFG_INFO(info, name, CFG_FUNC_TYPE_##cfg_type)) { \
return MPP_NOK; \
} \
@@ -667,8 +698,15 @@ MPP_CFG_GET_ACCESS(mpp_sys_cfg_get_st, void , St);
void mpp_sys_cfg_show(void)
{
MppSysCfgService *srv = MppSysCfgService::get_ins();
MppTrieInfo *root = srv->get_info_first();
MppSysCfgSrv *srv = get_srv_sys_cfg_f();
MppTrieInfo *root;
MppTrie trie;
if (!srv)
return ;
trie = srv->trie;
root = mpp_trie_get_info_first(trie);
mpp_log("dumping valid configure string start\n");
@@ -681,7 +719,7 @@ void mpp_sys_cfg_show(void)
mpp_log("%-25s type %s\n", mpp_trie_info_name(node),
strof_cfg_type(info->data_type));
node = srv->get_info_next(node);
node = mpp_trie_get_info_next(trie, node);
if (!node)
break;
} while (1);
@@ -689,5 +727,7 @@ void mpp_sys_cfg_show(void)
mpp_log("dumping valid configure string done\n");
mpp_log("total cfg count %d with %d node size %d\n",
srv->get_info_count(), srv->get_node_count(), srv->get_info_size());
mpp_trie_get_info_count(trie),
mpp_trie_get_node_count(trie),
mpp_trie_get_buf_size(trie));
}

View File

@@ -39,6 +39,7 @@ typedef enum MppSingletonId_e {
MPP_SGLN_FRAME,
MPP_SGLN_PACKET,
/* userspace system module */
MPP_SGLN_SYS_CFG,
MPP_SGLN_ENC_CFG,
MPP_SGLN_DEC_CFG,
MPP_SGLN_ENC_RC_API,