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