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 = ®s->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 = ®s->reg_ctl;
697*437bfbebSnyanmisaka H265eVepu511Frame *reg_frm = ®s->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 = ®s->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 = ®s->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 = ®s->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*)®s->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 = ®s->reg_frm;
861*437bfbebSnyanmisaka Vepu511RcRoi *reg_klut = ®s->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 = ®s->reg_param;
996*437bfbebSnyanmisaka H265eVepu511Frame *reg_frm = ®s->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 = ®s->reg_ctl;
1150*437bfbebSnyanmisaka H265eVepu511Frame *reg_frm = ®s->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 = ®s->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 = ®s->reg_frm;
1262*437bfbebSnyanmisaka Vepu511RcRoi *reg_rc = ®s->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 = ®s->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 = ®s->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 = ®s->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 = ®s->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 = ®s->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 = ®s->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 = ®s->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 = ®->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 = ®->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 = ®->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 = ®->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 = ®->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 = ®->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 = ®s->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 = ®s->reg_frm;
2131*437bfbebSnyanmisaka H265eVepu511Param *reg_param = ®s->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(®_param->pprd_lamb_satd_0_51[0], lambda_tbl_pre_intra, sizeof(lambda_tbl_pre_intra));
2138*437bfbebSnyanmisaka } else {
2139*437bfbebSnyanmisaka memcpy(®_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(®_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 = ®s->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, ®s->reg_osd.osd_comb_cfg);
2217*437bfbebSnyanmisaka
2218*437bfbebSnyanmisaka if (ctx->roi_data)
2219*437bfbebSnyanmisaka vepu511_set_roi(®s->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 = ®_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 = ®_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 = ®s->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 = ®s->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, ¶m);
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