xref: /rockchip-linux_mpp/mpp/base/mpp_dec_cfg.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1 /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2 /*
3  * Copyright (c) 2020 Rockchip Electronics Co., Ltd.
4  */
5 
6 #define MODULE_TAG "mpp_dec_cfg"
7 
8 #include "rk_vdec_cfg.h"
9 #include <string.h>
10 
11 #include "mpp_env.h"
12 #include "mpp_mem.h"
13 #include "mpp_lock.h"
14 #include "mpp_time.h"
15 #include "mpp_debug.h"
16 #include "mpp_common.h"
17 #include "mpp_singleton.h"
18 #include "mpp_internal.h"
19 
20 #include "mpp_trie.h"
21 #include "mpp_cfg.h"
22 #include "mpp_cfg_io.h"
23 #include "mpp_dec_cfg.h"
24 
25 #define MPP_DEC_CFG_ENTRY_TABLE(prefix, ENTRY, STRCT, EHOOK, SHOOK, ALIAS) \
26     CFG_DEF_START() \
27     STRUCT_START(base) \
28     ENTRY(prefix, u32, rk_u32,     type,                FLAG_BASE(0),   base, type) \
29     ENTRY(prefix, u32, rk_u32,     coding,              FLAG_INCR,      base, coding) \
30     ENTRY(prefix, u32, rk_u32,     hw_type,             FLAG_INCR,      base, hw_type) \
31     ENTRY(prefix, u32, rk_u32,     batch_mode,          FLAG_INCR,      base, batch_mode) \
32     ENTRY(prefix, u32, rk_u32,     out_fmt,             FLAG_INCR,      base, out_fmt) \
33     ENTRY(prefix, u32, rk_u32,     fast_out,            FLAG_INCR,      base, fast_out) \
34     ENTRY(prefix, u32, rk_u32,     fast_parse,          FLAG_INCR,      base, fast_parse) \
35     ENTRY(prefix, u32, rk_u32,     split_parse,         FLAG_INCR,      base, split_parse) \
36     ENTRY(prefix, u32, rk_u32,     internal_pts,        FLAG_INCR,      base, internal_pts) \
37     ENTRY(prefix, u32, rk_u32,     sort_pts,            FLAG_INCR,      base, sort_pts) \
38     ENTRY(prefix, u32, rk_u32,     disable_error,       FLAG_INCR,      base, disable_error) \
39     ENTRY(prefix, u32, rk_u32,     enable_vproc,        FLAG_INCR,      base, enable_vproc) \
40     ENTRY(prefix, u32, rk_u32,     enable_fast_play,    FLAG_INCR,      base, enable_fast_play) \
41     ENTRY(prefix, u32, rk_u32,     enable_hdr_meta,     FLAG_INCR,      base, enable_hdr_meta) \
42     ENTRY(prefix, u32, rk_u32,     enable_thumbnail,    FLAG_INCR,      base, enable_thumbnail) \
43     ENTRY(prefix, u32, rk_u32,     enable_mvc,          FLAG_INCR,      base, enable_mvc) \
44     ENTRY(prefix, u32, rk_u32,     disable_dpb_chk,     FLAG_INCR,      base, disable_dpb_chk) \
45     ENTRY(prefix, u32, rk_u32,     disable_thread,      FLAG_INCR,      base, disable_thread) \
46     ENTRY(prefix, u32, rk_u32,     codec_mode,          FLAG_INCR,      base, codec_mode) \
47     ENTRY(prefix, u32, rk_u32,     dis_err_clr_mark,    FLAG_INCR,      base, dis_err_clr_mark) \
48     STRUCT_END(base) \
49     STRUCT_START(cb) \
50     ENTRY(prefix, ptr, void *,     pkt_rdy_cb,          FLAG_BASE(0),   cb, pkt_rdy_cb) \
51     ENTRY(prefix, ptr, void *,     pkt_rdy_ctx,         FLAG_PREV,      cb, pkt_rdy_ctx) \
52     ENTRY(prefix, s32, rk_s32,     pkt_rdy_cmd,         FLAG_PREV,      cb, pkt_rdy_cmd) \
53     ENTRY(prefix, ptr, void *,     frm_rdy_cb,          FLAG_INCR,      cb, frm_rdy_cb) \
54     ENTRY(prefix, ptr, void *,     frm_rdy_ctx,         FLAG_PREV,      cb, frm_rdy_ctx) \
55     ENTRY(prefix, s32, rk_s32,     frm_rdy_cmd,         FLAG_PREV,      cb, frm_rdy_cmd) \
56     STRUCT_END(cb) \
57     CFG_DEF_END()
58 
mpp_dec_cfg_set_default(void * entry,KmppObj obj,const char * caller)59 rk_s32 mpp_dec_cfg_set_default(void *entry, KmppObj obj, const char *caller)
60 {
61     MppDecCfgSet *cfg = (MppDecCfgSet *)entry;
62 
63     cfg->base.type = MPP_CTX_BUTT;
64     cfg->base.coding = MPP_VIDEO_CodingUnused;
65     cfg->base.hw_type = -1;
66     cfg->base.fast_parse = 1;
67 #ifdef ENABLE_FASTPLAY_ONCE
68     cfg->base.enable_fast_play = MPP_ENABLE_FAST_PLAY_ONCE;
69 #else
70     cfg->base.enable_fast_play = MPP_ENABLE_FAST_PLAY;
71 #endif
72     (void) obj;
73     (void) caller;
74 
75     return rk_ok;
76 }
77 
78 #define KMPP_OBJ_NAME               mpp_dec_cfg
79 #define KMPP_OBJ_INTF_TYPE          MppDecCfg
80 #define KMPP_OBJ_IMPL_TYPE          MppDecCfgSet
81 #define KMPP_OBJ_SGLN_ID            MPP_SGLN_DEC_CFG
82 #define KMPP_OBJ_FUNC_INIT          mpp_dec_cfg_set_default
83 #define KMPP_OBJ_ENTRY_TABLE        MPP_DEC_CFG_ENTRY_TABLE
84 #define KMPP_OBJ_ACCESS_DISABLE
85 #define KMPP_OBJ_HIERARCHY_ENABLE
86 #include "kmpp_obj_helper.h"
87 
88 /* wrapper for old interface */
mpp_dec_cfg_init(MppDecCfg * cfg)89 MPP_RET mpp_dec_cfg_init(MppDecCfg *cfg)
90 {
91     return mpp_dec_cfg_get(cfg);
92 }
93 
mpp_dec_cfg_deinit(MppDecCfg cfg)94 MPP_RET mpp_dec_cfg_deinit(MppDecCfg cfg)
95 {
96     return mpp_dec_cfg_put(cfg);
97 }
98 
99 #define DEC_CFG_SET_ACCESS(func_name, in_type, cfg_type) \
100     MPP_RET func_name(MppDecCfg cfg, const char *name, in_type val) \
101     { \
102         if (NULL == cfg || NULL == name) { \
103             mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \
104             return rk_nok; \
105         } \
106         return kmpp_obj_set_##cfg_type(cfg, name, val); \
107     }
108 
109 DEC_CFG_SET_ACCESS(mpp_dec_cfg_set_s32, RK_S32, s32);
110 DEC_CFG_SET_ACCESS(mpp_dec_cfg_set_u32, RK_U32, u32);
111 DEC_CFG_SET_ACCESS(mpp_dec_cfg_set_s64, RK_S64, s64);
112 DEC_CFG_SET_ACCESS(mpp_dec_cfg_set_u64, RK_U64, u64);
113 DEC_CFG_SET_ACCESS(mpp_dec_cfg_set_ptr, void *, ptr);
114 DEC_CFG_SET_ACCESS(mpp_dec_cfg_set_st,  void *, st);
115 
116 #define DEC_CFG_GET_ACCESS(func_name, in_type, cfg_type) \
117     MPP_RET func_name(MppDecCfg cfg, const char *name, in_type *val) \
118     { \
119         if (NULL == cfg || NULL == name) { \
120             mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \
121             return rk_nok; \
122         } \
123         return kmpp_obj_get_##cfg_type(cfg, name, val); \
124     }
125 
126 DEC_CFG_GET_ACCESS(mpp_dec_cfg_get_s32, RK_S32, s32);
127 DEC_CFG_GET_ACCESS(mpp_dec_cfg_get_u32, RK_U32, u32);
128 DEC_CFG_GET_ACCESS(mpp_dec_cfg_get_s64, RK_S64, s64);
129 DEC_CFG_GET_ACCESS(mpp_dec_cfg_get_u64, RK_U64, u64);
130 DEC_CFG_GET_ACCESS(mpp_dec_cfg_get_ptr, void *, ptr);
131 DEC_CFG_GET_ACCESS(mpp_dec_cfg_get_st,  void  , st);
132 
mpp_dec_cfg_show(void)133 void mpp_dec_cfg_show(void)
134 {
135     MppTrie trie = kmpp_objdef_get_trie(mpp_dec_cfg_def);
136     MppTrieInfo *root;
137 
138     if (!trie)
139         return;
140 
141     root = mpp_trie_get_info_first(trie);
142 
143     mpp_log("dumping valid configure string start\n");
144 
145     if (root) {
146         MppTrieInfo *node = root;
147         rk_s32 len = mpp_trie_get_name_max(trie);
148 
149         mpp_log("%-*s %-6s | %6s | %4s | %4s\n", len, "name", "type", "offset", "size", "flag (hex)");
150 
151         do {
152             if (mpp_trie_info_is_self(node))
153                 continue;
154 
155             if (node->ctx_len == sizeof(KmppEntry)) {
156                 KmppEntry *entry = (KmppEntry *)mpp_trie_info_ctx(node);
157 
158                 mpp_log("%-*s %-6s | %-6d | %-4d | %-4x\n", len, mpp_trie_info_name(node),
159                         strof_elem_type(entry->tbl.elem_type), entry->tbl.elem_offset,
160                         entry->tbl.elem_size, entry->tbl.flag_offset);
161             } else {
162                 mpp_log("%-*s size - %d\n", len, mpp_trie_info_name(node), node->ctx_len);
163             }
164         } while ((node = mpp_trie_get_info_next(trie, node)));
165     }
166 
167     mpp_log("dumping valid configure string done\n");
168 
169     mpp_log("dec cfg size %d count %d with trie node %d size %d\n",
170             sizeof(MppDecCfgSet), mpp_trie_get_info_count(trie),
171             mpp_trie_get_node_count(trie), mpp_trie_get_buf_size(trie));
172 }