xref: /rockchip-linux_mpp/mpp/hal/rkenc/h265e/hal_h265e_vepu511.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2025 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #define MODULE_TAG  "hal_h265e_v511"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <string.h>
9*437bfbebSnyanmisaka #include <math.h>
10*437bfbebSnyanmisaka #include <limits.h>
11*437bfbebSnyanmisaka 
12*437bfbebSnyanmisaka #include "mpp_env.h"
13*437bfbebSnyanmisaka #include "mpp_mem.h"
14*437bfbebSnyanmisaka #include "mpp_common.h"
15*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
16*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
17*437bfbebSnyanmisaka #include "mpp_enc_cb_param.h"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include "rkv_enc_def.h"
20*437bfbebSnyanmisaka #include "h265e_syntax_new.h"
21*437bfbebSnyanmisaka #include "h265e_dpb.h"
22*437bfbebSnyanmisaka #include "hal_bufs.h"
23*437bfbebSnyanmisaka #include "hal_h265e_debug.h"
24*437bfbebSnyanmisaka #include "hal_h265e_vepu511.h"
25*437bfbebSnyanmisaka #include "hal_h265e_vepu511_reg.h"
26*437bfbebSnyanmisaka #include "hal_h265e_stream_amend.h"
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka #include "vepu5xx_common.h"
29*437bfbebSnyanmisaka #include "vepu511_common.h"
30*437bfbebSnyanmisaka 
31*437bfbebSnyanmisaka #define MAX_FRAME_TASK_NUM      2
32*437bfbebSnyanmisaka #define H265E_LAMBDA_TAB_SIZE  (52 * sizeof(RK_U32))
33*437bfbebSnyanmisaka #define H265E_SMEAR_STR_NUM    (8)
34*437bfbebSnyanmisaka 
35*437bfbebSnyanmisaka #define hal_h265e_err(fmt, ...) \
36*437bfbebSnyanmisaka     do {\
37*437bfbebSnyanmisaka         mpp_err_f(fmt, ## __VA_ARGS__);\
38*437bfbebSnyanmisaka     } while (0)
39*437bfbebSnyanmisaka 
40*437bfbebSnyanmisaka typedef struct Vepu511H265Fbk_t {
41*437bfbebSnyanmisaka     RK_U32 hw_status; /* 0:corret, 1:error */
42*437bfbebSnyanmisaka     RK_U32 frame_type;
43*437bfbebSnyanmisaka     RK_U32 qp_sum;
44*437bfbebSnyanmisaka     RK_U32 out_strm_size;
45*437bfbebSnyanmisaka     RK_U32 out_hw_strm_size;
46*437bfbebSnyanmisaka     RK_S64 sse_sum;
47*437bfbebSnyanmisaka     RK_U32 st_lvl64_inter_num;
48*437bfbebSnyanmisaka     RK_U32 st_lvl32_inter_num;
49*437bfbebSnyanmisaka     RK_U32 st_lvl16_inter_num;
50*437bfbebSnyanmisaka     RK_U32 st_lvl8_inter_num;
51*437bfbebSnyanmisaka     RK_U32 st_lvl32_intra_num;
52*437bfbebSnyanmisaka     RK_U32 st_lvl16_intra_num;
53*437bfbebSnyanmisaka     RK_U32 st_lvl8_intra_num;
54*437bfbebSnyanmisaka     RK_U32 st_lvl4_intra_num;
55*437bfbebSnyanmisaka     RK_U32 st_cu_num_qp[52];
56*437bfbebSnyanmisaka     RK_U32 st_madp;
57*437bfbebSnyanmisaka     RK_U32 st_madi;
58*437bfbebSnyanmisaka     RK_U32 st_mb_num;
59*437bfbebSnyanmisaka     RK_U32 st_ctu_num;
60*437bfbebSnyanmisaka     RK_U32 st_smear_cnt[5];
61*437bfbebSnyanmisaka     RK_S32 reg_idx;
62*437bfbebSnyanmisaka     RK_U32 acc_cover16_num;
63*437bfbebSnyanmisaka     RK_U32 acc_bndry16_num;
64*437bfbebSnyanmisaka     RK_U32 acc_zero_mv;
65*437bfbebSnyanmisaka     RK_S8 tgt_sub_real_lvl[6];
66*437bfbebSnyanmisaka } Vepu511H265Fbk;
67*437bfbebSnyanmisaka 
68*437bfbebSnyanmisaka typedef struct Vepu511H265eFrmCfg_t {
69*437bfbebSnyanmisaka     RK_S32              frame_count;
70*437bfbebSnyanmisaka     RK_S32              frame_type;
71*437bfbebSnyanmisaka 
72*437bfbebSnyanmisaka     /* dchs cfg on frame parallel */
73*437bfbebSnyanmisaka     RK_S32              dchs_curr_idx;
74*437bfbebSnyanmisaka     RK_S32              dchs_prev_idx;
75*437bfbebSnyanmisaka 
76*437bfbebSnyanmisaka     /* hal dpb management slot idx */
77*437bfbebSnyanmisaka     RK_S32              hal_curr_idx;
78*437bfbebSnyanmisaka     RK_S32              hal_refr_idx;
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka     /* regs cfg */
81*437bfbebSnyanmisaka     H265eV511RegSet     *regs_set;
82*437bfbebSnyanmisaka     H265eV511StatusElem *regs_ret;
83*437bfbebSnyanmisaka 
84*437bfbebSnyanmisaka     /* hardware return info collection cfg */
85*437bfbebSnyanmisaka     Vepu511H265Fbk      feedback;
86*437bfbebSnyanmisaka 
87*437bfbebSnyanmisaka     void                *roi_data;
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka     /* roi buffer for qpmap or gdr */
90*437bfbebSnyanmisaka     MppBuffer           roir_buf;
91*437bfbebSnyanmisaka     RK_S32              roir_buf_size;
92*437bfbebSnyanmisaka     void                *roi_base_cfg_sw_buf;
93*437bfbebSnyanmisaka 
94*437bfbebSnyanmisaka     /* variable length cfg */
95*437bfbebSnyanmisaka     MppDevRegOffCfgs    *reg_cfg;
96*437bfbebSnyanmisaka } Vepu511H265eFrmCfg;
97*437bfbebSnyanmisaka 
98*437bfbebSnyanmisaka typedef struct H265eV511HalContext_t {
99*437bfbebSnyanmisaka     MppEncHalApi        api;
100*437bfbebSnyanmisaka     MppDev              dev;
101*437bfbebSnyanmisaka     void                *regs;
102*437bfbebSnyanmisaka     void                *reg_out;
103*437bfbebSnyanmisaka     Vepu511H265eFrmCfg  *frms[MAX_FRAME_TASK_NUM];
104*437bfbebSnyanmisaka 
105*437bfbebSnyanmisaka     /* current used frame config */
106*437bfbebSnyanmisaka     Vepu511H265eFrmCfg  *frm;
107*437bfbebSnyanmisaka 
108*437bfbebSnyanmisaka     /* slice split poll cfg */
109*437bfbebSnyanmisaka     RK_S32              poll_slice_max;
110*437bfbebSnyanmisaka     RK_S32              poll_cfg_size;
111*437bfbebSnyanmisaka     MppDevPollCfg       *poll_cfgs;
112*437bfbebSnyanmisaka     MppCbCtx            *output_cb;
113*437bfbebSnyanmisaka 
114*437bfbebSnyanmisaka     /* @frame_cnt starts from ZERO */
115*437bfbebSnyanmisaka     RK_S32              frame_count;
116*437bfbebSnyanmisaka 
117*437bfbebSnyanmisaka     /* frame parallel info */
118*437bfbebSnyanmisaka     RK_S32              task_cnt;
119*437bfbebSnyanmisaka     RK_S32              task_idx;
120*437bfbebSnyanmisaka 
121*437bfbebSnyanmisaka     /* dchs cfg */
122*437bfbebSnyanmisaka     RK_S32              curr_idx;
123*437bfbebSnyanmisaka     RK_S32              prev_idx;
124*437bfbebSnyanmisaka 
125*437bfbebSnyanmisaka     Vepu511H265Fbk      feedback;
126*437bfbebSnyanmisaka     Vepu511H265Fbk      last_frame_fb;
127*437bfbebSnyanmisaka     void                *dump_files;
128*437bfbebSnyanmisaka     RK_U32              frame_cnt_gen_ready;
129*437bfbebSnyanmisaka 
130*437bfbebSnyanmisaka     RK_S32              frame_type;
131*437bfbebSnyanmisaka     RK_S32              last_frame_type;
132*437bfbebSnyanmisaka 
133*437bfbebSnyanmisaka     MppBufferGroup      roi_grp;
134*437bfbebSnyanmisaka     void                *roi_data;
135*437bfbebSnyanmisaka     Vepu511OsdCfg       osd_cfg;
136*437bfbebSnyanmisaka 
137*437bfbebSnyanmisaka     MppEncCfgSet        *cfg;
138*437bfbebSnyanmisaka     MppDevRegOffCfgs    *reg_cfg;
139*437bfbebSnyanmisaka     H265eSyntax_new     *syn;
140*437bfbebSnyanmisaka     H265eDpb            *dpb;
141*437bfbebSnyanmisaka 
142*437bfbebSnyanmisaka     RK_U32              enc_mode;
143*437bfbebSnyanmisaka     RK_U32              frame_size;
144*437bfbebSnyanmisaka     RK_S32              max_buf_cnt;
145*437bfbebSnyanmisaka     RK_S32              hdr_status;
146*437bfbebSnyanmisaka     void                *input_fmt;
147*437bfbebSnyanmisaka     RK_U8               *src_buf;
148*437bfbebSnyanmisaka     RK_U8               *dst_buf;
149*437bfbebSnyanmisaka     RK_S32              buf_size;
150*437bfbebSnyanmisaka     RK_U32              frame_num;
151*437bfbebSnyanmisaka     HalBufs             dpb_bufs;
152*437bfbebSnyanmisaka     RK_S32              fbc_header_len;
153*437bfbebSnyanmisaka     RK_U32              title_num;
154*437bfbebSnyanmisaka 
155*437bfbebSnyanmisaka     RK_S32              qpmap_en;
156*437bfbebSnyanmisaka     RK_S32              smart_en;
157*437bfbebSnyanmisaka 
158*437bfbebSnyanmisaka     /* external line buffer over 3K */
159*437bfbebSnyanmisaka     MppBufferGroup      ext_line_buf_grp;
160*437bfbebSnyanmisaka     RK_S32              ext_line_buf_size;
161*437bfbebSnyanmisaka     MppBuffer           ext_line_buf;
162*437bfbebSnyanmisaka     MppBuffer           buf_pass1;
163*437bfbebSnyanmisaka     MppBuffer           ext_line_bufs[MAX_FRAME_TASK_NUM];
164*437bfbebSnyanmisaka 
165*437bfbebSnyanmisaka     void                *tune;
166*437bfbebSnyanmisaka } H265eV511HalContext;
167*437bfbebSnyanmisaka 
168*437bfbebSnyanmisaka static const  RK_U32 lambda_tbl_pre_intra[52] = {
169*437bfbebSnyanmisaka     4206,   4945,   5814,   6835,   8035,   9446,   11105,  13056,
170*437bfbebSnyanmisaka     15348,  18044,  21213,  24938,  29318,  34467,  40521,  47637,
171*437bfbebSnyanmisaka     56003,  65839,  77402,  90996,  106977, 125765, 147852, 173819,
172*437bfbebSnyanmisaka     204346, 240234, 983,    1206,   1479,   1813,   2223,   2727,
173*437bfbebSnyanmisaka     3344,   4100,   5028,   6166,   7561,   9272,   11371,  13944,
174*437bfbebSnyanmisaka     17099,  20969,  25714,  31533,  38669,  47420,  58150,  71310,
175*437bfbebSnyanmisaka     87447, 107236, 131504, 161263,
176*437bfbebSnyanmisaka };
177*437bfbebSnyanmisaka 
178*437bfbebSnyanmisaka static const  RK_U32 lambda_tbl_pre_inter[52] = {
179*437bfbebSnyanmisaka     760,    959,    1210,   1526,   1925,   2428,   3063,   3864,
180*437bfbebSnyanmisaka     4874,   6147,   7754,   9781,   12337,  15562,  19629,  24760,
181*437bfbebSnyanmisaka     31231,  39394,  49691,  62678,  79061,  99725,  125790, 158668,
182*437bfbebSnyanmisaka     200140, 252451, 579,    730,    919,    1159,   1461,   1993,
183*437bfbebSnyanmisaka     2898,   3652,   4601,   5411,   6818,   7362,   9276,   11688,
184*437bfbebSnyanmisaka     14725,  18553,  25324,  31906,  40200,  50649,  68724,  74217,
185*437bfbebSnyanmisaka     101300, 127630, 148435, 187017,
186*437bfbebSnyanmisaka };
187*437bfbebSnyanmisaka 
188*437bfbebSnyanmisaka static RK_U32 rdo_lambda_table_I[60] = {
189*437bfbebSnyanmisaka     0x00000012, 0x00000017,
190*437bfbebSnyanmisaka     0x0000001d, 0x00000024, 0x0000002e, 0x0000003a,
191*437bfbebSnyanmisaka     0x00000049, 0x0000005c, 0x00000074, 0x00000092,
192*437bfbebSnyanmisaka     0x000000b8, 0x000000e8, 0x00000124, 0x00000170,
193*437bfbebSnyanmisaka     0x000001cf, 0x00000248, 0x000002df, 0x0000039f,
194*437bfbebSnyanmisaka     0x0000048f, 0x000005bf, 0x0000073d, 0x0000091f,
195*437bfbebSnyanmisaka     0x00000b7e, 0x00000e7a, 0x0000123d, 0x000016fb,
196*437bfbebSnyanmisaka     0x00001cf4, 0x0000247b, 0x00002df6, 0x000039e9,
197*437bfbebSnyanmisaka     0x000048f6, 0x00005bed, 0x000073d1, 0x000091ec,
198*437bfbebSnyanmisaka     0x0000b7d9, 0x0000e7a2, 0x000123d7, 0x00016fb2,
199*437bfbebSnyanmisaka     0x0001cf44, 0x000247ae, 0x0002df64, 0x00039e89,
200*437bfbebSnyanmisaka     0x00048f5c, 0x0005bec8, 0x00073d12, 0x00091eb8,
201*437bfbebSnyanmisaka     0x000b7d90, 0x000e7a23, 0x00123d71, 0x0016fb20,
202*437bfbebSnyanmisaka     0x001cf446, 0x00247ae1, 0x002df640, 0x0039e88c,
203*437bfbebSnyanmisaka     0x0048f5c3, 0x005bec81, 0x0073d119, 0x0091eb85,
204*437bfbebSnyanmisaka     0x00b7d902, 0x00e7a232
205*437bfbebSnyanmisaka };
206*437bfbebSnyanmisaka 
207*437bfbebSnyanmisaka static RK_U32 rdo_lambda_table_P[60] = {
208*437bfbebSnyanmisaka     0x0000002c, 0x00000038, 0x00000044, 0x00000058,
209*437bfbebSnyanmisaka     0x00000070, 0x00000089, 0x000000b0, 0x000000e0,
210*437bfbebSnyanmisaka     0x00000112, 0x00000160, 0x000001c0, 0x00000224,
211*437bfbebSnyanmisaka     0x000002c0, 0x00000380, 0x00000448, 0x00000580,
212*437bfbebSnyanmisaka     0x00000700, 0x00000890, 0x00000b00, 0x00000e00,
213*437bfbebSnyanmisaka     0x00001120, 0x00001600, 0x00001c00, 0x00002240,
214*437bfbebSnyanmisaka     0x00002c00, 0x00003800, 0x00004480, 0x00005800,
215*437bfbebSnyanmisaka     0x00007000, 0x00008900, 0x0000b000, 0x0000e000,
216*437bfbebSnyanmisaka     0x00011200, 0x00016000, 0x0001c000, 0x00022400,
217*437bfbebSnyanmisaka     0x0002c000, 0x00038000, 0x00044800, 0x00058000,
218*437bfbebSnyanmisaka     0x00070000, 0x00089000, 0x000b0000, 0x000e0000,
219*437bfbebSnyanmisaka     0x00112000, 0x00160000, 0x001c0000, 0x00224000,
220*437bfbebSnyanmisaka     0x002c0000, 0x00380000, 0x00448000, 0x00580000,
221*437bfbebSnyanmisaka     0x00700000, 0x00890000, 0x00b00000, 0x00e00000,
222*437bfbebSnyanmisaka     0x01120000, 0x01600000, 0x01c00000, 0x02240000,
223*437bfbebSnyanmisaka };
224*437bfbebSnyanmisaka 
225*437bfbebSnyanmisaka static RK_U8 vepu511_h265_cqm_intra8[64] = {
226*437bfbebSnyanmisaka     16, 16, 16, 16, 17, 18, 21, 24,
227*437bfbebSnyanmisaka     16, 16, 16, 16, 17, 19, 22, 25,
228*437bfbebSnyanmisaka     16, 16, 17, 18, 20, 22, 25, 29,
229*437bfbebSnyanmisaka     16, 16, 18, 21, 24, 27, 31, 36,
230*437bfbebSnyanmisaka     17, 17, 20, 24, 30, 35, 41, 47,
231*437bfbebSnyanmisaka     18, 19, 22, 27, 35, 44, 54, 65,
232*437bfbebSnyanmisaka     21, 22, 25, 31, 41, 54, 70, 88,
233*437bfbebSnyanmisaka     24, 25, 29, 36, 47, 65, 88, 115
234*437bfbebSnyanmisaka };
235*437bfbebSnyanmisaka 
236*437bfbebSnyanmisaka static RK_U8 vepu511_h265_cqm_inter8[64] = {
237*437bfbebSnyanmisaka     16, 16, 16, 16, 17, 18, 20, 24,
238*437bfbebSnyanmisaka     16, 16, 16, 17, 18, 20, 24, 25,
239*437bfbebSnyanmisaka     16, 16, 17, 18, 20, 24, 25, 28,
240*437bfbebSnyanmisaka     16, 17, 18, 20, 24, 25, 28, 33,
241*437bfbebSnyanmisaka     17, 18, 20, 24, 25, 28, 33, 41,
242*437bfbebSnyanmisaka     18, 20, 24, 25, 28, 33, 41, 54,
243*437bfbebSnyanmisaka     20, 24, 25, 28, 33, 41, 54, 71,
244*437bfbebSnyanmisaka     24, 25, 28, 33, 41, 54, 71, 91
245*437bfbebSnyanmisaka };
246*437bfbebSnyanmisaka 
save_to_file_511(char * name,void * ptr,size_t size)247*437bfbebSnyanmisaka void save_to_file_511(char *name, void *ptr, size_t size)
248*437bfbebSnyanmisaka {
249*437bfbebSnyanmisaka     FILE *fp = fopen(name, "w+b");
250*437bfbebSnyanmisaka     if (fp) {
251*437bfbebSnyanmisaka         fwrite(ptr, 1, size, fp);
252*437bfbebSnyanmisaka         fclose(fp);
253*437bfbebSnyanmisaka     } else
254*437bfbebSnyanmisaka         mpp_err("create file %s failed\n", name);
255*437bfbebSnyanmisaka }
256*437bfbebSnyanmisaka 
vepu511_h265e_dump(H265eV511HalContext * ctx,HalEncTask * enc_task)257*437bfbebSnyanmisaka void vepu511_h265e_dump(H265eV511HalContext *ctx, HalEncTask *enc_task)
258*437bfbebSnyanmisaka {
259*437bfbebSnyanmisaka     H265eSyntax_new *syn = ctx->syn;
260*437bfbebSnyanmisaka     HalBuf *hal_buf = hal_bufs_get_buf(ctx->dpb_bufs, syn->sp.ref_pic.slot_idx);
261*437bfbebSnyanmisaka     size_t buf_size = mpp_buffer_get_size(hal_buf->buf[0]);
262*437bfbebSnyanmisaka     size_t dws_size = mpp_buffer_get_size(hal_buf->buf[1]);
263*437bfbebSnyanmisaka     void *ptr = mpp_buffer_get_ptr(hal_buf->buf[0]);
264*437bfbebSnyanmisaka     void *dws_ptr = mpp_buffer_get_ptr(hal_buf->buf[1]);
265*437bfbebSnyanmisaka     RK_U32 frm_num = ctx->frms[enc_task->flags.reg_idx]->frame_count;
266*437bfbebSnyanmisaka     RK_S32 pid = getpid();
267*437bfbebSnyanmisaka     char name[128];
268*437bfbebSnyanmisaka     size_t name_len = sizeof(name) - 1;
269*437bfbebSnyanmisaka 
270*437bfbebSnyanmisaka     snprintf(name, name_len, "/mnt/sdcard/dump/refr_fbd_%d_frm%d.bin", pid, frm_num);
271*437bfbebSnyanmisaka     save_to_file_511(name, ptr + ctx->fbc_header_len, buf_size - ctx->fbc_header_len);
272*437bfbebSnyanmisaka 
273*437bfbebSnyanmisaka     snprintf(name, name_len, "/mnt/sdcard/dump/refr_fbh_%d_frm%d.bin", pid, frm_num);
274*437bfbebSnyanmisaka     save_to_file_511(name, ptr, ctx->fbc_header_len);
275*437bfbebSnyanmisaka 
276*437bfbebSnyanmisaka     snprintf(name, name_len, "/mnt/sdcard/dump/refr_dsp_%d_frm%d.bin", pid, frm_num);
277*437bfbebSnyanmisaka     save_to_file_511(name, dws_ptr, dws_size);
278*437bfbebSnyanmisaka 
279*437bfbebSnyanmisaka     hal_buf = hal_bufs_get_buf(ctx->dpb_bufs, syn->sp.recon_pic.slot_idx);
280*437bfbebSnyanmisaka     buf_size = mpp_buffer_get_size(hal_buf->buf[0]);
281*437bfbebSnyanmisaka     dws_size = mpp_buffer_get_size(hal_buf->buf[1]);
282*437bfbebSnyanmisaka     ptr = mpp_buffer_get_ptr(hal_buf->buf[0]);
283*437bfbebSnyanmisaka     dws_ptr = mpp_buffer_get_ptr(hal_buf->buf[1]);
284*437bfbebSnyanmisaka 
285*437bfbebSnyanmisaka     snprintf(name, name_len, "/mnt/sdcard/dump/recn_fbd_%d_frm%d_slot%d.bin", pid, frm_num,  syn->sp.recon_pic.slot_idx);
286*437bfbebSnyanmisaka     save_to_file_511(name, ptr + ctx->fbc_header_len, buf_size - ctx->fbc_header_len);
287*437bfbebSnyanmisaka 
288*437bfbebSnyanmisaka     snprintf(name, name_len, "/mnt/sdcard/dump/recn_fbh_%d_frm%d_slot%d.bin", pid, frm_num,  syn->sp.recon_pic.slot_idx);
289*437bfbebSnyanmisaka     save_to_file_511(name, ptr, ctx->fbc_header_len);
290*437bfbebSnyanmisaka 
291*437bfbebSnyanmisaka     snprintf(name, name_len, "/mnt/sdcard/dump/recn_dsp_%d_frm%d_slot%d.bin", pid, frm_num,  syn->sp.recon_pic.slot_idx);
292*437bfbebSnyanmisaka     save_to_file_511(name, dws_ptr, dws_size);
293*437bfbebSnyanmisaka 
294*437bfbebSnyanmisaka }
295*437bfbebSnyanmisaka 
setup_ext_line_bufs(H265eV511HalContext * ctx)296*437bfbebSnyanmisaka static void setup_ext_line_bufs(H265eV511HalContext *ctx)
297*437bfbebSnyanmisaka {
298*437bfbebSnyanmisaka     RK_S32 i;
299*437bfbebSnyanmisaka 
300*437bfbebSnyanmisaka     for (i = 0; i < ctx->task_cnt; i++) {
301*437bfbebSnyanmisaka         if (ctx->ext_line_bufs[i])
302*437bfbebSnyanmisaka             continue;
303*437bfbebSnyanmisaka 
304*437bfbebSnyanmisaka         mpp_buffer_get(ctx->ext_line_buf_grp, &ctx->ext_line_bufs[i],
305*437bfbebSnyanmisaka                        ctx->ext_line_buf_size);
306*437bfbebSnyanmisaka     }
307*437bfbebSnyanmisaka }
308*437bfbebSnyanmisaka 
clear_ext_line_bufs(H265eV511HalContext * ctx)309*437bfbebSnyanmisaka static void clear_ext_line_bufs(H265eV511HalContext *ctx)
310*437bfbebSnyanmisaka {
311*437bfbebSnyanmisaka     RK_S32 i;
312*437bfbebSnyanmisaka 
313*437bfbebSnyanmisaka     for (i = 0; i < ctx->task_cnt; i++) {
314*437bfbebSnyanmisaka         if (ctx->ext_line_bufs[i]) {
315*437bfbebSnyanmisaka             mpp_buffer_put(ctx->ext_line_bufs[i]);
316*437bfbebSnyanmisaka             ctx->ext_line_bufs[i] = NULL;
317*437bfbebSnyanmisaka         }
318*437bfbebSnyanmisaka     }
319*437bfbebSnyanmisaka }
320*437bfbebSnyanmisaka 
vepu511_h265_setup_hal_bufs(H265eV511HalContext * ctx)321*437bfbebSnyanmisaka static MPP_RET vepu511_h265_setup_hal_bufs(H265eV511HalContext *ctx)
322*437bfbebSnyanmisaka {
323*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
324*437bfbebSnyanmisaka     VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
325*437bfbebSnyanmisaka     RK_U32 frame_size;
326*437bfbebSnyanmisaka     VepuFmt input_fmt = VEPU5xx_FMT_YUV420P;
327*437bfbebSnyanmisaka     RK_S32 mb_wd64, mb_h64;
328*437bfbebSnyanmisaka     MppEncRefCfg ref_cfg = ctx->cfg->ref_cfg;
329*437bfbebSnyanmisaka     MppEncPrepCfg *prep = &ctx->cfg->prep;
330*437bfbebSnyanmisaka     RK_S32 old_max_cnt = ctx->max_buf_cnt;
331*437bfbebSnyanmisaka     RK_S32 new_max_cnt = 4;
332*437bfbebSnyanmisaka     RK_S32 alignment = 32;
333*437bfbebSnyanmisaka     RK_S32 aligned_w = MPP_ALIGN(prep->width,  alignment);
334*437bfbebSnyanmisaka 
335*437bfbebSnyanmisaka     hal_h265e_enter();
336*437bfbebSnyanmisaka 
337*437bfbebSnyanmisaka     mb_wd64 = (prep->width + 63) / 64;
338*437bfbebSnyanmisaka     mb_h64 = (prep->height + 63) / 64 + 1;
339*437bfbebSnyanmisaka 
340*437bfbebSnyanmisaka     frame_size = MPP_ALIGN(prep->width, 16) * MPP_ALIGN(prep->height, 16);
341*437bfbebSnyanmisaka     vepu5xx_set_fmt(fmt, ctx->cfg->prep.format);
342*437bfbebSnyanmisaka     input_fmt = (VepuFmt)fmt->format;
343*437bfbebSnyanmisaka     switch (input_fmt) {
344*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV400:
345*437bfbebSnyanmisaka         break;
346*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV420P:
347*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV420SP: {
348*437bfbebSnyanmisaka         frame_size = frame_size * 3 / 2;
349*437bfbebSnyanmisaka     } break;
350*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV422P:
351*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV422SP:
352*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUYV422:
353*437bfbebSnyanmisaka     case VEPU5xx_FMT_UYVY422:
354*437bfbebSnyanmisaka     case VEPU5xx_FMT_BGR565: {
355*437bfbebSnyanmisaka         frame_size *= 2;
356*437bfbebSnyanmisaka     } break;
357*437bfbebSnyanmisaka     case VEPU5xx_FMT_BGR888:
358*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV444SP:
359*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV444P: {
360*437bfbebSnyanmisaka         frame_size *= 3;
361*437bfbebSnyanmisaka     } break;
362*437bfbebSnyanmisaka     case VEPU5xx_FMT_BGRA8888: {
363*437bfbebSnyanmisaka         frame_size *= 4;
364*437bfbebSnyanmisaka     } break;
365*437bfbebSnyanmisaka     default: {
366*437bfbebSnyanmisaka         hal_h265e_err("invalid src color space: %d\n", input_fmt);
367*437bfbebSnyanmisaka         return MPP_NOK;
368*437bfbebSnyanmisaka     }
369*437bfbebSnyanmisaka     }
370*437bfbebSnyanmisaka 
371*437bfbebSnyanmisaka     if (ref_cfg) {
372*437bfbebSnyanmisaka         MppEncCpbInfo *info = mpp_enc_ref_cfg_get_cpb_info(ref_cfg);
373*437bfbebSnyanmisaka         new_max_cnt = MPP_MAX(new_max_cnt, info->dpb_size + 1);
374*437bfbebSnyanmisaka     }
375*437bfbebSnyanmisaka 
376*437bfbebSnyanmisaka     if (aligned_w > SZ_4K) {
377*437bfbebSnyanmisaka         RK_S32 ctu_w = (aligned_w + 31) / 32;
378*437bfbebSnyanmisaka         RK_S32 ext_line_buf_size = ((ctu_w - 113) * 27 + 15) / 16 * 16 * 16;
379*437bfbebSnyanmisaka 
380*437bfbebSnyanmisaka         if (NULL == ctx->ext_line_buf_grp)
381*437bfbebSnyanmisaka             mpp_buffer_group_get_internal(&ctx->ext_line_buf_grp, MPP_BUFFER_TYPE_ION);
382*437bfbebSnyanmisaka         else if (ext_line_buf_size != ctx->ext_line_buf_size) {
383*437bfbebSnyanmisaka             clear_ext_line_bufs(ctx);
384*437bfbebSnyanmisaka             mpp_buffer_group_clear(ctx->ext_line_buf_grp);
385*437bfbebSnyanmisaka         }
386*437bfbebSnyanmisaka 
387*437bfbebSnyanmisaka         mpp_assert(ctx->ext_line_buf_grp);
388*437bfbebSnyanmisaka         setup_ext_line_bufs(ctx);
389*437bfbebSnyanmisaka         ctx->ext_line_buf_size = ext_line_buf_size;
390*437bfbebSnyanmisaka     } else {
391*437bfbebSnyanmisaka         clear_ext_line_bufs(ctx);
392*437bfbebSnyanmisaka 
393*437bfbebSnyanmisaka         if (ctx->ext_line_buf_grp) {
394*437bfbebSnyanmisaka             mpp_buffer_group_clear(ctx->ext_line_buf_grp);
395*437bfbebSnyanmisaka             mpp_buffer_group_put(ctx->ext_line_buf_grp);
396*437bfbebSnyanmisaka             ctx->ext_line_buf_grp = NULL;
397*437bfbebSnyanmisaka         }
398*437bfbebSnyanmisaka         ctx->ext_line_buf_size = 0;
399*437bfbebSnyanmisaka     }
400*437bfbebSnyanmisaka 
401*437bfbebSnyanmisaka     if (frame_size > ctx->frame_size || new_max_cnt > old_max_cnt) {
402*437bfbebSnyanmisaka         size_t size[4] = {0};
403*437bfbebSnyanmisaka         RK_S32 ctu_w = (prep->width + 31) / 32;
404*437bfbebSnyanmisaka         RK_S32 ctu_h = (prep->height + 31) / 32;
405*437bfbebSnyanmisaka 
406*437bfbebSnyanmisaka         hal_bufs_deinit(ctx->dpb_bufs);
407*437bfbebSnyanmisaka         hal_bufs_init(&ctx->dpb_bufs);
408*437bfbebSnyanmisaka 
409*437bfbebSnyanmisaka         ctx->fbc_header_len = MPP_ALIGN(((mb_wd64 * mb_h64) << 6), SZ_8K);
410*437bfbebSnyanmisaka         size[0] = ctx->fbc_header_len + ((mb_wd64 * mb_h64) << 12) * 3 / 2; //fbc_h + fbc_b
411*437bfbebSnyanmisaka         size[1] = (mb_wd64 * mb_h64 << 8);
412*437bfbebSnyanmisaka         size[2] = MPP_ALIGN(mb_wd64 * mb_h64 * 16 * 4, 256) * 16;
413*437bfbebSnyanmisaka         /* smear bufs */
414*437bfbebSnyanmisaka         size[3] = MPP_ALIGN(ctu_w, 16) * MPP_ALIGN(ctu_h, 16);
415*437bfbebSnyanmisaka         new_max_cnt = MPP_MAX(new_max_cnt, old_max_cnt);
416*437bfbebSnyanmisaka 
417*437bfbebSnyanmisaka         hal_h265e_dbg_detail("frame size %d -> %d max count %d -> %d\n",
418*437bfbebSnyanmisaka                              ctx->frame_size, frame_size, old_max_cnt, new_max_cnt);
419*437bfbebSnyanmisaka 
420*437bfbebSnyanmisaka         hal_bufs_setup(ctx->dpb_bufs, new_max_cnt, MPP_ARRAY_ELEMS(size), size);
421*437bfbebSnyanmisaka 
422*437bfbebSnyanmisaka         ctx->frame_size = frame_size;
423*437bfbebSnyanmisaka         ctx->max_buf_cnt = new_max_cnt;
424*437bfbebSnyanmisaka     }
425*437bfbebSnyanmisaka     hal_h265e_leave();
426*437bfbebSnyanmisaka     return ret;
427*437bfbebSnyanmisaka }
428*437bfbebSnyanmisaka 
hal_h265e_vepu511_deinit(void * hal)429*437bfbebSnyanmisaka MPP_RET hal_h265e_vepu511_deinit(void *hal)
430*437bfbebSnyanmisaka {
431*437bfbebSnyanmisaka     H265eV511HalContext *ctx = (H265eV511HalContext *)hal;
432*437bfbebSnyanmisaka     RK_S32 i = 0;
433*437bfbebSnyanmisaka 
434*437bfbebSnyanmisaka     hal_h265e_enter();
435*437bfbebSnyanmisaka     MPP_FREE(ctx->poll_cfgs);
436*437bfbebSnyanmisaka     MPP_FREE(ctx->input_fmt);
437*437bfbebSnyanmisaka     hal_bufs_deinit(ctx->dpb_bufs);
438*437bfbebSnyanmisaka 
439*437bfbebSnyanmisaka     for (i = 0; i < ctx->task_cnt; i++) {
440*437bfbebSnyanmisaka         Vepu511H265eFrmCfg *frm = ctx->frms[i];
441*437bfbebSnyanmisaka 
442*437bfbebSnyanmisaka         if (!frm)
443*437bfbebSnyanmisaka             continue;
444*437bfbebSnyanmisaka 
445*437bfbebSnyanmisaka         if (frm->roir_buf) {
446*437bfbebSnyanmisaka             mpp_buffer_put(frm->roir_buf);
447*437bfbebSnyanmisaka             frm->roir_buf = NULL;
448*437bfbebSnyanmisaka             frm->roir_buf_size = 0;
449*437bfbebSnyanmisaka         }
450*437bfbebSnyanmisaka 
451*437bfbebSnyanmisaka         MPP_FREE(frm->roi_base_cfg_sw_buf);
452*437bfbebSnyanmisaka 
453*437bfbebSnyanmisaka         if (frm->reg_cfg) {
454*437bfbebSnyanmisaka             mpp_dev_multi_offset_deinit(frm->reg_cfg);
455*437bfbebSnyanmisaka             frm->reg_cfg = NULL;
456*437bfbebSnyanmisaka         }
457*437bfbebSnyanmisaka 
458*437bfbebSnyanmisaka         MPP_FREE(frm->regs_set);
459*437bfbebSnyanmisaka         MPP_FREE(frm->regs_ret);
460*437bfbebSnyanmisaka         MPP_FREE(ctx->frms[i]);
461*437bfbebSnyanmisaka     }
462*437bfbebSnyanmisaka 
463*437bfbebSnyanmisaka     clear_ext_line_bufs(ctx);
464*437bfbebSnyanmisaka 
465*437bfbebSnyanmisaka     if (ctx->ext_line_buf_grp) {
466*437bfbebSnyanmisaka         mpp_buffer_group_put(ctx->ext_line_buf_grp);
467*437bfbebSnyanmisaka         ctx->ext_line_buf_grp = NULL;
468*437bfbebSnyanmisaka     }
469*437bfbebSnyanmisaka 
470*437bfbebSnyanmisaka     if (ctx->buf_pass1) {
471*437bfbebSnyanmisaka         mpp_buffer_put(ctx->buf_pass1);
472*437bfbebSnyanmisaka         ctx->buf_pass1 = NULL;
473*437bfbebSnyanmisaka     }
474*437bfbebSnyanmisaka 
475*437bfbebSnyanmisaka     if (ctx->dev) {
476*437bfbebSnyanmisaka         mpp_dev_deinit(ctx->dev);
477*437bfbebSnyanmisaka         ctx->dev = NULL;
478*437bfbebSnyanmisaka     }
479*437bfbebSnyanmisaka 
480*437bfbebSnyanmisaka     if (ctx->reg_cfg) {
481*437bfbebSnyanmisaka         mpp_dev_multi_offset_deinit(ctx->reg_cfg);
482*437bfbebSnyanmisaka         ctx->reg_cfg = NULL;
483*437bfbebSnyanmisaka     }
484*437bfbebSnyanmisaka 
485*437bfbebSnyanmisaka     if (ctx->roi_grp) {
486*437bfbebSnyanmisaka         mpp_buffer_group_put(ctx->roi_grp);
487*437bfbebSnyanmisaka         ctx->roi_grp = NULL;
488*437bfbebSnyanmisaka     }
489*437bfbebSnyanmisaka 
490*437bfbebSnyanmisaka     if (ctx->tune) {
491*437bfbebSnyanmisaka         // vepu511_h265e_tune_deinit(ctx->tune);
492*437bfbebSnyanmisaka         ctx->tune = NULL;
493*437bfbebSnyanmisaka     }
494*437bfbebSnyanmisaka 
495*437bfbebSnyanmisaka     hal_h265e_leave();
496*437bfbebSnyanmisaka     return MPP_OK;
497*437bfbebSnyanmisaka }
498*437bfbebSnyanmisaka 
hal_h265e_vepu511_init(void * hal,MppEncHalCfg * cfg)499*437bfbebSnyanmisaka MPP_RET hal_h265e_vepu511_init(void *hal, MppEncHalCfg *cfg)
500*437bfbebSnyanmisaka {
501*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
502*437bfbebSnyanmisaka     H265eV511HalContext *ctx = (H265eV511HalContext *)hal;
503*437bfbebSnyanmisaka     RK_S32 i = 0;
504*437bfbebSnyanmisaka 
505*437bfbebSnyanmisaka     mpp_env_get_u32("hal_h265e_debug", &hal_h265e_debug, 0);
506*437bfbebSnyanmisaka     hal_h265e_enter();
507*437bfbebSnyanmisaka 
508*437bfbebSnyanmisaka     ctx->task_cnt = cfg->task_cnt;
509*437bfbebSnyanmisaka     mpp_assert(ctx->task_cnt && ctx->task_cnt <= MAX_FRAME_TASK_NUM);
510*437bfbebSnyanmisaka     if (ctx->task_cnt > MAX_FRAME_TASK_NUM)
511*437bfbebSnyanmisaka         ctx->task_cnt = MAX_FRAME_TASK_NUM;
512*437bfbebSnyanmisaka 
513*437bfbebSnyanmisaka     for (i = 0; i < ctx->task_cnt; i++) {
514*437bfbebSnyanmisaka         Vepu511H265eFrmCfg *frm_cfg = mpp_calloc(Vepu511H265eFrmCfg, 1);
515*437bfbebSnyanmisaka 
516*437bfbebSnyanmisaka         frm_cfg->regs_set = mpp_calloc(H265eV511RegSet, 1);
517*437bfbebSnyanmisaka         frm_cfg->regs_ret = mpp_calloc(H265eV511StatusElem, 1);
518*437bfbebSnyanmisaka         frm_cfg->frame_type = INTRA_FRAME;
519*437bfbebSnyanmisaka         ctx->frms[i] = frm_cfg;
520*437bfbebSnyanmisaka     }
521*437bfbebSnyanmisaka 
522*437bfbebSnyanmisaka     ctx->input_fmt      = mpp_calloc(VepuFmtCfg, 1);
523*437bfbebSnyanmisaka     ctx->cfg            = cfg->cfg;
524*437bfbebSnyanmisaka     hal_bufs_init(&ctx->dpb_bufs);
525*437bfbebSnyanmisaka 
526*437bfbebSnyanmisaka     ctx->frame_count = -1;
527*437bfbebSnyanmisaka     ctx->frame_cnt_gen_ready = 0;
528*437bfbebSnyanmisaka     ctx->enc_mode = 1;
529*437bfbebSnyanmisaka     cfg->cap_recn_out = 1;
530*437bfbebSnyanmisaka     cfg->type = VPU_CLIENT_RKVENC;
531*437bfbebSnyanmisaka     ret = mpp_dev_init(&cfg->dev, cfg->type);
532*437bfbebSnyanmisaka     if (ret) {
533*437bfbebSnyanmisaka         mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
534*437bfbebSnyanmisaka         return ret;
535*437bfbebSnyanmisaka     }
536*437bfbebSnyanmisaka     mpp_dev_multi_offset_init(&ctx->reg_cfg, 24);
537*437bfbebSnyanmisaka     ctx->dev = cfg->dev;
538*437bfbebSnyanmisaka     ctx->frame_type = INTRA_FRAME;
539*437bfbebSnyanmisaka 
540*437bfbebSnyanmisaka     {   /* setup default hardware config */
541*437bfbebSnyanmisaka         MppEncHwCfg *hw = &cfg->cfg->hw;
542*437bfbebSnyanmisaka         RK_U32 j;
543*437bfbebSnyanmisaka 
544*437bfbebSnyanmisaka         hw->qp_delta_row_i  = 2;
545*437bfbebSnyanmisaka         hw->qp_delta_row    = 2;
546*437bfbebSnyanmisaka         hw->qbias_i         = 171;
547*437bfbebSnyanmisaka         hw->qbias_p         = 85;
548*437bfbebSnyanmisaka         hw->qbias_en        = 0;
549*437bfbebSnyanmisaka 
550*437bfbebSnyanmisaka         for (j = 0; j < MPP_ARRAY_ELEMS(hw->mode_bias); j++)
551*437bfbebSnyanmisaka             hw->mode_bias[j] = 8;
552*437bfbebSnyanmisaka     }
553*437bfbebSnyanmisaka 
554*437bfbebSnyanmisaka     ctx->poll_slice_max = 8;
555*437bfbebSnyanmisaka     ctx->poll_cfg_size = (sizeof(ctx->poll_cfgs) + sizeof(RK_S32) * ctx->poll_slice_max) * 2;
556*437bfbebSnyanmisaka     ctx->poll_cfgs = mpp_malloc_size(MppDevPollCfg, ctx->poll_cfg_size);
557*437bfbebSnyanmisaka 
558*437bfbebSnyanmisaka     if (NULL == ctx->poll_cfgs) {
559*437bfbebSnyanmisaka         ret = MPP_ERR_MALLOC;
560*437bfbebSnyanmisaka         mpp_err_f("init poll cfg buffer failed\n");
561*437bfbebSnyanmisaka         goto DONE;
562*437bfbebSnyanmisaka     }
563*437bfbebSnyanmisaka 
564*437bfbebSnyanmisaka     ctx->output_cb = cfg->output_cb;
565*437bfbebSnyanmisaka     cfg->cap_recn_out = 1;
566*437bfbebSnyanmisaka 
567*437bfbebSnyanmisaka     // ctx->tune = vepu511_h265e_tune_init(ctx);
568*437bfbebSnyanmisaka 
569*437bfbebSnyanmisaka DONE:
570*437bfbebSnyanmisaka     if (ret)
571*437bfbebSnyanmisaka         hal_h265e_vepu511_deinit(hal);
572*437bfbebSnyanmisaka 
573*437bfbebSnyanmisaka     hal_h265e_leave();
574*437bfbebSnyanmisaka     return ret;
575*437bfbebSnyanmisaka }
576*437bfbebSnyanmisaka 
hal_h265e_vepu511_prepare(void * hal)577*437bfbebSnyanmisaka static MPP_RET hal_h265e_vepu511_prepare(void *hal)
578*437bfbebSnyanmisaka {
579*437bfbebSnyanmisaka     H265eV511HalContext *ctx = (H265eV511HalContext *)hal;
580*437bfbebSnyanmisaka     MppEncPrepCfg *prep = &ctx->cfg->prep;
581*437bfbebSnyanmisaka 
582*437bfbebSnyanmisaka     hal_h265e_dbg_func("enter %p\n", hal);
583*437bfbebSnyanmisaka 
584*437bfbebSnyanmisaka     if (prep->change_res) {
585*437bfbebSnyanmisaka         RK_S32 i;
586*437bfbebSnyanmisaka 
587*437bfbebSnyanmisaka         // pre-alloc required buffers to reduce first frame delay
588*437bfbebSnyanmisaka         vepu511_h265_setup_hal_bufs(ctx);
589*437bfbebSnyanmisaka         for (i = 0; i < ctx->max_buf_cnt; i++)
590*437bfbebSnyanmisaka             hal_bufs_get_buf(ctx->dpb_bufs, i);
591*437bfbebSnyanmisaka 
592*437bfbebSnyanmisaka         prep->change_res = 0;
593*437bfbebSnyanmisaka     }
594*437bfbebSnyanmisaka 
595*437bfbebSnyanmisaka     hal_h265e_dbg_func("leave %p\n", hal);
596*437bfbebSnyanmisaka 
597*437bfbebSnyanmisaka     return MPP_OK;
598*437bfbebSnyanmisaka }
599*437bfbebSnyanmisaka 
600*437bfbebSnyanmisaka static MPP_RET
vepu511_h265_set_patch_info(H265eSyntax_new * syn,VepuFmt input_fmt,MppDevRegOffCfgs * offsets,HalEncTask * task)601*437bfbebSnyanmisaka vepu511_h265_set_patch_info(H265eSyntax_new *syn, VepuFmt input_fmt, MppDevRegOffCfgs *offsets, HalEncTask *task)
602*437bfbebSnyanmisaka {
603*437bfbebSnyanmisaka     RK_U32 hor_stride = syn->pp.hor_stride;
604*437bfbebSnyanmisaka     RK_U32 ver_stride = syn->pp.ver_stride ? syn->pp.ver_stride : syn->pp.pic_height;
605*437bfbebSnyanmisaka     RK_U32 frame_size = hor_stride * ver_stride;
606*437bfbebSnyanmisaka     RK_U32 u_offset = 0, v_offset = 0;
607*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
608*437bfbebSnyanmisaka 
609*437bfbebSnyanmisaka     if (MPP_FRAME_FMT_IS_FBC(mpp_frame_get_fmt(task->frame))) {
610*437bfbebSnyanmisaka         u_offset = mpp_frame_get_fbc_offset(task->frame);
611*437bfbebSnyanmisaka         v_offset = u_offset;
612*437bfbebSnyanmisaka     } else {
613*437bfbebSnyanmisaka         switch (input_fmt) {
614*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV420P: {
615*437bfbebSnyanmisaka             u_offset = frame_size;
616*437bfbebSnyanmisaka             v_offset = frame_size * 5 / 4;
617*437bfbebSnyanmisaka         } break;
618*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV420SP:
619*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV422SP: {
620*437bfbebSnyanmisaka             u_offset = frame_size;
621*437bfbebSnyanmisaka             v_offset = frame_size;
622*437bfbebSnyanmisaka         } break;
623*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV422P: {
624*437bfbebSnyanmisaka             u_offset = frame_size;
625*437bfbebSnyanmisaka             v_offset = frame_size * 3 / 2;
626*437bfbebSnyanmisaka         } break;
627*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV400:
628*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUYV422:
629*437bfbebSnyanmisaka         case VEPU5xx_FMT_UYVY422: {
630*437bfbebSnyanmisaka             u_offset = 0;
631*437bfbebSnyanmisaka             v_offset = 0;
632*437bfbebSnyanmisaka         } break;
633*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGR565:
634*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGR888:
635*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGRA8888: {
636*437bfbebSnyanmisaka             u_offset = 0;
637*437bfbebSnyanmisaka             v_offset = 0;
638*437bfbebSnyanmisaka         } break;
639*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV444SP : {
640*437bfbebSnyanmisaka             u_offset = hor_stride * ver_stride;
641*437bfbebSnyanmisaka             v_offset = hor_stride * ver_stride;
642*437bfbebSnyanmisaka         } break;
643*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV444P : {
644*437bfbebSnyanmisaka             u_offset = hor_stride * ver_stride;
645*437bfbebSnyanmisaka             v_offset = hor_stride * ver_stride * 2;
646*437bfbebSnyanmisaka         } break;
647*437bfbebSnyanmisaka         default: {
648*437bfbebSnyanmisaka             hal_h265e_err("unknown color space: %d\n", input_fmt);
649*437bfbebSnyanmisaka             u_offset = frame_size;
650*437bfbebSnyanmisaka             v_offset = frame_size * 5 / 4;
651*437bfbebSnyanmisaka         }
652*437bfbebSnyanmisaka         }
653*437bfbebSnyanmisaka     }
654*437bfbebSnyanmisaka     mpp_dev_multi_offset_update(offsets, 161, u_offset);
655*437bfbebSnyanmisaka     mpp_dev_multi_offset_update(offsets, 162, v_offset);
656*437bfbebSnyanmisaka 
657*437bfbebSnyanmisaka     return ret;
658*437bfbebSnyanmisaka }
659*437bfbebSnyanmisaka 
vepu511_h265e_save_pass1_patch(H265eV511RegSet * regs,H265eV511HalContext * ctx,RK_S32 tiles_enabled_flag)660*437bfbebSnyanmisaka static MPP_RET vepu511_h265e_save_pass1_patch(H265eV511RegSet *regs, H265eV511HalContext *ctx,
661*437bfbebSnyanmisaka                                               RK_S32 tiles_enabled_flag)
662*437bfbebSnyanmisaka {
663*437bfbebSnyanmisaka     H265eVepu511Frame *reg_frm = &regs->reg_frm;
664*437bfbebSnyanmisaka     RK_S32 width = ctx->cfg->prep.width;
665*437bfbebSnyanmisaka     RK_S32 height = ctx->cfg->prep.height;
666*437bfbebSnyanmisaka     RK_S32 width_align = MPP_ALIGN(width, 16);
667*437bfbebSnyanmisaka     RK_S32 height_align = MPP_ALIGN(height, 16);
668*437bfbebSnyanmisaka 
669*437bfbebSnyanmisaka     if (NULL == ctx->buf_pass1) {
670*437bfbebSnyanmisaka         mpp_buffer_get(NULL, &ctx->buf_pass1, width_align * height_align * 3 / 2);
671*437bfbebSnyanmisaka         if (!ctx->buf_pass1) {
672*437bfbebSnyanmisaka             mpp_err("buf_pass1 malloc fail, debreath invaild");
673*437bfbebSnyanmisaka             return MPP_NOK;
674*437bfbebSnyanmisaka         }
675*437bfbebSnyanmisaka     }
676*437bfbebSnyanmisaka 
677*437bfbebSnyanmisaka     reg_frm->common.enc_pic.cur_frm_ref = 1;
678*437bfbebSnyanmisaka     reg_frm->common.rfpw_h_addr = mpp_buffer_get_fd(ctx->buf_pass1);
679*437bfbebSnyanmisaka     reg_frm->common.rfpw_b_addr = reg_frm->common.rfpw_h_addr;
680*437bfbebSnyanmisaka     reg_frm->common.enc_pic.rec_fbc_dis = 1;
681*437bfbebSnyanmisaka 
682*437bfbebSnyanmisaka     if (tiles_enabled_flag)
683*437bfbebSnyanmisaka         reg_frm->synt_pps.lpf_fltr_acrs_til = 0;
684*437bfbebSnyanmisaka 
685*437bfbebSnyanmisaka     mpp_dev_multi_offset_update(ctx->reg_cfg, 164, width_align * height_align);
686*437bfbebSnyanmisaka 
687*437bfbebSnyanmisaka     /* NOTE: disable split to avoid lowdelay slice output */
688*437bfbebSnyanmisaka     reg_frm->common.sli_splt.sli_splt = 0;
689*437bfbebSnyanmisaka     reg_frm->common.enc_pic.slen_fifo = 0;
690*437bfbebSnyanmisaka 
691*437bfbebSnyanmisaka     return MPP_OK;
692*437bfbebSnyanmisaka }
693*437bfbebSnyanmisaka 
vepu511_h265e_use_pass1_patch(H265eV511RegSet * regs,H265eV511HalContext * ctx)694*437bfbebSnyanmisaka static MPP_RET vepu511_h265e_use_pass1_patch(H265eV511RegSet *regs, H265eV511HalContext *ctx)
695*437bfbebSnyanmisaka {
696*437bfbebSnyanmisaka     Vepu511ControlCfg *reg_ctl = &regs->reg_ctl;
697*437bfbebSnyanmisaka     H265eVepu511Frame *reg_frm = &regs->reg_frm;
698*437bfbebSnyanmisaka     RK_S32 width_align = MPP_ALIGN(ctx->cfg->prep.width, 16);
699*437bfbebSnyanmisaka     RK_S32 height_align = MPP_ALIGN(ctx->cfg->prep.height, 16);
700*437bfbebSnyanmisaka     RK_S32 y_stride = width_align;
701*437bfbebSnyanmisaka     VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
702*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
703*437bfbebSnyanmisaka 
704*437bfbebSnyanmisaka     hal_h265e_dbg_func("enter\n");
705*437bfbebSnyanmisaka 
706*437bfbebSnyanmisaka     reg_frm->common.enc_pic.rfpr_compress_mode = 1;
707*437bfbebSnyanmisaka     reg_ctl->dtrns_map.src_bus_edin = fmt->src_endian;
708*437bfbebSnyanmisaka     reg_frm->common.src_fmt.src_cfmt = VEPU5xx_FMT_YUV420SP;
709*437bfbebSnyanmisaka     reg_frm->common.src_fmt.alpha_swap = 0;
710*437bfbebSnyanmisaka     reg_frm->common.src_fmt.rbuv_swap = 0;
711*437bfbebSnyanmisaka     reg_frm->common.src_fmt.out_fmt = 1;
712*437bfbebSnyanmisaka 
713*437bfbebSnyanmisaka     reg_frm->common.src_strd0.src_strd0 = y_stride;
714*437bfbebSnyanmisaka     reg_frm->common.src_strd1.src_strd1 = y_stride;
715*437bfbebSnyanmisaka 
716*437bfbebSnyanmisaka     reg_frm->common.src_proc.src_mirr = 0;
717*437bfbebSnyanmisaka     reg_frm->common.src_proc.src_rot = 0;
718*437bfbebSnyanmisaka 
719*437bfbebSnyanmisaka     reg_frm->common.adr_src0 = mpp_buffer_get_fd(ctx->buf_pass1);
720*437bfbebSnyanmisaka     reg_frm->common.adr_src1 = reg_frm->common.adr_src0;
721*437bfbebSnyanmisaka 
722*437bfbebSnyanmisaka     /* input cb addr */
723*437bfbebSnyanmisaka     ret = mpp_dev_multi_offset_update(ctx->reg_cfg, 161, width_align * height_align);
724*437bfbebSnyanmisaka     if (ret)
725*437bfbebSnyanmisaka         mpp_err_f("set input cb addr offset failed %d\n", ret);
726*437bfbebSnyanmisaka 
727*437bfbebSnyanmisaka     return MPP_OK;
728*437bfbebSnyanmisaka }
729*437bfbebSnyanmisaka 
setup_vepu511_ext_line_buf(H265eV511HalContext * ctx,H265eV511RegSet * regs)730*437bfbebSnyanmisaka static void setup_vepu511_ext_line_buf(H265eV511HalContext *ctx, H265eV511RegSet *regs)
731*437bfbebSnyanmisaka {
732*437bfbebSnyanmisaka     H265eVepu511Frame *reg_frm = &regs->reg_frm;
733*437bfbebSnyanmisaka     RK_S32 fd;
734*437bfbebSnyanmisaka 
735*437bfbebSnyanmisaka     if (ctx->ext_line_buf) {
736*437bfbebSnyanmisaka         fd = mpp_buffer_get_fd(ctx->ext_line_buf);
737*437bfbebSnyanmisaka 
738*437bfbebSnyanmisaka         reg_frm->common.ebufb_addr = fd;
739*437bfbebSnyanmisaka         reg_frm->common.ebuft_addr = fd;
740*437bfbebSnyanmisaka         mpp_dev_multi_offset_update(ctx->reg_cfg, 178, ctx->ext_line_buf_size);
741*437bfbebSnyanmisaka     } else {
742*437bfbebSnyanmisaka         reg_frm->common.ebufb_addr = 0;
743*437bfbebSnyanmisaka         reg_frm->common.ebuft_addr = 0;
744*437bfbebSnyanmisaka     }
745*437bfbebSnyanmisaka }
746*437bfbebSnyanmisaka 
vepu511_h265_set_scaling_list(H265eV511RegSet * regs)747*437bfbebSnyanmisaka static void vepu511_h265_set_scaling_list(H265eV511RegSet *regs)
748*437bfbebSnyanmisaka {
749*437bfbebSnyanmisaka     H265eVepu511SclCfg *s = &regs->reg_scl;
750*437bfbebSnyanmisaka     RK_U8 *p = (RK_U8 *)&s->tu8_intra_y[0];
751*437bfbebSnyanmisaka     RK_U32 scl_lst_sel = regs->reg_frm.rdo_cfg.scl_lst_sel;
752*437bfbebSnyanmisaka     RK_U8 idx;
753*437bfbebSnyanmisaka 
754*437bfbebSnyanmisaka     hal_h265e_dbg_func("enter\n");
755*437bfbebSnyanmisaka 
756*437bfbebSnyanmisaka     if (scl_lst_sel == 1) {
757*437bfbebSnyanmisaka         for (idx = 0; idx < 64; idx++) {
758*437bfbebSnyanmisaka             /* TU8 intra Y/U/V */
759*437bfbebSnyanmisaka             p[idx + 64 * 0] = vepu511_h265_cqm_intra8[63 - idx];
760*437bfbebSnyanmisaka 
761*437bfbebSnyanmisaka             p[idx + 64 * 1] = vepu511_h265_cqm_intra8[63 - idx];
762*437bfbebSnyanmisaka             p[idx + 64 * 2] = vepu511_h265_cqm_intra8[63 - idx];
763*437bfbebSnyanmisaka 
764*437bfbebSnyanmisaka             /* TU8 inter Y/U/V */
765*437bfbebSnyanmisaka             p[idx + 64 * 3] = vepu511_h265_cqm_inter8[63 - idx];
766*437bfbebSnyanmisaka             p[idx + 64 * 4] = vepu511_h265_cqm_inter8[63 - idx];
767*437bfbebSnyanmisaka             p[idx + 64 * 5] = vepu511_h265_cqm_inter8[63 - idx];
768*437bfbebSnyanmisaka 
769*437bfbebSnyanmisaka             /* TU16 intra Y/U/V AC */
770*437bfbebSnyanmisaka             p[idx + 64 * 6] = vepu511_h265_cqm_intra8[63 - idx];
771*437bfbebSnyanmisaka             p[idx + 64 * 7] = vepu511_h265_cqm_intra8[63 - idx];
772*437bfbebSnyanmisaka             p[idx + 64 * 8] = vepu511_h265_cqm_intra8[63 - idx];
773*437bfbebSnyanmisaka 
774*437bfbebSnyanmisaka             /* TU16 inter Y/U/V AC */
775*437bfbebSnyanmisaka             p[idx + 64 *  9] = vepu511_h265_cqm_inter8[63 - idx];
776*437bfbebSnyanmisaka             p[idx + 64 * 10] = vepu511_h265_cqm_inter8[63 - idx];
777*437bfbebSnyanmisaka             p[idx + 64 * 11] = vepu511_h265_cqm_inter8[63 - idx];
778*437bfbebSnyanmisaka 
779*437bfbebSnyanmisaka             /* TU32 intra/inter Y AC */
780*437bfbebSnyanmisaka             p[idx + 64 * 12] = vepu511_h265_cqm_intra8[63 - idx];
781*437bfbebSnyanmisaka             p[idx + 64 * 13] = vepu511_h265_cqm_inter8[63 - idx];
782*437bfbebSnyanmisaka         }
783*437bfbebSnyanmisaka 
784*437bfbebSnyanmisaka         s->tu_dc0.tu16_intra_y_dc = 16;
785*437bfbebSnyanmisaka         s->tu_dc0.tu16_intra_u_dc = 16;
786*437bfbebSnyanmisaka         s->tu_dc0.tu16_intra_v_dc = 16;
787*437bfbebSnyanmisaka         s->tu_dc0.tu16_inter_y_dc = 16;
788*437bfbebSnyanmisaka         s->tu_dc1.tu16_inter_u_dc = 16;
789*437bfbebSnyanmisaka         s->tu_dc1.tu16_inter_v_dc = 16;
790*437bfbebSnyanmisaka         s->tu_dc1.tu32_intra_y_dc = 16;
791*437bfbebSnyanmisaka         s->tu_dc1.tu32_inter_y_dc = 16;
792*437bfbebSnyanmisaka     } else if (scl_lst_sel == 2) {
793*437bfbebSnyanmisaka         mpp_log_f("scaling_list_mode 2 is not supported yet\n");
794*437bfbebSnyanmisaka     }
795*437bfbebSnyanmisaka 
796*437bfbebSnyanmisaka     hal_h265e_dbg_func("leave\n");
797*437bfbebSnyanmisaka }
798*437bfbebSnyanmisaka 
vepu511_h265_set_normal(H265eV511HalContext * ctx,H265eV511RegSet * regs)799*437bfbebSnyanmisaka static void vepu511_h265_set_normal(H265eV511HalContext *ctx, H265eV511RegSet *regs)
800*437bfbebSnyanmisaka {
801*437bfbebSnyanmisaka     Vepu511ControlCfg *reg_ctl = &regs->reg_ctl;
802*437bfbebSnyanmisaka 
803*437bfbebSnyanmisaka     reg_ctl->enc_strt.lkt_num      = 0;
804*437bfbebSnyanmisaka     reg_ctl->enc_strt.vepu_cmd     = ctx->enc_mode;
805*437bfbebSnyanmisaka     reg_ctl->enc_clr.safe_clr      = 0;
806*437bfbebSnyanmisaka     reg_ctl->enc_clr.force_clr     = 0;
807*437bfbebSnyanmisaka 
808*437bfbebSnyanmisaka     reg_ctl->int_en.enc_done_en        = 1;
809*437bfbebSnyanmisaka     reg_ctl->int_en.lkt_node_done_en   = 1;
810*437bfbebSnyanmisaka     reg_ctl->int_en.sclr_done_en       = 1;
811*437bfbebSnyanmisaka     reg_ctl->int_en.vslc_done_en       = 1;
812*437bfbebSnyanmisaka     reg_ctl->int_en.vbsf_oflw_en       = 1;
813*437bfbebSnyanmisaka     reg_ctl->int_en.vbuf_lens_en       = 1;
814*437bfbebSnyanmisaka     reg_ctl->int_en.enc_err_en         = 1;
815*437bfbebSnyanmisaka     reg_ctl->int_en.vsrc_err_en        = 1;
816*437bfbebSnyanmisaka     reg_ctl->int_en.wdg_en             = 1;
817*437bfbebSnyanmisaka     reg_ctl->int_en.lkt_err_int_en     = 1;
818*437bfbebSnyanmisaka     reg_ctl->int_en.lkt_err_int_en     = 1;
819*437bfbebSnyanmisaka     reg_ctl->int_en.lkt_err_stop_en    = 1;
820*437bfbebSnyanmisaka     reg_ctl->int_en.lkt_force_stop_en  = 1;
821*437bfbebSnyanmisaka     reg_ctl->int_en.jslc_done_en       = 1;
822*437bfbebSnyanmisaka     reg_ctl->int_en.jbsf_oflw_en       = 1;
823*437bfbebSnyanmisaka     reg_ctl->int_en.jbuf_lens_en       = 1;
824*437bfbebSnyanmisaka     reg_ctl->int_en.dvbm_err_en        = 0;
825*437bfbebSnyanmisaka 
826*437bfbebSnyanmisaka     reg_ctl->int_clr.enc_done_clr = 1;
827*437bfbebSnyanmisaka 
828*437bfbebSnyanmisaka     reg_ctl->dtrns_map.jpeg_bus_edin    = 0x7;
829*437bfbebSnyanmisaka     reg_ctl->int_clr.enc_done_clr = 1;
830*437bfbebSnyanmisaka 
831*437bfbebSnyanmisaka     reg_ctl->dtrns_map.jpeg_bus_edin     = 0x7;
832*437bfbebSnyanmisaka     reg_ctl->dtrns_map.src_bus_edin      = 0x0;
833*437bfbebSnyanmisaka     reg_ctl->dtrns_map.meiw_bus_edin     = 0x0;
834*437bfbebSnyanmisaka     reg_ctl->dtrns_map.bsw_bus_edin      = 0x7;
835*437bfbebSnyanmisaka     reg_ctl->dtrns_map.lktr_bus_edin     = 0x0;
836*437bfbebSnyanmisaka     reg_ctl->dtrns_map.roir_bus_edin     = 0x0;
837*437bfbebSnyanmisaka     reg_ctl->dtrns_map.lktw_bus_edin     = 0x0;
838*437bfbebSnyanmisaka     reg_ctl->dtrns_map.rec_nfbc_bus_edin = 0x0;
839*437bfbebSnyanmisaka 
840*437bfbebSnyanmisaka     reg_ctl->dtrns_cfg.axi_brsp_cke     = 0x3ff;
841*437bfbebSnyanmisaka     reg_ctl->dtrns_cfg.axi_brsp_cke     = 0x3ff;
842*437bfbebSnyanmisaka     reg_ctl->enc_wdg.vs_load_thd        = 0;
843*437bfbebSnyanmisaka     reg_ctl->opt_strg.cke               = 1;
844*437bfbebSnyanmisaka     reg_ctl->opt_strg.resetn_hw_en      = 0;
845*437bfbebSnyanmisaka     reg_ctl->opt_strg.rfpr_err_e        = 1;
846*437bfbebSnyanmisaka     reg_ctl->opt_strg.sram_ckg_en       = 0;
847*437bfbebSnyanmisaka 
848*437bfbebSnyanmisaka     /* enable rdo clk gating */
849*437bfbebSnyanmisaka     {
850*437bfbebSnyanmisaka         RK_U32 *rdo_ckg = (RK_U32*)&regs->reg_ctl.reg0022.rdo_ckg_hevc;
851*437bfbebSnyanmisaka 
852*437bfbebSnyanmisaka         *rdo_ckg = 0x0;
853*437bfbebSnyanmisaka     }
854*437bfbebSnyanmisaka 
855*437bfbebSnyanmisaka }
856*437bfbebSnyanmisaka 
vepu511_h265_set_prep(void * hal,HalEncTask * task,H265eV511RegSet * regs)857*437bfbebSnyanmisaka static void vepu511_h265_set_prep(void *hal, HalEncTask *task, H265eV511RegSet *regs)
858*437bfbebSnyanmisaka {
859*437bfbebSnyanmisaka     H265eV511HalContext *ctx = (H265eV511HalContext *)hal;
860*437bfbebSnyanmisaka     H265eVepu511Frame *reg_frm = &regs->reg_frm;
861*437bfbebSnyanmisaka     Vepu511RcRoi *reg_klut = &regs->reg_rc_roi;
862*437bfbebSnyanmisaka     H265eSyntax_new *syn = (H265eSyntax_new *)task->syntax.data;
863*437bfbebSnyanmisaka     RK_U32 pic_width_align8, pic_height_align8;
864*437bfbebSnyanmisaka     RK_S32 pic_wd32, pic_h32;
865*437bfbebSnyanmisaka     MppEncSceneMode sm = ctx->cfg->tune.scene_mode;
866*437bfbebSnyanmisaka 
867*437bfbebSnyanmisaka     hal_h265e_enter();
868*437bfbebSnyanmisaka 
869*437bfbebSnyanmisaka     pic_width_align8 = (syn->pp.pic_width + 7) & (~7);
870*437bfbebSnyanmisaka     pic_height_align8 = (syn->pp.pic_height + 7) & (~7);
871*437bfbebSnyanmisaka     pic_wd32 = (syn->pp.pic_width +  31) / 32;
872*437bfbebSnyanmisaka     pic_h32 = (syn->pp.pic_height + 31) / 32;
873*437bfbebSnyanmisaka 
874*437bfbebSnyanmisaka     reg_frm->common.enc_rsl.pic_wd8_m1 = pic_width_align8 / 8 - 1;
875*437bfbebSnyanmisaka     reg_frm->common.enc_rsl.pic_hd8_m1 = pic_height_align8 / 8 - 1;
876*437bfbebSnyanmisaka     reg_frm->common.src_fill.pic_wfill = (syn->pp.pic_width & 0x7)
877*437bfbebSnyanmisaka                                          ? (8 - (syn->pp.pic_width & 0x7)) : 0;
878*437bfbebSnyanmisaka     reg_frm->common.src_fill.pic_hfill = (syn->pp.pic_height & 0x7)
879*437bfbebSnyanmisaka                                          ? (8 - (syn->pp.pic_height & 0x7)) : 0;
880*437bfbebSnyanmisaka 
881*437bfbebSnyanmisaka     /* H.265 mode */
882*437bfbebSnyanmisaka     reg_frm->common.enc_pic.enc_stnd      = 1;
883*437bfbebSnyanmisaka     /* current frame will be refered */
884*437bfbebSnyanmisaka     reg_frm->common.enc_pic.cur_frm_ref   = !syn->sp.non_reference_flag;
885*437bfbebSnyanmisaka 
886*437bfbebSnyanmisaka     reg_frm->common.enc_pic.bs_scp        = 1;
887*437bfbebSnyanmisaka     reg_frm->common.enc_pic.log2_ctu_num_hevc  = mpp_ceil_log2(pic_wd32 * pic_h32);
888*437bfbebSnyanmisaka 
889*437bfbebSnyanmisaka     reg_klut->klut_ofst.chrm_klut_ofst = (ctx->frame_type == INTRA_FRAME) ? 6 :
890*437bfbebSnyanmisaka                                          (sm == MPP_ENC_SCENE_MODE_IPC ? 9 : 6);
891*437bfbebSnyanmisaka 
892*437bfbebSnyanmisaka     reg_frm->common.enc_pic.rfpr_compress_mode = 0;
893*437bfbebSnyanmisaka     reg_frm->common.enc_pic.rec_fbc_dis = 0;
894*437bfbebSnyanmisaka 
895*437bfbebSnyanmisaka     reg_frm->rdo_cfg.chrm_spcl  = 0;
896*437bfbebSnyanmisaka 
897*437bfbebSnyanmisaka     /*
898*437bfbebSnyanmisaka      * H265 Max Inter/Intra cu prediction Mode.
899*437bfbebSnyanmisaka      * More prediction modes lead to better compression performance but increase computational cycles.
900*437bfbebSnyanmisaka      *
901*437bfbebSnyanmisaka      * Default speed preset configuration to 0.67 PPC, ~40 FPS for 4K resolution at 500MHz:
902*437bfbebSnyanmisaka      * - Set Inter prediction 32/16/8 CUs at 1/3/2 and Intra 32/16/8/4 CUs at 1,
903*437bfbebSnyanmisaka      *   Maximize the number of modes while ensuring the prediction hierarchy remains unchanged.
904*437bfbebSnyanmisaka      * - Set cime_fuse = 1, disable dual-window search for higher real-time performance.
905*437bfbebSnyanmisaka      * - Set fme_lvl_mrg = 1, enable FME's depth1 and depth2 joint search,
906*437bfbebSnyanmisaka      *   improves real-time performance but will reduce the compression ratio.
907*437bfbebSnyanmisaka      * - Set cime_srch_lftw/rgtw/uph/dwnh = 12/12/15/15, expand CIME search range degraded real-time performance.
908*437bfbebSnyanmisaka      * - Set rime_prelvl_en = 0, disable RIME pre-level to improve real-time performance.
909*437bfbebSnyanmisaka      * - Set fmdc_adju_split32 = 0, enable CU32 block prediction.
910*437bfbebSnyanmisaka      *   Setting fmdc_adju_split32 = 1 restricts prediction to CU16/8 only, improving real-time performance.
911*437bfbebSnyanmisaka     */
912*437bfbebSnyanmisaka     reg_frm->rdo_cfg.cu_inter_e = 0x5a;
913*437bfbebSnyanmisaka     reg_frm->rdo_intra_mode.intra_pu4_mode_num  = 1;
914*437bfbebSnyanmisaka     reg_frm->rdo_intra_mode.intra_pu8_mode_num  = 1;
915*437bfbebSnyanmisaka     reg_frm->rdo_intra_mode.intra_pu16_mode_num = 1;
916*437bfbebSnyanmisaka     reg_frm->rdo_intra_mode.intra_pu32_mode_num = 1;
917*437bfbebSnyanmisaka 
918*437bfbebSnyanmisaka     if (syn->pp.num_long_term_ref_pics_sps) {
919*437bfbebSnyanmisaka         reg_frm->rdo_cfg.ltm_col = 0;
920*437bfbebSnyanmisaka         reg_frm->rdo_cfg.ltm_idx0l0 = 1;
921*437bfbebSnyanmisaka     } else {
922*437bfbebSnyanmisaka         reg_frm->rdo_cfg.ltm_col = 0;
923*437bfbebSnyanmisaka         reg_frm->rdo_cfg.ltm_idx0l0 = 0;
924*437bfbebSnyanmisaka     }
925*437bfbebSnyanmisaka 
926*437bfbebSnyanmisaka     reg_frm->rdo_cfg.ccwa_e = 1;
927*437bfbebSnyanmisaka     reg_frm->rdo_cfg.scl_lst_sel = syn->pp.scaling_list_enabled_flag;
928*437bfbebSnyanmisaka 
929*437bfbebSnyanmisaka     {
930*437bfbebSnyanmisaka         RK_U32 i_nal_type = 0;
931*437bfbebSnyanmisaka 
932*437bfbebSnyanmisaka         if (ctx->frame_type == INTRA_FRAME)
933*437bfbebSnyanmisaka             i_nal_type = NAL_IDR_W_RADL;
934*437bfbebSnyanmisaka         else if (ctx->frame_type == INTER_P_FRAME )
935*437bfbebSnyanmisaka             i_nal_type = NAL_TRAIL_R;
936*437bfbebSnyanmisaka         else
937*437bfbebSnyanmisaka             i_nal_type = NAL_TRAIL_R;
938*437bfbebSnyanmisaka 
939*437bfbebSnyanmisaka         reg_frm->synt_nal.nal_unit_type = i_nal_type;
940*437bfbebSnyanmisaka     }
941*437bfbebSnyanmisaka }
942*437bfbebSnyanmisaka 
vepu511_h265_set_split(H265eV511RegSet * regs,MppEncCfgSet * enc_cfg)943*437bfbebSnyanmisaka static void vepu511_h265_set_split(H265eV511RegSet *regs, MppEncCfgSet *enc_cfg)
944*437bfbebSnyanmisaka {
945*437bfbebSnyanmisaka     MppEncSliceSplit *cfg = &enc_cfg->split;
946*437bfbebSnyanmisaka 
947*437bfbebSnyanmisaka     hal_h265e_dbg_func("enter\n");
948*437bfbebSnyanmisaka 
949*437bfbebSnyanmisaka     switch (cfg->split_mode) {
950*437bfbebSnyanmisaka     case MPP_ENC_SPLIT_NONE : {
951*437bfbebSnyanmisaka         regs->reg_frm.common.sli_splt.sli_splt = 0;
952*437bfbebSnyanmisaka         regs->reg_frm.common.sli_splt.sli_splt_mode = 0;
953*437bfbebSnyanmisaka         regs->reg_frm.common.sli_splt.sli_splt_cpst = 0;
954*437bfbebSnyanmisaka         regs->reg_frm.common.sli_splt.sli_max_num_m1 = 0;
955*437bfbebSnyanmisaka         regs->reg_frm.common.sli_splt.sli_flsh = 0;
956*437bfbebSnyanmisaka         regs->reg_frm.common.sli_cnum.sli_splt_cnum_m1 = 0;
957*437bfbebSnyanmisaka 
958*437bfbebSnyanmisaka         regs->reg_frm.common.sli_byte.sli_splt_byte = 0;
959*437bfbebSnyanmisaka         regs->reg_frm.common.enc_pic.slen_fifo = 0;
960*437bfbebSnyanmisaka     } break;
961*437bfbebSnyanmisaka     case MPP_ENC_SPLIT_BY_BYTE : {
962*437bfbebSnyanmisaka         regs->reg_frm.common.sli_splt.sli_splt = 1;
963*437bfbebSnyanmisaka         regs->reg_frm.common.sli_splt.sli_splt_mode = 0;
964*437bfbebSnyanmisaka         regs->reg_frm.common.sli_splt.sli_splt_cpst = 0;
965*437bfbebSnyanmisaka         regs->reg_frm.common.sli_splt.sli_max_num_m1 = 500;
966*437bfbebSnyanmisaka         regs->reg_frm.common.sli_splt.sli_flsh = 1;
967*437bfbebSnyanmisaka         regs->reg_frm.common.sli_cnum.sli_splt_cnum_m1 = 0;
968*437bfbebSnyanmisaka 
969*437bfbebSnyanmisaka         regs->reg_frm.common.sli_byte.sli_splt_byte = cfg->split_arg;
970*437bfbebSnyanmisaka         regs->reg_frm.common.enc_pic.slen_fifo = cfg->split_out ? 1 : 0;
971*437bfbebSnyanmisaka         regs->reg_ctl.int_en.vslc_done_en = cfg->split_out ? 1 : 0;
972*437bfbebSnyanmisaka     } break;
973*437bfbebSnyanmisaka     case MPP_ENC_SPLIT_BY_CTU : {
974*437bfbebSnyanmisaka         regs->reg_frm.common.sli_splt.sli_splt = 1;
975*437bfbebSnyanmisaka         regs->reg_frm.common.sli_splt.sli_splt_mode = 1;
976*437bfbebSnyanmisaka         regs->reg_frm.common.sli_splt.sli_splt_cpst = 0;
977*437bfbebSnyanmisaka         regs->reg_frm.common.sli_splt.sli_max_num_m1 = 500;
978*437bfbebSnyanmisaka         regs->reg_frm.common.sli_splt.sli_flsh = 1;
979*437bfbebSnyanmisaka         regs->reg_frm.common.sli_cnum.sli_splt_cnum_m1 = cfg->split_arg - 1;
980*437bfbebSnyanmisaka 
981*437bfbebSnyanmisaka         regs->reg_frm.common.sli_byte.sli_splt_byte = 0;
982*437bfbebSnyanmisaka         regs->reg_frm.common.enc_pic.slen_fifo = cfg->split_out ? 1 : 0;
983*437bfbebSnyanmisaka         regs->reg_ctl.int_en.vslc_done_en = cfg->split_out ? 1 : 0;
984*437bfbebSnyanmisaka     } break;
985*437bfbebSnyanmisaka     default : {
986*437bfbebSnyanmisaka         mpp_log_f("invalide slice split mode %d\n", cfg->split_mode);
987*437bfbebSnyanmisaka     } break;
988*437bfbebSnyanmisaka     }
989*437bfbebSnyanmisaka 
990*437bfbebSnyanmisaka     hal_h265e_dbg_func("leave\n");
991*437bfbebSnyanmisaka }
992*437bfbebSnyanmisaka 
vepu511_h265_set_me_regs(H265eV511HalContext * ctx,H265eSyntax_new * syn,H265eV511RegSet * regs)993*437bfbebSnyanmisaka static void vepu511_h265_set_me_regs(H265eV511HalContext *ctx, H265eSyntax_new *syn, H265eV511RegSet *regs)
994*437bfbebSnyanmisaka {
995*437bfbebSnyanmisaka     H265eVepu511Param *s = &regs->reg_param;
996*437bfbebSnyanmisaka     H265eVepu511Frame *reg_frm = &regs->reg_frm;
997*437bfbebSnyanmisaka 
998*437bfbebSnyanmisaka     reg_frm->common.me_rnge.cime_srch_dwnh = 15;
999*437bfbebSnyanmisaka     reg_frm->common.me_rnge.cime_srch_uph  = 15;
1000*437bfbebSnyanmisaka     reg_frm->common.me_rnge.cime_srch_rgtw = 12;
1001*437bfbebSnyanmisaka     reg_frm->common.me_rnge.cime_srch_lftw = 12;
1002*437bfbebSnyanmisaka     reg_frm->common.me_cfg.rme_srch_h      = 3;
1003*437bfbebSnyanmisaka     reg_frm->common.me_cfg.rme_srch_v      = 3;
1004*437bfbebSnyanmisaka 
1005*437bfbebSnyanmisaka     reg_frm->common.me_cfg.srgn_max_num      = 72;
1006*437bfbebSnyanmisaka     reg_frm->common.me_cfg.cime_dist_thre    = 1024;
1007*437bfbebSnyanmisaka     reg_frm->common.me_cfg.rme_dis           = 0;
1008*437bfbebSnyanmisaka     reg_frm->common.me_cfg.fme_dis           = 0;
1009*437bfbebSnyanmisaka     reg_frm->common.me_rnge.dlt_frm_num      = 0x1;
1010*437bfbebSnyanmisaka 
1011*437bfbebSnyanmisaka     if (syn->pp.sps_temporal_mvp_enabled_flag && (ctx->frame_type != INTRA_FRAME)) {
1012*437bfbebSnyanmisaka         if (ctx->last_frame_fb.frame_type == INTRA_FRAME)
1013*437bfbebSnyanmisaka             reg_frm->common.me_cach.colmv_load_hevc = 0;
1014*437bfbebSnyanmisaka         else
1015*437bfbebSnyanmisaka             reg_frm->common.me_cach.colmv_load_hevc = 1;
1016*437bfbebSnyanmisaka 
1017*437bfbebSnyanmisaka         reg_frm->common.me_cach.colmv_stor_hevc = 1;
1018*437bfbebSnyanmisaka     }
1019*437bfbebSnyanmisaka 
1020*437bfbebSnyanmisaka     reg_frm->common.me_cach.cime_zero_thre = 64;
1021*437bfbebSnyanmisaka     reg_frm->common.me_cach.fme_prefsu_en = 0;
1022*437bfbebSnyanmisaka 
1023*437bfbebSnyanmisaka     /* CIME: 0x1760 - 0x176C */
1024*437bfbebSnyanmisaka     s->me_sqi_comb.cime_pmv_num     = 1;
1025*437bfbebSnyanmisaka     s->me_sqi_comb.cime_fuse        = 1;
1026*437bfbebSnyanmisaka     s->me_sqi_comb.move_lambda      = 2;
1027*437bfbebSnyanmisaka     s->me_sqi_comb.rime_lvl_mrg     = 0;
1028*437bfbebSnyanmisaka     s->me_sqi_comb.rime_prelvl_en   = 0;
1029*437bfbebSnyanmisaka     s->me_sqi_comb.rime_prersu_en   = 0;
1030*437bfbebSnyanmisaka     s->me_sqi_comb.fme_lvl_mrg      = 1;
1031*437bfbebSnyanmisaka 
1032*437bfbebSnyanmisaka     s->cime_mvd_th_comb.cime_mvd_th0     = 8;
1033*437bfbebSnyanmisaka     s->cime_mvd_th_comb.cime_mvd_th1     = 20;
1034*437bfbebSnyanmisaka     s->cime_mvd_th_comb.cime_mvd_th2     = 32;
1035*437bfbebSnyanmisaka     s->cime_madp_th_comb.cime_madp_th    = 16;
1036*437bfbebSnyanmisaka     s->cime_madp_th_comb.ratio_consi_cfg = 8;
1037*437bfbebSnyanmisaka     s->cime_madp_th_comb.ratio_bmv_dist  = 8;
1038*437bfbebSnyanmisaka     s->cime_multi_comb.cime_multi0 = 8;
1039*437bfbebSnyanmisaka     s->cime_multi_comb.cime_multi1 = 12;
1040*437bfbebSnyanmisaka     s->cime_multi_comb.cime_multi2 = 16;
1041*437bfbebSnyanmisaka     s->cime_multi_comb.cime_multi3 = 20;
1042*437bfbebSnyanmisaka 
1043*437bfbebSnyanmisaka     /* RFME: 0x1770 - 0x177C */
1044*437bfbebSnyanmisaka     s->rime_mvd_th_comb.rime_mvd_th0  = 1;
1045*437bfbebSnyanmisaka     s->rime_mvd_th_comb.rime_mvd_th1  = 2;
1046*437bfbebSnyanmisaka     s->rime_mvd_th_comb.fme_madp_th   = 0;
1047*437bfbebSnyanmisaka     s->rime_madp_th_comb.rime_madp_th0 = 8;
1048*437bfbebSnyanmisaka     s->rime_madp_th_comb.rime_madp_th1 = 16;
1049*437bfbebSnyanmisaka     s->rime_multi_comb.rime_multi0 = 4;
1050*437bfbebSnyanmisaka     s->rime_multi_comb.rime_multi1 = 8;
1051*437bfbebSnyanmisaka     s->rime_multi_comb.rime_multi2 = 12;
1052*437bfbebSnyanmisaka     s->cmv_st_th_comb.cmv_th0 = 64;
1053*437bfbebSnyanmisaka     s->cmv_st_th_comb.cmv_th1 = 96;
1054*437bfbebSnyanmisaka     s->cmv_st_th_comb.cmv_th2 = 128;
1055*437bfbebSnyanmisaka 
1056*437bfbebSnyanmisaka     if (ctx->cfg->tune.scene_mode != MPP_ENC_SCENE_MODE_IPC) {
1057*437bfbebSnyanmisaka         s->cime_madp_th_comb.cime_madp_th = 0;
1058*437bfbebSnyanmisaka         s->rime_madp_th_comb.rime_madp_th0 = 0;
1059*437bfbebSnyanmisaka         s->rime_madp_th_comb.rime_madp_th1 = 0;
1060*437bfbebSnyanmisaka         s->cime_multi_comb.cime_multi0 = 4;
1061*437bfbebSnyanmisaka         s->cime_multi_comb.cime_multi1 = 4;
1062*437bfbebSnyanmisaka         s->cime_multi_comb.cime_multi2 = 4;
1063*437bfbebSnyanmisaka         s->cime_multi_comb.cime_multi3 = 4;
1064*437bfbebSnyanmisaka         s->rime_multi_comb.rime_multi0 = 4;
1065*437bfbebSnyanmisaka         s->rime_multi_comb.rime_multi1 = 4;
1066*437bfbebSnyanmisaka         s->rime_multi_comb.rime_multi2 = 4;
1067*437bfbebSnyanmisaka     } else if (ctx->smart_en) {
1068*437bfbebSnyanmisaka         s->cime_multi_comb.cime_multi0 = 4;
1069*437bfbebSnyanmisaka         s->cime_multi_comb.cime_multi1 = 6;
1070*437bfbebSnyanmisaka         s->cime_multi_comb.cime_multi2 = 8;
1071*437bfbebSnyanmisaka         s->cime_multi_comb.cime_multi3 = 12;
1072*437bfbebSnyanmisaka         s->rime_multi_comb.rime_multi0 = 4;
1073*437bfbebSnyanmisaka         s->rime_multi_comb.rime_multi1 = 6;
1074*437bfbebSnyanmisaka         s->rime_multi_comb.rime_multi2 = 8;
1075*437bfbebSnyanmisaka     }
1076*437bfbebSnyanmisaka 
1077*437bfbebSnyanmisaka     s->rime_mvd_th_comb.fme_madp_th  = 0;
1078*437bfbebSnyanmisaka     s->rime_multi_comb.rime_multi0   = 0;
1079*437bfbebSnyanmisaka     s->rime_multi_comb.rime_multi1   = 0;
1080*437bfbebSnyanmisaka     s->rime_multi_comb.rime_multi2   = 0;
1081*437bfbebSnyanmisaka }
1082*437bfbebSnyanmisaka 
vepu511_h265_set_hw_address(H265eV511HalContext * ctx,H265eVepu511Frame * regs,HalEncTask * task)1083*437bfbebSnyanmisaka static void vepu511_h265_set_hw_address(H265eV511HalContext *ctx, H265eVepu511Frame *regs,
1084*437bfbebSnyanmisaka                                         HalEncTask *task)
1085*437bfbebSnyanmisaka {
1086*437bfbebSnyanmisaka     HalEncTask *enc_task = task;
1087*437bfbebSnyanmisaka     HalBuf *recon_buf, *ref_buf;
1088*437bfbebSnyanmisaka     MppBuffer md_info_buf = enc_task->md_info;
1089*437bfbebSnyanmisaka     Vepu511H265eFrmCfg *frm = ctx->frm;
1090*437bfbebSnyanmisaka     H265eSyntax_new *syn = ctx->syn;
1091*437bfbebSnyanmisaka 
1092*437bfbebSnyanmisaka     hal_h265e_enter();
1093*437bfbebSnyanmisaka 
1094*437bfbebSnyanmisaka     regs->common.adr_src0  = mpp_buffer_get_fd(enc_task->input);
1095*437bfbebSnyanmisaka     regs->common.adr_src1  = regs->common.adr_src0;
1096*437bfbebSnyanmisaka     regs->common.adr_src2  = regs->common.adr_src0;
1097*437bfbebSnyanmisaka 
1098*437bfbebSnyanmisaka     recon_buf = hal_bufs_get_buf(ctx->dpb_bufs, frm->hal_curr_idx);
1099*437bfbebSnyanmisaka     ref_buf = hal_bufs_get_buf(ctx->dpb_bufs, frm->hal_refr_idx);
1100*437bfbebSnyanmisaka 
1101*437bfbebSnyanmisaka     if (!syn->sp.non_reference_flag) {
1102*437bfbebSnyanmisaka         regs->common.rfpw_h_addr  = mpp_buffer_get_fd(recon_buf->buf[0]);
1103*437bfbebSnyanmisaka         regs->common.rfpw_b_addr  = regs->common.rfpw_h_addr;
1104*437bfbebSnyanmisaka         mpp_dev_multi_offset_update(ctx->reg_cfg, 164, ctx->fbc_header_len);
1105*437bfbebSnyanmisaka     }
1106*437bfbebSnyanmisaka     regs->common.rfpr_h_addr = mpp_buffer_get_fd(ref_buf->buf[0]);
1107*437bfbebSnyanmisaka     regs->common.rfpr_b_addr = regs->common.rfpr_h_addr;
1108*437bfbebSnyanmisaka     regs->common.colmvw_addr = mpp_buffer_get_fd(recon_buf->buf[2]);
1109*437bfbebSnyanmisaka     regs->common.colmvr_addr = mpp_buffer_get_fd(ref_buf->buf[2]);
1110*437bfbebSnyanmisaka     regs->common.dspw_addr = mpp_buffer_get_fd(recon_buf->buf[1]);
1111*437bfbebSnyanmisaka     regs->common.dspr_addr = mpp_buffer_get_fd(ref_buf->buf[1]);
1112*437bfbebSnyanmisaka 
1113*437bfbebSnyanmisaka     mpp_dev_multi_offset_update(ctx->reg_cfg, 166, ctx->fbc_header_len);
1114*437bfbebSnyanmisaka 
1115*437bfbebSnyanmisaka     if (md_info_buf) {
1116*437bfbebSnyanmisaka         regs->common.enc_pic.mei_stor = 1;
1117*437bfbebSnyanmisaka         regs->common.meiw_addr = mpp_buffer_get_fd(md_info_buf);
1118*437bfbebSnyanmisaka     } else {
1119*437bfbebSnyanmisaka         regs->common.enc_pic.mei_stor = 0;
1120*437bfbebSnyanmisaka         regs->common.meiw_addr = 0;
1121*437bfbebSnyanmisaka     }
1122*437bfbebSnyanmisaka 
1123*437bfbebSnyanmisaka     regs->common.bsbt_addr = mpp_buffer_get_fd(enc_task->output);
1124*437bfbebSnyanmisaka     /* TODO: stream size relative with syntax */
1125*437bfbebSnyanmisaka     regs->common.bsbb_addr  = regs->common.bsbt_addr;
1126*437bfbebSnyanmisaka     regs->common.bsbr_addr  = regs->common.bsbt_addr;
1127*437bfbebSnyanmisaka     regs->common.adr_bsbs   = regs->common.bsbt_addr;
1128*437bfbebSnyanmisaka 
1129*437bfbebSnyanmisaka     regs->common.rfpt_h_addr = 0xffffffff;
1130*437bfbebSnyanmisaka     regs->common.rfpb_h_addr = 0;
1131*437bfbebSnyanmisaka     regs->common.rfpt_b_addr = 0xffffffff;
1132*437bfbebSnyanmisaka     regs->common.adr_rfpb_b  = 0;
1133*437bfbebSnyanmisaka     regs->common.adr_roir    = 0;
1134*437bfbebSnyanmisaka 
1135*437bfbebSnyanmisaka     mpp_dev_multi_offset_update(ctx->reg_cfg, 174, mpp_packet_get_length(task->packet));
1136*437bfbebSnyanmisaka     mpp_dev_multi_offset_update(ctx->reg_cfg, 172, mpp_buffer_get_size(enc_task->output));
1137*437bfbebSnyanmisaka 
1138*437bfbebSnyanmisaka     regs->common.pic_ofst.pic_ofst_y = mpp_frame_get_offset_y(task->frame);
1139*437bfbebSnyanmisaka     regs->common.pic_ofst.pic_ofst_x = mpp_frame_get_offset_x(task->frame);
1140*437bfbebSnyanmisaka 
1141*437bfbebSnyanmisaka     /* smear bufs */
1142*437bfbebSnyanmisaka     regs->common.adr_smear_rd = mpp_buffer_get_fd(ref_buf->buf[3]);
1143*437bfbebSnyanmisaka     regs->common.adr_smear_wr = mpp_buffer_get_fd(recon_buf->buf[3]);
1144*437bfbebSnyanmisaka }
1145*437bfbebSnyanmisaka 
vepu511_h265_set_pp_regs(H265eV511RegSet * regs,VepuFmtCfg * fmt,MppEncPrepCfg * prep_cfg,HalEncTask * task)1146*437bfbebSnyanmisaka static void vepu511_h265_set_pp_regs(H265eV511RegSet *regs, VepuFmtCfg *fmt,
1147*437bfbebSnyanmisaka                                      MppEncPrepCfg *prep_cfg, HalEncTask *task)
1148*437bfbebSnyanmisaka {
1149*437bfbebSnyanmisaka     Vepu511ControlCfg *reg_ctl = &regs->reg_ctl;
1150*437bfbebSnyanmisaka     H265eVepu511Frame *reg_frm = &regs->reg_frm;
1151*437bfbebSnyanmisaka     RK_S32 stridey = 0;
1152*437bfbebSnyanmisaka     RK_S32 stridec = 0;
1153*437bfbebSnyanmisaka 
1154*437bfbebSnyanmisaka     reg_ctl->dtrns_map.src_bus_edin = fmt->src_endian;
1155*437bfbebSnyanmisaka     reg_frm->common.src_fmt.src_cfmt = fmt->format;
1156*437bfbebSnyanmisaka     reg_frm->common.src_fmt.alpha_swap = fmt->alpha_swap;
1157*437bfbebSnyanmisaka     reg_frm->common.src_fmt.rbuv_swap = fmt->rbuv_swap;
1158*437bfbebSnyanmisaka 
1159*437bfbebSnyanmisaka     reg_frm->common.src_fmt.out_fmt = (prep_cfg->format == MPP_FMT_YUV400) ? 0 : 1;
1160*437bfbebSnyanmisaka 
1161*437bfbebSnyanmisaka     reg_frm->common.src_proc.src_mirr = prep_cfg->mirroring > 0;
1162*437bfbebSnyanmisaka     reg_frm->common.src_proc.src_rot = prep_cfg->rotation;
1163*437bfbebSnyanmisaka 
1164*437bfbebSnyanmisaka     if (MPP_FRAME_FMT_IS_FBC(prep_cfg->format)) {
1165*437bfbebSnyanmisaka         reg_frm->common.src_proc.rkfbcd_en = 1;
1166*437bfbebSnyanmisaka 
1167*437bfbebSnyanmisaka         stridey = mpp_frame_get_fbc_hdr_stride(task->frame);
1168*437bfbebSnyanmisaka         if (!stridey)
1169*437bfbebSnyanmisaka             stridey = MPP_ALIGN(prep_cfg->hor_stride, 64) >> 2;
1170*437bfbebSnyanmisaka     } else if (prep_cfg->hor_stride)
1171*437bfbebSnyanmisaka         stridey = prep_cfg->hor_stride;
1172*437bfbebSnyanmisaka     else {
1173*437bfbebSnyanmisaka         if (reg_frm->common.src_fmt.src_cfmt == VEPU5xx_FMT_BGRA8888)
1174*437bfbebSnyanmisaka             stridey = prep_cfg->width * 4;
1175*437bfbebSnyanmisaka         else if (reg_frm->common.src_fmt.src_cfmt == VEPU5xx_FMT_BGR888)
1176*437bfbebSnyanmisaka             stridey = prep_cfg->width * 3;
1177*437bfbebSnyanmisaka         else if (reg_frm->common.src_fmt.src_cfmt == VEPU5xx_FMT_BGR565 ||
1178*437bfbebSnyanmisaka                  reg_frm->common.src_fmt.src_cfmt == VEPU5xx_FMT_YUYV422 ||
1179*437bfbebSnyanmisaka                  reg_frm->common.src_fmt.src_cfmt == VEPU5xx_FMT_UYVY422)
1180*437bfbebSnyanmisaka             stridey = prep_cfg->width * 2;
1181*437bfbebSnyanmisaka     }
1182*437bfbebSnyanmisaka 
1183*437bfbebSnyanmisaka     switch (fmt->format) {
1184*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV444SP : {
1185*437bfbebSnyanmisaka         stridec = stridey * 2;
1186*437bfbebSnyanmisaka     } break;
1187*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV422SP :
1188*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV420SP :
1189*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV444P : {
1190*437bfbebSnyanmisaka         stridec = stridey;
1191*437bfbebSnyanmisaka     } break;
1192*437bfbebSnyanmisaka     default : {
1193*437bfbebSnyanmisaka         stridec = stridey / 2;
1194*437bfbebSnyanmisaka     } break;
1195*437bfbebSnyanmisaka     }
1196*437bfbebSnyanmisaka 
1197*437bfbebSnyanmisaka     if (reg_frm->common.src_fmt.src_cfmt < VEPU5xx_FMT_ARGB1555) {
1198*437bfbebSnyanmisaka         reg_frm->common.src_udfy.csc_wgt_r2y = 77;
1199*437bfbebSnyanmisaka         reg_frm->common.src_udfy.csc_wgt_g2y = 150;
1200*437bfbebSnyanmisaka         reg_frm->common.src_udfy.csc_wgt_b2y = 29;
1201*437bfbebSnyanmisaka 
1202*437bfbebSnyanmisaka         reg_frm->common.src_udfu.csc_wgt_r2u = -43;
1203*437bfbebSnyanmisaka         reg_frm->common.src_udfu.csc_wgt_g2u = -85;
1204*437bfbebSnyanmisaka         reg_frm->common.src_udfu.csc_wgt_b2u = 128;
1205*437bfbebSnyanmisaka 
1206*437bfbebSnyanmisaka         reg_frm->common.src_udfv.csc_wgt_r2v = 128;
1207*437bfbebSnyanmisaka         reg_frm->common.src_udfv.csc_wgt_g2v = -107;
1208*437bfbebSnyanmisaka         reg_frm->common.src_udfv.csc_wgt_b2v = -21;
1209*437bfbebSnyanmisaka 
1210*437bfbebSnyanmisaka         reg_frm->common.src_udfo.csc_ofst_y = 0;
1211*437bfbebSnyanmisaka         reg_frm->common.src_udfo.csc_ofst_u = 128;
1212*437bfbebSnyanmisaka         reg_frm->common.src_udfo.csc_ofst_v = 128;
1213*437bfbebSnyanmisaka     }
1214*437bfbebSnyanmisaka 
1215*437bfbebSnyanmisaka     reg_frm->common.src_strd0.src_strd0  = stridey;
1216*437bfbebSnyanmisaka     reg_frm->common.src_strd1.src_strd1  = stridec;
1217*437bfbebSnyanmisaka }
1218*437bfbebSnyanmisaka 
vepu511_h265_set_vsp_filtering(H265eV511HalContext * ctx,H265eV511RegSet * regs)1219*437bfbebSnyanmisaka static void vepu511_h265_set_vsp_filtering(H265eV511HalContext *ctx, H265eV511RegSet *regs)
1220*437bfbebSnyanmisaka {
1221*437bfbebSnyanmisaka     // H265eV511RegSet *regs = ctx->regs;
1222*437bfbebSnyanmisaka     H265eVepu511Frame *s = &regs->reg_frm;
1223*437bfbebSnyanmisaka     MppEncCfgSet *cfg = ctx->cfg;
1224*437bfbebSnyanmisaka     MppEncHwCfg *hw = &cfg->hw;
1225*437bfbebSnyanmisaka     RK_U8 bit_chg_lvl = ctx->last_frame_fb.tgt_sub_real_lvl[5]; /* [0, 2] */
1226*437bfbebSnyanmisaka     RK_U8 corner_str = 0, edge_str = 0, internal_str = 0; /* [0, 3] */
1227*437bfbebSnyanmisaka 
1228*437bfbebSnyanmisaka     if (cfg->tune.deblur_en && (cfg->tune.deblur_str % 2 == 0) &&
1229*437bfbebSnyanmisaka         (hw->flt_str_i == 0) && (hw->flt_str_p == 0)) {
1230*437bfbebSnyanmisaka         if (bit_chg_lvl == 2 && ctx->frame_type != INTRA_FRAME) {
1231*437bfbebSnyanmisaka             corner_str = 3;
1232*437bfbebSnyanmisaka             edge_str = 3;
1233*437bfbebSnyanmisaka             internal_str = 3;
1234*437bfbebSnyanmisaka         } else if (bit_chg_lvl > 0) {
1235*437bfbebSnyanmisaka             corner_str = 2;
1236*437bfbebSnyanmisaka             edge_str = 2;
1237*437bfbebSnyanmisaka             internal_str = 2;
1238*437bfbebSnyanmisaka         }
1239*437bfbebSnyanmisaka     } else {
1240*437bfbebSnyanmisaka         if (ctx->frame_type == INTRA_FRAME) {
1241*437bfbebSnyanmisaka             corner_str = hw->flt_str_i;
1242*437bfbebSnyanmisaka             edge_str = hw->flt_str_i;
1243*437bfbebSnyanmisaka             internal_str = hw->flt_str_i;
1244*437bfbebSnyanmisaka         } else {
1245*437bfbebSnyanmisaka             corner_str = hw->flt_str_p;
1246*437bfbebSnyanmisaka             edge_str = hw->flt_str_p;
1247*437bfbebSnyanmisaka             internal_str = hw->flt_str_p;
1248*437bfbebSnyanmisaka         }
1249*437bfbebSnyanmisaka     }
1250*437bfbebSnyanmisaka 
1251*437bfbebSnyanmisaka     s->common.src_flt_cfg.pp_corner_filter_strength = corner_str;
1252*437bfbebSnyanmisaka     s->common.src_flt_cfg.pp_edge_filter_strength = edge_str;
1253*437bfbebSnyanmisaka     s->common.src_flt_cfg.pp_internal_filter_strength = internal_str;
1254*437bfbebSnyanmisaka }
1255*437bfbebSnyanmisaka 
vepu511_h265_set_rc_regs(H265eV511HalContext * ctx,H265eV511RegSet * regs,HalEncTask * task)1256*437bfbebSnyanmisaka static void vepu511_h265_set_rc_regs(H265eV511HalContext *ctx, H265eV511RegSet *regs,
1257*437bfbebSnyanmisaka                                      HalEncTask *task)
1258*437bfbebSnyanmisaka {
1259*437bfbebSnyanmisaka     H265eSyntax_new *syn = (H265eSyntax_new *)task->syntax.data;
1260*437bfbebSnyanmisaka     EncRcTaskInfo *rc_cfg = &task->rc_task->info;
1261*437bfbebSnyanmisaka     H265eVepu511Frame *reg_frm = &regs->reg_frm;
1262*437bfbebSnyanmisaka     Vepu511RcRoi *reg_rc = &regs->reg_rc_roi;
1263*437bfbebSnyanmisaka     MppEncCfgSet *cfg = ctx->cfg;
1264*437bfbebSnyanmisaka     MppEncRcCfg *rc = &cfg->rc;
1265*437bfbebSnyanmisaka     MppEncHwCfg *hw = &cfg->hw;
1266*437bfbebSnyanmisaka     MppEncH265Cfg *h265 = &cfg->h265;
1267*437bfbebSnyanmisaka     RK_S32 mb_wd32 = (syn->pp.pic_width + 31) / 32;
1268*437bfbebSnyanmisaka     RK_S32 mb_h32 = (syn->pp.pic_height + 31) / 32;
1269*437bfbebSnyanmisaka 
1270*437bfbebSnyanmisaka     RK_U32 ctu_target_bits_mul_16 = (rc_cfg->bit_target << 4) / (mb_wd32 * mb_h32);
1271*437bfbebSnyanmisaka     RK_U32 ctu_target_bits;
1272*437bfbebSnyanmisaka     RK_S32 negative_bits_thd, positive_bits_thd;
1273*437bfbebSnyanmisaka 
1274*437bfbebSnyanmisaka     if (rc->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
1275*437bfbebSnyanmisaka         reg_frm->common.enc_pic.pic_qp    = rc_cfg->quality_target;
1276*437bfbebSnyanmisaka         reg_frm->synt_sli1.sli_qp         = rc_cfg->quality_target;
1277*437bfbebSnyanmisaka         reg_frm->common.rc_qp.rc_max_qp   = rc_cfg->quality_target;
1278*437bfbebSnyanmisaka         reg_frm->common.rc_qp.rc_min_qp   = rc_cfg->quality_target;
1279*437bfbebSnyanmisaka         reg_frm->common.rc_cfg.rc_ctu_num = 1;
1280*437bfbebSnyanmisaka     } else {
1281*437bfbebSnyanmisaka         if (ctu_target_bits_mul_16 >= 0x100000) {
1282*437bfbebSnyanmisaka             ctu_target_bits_mul_16 = 0x50000;
1283*437bfbebSnyanmisaka         }
1284*437bfbebSnyanmisaka         ctu_target_bits = (ctu_target_bits_mul_16 * mb_wd32) >> 4;
1285*437bfbebSnyanmisaka         negative_bits_thd = 0 - 5 * ctu_target_bits / 16;
1286*437bfbebSnyanmisaka         positive_bits_thd = 5 * ctu_target_bits / 16;
1287*437bfbebSnyanmisaka 
1288*437bfbebSnyanmisaka         reg_frm->common.enc_pic.pic_qp      = rc_cfg->quality_target;
1289*437bfbebSnyanmisaka         reg_frm->synt_sli1.sli_qp           = rc_cfg->quality_target;
1290*437bfbebSnyanmisaka         reg_frm->common.rc_cfg.rc_en        = 1;
1291*437bfbebSnyanmisaka         reg_frm->common.rc_cfg.aq_en        = 1;
1292*437bfbebSnyanmisaka         reg_frm->common.rc_cfg.rc_ctu_num   = mb_wd32;
1293*437bfbebSnyanmisaka 
1294*437bfbebSnyanmisaka         reg_frm->common.rc_qp.rc_max_qp     = rc_cfg->quality_max;
1295*437bfbebSnyanmisaka         reg_frm->common.rc_qp.rc_min_qp     = rc_cfg->quality_min;
1296*437bfbebSnyanmisaka         reg_frm->common.rc_tgt.ctu_ebit     = ctu_target_bits_mul_16;
1297*437bfbebSnyanmisaka 
1298*437bfbebSnyanmisaka         if (ctx->smart_en) {
1299*437bfbebSnyanmisaka             reg_frm->common.rc_qp.rc_qp_range = 0;
1300*437bfbebSnyanmisaka         } else {
1301*437bfbebSnyanmisaka             reg_frm->common.rc_qp.rc_qp_range = (ctx->frame_type == INTRA_FRAME) ?
1302*437bfbebSnyanmisaka                                                 hw->qp_delta_row_i : hw->qp_delta_row;
1303*437bfbebSnyanmisaka         }
1304*437bfbebSnyanmisaka 
1305*437bfbebSnyanmisaka         {
1306*437bfbebSnyanmisaka             /* fixed frame qp */
1307*437bfbebSnyanmisaka             RK_S32 fqp_min, fqp_max;
1308*437bfbebSnyanmisaka 
1309*437bfbebSnyanmisaka             if (ctx->frame_type == INTRA_FRAME) {
1310*437bfbebSnyanmisaka                 fqp_min = rc->fqp_min_i;
1311*437bfbebSnyanmisaka                 fqp_max = rc->fqp_max_i;
1312*437bfbebSnyanmisaka             } else {
1313*437bfbebSnyanmisaka                 fqp_min = rc->fqp_min_p;
1314*437bfbebSnyanmisaka                 fqp_max = rc->fqp_max_p;
1315*437bfbebSnyanmisaka             }
1316*437bfbebSnyanmisaka 
1317*437bfbebSnyanmisaka             if ((fqp_min == fqp_max) && (fqp_min >= 0) && (fqp_max <= 51)) {
1318*437bfbebSnyanmisaka                 reg_frm->common.enc_pic.pic_qp = fqp_min;
1319*437bfbebSnyanmisaka                 reg_frm->synt_sli1.sli_qp  = fqp_min;
1320*437bfbebSnyanmisaka                 reg_frm->common.rc_qp.rc_qp_range = 0;
1321*437bfbebSnyanmisaka             }
1322*437bfbebSnyanmisaka         }
1323*437bfbebSnyanmisaka 
1324*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[0] = 2 * negative_bits_thd;
1325*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[1] = negative_bits_thd;
1326*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[2] = positive_bits_thd;
1327*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[3] = 2 * positive_bits_thd;
1328*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[4] = 0x7FFFFFFF;
1329*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[5] = 0x7FFFFFFF;
1330*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[6] = 0x7FFFFFFF;
1331*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[7] = 0x7FFFFFFF;
1332*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[8] = 0x7FFFFFFF;
1333*437bfbebSnyanmisaka 
1334*437bfbebSnyanmisaka         reg_rc->rc_adj0.qp_adj0  = -2;
1335*437bfbebSnyanmisaka         reg_rc->rc_adj0.qp_adj1  = -1;
1336*437bfbebSnyanmisaka         reg_rc->rc_adj0.qp_adj2  = 0;
1337*437bfbebSnyanmisaka         reg_rc->rc_adj0.qp_adj3  = 1;
1338*437bfbebSnyanmisaka         reg_rc->rc_adj0.qp_adj4  = 2;
1339*437bfbebSnyanmisaka         reg_rc->rc_adj1.qp_adj5  = 0;
1340*437bfbebSnyanmisaka         reg_rc->rc_adj1.qp_adj6  = 0;
1341*437bfbebSnyanmisaka         reg_rc->rc_adj1.qp_adj7  = 0;
1342*437bfbebSnyanmisaka         reg_rc->rc_adj1.qp_adj8  = 0;
1343*437bfbebSnyanmisaka     }
1344*437bfbebSnyanmisaka 
1345*437bfbebSnyanmisaka     reg_rc->roi_qthd0.qpmin_area0 = h265->qpmin_map[0] > 0 ? h265->qpmin_map[0] : rc_cfg->quality_min;
1346*437bfbebSnyanmisaka     reg_rc->roi_qthd0.qpmax_area0 = h265->qpmax_map[0] > 0 ? h265->qpmax_map[0] : rc_cfg->quality_max;
1347*437bfbebSnyanmisaka     reg_rc->roi_qthd0.qpmin_area1 = h265->qpmin_map[1] > 0 ? h265->qpmin_map[1] : rc_cfg->quality_min;
1348*437bfbebSnyanmisaka     reg_rc->roi_qthd0.qpmax_area1 = h265->qpmax_map[1] > 0 ? h265->qpmax_map[1] : rc_cfg->quality_max;
1349*437bfbebSnyanmisaka     reg_rc->roi_qthd0.qpmin_area2 = h265->qpmin_map[2] > 0 ? h265->qpmin_map[2] : rc_cfg->quality_min;
1350*437bfbebSnyanmisaka     reg_rc->roi_qthd1.qpmax_area2 = h265->qpmax_map[2] > 0 ? h265->qpmax_map[2] : rc_cfg->quality_max;
1351*437bfbebSnyanmisaka     reg_rc->roi_qthd1.qpmin_area3 = h265->qpmin_map[3] > 0 ? h265->qpmin_map[3] : rc_cfg->quality_min;
1352*437bfbebSnyanmisaka     reg_rc->roi_qthd1.qpmax_area3 = h265->qpmax_map[3] > 0 ? h265->qpmax_map[3] : rc_cfg->quality_max;
1353*437bfbebSnyanmisaka     reg_rc->roi_qthd1.qpmin_area4 = h265->qpmin_map[4] > 0 ? h265->qpmin_map[4] : rc_cfg->quality_min;
1354*437bfbebSnyanmisaka     reg_rc->roi_qthd1.qpmax_area4 = h265->qpmax_map[4] > 0 ? h265->qpmax_map[4] : rc_cfg->quality_max;
1355*437bfbebSnyanmisaka     reg_rc->roi_qthd2.qpmin_area5 = h265->qpmin_map[5] > 0 ? h265->qpmin_map[5] : rc_cfg->quality_min;
1356*437bfbebSnyanmisaka     reg_rc->roi_qthd2.qpmax_area5 = h265->qpmax_map[5] > 0 ? h265->qpmax_map[5] : rc_cfg->quality_max;
1357*437bfbebSnyanmisaka     reg_rc->roi_qthd2.qpmin_area6 = h265->qpmin_map[6] > 0 ? h265->qpmin_map[6] : rc_cfg->quality_min;
1358*437bfbebSnyanmisaka     reg_rc->roi_qthd2.qpmax_area6 = h265->qpmax_map[6] > 0 ? h265->qpmax_map[6] : rc_cfg->quality_max;
1359*437bfbebSnyanmisaka     reg_rc->roi_qthd2.qpmin_area7 = h265->qpmin_map[7] > 0 ? h265->qpmin_map[7] : rc_cfg->quality_min;
1360*437bfbebSnyanmisaka     reg_rc->roi_qthd3.qpmax_area7 = h265->qpmax_map[7] > 0 ? h265->qpmax_map[7] : rc_cfg->quality_max;
1361*437bfbebSnyanmisaka     reg_rc->roi_cfg.fmdc_adj1_hevc.fmdc_adju_split32 = 0;
1362*437bfbebSnyanmisaka }
1363*437bfbebSnyanmisaka 
vepu511_h265_set_quant_regs(H265eV511HalContext * ctx,H265eV511RegSet * regs)1364*437bfbebSnyanmisaka static void vepu511_h265_set_quant_regs(H265eV511HalContext *ctx, H265eV511RegSet *regs)
1365*437bfbebSnyanmisaka {
1366*437bfbebSnyanmisaka     MppEncHwCfg *hw = &ctx->cfg->hw;
1367*437bfbebSnyanmisaka     // H265eV511RegSet *regs = ctx->regs;
1368*437bfbebSnyanmisaka     H265eVepu511Param *s = &regs->reg_param;
1369*437bfbebSnyanmisaka     RK_U8 th0 = 3, th1 = 6, th2 = 13;
1370*437bfbebSnyanmisaka     RK_U16 bias_i0 = 171, bias_i1 = 171, bias_i2 = 171, bias_i3 = 171;
1371*437bfbebSnyanmisaka     RK_U16 bias_p0 = 85, bias_p1 = 85, bias_p2 = 85, bias_p3 = 85;
1372*437bfbebSnyanmisaka     RK_U32 frm_type = ctx->frame_type;
1373*437bfbebSnyanmisaka 
1374*437bfbebSnyanmisaka     if (!hw->qbias_en) {
1375*437bfbebSnyanmisaka         if (ctx->smart_en) {
1376*437bfbebSnyanmisaka             bias_i0 = bias_i1 = bias_i3 = 144;
1377*437bfbebSnyanmisaka             bias_i2 = (frm_type == INTRA_FRAME) ? 144 : 171;
1378*437bfbebSnyanmisaka         } else {
1379*437bfbebSnyanmisaka             bias_i0 = bias_i1 = bias_i3 = 171;
1380*437bfbebSnyanmisaka             bias_i2 = (frm_type == INTRA_FRAME) ? 171 : 220;
1381*437bfbebSnyanmisaka         }
1382*437bfbebSnyanmisaka 
1383*437bfbebSnyanmisaka         /* used for venc_info log */
1384*437bfbebSnyanmisaka         hw->qbias_arr[IFRAME_THD0] = hw->qbias_arr[PFRAME_THD0] = th0;
1385*437bfbebSnyanmisaka         hw->qbias_arr[IFRAME_THD1] = hw->qbias_arr[PFRAME_THD1] = th1;
1386*437bfbebSnyanmisaka         hw->qbias_arr[IFRAME_THD2] = hw->qbias_arr[PFRAME_THD2] = th2;
1387*437bfbebSnyanmisaka         hw->qbias_arr[IFRAME_BIAS0] = hw->qbias_arr[PFRAME_IBLK_BIAS0] = bias_i0;
1388*437bfbebSnyanmisaka         hw->qbias_arr[IFRAME_BIAS1] = hw->qbias_arr[PFRAME_IBLK_BIAS1] = bias_i1;
1389*437bfbebSnyanmisaka         hw->qbias_arr[IFRAME_BIAS2] = hw->qbias_arr[PFRAME_IBLK_BIAS2] = bias_i2;
1390*437bfbebSnyanmisaka         hw->qbias_arr[IFRAME_BIAS3] = hw->qbias_arr[PFRAME_IBLK_BIAS3] = bias_i3;
1391*437bfbebSnyanmisaka         hw->qbias_arr[PFRAME_PBLK_BIAS0] = bias_p0;
1392*437bfbebSnyanmisaka         hw->qbias_arr[PFRAME_PBLK_BIAS1] = bias_p1;
1393*437bfbebSnyanmisaka         hw->qbias_arr[PFRAME_PBLK_BIAS2] = bias_p2;
1394*437bfbebSnyanmisaka         hw->qbias_arr[PFRAME_PBLK_BIAS3] = bias_p3;
1395*437bfbebSnyanmisaka     } else {
1396*437bfbebSnyanmisaka         if (frm_type == INTRA_FRAME) {
1397*437bfbebSnyanmisaka             th0 = hw->qbias_arr[IFRAME_THD0];
1398*437bfbebSnyanmisaka             th1 = hw->qbias_arr[IFRAME_THD1];
1399*437bfbebSnyanmisaka             th2 = hw->qbias_arr[IFRAME_THD2];
1400*437bfbebSnyanmisaka             bias_i0 = hw->qbias_arr[IFRAME_BIAS0];
1401*437bfbebSnyanmisaka             bias_i1 = hw->qbias_arr[IFRAME_BIAS1];
1402*437bfbebSnyanmisaka             bias_i2 = hw->qbias_arr[IFRAME_BIAS2];
1403*437bfbebSnyanmisaka             bias_i3 = hw->qbias_arr[IFRAME_BIAS3];
1404*437bfbebSnyanmisaka         } else {
1405*437bfbebSnyanmisaka             th0 = hw->qbias_arr[PFRAME_THD0];
1406*437bfbebSnyanmisaka             th1 = hw->qbias_arr[PFRAME_THD1];
1407*437bfbebSnyanmisaka             th2 = hw->qbias_arr[PFRAME_THD2];
1408*437bfbebSnyanmisaka             bias_i0 = hw->qbias_arr[PFRAME_IBLK_BIAS0];
1409*437bfbebSnyanmisaka             bias_i1 = hw->qbias_arr[PFRAME_IBLK_BIAS1];
1410*437bfbebSnyanmisaka             bias_i2 = hw->qbias_arr[PFRAME_IBLK_BIAS2];
1411*437bfbebSnyanmisaka             bias_i3 = hw->qbias_arr[PFRAME_IBLK_BIAS3];
1412*437bfbebSnyanmisaka             bias_p0 = hw->qbias_arr[PFRAME_PBLK_BIAS0];
1413*437bfbebSnyanmisaka             bias_p1 = hw->qbias_arr[PFRAME_PBLK_BIAS1];
1414*437bfbebSnyanmisaka             bias_p2 = hw->qbias_arr[PFRAME_PBLK_BIAS2];
1415*437bfbebSnyanmisaka             bias_p3 = hw->qbias_arr[PFRAME_PBLK_BIAS3];
1416*437bfbebSnyanmisaka         }
1417*437bfbebSnyanmisaka     }
1418*437bfbebSnyanmisaka 
1419*437bfbebSnyanmisaka     s->bias_madi_thd_comb.bias_madi_th0 = th0;
1420*437bfbebSnyanmisaka     s->bias_madi_thd_comb.bias_madi_th1 = th1;
1421*437bfbebSnyanmisaka     s->bias_madi_thd_comb.bias_madi_th2 = th2;
1422*437bfbebSnyanmisaka     s->qnt0_i_bias_comb.bias_i_val0 = bias_i0;
1423*437bfbebSnyanmisaka     s->qnt0_i_bias_comb.bias_i_val1 = bias_i1;
1424*437bfbebSnyanmisaka     s->qnt0_i_bias_comb.bias_i_val2 = bias_i2;
1425*437bfbebSnyanmisaka     s->qnt1_i_bias_comb.bias_i_val3 = bias_i3;
1426*437bfbebSnyanmisaka     s->qnt0_p_bias_comb.bias_p_val0 = bias_p0;
1427*437bfbebSnyanmisaka     s->qnt0_p_bias_comb.bias_p_val1 = bias_p1;
1428*437bfbebSnyanmisaka     s->qnt0_p_bias_comb.bias_p_val2 = bias_p2;
1429*437bfbebSnyanmisaka     s->qnt1_p_bias_comb.bias_p_val3 = bias_p3;
1430*437bfbebSnyanmisaka }
1431*437bfbebSnyanmisaka 
vepu511_h265_set_atr_regs(H265eV511RegSet * regs)1432*437bfbebSnyanmisaka static void vepu511_h265_set_atr_regs(H265eV511RegSet *regs)
1433*437bfbebSnyanmisaka {
1434*437bfbebSnyanmisaka     H265eVepu511Sqi *s = &regs->reg_sqi;
1435*437bfbebSnyanmisaka     RK_U32 str = 0;
1436*437bfbebSnyanmisaka 
1437*437bfbebSnyanmisaka     /* 0 - disable; 1 - weak; 2 - medium; 3 - strong */
1438*437bfbebSnyanmisaka     if (str == 0) {
1439*437bfbebSnyanmisaka         s->block_opt_cfg.block_en = 0; /* block_en and cmplx_en are not used so far(20240708) */
1440*437bfbebSnyanmisaka         s->cmplx_opt_cfg.cmplx_en = 0;
1441*437bfbebSnyanmisaka         s->line_opt_cfg.line_en = 0;
1442*437bfbebSnyanmisaka     } else {
1443*437bfbebSnyanmisaka         s->block_opt_cfg.block_en = 0;
1444*437bfbebSnyanmisaka         s->cmplx_opt_cfg.cmplx_en = 0;
1445*437bfbebSnyanmisaka         s->line_opt_cfg.line_en = 1;
1446*437bfbebSnyanmisaka     }
1447*437bfbebSnyanmisaka 
1448*437bfbebSnyanmisaka     s->subj_opt_cfg.subj_opt_en = 0;
1449*437bfbebSnyanmisaka     s->subj_opt_cfg.subj_opt_strength = 3;
1450*437bfbebSnyanmisaka     s->subj_opt_cfg.aq_subj_en = 0;
1451*437bfbebSnyanmisaka     s->subj_opt_cfg.aq_subj_strength = 4;
1452*437bfbebSnyanmisaka     s->subj_opt_cfg.bndry_cmplx_static_choose_en = 0;
1453*437bfbebSnyanmisaka     s->subj_opt_cfg.feature_cal_en = 0;
1454*437bfbebSnyanmisaka     s->subj_opt_dpth_thd.common_thre_num_grdn_point_dep0   = 64;
1455*437bfbebSnyanmisaka     s->subj_opt_dpth_thd.common_thre_num_grdn_point_dep1   = 32;
1456*437bfbebSnyanmisaka     s->subj_opt_dpth_thd.common_thre_num_grdn_point_dep2   = 16;
1457*437bfbebSnyanmisaka 
1458*437bfbebSnyanmisaka     if (str == 3) {
1459*437bfbebSnyanmisaka         s->block_opt_cfg.block_thre_cst_best_mad      = 1000;
1460*437bfbebSnyanmisaka         s->block_opt_cfg.block_thre_cst_best_grdn_blk = 39;
1461*437bfbebSnyanmisaka         s->block_opt_cfg.thre_num_grdnt_point_cmplx   = 3;
1462*437bfbebSnyanmisaka         s->block_opt_cfg.block_delta_qp_flag          = 3;
1463*437bfbebSnyanmisaka 
1464*437bfbebSnyanmisaka         s->cmplx_opt_cfg.cmplx_thre_cst_best_mad_dep0 = 4000;
1465*437bfbebSnyanmisaka         s->cmplx_opt_cfg.cmplx_thre_cst_best_mad_dep1 = 2000;
1466*437bfbebSnyanmisaka 
1467*437bfbebSnyanmisaka         s->cmplx_bst_mad_thd.cmplx_thre_cst_best_mad_dep2       = 200;
1468*437bfbebSnyanmisaka         s->cmplx_bst_mad_thd.cmplx_thre_cst_best_grdn_blk_dep0  = 977;
1469*437bfbebSnyanmisaka 
1470*437bfbebSnyanmisaka         s->cmplx_bst_grdn_thd.cmplx_thre_cst_best_grdn_blk_dep1 = 0;
1471*437bfbebSnyanmisaka         s->cmplx_bst_grdn_thd.cmplx_thre_cst_best_grdn_blk_dep2 = 488;
1472*437bfbebSnyanmisaka 
1473*437bfbebSnyanmisaka         s->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep0 = 4;
1474*437bfbebSnyanmisaka         s->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep1 = 30;
1475*437bfbebSnyanmisaka         s->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep2 = 30;
1476*437bfbebSnyanmisaka         s->line_opt_cfg.line_thre_ratio_best_grdn_blk_dep0   = 7;
1477*437bfbebSnyanmisaka         s->line_opt_cfg.line_thre_ratio_best_grdn_blk_dep1   = 6;
1478*437bfbebSnyanmisaka 
1479*437bfbebSnyanmisaka         s->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep0 = 1;
1480*437bfbebSnyanmisaka         s->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep1 = 50;
1481*437bfbebSnyanmisaka         s->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep2 = 50;
1482*437bfbebSnyanmisaka 
1483*437bfbebSnyanmisaka         s->subj_opt_dqp0.line_thre_qp   = 20;
1484*437bfbebSnyanmisaka         s->subj_opt_dqp0.block_strength = 4;
1485*437bfbebSnyanmisaka         s->subj_opt_dqp0.block_thre_qp  = 30;
1486*437bfbebSnyanmisaka         s->subj_opt_dqp0.cmplx_strength = 4;
1487*437bfbebSnyanmisaka         s->subj_opt_dqp0.cmplx_thre_qp  = 34;
1488*437bfbebSnyanmisaka         s->subj_opt_dqp0.cmplx_thre_max_grdn_blk = 32;
1489*437bfbebSnyanmisaka     } else if (str == 2) {
1490*437bfbebSnyanmisaka         s->block_opt_cfg.block_thre_cst_best_mad      = 1000;
1491*437bfbebSnyanmisaka         s->block_opt_cfg.block_thre_cst_best_grdn_blk = 39;
1492*437bfbebSnyanmisaka         s->block_opt_cfg.thre_num_grdnt_point_cmplx   = 3;
1493*437bfbebSnyanmisaka         s->block_opt_cfg.block_delta_qp_flag          = 3;
1494*437bfbebSnyanmisaka 
1495*437bfbebSnyanmisaka         s->cmplx_opt_cfg.cmplx_thre_cst_best_mad_dep0 = 4000;
1496*437bfbebSnyanmisaka         s->cmplx_opt_cfg.cmplx_thre_cst_best_mad_dep1 = 2000;
1497*437bfbebSnyanmisaka 
1498*437bfbebSnyanmisaka         s->cmplx_bst_mad_thd.cmplx_thre_cst_best_mad_dep2      = 200;
1499*437bfbebSnyanmisaka         s->cmplx_bst_mad_thd.cmplx_thre_cst_best_grdn_blk_dep0 = 977;
1500*437bfbebSnyanmisaka 
1501*437bfbebSnyanmisaka         s->cmplx_bst_grdn_thd.cmplx_thre_cst_best_grdn_blk_dep1 = 0;
1502*437bfbebSnyanmisaka         s->cmplx_bst_grdn_thd.cmplx_thre_cst_best_grdn_blk_dep2 = 488;
1503*437bfbebSnyanmisaka 
1504*437bfbebSnyanmisaka         s->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep0 = 3;
1505*437bfbebSnyanmisaka         s->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep1 = 20;
1506*437bfbebSnyanmisaka         s->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep2 = 20;
1507*437bfbebSnyanmisaka         s->line_opt_cfg.line_thre_ratio_best_grdn_blk_dep0   = 7;
1508*437bfbebSnyanmisaka         s->line_opt_cfg.line_thre_ratio_best_grdn_blk_dep1   = 8;
1509*437bfbebSnyanmisaka 
1510*437bfbebSnyanmisaka         s->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep0 = 1;
1511*437bfbebSnyanmisaka         s->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep1 = 60;
1512*437bfbebSnyanmisaka         s->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep2 = 60;
1513*437bfbebSnyanmisaka 
1514*437bfbebSnyanmisaka         s->subj_opt_dqp0.line_thre_qp            = 25;
1515*437bfbebSnyanmisaka         s->subj_opt_dqp0.block_strength          = 4;
1516*437bfbebSnyanmisaka         s->subj_opt_dqp0.block_thre_qp           = 30;
1517*437bfbebSnyanmisaka         s->subj_opt_dqp0.cmplx_strength          = 4;
1518*437bfbebSnyanmisaka         s->subj_opt_dqp0.cmplx_thre_qp           = 34;
1519*437bfbebSnyanmisaka         s->subj_opt_dqp0.cmplx_thre_max_grdn_blk = 32;
1520*437bfbebSnyanmisaka     } else {
1521*437bfbebSnyanmisaka         s->block_opt_cfg.block_thre_cst_best_mad      = 1000;
1522*437bfbebSnyanmisaka         s->block_opt_cfg.block_thre_cst_best_grdn_blk = 39;
1523*437bfbebSnyanmisaka         s->block_opt_cfg.thre_num_grdnt_point_cmplx   = 3;
1524*437bfbebSnyanmisaka         s->block_opt_cfg.block_delta_qp_flag          = 3;
1525*437bfbebSnyanmisaka 
1526*437bfbebSnyanmisaka         s->cmplx_opt_cfg.cmplx_thre_cst_best_mad_dep0 = 6000;
1527*437bfbebSnyanmisaka         s->cmplx_opt_cfg.cmplx_thre_cst_best_mad_dep1 = 2000;
1528*437bfbebSnyanmisaka 
1529*437bfbebSnyanmisaka         s->cmplx_bst_mad_thd.cmplx_thre_cst_best_mad_dep2       = 300;
1530*437bfbebSnyanmisaka         s->cmplx_bst_mad_thd.cmplx_thre_cst_best_grdn_blk_dep0  = 1280;
1531*437bfbebSnyanmisaka 
1532*437bfbebSnyanmisaka         s->cmplx_bst_grdn_thd.cmplx_thre_cst_best_grdn_blk_dep1 = 0;
1533*437bfbebSnyanmisaka         s->cmplx_bst_grdn_thd.cmplx_thre_cst_best_grdn_blk_dep2 = 512;
1534*437bfbebSnyanmisaka 
1535*437bfbebSnyanmisaka         s->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep0 = 3;
1536*437bfbebSnyanmisaka         s->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep1 = 20;
1537*437bfbebSnyanmisaka         s->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep2 = 20;
1538*437bfbebSnyanmisaka         s->line_opt_cfg.line_thre_ratio_best_grdn_blk_dep0   = 7;
1539*437bfbebSnyanmisaka         s->line_opt_cfg.line_thre_ratio_best_grdn_blk_dep1   = 8;
1540*437bfbebSnyanmisaka 
1541*437bfbebSnyanmisaka         s->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep0 = 1;
1542*437bfbebSnyanmisaka         s->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep1 = 70;
1543*437bfbebSnyanmisaka         s->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep2 = 70;
1544*437bfbebSnyanmisaka 
1545*437bfbebSnyanmisaka         s->subj_opt_dqp0.line_thre_qp            = 30;
1546*437bfbebSnyanmisaka         s->subj_opt_dqp0.block_strength          = 4;
1547*437bfbebSnyanmisaka         s->subj_opt_dqp0.block_thre_qp           = 30;
1548*437bfbebSnyanmisaka         s->subj_opt_dqp0.cmplx_strength          = 4;
1549*437bfbebSnyanmisaka         s->subj_opt_dqp0.cmplx_thre_qp           = 34;
1550*437bfbebSnyanmisaka         s->subj_opt_dqp0.cmplx_thre_max_grdn_blk = 32;
1551*437bfbebSnyanmisaka     }
1552*437bfbebSnyanmisaka }
1553*437bfbebSnyanmisaka 
vepu511_h265_set_smear_regs(H265eV511HalContext * ctx,H265eV511RegSet * regs)1554*437bfbebSnyanmisaka static void vepu511_h265_set_smear_regs(H265eV511HalContext *ctx, H265eV511RegSet *regs)
1555*437bfbebSnyanmisaka {
1556*437bfbebSnyanmisaka     H265eVepu511Sqi *s = &regs->reg_sqi;
1557*437bfbebSnyanmisaka     RK_S32 frm_num = ctx->frame_num;
1558*437bfbebSnyanmisaka     RK_S32 gop = (ctx->cfg->rc.gop > 0) ? ctx->cfg->rc.gop : 0x7FFFFFFF;
1559*437bfbebSnyanmisaka     RK_U32 cover_num = ctx->last_frame_fb.acc_cover16_num;
1560*437bfbebSnyanmisaka     RK_U32 bndry_num = ctx->last_frame_fb.acc_bndry16_num;
1561*437bfbebSnyanmisaka     RK_U32 st_ctu_num = ctx->last_frame_fb.st_ctu_num;
1562*437bfbebSnyanmisaka     RK_S32 str = ctx->cfg->tune.deblur_str;
1563*437bfbebSnyanmisaka     RK_S16 flag_cover = 0;
1564*437bfbebSnyanmisaka     RK_S16 flag_bndry = 0;
1565*437bfbebSnyanmisaka 
1566*437bfbebSnyanmisaka     static RK_U8 qp_strength[H265E_SMEAR_STR_NUM] = { 4, 6, 7, 7, 3, 5, 7, 7 };
1567*437bfbebSnyanmisaka     static RK_U8 smear_strength[H265E_SMEAR_STR_NUM] = { 1, 1, 1, 1, 1, 1, 1, 1 };
1568*437bfbebSnyanmisaka     static RK_U8 bndry_intra_r_dep0[H265E_SMEAR_STR_NUM] = { 240, 240, 240, 240, 240, 240, 240, 240 };
1569*437bfbebSnyanmisaka     static RK_U8 bndry_intra_r_dep1[H265E_SMEAR_STR_NUM] = { 240, 240, 240, 240, 240, 240, 240, 240 };
1570*437bfbebSnyanmisaka     static RK_U8 thre_madp_stc_cover0[H265E_SMEAR_STR_NUM] = { 20, 22, 22, 22, 20, 22, 22, 30 };
1571*437bfbebSnyanmisaka     static RK_U8 thre_madp_stc_cover1[H265E_SMEAR_STR_NUM] = { 20, 22, 22, 22, 20, 22, 22, 30 };
1572*437bfbebSnyanmisaka     static RK_U8 thre_madp_mov_cover0[H265E_SMEAR_STR_NUM] = { 10, 9, 9, 9, 10, 9, 9, 6 };
1573*437bfbebSnyanmisaka     static RK_U8 thre_madp_mov_cover1[H265E_SMEAR_STR_NUM] = { 10, 9, 9, 9, 10, 9, 9, 6 };
1574*437bfbebSnyanmisaka 
1575*437bfbebSnyanmisaka     static RK_U8 flag_cover_thd0[H265E_SMEAR_STR_NUM] = { 12, 13, 13, 13, 12, 13, 13, 17 };
1576*437bfbebSnyanmisaka     static RK_U8 flag_cover_thd1[H265E_SMEAR_STR_NUM] = { 61, 70, 70, 70, 61, 70, 70, 90 };
1577*437bfbebSnyanmisaka     static RK_U8 flag_bndry_thd0[H265E_SMEAR_STR_NUM] = { 12, 12, 12, 12, 12, 12, 12, 12 };
1578*437bfbebSnyanmisaka     static RK_U8 flag_bndry_thd1[H265E_SMEAR_STR_NUM] = { 73, 73, 73, 73, 73, 73, 73, 73 };
1579*437bfbebSnyanmisaka 
1580*437bfbebSnyanmisaka     static RK_S8 flag_cover_wgt[3] = { 1, 0, -3 };
1581*437bfbebSnyanmisaka     static RK_S8 flag_bndry_wgt[3] = { 0, 0, 0 };
1582*437bfbebSnyanmisaka     static RK_S8 flag_bndry_intra_wgt0[3] = { -12, 0, 12 };
1583*437bfbebSnyanmisaka     static RK_S8 flag_bndry_intra_wgt1[3] = { -12, 0, 12 };
1584*437bfbebSnyanmisaka 
1585*437bfbebSnyanmisaka     flag_cover = (cover_num * 1000 < flag_cover_thd0[str] * st_ctu_num) ? 0 :
1586*437bfbebSnyanmisaka                  (cover_num * 1000 < flag_cover_thd1[str] * st_ctu_num) ? 1 : 2;
1587*437bfbebSnyanmisaka 
1588*437bfbebSnyanmisaka     flag_bndry = (bndry_num * 1000 < flag_bndry_thd0[str] * st_ctu_num) ? 0 :
1589*437bfbebSnyanmisaka                  (bndry_num * 1000 < flag_bndry_thd1[str] * st_ctu_num) ? 1 : 2;
1590*437bfbebSnyanmisaka 
1591*437bfbebSnyanmisaka     /* anti smear */
1592*437bfbebSnyanmisaka     s->smear_opt_cfg0.anti_smear_en = ctx->cfg->tune.deblur_en;
1593*437bfbebSnyanmisaka     s->smear_opt_cfg0.smear_strength = (smear_strength[str] > 2) ?
1594*437bfbebSnyanmisaka                                        (smear_strength[str] + flag_bndry_wgt[flag_bndry]) : smear_strength[str];
1595*437bfbebSnyanmisaka 
1596*437bfbebSnyanmisaka     s->smear_opt_cfg0.thre_mv_inconfor_cime       = 8;
1597*437bfbebSnyanmisaka     s->smear_opt_cfg0.thre_mv_confor_cime         = 2;
1598*437bfbebSnyanmisaka     s->smear_opt_cfg0.thre_mv_inconfor_cime_gmv   = 8;
1599*437bfbebSnyanmisaka     s->smear_opt_cfg0.thre_mv_confor_cime_gmv     = 2;
1600*437bfbebSnyanmisaka     s->smear_opt_cfg0.thre_num_mv_confor_cime     = 3;
1601*437bfbebSnyanmisaka     s->smear_opt_cfg0.thre_num_mv_confor_cime_gmv = 2;
1602*437bfbebSnyanmisaka     s->smear_opt_cfg0.frm_static                  = 1;
1603*437bfbebSnyanmisaka 
1604*437bfbebSnyanmisaka     s->smear_opt_cfg0.smear_load_en = ((frm_num % gop == 0) ||
1605*437bfbebSnyanmisaka                                        (s->smear_opt_cfg0.frm_static == 0) || (frm_num % gop == 1)) ? 0 : 1;
1606*437bfbebSnyanmisaka     s->smear_opt_cfg0.smear_stor_en = ((frm_num % gop == 0) ||
1607*437bfbebSnyanmisaka                                        (s->smear_opt_cfg0.frm_static == 0) || (frm_num % gop == gop - 1)) ? 0 : 1;
1608*437bfbebSnyanmisaka     s->smear_opt_cfg1.dist0_frm_avg               = 0;
1609*437bfbebSnyanmisaka     s->smear_opt_cfg1.thre_dsp_static             = 10;
1610*437bfbebSnyanmisaka     s->smear_opt_cfg1.thre_dsp_mov                = 15;
1611*437bfbebSnyanmisaka     s->smear_opt_cfg1.thre_dist_mv_confor_cime    = 32;
1612*437bfbebSnyanmisaka 
1613*437bfbebSnyanmisaka     s->smear_madp_thd.thre_madp_stc_dep0          = 10;
1614*437bfbebSnyanmisaka     s->smear_madp_thd.thre_madp_stc_dep1          = 8;
1615*437bfbebSnyanmisaka     s->smear_madp_thd.thre_madp_stc_dep2          = 8;
1616*437bfbebSnyanmisaka     s->smear_madp_thd.thre_madp_mov_dep0          = 16;
1617*437bfbebSnyanmisaka     s->smear_madp_thd.thre_madp_mov_dep1          = 18;
1618*437bfbebSnyanmisaka     s->smear_madp_thd.thre_madp_mov_dep2          = 20;
1619*437bfbebSnyanmisaka 
1620*437bfbebSnyanmisaka     s->smear_stat_thd.thre_num_pt_stc_dep0        = 47;
1621*437bfbebSnyanmisaka     s->smear_stat_thd.thre_num_pt_stc_dep1        = 11;
1622*437bfbebSnyanmisaka     s->smear_stat_thd.thre_num_pt_stc_dep2        = 3;
1623*437bfbebSnyanmisaka     s->smear_stat_thd.thre_num_pt_mov_dep0        = 47;
1624*437bfbebSnyanmisaka     s->smear_stat_thd.thre_num_pt_mov_dep1        = 11;
1625*437bfbebSnyanmisaka     s->smear_stat_thd.thre_num_pt_mov_dep2        = 3;
1626*437bfbebSnyanmisaka 
1627*437bfbebSnyanmisaka     s->smear_bmv_dist_thd0.confor_cime_gmv0      = 21;
1628*437bfbebSnyanmisaka     s->smear_bmv_dist_thd0.confor_cime_gmv1      = 16;
1629*437bfbebSnyanmisaka     s->smear_bmv_dist_thd0.inconfor_cime_gmv0    = 48;
1630*437bfbebSnyanmisaka     s->smear_bmv_dist_thd0.inconfor_cime_gmv1    = 34;
1631*437bfbebSnyanmisaka 
1632*437bfbebSnyanmisaka     s->smear_bmv_dist_thd1.inconfor_cime_gmv2    = 32;
1633*437bfbebSnyanmisaka     s->smear_bmv_dist_thd1.inconfor_cime_gmv3    = 29;
1634*437bfbebSnyanmisaka     s->smear_bmv_dist_thd1.inconfor_cime_gmv4    = 27;
1635*437bfbebSnyanmisaka 
1636*437bfbebSnyanmisaka     s->smear_min_bndry_gmv.thre_min_num_confor_csu0_bndry_cime_gmv      = 0;
1637*437bfbebSnyanmisaka     s->smear_min_bndry_gmv.thre_max_num_confor_csu0_bndry_cime_gmv      = 3;
1638*437bfbebSnyanmisaka     s->smear_min_bndry_gmv.thre_min_num_inconfor_csu0_bndry_cime_gmv    = 0;
1639*437bfbebSnyanmisaka     s->smear_min_bndry_gmv.thre_max_num_inconfor_csu0_bndry_cime_gmv    = 3;
1640*437bfbebSnyanmisaka     s->smear_min_bndry_gmv.thre_split_dep0                              = 2;
1641*437bfbebSnyanmisaka     s->smear_min_bndry_gmv.thre_zero_srgn                               = 8;
1642*437bfbebSnyanmisaka     s->smear_min_bndry_gmv.madi_thre_dep0                               = 22;
1643*437bfbebSnyanmisaka     s->smear_min_bndry_gmv.madi_thre_dep1                               = 18;
1644*437bfbebSnyanmisaka 
1645*437bfbebSnyanmisaka     s->smear_madp_cov_thd.thre_madp_stc_cover0    = thre_madp_stc_cover0[str];
1646*437bfbebSnyanmisaka     s->smear_madp_cov_thd.thre_madp_stc_cover1    = thre_madp_stc_cover1[str];
1647*437bfbebSnyanmisaka     s->smear_madp_cov_thd.thre_madp_mov_cover0    = thre_madp_mov_cover0[str];
1648*437bfbebSnyanmisaka     s->smear_madp_cov_thd.thre_madp_mov_cover1    = thre_madp_mov_cover1[str];
1649*437bfbebSnyanmisaka     s->smear_madp_cov_thd.smear_qp_strength       = qp_strength[str] +
1650*437bfbebSnyanmisaka                                                     flag_cover_wgt[flag_cover];
1651*437bfbebSnyanmisaka     s->smear_madp_cov_thd.smear_thre_qp           = 30;
1652*437bfbebSnyanmisaka 
1653*437bfbebSnyanmisaka     s->subj_opt_dqp1.bndry_rdo_mode_intra_jcoef_d0   = bndry_intra_r_dep0[str] +
1654*437bfbebSnyanmisaka                                                        flag_bndry_intra_wgt0[flag_bndry];
1655*437bfbebSnyanmisaka     s->subj_opt_dqp1.bndry_rdo_mode_intra_jcoef_d1   = bndry_intra_r_dep1[str] +
1656*437bfbebSnyanmisaka                                                        flag_bndry_intra_wgt1[flag_bndry];
1657*437bfbebSnyanmisaka 
1658*437bfbebSnyanmisaka     s->subj_opt_dqp1.skin_thre_qp = 31;
1659*437bfbebSnyanmisaka     s->subj_opt_dqp1.skin_thre_madp = 64;
1660*437bfbebSnyanmisaka     s->subj_opt_dqp1.bndry_rdo_mode_intra_jcoef_d0 = 15;
1661*437bfbebSnyanmisaka     s->subj_opt_dqp1.bndry_rdo_mode_intra_jcoef_d1 = 14;
1662*437bfbebSnyanmisaka     s->subj_opt_dqp1.smear_frame_thre_qp = 35;
1663*437bfbebSnyanmisaka     s->subj_opt_rdo_split.line_rdo_split_rcoef_d0 = 11;
1664*437bfbebSnyanmisaka     s->subj_opt_rdo_split.line_rdo_split_rcoef_d1 = 13;
1665*437bfbebSnyanmisaka 
1666*437bfbebSnyanmisaka     s->subj_opt_inrar_coef.cover_rmd_mode_intra_jcoef_d0 = 8;
1667*437bfbebSnyanmisaka     s->subj_opt_inrar_coef.cover_rmd_mode_intra_jcoef_d1 = 8;
1668*437bfbebSnyanmisaka     s->subj_opt_inrar_coef.cover_rdo_mode_intra_jcoef_d0 = 12;
1669*437bfbebSnyanmisaka     s->subj_opt_inrar_coef.cover_rdo_mode_intra_jcoef_d1 = 10;
1670*437bfbebSnyanmisaka     s->subj_opt_inrar_coef.cover_rdoq_rcoef_d0 = 7;
1671*437bfbebSnyanmisaka     s->subj_opt_inrar_coef.cover_rdoq_rcoef_d1 = 7;
1672*437bfbebSnyanmisaka 
1673*437bfbebSnyanmisaka     s->smear_opt_cfc_coef.cfc_rmd_mode_intra_jcoef_d0 = 20;
1674*437bfbebSnyanmisaka     s->smear_opt_cfc_coef.cfc_rmd_mode_intra_jcoef_d1 = 20;
1675*437bfbebSnyanmisaka     s->smear_opt_cfc_coef.cfc_rdo_mode_intra_jcoef_d0 = 20;
1676*437bfbebSnyanmisaka     s->smear_opt_cfc_coef.cfc_rdo_mode_intra_jcoef_d1 = 20;
1677*437bfbebSnyanmisaka     s->smear_opt_cfc_coef.cfc_rdoq_rcoef_d0 = 7;
1678*437bfbebSnyanmisaka     s->smear_opt_cfc_coef.cfc_rdoq_rcoef_d1 = 7;
1679*437bfbebSnyanmisaka 
1680*437bfbebSnyanmisaka     s->subj_opt_rdo_split.choose_cu32_split_jcoef = 20;
1681*437bfbebSnyanmisaka     s->subj_opt_rdo_split.choose_cu16_split_jcoef = 8;
1682*437bfbebSnyanmisaka }
1683*437bfbebSnyanmisaka 
vepu511_h265_set_anti_stripe_regs(H265eV511HalContext * ctx,H265eV511RegSet * regs)1684*437bfbebSnyanmisaka static void vepu511_h265_set_anti_stripe_regs(H265eV511HalContext *ctx, H265eV511RegSet *regs)
1685*437bfbebSnyanmisaka {
1686*437bfbebSnyanmisaka     H265eVepu511Sqi *s = &regs->reg_sqi;
1687*437bfbebSnyanmisaka     pre_cst_par* pre_i32 = (pre_cst_par*)&s->preintra32_cst;
1688*437bfbebSnyanmisaka     pre_cst_par* pre_i16 = (pre_cst_par*)&s->preintra16_cst;
1689*437bfbebSnyanmisaka 
1690*437bfbebSnyanmisaka     pre_i32->cst_wgt3.anti_strp_e = !!ctx->cfg->tune.atl_str;
1691*437bfbebSnyanmisaka 
1692*437bfbebSnyanmisaka     pre_i32->cst_madi_thd0.madi_thd0 = 5;
1693*437bfbebSnyanmisaka     pre_i32->cst_madi_thd0.madi_thd1 = 15;
1694*437bfbebSnyanmisaka     pre_i32->cst_madi_thd0.madi_thd2 = 5;
1695*437bfbebSnyanmisaka     pre_i32->cst_madi_thd0.madi_thd3 = 3;
1696*437bfbebSnyanmisaka     pre_i32->cst_madi_thd1.madi_thd4 = 3;
1697*437bfbebSnyanmisaka     pre_i32->cst_madi_thd1.madi_thd5 = 6;
1698*437bfbebSnyanmisaka     pre_i32->cst_madi_thd1.madi_thd6 = 7;
1699*437bfbebSnyanmisaka     pre_i32->cst_madi_thd1.madi_thd7 = 5;
1700*437bfbebSnyanmisaka     pre_i32->cst_madi_thd2.madi_thd8 = 10;
1701*437bfbebSnyanmisaka     pre_i32->cst_madi_thd2.madi_thd9 = 5;
1702*437bfbebSnyanmisaka     pre_i32->cst_madi_thd2.madi_thd10 = 7;
1703*437bfbebSnyanmisaka     pre_i32->cst_madi_thd2.madi_thd11 = 5;
1704*437bfbebSnyanmisaka     pre_i32->cst_madi_thd3.madi_thd12 = 7;
1705*437bfbebSnyanmisaka     pre_i32->cst_madi_thd3.madi_thd13 = 5;
1706*437bfbebSnyanmisaka     pre_i32->cst_madi_thd3.mode_th = 5;
1707*437bfbebSnyanmisaka 
1708*437bfbebSnyanmisaka     pre_i32->cst_wgt0.wgt0 = 20;
1709*437bfbebSnyanmisaka     pre_i32->cst_wgt0.wgt1 = 18;
1710*437bfbebSnyanmisaka     pre_i32->cst_wgt0.wgt2 = 19;
1711*437bfbebSnyanmisaka     pre_i32->cst_wgt0.wgt3 = 18;
1712*437bfbebSnyanmisaka     pre_i32->cst_wgt1.wgt4 = 12;
1713*437bfbebSnyanmisaka     pre_i32->cst_wgt1.wgt5 = 6;
1714*437bfbebSnyanmisaka     pre_i32->cst_wgt1.wgt6 = 13;
1715*437bfbebSnyanmisaka     pre_i32->cst_wgt1.wgt7 = 9;
1716*437bfbebSnyanmisaka     pre_i32->cst_wgt2.wgt8 = 12;
1717*437bfbebSnyanmisaka     pre_i32->cst_wgt2.wgt9 = 6;
1718*437bfbebSnyanmisaka     pre_i32->cst_wgt2.wgt10 = 13;
1719*437bfbebSnyanmisaka     pre_i32->cst_wgt2.wgt11 = 9;
1720*437bfbebSnyanmisaka     pre_i32->cst_wgt3.wgt12 = 18;
1721*437bfbebSnyanmisaka     pre_i32->cst_wgt3.wgt13 = 17;
1722*437bfbebSnyanmisaka     pre_i32->cst_wgt3.wgt14 = 17;
1723*437bfbebSnyanmisaka 
1724*437bfbebSnyanmisaka     pre_i16->cst_madi_thd0.madi_thd0 = 5;
1725*437bfbebSnyanmisaka     pre_i16->cst_madi_thd0.madi_thd1 = 15;
1726*437bfbebSnyanmisaka     pre_i16->cst_madi_thd0.madi_thd2 = 5;
1727*437bfbebSnyanmisaka     pre_i16->cst_madi_thd0.madi_thd3 = 3;
1728*437bfbebSnyanmisaka     pre_i16->cst_madi_thd1.madi_thd4 = 3;
1729*437bfbebSnyanmisaka     pre_i16->cst_madi_thd1.madi_thd5 = 6;
1730*437bfbebSnyanmisaka     pre_i16->cst_madi_thd1.madi_thd6 = 7;
1731*437bfbebSnyanmisaka     pre_i16->cst_madi_thd1.madi_thd7 = 5;
1732*437bfbebSnyanmisaka     pre_i16->cst_madi_thd2.madi_thd8 = 10;
1733*437bfbebSnyanmisaka     pre_i16->cst_madi_thd2.madi_thd9 = 5;
1734*437bfbebSnyanmisaka     pre_i16->cst_madi_thd2.madi_thd10 = 7;
1735*437bfbebSnyanmisaka     pre_i16->cst_madi_thd2.madi_thd11 = 5;
1736*437bfbebSnyanmisaka     pre_i16->cst_madi_thd3.madi_thd12 = 7;
1737*437bfbebSnyanmisaka     pre_i16->cst_madi_thd3.madi_thd13 = 5;
1738*437bfbebSnyanmisaka     pre_i16->cst_madi_thd3.mode_th = 5;
1739*437bfbebSnyanmisaka 
1740*437bfbebSnyanmisaka     pre_i16->cst_wgt0.wgt0 = 20;
1741*437bfbebSnyanmisaka     pre_i16->cst_wgt0.wgt1 = 18;
1742*437bfbebSnyanmisaka     pre_i16->cst_wgt0.wgt2 = 19;
1743*437bfbebSnyanmisaka     pre_i16->cst_wgt0.wgt3 = 18;
1744*437bfbebSnyanmisaka     pre_i16->cst_wgt1.wgt4 = 12;
1745*437bfbebSnyanmisaka     pre_i16->cst_wgt1.wgt5 = 6;
1746*437bfbebSnyanmisaka     pre_i16->cst_wgt1.wgt6 = 13;
1747*437bfbebSnyanmisaka     pre_i16->cst_wgt1.wgt7 = 9;
1748*437bfbebSnyanmisaka     pre_i16->cst_wgt2.wgt8 = 12;
1749*437bfbebSnyanmisaka     pre_i16->cst_wgt2.wgt9 = 6;
1750*437bfbebSnyanmisaka     pre_i16->cst_wgt2.wgt10 = 13;
1751*437bfbebSnyanmisaka     pre_i16->cst_wgt2.wgt11 = 9;
1752*437bfbebSnyanmisaka     pre_i16->cst_wgt3.wgt12 = 18;
1753*437bfbebSnyanmisaka     pre_i16->cst_wgt3.wgt13 = 17;
1754*437bfbebSnyanmisaka     pre_i16->cst_wgt3.wgt14 = 17;
1755*437bfbebSnyanmisaka 
1756*437bfbebSnyanmisaka     pre_i32->cst_madi_thd3.qp_thd = 28;
1757*437bfbebSnyanmisaka     pre_i32->cst_wgt3.lambda_mv_bit_0 = 5; // lv32
1758*437bfbebSnyanmisaka     pre_i32->cst_wgt3.lambda_mv_bit_1 = 4; // lv16
1759*437bfbebSnyanmisaka     pre_i16->cst_wgt3.lambda_mv_bit_0 = 4; // lv8
1760*437bfbebSnyanmisaka     pre_i16->cst_wgt3.lambda_mv_bit_1 = 3; // lv4
1761*437bfbebSnyanmisaka }
1762*437bfbebSnyanmisaka 
vepu511_h265_set_rdo_regs(H265eV511RegSet * regs)1763*437bfbebSnyanmisaka static MPP_RET vepu511_h265_set_rdo_regs(H265eV511RegSet *regs)
1764*437bfbebSnyanmisaka {
1765*437bfbebSnyanmisaka     Vepu511RcRoi *reg_rc = &regs->reg_rc_roi;
1766*437bfbebSnyanmisaka 
1767*437bfbebSnyanmisaka     reg_rc->cudecis_thd0.base_thre_rough_mad32_intra           = 9;
1768*437bfbebSnyanmisaka     reg_rc->cudecis_thd0.delta0_thre_rough_mad32_intra         = 10;
1769*437bfbebSnyanmisaka     reg_rc->cudecis_thd0.delta1_thre_rough_mad32_intra         = 55;
1770*437bfbebSnyanmisaka     reg_rc->cudecis_thd0.delta2_thre_rough_mad32_intra         = 55;
1771*437bfbebSnyanmisaka     reg_rc->cudecis_thd0.delta3_thre_rough_mad32_intra         = 66;
1772*437bfbebSnyanmisaka     reg_rc->cudecis_thd0.delta4_thre_rough_mad32_intra_low5    = 2;
1773*437bfbebSnyanmisaka 
1774*437bfbebSnyanmisaka     reg_rc->cudecis_thd1.delta4_thre_rough_mad32_intra_high2   = 2;
1775*437bfbebSnyanmisaka     reg_rc->cudecis_thd1.delta5_thre_rough_mad32_intra         = 74;
1776*437bfbebSnyanmisaka     reg_rc->cudecis_thd1.delta6_thre_rough_mad32_intra         = 106;
1777*437bfbebSnyanmisaka     reg_rc->cudecis_thd1.base_thre_fine_mad32_intra            = 8;
1778*437bfbebSnyanmisaka     reg_rc->cudecis_thd1.delta0_thre_fine_mad32_intra          = 0;
1779*437bfbebSnyanmisaka     reg_rc->cudecis_thd1.delta1_thre_fine_mad32_intra          = 13;
1780*437bfbebSnyanmisaka     reg_rc->cudecis_thd1.delta2_thre_fine_mad32_intra_low3     = 6;
1781*437bfbebSnyanmisaka 
1782*437bfbebSnyanmisaka     reg_rc->cudecis_thd2.delta2_thre_fine_mad32_intra_high2    = 1;
1783*437bfbebSnyanmisaka     reg_rc->cudecis_thd2.delta3_thre_fine_mad32_intra          = 17;
1784*437bfbebSnyanmisaka     reg_rc->cudecis_thd2.delta4_thre_fine_mad32_intra          = 23;
1785*437bfbebSnyanmisaka     reg_rc->cudecis_thd2.delta5_thre_fine_mad32_intra          = 50;
1786*437bfbebSnyanmisaka     reg_rc->cudecis_thd2.delta6_thre_fine_mad32_intra          = 54;
1787*437bfbebSnyanmisaka     reg_rc->cudecis_thd2.base_thre_str_edge_mad32_intra        = 6;
1788*437bfbebSnyanmisaka     reg_rc->cudecis_thd2.delta0_thre_str_edge_mad32_intra      = 0;
1789*437bfbebSnyanmisaka     reg_rc->cudecis_thd2.delta1_thre_str_edge_mad32_intra      = 0;
1790*437bfbebSnyanmisaka 
1791*437bfbebSnyanmisaka     reg_rc->cudecis_thd3.delta2_thre_str_edge_mad32_intra      = 3;
1792*437bfbebSnyanmisaka     reg_rc->cudecis_thd3.delta3_thre_str_edge_mad32_intra      = 8;
1793*437bfbebSnyanmisaka     reg_rc->cudecis_thd3.base_thre_str_edge_bgrad32_intra      = 25;
1794*437bfbebSnyanmisaka     reg_rc->cudecis_thd3.delta0_thre_str_edge_bgrad32_intra    = 0;
1795*437bfbebSnyanmisaka     reg_rc->cudecis_thd3.delta1_thre_str_edge_bgrad32_intra    = 0;
1796*437bfbebSnyanmisaka     reg_rc->cudecis_thd3.delta2_thre_str_edge_bgrad32_intra    = 7;
1797*437bfbebSnyanmisaka     reg_rc->cudecis_thd3.delta3_thre_str_edge_bgrad32_intra    = 19;
1798*437bfbebSnyanmisaka     reg_rc->cudecis_thd3.base_thre_mad16_intra                 = 6;
1799*437bfbebSnyanmisaka     reg_rc->cudecis_thd3.delta0_thre_mad16_intra               = 0;
1800*437bfbebSnyanmisaka 
1801*437bfbebSnyanmisaka     reg_rc->cudecis_thd4.delta1_thre_mad16_intra          = 3;
1802*437bfbebSnyanmisaka     reg_rc->cudecis_thd4.delta2_thre_mad16_intra          = 3;
1803*437bfbebSnyanmisaka     reg_rc->cudecis_thd4.delta3_thre_mad16_intra          = 24;
1804*437bfbebSnyanmisaka     reg_rc->cudecis_thd4.delta4_thre_mad16_intra          = 28;
1805*437bfbebSnyanmisaka     reg_rc->cudecis_thd4.delta5_thre_mad16_intra          = 40;
1806*437bfbebSnyanmisaka     reg_rc->cudecis_thd4.delta6_thre_mad16_intra          = 52;
1807*437bfbebSnyanmisaka     reg_rc->cudecis_thd4.delta0_thre_mad16_ratio_intra    = 7;
1808*437bfbebSnyanmisaka 
1809*437bfbebSnyanmisaka     reg_rc->cudecis_thd5.delta1_thre_mad16_ratio_intra           =  7;
1810*437bfbebSnyanmisaka     reg_rc->cudecis_thd5.delta2_thre_mad16_ratio_intra           =  2;
1811*437bfbebSnyanmisaka     reg_rc->cudecis_thd5.delta3_thre_mad16_ratio_intra           =  2;
1812*437bfbebSnyanmisaka     reg_rc->cudecis_thd5.delta4_thre_mad16_ratio_intra           =  0;
1813*437bfbebSnyanmisaka     reg_rc->cudecis_thd5.delta5_thre_mad16_ratio_intra           =  0;
1814*437bfbebSnyanmisaka     reg_rc->cudecis_thd5.delta6_thre_mad16_ratio_intra           =  0;
1815*437bfbebSnyanmisaka     reg_rc->cudecis_thd5.delta7_thre_mad16_ratio_intra           =  4;
1816*437bfbebSnyanmisaka     reg_rc->cudecis_thd5.delta0_thre_rough_bgrad32_intra         =  1;
1817*437bfbebSnyanmisaka     reg_rc->cudecis_thd5.delta1_thre_rough_bgrad32_intra         =  5;
1818*437bfbebSnyanmisaka     reg_rc->cudecis_thd5.delta2_thre_rough_bgrad32_intra_low4    =  8;
1819*437bfbebSnyanmisaka 
1820*437bfbebSnyanmisaka     reg_rc->cudecis_thd6.delta2_thre_rough_bgrad32_intra_high2    = 2;
1821*437bfbebSnyanmisaka     reg_rc->cudecis_thd6.delta3_thre_rough_bgrad32_intra          = 540;
1822*437bfbebSnyanmisaka     reg_rc->cudecis_thd6.delta4_thre_rough_bgrad32_intra          = 692;
1823*437bfbebSnyanmisaka     reg_rc->cudecis_thd6.delta5_thre_rough_bgrad32_intra_low10    = 866;
1824*437bfbebSnyanmisaka 
1825*437bfbebSnyanmisaka     reg_rc->cudecis_thd7.delta5_thre_rough_bgrad32_intra_high1   = 1;
1826*437bfbebSnyanmisaka     reg_rc->cudecis_thd7.delta6_thre_rough_bgrad32_intra         = 3286;
1827*437bfbebSnyanmisaka     reg_rc->cudecis_thd7.delta7_thre_rough_bgrad32_intra         = 6620;
1828*437bfbebSnyanmisaka     reg_rc->cudecis_thd7.delta0_thre_bgrad16_ratio_intra         = 8;
1829*437bfbebSnyanmisaka     reg_rc->cudecis_thd7.delta1_thre_bgrad16_ratio_intra_low2    = 3;
1830*437bfbebSnyanmisaka 
1831*437bfbebSnyanmisaka     reg_rc->cudecis_thd8.delta1_thre_bgrad16_ratio_intra_high2    = 2;
1832*437bfbebSnyanmisaka     reg_rc->cudecis_thd8.delta2_thre_bgrad16_ratio_intra          = 15;
1833*437bfbebSnyanmisaka     reg_rc->cudecis_thd8.delta3_thre_bgrad16_ratio_intra          = 15;
1834*437bfbebSnyanmisaka     reg_rc->cudecis_thd8.delta4_thre_bgrad16_ratio_intra          = 13;
1835*437bfbebSnyanmisaka     reg_rc->cudecis_thd8.delta5_thre_bgrad16_ratio_intra          = 13;
1836*437bfbebSnyanmisaka     reg_rc->cudecis_thd8.delta6_thre_bgrad16_ratio_intra          = 7;
1837*437bfbebSnyanmisaka     reg_rc->cudecis_thd8.delta7_thre_bgrad16_ratio_intra          = 15;
1838*437bfbebSnyanmisaka     reg_rc->cudecis_thd8.delta0_thre_fme_ratio_inter              = 4;
1839*437bfbebSnyanmisaka     reg_rc->cudecis_thd8.delta1_thre_fme_ratio_inter              = 4;
1840*437bfbebSnyanmisaka 
1841*437bfbebSnyanmisaka     reg_rc->cudecis_thd9.delta2_thre_fme_ratio_inter    = 3;
1842*437bfbebSnyanmisaka     reg_rc->cudecis_thd9.delta3_thre_fme_ratio_inter    = 2;
1843*437bfbebSnyanmisaka     reg_rc->cudecis_thd9.delta4_thre_fme_ratio_inter    = 0;
1844*437bfbebSnyanmisaka     reg_rc->cudecis_thd9.delta5_thre_fme_ratio_inter    = 0;
1845*437bfbebSnyanmisaka     reg_rc->cudecis_thd9.delta6_thre_fme_ratio_inter    = 0;
1846*437bfbebSnyanmisaka     reg_rc->cudecis_thd9.delta7_thre_fme_ratio_inter    = 0;
1847*437bfbebSnyanmisaka     reg_rc->cudecis_thd9.base_thre_fme32_inter          = 4;
1848*437bfbebSnyanmisaka     reg_rc->cudecis_thd9.delta0_thre_fme32_inter        = 2;
1849*437bfbebSnyanmisaka     reg_rc->cudecis_thd9.delta1_thre_fme32_inter        = 7;
1850*437bfbebSnyanmisaka     reg_rc->cudecis_thd9.delta2_thre_fme32_inter        = 12;
1851*437bfbebSnyanmisaka 
1852*437bfbebSnyanmisaka     reg_rc->cudecis_thd10.delta3_thre_fme32_inter    = 23;
1853*437bfbebSnyanmisaka     reg_rc->cudecis_thd10.delta4_thre_fme32_inter    = 41;
1854*437bfbebSnyanmisaka     reg_rc->cudecis_thd10.delta5_thre_fme32_inter    = 71;
1855*437bfbebSnyanmisaka     reg_rc->cudecis_thd10.delta6_thre_fme32_inter    = 123;
1856*437bfbebSnyanmisaka     reg_rc->cudecis_thd10.thre_cme32_inter           = 48;
1857*437bfbebSnyanmisaka 
1858*437bfbebSnyanmisaka     reg_rc->cudecis_thd11.delta0_thre_mad_fme_ratio_inter    = 0;
1859*437bfbebSnyanmisaka     reg_rc->cudecis_thd11.delta1_thre_mad_fme_ratio_inter    = 7;
1860*437bfbebSnyanmisaka     reg_rc->cudecis_thd11.delta2_thre_mad_fme_ratio_inter    = 7;
1861*437bfbebSnyanmisaka     reg_rc->cudecis_thd11.delta3_thre_mad_fme_ratio_inter    = 6;
1862*437bfbebSnyanmisaka     reg_rc->cudecis_thd11.delta4_thre_mad_fme_ratio_inter    = 5;
1863*437bfbebSnyanmisaka     reg_rc->cudecis_thd11.delta5_thre_mad_fme_ratio_inter    = 4;
1864*437bfbebSnyanmisaka     reg_rc->cudecis_thd11.delta6_thre_mad_fme_ratio_inter    = 4;
1865*437bfbebSnyanmisaka     reg_rc->cudecis_thd11.delta7_thre_mad_fme_ratio_inter    = 4;
1866*437bfbebSnyanmisaka 
1867*437bfbebSnyanmisaka     reg_rc->cudecis_thd12.delta0_thre_mad_fme_ratio_inter    = 1;
1868*437bfbebSnyanmisaka     reg_rc->cudecis_thd12.delta1_thre_mad_fme_ratio_inter    = 3;
1869*437bfbebSnyanmisaka     reg_rc->cudecis_thd12.delta2_thre_mad_fme_ratio_inter    = 6;
1870*437bfbebSnyanmisaka     reg_rc->cudecis_thd12.delta3_thre_mad_fme_ratio_inter    = 9;
1871*437bfbebSnyanmisaka     reg_rc->cudecis_thd12.delta4_thre_mad_fme_ratio_inter    = 10;
1872*437bfbebSnyanmisaka     reg_rc->cudecis_thd12.delta5_thre_mad_fme_ratio_inter    = 11;
1873*437bfbebSnyanmisaka     reg_rc->cudecis_thd12.delta6_thre_mad_fme_ratio_inter    = 12;
1874*437bfbebSnyanmisaka     reg_rc->cudecis_thd12.delta7_thre_mad_fme_ratio_inter    = 15;
1875*437bfbebSnyanmisaka 
1876*437bfbebSnyanmisaka     return MPP_OK;
1877*437bfbebSnyanmisaka }
1878*437bfbebSnyanmisaka 
vepu511_h265_set_sao_regs(H265eV511RegSet * regs)1879*437bfbebSnyanmisaka static void vepu511_h265_set_sao_regs(H265eV511RegSet *regs)
1880*437bfbebSnyanmisaka {
1881*437bfbebSnyanmisaka     H265eVepu511Sqi *sqi = &regs->reg_sqi;
1882*437bfbebSnyanmisaka 
1883*437bfbebSnyanmisaka     /* Weight values are set to 4 to disable SAO subjective optimization.
1884*437bfbebSnyanmisaka      * They are not under the control of anti_blur_en.
1885*437bfbebSnyanmisaka      */
1886*437bfbebSnyanmisaka     sqi->subj_anti_blur_wgt3.merge_cost_dist_eo_wgt0 = 4;
1887*437bfbebSnyanmisaka     sqi->subj_anti_blur_wgt3.merge_cost_dist_bo_wgt0 = 4;
1888*437bfbebSnyanmisaka     sqi->subj_anti_blur_wgt4.merge_cost_dist_eo_wgt1 = 4;
1889*437bfbebSnyanmisaka     sqi->subj_anti_blur_wgt4.merge_cost_dist_bo_wgt1 = 4;
1890*437bfbebSnyanmisaka     sqi->subj_anti_blur_wgt4.merge_cost_bit_eo_wgt0 = 4;
1891*437bfbebSnyanmisaka     sqi->subj_anti_blur_wgt4.merge_cost_bit_bo_wgt0 = 4;
1892*437bfbebSnyanmisaka }
1893*437bfbebSnyanmisaka 
vepu511_h265_set_slice_regs(H265eSyntax_new * syn,H265eVepu511Frame * regs)1894*437bfbebSnyanmisaka static void vepu511_h265_set_slice_regs(H265eSyntax_new *syn, H265eVepu511Frame *regs)
1895*437bfbebSnyanmisaka {
1896*437bfbebSnyanmisaka     regs->synt_sps.smpl_adpt_ofst_e     = syn->pp.sample_adaptive_offset_enabled_flag;
1897*437bfbebSnyanmisaka     regs->synt_sps.num_st_ref_pic       = syn->pp.num_short_term_ref_pic_sets;
1898*437bfbebSnyanmisaka     regs->synt_sps.num_lt_ref_pic       = syn->pp.num_long_term_ref_pics_sps;
1899*437bfbebSnyanmisaka     regs->synt_sps.lt_ref_pic_prsnt     = syn->pp.long_term_ref_pics_present_flag;
1900*437bfbebSnyanmisaka     regs->synt_sps.tmpl_mvp_e           = syn->pp.sps_temporal_mvp_enabled_flag;
1901*437bfbebSnyanmisaka     regs->synt_sps.log2_max_poc_lsb     = syn->pp.log2_max_pic_order_cnt_lsb_minus4;
1902*437bfbebSnyanmisaka     regs->synt_sps.strg_intra_smth      = syn->pp.strong_intra_smoothing_enabled_flag;
1903*437bfbebSnyanmisaka 
1904*437bfbebSnyanmisaka     regs->synt_pps.dpdnt_sli_seg_en     = syn->pp.dependent_slice_segments_enabled_flag;
1905*437bfbebSnyanmisaka     regs->synt_pps.out_flg_prsnt_flg    = syn->pp.output_flag_present_flag;
1906*437bfbebSnyanmisaka     regs->synt_pps.num_extr_sli_hdr     = syn->pp.num_extra_slice_header_bits;
1907*437bfbebSnyanmisaka     regs->synt_pps.sgn_dat_hid_en       = syn->pp.sign_data_hiding_enabled_flag;
1908*437bfbebSnyanmisaka     regs->synt_pps.cbc_init_prsnt_flg   = syn->pp.cabac_init_present_flag;
1909*437bfbebSnyanmisaka     regs->synt_pps.pic_init_qp          = syn->pp.init_qp_minus26 + 26;
1910*437bfbebSnyanmisaka     regs->synt_pps.cu_qp_dlt_en         = syn->pp.cu_qp_delta_enabled_flag;
1911*437bfbebSnyanmisaka     regs->synt_pps.chrm_qp_ofst_prsn    = syn->pp.pps_slice_chroma_qp_offsets_present_flag;
1912*437bfbebSnyanmisaka     regs->synt_pps.lp_fltr_acrs_sli     = syn->pp.pps_loop_filter_across_slices_enabled_flag;
1913*437bfbebSnyanmisaka     regs->synt_pps.dblk_fltr_ovrd_en    = syn->pp.deblocking_filter_override_enabled_flag;
1914*437bfbebSnyanmisaka     regs->synt_pps.lst_mdfy_prsnt_flg   = syn->pp.lists_modification_present_flag;
1915*437bfbebSnyanmisaka     regs->synt_pps.sli_seg_hdr_extn     = syn->pp.slice_segment_header_extension_present_flag;
1916*437bfbebSnyanmisaka     regs->synt_pps.cu_qp_dlt_depth      = syn->pp.diff_cu_qp_delta_depth;
1917*437bfbebSnyanmisaka     regs->synt_pps.lpf_fltr_acrs_til    = syn->pp.loop_filter_across_tiles_enabled_flag;
1918*437bfbebSnyanmisaka 
1919*437bfbebSnyanmisaka     regs->synt_sli0.cbc_init_flg        = syn->sp.cbc_init_flg;
1920*437bfbebSnyanmisaka     regs->synt_sli0.mvd_l1_zero_flg     = syn->sp.mvd_l1_zero_flg;
1921*437bfbebSnyanmisaka     regs->synt_sli0.ref_pic_lst_mdf_l0  = syn->sp.ref_pic_lst_mdf_l0;
1922*437bfbebSnyanmisaka 
1923*437bfbebSnyanmisaka     regs->synt_sli0.num_refidx_l1_act   = syn->sp.num_refidx_l1_act;
1924*437bfbebSnyanmisaka     regs->synt_sli0.num_refidx_l0_act   = syn->sp.num_refidx_l0_act;
1925*437bfbebSnyanmisaka 
1926*437bfbebSnyanmisaka     regs->synt_sli0.num_refidx_act_ovrd = syn->sp.num_refidx_act_ovrd;
1927*437bfbebSnyanmisaka 
1928*437bfbebSnyanmisaka     regs->synt_sli0.sli_sao_chrm_flg    = syn->sp.sli_sao_chrm_flg;
1929*437bfbebSnyanmisaka     regs->synt_sli0.sli_sao_luma_flg    = syn->sp.sli_sao_luma_flg;
1930*437bfbebSnyanmisaka     regs->synt_sli0.sli_tmprl_mvp_e     = syn->sp.sli_tmprl_mvp_en;
1931*437bfbebSnyanmisaka     regs->common.enc_pic.num_pic_tot_cur_hevc  = syn->sp.tot_poc_num;
1932*437bfbebSnyanmisaka 
1933*437bfbebSnyanmisaka     regs->synt_sli0.pic_out_flg         = syn->sp.pic_out_flg;
1934*437bfbebSnyanmisaka     regs->synt_sli0.sli_type            = syn->sp.slice_type;
1935*437bfbebSnyanmisaka     regs->synt_sli0.sli_rsrv_flg        = syn->sp.slice_rsrv_flg;
1936*437bfbebSnyanmisaka     regs->synt_sli0.dpdnt_sli_seg_flg   = syn->sp.dpdnt_sli_seg_flg;
1937*437bfbebSnyanmisaka     regs->synt_sli0.sli_pps_id          = syn->sp.sli_pps_id;
1938*437bfbebSnyanmisaka     regs->synt_sli0.no_out_pri_pic      = syn->sp.no_out_pri_pic;
1939*437bfbebSnyanmisaka 
1940*437bfbebSnyanmisaka 
1941*437bfbebSnyanmisaka     regs->synt_sli1.sp_tc_ofst_div2       = syn->sp.sli_tc_ofst_div2;;
1942*437bfbebSnyanmisaka     regs->synt_sli1.sp_beta_ofst_div2     = syn->sp.sli_beta_ofst_div2;
1943*437bfbebSnyanmisaka     regs->synt_sli1.sli_lp_fltr_acrs_sli  = syn->sp.sli_lp_fltr_acrs_sli;
1944*437bfbebSnyanmisaka     regs->synt_sli1.sp_dblk_fltr_dis      = syn->sp.sli_dblk_fltr_dis;
1945*437bfbebSnyanmisaka     regs->synt_sli1.dblk_fltr_ovrd_flg    = syn->sp.dblk_fltr_ovrd_flg;
1946*437bfbebSnyanmisaka     regs->synt_sli1.sli_cb_qp_ofst = syn->pp.pps_slice_chroma_qp_offsets_present_flag ?
1947*437bfbebSnyanmisaka                                      syn->sp.sli_cb_qp_ofst : syn->pp.pps_cb_qp_offset;
1948*437bfbebSnyanmisaka     regs->synt_sli1.max_mrg_cnd           = 1;
1949*437bfbebSnyanmisaka 
1950*437bfbebSnyanmisaka     regs->synt_sli1.col_ref_idx           = syn->sp.col_ref_idx;
1951*437bfbebSnyanmisaka     regs->synt_sli1.col_frm_l0_flg        = syn->sp.col_frm_l0_flg;
1952*437bfbebSnyanmisaka     regs->synt_sli2.sli_poc_lsb           = syn->sp.sli_poc_lsb;
1953*437bfbebSnyanmisaka     regs->synt_sli2.sli_hdr_ext_len       = syn->sp.sli_hdr_ext_len;
1954*437bfbebSnyanmisaka }
1955*437bfbebSnyanmisaka 
vepu511_h265_set_ref_regs(H265eSyntax_new * syn,H265eVepu511Frame * regs)1956*437bfbebSnyanmisaka static void vepu511_h265_set_ref_regs(H265eSyntax_new *syn, H265eVepu511Frame *regs)
1957*437bfbebSnyanmisaka {
1958*437bfbebSnyanmisaka     regs->synt_refm0.st_ref_pic_flg = syn->sp.st_ref_pic_flg;
1959*437bfbebSnyanmisaka     regs->synt_refm0.poc_lsb_lt0 = syn->sp.poc_lsb_lt0;
1960*437bfbebSnyanmisaka     regs->synt_refm0.num_lt_pic = syn->sp.num_lt_pic;
1961*437bfbebSnyanmisaka 
1962*437bfbebSnyanmisaka     regs->synt_refm1.dlt_poc_msb_prsnt0 = syn->sp.dlt_poc_msb_prsnt0;
1963*437bfbebSnyanmisaka     regs->synt_refm1.dlt_poc_msb_cycl0 = syn->sp.dlt_poc_msb_cycl0;
1964*437bfbebSnyanmisaka     regs->synt_refm1.used_by_lt_flg0 = syn->sp.used_by_lt_flg0;
1965*437bfbebSnyanmisaka     regs->synt_refm1.used_by_lt_flg1 = syn->sp.used_by_lt_flg1;
1966*437bfbebSnyanmisaka     regs->synt_refm1.used_by_lt_flg2 = syn->sp.used_by_lt_flg2;
1967*437bfbebSnyanmisaka     regs->synt_refm1.dlt_poc_msb_prsnt0 = syn->sp.dlt_poc_msb_prsnt0;
1968*437bfbebSnyanmisaka     regs->synt_refm1.dlt_poc_msb_cycl0 = syn->sp.dlt_poc_msb_cycl0;
1969*437bfbebSnyanmisaka     regs->synt_refm1.dlt_poc_msb_prsnt1 = syn->sp.dlt_poc_msb_prsnt1;
1970*437bfbebSnyanmisaka     regs->synt_refm1.num_negative_pics = syn->sp.num_neg_pic;
1971*437bfbebSnyanmisaka     regs->synt_refm1.num_pos_pic = syn->sp.num_pos_pic;
1972*437bfbebSnyanmisaka 
1973*437bfbebSnyanmisaka     regs->synt_refm1.used_by_s0_flg = syn->sp.used_by_s0_flg;
1974*437bfbebSnyanmisaka     regs->synt_refm2.dlt_poc_s0_m10 = syn->sp.dlt_poc_s0_m10;
1975*437bfbebSnyanmisaka     regs->synt_refm2.dlt_poc_s0_m11 = syn->sp.dlt_poc_s0_m11;
1976*437bfbebSnyanmisaka     regs->synt_refm3.dlt_poc_s0_m12 = syn->sp.dlt_poc_s0_m12;
1977*437bfbebSnyanmisaka     regs->synt_refm3.dlt_poc_s0_m13 = syn->sp.dlt_poc_s0_m13;
1978*437bfbebSnyanmisaka 
1979*437bfbebSnyanmisaka     regs->synt_long_refm0.poc_lsb_lt1 = syn->sp.poc_lsb_lt1;
1980*437bfbebSnyanmisaka     regs->synt_long_refm1.dlt_poc_msb_cycl1 = syn->sp.dlt_poc_msb_cycl1;
1981*437bfbebSnyanmisaka     regs->synt_long_refm0.poc_lsb_lt2 = syn->sp.poc_lsb_lt2;
1982*437bfbebSnyanmisaka     regs->synt_refm1.dlt_poc_msb_prsnt2 = syn->sp.dlt_poc_msb_prsnt2;
1983*437bfbebSnyanmisaka     regs->synt_long_refm1.dlt_poc_msb_cycl2 = syn->sp.dlt_poc_msb_cycl2;
1984*437bfbebSnyanmisaka     regs->synt_sli1.lst_entry_l0 = syn->sp.lst_entry_l0;
1985*437bfbebSnyanmisaka     regs->synt_sli0.ref_pic_lst_mdf_l0 = syn->sp.ref_pic_lst_mdf_l0;
1986*437bfbebSnyanmisaka 
1987*437bfbebSnyanmisaka     return;
1988*437bfbebSnyanmisaka }
1989*437bfbebSnyanmisaka 
vepu511_h265_set_atf_regs(H265eV511HalContext * ctx,H265eV511RegSet * regs)1990*437bfbebSnyanmisaka static void vepu511_h265_set_atf_regs(H265eV511HalContext *ctx, H265eV511RegSet *regs)
1991*437bfbebSnyanmisaka {
1992*437bfbebSnyanmisaka     H265eVepu511Sqi *reg = &regs->reg_sqi;
1993*437bfbebSnyanmisaka     RK_U32 str = ctx->cfg->tune.atf_str;
1994*437bfbebSnyanmisaka     rdo_b32_skip_par *p_rdo_b32_skip = NULL;
1995*437bfbebSnyanmisaka     rdo_b32_noskip_par *p_rdo_b32_noskip = NULL;
1996*437bfbebSnyanmisaka     rdo_skip_par *p_rdo_skip = NULL;
1997*437bfbebSnyanmisaka     rdo_noskip_par *p_rdo_noskip = NULL;
1998*437bfbebSnyanmisaka 
1999*437bfbebSnyanmisaka     static RK_U16 b32_skip_thd2[4] = { 15, 15, 15, 200 };
2000*437bfbebSnyanmisaka     static RK_U16 b32_skip_thd3[4] = { 72, 72, 72, 1000 };
2001*437bfbebSnyanmisaka     static RK_U8 b32_skip_wgt0[4] = { 16, 20, 20, 16 };
2002*437bfbebSnyanmisaka     static RK_U8 b32_skip_wgt3[4] = { 16, 16, 16, 17 };
2003*437bfbebSnyanmisaka     static RK_U16 b16_skip_thd2[4] = { 15, 15, 15, 200 };
2004*437bfbebSnyanmisaka     static RK_U16 b16_skip_thd3[4] = { 25, 25, 25, 1000 };
2005*437bfbebSnyanmisaka     static RK_U8 b16_skip_wgt0[4] = { 16, 20, 20, 16 };
2006*437bfbebSnyanmisaka     static RK_U8 b16_skip_wgt3[4] = { 16, 16, 16, 17 };
2007*437bfbebSnyanmisaka     static RK_U16 b32_intra_thd0[4] = { 20, 20, 20, 24 };
2008*437bfbebSnyanmisaka     static RK_U16 b32_intra_thd1[4] = { 40, 40, 40, 48 };
2009*437bfbebSnyanmisaka     static RK_U16 b32_intra_thd2[4] = { 60, 72, 72, 96 };
2010*437bfbebSnyanmisaka     static RK_U8 b32_intra_wgt0[4] = { 16, 22, 27, 28 };
2011*437bfbebSnyanmisaka     static RK_U8 b32_intra_wgt1[4] = { 16, 20, 25, 26 };
2012*437bfbebSnyanmisaka     static RK_U8 b32_intra_wgt2[4] = { 16, 18, 20, 24 };
2013*437bfbebSnyanmisaka     static RK_U16 b16_intra_thd0[4] = { 20, 20, 20, 24 };
2014*437bfbebSnyanmisaka     static RK_U16 b16_intra_thd1[4] = { 40, 40, 40, 48 };
2015*437bfbebSnyanmisaka     static RK_U16 b16_intra_thd2[4] = { 60, 72, 72, 96 };
2016*437bfbebSnyanmisaka     static RK_U8 b16_intra_wgt0[4] = { 16, 22, 27, 28 };
2017*437bfbebSnyanmisaka     static RK_U8 b16_intra_wgt1[4] = { 16, 20, 25, 26 };
2018*437bfbebSnyanmisaka     static RK_U8 b16_intra_wgt2[4] = { 16, 18, 20, 24 };
2019*437bfbebSnyanmisaka 
2020*437bfbebSnyanmisaka     regs->reg_frm.rdo_cfg.atf_e = !!str;
2021*437bfbebSnyanmisaka 
2022*437bfbebSnyanmisaka     p_rdo_b32_skip = &reg->rdo_b32_skip;
2023*437bfbebSnyanmisaka     p_rdo_b32_skip->atf_thd0.madp_thd0 = 5;
2024*437bfbebSnyanmisaka     p_rdo_b32_skip->atf_thd0.madp_thd1 = 10;
2025*437bfbebSnyanmisaka     p_rdo_b32_skip->atf_thd1.madp_thd2 = b32_skip_thd2[str];
2026*437bfbebSnyanmisaka     p_rdo_b32_skip->atf_thd1.madp_thd3 = b32_skip_thd3[str];
2027*437bfbebSnyanmisaka     p_rdo_b32_skip->atf_wgt0.wgt0 = b32_skip_wgt0[str];
2028*437bfbebSnyanmisaka     p_rdo_b32_skip->atf_wgt0.wgt1 = 16;
2029*437bfbebSnyanmisaka     p_rdo_b32_skip->atf_wgt0.wgt2 = 16;
2030*437bfbebSnyanmisaka     p_rdo_b32_skip->atf_wgt0.wgt3 = b32_skip_wgt3[str];
2031*437bfbebSnyanmisaka     p_rdo_b32_skip->atf_thd0.flckr_frame_qp_en = 1;
2032*437bfbebSnyanmisaka     p_rdo_b32_skip->atf_thd0.flckr_lgt_chng_en = 1;
2033*437bfbebSnyanmisaka 
2034*437bfbebSnyanmisaka     p_rdo_b32_noskip = &reg->rdo_b32_inter;
2035*437bfbebSnyanmisaka     p_rdo_b32_noskip->atf_thd0.madp_thd0 = 20;
2036*437bfbebSnyanmisaka     p_rdo_b32_noskip->atf_thd0.madp_thd1 = 40;
2037*437bfbebSnyanmisaka     p_rdo_b32_noskip->atf_thd1.madp_thd2 = 72;
2038*437bfbebSnyanmisaka     p_rdo_b32_noskip->atf_wgt.wgt0 = 16;
2039*437bfbebSnyanmisaka     p_rdo_b32_noskip->atf_wgt.wgt1 = 16;
2040*437bfbebSnyanmisaka     p_rdo_b32_noskip->atf_wgt.wgt2 = 16;
2041*437bfbebSnyanmisaka 
2042*437bfbebSnyanmisaka     p_rdo_noskip = &reg->rdo_b32_intra;
2043*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd0 = b32_intra_thd0[str];
2044*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd1 = b32_intra_thd1[str];
2045*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd1.madp_thd2 = b32_intra_thd2[str];
2046*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt0 = b32_intra_wgt0[str];
2047*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt1 = b32_intra_wgt1[str];
2048*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt2 = b32_intra_wgt2[str];
2049*437bfbebSnyanmisaka 
2050*437bfbebSnyanmisaka     p_rdo_skip = &reg->rdo_b16_skip;
2051*437bfbebSnyanmisaka     p_rdo_skip->atf_thd0.madp_thd0 = 1;
2052*437bfbebSnyanmisaka     p_rdo_skip->atf_thd0.madp_thd1 = 10;
2053*437bfbebSnyanmisaka     p_rdo_skip->atf_thd1.madp_thd2 = b16_skip_thd2[str];
2054*437bfbebSnyanmisaka     p_rdo_skip->atf_thd1.madp_thd3 = b16_skip_thd3[str];
2055*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt0 = b16_skip_wgt0[str];
2056*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt1 = 16;
2057*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt2 = 16;
2058*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt3 = b16_skip_wgt3[str];
2059*437bfbebSnyanmisaka 
2060*437bfbebSnyanmisaka     p_rdo_noskip = &reg->rdo_b16_inter;
2061*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd0 = 20;
2062*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd1 = 40;
2063*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd1.madp_thd2 = 72;
2064*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt0 = 16;
2065*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt1 = 16;
2066*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt2 = 16;
2067*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt3 = 16;
2068*437bfbebSnyanmisaka 
2069*437bfbebSnyanmisaka     p_rdo_noskip = &reg->rdo_b16_intra;
2070*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd0 = b16_intra_thd0[str];
2071*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd1 = b16_intra_thd1[str];
2072*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd1.madp_thd2 = b16_intra_thd2[str];
2073*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt0 = b16_intra_wgt0[str];
2074*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt1 = b16_intra_wgt1[str];
2075*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt2 = b16_intra_wgt2[str];
2076*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt3 = 16;
2077*437bfbebSnyanmisaka }
2078*437bfbebSnyanmisaka 
vepu511_h265_set_aq(H265eV511HalContext * ctx,H265eV511RegSet * regs)2079*437bfbebSnyanmisaka static void vepu511_h265_set_aq(H265eV511HalContext *ctx, H265eV511RegSet *regs)
2080*437bfbebSnyanmisaka {
2081*437bfbebSnyanmisaka     MppEncHwCfg *hw = &ctx->cfg->hw;
2082*437bfbebSnyanmisaka     Vepu511RcRoi *rc_regs =  &regs->reg_rc_roi;
2083*437bfbebSnyanmisaka     RK_S32 *aq_step, *aq_rnge;
2084*437bfbebSnyanmisaka     RK_U32 *aq_thd;
2085*437bfbebSnyanmisaka     RK_U32 i;
2086*437bfbebSnyanmisaka 
2087*437bfbebSnyanmisaka     if (ctx->frame_type == INTRA_FRAME) {
2088*437bfbebSnyanmisaka         aq_thd = &hw->aq_thrd_i[0];
2089*437bfbebSnyanmisaka         aq_step = &hw->aq_step_i[0];
2090*437bfbebSnyanmisaka         aq_rnge = &hw->aq_rnge_arr[0];
2091*437bfbebSnyanmisaka     } else {
2092*437bfbebSnyanmisaka         aq_thd = &hw->aq_thrd_p[0];
2093*437bfbebSnyanmisaka         aq_step = &hw->aq_step_p[0];
2094*437bfbebSnyanmisaka         aq_rnge = &hw->aq_rnge_arr[5];
2095*437bfbebSnyanmisaka     }
2096*437bfbebSnyanmisaka 
2097*437bfbebSnyanmisaka     rc_regs->aq_stp0.aq_stp_s0 = aq_step[0] & 0x1f;
2098*437bfbebSnyanmisaka     rc_regs->aq_stp0.aq_stp_0t1 = aq_step[1] & 0x1f;
2099*437bfbebSnyanmisaka     rc_regs->aq_stp0.aq_stp_1t2 = aq_step[2] & 0x1f;
2100*437bfbebSnyanmisaka     rc_regs->aq_stp0.aq_stp_2t3 = aq_step[3] & 0x1f;
2101*437bfbebSnyanmisaka     rc_regs->aq_stp0.aq_stp_3t4 = aq_step[4] & 0x1f;
2102*437bfbebSnyanmisaka     rc_regs->aq_stp0.aq_stp_4t5 = aq_step[5] & 0x1f;
2103*437bfbebSnyanmisaka     rc_regs->aq_stp1.aq_stp_5t6 = aq_step[6] & 0x1f;
2104*437bfbebSnyanmisaka     rc_regs->aq_stp1.aq_stp_6t7 = aq_step[7] & 0x1f;
2105*437bfbebSnyanmisaka     rc_regs->aq_stp1.aq_stp_7t8 = 0;
2106*437bfbebSnyanmisaka     rc_regs->aq_stp1.aq_stp_8t9 = aq_step[8] & 0x1f;
2107*437bfbebSnyanmisaka     rc_regs->aq_stp1.aq_stp_9t10 = aq_step[9] & 0x1f;
2108*437bfbebSnyanmisaka     rc_regs->aq_stp1.aq_stp_10t11 = aq_step[10] & 0x1f;
2109*437bfbebSnyanmisaka     rc_regs->aq_stp2.aq_stp_11t12 = aq_step[11] & 0x1f;
2110*437bfbebSnyanmisaka     rc_regs->aq_stp2.aq_stp_12t13 = aq_step[12] & 0x1f;
2111*437bfbebSnyanmisaka     rc_regs->aq_stp2.aq_stp_13t14 = aq_step[13] & 0x1f;
2112*437bfbebSnyanmisaka     rc_regs->aq_stp2.aq_stp_14t15 = aq_step[14] & 0x1f;
2113*437bfbebSnyanmisaka     rc_regs->aq_stp2.aq_stp_b15 = aq_step[15];
2114*437bfbebSnyanmisaka 
2115*437bfbebSnyanmisaka     for (i = 0; i < 16; i++)
2116*437bfbebSnyanmisaka         rc_regs->aq_tthd[i] = aq_thd[i];
2117*437bfbebSnyanmisaka 
2118*437bfbebSnyanmisaka     rc_regs->aq_clip.aq16_rnge = aq_rnge[0];
2119*437bfbebSnyanmisaka     rc_regs->aq_clip.aq32_rnge = aq_rnge[1];
2120*437bfbebSnyanmisaka     rc_regs->aq_clip.aq8_rnge = aq_rnge[2];
2121*437bfbebSnyanmisaka     rc_regs->aq_clip.aq16_dif0 = aq_rnge[3];
2122*437bfbebSnyanmisaka     rc_regs->aq_clip.aq16_dif1 = aq_rnge[4];
2123*437bfbebSnyanmisaka 
2124*437bfbebSnyanmisaka     rc_regs->aq_clip.aq_rme_en = 1;
2125*437bfbebSnyanmisaka     rc_regs->aq_clip.aq_cme_en = 1;
2126*437bfbebSnyanmisaka }
2127*437bfbebSnyanmisaka 
vepu511_h265_global_cfg_set(H265eV511HalContext * ctx,H265eV511RegSet * regs)2128*437bfbebSnyanmisaka static void vepu511_h265_global_cfg_set(H265eV511HalContext *ctx, H265eV511RegSet *regs)
2129*437bfbebSnyanmisaka {
2130*437bfbebSnyanmisaka     H265eVepu511Frame *reg_frm = &regs->reg_frm;
2131*437bfbebSnyanmisaka     H265eVepu511Param *reg_param = &regs->reg_param;
2132*437bfbebSnyanmisaka     RK_S32 lambda_idx_p = ctx->cfg->tune.lambda_idx_i;
2133*437bfbebSnyanmisaka 
2134*437bfbebSnyanmisaka     reg_frm->sao_cfg.sao_lambda_multi = ctx->cfg->h265.sao_cfg.sao_bit_ratio;
2135*437bfbebSnyanmisaka 
2136*437bfbebSnyanmisaka     if (ctx->frame_type == INTRA_FRAME) {
2137*437bfbebSnyanmisaka         memcpy(&reg_param->pprd_lamb_satd_0_51[0], lambda_tbl_pre_intra, sizeof(lambda_tbl_pre_intra));
2138*437bfbebSnyanmisaka     } else {
2139*437bfbebSnyanmisaka         memcpy(&reg_param->pprd_lamb_satd_0_51[0], lambda_tbl_pre_inter, sizeof(lambda_tbl_pre_inter));
2140*437bfbebSnyanmisaka     }
2141*437bfbebSnyanmisaka 
2142*437bfbebSnyanmisaka     {
2143*437bfbebSnyanmisaka         RK_U32 *lambda_tbl;
2144*437bfbebSnyanmisaka 
2145*437bfbebSnyanmisaka         if (ctx->frame_type == INTRA_FRAME) {
2146*437bfbebSnyanmisaka             lambda_tbl = &rdo_lambda_table_I[lambda_idx_p];
2147*437bfbebSnyanmisaka         } else {
2148*437bfbebSnyanmisaka             lambda_idx_p = ctx->cfg->tune.lambda_idx_p;
2149*437bfbebSnyanmisaka             lambda_tbl = &rdo_lambda_table_P[lambda_idx_p];
2150*437bfbebSnyanmisaka         }
2151*437bfbebSnyanmisaka 
2152*437bfbebSnyanmisaka         memcpy(&reg_param->rdo_wgta_qp_grpa_0_51[0], lambda_tbl, H265E_LAMBDA_TAB_SIZE);
2153*437bfbebSnyanmisaka     }
2154*437bfbebSnyanmisaka 
2155*437bfbebSnyanmisaka     /* 0x1064 */
2156*437bfbebSnyanmisaka     regs->reg_rc_roi.madi_st_thd.madi_th0 = 5;
2157*437bfbebSnyanmisaka     regs->reg_rc_roi.madi_st_thd.madi_th1 = 12;
2158*437bfbebSnyanmisaka     regs->reg_rc_roi.madi_st_thd.madi_th2 = 20;
2159*437bfbebSnyanmisaka     /* 0x1068 */
2160*437bfbebSnyanmisaka     regs->reg_rc_roi.madp_st_thd0.madp_th0 = 4 << 4;
2161*437bfbebSnyanmisaka     regs->reg_rc_roi.madp_st_thd0.madp_th1 = 9 << 4;
2162*437bfbebSnyanmisaka     /* 0x106C */
2163*437bfbebSnyanmisaka     regs->reg_rc_roi.madp_st_thd1.madp_th2 = 15 << 4;
2164*437bfbebSnyanmisaka     regs->reg_param.prmd_intra_lamb_ofst.lambda_luma_offset = 11;
2165*437bfbebSnyanmisaka     regs->reg_param.prmd_intra_lamb_ofst.lambda_chroma_offset = 11;
2166*437bfbebSnyanmisaka 
2167*437bfbebSnyanmisaka }
2168*437bfbebSnyanmisaka 
hal_h265e_vepu511_gen_regs(void * hal,HalEncTask * task)2169*437bfbebSnyanmisaka MPP_RET hal_h265e_vepu511_gen_regs(void *hal, HalEncTask *task)
2170*437bfbebSnyanmisaka {
2171*437bfbebSnyanmisaka     H265eV511HalContext *ctx = (H265eV511HalContext *)hal;
2172*437bfbebSnyanmisaka     Vepu511H265eFrmCfg *frm_cfg = ctx->frm;
2173*437bfbebSnyanmisaka     H265eV511RegSet *regs = frm_cfg->regs_set;
2174*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
2175*437bfbebSnyanmisaka 
2176*437bfbebSnyanmisaka     HalEncTask *enc_task = task;
2177*437bfbebSnyanmisaka     H265eSyntax_new *syn = ctx->syn;
2178*437bfbebSnyanmisaka     VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
2179*437bfbebSnyanmisaka     H265eVepu511Frame *reg_frm = &regs->reg_frm;
2180*437bfbebSnyanmisaka     EncFrmStatus *frm = &task->rc_task->frm;
2181*437bfbebSnyanmisaka 
2182*437bfbebSnyanmisaka     hal_h265e_enter();
2183*437bfbebSnyanmisaka 
2184*437bfbebSnyanmisaka     hal_h265e_dbg_simple("frame %d | type %d | start gen regs11",
2185*437bfbebSnyanmisaka                          ctx->frame_num, ctx->frame_type);
2186*437bfbebSnyanmisaka 
2187*437bfbebSnyanmisaka     memset(regs, 0, sizeof(H265eV511RegSet));
2188*437bfbebSnyanmisaka 
2189*437bfbebSnyanmisaka     vepu511_h265_set_normal(ctx, regs);
2190*437bfbebSnyanmisaka     vepu511_h265_set_prep(ctx, task, regs);
2191*437bfbebSnyanmisaka     vepu511_h265_set_me_regs(ctx, syn , regs);
2192*437bfbebSnyanmisaka     vepu511_h265_set_split(regs, ctx->cfg);
2193*437bfbebSnyanmisaka     vepu511_h265_set_hw_address(ctx, reg_frm, task);
2194*437bfbebSnyanmisaka     vepu511_h265_set_pp_regs(regs, fmt, &ctx->cfg->prep, task);
2195*437bfbebSnyanmisaka     vepu511_h265_set_vsp_filtering(ctx, regs);
2196*437bfbebSnyanmisaka     vepu511_h265_set_rc_regs(ctx, regs, task);
2197*437bfbebSnyanmisaka     vepu511_h265_set_rdo_regs(regs);
2198*437bfbebSnyanmisaka     vepu511_h265_set_quant_regs(ctx, regs);
2199*437bfbebSnyanmisaka     vepu511_h265_set_sao_regs(regs);
2200*437bfbebSnyanmisaka     vepu511_h265_set_slice_regs(syn, reg_frm);
2201*437bfbebSnyanmisaka     vepu511_h265_set_ref_regs(syn, reg_frm);
2202*437bfbebSnyanmisaka 
2203*437bfbebSnyanmisaka     ret = vepu511_h265_set_patch_info(syn, (VepuFmt)fmt->format, ctx->reg_cfg, enc_task);
2204*437bfbebSnyanmisaka     if (ret)
2205*437bfbebSnyanmisaka         return ret;
2206*437bfbebSnyanmisaka 
2207*437bfbebSnyanmisaka     setup_vepu511_ext_line_buf(ctx, regs);
2208*437bfbebSnyanmisaka     vepu511_h265_set_atf_regs(ctx, regs);
2209*437bfbebSnyanmisaka     vepu511_h265_set_anti_stripe_regs(ctx, regs);
2210*437bfbebSnyanmisaka     vepu511_h265_set_atr_regs(regs);
2211*437bfbebSnyanmisaka     vepu511_h265_set_smear_regs(ctx, regs);
2212*437bfbebSnyanmisaka     vepu511_h265_set_scaling_list(regs);
2213*437bfbebSnyanmisaka     vepu511_h265_set_aq(ctx, regs);
2214*437bfbebSnyanmisaka 
2215*437bfbebSnyanmisaka     if (ctx->osd_cfg.osd_data3)
2216*437bfbebSnyanmisaka         vepu511_set_osd(&ctx->osd_cfg, &regs->reg_osd.osd_comb_cfg);
2217*437bfbebSnyanmisaka 
2218*437bfbebSnyanmisaka     if (ctx->roi_data)
2219*437bfbebSnyanmisaka         vepu511_set_roi(&regs->reg_rc_roi.roi_cfg, ctx->roi_data,
2220*437bfbebSnyanmisaka                         ctx->cfg->prep.width, ctx->cfg->prep.height);
2221*437bfbebSnyanmisaka 
2222*437bfbebSnyanmisaka     /*paramet cfg*/
2223*437bfbebSnyanmisaka     vepu511_h265_global_cfg_set(ctx, regs);
2224*437bfbebSnyanmisaka 
2225*437bfbebSnyanmisaka     /* two pass register patch */
2226*437bfbebSnyanmisaka     if (frm->save_pass1)
2227*437bfbebSnyanmisaka         vepu511_h265e_save_pass1_patch(regs, ctx, syn->pp.tiles_enabled_flag);
2228*437bfbebSnyanmisaka 
2229*437bfbebSnyanmisaka     if (frm->use_pass1)
2230*437bfbebSnyanmisaka         vepu511_h265e_use_pass1_patch(regs, ctx);
2231*437bfbebSnyanmisaka 
2232*437bfbebSnyanmisaka     ctx->frame_num++;
2233*437bfbebSnyanmisaka 
2234*437bfbebSnyanmisaka     hal_h265e_leave();
2235*437bfbebSnyanmisaka     return MPP_OK;
2236*437bfbebSnyanmisaka }
2237*437bfbebSnyanmisaka 
hal_h265e_vepu511_start(void * hal,HalEncTask * enc_task)2238*437bfbebSnyanmisaka MPP_RET hal_h265e_vepu511_start(void *hal, HalEncTask *enc_task)
2239*437bfbebSnyanmisaka {
2240*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
2241*437bfbebSnyanmisaka     H265eV511HalContext *ctx = (H265eV511HalContext *)hal;
2242*437bfbebSnyanmisaka     Vepu511H265eFrmCfg *frm = ctx->frm;
2243*437bfbebSnyanmisaka     RK_U32 *regs = (RK_U32*)frm->regs_set;
2244*437bfbebSnyanmisaka     H265eV511RegSet *hw_regs = frm->regs_set;
2245*437bfbebSnyanmisaka     H265eV511StatusElem *reg_out = (H265eV511StatusElem *)frm->regs_ret;
2246*437bfbebSnyanmisaka     MppDevRegWrCfg cfg;
2247*437bfbebSnyanmisaka     MppDevRegRdCfg cfg1;
2248*437bfbebSnyanmisaka     RK_U32 i = 0;
2249*437bfbebSnyanmisaka 
2250*437bfbebSnyanmisaka     hal_h265e_enter();
2251*437bfbebSnyanmisaka     if (enc_task->flags.err) {
2252*437bfbebSnyanmisaka         hal_h265e_err("enc_task->flags.err %08x, return e arly",
2253*437bfbebSnyanmisaka                       enc_task->flags.err);
2254*437bfbebSnyanmisaka         return MPP_NOK;
2255*437bfbebSnyanmisaka     }
2256*437bfbebSnyanmisaka 
2257*437bfbebSnyanmisaka     cfg.reg = (RK_U32*)&hw_regs->reg_ctl;
2258*437bfbebSnyanmisaka     cfg.size = sizeof(Vepu511ControlCfg);
2259*437bfbebSnyanmisaka     cfg.offset = VEPU511_CTL_OFFSET;
2260*437bfbebSnyanmisaka 
2261*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
2262*437bfbebSnyanmisaka     if (ret) {
2263*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
2264*437bfbebSnyanmisaka         return ret;
2265*437bfbebSnyanmisaka     }
2266*437bfbebSnyanmisaka 
2267*437bfbebSnyanmisaka     if (hal_h265e_debug & HAL_H265E_DBG_CTL_REGS) {
2268*437bfbebSnyanmisaka         regs = (RK_U32*)&hw_regs->reg_ctl;
2269*437bfbebSnyanmisaka         for (i = 0; i < sizeof(Vepu511ControlCfg) / 4; i++) {
2270*437bfbebSnyanmisaka             hal_h265e_dbg_ctl("ctl reg[%04x]: 0%08x\n", i * 4, regs[i]);
2271*437bfbebSnyanmisaka         }
2272*437bfbebSnyanmisaka     }
2273*437bfbebSnyanmisaka 
2274*437bfbebSnyanmisaka     cfg.reg = &hw_regs->reg_frm;
2275*437bfbebSnyanmisaka     cfg.size = sizeof(H265eVepu511Frame);
2276*437bfbebSnyanmisaka     cfg.offset = VEPU511_FRAME_OFFSET;
2277*437bfbebSnyanmisaka 
2278*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
2279*437bfbebSnyanmisaka     if (ret) {
2280*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
2281*437bfbebSnyanmisaka         return ret;
2282*437bfbebSnyanmisaka     }
2283*437bfbebSnyanmisaka 
2284*437bfbebSnyanmisaka     if (hal_h265e_debug & HAL_H265E_DBG_REGS) {
2285*437bfbebSnyanmisaka         regs = (RK_U32*)(&hw_regs->reg_frm);
2286*437bfbebSnyanmisaka         for (i = 0; i < 32; i++) {
2287*437bfbebSnyanmisaka             hal_h265e_dbg_regs("hw add cfg reg[%04x]: 0x%08x\n", i * 4, regs[i]);
2288*437bfbebSnyanmisaka         }
2289*437bfbebSnyanmisaka         regs += 32;
2290*437bfbebSnyanmisaka         for (i = 0; i < (sizeof(H265eVepu511Frame) - 128) / 4; i++) {
2291*437bfbebSnyanmisaka             hal_h265e_dbg_regs("set reg[%04x]: 0%08x\n", i * 4, regs[i]);
2292*437bfbebSnyanmisaka         }
2293*437bfbebSnyanmisaka     }
2294*437bfbebSnyanmisaka     cfg.reg = &hw_regs->reg_rc_roi;
2295*437bfbebSnyanmisaka     cfg.size = sizeof(Vepu511RcRoi);
2296*437bfbebSnyanmisaka     cfg.offset = VEPU511_RC_ROI_OFFSET;
2297*437bfbebSnyanmisaka 
2298*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
2299*437bfbebSnyanmisaka     if (ret) {
2300*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
2301*437bfbebSnyanmisaka         return ret;
2302*437bfbebSnyanmisaka     }
2303*437bfbebSnyanmisaka 
2304*437bfbebSnyanmisaka     if (hal_h265e_debug & HAL_H265E_DBG_RCKUT_REGS) {
2305*437bfbebSnyanmisaka         regs = (RK_U32*)&hw_regs->reg_rc_roi;
2306*437bfbebSnyanmisaka         for (i = 0; i < sizeof(Vepu511RcRoi) / 4; i++) {
2307*437bfbebSnyanmisaka             hal_h265e_dbg_rckut("set rc roi reg[%04x]: 0%08x\n", i * 4, regs[i]);
2308*437bfbebSnyanmisaka         }
2309*437bfbebSnyanmisaka     }
2310*437bfbebSnyanmisaka 
2311*437bfbebSnyanmisaka     cfg.reg =  &hw_regs->reg_param;
2312*437bfbebSnyanmisaka     cfg.size = sizeof(H265eVepu511Param);
2313*437bfbebSnyanmisaka     cfg.offset = VEPU511_PARAM_OFFSET;
2314*437bfbebSnyanmisaka 
2315*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
2316*437bfbebSnyanmisaka     if (ret) {
2317*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
2318*437bfbebSnyanmisaka         return ret;
2319*437bfbebSnyanmisaka     }
2320*437bfbebSnyanmisaka 
2321*437bfbebSnyanmisaka     if (hal_h265e_debug & HAL_H265E_DBG_WGT_REGS) {
2322*437bfbebSnyanmisaka         regs = (RK_U32*)&hw_regs->reg_param;
2323*437bfbebSnyanmisaka         for (i = 0; i < sizeof(H265eVepu511Param) / 4; i++) {
2324*437bfbebSnyanmisaka             hal_h265e_dbg_wgt("set param reg[%04x]: 0%08x\n", i * 4, regs[i]);
2325*437bfbebSnyanmisaka         }
2326*437bfbebSnyanmisaka     }
2327*437bfbebSnyanmisaka 
2328*437bfbebSnyanmisaka     cfg.reg = &hw_regs->reg_sqi;
2329*437bfbebSnyanmisaka     cfg.size = sizeof(H265eVepu511Sqi);
2330*437bfbebSnyanmisaka     cfg.offset = VEPU511_SQI_OFFSET;
2331*437bfbebSnyanmisaka 
2332*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
2333*437bfbebSnyanmisaka     if (ret) {
2334*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
2335*437bfbebSnyanmisaka         return ret;
2336*437bfbebSnyanmisaka     }
2337*437bfbebSnyanmisaka 
2338*437bfbebSnyanmisaka     if (hal_h265e_debug & HAL_H265E_DBG_WGT_REGS) {
2339*437bfbebSnyanmisaka         regs = (RK_U32*)&hw_regs->reg_sqi;
2340*437bfbebSnyanmisaka         for (i = 0; i < sizeof(H265eVepu511Sqi) / 4; i++) {
2341*437bfbebSnyanmisaka             hal_h265e_dbg_wgt("set sqi reg[%04x]: 0%08x\n", i * 4, regs[i]);
2342*437bfbebSnyanmisaka         }
2343*437bfbebSnyanmisaka     }
2344*437bfbebSnyanmisaka 
2345*437bfbebSnyanmisaka     cfg.reg = &hw_regs->reg_scl;
2346*437bfbebSnyanmisaka     cfg.size = sizeof(hw_regs->reg_scl);
2347*437bfbebSnyanmisaka     cfg.offset = VEPU511_SCL_OFFSET ;
2348*437bfbebSnyanmisaka 
2349*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
2350*437bfbebSnyanmisaka     if (ret) {
2351*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
2352*437bfbebSnyanmisaka         return ret;
2353*437bfbebSnyanmisaka     }
2354*437bfbebSnyanmisaka 
2355*437bfbebSnyanmisaka     if (hal_h265e_debug & HAL_H265E_DBG_WGT_REGS) {
2356*437bfbebSnyanmisaka         regs = (RK_U32*)&hw_regs->reg_scl;
2357*437bfbebSnyanmisaka         for (i = 0; i < sizeof(H265eVepu511SclCfg) / 4; i++) {
2358*437bfbebSnyanmisaka             hal_h265e_dbg_wgt("set scl reg[%04x]: 0%08x\n", i * 4, regs[i]);
2359*437bfbebSnyanmisaka         }
2360*437bfbebSnyanmisaka     }
2361*437bfbebSnyanmisaka 
2362*437bfbebSnyanmisaka     cfg.reg = &hw_regs->reg_osd;
2363*437bfbebSnyanmisaka     cfg.size = sizeof(hw_regs->reg_osd);
2364*437bfbebSnyanmisaka     cfg.offset = VEPU511_OSD_OFFSET ;
2365*437bfbebSnyanmisaka 
2366*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
2367*437bfbebSnyanmisaka     if (ret) {
2368*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
2369*437bfbebSnyanmisaka         return ret;
2370*437bfbebSnyanmisaka     }
2371*437bfbebSnyanmisaka 
2372*437bfbebSnyanmisaka     if (hal_h265e_debug & HAL_H265E_DBG_WGT_REGS) {
2373*437bfbebSnyanmisaka         regs = (RK_U32*)&hw_regs->reg_osd;
2374*437bfbebSnyanmisaka         for (i = 0; i < sizeof(Vepu511OsdRegs) / 4; i++) {
2375*437bfbebSnyanmisaka             hal_h265e_dbg_wgt("set osd reg[%04x]: 0%08x\n", i * 4, regs[i]);
2376*437bfbebSnyanmisaka         }
2377*437bfbebSnyanmisaka     }
2378*437bfbebSnyanmisaka 
2379*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_OFFS, ctx->reg_cfg);
2380*437bfbebSnyanmisaka     if (ret) {
2381*437bfbebSnyanmisaka         mpp_err_f("set register offsets failed %d\n", ret);
2382*437bfbebSnyanmisaka         return ret;
2383*437bfbebSnyanmisaka     }
2384*437bfbebSnyanmisaka 
2385*437bfbebSnyanmisaka     cfg1.reg = &reg_out->hw_status;
2386*437bfbebSnyanmisaka     cfg1.size = sizeof(RK_U32);
2387*437bfbebSnyanmisaka     cfg1.offset = VEPU511_REG_BASE_HW_STATUS;
2388*437bfbebSnyanmisaka 
2389*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
2390*437bfbebSnyanmisaka     if (ret) {
2391*437bfbebSnyanmisaka         mpp_err_f("set register read failed %d\n", ret);
2392*437bfbebSnyanmisaka         return ret;
2393*437bfbebSnyanmisaka     }
2394*437bfbebSnyanmisaka 
2395*437bfbebSnyanmisaka     cfg1.reg = &reg_out->st;
2396*437bfbebSnyanmisaka     cfg1.size = sizeof(H265eV511StatusElem) - 4;
2397*437bfbebSnyanmisaka     cfg1.offset = VEPU511_STATUS_OFFSET;
2398*437bfbebSnyanmisaka 
2399*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
2400*437bfbebSnyanmisaka     if (ret) {
2401*437bfbebSnyanmisaka         mpp_err_f("set register read failed %d\n", ret);
2402*437bfbebSnyanmisaka         return ret;
2403*437bfbebSnyanmisaka     }
2404*437bfbebSnyanmisaka 
2405*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
2406*437bfbebSnyanmisaka     if (ret) {
2407*437bfbebSnyanmisaka         mpp_err_f("send cmd failed %d\n", ret);
2408*437bfbebSnyanmisaka     }
2409*437bfbebSnyanmisaka     hal_h265e_leave();
2410*437bfbebSnyanmisaka     return ret;
2411*437bfbebSnyanmisaka }
2412*437bfbebSnyanmisaka 
vepu511_h265_set_feedback(H265eV511HalContext * ctx,HalEncTask * enc_task)2413*437bfbebSnyanmisaka static MPP_RET vepu511_h265_set_feedback(H265eV511HalContext *ctx, HalEncTask *enc_task)
2414*437bfbebSnyanmisaka {
2415*437bfbebSnyanmisaka     EncRcTaskInfo *hal_rc_ret = (EncRcTaskInfo *)&enc_task->rc_task->info;
2416*437bfbebSnyanmisaka     Vepu511H265eFrmCfg *frm = ctx->frms[enc_task->flags.reg_idx];
2417*437bfbebSnyanmisaka     Vepu511H265Fbk  *fb = &frm->feedback;
2418*437bfbebSnyanmisaka     MppEncCfgSet    *cfg = ctx->cfg;
2419*437bfbebSnyanmisaka     RK_S32 mb8_num = MPP_ALIGN(cfg->prep.width, 8) * MPP_ALIGN(cfg->prep.height, 8) / 64;
2420*437bfbebSnyanmisaka     RK_S32 mb4_num = (mb8_num << 2);
2421*437bfbebSnyanmisaka     H265eV511StatusElem *elem = (H265eV511StatusElem *)frm->regs_ret;
2422*437bfbebSnyanmisaka     RK_U32 hw_status = elem->hw_status;
2423*437bfbebSnyanmisaka 
2424*437bfbebSnyanmisaka     hal_h265e_enter();
2425*437bfbebSnyanmisaka 
2426*437bfbebSnyanmisaka     fb->qp_sum += elem->st.qp_sum;
2427*437bfbebSnyanmisaka     fb->out_strm_size += elem->st.bs_lgth_l32;
2428*437bfbebSnyanmisaka     fb->sse_sum += (RK_S64)(elem->st.sse_h32 << 16) +
2429*437bfbebSnyanmisaka                    (elem->st.st_sse_bsl.sse_l16 & 0xffff);
2430*437bfbebSnyanmisaka 
2431*437bfbebSnyanmisaka     fb->hw_status = hw_status;
2432*437bfbebSnyanmisaka     hal_h265e_dbg_detail("hw_status: 0x%08x", hw_status);
2433*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_LINKTABLE_FINISH)
2434*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_LINKTABLE_FINISH");
2435*437bfbebSnyanmisaka 
2436*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_ONE_FRAME_FINISH)
2437*437bfbebSnyanmisaka         hal_h265e_dbg_detail("RKV_ENC_INT_ONE_FRAME_FINISH");
2438*437bfbebSnyanmisaka 
2439*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_ONE_SLICE_FINISH)
2440*437bfbebSnyanmisaka         hal_h265e_dbg_detail("RKV_ENC_INT_ONE_SLICE_FINISH");
2441*437bfbebSnyanmisaka 
2442*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_SAFE_CLEAR_FINISH)
2443*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_SAFE_CLEAR_FINISH");
2444*437bfbebSnyanmisaka 
2445*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BIT_STREAM_OVERFLOW)
2446*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_BIT_STREAM_OVERFLOW");
2447*437bfbebSnyanmisaka 
2448*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BUS_WRITE_FULL)
2449*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_BUS_WRITE_FULL");
2450*437bfbebSnyanmisaka 
2451*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BUS_WRITE_ERROR)
2452*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_BUS_WRITE_ERROR");
2453*437bfbebSnyanmisaka 
2454*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BUS_READ_ERROR)
2455*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_BUS_READ_ERROR");
2456*437bfbebSnyanmisaka 
2457*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_TIMEOUT_ERROR)
2458*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_TIMEOUT_ERROR");
2459*437bfbebSnyanmisaka 
2460*437bfbebSnyanmisaka     fb->st_mb_num += elem->st.st_bnum_b16.num_b16;
2461*437bfbebSnyanmisaka 
2462*437bfbebSnyanmisaka     fb->st_lvl64_inter_num += elem->st.st_pnum_p64.pnum_p64;
2463*437bfbebSnyanmisaka     fb->st_lvl32_inter_num += elem->st.st_pnum_p32.pnum_p32;
2464*437bfbebSnyanmisaka     fb->st_lvl32_intra_num += elem->st.st_pnum_i32.pnum_i32;
2465*437bfbebSnyanmisaka     fb->st_lvl16_inter_num += elem->st.st_pnum_p16.pnum_p16;
2466*437bfbebSnyanmisaka     fb->st_lvl16_intra_num += elem->st.st_pnum_i16.pnum_i16;
2467*437bfbebSnyanmisaka     fb->st_lvl8_inter_num  += elem->st.st_pnum_p8.pnum_p8;
2468*437bfbebSnyanmisaka     fb->st_lvl8_intra_num  += elem->st.st_pnum_i8.pnum_i8;
2469*437bfbebSnyanmisaka     fb->st_lvl4_intra_num  += elem->st.st_pnum_i4.pnum_i4;
2470*437bfbebSnyanmisaka 
2471*437bfbebSnyanmisaka     ctx->feedback.acc_cover16_num = elem->st.st_skin_sum1.num1_point_skin;
2472*437bfbebSnyanmisaka     ctx->feedback.acc_bndry16_num = elem->st.st_skin_sum2.num2_point_skin;
2473*437bfbebSnyanmisaka     ctx->feedback.acc_zero_mv = elem->st.acc_zero_mv;
2474*437bfbebSnyanmisaka     ctx->feedback.st_ctu_num = elem->st.st_bnum_b16.num_b16;
2475*437bfbebSnyanmisaka     memcpy(&fb->st_cu_num_qp[0], &elem->st.st_b8_qp, 52 * sizeof(RK_U32));
2476*437bfbebSnyanmisaka 
2477*437bfbebSnyanmisaka     if (mb4_num > 0)
2478*437bfbebSnyanmisaka         hal_rc_ret->iblk4_prop =  ((((fb->st_lvl4_intra_num + fb->st_lvl8_intra_num) << 2) +
2479*437bfbebSnyanmisaka                                     (fb->st_lvl16_intra_num << 4) +
2480*437bfbebSnyanmisaka                                     (fb->st_lvl32_intra_num << 6)) << 8) / mb4_num;
2481*437bfbebSnyanmisaka 
2482*437bfbebSnyanmisaka     if (mb8_num > 0) {
2483*437bfbebSnyanmisaka         hal_rc_ret->quality_real = fb->qp_sum / mb8_num;
2484*437bfbebSnyanmisaka     }
2485*437bfbebSnyanmisaka 
2486*437bfbebSnyanmisaka     hal_h265e_leave();
2487*437bfbebSnyanmisaka     return MPP_OK;
2488*437bfbebSnyanmisaka }
2489*437bfbebSnyanmisaka 
hal_h265e_vepu511_status_check(H265eV511RegSet * regs)2490*437bfbebSnyanmisaka static MPP_RET hal_h265e_vepu511_status_check(H265eV511RegSet *regs)
2491*437bfbebSnyanmisaka {
2492*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
2493*437bfbebSnyanmisaka 
2494*437bfbebSnyanmisaka     if (regs->reg_ctl.int_sta.lkt_node_done_sta)
2495*437bfbebSnyanmisaka         hal_h265e_dbg_detail("lkt_done finish");
2496*437bfbebSnyanmisaka 
2497*437bfbebSnyanmisaka     if (regs->reg_ctl.int_sta.enc_done_sta)
2498*437bfbebSnyanmisaka         hal_h265e_dbg_detail("enc_done finish");
2499*437bfbebSnyanmisaka 
2500*437bfbebSnyanmisaka     if (regs->reg_ctl.int_sta.vslc_done_sta)
2501*437bfbebSnyanmisaka         hal_h265e_dbg_detail("enc_slice finsh");
2502*437bfbebSnyanmisaka 
2503*437bfbebSnyanmisaka     if (regs->reg_ctl.int_sta.sclr_done_sta)
2504*437bfbebSnyanmisaka         hal_h265e_dbg_detail("safe clear finsh");
2505*437bfbebSnyanmisaka 
2506*437bfbebSnyanmisaka     if (regs->reg_ctl.int_sta.vbsf_oflw_sta) {
2507*437bfbebSnyanmisaka         mpp_err_f("bit stream overflow");
2508*437bfbebSnyanmisaka         ret = MPP_NOK;
2509*437bfbebSnyanmisaka     }
2510*437bfbebSnyanmisaka 
2511*437bfbebSnyanmisaka     if (regs->reg_ctl.int_sta.vbuf_lens_sta) {
2512*437bfbebSnyanmisaka         mpp_err_f("bus write full");
2513*437bfbebSnyanmisaka         ret = MPP_NOK;
2514*437bfbebSnyanmisaka     }
2515*437bfbebSnyanmisaka 
2516*437bfbebSnyanmisaka     if (regs->reg_ctl.int_sta.enc_err_sta) {
2517*437bfbebSnyanmisaka         mpp_err_f("bus error");
2518*437bfbebSnyanmisaka         ret = MPP_NOK;
2519*437bfbebSnyanmisaka     }
2520*437bfbebSnyanmisaka 
2521*437bfbebSnyanmisaka     if (regs->reg_ctl.int_sta.wdg_sta) {
2522*437bfbebSnyanmisaka         mpp_err_f("wdg timeout");
2523*437bfbebSnyanmisaka         ret = MPP_NOK;
2524*437bfbebSnyanmisaka     }
2525*437bfbebSnyanmisaka 
2526*437bfbebSnyanmisaka     return ret;
2527*437bfbebSnyanmisaka }
2528*437bfbebSnyanmisaka 
vepu511_h265e_update_tune_stat(H265eV511HalContext * ctx,HalEncTask * task)2529*437bfbebSnyanmisaka static void vepu511_h265e_update_tune_stat(H265eV511HalContext *ctx, HalEncTask *task)
2530*437bfbebSnyanmisaka {
2531*437bfbebSnyanmisaka     RK_S32 task_idx = task->flags.reg_idx;
2532*437bfbebSnyanmisaka     Vepu511H265eFrmCfg *frm = ctx->frms[task_idx];
2533*437bfbebSnyanmisaka     Vepu511H265Fbk *fb = &frm->feedback;
2534*437bfbebSnyanmisaka     H265eV511RegSet *regs = frm->regs_set;
2535*437bfbebSnyanmisaka     Vepu511RcRoi *s = &regs->reg_rc_roi;
2536*437bfbebSnyanmisaka     MppEncCfgSet *cfg = ctx->cfg;
2537*437bfbebSnyanmisaka     Vepu511Status *st = &frm->regs_ret->st;
2538*437bfbebSnyanmisaka     EncRcTaskInfo *info = (EncRcTaskInfo *)&task->rc_task->info;
2539*437bfbebSnyanmisaka     RK_U32 b16_num = MPP_ALIGN(cfg->prep.width, 16) * MPP_ALIGN(cfg->prep.height, 16) / 256;
2540*437bfbebSnyanmisaka     RK_U32 madi_cnt = 0, madp_cnt = 0;
2541*437bfbebSnyanmisaka 
2542*437bfbebSnyanmisaka     RK_U32 madi_th_cnt0 = st->st_madi_lt_num0.madi_th_lt_cnt0 +
2543*437bfbebSnyanmisaka                           st->st_madi_rt_num0.madi_th_rt_cnt0 +
2544*437bfbebSnyanmisaka                           st->st_madi_lb_num0.madi_th_lb_cnt0 +
2545*437bfbebSnyanmisaka                           st->st_madi_rb_num0.madi_th_rb_cnt0;
2546*437bfbebSnyanmisaka     RK_U32 madi_th_cnt1 = st->st_madi_lt_num0.madi_th_lt_cnt1 +
2547*437bfbebSnyanmisaka                           st->st_madi_rt_num0.madi_th_rt_cnt1 +
2548*437bfbebSnyanmisaka                           st->st_madi_lb_num0.madi_th_lb_cnt1 +
2549*437bfbebSnyanmisaka                           st->st_madi_rb_num0.madi_th_rb_cnt1;
2550*437bfbebSnyanmisaka     RK_U32 madi_th_cnt2 = st->st_madi_lt_num1.madi_th_lt_cnt2 +
2551*437bfbebSnyanmisaka                           st->st_madi_rt_num1.madi_th_rt_cnt2 +
2552*437bfbebSnyanmisaka                           st->st_madi_lb_num1.madi_th_lb_cnt2 +
2553*437bfbebSnyanmisaka                           st->st_madi_rb_num1.madi_th_rb_cnt2;
2554*437bfbebSnyanmisaka     RK_U32 madi_th_cnt3 = st->st_madi_lt_num1.madi_th_lt_cnt3 +
2555*437bfbebSnyanmisaka                           st->st_madi_rt_num1.madi_th_rt_cnt3 +
2556*437bfbebSnyanmisaka                           st->st_madi_lb_num1.madi_th_lb_cnt3 +
2557*437bfbebSnyanmisaka                           st->st_madi_rb_num1.madi_th_rb_cnt3;
2558*437bfbebSnyanmisaka     RK_U32 madp_th_cnt0 = st->st_madp_lt_num0.madp_th_lt_cnt0 +
2559*437bfbebSnyanmisaka                           st->st_madp_rt_num0.madp_th_rt_cnt0 +
2560*437bfbebSnyanmisaka                           st->st_madp_lb_num0.madp_th_lb_cnt0 +
2561*437bfbebSnyanmisaka                           st->st_madp_rb_num0.madp_th_rb_cnt0;
2562*437bfbebSnyanmisaka     RK_U32 madp_th_cnt1 = st->st_madp_lt_num0.madp_th_lt_cnt1 +
2563*437bfbebSnyanmisaka                           st->st_madp_rt_num0.madp_th_rt_cnt1 +
2564*437bfbebSnyanmisaka                           st->st_madp_lb_num0.madp_th_lb_cnt1 +
2565*437bfbebSnyanmisaka                           st->st_madp_rb_num0.madp_th_rb_cnt1;
2566*437bfbebSnyanmisaka     RK_U32 madp_th_cnt2 = st->st_madp_lt_num1.madp_th_lt_cnt2 +
2567*437bfbebSnyanmisaka                           st->st_madp_rt_num1.madp_th_rt_cnt2 +
2568*437bfbebSnyanmisaka                           st->st_madp_lb_num1.madp_th_lb_cnt2 +
2569*437bfbebSnyanmisaka                           st->st_madp_rb_num1.madp_th_rb_cnt2;
2570*437bfbebSnyanmisaka     RK_U32 madp_th_cnt3 = st->st_madp_lt_num1.madp_th_lt_cnt3 +
2571*437bfbebSnyanmisaka                           st->st_madp_rt_num1.madp_th_rt_cnt3 +
2572*437bfbebSnyanmisaka                           st->st_madp_lb_num1.madp_th_lb_cnt3 +
2573*437bfbebSnyanmisaka                           st->st_madp_rb_num1.madp_th_rb_cnt3;
2574*437bfbebSnyanmisaka 
2575*437bfbebSnyanmisaka     madi_cnt = (6 * madi_th_cnt3 + 5 * madi_th_cnt2 + 4 * madi_th_cnt1) >> 2;
2576*437bfbebSnyanmisaka     info->complex_level = (madi_cnt * 100 > 30 * b16_num) ? 2 :
2577*437bfbebSnyanmisaka                           (madi_cnt * 100 > 13 * b16_num) ? 1 : 0;
2578*437bfbebSnyanmisaka 
2579*437bfbebSnyanmisaka     {
2580*437bfbebSnyanmisaka         RK_U32 md_cnt = 0, motion_level = 0;
2581*437bfbebSnyanmisaka 
2582*437bfbebSnyanmisaka         if (ctx->smart_en)
2583*437bfbebSnyanmisaka             md_cnt = (12 * madp_th_cnt3 + 11 * madp_th_cnt2 + 8 * madp_th_cnt1) >> 2;
2584*437bfbebSnyanmisaka         else
2585*437bfbebSnyanmisaka             md_cnt = (24 * madp_th_cnt3 + 22 * madp_th_cnt2 + 17 * madp_th_cnt1) >> 2;
2586*437bfbebSnyanmisaka 
2587*437bfbebSnyanmisaka         if (md_cnt * 100 > 15 * b16_num)
2588*437bfbebSnyanmisaka             motion_level = 200;
2589*437bfbebSnyanmisaka         else if (md_cnt * 100 > 5 * b16_num)
2590*437bfbebSnyanmisaka             motion_level = 100;
2591*437bfbebSnyanmisaka         else if (md_cnt * 100 > (b16_num >> 2))
2592*437bfbebSnyanmisaka             motion_level = 1;
2593*437bfbebSnyanmisaka         else
2594*437bfbebSnyanmisaka             motion_level = 0;
2595*437bfbebSnyanmisaka         info->motion_level = motion_level;
2596*437bfbebSnyanmisaka     }
2597*437bfbebSnyanmisaka     hal_h265e_dbg_st("frame %d complex_level %d motion_level %d\n",
2598*437bfbebSnyanmisaka                      ctx->frame_num - 1, info->complex_level, info->motion_level);
2599*437bfbebSnyanmisaka 
2600*437bfbebSnyanmisaka     fb->st_madi = madi_th_cnt0 * s->madi_st_thd.madi_th0 +
2601*437bfbebSnyanmisaka                   madi_th_cnt1 * (s->madi_st_thd.madi_th0 + s->madi_st_thd.madi_th1) / 2 +
2602*437bfbebSnyanmisaka                   madi_th_cnt2 * (s->madi_st_thd.madi_th1 + s->madi_st_thd.madi_th2) / 2 +
2603*437bfbebSnyanmisaka                   madi_th_cnt3 * s->madi_st_thd.madi_th2;
2604*437bfbebSnyanmisaka 
2605*437bfbebSnyanmisaka     madi_cnt = madi_th_cnt0 + madi_th_cnt1 + madi_th_cnt2 + madi_th_cnt3;
2606*437bfbebSnyanmisaka     if (madi_cnt)
2607*437bfbebSnyanmisaka         fb->st_madi = fb->st_madi / madi_cnt;
2608*437bfbebSnyanmisaka 
2609*437bfbebSnyanmisaka     fb->st_madp = madp_th_cnt0 * s->madp_st_thd0.madp_th0 +
2610*437bfbebSnyanmisaka                   madp_th_cnt1 * (s->madp_st_thd0.madp_th0 + s->madp_st_thd0.madp_th1) / 2 +
2611*437bfbebSnyanmisaka                   madp_th_cnt2 * (s->madp_st_thd0.madp_th1 + s->madp_st_thd1.madp_th2) / 2 +
2612*437bfbebSnyanmisaka                   madp_th_cnt3 * s->madp_st_thd1.madp_th2;
2613*437bfbebSnyanmisaka 
2614*437bfbebSnyanmisaka     madp_cnt = madp_th_cnt0 + madp_th_cnt1 + madp_th_cnt2 + madp_th_cnt3;
2615*437bfbebSnyanmisaka     if (madp_cnt)
2616*437bfbebSnyanmisaka         fb->st_madp = fb->st_madp / madp_cnt;
2617*437bfbebSnyanmisaka 
2618*437bfbebSnyanmisaka     fb->st_mb_num += st->st_bnum_b16.num_b16;
2619*437bfbebSnyanmisaka     fb->frame_type = task->rc_task->frm.is_intra ? INTRA_FRAME : INTER_P_FRAME;
2620*437bfbebSnyanmisaka     info->bit_real = fb->out_strm_size * 8;
2621*437bfbebSnyanmisaka     info->madi = fb->st_madi;
2622*437bfbebSnyanmisaka     info->madp = fb->st_madp;
2623*437bfbebSnyanmisaka 
2624*437bfbebSnyanmisaka     hal_h265e_dbg_st("frame %d bit_real %d quality_real %d madi %d madp %d\n",
2625*437bfbebSnyanmisaka                      ctx->frame_num - 1, info->bit_real, info->quality_real, info->madi, info->madp);
2626*437bfbebSnyanmisaka }
2627*437bfbebSnyanmisaka 
2628*437bfbebSnyanmisaka //#define DUMP_DATA
hal_h265e_vepu511_wait(void * hal,HalEncTask * task)2629*437bfbebSnyanmisaka MPP_RET hal_h265e_vepu511_wait(void *hal, HalEncTask *task)
2630*437bfbebSnyanmisaka {
2631*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
2632*437bfbebSnyanmisaka     H265eV511HalContext *ctx = (H265eV511HalContext *)hal;
2633*437bfbebSnyanmisaka     HalEncTask *enc_task = task;
2634*437bfbebSnyanmisaka     MppPacket pkt = enc_task->packet;
2635*437bfbebSnyanmisaka     RK_U32 split_out = ctx->cfg->split.split_out;
2636*437bfbebSnyanmisaka     RK_S32 task_idx = task->flags.reg_idx;
2637*437bfbebSnyanmisaka     Vepu511H265eFrmCfg *frm = ctx->frms[task_idx];
2638*437bfbebSnyanmisaka     H265eV511RegSet *regs = frm->regs_set;
2639*437bfbebSnyanmisaka     RK_U32 offset = mpp_packet_get_length(pkt);
2640*437bfbebSnyanmisaka     RK_U32 seg_offset = offset;
2641*437bfbebSnyanmisaka     H265eVepu511Frame *reg_frm = &regs->reg_frm;
2642*437bfbebSnyanmisaka     RK_U32 type = reg_frm->synt_nal.nal_unit_type;
2643*437bfbebSnyanmisaka     H265eV511StatusElem *elem = (H265eV511StatusElem *)frm->regs_ret;
2644*437bfbebSnyanmisaka 
2645*437bfbebSnyanmisaka     hal_h265e_enter();
2646*437bfbebSnyanmisaka 
2647*437bfbebSnyanmisaka     if (enc_task->flags.err) {
2648*437bfbebSnyanmisaka         hal_h265e_err("enc_task->flags.err %08x, return early",
2649*437bfbebSnyanmisaka                       enc_task->flags.err);
2650*437bfbebSnyanmisaka         return MPP_NOK;
2651*437bfbebSnyanmisaka     }
2652*437bfbebSnyanmisaka 
2653*437bfbebSnyanmisaka     /* if pass1 mode, it will disable split mode and the split out need to be disable */
2654*437bfbebSnyanmisaka     if (enc_task->rc_task->frm.save_pass1)
2655*437bfbebSnyanmisaka         split_out = 0;
2656*437bfbebSnyanmisaka 
2657*437bfbebSnyanmisaka     if (split_out) {
2658*437bfbebSnyanmisaka         EncOutParam param;
2659*437bfbebSnyanmisaka         RK_U32 slice_len = 0;
2660*437bfbebSnyanmisaka         RK_U32 slice_last = 0;
2661*437bfbebSnyanmisaka         MppDevPollCfg *poll_cfg = (MppDevPollCfg *)((char *)ctx->poll_cfgs);
2662*437bfbebSnyanmisaka         param.task = task;
2663*437bfbebSnyanmisaka         param.base = mpp_packet_get_data(task->packet);
2664*437bfbebSnyanmisaka 
2665*437bfbebSnyanmisaka         do {
2666*437bfbebSnyanmisaka             RK_S32 i = 0;
2667*437bfbebSnyanmisaka             poll_cfg->poll_type = 0;
2668*437bfbebSnyanmisaka             poll_cfg->poll_ret  = 0;
2669*437bfbebSnyanmisaka             poll_cfg->count_max = ctx->poll_slice_max;
2670*437bfbebSnyanmisaka             poll_cfg->count_ret = 0;
2671*437bfbebSnyanmisaka 
2672*437bfbebSnyanmisaka             ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, poll_cfg);
2673*437bfbebSnyanmisaka             for (i = 0; i < poll_cfg->count_ret; i++) {
2674*437bfbebSnyanmisaka                 slice_last = poll_cfg->slice_info[i].last;
2675*437bfbebSnyanmisaka                 slice_len = poll_cfg->slice_info[i].length;
2676*437bfbebSnyanmisaka                 param.length = slice_len;
2677*437bfbebSnyanmisaka 
2678*437bfbebSnyanmisaka                 mpp_packet_add_segment_info(pkt, type, seg_offset, slice_len);
2679*437bfbebSnyanmisaka                 seg_offset += slice_len;
2680*437bfbebSnyanmisaka 
2681*437bfbebSnyanmisaka                 if (split_out & MPP_ENC_SPLIT_OUT_LOWDELAY) {
2682*437bfbebSnyanmisaka                     param.length = slice_len;
2683*437bfbebSnyanmisaka                     if (slice_last)
2684*437bfbebSnyanmisaka                         ctx->output_cb->cmd = ENC_OUTPUT_FINISH;
2685*437bfbebSnyanmisaka                     else
2686*437bfbebSnyanmisaka                         ctx->output_cb->cmd = ENC_OUTPUT_SLICE;
2687*437bfbebSnyanmisaka 
2688*437bfbebSnyanmisaka                     mpp_callback(ctx->output_cb, &param);
2689*437bfbebSnyanmisaka                 }
2690*437bfbebSnyanmisaka             }
2691*437bfbebSnyanmisaka         } while (!slice_last);
2692*437bfbebSnyanmisaka 
2693*437bfbebSnyanmisaka         ret = hal_h265e_vepu511_status_check(regs);
2694*437bfbebSnyanmisaka         if (!ret)
2695*437bfbebSnyanmisaka             task->hw_length += elem->st.bs_lgth_l32;
2696*437bfbebSnyanmisaka 
2697*437bfbebSnyanmisaka     } else {
2698*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
2699*437bfbebSnyanmisaka         if (ret) {
2700*437bfbebSnyanmisaka             mpp_err_f("poll cmd failed %d\n", ret);
2701*437bfbebSnyanmisaka             ret = MPP_ERR_VPUHW;
2702*437bfbebSnyanmisaka         } else {
2703*437bfbebSnyanmisaka             ret = hal_h265e_vepu511_status_check(regs);
2704*437bfbebSnyanmisaka             if (!ret)
2705*437bfbebSnyanmisaka                 task->hw_length += elem->st.bs_lgth_l32;
2706*437bfbebSnyanmisaka         }
2707*437bfbebSnyanmisaka         mpp_packet_add_segment_info(pkt, type, offset, elem->st.bs_lgth_l32);
2708*437bfbebSnyanmisaka     }
2709*437bfbebSnyanmisaka 
2710*437bfbebSnyanmisaka #ifdef DUMP_DATA
2711*437bfbebSnyanmisaka     vepu511_h265e_dump(ctx, task);
2712*437bfbebSnyanmisaka #endif
2713*437bfbebSnyanmisaka 
2714*437bfbebSnyanmisaka     if (ret)
2715*437bfbebSnyanmisaka         mpp_err_f("poll cmd failed %d status %d \n", ret, elem->hw_status);
2716*437bfbebSnyanmisaka 
2717*437bfbebSnyanmisaka     hal_h265e_leave();
2718*437bfbebSnyanmisaka     return ret;
2719*437bfbebSnyanmisaka }
2720*437bfbebSnyanmisaka 
hal_h265e_vepu511_get_task(void * hal,HalEncTask * task)2721*437bfbebSnyanmisaka MPP_RET hal_h265e_vepu511_get_task(void *hal, HalEncTask *task)
2722*437bfbebSnyanmisaka {
2723*437bfbebSnyanmisaka     H265eV511HalContext *ctx = (H265eV511HalContext *)hal;
2724*437bfbebSnyanmisaka     Vepu511H265eFrmCfg *frm_cfg = NULL;
2725*437bfbebSnyanmisaka     MppFrame frame = task->frame;
2726*437bfbebSnyanmisaka     EncFrmStatus  *frm_status = &task->rc_task->frm;
2727*437bfbebSnyanmisaka     RK_S32 task_idx = ctx->task_idx;
2728*437bfbebSnyanmisaka 
2729*437bfbebSnyanmisaka     hal_h265e_enter();
2730*437bfbebSnyanmisaka 
2731*437bfbebSnyanmisaka     ctx->syn = (H265eSyntax_new *)task->syntax.data;
2732*437bfbebSnyanmisaka     ctx->dpb = (H265eDpb*)ctx->syn->dpb;
2733*437bfbebSnyanmisaka     ctx->smart_en = (ctx->cfg->rc.rc_mode == MPP_ENC_RC_MODE_SMTRC);
2734*437bfbebSnyanmisaka     ctx->qpmap_en = ctx->cfg->tune.deblur_en;
2735*437bfbebSnyanmisaka 
2736*437bfbebSnyanmisaka     if (vepu511_h265_setup_hal_bufs(ctx)) {
2737*437bfbebSnyanmisaka         hal_h265e_err("vepu541_h265_allocate_buffers failed, free buffers and return\n");
2738*437bfbebSnyanmisaka         task->flags.err |= HAL_ENC_TASK_ERR_ALLOC;
2739*437bfbebSnyanmisaka         return MPP_ERR_MALLOC;
2740*437bfbebSnyanmisaka     }
2741*437bfbebSnyanmisaka 
2742*437bfbebSnyanmisaka     ctx->last_frame_type = ctx->frame_type;
2743*437bfbebSnyanmisaka     frm_cfg = ctx->frms[task_idx];
2744*437bfbebSnyanmisaka     ctx->frm = frm_cfg;
2745*437bfbebSnyanmisaka 
2746*437bfbebSnyanmisaka     if (frm_status->is_intra) {
2747*437bfbebSnyanmisaka         ctx->frame_type = INTRA_FRAME;
2748*437bfbebSnyanmisaka     } else {
2749*437bfbebSnyanmisaka         ctx->frame_type = INTER_P_FRAME;
2750*437bfbebSnyanmisaka     }
2751*437bfbebSnyanmisaka 
2752*437bfbebSnyanmisaka     if (!frm_status->reencode && mpp_frame_has_meta(task->frame)) {
2753*437bfbebSnyanmisaka         MppMeta meta = mpp_frame_get_meta(frame);
2754*437bfbebSnyanmisaka 
2755*437bfbebSnyanmisaka         mpp_meta_get_ptr(meta, KEY_ROI_DATA, (void **)&ctx->roi_data);
2756*437bfbebSnyanmisaka         mpp_meta_get_ptr_d(meta, KEY_OSD_DATA3, (void **)&ctx->osd_cfg.osd_data3, NULL);
2757*437bfbebSnyanmisaka     }
2758*437bfbebSnyanmisaka 
2759*437bfbebSnyanmisaka     task->flags.reg_idx = ctx->task_idx;
2760*437bfbebSnyanmisaka     ctx->ext_line_buf = ctx->ext_line_bufs[ctx->task_idx];
2761*437bfbebSnyanmisaka     frm_cfg->frame_count = ++ctx->frame_count;
2762*437bfbebSnyanmisaka 
2763*437bfbebSnyanmisaka     ctx->task_idx++;
2764*437bfbebSnyanmisaka     if (ctx->task_idx >= ctx->task_cnt)
2765*437bfbebSnyanmisaka         ctx->task_idx = 0;
2766*437bfbebSnyanmisaka 
2767*437bfbebSnyanmisaka     frm_cfg->hal_curr_idx = ctx->syn->sp.recon_pic.slot_idx;
2768*437bfbebSnyanmisaka     frm_cfg->hal_refr_idx = ctx->syn->sp.ref_pic.slot_idx;
2769*437bfbebSnyanmisaka 
2770*437bfbebSnyanmisaka     h265e_dpb_hal_start(ctx->dpb, frm_cfg->hal_curr_idx);
2771*437bfbebSnyanmisaka     h265e_dpb_hal_start(ctx->dpb, frm_cfg->hal_refr_idx);
2772*437bfbebSnyanmisaka 
2773*437bfbebSnyanmisaka     memset(&frm_cfg->feedback, 0, sizeof(Vepu511H265Fbk));
2774*437bfbebSnyanmisaka 
2775*437bfbebSnyanmisaka     hal_h265e_leave();
2776*437bfbebSnyanmisaka     return MPP_OK;
2777*437bfbebSnyanmisaka }
2778*437bfbebSnyanmisaka 
hal_h265e_vepu511_ret_task(void * hal,HalEncTask * task)2779*437bfbebSnyanmisaka MPP_RET hal_h265e_vepu511_ret_task(void *hal, HalEncTask *task)
2780*437bfbebSnyanmisaka {
2781*437bfbebSnyanmisaka     H265eV511HalContext *ctx = (H265eV511HalContext *)hal;
2782*437bfbebSnyanmisaka     HalEncTask *enc_task = task;
2783*437bfbebSnyanmisaka     RK_S32 task_idx = task->flags.reg_idx;
2784*437bfbebSnyanmisaka     Vepu511H265eFrmCfg *frm = ctx->frms[task_idx];
2785*437bfbebSnyanmisaka     Vepu511H265Fbk *fb = &frm->feedback;
2786*437bfbebSnyanmisaka     EncRcTaskInfo *rc_info = &task->rc_task->info;
2787*437bfbebSnyanmisaka     RK_U32 offset = mpp_packet_get_length(enc_task->packet);
2788*437bfbebSnyanmisaka 
2789*437bfbebSnyanmisaka     hal_h265e_enter();
2790*437bfbebSnyanmisaka 
2791*437bfbebSnyanmisaka     vepu511_h265_set_feedback(ctx, enc_task);
2792*437bfbebSnyanmisaka     mpp_buffer_sync_partial_begin(enc_task->output, offset, fb->out_strm_size);
2793*437bfbebSnyanmisaka     hal_h265e_amend_temporal_id(task, fb->out_strm_size);
2794*437bfbebSnyanmisaka 
2795*437bfbebSnyanmisaka     rc_info->sse = fb->sse_sum;
2796*437bfbebSnyanmisaka     rc_info->lvl64_inter_num = fb->st_lvl64_inter_num;
2797*437bfbebSnyanmisaka     rc_info->lvl32_inter_num = fb->st_lvl32_inter_num;
2798*437bfbebSnyanmisaka     rc_info->lvl16_inter_num = fb->st_lvl16_inter_num;
2799*437bfbebSnyanmisaka     rc_info->lvl8_inter_num  = fb->st_lvl8_inter_num;
2800*437bfbebSnyanmisaka     rc_info->lvl32_intra_num = fb->st_lvl32_intra_num;
2801*437bfbebSnyanmisaka     rc_info->lvl16_intra_num = fb->st_lvl16_intra_num;
2802*437bfbebSnyanmisaka     rc_info->lvl8_intra_num  = fb->st_lvl8_intra_num;
2803*437bfbebSnyanmisaka     rc_info->lvl4_intra_num  = fb->st_lvl4_intra_num;
2804*437bfbebSnyanmisaka 
2805*437bfbebSnyanmisaka     enc_task->hw_length = fb->out_strm_size;
2806*437bfbebSnyanmisaka     enc_task->length += fb->out_strm_size;
2807*437bfbebSnyanmisaka 
2808*437bfbebSnyanmisaka     h265e_dpb_hal_end(ctx->dpb, frm->hal_curr_idx);
2809*437bfbebSnyanmisaka     h265e_dpb_hal_end(ctx->dpb, frm->hal_refr_idx);
2810*437bfbebSnyanmisaka 
2811*437bfbebSnyanmisaka     vepu511_h265e_update_tune_stat(ctx, enc_task);
2812*437bfbebSnyanmisaka 
2813*437bfbebSnyanmisaka     hal_h265e_dbg_detail("output stream size %d\n", fb->out_strm_size);
2814*437bfbebSnyanmisaka     hal_h265e_leave();
2815*437bfbebSnyanmisaka     return MPP_OK;
2816*437bfbebSnyanmisaka }
2817*437bfbebSnyanmisaka 
2818*437bfbebSnyanmisaka const MppEncHalApi hal_h265e_vepu511 = {
2819*437bfbebSnyanmisaka     .name       = "hal_h265e_v511",
2820*437bfbebSnyanmisaka     .coding     = MPP_VIDEO_CodingHEVC,
2821*437bfbebSnyanmisaka     .ctx_size   = sizeof(H265eV511HalContext),
2822*437bfbebSnyanmisaka     .flag       = 0,
2823*437bfbebSnyanmisaka     .init       = hal_h265e_vepu511_init,
2824*437bfbebSnyanmisaka     .deinit     = hal_h265e_vepu511_deinit,
2825*437bfbebSnyanmisaka     .prepare    = hal_h265e_vepu511_prepare,
2826*437bfbebSnyanmisaka     .get_task   = hal_h265e_vepu511_get_task,
2827*437bfbebSnyanmisaka     .gen_regs   = hal_h265e_vepu511_gen_regs,
2828*437bfbebSnyanmisaka     .start      = hal_h265e_vepu511_start,
2829*437bfbebSnyanmisaka     .wait       = hal_h265e_vepu511_wait,
2830*437bfbebSnyanmisaka     .part_start = NULL,
2831*437bfbebSnyanmisaka     .part_wait  = NULL,
2832*437bfbebSnyanmisaka     .ret_task   = hal_h265e_vepu511_ret_task,
2833*437bfbebSnyanmisaka };
2834