[mpp_enc_cfg]: Optimization on mpp_enc_cfg

1. Remove prefix before some args.
2. Add node count / info count calculation.

NOTE: the info count is correct but node count may have error.

Change-Id: I3a7d1005f440105eaf4b6d6326e92aa77d7d7e2a
Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
This commit is contained in:
Herman Chen
2020-05-20 10:13:28 +08:00
parent 444f946153
commit b749f0ba94
7 changed files with 73 additions and 59 deletions

View File

@@ -26,7 +26,7 @@ typedef void* MppTrie;
extern "C" { extern "C" {
#endif #endif
MPP_RET mpp_trie_init(MppTrie *trie, RK_S32 node_count); MPP_RET mpp_trie_init(MppTrie *trie, RK_S32 node_count, RK_S32 info_count);
MPP_RET mpp_trie_deinit(MppTrie trie); MPP_RET mpp_trie_deinit(MppTrie trie);
MPP_RET mpp_trie_add_info(MppTrie trie, const char **info); MPP_RET mpp_trie_add_info(MppTrie trie, const char **info);

View File

@@ -142,9 +142,12 @@ static const char *cfg_func_names[] = {
#define EXPAND_AS_ARRAY(base, name, func_type, in_type, flag, field0, field1) \ #define EXPAND_AS_ARRAY(base, name, func_type, in_type, flag, field0, field1) \
&api_##base##_##name, &api_##base##_##name,
#define EXPAND_AS_STRLEN(base, name, func_type, in_type, flag, field0, field1) \
const_strlen( #base":"#name ) +
#define ENTRY_TABLE(ENTRY) \ #define ENTRY_TABLE(ENTRY) \
/* rc config */ \ /* rc config */ \
ENTRY(rc, rc_mode, S32, MppEncRcMode, MPP_ENC_RC_CFG_CHANGE_RC_MODE, rc, rc_mode) \ ENTRY(rc, mode, S32, MppEncRcMode, MPP_ENC_RC_CFG_CHANGE_RC_MODE, rc, rc_mode) \
ENTRY(rc, bps_target, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_BPS, rc, bps_target) \ ENTRY(rc, bps_target, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_BPS, rc, bps_target) \
ENTRY(rc, bps_max, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_BPS, rc, bps_max) \ ENTRY(rc, bps_max, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_BPS, rc, bps_max) \
ENTRY(rc, bps_min, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_BPS, rc, bps_min) \ ENTRY(rc, bps_min, S32, RK_S32, MPP_ENC_RC_CFG_CHANGE_BPS, rc, bps_min) \
@@ -207,8 +210,8 @@ static const char *cfg_func_names[] = {
/* jpeg config */ \ /* jpeg config */ \
ENTRY(jpeg, quant, S32, RK_S32, MPP_ENC_JPEG_CFG_CHANGE_QP, codec.jpeg, quant) \ ENTRY(jpeg, quant, S32, RK_S32, MPP_ENC_JPEG_CFG_CHANGE_QP, codec.jpeg, quant) \
/* split config */ \ /* split config */ \
ENTRY(split, split_mode, U32, RK_U32, MPP_ENC_SPLIT_CFG_CHANGE_MODE, split, split_mode) \ ENTRY(split, mode, U32, RK_U32, MPP_ENC_SPLIT_CFG_CHANGE_MODE, split, split_mode) \
ENTRY(split, split_arg, U32, RK_U32, MPP_ENC_SPLIT_CFG_CHANGE_ARG, split, split_arg) ENTRY(split, arg, U32, RK_U32, MPP_ENC_SPLIT_CFG_CHANGE_ARG, split, split_arg)
ENTRY_TABLE(EXPAND_AS_FUNC) ENTRY_TABLE(EXPAND_AS_FUNC)
ENTRY_TABLE(EXPAND_AS_API) ENTRY_TABLE(EXPAND_AS_API)
@@ -217,6 +220,13 @@ static MppEncCfgApi *cfg_apis[] = {
ENTRY_TABLE(EXPAND_AS_ARRAY) ENTRY_TABLE(EXPAND_AS_ARRAY)
}; };
RK_S32 const_strlen(const char* str)
{
return *str ? 1 + const_strlen(str + 1) : 0;
}
static RK_S32 node_len = ENTRY_TABLE(EXPAND_AS_STRLEN) + 0;
class MppEncCfgService class MppEncCfgService
{ {
private: private:
@@ -243,19 +253,23 @@ MppEncCfgService::MppEncCfgService() :
mCfgApi(NULL) mCfgApi(NULL)
{ {
MPP_RET ret; MPP_RET ret;
RK_U32 i; RK_S32 i;
RK_S32 api_cnt = MPP_ARRAY_ELEMS(cfg_apis);
ret = mpp_trie_init(&mCfgApi, 600); /*
* NOTE: The node_len is not the real node count should be allocated
* The max node count should be stream lengthg * 2 if each word is different.
*/
ret = mpp_trie_init(&mCfgApi, node_len, api_cnt);
if (ret) { if (ret) {
mpp_err_f("failed to init enc cfg set trie\n"); mpp_err_f("failed to init enc cfg set trie\n");
} else { } else {
for (i = 0; i < MPP_ARRAY_ELEMS(cfg_apis); i++) for (i = 0; i < api_cnt; i++)
mpp_trie_add_info(mCfgApi, &cfg_apis[i]->name); mpp_trie_add_info(mCfgApi, &cfg_apis[i]->name);
} }
mpp_log_f("create config %d node %d info\n", mpp_log_f("create info %d with node %d -> %d info\n",
mpp_trie_get_node_count(mCfgApi), api_cnt, node_len, mpp_trie_get_node_count(mCfgApi));
mpp_trie_get_info_count(mCfgApi));
} }
MppEncCfgService::~MppEncCfgService() MppEncCfgService::~MppEncCfgService()
@@ -318,7 +332,11 @@ MPP_RET mpp_enc_cfg_deinit(MppEncCfg cfg)
return MPP_NOK; \ return MPP_NOK; \
} \ } \
MppEncCfgApi *api = (MppEncCfgApi *)info; \ MppEncCfgApi *api = (MppEncCfgApi *)info; \
mpp_assert(api->type_set == func_enum); \ if (api->type_set != func_enum) { \
mpp_err_f("%s expect %s input NOT %s\n", api->name, \
cfg_func_names[api->type_set], \
cfg_func_names[func_enum]); \
} \
mpp_enc_cfg_dbg_set("name %s type %s\n", api->name, cfg_func_names[api->type_set]); \ mpp_enc_cfg_dbg_set("name %s type %s\n", api->name, cfg_func_names[api->type_set]); \
MPP_RET ret = ((func_type)api->api_set)(&p->cfg, val); \ MPP_RET ret = ((func_type)api->api_set)(&p->cfg, val); \
return ret; \ return ret; \
@@ -344,7 +362,11 @@ ENC_CFG_SET_ACCESS(mpp_enc_cfg_set_ptr, void *, SET_PTR, CfgSetPtr);
return MPP_NOK; \ return MPP_NOK; \
} \ } \
MppEncCfgApi *api = (MppEncCfgApi *)info; \ MppEncCfgApi *api = (MppEncCfgApi *)info; \
mpp_assert(api->type_get == func_enum); \ if (api->type_get != func_enum) { \
mpp_err_f("%s expect %s input not %s\n", api->name, \
cfg_func_names[api->type_get], \
cfg_func_names[func_enum]); \
} \
mpp_enc_cfg_dbg_get("name %s type %s\n", api->name, cfg_func_names[api->type_get]); \ mpp_enc_cfg_dbg_get("name %s type %s\n", api->name, cfg_func_names[api->type_get]); \
MPP_RET ret = ((func_type)api->api_get)(&p->cfg, val); \ MPP_RET ret = ((func_type)api->api_get)(&p->cfg, val); \
return ret; \ return ret; \

View File

@@ -88,7 +88,7 @@ static RK_S32 trie_get_node(MppTrieImpl *trie)
return idx; return idx;
} }
MPP_RET mpp_trie_init(MppTrie *trie, RK_S32 node_count) MPP_RET mpp_trie_init(MppTrie *trie, RK_S32 node_count, RK_S32 info_count)
{ {
if (NULL == trie) { if (NULL == trie) {
mpp_err_f("invalid NULL input trie automation\n"); mpp_err_f("invalid NULL input trie automation\n");
@@ -113,7 +113,7 @@ MPP_RET mpp_trie_init(MppTrie *trie, RK_S32 node_count)
} }
} }
p->info_count = DEFAULT_INFO_COUNT; p->info_count = info_count ? info_count : DEFAULT_INFO_COUNT;
p->info = mpp_calloc(const char **, p->info_count); p->info = mpp_calloc(const char **, p->info_count);
if (NULL == p->info) { if (NULL == p->info) {
mpp_err_f("failed to alloc %d storage\n", p->info_count); mpp_err_f("failed to alloc %d storage\n", p->info_count);
@@ -175,16 +175,16 @@ MPP_RET mpp_trie_add_info(MppTrie trie, const char **info)
MppTrieNode *node = NULL; MppTrieNode *node = NULL;
const char *s = *info; const char *s = *info;
RK_S32 len = strnlen(s, SZ_1K); RK_S32 len = strnlen(s, SZ_1K);
RK_S16 next = 0; RK_S32 next = 0;
RK_S16 idx = 0; RK_S32 idx = 0;
RK_S32 i; RK_S32 i;
trie_dbg_set("trie %p add info %s len %d\n", trie, s, len); trie_dbg_set("trie %p add info %s len %d\n", trie, s, len);
for (i = 0; i < len && s[i]; i++) { for (i = 0; i < len && s[i]; i++) {
RK_U32 key = s[i]; RK_U32 key = s[i];
RK_S16 key0 = (key >> 4) & 0xf; RK_S32 key0 = (key >> 4) & 0xf;
RK_S16 key1 = (key >> 0) & 0xf; RK_S32 key1 = (key >> 0) & 0xf;
node = p->nodes + idx; node = p->nodes + idx;
next = node->next[key0]; next = node->next[key0];
@@ -250,32 +250,15 @@ const char **mpp_trie_get_info(MppTrie trie, const char *name)
trie_dbg_get("trie %p search %s len %2d start\n", trie, name, len); trie_dbg_get("trie %p search %s len %2d start\n", trie, name, len);
for (i = 0; i < len; i++, s++) { for (i = 0; i < len; i++, s++) {
RK_U32 key = s[0]; idx = node->next[(s[0] >> 4) & 0xf];
RK_S16 key0 = (key >> 4) & 0xf; if (!idx)
RK_S16 key1 = (key >> 0) & 0xf;
idx = node->next[key0];
trie_dbg_get("trie %p search %s pos %2d %c:%03d:key0:%2d -> %d\n",
trie, name, i, s[0], key, key0, idx);
if (idx == 0) {
trie_dbg_get("trie %p search %s pos %2d %c:%03d:key0:%2d failed\n",
trie, name, i, s[0], key, key0, idx);
break; break;
}
node = &nodes[idx]; node = &nodes[idx];
idx = node->next[key1];
trie_dbg_get("trie %p search %s pos %2d %c:%03d:key1:%2d\n", idx = node->next[(s[0] >> 0) & 0xf];
trie, name, i, s[0], key, key1); if (!idx)
if (idx == 0) {
trie_dbg_get("trie %p search %s pos %2d %c:%03d:key1:%2d failed\n",
trie, name, i, s[0], key, key1, idx);
break; break;
}
node = &nodes[idx]; node = &nodes[idx];
} }

View File

@@ -18,6 +18,7 @@
#include "mpp_log.h" #include "mpp_log.h"
#include "mpp_mem.h" #include "mpp_mem.h"
#include "mpp_time.h"
#include "mpp_common.h" #include "mpp_common.h"
#include "rk_venc_cfg.h" #include "rk_venc_cfg.h"
@@ -27,6 +28,8 @@ int main()
{ {
MPP_RET ret = MPP_OK; MPP_RET ret = MPP_OK;
MppEncCfg cfg; MppEncCfg cfg;
RK_S64 end = 0;
RK_S64 start = 0;
mpp_enc_cfg_show(); mpp_enc_cfg_show();
@@ -46,9 +49,13 @@ int main()
mpp_log("before set: rc mode %d bps_target %d\n", mpp_log("before set: rc mode %d bps_target %d\n",
impl->cfg.rc.rc_mode, impl->cfg.rc.bps_target); impl->cfg.rc.rc_mode, impl->cfg.rc.bps_target);
ret = mpp_enc_cfg_set_s32(cfg, "rc:rc_mode", rc_mode); start = mpp_time();
ret = mpp_enc_cfg_set_u32(cfg, "rc:mode", rc_mode);
ret = mpp_enc_cfg_set_s32(cfg, "rc:mode", rc_mode);
ret = mpp_enc_cfg_set_s32(cfg, "rc:bps", 400000); ret = mpp_enc_cfg_set_s32(cfg, "rc:bps", 400000);
ret = mpp_enc_cfg_set_s32(cfg, "rc:bps_target", bps_target); ret = mpp_enc_cfg_set_s32(cfg, "rc:bps_target", bps_target);
end = mpp_time();
mpp_log("set s32 time %lld us\n", end - start);
mpp_log("after set: rc mode %d bps_target %d\n", mpp_log("after set: rc mode %d bps_target %d\n",
impl->cfg.rc.rc_mode, impl->cfg.rc.bps_target); impl->cfg.rc.rc_mode, impl->cfg.rc.bps_target);
@@ -58,7 +65,7 @@ int main()
mpp_log("before get: rc mode %d bps_target %d\n", rc_mode, bps_target); mpp_log("before get: rc mode %d bps_target %d\n", rc_mode, bps_target);
ret = mpp_enc_cfg_get_s32(cfg, "rc:rc_mode", &rc_mode); ret = mpp_enc_cfg_get_s32(cfg, "rc:mode", &rc_mode);
ret = mpp_enc_cfg_get_s32(cfg, "rc:bps_target", &bps_target); ret = mpp_enc_cfg_get_s32(cfg, "rc:bps_target", &bps_target);
mpp_log("after get: rc mode %d bps_target %d\n", rc_mode, bps_target); mpp_log("after get: rc mode %d bps_target %d\n", rc_mode, bps_target);

View File

@@ -43,40 +43,42 @@ void *print_opt(void *ctx)
return NULL; return NULL;
} }
TestAction test_acts[] = { TestAction test_info[] = {
{ "rc:rc_mode", &test_acts[0], print_opt}, { "rc:mode", &test_info[0], print_opt},
{ "rc:bps_target", &test_acts[1], print_opt}, { "rc:bps_target", &test_info[1], print_opt},
{ "rc:bps_max", &test_acts[2], print_opt}, { "rc:bps_max", &test_info[2], print_opt},
{ "rc:bps_min", &test_acts[3], print_opt}, { "rc:bps_min", &test_info[3], print_opt},
}; };
const char *test_str[] = { const char *test_str[] = {
"rc:rc_mode", "rc:mode",
"rc:bps_target", "rc:bps_target",
"rc:bps_max", "rc:bps_max",
}; };
int main() int main()
{ {
MppTrie ac = NULL; MppTrie trie = NULL;
void *info = NULL; void *info = NULL;
RK_U32 i; RK_U32 i;
RK_S64 end = 0; RK_S64 end = 0;
RK_S64 start = 0; RK_S64 start = 0;
RK_S32 info_cnt = MPP_ARRAY_ELEMS(test_info);
RK_S32 node_cnt = 100;
mpp_trie_init(&ac, 100); mpp_trie_init(&trie, node_cnt, info_cnt);
start = mpp_time(); start = mpp_time();
mpp_trie_add_info(ac, &test_acts[0].name); mpp_trie_add_info(trie, &test_info[0].name);
mpp_trie_add_info(ac, &test_acts[1].name); mpp_trie_add_info(trie, &test_info[1].name);
mpp_trie_add_info(ac, &test_acts[2].name); mpp_trie_add_info(trie, &test_info[2].name);
mpp_trie_add_info(ac, &test_acts[3].name); mpp_trie_add_info(trie, &test_info[3].name);
end = mpp_time(); end = mpp_time();
mpp_log("add act time %lld us\n", end - start); mpp_log("add act time %lld us\n", end - start);
for (i = 0; i < MPP_ARRAY_ELEMS(test_str); i++) { for (i = 0; i < MPP_ARRAY_ELEMS(test_str); i++) {
start = mpp_time(); start = mpp_time();
info = mpp_trie_get_info(ac, test_str[i]); info = mpp_trie_get_info(trie, test_str[i]);
end = mpp_time(); end = mpp_time();
if (info) { if (info) {
TestAction *act = (TestAction *)info; TestAction *act = (TestAction *)info;
@@ -88,7 +90,7 @@ int main()
} }
} }
mpp_trie_deinit(ac); mpp_trie_deinit(trie);
return 0; return 0;
} }

View File

@@ -125,7 +125,7 @@ static MPP_RET vpu_api_set_enc_cfg(MppCtx mpp_ctx, MppApi *mpi, MppEncCfg enc_cf
mpp_enc_cfg_set_s32(enc_cfg, "prep:ver_stride", MPP_ALIGN(height, 16)); mpp_enc_cfg_set_s32(enc_cfg, "prep:ver_stride", MPP_ALIGN(height, 16));
mpp_enc_cfg_set_s32(enc_cfg, "prep:format", fmt); mpp_enc_cfg_set_s32(enc_cfg, "prep:format", fmt);
mpp_enc_cfg_set_s32(enc_cfg, "rc:rc_mode", rc_mode ? MPP_ENC_RC_MODE_CBR : MPP_ENC_RC_MODE_FIXQP); mpp_enc_cfg_set_s32(enc_cfg, "rc:mode", rc_mode ? MPP_ENC_RC_MODE_CBR : MPP_ENC_RC_MODE_FIXQP);
mpp_enc_cfg_set_s32(enc_cfg, "rc:bps_target", bps); mpp_enc_cfg_set_s32(enc_cfg, "rc:bps_target", bps);
mpp_enc_cfg_set_s32(enc_cfg, "rc:bps_max", bps * 17 / 16); mpp_enc_cfg_set_s32(enc_cfg, "rc:bps_max", bps * 17 / 16);
mpp_enc_cfg_set_s32(enc_cfg, "rc:bps_min", bps * 17 / 16); mpp_enc_cfg_set_s32(enc_cfg, "rc:bps_min", bps * 17 / 16);

View File

@@ -493,7 +493,7 @@ MPP_RET test_mpp_enc_cfg_setup(MpiEncTestData *p)
mpp_enc_cfg_set_s32(cfg, "prep:ver_stride", p->ver_stride); mpp_enc_cfg_set_s32(cfg, "prep:ver_stride", p->ver_stride);
mpp_enc_cfg_set_s32(cfg, "prep:format", p->fmt); mpp_enc_cfg_set_s32(cfg, "prep:format", p->fmt);
mpp_enc_cfg_set_s32(cfg, "rc:rc_mode", rc_mode); mpp_enc_cfg_set_s32(cfg, "rc:mode", rc_mode);
switch (rc_mode) { switch (rc_mode) {
case MPP_ENC_RC_MODE_FIXQP : { case MPP_ENC_RC_MODE_FIXQP : {
@@ -574,8 +574,8 @@ MPP_RET test_mpp_enc_cfg_setup(MpiEncTestData *p)
if (p->split_mode) { if (p->split_mode) {
mpp_log("split_mode %d split_arg %d\n", p->split_mode, p->split_arg); mpp_log("split_mode %d split_arg %d\n", p->split_mode, p->split_arg);
mpp_enc_cfg_set_s32(cfg, "split:split_mode", p->split_mode); mpp_enc_cfg_set_s32(cfg, "split:mode", p->split_mode);
mpp_enc_cfg_set_s32(cfg, "split:split_arg", p->split_arg); mpp_enc_cfg_set_s32(cfg, "split:arg", p->split_arg);
} }
ret = mpi->control(ctx, MPP_ENC_SET_CFG, cfg); ret = mpi->control(ctx, MPP_ENC_SET_CFG, cfg);