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