1 /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2 /*
3 * Copyright (c) 2015 Rockchip Electronics Co., Ltd.
4 */
5
6 #define MODULE_TAG "mpp_enc_cfg"
7
8 #include <string.h>
9
10 #include "rk_venc_cfg.h"
11 #include "rk_venc_kcfg.h"
12
13 #include "mpp_env.h"
14 #include "mpp_mem.h"
15 #include "mpp_time.h"
16 #include "mpp_debug.h"
17 #include "mpp_common.h"
18 #include "mpp_singleton.h"
19 #include "mpp_internal.h"
20
21 #include "mpp_cfg.h"
22 #include "mpp_trie.h"
23 #include "mpp_cfg_io.h"
24 #include "mpp_enc_cfg.h"
25
26 #define ENC_CFG_DBG_FUNC (0x00000001)
27 #define ENC_CFG_DBG_INFO (0x00000002)
28 #define ENC_CFG_DBG_SET (0x00000004)
29 #define ENC_CFG_DBG_GET (0x00000008)
30
31 #define enc_cfg_dbg(flag, fmt, ...) _mpp_dbg_f(mpp_enc_cfg_debug, flag, fmt, ## __VA_ARGS__)
32
33 #define enc_cfg_dbg_func(fmt, ...) enc_cfg_dbg(ENC_CFG_DBG_FUNC, fmt, ## __VA_ARGS__)
34 #define enc_cfg_dbg_info(fmt, ...) enc_cfg_dbg(ENC_CFG_DBG_INFO, fmt, ## __VA_ARGS__)
35 #define enc_cfg_dbg_set(fmt, ...) enc_cfg_dbg(ENC_CFG_DBG_SET, fmt, ## __VA_ARGS__)
36 #define enc_cfg_dbg_get(fmt, ...) enc_cfg_dbg(ENC_CFG_DBG_GET, fmt, ## __VA_ARGS__)
37
38 #define MPP_ENC_CFG_ENTRY_TABLE(prefix, ENTRY, STRCT, EHOOK, SHOOK, ALIAS) \
39 CFG_DEF_START() \
40 /* prefix ElemType base type trie name update flag type element address */ \
41 STRUCT_START(codec); \
42 ENTRY(prefix, s32, rk_s32, type, FLAG_BASE(0), base, coding); \
43 STRUCT_END(codec); \
44 STRUCT_START(base) \
45 ENTRY(prefix, s32, rk_s32, low_delay, FLAG_INCR, base, low_delay) \
46 ENTRY(prefix, s32, rk_s32, smt1_en, FLAG_INCR, base, smt1_en) \
47 ENTRY(prefix, s32, rk_s32, smt3_en, FLAG_INCR, base, smt3_en) \
48 STRUCT_END(base) \
49 STRUCT_START(rc) \
50 ENTRY(prefix, s32, rk_s32, mode, FLAG_BASE(0), rc, rc_mode) \
51 ENTRY(prefix, s32, rk_s32, quality, FLAG_INCR, rc, quality); \
52 ENTRY(prefix, s32, rk_s32, bps_target, FLAG_INCR, rc, bps_target) \
53 ENTRY(prefix, s32, rk_s32, bps_max, FLAG_PREV, rc, bps_max) \
54 ENTRY(prefix, s32, rk_s32, bps_min, FLAG_PREV, rc, bps_min) \
55 ENTRY(prefix, s32, rk_s32, fps_in_flex, FLAG_INCR, rc, fps_in_flex) \
56 ENTRY(prefix, s32, rk_s32, fps_in_num, FLAG_PREV, rc, fps_in_num) \
57 ENTRY(prefix, s32, rk_s32, fps_in_denorm, FLAG_PREV, rc, fps_in_denom) \
58 ALIAS(prefix, s32, rk_s32, fps_in_denom, FLAG_PREV, rc, fps_in_denom) \
59 ENTRY(prefix, s32, rk_s32, fps_out_flex, FLAG_INCR, rc, fps_out_flex) \
60 ENTRY(prefix, s32, rk_s32, fps_out_num, FLAG_PREV, rc, fps_out_num) \
61 ENTRY(prefix, s32, rk_s32, fps_out_denorm, FLAG_PREV, rc, fps_out_denom) \
62 ALIAS(prefix, s32, rk_s32, fps_out_denom, FLAG_PREV, rc, fps_out_denom) \
63 ENTRY(prefix, s32, rk_s32, fps_chg_no_idr, FLAG_PREV, rc, fps_chg_no_idr) \
64 ENTRY(prefix, s32, rk_s32, gop, FLAG_INCR, rc, gop) \
65 ENTRY(prefix, ptr, void *, ref_cfg, FLAG_INCR, rc, ref_cfg) \
66 ENTRY(prefix, u32, rk_u32, max_reenc_times, FLAG_INCR, rc, max_reenc_times) \
67 ENTRY(prefix, u32, rk_u32, priority, FLAG_INCR, rc, rc_priority) \
68 ENTRY(prefix, u32, rk_u32, drop_mode, FLAG_INCR, rc, drop_mode) \
69 ENTRY(prefix, u32, rk_u32, drop_thd, FLAG_PREV, rc, drop_threshold) \
70 ENTRY(prefix, u32, rk_u32, drop_gap, FLAG_PREV, rc, drop_gap) \
71 ENTRY(prefix, s32, rk_s32, max_i_prop, FLAG_INCR, rc, max_i_prop) \
72 ENTRY(prefix, s32, rk_s32, min_i_prop, FLAG_INCR, rc, min_i_prop) \
73 ENTRY(prefix, s32, rk_s32, init_ip_ratio, FLAG_INCR, rc, init_ip_ratio) \
74 ENTRY(prefix, u32, rk_u32, super_mode, FLAG_INCR, rc, super_mode) \
75 ENTRY(prefix, u32, rk_u32, super_i_thd, FLAG_PREV, rc, super_i_thd) \
76 ENTRY(prefix, u32, rk_u32, super_p_thd, FLAG_PREV, rc, super_p_thd) \
77 ENTRY(prefix, u32, rk_u32, debreath_en, FLAG_INCR, rc, debreath_en) \
78 ENTRY(prefix, u32, rk_u32, debreath_strength, FLAG_PREV, rc, debre_strength) \
79 ENTRY(prefix, s32, rk_s32, qp_init, FLAG_REC_INC(0), rc, qp_init) \
80 ENTRY(prefix, s32, rk_s32, qp_min, FLAG_REC_INC(1), rc, qp_min) \
81 ENTRY(prefix, s32, rk_s32, qp_max, FLAG_REPLAY(1), rc, qp_max) \
82 ENTRY(prefix, s32, rk_s32, qp_min_i, FLAG_REC_INC(2), rc, qp_min_i) \
83 ENTRY(prefix, s32, rk_s32, qp_max_i, FLAG_REPLAY(2), rc, qp_max_i) \
84 ENTRY(prefix, s32, rk_s32, qp_step, FLAG_REC_INC(3), rc, qp_max_step) \
85 ENTRY(prefix, s32, rk_s32, qp_ip, FLAG_REC_INC(4), rc, qp_delta_ip) \
86 ENTRY(prefix, s32, rk_s32, qp_vi, FLAG_INCR, rc, qp_delta_vi) \
87 ENTRY(prefix, s32, rk_s32, hier_qp_en, FLAG_INCR, rc, hier_qp_en) \
88 STRCT(prefix, st, void *, hier_qp_delta, FLAG_PREV, rc, hier_qp_delta); \
89 STRCT(prefix, st, void *, hier_frame_num, FLAG_PREV, rc, hier_frame_num); \
90 ENTRY(prefix, s32, rk_s32, stats_time, FLAG_INCR, rc, stats_time) \
91 ENTRY(prefix, u32, rk_u32, refresh_en, FLAG_INCR, rc, refresh_en) \
92 ENTRY(prefix, u32, rk_u32, refresh_mode, FLAG_PREV, rc, refresh_mode) \
93 ENTRY(prefix, u32, rk_u32, refresh_num, FLAG_PREV, rc, refresh_num) \
94 ENTRY(prefix, s32, rk_s32, fqp_min_i, FLAG_INCR, rc, fqp_min_i) \
95 ENTRY(prefix, s32, rk_s32, fqp_min_p, FLAG_PREV, rc, fqp_min_p) \
96 ENTRY(prefix, s32, rk_s32, fqp_max_i, FLAG_PREV, rc, fqp_max_i) \
97 ENTRY(prefix, s32, rk_s32, fqp_max_p, FLAG_PREV, rc, fqp_max_p) \
98 ENTRY(prefix, s32, rk_s32, mt_st_swth_frm_qp, FLAG_PREV, rc, mt_st_swth_frm_qp) \
99 ENTRY(prefix, s32, rk_s32, inst_br_lvl, FLAG_INCR, rc, inst_br_lvl) \
100 STRUCT_END(rc) \
101 STRUCT_START(prep); \
102 ENTRY(prefix, s32, rk_s32, width, FLAG_BASE(0), prep, width_set); \
103 ENTRY(prefix, s32, rk_s32, height, FLAG_PREV, prep, height_set); \
104 ENTRY(prefix, s32, rk_s32, max_width, FLAG_PREV, prep, max_width); \
105 ENTRY(prefix, s32, rk_s32, max_height, FLAG_PREV, prep, max_height); \
106 ENTRY(prefix, s32, rk_s32, hor_stride, FLAG_PREV, prep, hor_stride); \
107 ENTRY(prefix, s32, rk_s32, ver_stride, FLAG_PREV, prep, ver_stride); \
108 ENTRY(prefix, s32, rk_s32, format, FLAG_INCR, prep, format); \
109 ENTRY(prefix, s32, rk_s32, format_out, FLAG_PREV, prep, format_out); \
110 ENTRY(prefix, s32, rk_s32, chroma_ds_mode, FLAG_PREV, prep, chroma_ds_mode); \
111 ENTRY(prefix, s32, rk_s32, fix_chroma_en, FLAG_PREV, prep, fix_chroma_en); \
112 ENTRY(prefix, s32, rk_s32, fix_chroma_u, FLAG_PREV, prep, fix_chroma_u); \
113 ENTRY(prefix, s32, rk_s32, fix_chroma_v, FLAG_PREV, prep, fix_chroma_v); \
114 ENTRY(prefix, s32, rk_s32, colorspace, FLAG_INCR, prep, color); \
115 ENTRY(prefix, s32, rk_s32, colorprim, FLAG_INCR, prep, colorprim); \
116 ENTRY(prefix, s32, rk_s32, colortrc, FLAG_INCR, prep, colortrc); \
117 ENTRY(prefix, s32, rk_s32, colorrange, FLAG_INCR, prep, range); \
118 ALIAS(prefix, s32, rk_s32, range, FLAG_PREV, prep, range); \
119 ENTRY(prefix, s32, rk_s32, range_out, FLAG_PREV, prep, range_out); \
120 ENTRY(prefix, s32, rk_s32, rotation, FLAG_INCR, prep, rotation_ext); \
121 ENTRY(prefix, s32, rk_s32, mirroring, FLAG_INCR, prep, mirroring_ext); \
122 ENTRY(prefix, s32, rk_s32, flip, FLAG_INCR, prep, flip); \
123 STRUCT_END(prep); \
124 STRUCT_START(h264); \
125 /* h264 config */ \
126 ENTRY(prefix, s32, rk_s32, stream_type, FLAG_BASE(0), h264, stream_type); \
127 ENTRY(prefix, s32, rk_s32, profile, FLAG_INCR, h264, profile); \
128 ENTRY(prefix, s32, rk_s32, level, FLAG_PREV, h264, level); \
129 ENTRY(prefix, u32, rk_u32, poc_type, FLAG_INCR, h264, poc_type); \
130 ENTRY(prefix, u32, rk_u32, log2_max_poc_lsb, FLAG_INCR, h264, log2_max_poc_lsb); \
131 ENTRY(prefix, u32, rk_u32, log2_max_frm_num, FLAG_INCR, h264, log2_max_frame_num); \
132 ENTRY(prefix, u32, rk_u32, gaps_not_allowed, FLAG_INCR, h264, gaps_not_allowed); \
133 ENTRY(prefix, s32, rk_s32, cabac_en, FLAG_INCR, h264, entropy_coding_mode_ex); \
134 ENTRY(prefix, s32, rk_s32, cabac_idc, FLAG_PREV, h264, cabac_init_idc_ex); \
135 ENTRY(prefix, s32, rk_s32, trans8x8, FLAG_INCR, h264, transform8x8_mode_ex); \
136 ENTRY(prefix, s32, rk_s32, const_intra, FLAG_INCR, h264, constrained_intra_pred_mode); \
137 ENTRY(prefix, s32, rk_s32, scaling_list, FLAG_INCR, h264, scaling_list_mode); \
138 ENTRY(prefix, s32, rk_s32, cb_qp_offset, FLAG_INCR, h264, chroma_cb_qp_offset); \
139 ENTRY(prefix, s32, rk_s32, cr_qp_offset, FLAG_PREV, h264, chroma_cr_qp_offset); \
140 ENTRY(prefix, s32, rk_s32, dblk_disable, FLAG_INCR, h264, deblock_disable); \
141 ENTRY(prefix, s32, rk_s32, dblk_alpha, FLAG_PREV, h264, deblock_offset_alpha); \
142 ENTRY(prefix, s32, rk_s32, dblk_beta, FLAG_PREV, h264, deblock_offset_beta); \
143 ALIAS(prefix, s32, rk_s32, qp_init, FLAG_REPLAY(0), rc, qp_init); \
144 ALIAS(prefix, s32, rk_s32, qp_min, FLAG_REPLAY(1), rc, qp_min); \
145 ALIAS(prefix, s32, rk_s32, qp_max, FLAG_REPLAY(1), rc, qp_max); \
146 ALIAS(prefix, s32, rk_s32, qp_min_i, FLAG_REPLAY(2), rc, qp_min_i); \
147 ALIAS(prefix, s32, rk_s32, qp_max_i, FLAG_REPLAY(2), rc, qp_max_i); \
148 ALIAS(prefix, s32, rk_s32, qp_step, FLAG_REPLAY(3), rc, qp_max_step); \
149 ALIAS(prefix, s32, rk_s32, qp_delta_ip, FLAG_REPLAY(4), rc, qp_delta_ip); \
150 ENTRY(prefix, s32, rk_s32, max_tid, FLAG_INCR, h264, max_tid); \
151 ENTRY(prefix, s32, rk_s32, max_ltr, FLAG_INCR, h264, max_ltr_frames); \
152 ENTRY(prefix, s32, rk_s32, prefix_mode, FLAG_INCR, h264, prefix_mode); \
153 ENTRY(prefix, s32, rk_s32, base_layer_pid, FLAG_INCR, h264, base_layer_pid); \
154 ENTRY(prefix, u32, rk_u32, constraint_set, FLAG_INCR, h264, constraint_set); \
155 ENTRY(prefix, u32, rk_u32, vui_en, FLAG_INCR, h264, vui, vui_en); \
156 STRUCT_END(h264); \
157 /* h265 config*/ \
158 STRUCT_START(h265); \
159 ENTRY(prefix, s32, rk_s32, profile, FLAG_BASE(0), h265, profile); \
160 ENTRY(prefix, s32, rk_s32, tier, FLAG_PREV, h265, tier); \
161 ENTRY(prefix, s32, rk_s32, level, FLAG_PREV, h265, level); \
162 ENTRY(prefix, u32, rk_u32, scaling_list, FLAG_INCR, h265, trans_cfg, scaling_list_mode); \
163 ENTRY(prefix, s32, rk_s32, cb_qp_offset, FLAG_PREV, h265, trans_cfg, cb_qp_offset); \
164 ENTRY(prefix, s32, rk_s32, cr_qp_offset, FLAG_PREV, h265, trans_cfg, cr_qp_offset); \
165 ENTRY(prefix, s32, rk_s32, diff_cu_qp_delta_depth, FLAG_PREV, h265, trans_cfg, diff_cu_qp_delta_depth); \
166 ENTRY(prefix, u32, rk_u32, dblk_disable, FLAG_INCR, h265, dblk_cfg, slice_deblocking_filter_disabled_flag); \
167 ENTRY(prefix, s32, rk_s32, dblk_alpha, FLAG_PREV, h265, dblk_cfg, slice_beta_offset_div2); \
168 ENTRY(prefix, s32, rk_s32, dblk_beta, FLAG_PREV, h265, dblk_cfg, slice_tc_offset_div2); \
169 ALIAS(prefix, s32, rk_s32, qp_init, FLAG_REPLAY(0), rc, qp_init); \
170 ALIAS(prefix, s32, rk_s32, qp_min, FLAG_REPLAY(1), rc, qp_min); \
171 ALIAS(prefix, s32, rk_s32, qp_max, FLAG_REPLAY(1), rc, qp_max); \
172 ALIAS(prefix, s32, rk_s32, qp_min_i, FLAG_REPLAY(2), rc, qp_min_i); \
173 ALIAS(prefix, s32, rk_s32, qp_max_i, FLAG_REPLAY(2), rc, qp_max_i); \
174 ALIAS(prefix, s32, rk_s32, qp_step, FLAG_REPLAY(3), rc, qp_max_step); \
175 ALIAS(prefix, s32, rk_s32, qp_delta_ip, FLAG_REPLAY(4), rc, qp_delta_ip); \
176 ENTRY(prefix, s32, rk_s32, sao_luma_disable, FLAG_INCR, h265, sao_cfg, slice_sao_luma_disable); \
177 ENTRY(prefix, s32, rk_s32, sao_chroma_disable, FLAG_PREV, h265, sao_cfg, slice_sao_chroma_disable); \
178 ENTRY(prefix, s32, rk_s32, sao_bit_ratio, FLAG_PREV, h265, sao_cfg, sao_bit_ratio); \
179 ENTRY(prefix, u32, rk_u32, lpf_acs_sli_en, FLAG_INCR, h265, lpf_acs_sli_en); \
180 ENTRY(prefix, u32, rk_u32, lpf_acs_tile_disable, FLAG_INCR, h265, lpf_acs_tile_disable); \
181 ENTRY(prefix, s32, rk_s32, auto_tile, FLAG_INCR, h265, auto_tile); \
182 ENTRY(prefix, s32, rk_s32, max_tid, FLAG_INCR, h265, max_tid); \
183 ENTRY(prefix, s32, rk_s32, max_ltr, FLAG_INCR, h265, max_ltr_frames); \
184 ENTRY(prefix, s32, rk_s32, base_layer_pid, FLAG_INCR, h265, base_layer_pid); \
185 ENTRY(prefix, s32, rk_s32, const_intra, FLAG_INCR, h265, const_intra_pred); \
186 ENTRY(prefix, s32, rk_s32, lcu_size, FLAG_INCR, h265, max_cu_size); \
187 ENTRY(prefix, s32, rk_s32, vui_en, FLAG_INCR, h265, vui, vui_en); \
188 STRUCT_END(h265); \
189 /* vp8 config */ \
190 STRUCT_START(vp8); \
191 ENTRY(prefix, s32, rk_s32, disable_ivf, FLAG_BASE(0), vp8, disable_ivf); \
192 ALIAS(prefix, s32, rk_s32, qp_init, FLAG_REPLAY(0), rc, qp_init); \
193 ALIAS(prefix, s32, rk_s32, qp_min, FLAG_REPLAY(1), rc, qp_min); \
194 ALIAS(prefix, s32, rk_s32, qp_max, FLAG_REPLAY(1), rc, qp_max); \
195 ALIAS(prefix, s32, rk_s32, qp_min_i, FLAG_REPLAY(2), rc, qp_min_i); \
196 ALIAS(prefix, s32, rk_s32, qp_max_i, FLAG_REPLAY(2), rc, qp_max_i); \
197 ALIAS(prefix, s32, rk_s32, qp_step, FLAG_REPLAY(3), rc, qp_max_step); \
198 ALIAS(prefix, s32, rk_s32, qp_delta_ip, FLAG_REPLAY(4), rc, qp_delta_ip); \
199 STRUCT_END(vp8); \
200 /* jpeg config */ \
201 STRUCT_START(jpeg); \
202 ENTRY(prefix, st, rk_s32, q_mode, FLAG_BASE(0), jpeg, q_mode); \
203 ENTRY(prefix, s32, rk_s32, quant, FLAG_INCR, jpeg, quant_ext); \
204 ENTRY(prefix, s32, rk_s32, q_factor, FLAG_INCR, jpeg, q_factor_ext); \
205 ENTRY(prefix, s32, rk_s32, qf_max, FLAG_PREV, jpeg, qf_max_ext); \
206 ENTRY(prefix, s32, rk_s32, qf_min, FLAG_PREV, jpeg, qf_min_ext); \
207 ENTRY(prefix, st, void *, qtable_y, FLAG_INCR, jpeg, qtable_y); \
208 ENTRY(prefix, st, void *, qtable_u, FLAG_PREV, jpeg, qtable_u); \
209 ENTRY(prefix, st, void *, qtable_v, FLAG_PREV, jpeg, qtable_v); \
210 STRUCT_END(jpeg); \
211 /* split config */ \
212 STRUCT_START(split); \
213 ENTRY(prefix, u32, rk_u32, mode, FLAG_BASE(0), split, split_mode) \
214 ENTRY(prefix, u32, rk_u32, arg, FLAG_INCR, split, split_arg) \
215 ENTRY(prefix, u32, rk_u32, out, FLAG_INCR, split, split_out) \
216 STRUCT_END(split); \
217 /* hardware detail config */ \
218 STRUCT_START(hw); \
219 ENTRY(prefix, s32, rk_s32, qp_row, FLAG_BASE(0), hw, qp_delta_row) \
220 ENTRY(prefix, s32, rk_s32, qp_row_i, FLAG_INCR, hw, qp_delta_row_i) \
221 STRCT(prefix, st, void *, aq_thrd_i, FLAG_INCR, hw, aq_thrd_i) \
222 STRCT(prefix, st, void *, aq_thrd_p, FLAG_INCR, hw, aq_thrd_p) \
223 STRCT(prefix, st, void *, aq_step_i, FLAG_INCR, hw, aq_step_i) \
224 STRCT(prefix, st, void *, aq_step_p, FLAG_INCR, hw, aq_step_p) \
225 ENTRY(prefix, s32, rk_s32, mb_rc_disable, FLAG_INCR, hw, mb_rc_disable) \
226 STRCT(prefix, st, void *, aq_rnge_arr, FLAG_INCR, hw, aq_rnge_arr) \
227 STRCT(prefix, st, void *, mode_bias, FLAG_INCR, hw, mode_bias) \
228 ENTRY(prefix, s32, rk_s32, skip_bias_en, FLAG_INCR, hw, skip_bias_en) \
229 ENTRY(prefix, s32, rk_s32, skip_sad, FLAG_PREV, hw, skip_sad) \
230 ENTRY(prefix, s32, rk_s32, skip_bias, FLAG_PREV, hw, skip_bias) \
231 ENTRY(prefix, s32, rk_s32, qbias_i, FLAG_INCR, hw, qbias_i) \
232 ENTRY(prefix, s32, rk_s32, qbias_p, FLAG_INCR, hw, qbias_p) \
233 ENTRY(prefix, s32, rk_s32, qbias_en, FLAG_INCR, hw, qbias_en) \
234 STRCT(prefix, st, void *, qbias_arr, FLAG_INCR, hw, qbias_arr) \
235 ENTRY(prefix, s32, rk_s32, flt_str_i, FLAG_INCR, hw, flt_str_i) \
236 ENTRY(prefix, s32, rk_s32, flt_str_p, FLAG_INCR, hw, flt_str_p) \
237 STRUCT_END(hw); \
238 /* quality fine tuning config */ \
239 STRUCT_START(tune); \
240 ENTRY(prefix, s32, rk_s32, scene_mode, FLAG_BASE(0), tune, scene_mode); \
241 ENTRY(prefix, s32, rk_s32, se_mode, FLAG_INCR, tune, se_mode); \
242 ENTRY(prefix, s32, rk_s32, deblur_en, FLAG_INCR, tune, deblur_en); \
243 ENTRY(prefix, s32, rk_s32, deblur_str, FLAG_INCR, tune, deblur_str); \
244 ENTRY(prefix, s32, rk_s32, anti_flicker_str, FLAG_INCR, tune, anti_flicker_str); \
245 ENTRY(prefix, s32, rk_s32, lambda_idx_i, FLAG_INCR, tune, lambda_idx_i); \
246 ENTRY(prefix, s32, rk_s32, lambda_idx_p, FLAG_INCR, tune, lambda_idx_p); \
247 ENTRY(prefix, s32, rk_s32, atr_str_i, FLAG_INCR, tune, atr_str_i); \
248 ENTRY(prefix, s32, rk_s32, atr_str_p, FLAG_INCR, tune, atr_str_p); \
249 ENTRY(prefix, s32, rk_s32, atl_str, FLAG_INCR, tune, atl_str); \
250 ENTRY(prefix, s32, rk_s32, sao_str_i, FLAG_INCR, tune, sao_str_i); \
251 ENTRY(prefix, s32, rk_s32, sao_str_p, FLAG_INCR, tune, sao_str_p); \
252 ENTRY(prefix, s32, rk_s32, rc_container, FLAG_INCR, tune, rc_container); \
253 ENTRY(prefix, s32, rk_s32, vmaf_opt, FLAG_INCR, tune, vmaf_opt); \
254 ENTRY(prefix, s32, rk_s32, motion_static_switch_enable, FLAG_INCR, tune, motion_static_switch_enable); \
255 ENTRY(prefix, s32, rk_s32, atf_str, FLAG_INCR, tune, atf_str); \
256 ENTRY(prefix, s32, rk_s32, lgt_chg_lvl, FLAG_INCR, tune, lgt_chg_lvl); \
257 ENTRY(prefix, s32, rk_s32, static_frm_num, FLAG_INCR, tune, static_frm_num); \
258 ENTRY(prefix, s32, rk_s32, madp16_th, FLAG_INCR, tune, madp16_th); \
259 ENTRY(prefix, s32, rk_s32, skip16_wgt, FLAG_INCR, tune, skip16_wgt); \
260 ENTRY(prefix, s32, rk_s32, skip32_wgt, FLAG_INCR, tune, skip32_wgt); \
261 ENTRY(prefix, s32, rk_s32, speed, FLAG_INCR, tune, speed); \
262 ENTRY(prefix, s32, rk_s32, bg_delta_qp_i, FLAG_INCR, tune, bg_delta_qp_i); \
263 ENTRY(prefix, s32, rk_s32, bg_delta_qp_p, FLAG_PREV, tune, bg_delta_qp_p); \
264 ENTRY(prefix, s32, rk_s32, fg_delta_qp_i, FLAG_PREV, tune, fg_delta_qp_i); \
265 ENTRY(prefix, s32, rk_s32, fg_delta_qp_p, FLAG_PREV, tune, fg_delta_qp_p); \
266 ENTRY(prefix, s32, rk_s32, bmap_qpmin_i, FLAG_PREV, tune, bmap_qpmin_i); \
267 ENTRY(prefix, s32, rk_s32, bmap_qpmin_p, FLAG_PREV, tune, bmap_qpmin_p); \
268 ENTRY(prefix, s32, rk_s32, bmap_qpmax_i, FLAG_PREV, tune, bmap_qpmax_i); \
269 ENTRY(prefix, s32, rk_s32, bmap_qpmax_p, FLAG_PREV, tune, bmap_qpmax_p); \
270 ENTRY(prefix, s32, rk_s32, min_bg_fqp, FLAG_PREV, tune, min_bg_fqp); \
271 ENTRY(prefix, s32, rk_s32, max_bg_fqp, FLAG_PREV, tune, max_bg_fqp); \
272 ENTRY(prefix, s32, rk_s32, min_fg_fqp, FLAG_PREV, tune, min_fg_fqp); \
273 ENTRY(prefix, s32, rk_s32, max_fg_fqp, FLAG_PREV, tune, max_fg_fqp); \
274 ENTRY(prefix, s32, rk_s32, fg_area, FLAG_PREV, tune, fg_area); \
275 ENTRY(prefix, s32, rk_s32, qpmap_en, FLAG_INCR, tune, qpmap_en); \
276 STRUCT_END(tune); \
277 CFG_DEF_END()
278
mpp_enc_cfg_impl_init(void * entry,KmppObj obj,const char * caller)279 static rk_s32 mpp_enc_cfg_impl_init(void *entry, KmppObj obj, const char *caller)
280 {
281 MppEncCfgSet *cfg = (MppEncCfgSet *)entry;
282 rk_u32 i;
283
284 cfg->rc.max_reenc_times = 1;
285
286 cfg->prep.color = MPP_FRAME_SPC_UNSPECIFIED;
287 cfg->prep.colorprim = MPP_FRAME_PRI_UNSPECIFIED;
288 cfg->prep.colortrc = MPP_FRAME_TRC_UNSPECIFIED;
289 cfg->prep.format_out = MPP_CHROMA_UNSPECIFIED;
290 cfg->prep.chroma_ds_mode = MPP_FRAME_CHROMA_DOWN_SAMPLE_MODE_NONE;
291 cfg->prep.fix_chroma_en = 0;
292 cfg->prep.range_out = MPP_FRAME_RANGE_UNSPECIFIED;
293
294 for (i = 0; i < MPP_ARRAY_ELEMS(cfg->hw.mode_bias); i++)
295 cfg->hw.mode_bias[i] = 8;
296
297 cfg->hw.skip_sad = 8;
298 cfg->hw.skip_bias = 8;
299
300 (void) obj;
301 (void) caller;
302
303 return rk_ok;
304 }
305
mpp_enc_cfg_impl_dump(void * entry)306 static rk_s32 mpp_enc_cfg_impl_dump(void *entry)
307 {
308 MppEncCfgSet *cfg = (MppEncCfgSet *)entry;
309 rk_u32 *flag;
310
311 if (!cfg)
312 return rk_nok;
313
314 flag = mpp_enc_cfg_prep_change(cfg);
315
316 mpp_logi("cfg %p prep flag %p\n", cfg, flag);
317 mpp_logi("prep change %x\n", *flag);
318 mpp_logi("width %4d -> %4d\n", cfg->prep.width, cfg->prep.width_set);
319 mpp_logi("height %4d -> %4d\n", cfg->prep.height, cfg->prep.height_set);
320 mpp_logi("hor_stride %d\n", cfg->prep.hor_stride);
321 mpp_logi("ver_stride %d\n", cfg->prep.ver_stride);
322 mpp_logi("format_in %d\n", cfg->prep.format);
323 mpp_logi("format_out %d\n", cfg->prep.format_out);
324 mpp_logi("rotation %d -> %d\n", cfg->prep.rotation, cfg->prep.rotation_ext);
325 mpp_logi("mirroring %d -> %d\n", cfg->prep.mirroring, cfg->prep.mirroring_ext);
326
327 return rk_ok;
328 }
329
330 #define KMPP_OBJ_NAME mpp_enc_cfg
331 #define KMPP_OBJ_INTF_TYPE MppEncCfg
332 #define KMPP_OBJ_IMPL_TYPE MppEncCfgSet
333 #define KMPP_OBJ_SGLN_ID MPP_SGLN_ENC_CFG
334 #define KMPP_OBJ_FUNC_INIT mpp_enc_cfg_impl_init
335 #define KMPP_OBJ_FUNC_DUMP mpp_enc_cfg_impl_dump
336 #define KMPP_OBJ_ENTRY_TABLE MPP_ENC_CFG_ENTRY_TABLE
337 #define KMPP_OBJ_ACCESS_DISABLE
338 #define KMPP_OBJ_HIERARCHY_ENABLE
339 #include "kmpp_obj_helper.h"
340
341 #define TO_CHANGE_POS(name, ...) \
342 static rk_s32 to_change_pos_##name(void) \
343 { \
344 static rk_s32 CONCAT_US(name, flag, pos) = -1; \
345 if (CONCAT_US(name, flag, pos) < 0) { \
346 KmppEntry *tbl = NULL; \
347 kmpp_objdef_get_entry(mpp_enc_cfg_def, CONCAT_STR(name, __VA_ARGS__), &tbl); \
348 CONCAT_US(name, flag, pos) = tbl ? (tbl->tbl.flag_offset / 8) : 0; \
349 } \
350 return CONCAT_US(name, flag, pos); \
351 }
352
353 /* vcodec type -> base.change */
TO_CHANGE_POS(rc,mode)354 TO_CHANGE_POS(rc, mode)
355 TO_CHANGE_POS(prep, width)
356 TO_CHANGE_POS(h264, stream_type)
357 TO_CHANGE_POS(h265, profile)
358 TO_CHANGE_POS(vp8, disable_ivf)
359 TO_CHANGE_POS(jpeg, q_mode)
360 TO_CHANGE_POS(hw, qp_row)
361 TO_CHANGE_POS(tune, scene_mode)
362
363 MPP_RET mpp_enc_cfg_init(MppEncCfg *cfg)
364 {
365 mpp_env_get_u32("mpp_enc_cfg_debug", &mpp_enc_cfg_debug, 0);
366
367 return mpp_enc_cfg_get(cfg);
368 }
369
mpp_enc_cfg_init_k(MppEncCfg * cfg)370 RK_S32 mpp_enc_cfg_init_k(MppEncCfg *cfg)
371 {
372 mpp_env_get_u32("mpp_enc_cfg_debug", &mpp_enc_cfg_debug, 0);
373
374 return mpp_venc_kcfg_init(cfg, MPP_VENC_KCFG_TYPE_ST_CFG);
375 }
376
mpp_enc_cfg_deinit(MppEncCfg cfg)377 RK_S32 mpp_enc_cfg_deinit(MppEncCfg cfg)
378 {
379 return kmpp_obj_put_f(cfg);
380 }
381
382 #define kmpp_obj_set_S32(obj, name, val) \
383 kmpp_obj_set_s32(obj, name, val)
384 #define kmpp_obj_set_U32(obj, name, val) \
385 kmpp_obj_set_u32(obj, name, val)
386 #define kmpp_obj_set_S64(obj, name, val) \
387 kmpp_obj_set_s64(obj, name, val)
388 #define kmpp_obj_set_U64(obj, name, val) \
389 kmpp_obj_set_u64(obj, name, val)
390 #define kmpp_obj_set_Ptr(obj, name, val) \
391 kmpp_obj_set_ptr(obj, name, val)
392 #define kmpp_obj_set_St(obj, name, val) \
393 kmpp_obj_set_st(obj, name, val)
394
395 #define ENC_CFG_SET_ACCESS(func_name, in_type, cfg_type) \
396 MPP_RET func_name(MppEncCfg cfg, const char *name, in_type val) \
397 { \
398 return kmpp_obj_set_##cfg_type((KmppObj)cfg, name, val); \
399 }
400
401 ENC_CFG_SET_ACCESS(mpp_enc_cfg_set_s32, RK_S32, S32);
402 ENC_CFG_SET_ACCESS(mpp_enc_cfg_set_u32, RK_U32, U32);
403 ENC_CFG_SET_ACCESS(mpp_enc_cfg_set_s64, RK_S64, S64);
404 ENC_CFG_SET_ACCESS(mpp_enc_cfg_set_u64, RK_U64, U64);
405 ENC_CFG_SET_ACCESS(mpp_enc_cfg_set_ptr, void *, Ptr);
406 ENC_CFG_SET_ACCESS(mpp_enc_cfg_set_st, void *, St);
407
408 #define kmpp_obj_get_S32(obj, name, val) \
409 kmpp_obj_get_s32(obj, name, val)
410 #define kmpp_obj_get_U32(obj, name, val) \
411 kmpp_obj_get_u32(obj, name, val)
412 #define kmpp_obj_get_S64(obj, name, val) \
413 kmpp_obj_get_s64(obj, name, val)
414 #define kmpp_obj_get_U64(obj, name, val) \
415 kmpp_obj_get_u64(obj, name, val)
416 #define kmpp_obj_get_Ptr(obj, name, val) \
417 kmpp_obj_get_ptr(obj, name, val)
418 #define kmpp_obj_get_St(obj, name, val) \
419 kmpp_obj_get_st(obj, name, val)
420
421 #define ENC_CFG_GET_ACCESS(func_name, in_type, cfg_type) \
422 MPP_RET func_name(MppEncCfg cfg, const char *name, in_type *val) \
423 { \
424 return kmpp_obj_get_##cfg_type((KmppObj)cfg, name, val); \
425 }
426
427 ENC_CFG_GET_ACCESS(mpp_enc_cfg_get_s32, RK_S32, S32);
428 ENC_CFG_GET_ACCESS(mpp_enc_cfg_get_u32, RK_U32, U32);
429 ENC_CFG_GET_ACCESS(mpp_enc_cfg_get_s64, RK_S64, S64);
430 ENC_CFG_GET_ACCESS(mpp_enc_cfg_get_u64, RK_U64, U64);
431 ENC_CFG_GET_ACCESS(mpp_enc_cfg_get_ptr, void *, Ptr);
432 ENC_CFG_GET_ACCESS(mpp_enc_cfg_get_st, void , St);
433
mpp_enc_cfg_show(void)434 void mpp_enc_cfg_show(void)
435 {
436 MppTrie trie = kmpp_objdef_get_trie(mpp_enc_cfg_def);
437 MppTrieInfo *root;
438
439 if (!trie)
440 return;
441
442 mpp_log("dumping valid configure string start\n");
443
444 root = mpp_trie_get_info_first(trie);
445 if (root) {
446 MppTrieInfo *node = root;
447 rk_s32 len = mpp_trie_get_name_max(trie);
448
449 do {
450 if (mpp_trie_info_is_self(node))
451 continue;
452
453 if (node->ctx_len == sizeof(KmppEntry)) {
454 KmppEntry *entry = (KmppEntry *)mpp_trie_info_ctx(node);
455
456 mpp_log("%-*s %-6s | %-6d | %-4d | %-4x\n", len, mpp_trie_info_name(node),
457 strof_elem_type(entry->tbl.elem_type), entry->tbl.elem_offset,
458 entry->tbl.elem_size, entry->tbl.flag_offset);
459 } else {
460 mpp_log("%-*s size - %d\n", len, mpp_trie_info_name(node), node->ctx_len);
461 }
462 } while ((node = mpp_trie_get_info_next(trie, node)));
463 }
464 mpp_log("dumping valid configure string done\n");
465
466 mpp_log("enc cfg size %d count %d with trie node %d size %d\n",
467 sizeof(MppEncCfgSet), mpp_trie_get_info_count(trie),
468 mpp_trie_get_node_count(trie), mpp_trie_get_buf_size(trie));
469 }
470
471 #define GET_ENC_CFG_CHANGE(name) \
472 rk_u32 *mpp_enc_cfg_##name##_change(MppEncCfgSet *cfg) \
473 { \
474 if (cfg) \
475 return (rk_u32 *)(POS_TO_FLAG(cfg, to_change_pos_##name())); \
476 return NULL; \
477 }
478
479 GET_ENC_CFG_CHANGE(prep)
GET_ENC_CFG_CHANGE(rc)480 GET_ENC_CFG_CHANGE(rc)
481 GET_ENC_CFG_CHANGE(hw)
482 GET_ENC_CFG_CHANGE(tune)
483 GET_ENC_CFG_CHANGE(h264)
484 GET_ENC_CFG_CHANGE(h265)
485 GET_ENC_CFG_CHANGE(jpeg)
486 GET_ENC_CFG_CHANGE(vp8)
487
488 MPP_RET mpp_enc_cfg_extract(MppEncCfg cfg, MppCfgStrFmt fmt, char **buf)
489 {
490 MppEncCfgSet *cfg_impl = kmpp_obj_to_entry(cfg);
491 MppCfgObj obj = NULL;
492 MppCfgObj root = NULL;
493
494 root = kmpp_objdef_get_cfg_root(mpp_enc_cfg_def);
495
496 mpp_cfg_from_struct(&obj, root, cfg_impl);
497 if (obj) {
498 mpp_cfg_to_string(obj, fmt, buf);
499 mpp_cfg_put_all(obj);
500 }
501
502 return MPP_OK;
503 }
504
mpp_enc_cfg_apply(MppEncCfg cfg,MppCfgStrFmt fmt,char * buf)505 MPP_RET mpp_enc_cfg_apply(MppEncCfg cfg, MppCfgStrFmt fmt, char *buf)
506 {
507 MppEncCfgSet *cfg_impl = kmpp_obj_to_entry(cfg);
508 MppCfgObj obj = NULL;
509 MppCfgObj root = NULL;
510
511 root = kmpp_objdef_get_cfg_root(mpp_enc_cfg_def);
512
513 mpp_cfg_from_string(&obj, fmt, buf);
514 if (obj) {
515 mpp_cfg_to_struct(obj, root, cfg_impl);
516 mpp_cfg_put_all(obj);
517 }
518
519 return MPP_OK;
520 }
521