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 }