1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka * Copyright (c) 2024 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka */
5*437bfbebSnyanmisaka
6*437bfbebSnyanmisaka #define MODULE_TAG "hal_h265e_v510"
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_vepu510.h"
25*437bfbebSnyanmisaka #include "hal_h265e_vepu510_reg.h"
26*437bfbebSnyanmisaka #include "hal_h265e_stream_amend.h"
27*437bfbebSnyanmisaka
28*437bfbebSnyanmisaka #include "vepu5xx_common.h"
29*437bfbebSnyanmisaka #include "vepu510_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
34*437bfbebSnyanmisaka #define hal_h265e_err(fmt, ...) \
35*437bfbebSnyanmisaka do {\
36*437bfbebSnyanmisaka mpp_err_f(fmt, ## __VA_ARGS__);\
37*437bfbebSnyanmisaka } while (0)
38*437bfbebSnyanmisaka
39*437bfbebSnyanmisaka typedef struct Vepu510H265Fbk_t {
40*437bfbebSnyanmisaka RK_U32 hw_status; /* 0:corret, 1:error */
41*437bfbebSnyanmisaka RK_U32 frame_type;
42*437bfbebSnyanmisaka RK_U32 qp_sum;
43*437bfbebSnyanmisaka RK_U32 out_strm_size;
44*437bfbebSnyanmisaka RK_U32 out_hw_strm_size;
45*437bfbebSnyanmisaka RK_S64 sse_sum;
46*437bfbebSnyanmisaka RK_U32 st_lvl64_inter_num;
47*437bfbebSnyanmisaka RK_U32 st_lvl32_inter_num;
48*437bfbebSnyanmisaka RK_U32 st_lvl16_inter_num;
49*437bfbebSnyanmisaka RK_U32 st_lvl8_inter_num;
50*437bfbebSnyanmisaka RK_U32 st_lvl32_intra_num;
51*437bfbebSnyanmisaka RK_U32 st_lvl16_intra_num;
52*437bfbebSnyanmisaka RK_U32 st_lvl8_intra_num;
53*437bfbebSnyanmisaka RK_U32 st_lvl4_intra_num;
54*437bfbebSnyanmisaka RK_U32 st_cu_num_qp[52];
55*437bfbebSnyanmisaka RK_U32 st_madp;
56*437bfbebSnyanmisaka RK_U32 st_madi;
57*437bfbebSnyanmisaka RK_U32 st_mb_num;
58*437bfbebSnyanmisaka RK_U32 st_ctu_num;
59*437bfbebSnyanmisaka RK_U32 st_smear_cnt[5];
60*437bfbebSnyanmisaka RK_S32 reg_idx;
61*437bfbebSnyanmisaka RK_U32 acc_cover16_num;
62*437bfbebSnyanmisaka RK_U32 acc_bndry16_num;
63*437bfbebSnyanmisaka RK_U32 acc_zero_mv;
64*437bfbebSnyanmisaka RK_S8 tgt_sub_real_lvl[6];
65*437bfbebSnyanmisaka } Vepu510H265Fbk;
66*437bfbebSnyanmisaka
67*437bfbebSnyanmisaka typedef struct Vepu510H265eFrmCfg_t {
68*437bfbebSnyanmisaka RK_S32 frame_count;
69*437bfbebSnyanmisaka RK_S32 frame_type;
70*437bfbebSnyanmisaka
71*437bfbebSnyanmisaka /* dchs cfg on frame parallel */
72*437bfbebSnyanmisaka RK_S32 dchs_curr_idx;
73*437bfbebSnyanmisaka RK_S32 dchs_prev_idx;
74*437bfbebSnyanmisaka
75*437bfbebSnyanmisaka /* hal dpb management slot idx */
76*437bfbebSnyanmisaka RK_S32 hal_curr_idx;
77*437bfbebSnyanmisaka RK_S32 hal_refr_idx;
78*437bfbebSnyanmisaka
79*437bfbebSnyanmisaka /* regs cfg */
80*437bfbebSnyanmisaka H265eV510RegSet *regs_set;
81*437bfbebSnyanmisaka H265eV510StatusElem *regs_ret;
82*437bfbebSnyanmisaka
83*437bfbebSnyanmisaka /* hardware return info collection cfg */
84*437bfbebSnyanmisaka Vepu510H265Fbk feedback;
85*437bfbebSnyanmisaka
86*437bfbebSnyanmisaka /* osd cfg */
87*437bfbebSnyanmisaka Vepu5xxOsdCfg osd_cfg;
88*437bfbebSnyanmisaka void *roi_data;
89*437bfbebSnyanmisaka
90*437bfbebSnyanmisaka /* roi buffer for qpmap or gdr */
91*437bfbebSnyanmisaka MppBuffer roir_buf;
92*437bfbebSnyanmisaka RK_S32 roir_buf_size;
93*437bfbebSnyanmisaka void *roi_base_cfg_sw_buf;
94*437bfbebSnyanmisaka
95*437bfbebSnyanmisaka /* variable length cfg */
96*437bfbebSnyanmisaka MppDevRegOffCfgs *reg_cfg;
97*437bfbebSnyanmisaka } Vepu510H265eFrmCfg;
98*437bfbebSnyanmisaka
99*437bfbebSnyanmisaka typedef struct H265eV510HalContext_t {
100*437bfbebSnyanmisaka MppEncHalApi api;
101*437bfbebSnyanmisaka MppDev dev;
102*437bfbebSnyanmisaka void *regs;
103*437bfbebSnyanmisaka void *reg_out;
104*437bfbebSnyanmisaka Vepu510H265eFrmCfg *frms[MAX_FRAME_TASK_NUM];
105*437bfbebSnyanmisaka
106*437bfbebSnyanmisaka /* current used frame config */
107*437bfbebSnyanmisaka Vepu510H265eFrmCfg *frm;
108*437bfbebSnyanmisaka
109*437bfbebSnyanmisaka /* slice split poll cfg */
110*437bfbebSnyanmisaka RK_S32 poll_slice_max;
111*437bfbebSnyanmisaka RK_S32 poll_cfg_size;
112*437bfbebSnyanmisaka MppDevPollCfg *poll_cfgs;
113*437bfbebSnyanmisaka MppCbCtx *output_cb;
114*437bfbebSnyanmisaka
115*437bfbebSnyanmisaka /* @frame_cnt starts from ZERO */
116*437bfbebSnyanmisaka RK_S32 frame_count;
117*437bfbebSnyanmisaka
118*437bfbebSnyanmisaka /* frame parallel info */
119*437bfbebSnyanmisaka RK_S32 task_cnt;
120*437bfbebSnyanmisaka RK_S32 task_idx;
121*437bfbebSnyanmisaka
122*437bfbebSnyanmisaka /* dchs cfg */
123*437bfbebSnyanmisaka RK_S32 curr_idx;
124*437bfbebSnyanmisaka RK_S32 prev_idx;
125*437bfbebSnyanmisaka
126*437bfbebSnyanmisaka Vepu510H265Fbk feedback;
127*437bfbebSnyanmisaka Vepu510H265Fbk last_frame_fb;
128*437bfbebSnyanmisaka void *dump_files;
129*437bfbebSnyanmisaka RK_U32 frame_cnt_gen_ready;
130*437bfbebSnyanmisaka
131*437bfbebSnyanmisaka RK_S32 frame_type;
132*437bfbebSnyanmisaka RK_S32 last_frame_type;
133*437bfbebSnyanmisaka
134*437bfbebSnyanmisaka MppBufferGroup roi_grp;
135*437bfbebSnyanmisaka void *roi_data;
136*437bfbebSnyanmisaka MppEncCfgSet *cfg;
137*437bfbebSnyanmisaka MppDevRegOffCfgs *reg_cfg;
138*437bfbebSnyanmisaka H265eSyntax_new *syn;
139*437bfbebSnyanmisaka H265eDpb *dpb;
140*437bfbebSnyanmisaka
141*437bfbebSnyanmisaka RK_U32 enc_mode;
142*437bfbebSnyanmisaka RK_U32 frame_size;
143*437bfbebSnyanmisaka RK_S32 max_buf_cnt;
144*437bfbebSnyanmisaka RK_S32 hdr_status;
145*437bfbebSnyanmisaka void *input_fmt;
146*437bfbebSnyanmisaka RK_U8 *src_buf;
147*437bfbebSnyanmisaka RK_U8 *dst_buf;
148*437bfbebSnyanmisaka RK_S32 buf_size;
149*437bfbebSnyanmisaka RK_U32 frame_num;
150*437bfbebSnyanmisaka HalBufs dpb_bufs;
151*437bfbebSnyanmisaka RK_S32 fbc_header_len;
152*437bfbebSnyanmisaka RK_U32 title_num;
153*437bfbebSnyanmisaka
154*437bfbebSnyanmisaka RK_S32 qpmap_en;
155*437bfbebSnyanmisaka RK_S32 smart_en;
156*437bfbebSnyanmisaka RK_S32 sp_enc_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 } H265eV510HalContext;
167*437bfbebSnyanmisaka
168*437bfbebSnyanmisaka #include "hal_h265e_vepu510_tune.c"
169*437bfbebSnyanmisaka
170*437bfbebSnyanmisaka static RK_S32 atf_b32_skip_thd2[4] = {15, 15, 15, 200};
171*437bfbebSnyanmisaka static RK_S32 atf_b32_skip_thd3[4] = {72, 72, 72, 1000};
172*437bfbebSnyanmisaka static RK_S32 atf_b32_skip_wgt0[4] = {16, 20, 20, 16};
173*437bfbebSnyanmisaka static RK_S32 atf_b32_skip_wgt3[4] = {16, 16, 16, 17};
174*437bfbebSnyanmisaka static RK_S32 atf_b16_skip_thd2[4] = {15, 15, 15, 200};
175*437bfbebSnyanmisaka static RK_S32 atf_b16_skip_thd3[4] = {25, 25, 25, 1000};
176*437bfbebSnyanmisaka static RK_S32 atf_b16_skip_wgt0[4] = {16, 20, 20, 16};
177*437bfbebSnyanmisaka static RK_S32 atf_b16_skip_wgt3[4] = {16, 16, 16, 17};
178*437bfbebSnyanmisaka static RK_S32 atf_b32_intra_thd0[4] = {20, 20, 20, 24};
179*437bfbebSnyanmisaka static RK_S32 atf_b32_intra_thd1[4] = {40, 40, 40, 48};
180*437bfbebSnyanmisaka static RK_S32 atf_b32_intra_thd2[4] = {60, 72, 72, 96};
181*437bfbebSnyanmisaka static RK_S32 atf_b32_intra_wgt0[4] = {16, 22, 27, 28};
182*437bfbebSnyanmisaka static RK_S32 atf_b32_intra_wgt1[4] = {16, 20, 25, 26};
183*437bfbebSnyanmisaka static RK_S32 atf_b32_intra_wgt2[4] = {16, 18, 20, 24};
184*437bfbebSnyanmisaka static RK_S32 atf_b16_intra_thd0[4] = {20, 20, 20, 24};
185*437bfbebSnyanmisaka static RK_S32 atf_b16_intra_thd1[4] = {40, 40, 40, 48};
186*437bfbebSnyanmisaka static RK_S32 atf_b16_intra_thd2[4] = {60, 72, 72, 96};
187*437bfbebSnyanmisaka static RK_S32 atf_b16_intra_wgt0[4] = {16, 22, 27, 28};
188*437bfbebSnyanmisaka static RK_S32 atf_b16_intra_wgt1[4] = {16, 20, 25, 26};
189*437bfbebSnyanmisaka static RK_S32 atf_b16_intra_wgt2[4] = {16, 18, 20, 24};
190*437bfbebSnyanmisaka
191*437bfbebSnyanmisaka static RK_S32 smear_qp_strength[8] = {4, 6, 7, 7, 3, 5, 7, 7};
192*437bfbebSnyanmisaka static RK_S32 smear_strength[8] = {1, 1, 1, 1, 1, 1, 1, 1};
193*437bfbebSnyanmisaka static RK_S32 smear_common_intra_r_dep0[8] = {224, 224, 200, 200, 224, 224, 200, 200};
194*437bfbebSnyanmisaka static RK_S32 smear_common_intra_r_dep1[8] = {224, 224, 180, 200, 224, 224, 180, 200};
195*437bfbebSnyanmisaka static RK_S32 smear_bndry_intra_r_dep0[8] = {240, 240, 240, 240, 240, 240, 240, 240};
196*437bfbebSnyanmisaka static RK_S32 smear_bndry_intra_r_dep1[8] = {240, 240, 240, 240, 240, 240, 240, 240};
197*437bfbebSnyanmisaka static RK_S32 smear_thre_madp_stc_cover0[8] = {20, 22, 22, 22, 20, 22, 22, 30};
198*437bfbebSnyanmisaka static RK_S32 smear_thre_madp_stc_cover1[8] = {20, 22, 22, 22, 20, 22, 22, 30};
199*437bfbebSnyanmisaka static RK_S32 smear_thre_madp_mov_cover0[8] = {10, 9, 9, 9, 10, 9, 9, 6};
200*437bfbebSnyanmisaka static RK_S32 smear_thre_madp_mov_cover1[8] = {10, 9, 9, 9, 10, 9, 9, 6};
201*437bfbebSnyanmisaka
202*437bfbebSnyanmisaka static RK_S32 smear_flag_cover_thd0[8] = {12, 13, 13, 13, 12, 13, 13, 17};
203*437bfbebSnyanmisaka static RK_S32 smear_flag_cover_thd1[8] = {61, 70, 70, 70, 61, 70, 70, 90};
204*437bfbebSnyanmisaka static RK_S32 smear_flag_bndry_thd0[8] = {12, 12, 12, 12, 12, 12, 12, 12};
205*437bfbebSnyanmisaka static RK_S32 smear_flag_bndry_thd1[8] = {73, 73, 73, 73, 73, 73, 73, 73};
206*437bfbebSnyanmisaka
207*437bfbebSnyanmisaka static RK_S32 smear_flag_cover_wgt[3] = {1, 0, -3};
208*437bfbebSnyanmisaka static RK_S32 smear_flag_cover_intra_wgt0[3] = { -12, 0, 12};
209*437bfbebSnyanmisaka static RK_S32 smear_flag_cover_intra_wgt1[3] = { -12, 0, 12};
210*437bfbebSnyanmisaka static RK_S32 smear_flag_bndry_wgt[3] = {0, 0, 0};
211*437bfbebSnyanmisaka static RK_S32 smear_flag_bndry_intra_wgt0[3] = { -12, 0, 12};
212*437bfbebSnyanmisaka static RK_S32 smear_flag_bndry_intra_wgt1[3] = { -12, 0, 12};
213*437bfbebSnyanmisaka
214*437bfbebSnyanmisaka static RK_U32 rdo_lambda_table_I[60] = {
215*437bfbebSnyanmisaka 0x00000012, 0x00000017,
216*437bfbebSnyanmisaka 0x0000001d, 0x00000024, 0x0000002e, 0x0000003a,
217*437bfbebSnyanmisaka 0x00000049, 0x0000005c, 0x00000074, 0x00000092,
218*437bfbebSnyanmisaka 0x000000b8, 0x000000e8, 0x00000124, 0x00000170,
219*437bfbebSnyanmisaka 0x000001cf, 0x00000248, 0x000002df, 0x0000039f,
220*437bfbebSnyanmisaka 0x0000048f, 0x000005bf, 0x0000073d, 0x0000091f,
221*437bfbebSnyanmisaka 0x00000b7e, 0x00000e7a, 0x0000123d, 0x000016fb,
222*437bfbebSnyanmisaka 0x00001cf4, 0x0000247b, 0x00002df6, 0x000039e9,
223*437bfbebSnyanmisaka 0x000048f6, 0x00005bed, 0x000073d1, 0x000091ec,
224*437bfbebSnyanmisaka 0x0000b7d9, 0x0000e7a2, 0x000123d7, 0x00016fb2,
225*437bfbebSnyanmisaka 0x0001cf44, 0x000247ae, 0x0002df64, 0x00039e89,
226*437bfbebSnyanmisaka 0x00048f5c, 0x0005bec8, 0x00073d12, 0x00091eb8,
227*437bfbebSnyanmisaka 0x000b7d90, 0x000e7a23, 0x00123d71, 0x0016fb20,
228*437bfbebSnyanmisaka 0x001cf446, 0x00247ae1, 0x002df640, 0x0039e88c,
229*437bfbebSnyanmisaka 0x0048f5c3, 0x005bec81, 0x0073d119, 0x0091eb85,
230*437bfbebSnyanmisaka 0x00b7d902, 0x00e7a232
231*437bfbebSnyanmisaka };
232*437bfbebSnyanmisaka
233*437bfbebSnyanmisaka static RK_U32 rdo_lambda_table_P[60] = {
234*437bfbebSnyanmisaka 0x0000002c, 0x00000038, 0x00000044, 0x00000058,
235*437bfbebSnyanmisaka 0x00000070, 0x00000089, 0x000000b0, 0x000000e0,
236*437bfbebSnyanmisaka 0x00000112, 0x00000160, 0x000001c0, 0x00000224,
237*437bfbebSnyanmisaka 0x000002c0, 0x00000380, 0x00000448, 0x00000580,
238*437bfbebSnyanmisaka 0x00000700, 0x00000890, 0x00000b00, 0x00000e00,
239*437bfbebSnyanmisaka 0x00001120, 0x00001600, 0x00001c00, 0x00002240,
240*437bfbebSnyanmisaka 0x00002c00, 0x00003800, 0x00004480, 0x00005800,
241*437bfbebSnyanmisaka 0x00007000, 0x00008900, 0x0000b000, 0x0000e000,
242*437bfbebSnyanmisaka 0x00011200, 0x00016000, 0x0001c000, 0x00022400,
243*437bfbebSnyanmisaka 0x0002c000, 0x00038000, 0x00044800, 0x00058000,
244*437bfbebSnyanmisaka 0x00070000, 0x00089000, 0x000b0000, 0x000e0000,
245*437bfbebSnyanmisaka 0x00112000, 0x00160000, 0x001c0000, 0x00224000,
246*437bfbebSnyanmisaka 0x002c0000, 0x00380000, 0x00448000, 0x00580000,
247*437bfbebSnyanmisaka 0x00700000, 0x00890000, 0x00b00000, 0x00e00000,
248*437bfbebSnyanmisaka 0x01120000, 0x01600000, 0x01c00000, 0x02240000,
249*437bfbebSnyanmisaka };
250*437bfbebSnyanmisaka
251*437bfbebSnyanmisaka static RK_U8 vepu510_h265_cqm_intra8[64] = {
252*437bfbebSnyanmisaka 16, 16, 16, 16, 17, 18, 21, 24,
253*437bfbebSnyanmisaka 16, 16, 16, 16, 17, 19, 22, 25,
254*437bfbebSnyanmisaka 16, 16, 17, 18, 20, 22, 25, 29,
255*437bfbebSnyanmisaka 16, 16, 18, 21, 24, 27, 31, 36,
256*437bfbebSnyanmisaka 17, 17, 20, 24, 30, 35, 41, 47,
257*437bfbebSnyanmisaka 18, 19, 22, 27, 35, 44, 54, 65,
258*437bfbebSnyanmisaka 21, 22, 25, 31, 41, 54, 70, 88,
259*437bfbebSnyanmisaka 24, 25, 29, 36, 47, 65, 88, 115
260*437bfbebSnyanmisaka };
261*437bfbebSnyanmisaka
262*437bfbebSnyanmisaka static RK_U8 vepu510_h265_cqm_inter8[64] = {
263*437bfbebSnyanmisaka 16, 16, 16, 16, 17, 18, 20, 24,
264*437bfbebSnyanmisaka 16, 16, 16, 17, 18, 20, 24, 25,
265*437bfbebSnyanmisaka 16, 16, 17, 18, 20, 24, 25, 28,
266*437bfbebSnyanmisaka 16, 17, 18, 20, 24, 25, 28, 33,
267*437bfbebSnyanmisaka 17, 18, 20, 24, 25, 28, 33, 41,
268*437bfbebSnyanmisaka 18, 20, 24, 25, 28, 33, 41, 54,
269*437bfbebSnyanmisaka 20, 24, 25, 28, 33, 41, 54, 71,
270*437bfbebSnyanmisaka 24, 25, 28, 33, 41, 54, 71, 91
271*437bfbebSnyanmisaka };
272*437bfbebSnyanmisaka
setup_ext_line_bufs(H265eV510HalContext * ctx)273*437bfbebSnyanmisaka static void setup_ext_line_bufs(H265eV510HalContext *ctx)
274*437bfbebSnyanmisaka {
275*437bfbebSnyanmisaka RK_S32 i;
276*437bfbebSnyanmisaka
277*437bfbebSnyanmisaka for (i = 0; i < ctx->task_cnt; i++) {
278*437bfbebSnyanmisaka if (ctx->ext_line_bufs[i])
279*437bfbebSnyanmisaka continue;
280*437bfbebSnyanmisaka
281*437bfbebSnyanmisaka mpp_buffer_get(ctx->ext_line_buf_grp, &ctx->ext_line_bufs[i],
282*437bfbebSnyanmisaka ctx->ext_line_buf_size);
283*437bfbebSnyanmisaka }
284*437bfbebSnyanmisaka }
285*437bfbebSnyanmisaka
clear_ext_line_bufs(H265eV510HalContext * ctx)286*437bfbebSnyanmisaka static void clear_ext_line_bufs(H265eV510HalContext *ctx)
287*437bfbebSnyanmisaka {
288*437bfbebSnyanmisaka RK_S32 i;
289*437bfbebSnyanmisaka
290*437bfbebSnyanmisaka for (i = 0; i < ctx->task_cnt; i++) {
291*437bfbebSnyanmisaka if (ctx->ext_line_bufs[i]) {
292*437bfbebSnyanmisaka mpp_buffer_put(ctx->ext_line_bufs[i]);
293*437bfbebSnyanmisaka ctx->ext_line_bufs[i] = NULL;
294*437bfbebSnyanmisaka }
295*437bfbebSnyanmisaka }
296*437bfbebSnyanmisaka }
297*437bfbebSnyanmisaka
vepu510_h265_setup_hal_bufs(H265eV510HalContext * ctx)298*437bfbebSnyanmisaka static MPP_RET vepu510_h265_setup_hal_bufs(H265eV510HalContext *ctx)
299*437bfbebSnyanmisaka {
300*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
301*437bfbebSnyanmisaka VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
302*437bfbebSnyanmisaka RK_U32 frame_size;
303*437bfbebSnyanmisaka VepuFmt input_fmt = VEPU5xx_FMT_YUV420P;
304*437bfbebSnyanmisaka RK_S32 mb_wd64, mb_h64;
305*437bfbebSnyanmisaka MppEncRefCfg ref_cfg = ctx->cfg->ref_cfg;
306*437bfbebSnyanmisaka MppEncPrepCfg *prep = &ctx->cfg->prep;
307*437bfbebSnyanmisaka RK_S32 old_max_cnt = ctx->max_buf_cnt;
308*437bfbebSnyanmisaka RK_S32 new_max_cnt = 4;
309*437bfbebSnyanmisaka RK_S32 alignment = 32;
310*437bfbebSnyanmisaka RK_S32 aligned_w = MPP_ALIGN(prep->width, alignment);
311*437bfbebSnyanmisaka
312*437bfbebSnyanmisaka hal_h265e_enter();
313*437bfbebSnyanmisaka
314*437bfbebSnyanmisaka mb_wd64 = (prep->width + 63) / 64;
315*437bfbebSnyanmisaka mb_h64 = (prep->height + 63) / 64 + 1;
316*437bfbebSnyanmisaka
317*437bfbebSnyanmisaka frame_size = MPP_ALIGN(prep->width, 16) * MPP_ALIGN(prep->height, 16);
318*437bfbebSnyanmisaka vepu5xx_set_fmt(fmt, ctx->cfg->prep.format);
319*437bfbebSnyanmisaka input_fmt = (VepuFmt)fmt->format;
320*437bfbebSnyanmisaka switch (input_fmt) {
321*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV400:
322*437bfbebSnyanmisaka break;
323*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420P:
324*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420SP: {
325*437bfbebSnyanmisaka frame_size = frame_size * 3 / 2;
326*437bfbebSnyanmisaka } break;
327*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422P:
328*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422SP:
329*437bfbebSnyanmisaka case VEPU5xx_FMT_YUYV422:
330*437bfbebSnyanmisaka case VEPU5xx_FMT_UYVY422:
331*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR565: {
332*437bfbebSnyanmisaka frame_size *= 2;
333*437bfbebSnyanmisaka } break;
334*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR888:
335*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV444SP:
336*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV444P: {
337*437bfbebSnyanmisaka frame_size *= 3;
338*437bfbebSnyanmisaka } break;
339*437bfbebSnyanmisaka case VEPU5xx_FMT_BGRA8888: {
340*437bfbebSnyanmisaka frame_size *= 4;
341*437bfbebSnyanmisaka } break;
342*437bfbebSnyanmisaka default: {
343*437bfbebSnyanmisaka hal_h265e_err("invalid src color space: %d\n", input_fmt);
344*437bfbebSnyanmisaka return MPP_NOK;
345*437bfbebSnyanmisaka }
346*437bfbebSnyanmisaka }
347*437bfbebSnyanmisaka
348*437bfbebSnyanmisaka if (ref_cfg) {
349*437bfbebSnyanmisaka MppEncCpbInfo *info = mpp_enc_ref_cfg_get_cpb_info(ref_cfg);
350*437bfbebSnyanmisaka new_max_cnt = MPP_MAX(new_max_cnt, info->dpb_size + 1);
351*437bfbebSnyanmisaka }
352*437bfbebSnyanmisaka
353*437bfbebSnyanmisaka if (aligned_w > SZ_4K) {
354*437bfbebSnyanmisaka RK_S32 ctu_w = (aligned_w + 31) / 32;
355*437bfbebSnyanmisaka RK_S32 ext_line_buf_size = ((ctu_w - 113) * 27 + 15) / 16 * 16 * 16;
356*437bfbebSnyanmisaka
357*437bfbebSnyanmisaka if (NULL == ctx->ext_line_buf_grp)
358*437bfbebSnyanmisaka mpp_buffer_group_get_internal(&ctx->ext_line_buf_grp, MPP_BUFFER_TYPE_ION);
359*437bfbebSnyanmisaka else if (ext_line_buf_size != ctx->ext_line_buf_size) {
360*437bfbebSnyanmisaka clear_ext_line_bufs(ctx);
361*437bfbebSnyanmisaka mpp_buffer_group_clear(ctx->ext_line_buf_grp);
362*437bfbebSnyanmisaka }
363*437bfbebSnyanmisaka
364*437bfbebSnyanmisaka mpp_assert(ctx->ext_line_buf_grp);
365*437bfbebSnyanmisaka setup_ext_line_bufs(ctx);
366*437bfbebSnyanmisaka ctx->ext_line_buf_size = ext_line_buf_size;
367*437bfbebSnyanmisaka } else {
368*437bfbebSnyanmisaka clear_ext_line_bufs(ctx);
369*437bfbebSnyanmisaka
370*437bfbebSnyanmisaka if (ctx->ext_line_buf_grp) {
371*437bfbebSnyanmisaka mpp_buffer_group_clear(ctx->ext_line_buf_grp);
372*437bfbebSnyanmisaka mpp_buffer_group_put(ctx->ext_line_buf_grp);
373*437bfbebSnyanmisaka ctx->ext_line_buf_grp = NULL;
374*437bfbebSnyanmisaka }
375*437bfbebSnyanmisaka ctx->ext_line_buf_size = 0;
376*437bfbebSnyanmisaka }
377*437bfbebSnyanmisaka
378*437bfbebSnyanmisaka if (frame_size > ctx->frame_size || new_max_cnt > old_max_cnt) {
379*437bfbebSnyanmisaka size_t size[4] = {0};
380*437bfbebSnyanmisaka RK_S32 ctu_w = (prep->width + 31) / 32;
381*437bfbebSnyanmisaka RK_S32 ctu_h = (prep->height + 31) / 32;
382*437bfbebSnyanmisaka
383*437bfbebSnyanmisaka hal_bufs_deinit(ctx->dpb_bufs);
384*437bfbebSnyanmisaka hal_bufs_init(&ctx->dpb_bufs);
385*437bfbebSnyanmisaka
386*437bfbebSnyanmisaka ctx->fbc_header_len = MPP_ALIGN(((mb_wd64 * mb_h64) << 6), SZ_8K);
387*437bfbebSnyanmisaka size[0] = ctx->fbc_header_len + ((mb_wd64 * mb_h64) << 12) * 3 / 2; //fbc_h + fbc_b
388*437bfbebSnyanmisaka size[1] = (mb_wd64 * mb_h64 << 8);
389*437bfbebSnyanmisaka size[2] = MPP_ALIGN(mb_wd64 * mb_h64 * 16 * 4, 256) * 16;
390*437bfbebSnyanmisaka /* smear bufs */
391*437bfbebSnyanmisaka size[3] = MPP_ALIGN(ctu_w, 16) * MPP_ALIGN(ctu_h, 16);
392*437bfbebSnyanmisaka new_max_cnt = MPP_MAX(new_max_cnt, old_max_cnt);
393*437bfbebSnyanmisaka
394*437bfbebSnyanmisaka hal_h265e_dbg_detail("frame size %d -> %d max count %d -> %d\n",
395*437bfbebSnyanmisaka ctx->frame_size, frame_size, old_max_cnt, new_max_cnt);
396*437bfbebSnyanmisaka
397*437bfbebSnyanmisaka hal_bufs_setup(ctx->dpb_bufs, new_max_cnt, MPP_ARRAY_ELEMS(size), size);
398*437bfbebSnyanmisaka
399*437bfbebSnyanmisaka ctx->frame_size = frame_size;
400*437bfbebSnyanmisaka ctx->max_buf_cnt = new_max_cnt;
401*437bfbebSnyanmisaka }
402*437bfbebSnyanmisaka hal_h265e_leave();
403*437bfbebSnyanmisaka return ret;
404*437bfbebSnyanmisaka }
405*437bfbebSnyanmisaka
vepu510_h265_set_atr_regs(H265eVepu510Sqi * reg_sqi,MppEncSceneMode sm,int atr_level)406*437bfbebSnyanmisaka static void vepu510_h265_set_atr_regs(H265eVepu510Sqi *reg_sqi, MppEncSceneMode sm, int atr_level)
407*437bfbebSnyanmisaka {
408*437bfbebSnyanmisaka // atr_level 0~3
409*437bfbebSnyanmisaka // 0 close
410*437bfbebSnyanmisaka // 1 weak
411*437bfbebSnyanmisaka // 2 medium
412*437bfbebSnyanmisaka // 3 strong
413*437bfbebSnyanmisaka H265eVepu510Sqi *reg = reg_sqi;
414*437bfbebSnyanmisaka (void)sm;
415*437bfbebSnyanmisaka if (atr_level == 0) {
416*437bfbebSnyanmisaka reg->block_opt_cfg.block_en = 0;
417*437bfbebSnyanmisaka reg->cmplx_opt_cfg.cmplx_en = 0;
418*437bfbebSnyanmisaka reg->line_opt_cfg.line_en = 0;
419*437bfbebSnyanmisaka } else {
420*437bfbebSnyanmisaka reg->block_opt_cfg.block_en = 0;
421*437bfbebSnyanmisaka reg->cmplx_opt_cfg.cmplx_en = 0;
422*437bfbebSnyanmisaka reg->line_opt_cfg.line_en = 1;
423*437bfbebSnyanmisaka }
424*437bfbebSnyanmisaka
425*437bfbebSnyanmisaka if (atr_level == 3) {
426*437bfbebSnyanmisaka reg->block_opt_cfg.block_thre_cst_best_mad = 1000;
427*437bfbebSnyanmisaka reg->block_opt_cfg.block_thre_cst_best_grdn_blk = 39;
428*437bfbebSnyanmisaka reg->block_opt_cfg.thre_num_grdnt_point_cmplx = 3;
429*437bfbebSnyanmisaka reg->block_opt_cfg.block_delta_qp_flag = 3;
430*437bfbebSnyanmisaka
431*437bfbebSnyanmisaka reg->cmplx_opt_cfg.cmplx_thre_cst_best_mad_dep0 = 4000;
432*437bfbebSnyanmisaka reg->cmplx_opt_cfg.cmplx_thre_cst_best_mad_dep1 = 2000;
433*437bfbebSnyanmisaka
434*437bfbebSnyanmisaka reg->cmplx_bst_mad_thd.cmplx_thre_cst_best_mad_dep2 = 200;
435*437bfbebSnyanmisaka reg->cmplx_bst_mad_thd.cmplx_thre_cst_best_grdn_blk_dep0 = 977;
436*437bfbebSnyanmisaka
437*437bfbebSnyanmisaka reg->cmplx_bst_grdn_thd.cmplx_thre_cst_best_grdn_blk_dep1 = 0;
438*437bfbebSnyanmisaka reg->cmplx_bst_grdn_thd.cmplx_thre_cst_best_grdn_blk_dep2 = 488;
439*437bfbebSnyanmisaka
440*437bfbebSnyanmisaka reg->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep0 = 4;
441*437bfbebSnyanmisaka reg->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep1 = 30;//20
442*437bfbebSnyanmisaka reg->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep2 = 30;//20
443*437bfbebSnyanmisaka reg->line_opt_cfg.line_thre_ratio_best_grdn_blk_dep0 = 7;//7
444*437bfbebSnyanmisaka reg->line_opt_cfg.line_thre_ratio_best_grdn_blk_dep1 = 6;//8
445*437bfbebSnyanmisaka
446*437bfbebSnyanmisaka reg->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep0 = 1;
447*437bfbebSnyanmisaka reg->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep1 = 50;
448*437bfbebSnyanmisaka reg->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep2 = 50;
449*437bfbebSnyanmisaka
450*437bfbebSnyanmisaka reg->subj_opt_dqp0.line_thre_qp = 20;
451*437bfbebSnyanmisaka reg->subj_opt_dqp0.block_strength = 4;
452*437bfbebSnyanmisaka reg->subj_opt_dqp0.block_thre_qp = 30;
453*437bfbebSnyanmisaka reg->subj_opt_dqp0.cmplx_strength = 4;
454*437bfbebSnyanmisaka reg->subj_opt_dqp0.cmplx_thre_qp = 34;
455*437bfbebSnyanmisaka reg->subj_opt_dqp0.cmplx_thre_max_grdn_blk = 32;
456*437bfbebSnyanmisaka } else if (atr_level == 2) {
457*437bfbebSnyanmisaka reg->block_opt_cfg.block_thre_cst_best_mad = 1000;
458*437bfbebSnyanmisaka reg->block_opt_cfg.block_thre_cst_best_grdn_blk = 39;
459*437bfbebSnyanmisaka reg->block_opt_cfg.thre_num_grdnt_point_cmplx = 3;
460*437bfbebSnyanmisaka reg->block_opt_cfg.block_delta_qp_flag = 3;
461*437bfbebSnyanmisaka
462*437bfbebSnyanmisaka reg->cmplx_opt_cfg.cmplx_thre_cst_best_mad_dep0 = 4000;
463*437bfbebSnyanmisaka reg->cmplx_opt_cfg.cmplx_thre_cst_best_mad_dep1 = 2000;
464*437bfbebSnyanmisaka
465*437bfbebSnyanmisaka reg->cmplx_bst_mad_thd.cmplx_thre_cst_best_mad_dep2 = 200;
466*437bfbebSnyanmisaka reg->cmplx_bst_mad_thd.cmplx_thre_cst_best_grdn_blk_dep0 = 977;
467*437bfbebSnyanmisaka
468*437bfbebSnyanmisaka reg->cmplx_bst_grdn_thd.cmplx_thre_cst_best_grdn_blk_dep1 = 0;
469*437bfbebSnyanmisaka reg->cmplx_bst_grdn_thd.cmplx_thre_cst_best_grdn_blk_dep2 = 488;
470*437bfbebSnyanmisaka
471*437bfbebSnyanmisaka reg->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep0 = 3;
472*437bfbebSnyanmisaka reg->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep1 = 20;
473*437bfbebSnyanmisaka reg->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep2 = 20;
474*437bfbebSnyanmisaka reg->line_opt_cfg.line_thre_ratio_best_grdn_blk_dep0 = 7;
475*437bfbebSnyanmisaka reg->line_opt_cfg.line_thre_ratio_best_grdn_blk_dep1 = 8;
476*437bfbebSnyanmisaka
477*437bfbebSnyanmisaka reg->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep0 = 1;
478*437bfbebSnyanmisaka reg->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep1 = 60;
479*437bfbebSnyanmisaka reg->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep2 = 60;
480*437bfbebSnyanmisaka
481*437bfbebSnyanmisaka reg->subj_opt_dqp0.line_thre_qp = 25;
482*437bfbebSnyanmisaka reg->subj_opt_dqp0.block_strength = 4;
483*437bfbebSnyanmisaka reg->subj_opt_dqp0.block_thre_qp = 30;
484*437bfbebSnyanmisaka reg->subj_opt_dqp0.cmplx_strength = 4;
485*437bfbebSnyanmisaka reg->subj_opt_dqp0.cmplx_thre_qp = 34;
486*437bfbebSnyanmisaka reg->subj_opt_dqp0.cmplx_thre_max_grdn_blk = 32;
487*437bfbebSnyanmisaka } else {
488*437bfbebSnyanmisaka reg->block_opt_cfg.block_thre_cst_best_mad = 1000;
489*437bfbebSnyanmisaka reg->block_opt_cfg.block_thre_cst_best_grdn_blk = 39;
490*437bfbebSnyanmisaka reg->block_opt_cfg.thre_num_grdnt_point_cmplx = 3;
491*437bfbebSnyanmisaka reg->block_opt_cfg.block_delta_qp_flag = 3;
492*437bfbebSnyanmisaka
493*437bfbebSnyanmisaka reg->cmplx_opt_cfg.cmplx_thre_cst_best_mad_dep0 = 6000;
494*437bfbebSnyanmisaka reg->cmplx_opt_cfg.cmplx_thre_cst_best_mad_dep1 = 2000;
495*437bfbebSnyanmisaka
496*437bfbebSnyanmisaka reg->cmplx_bst_mad_thd.cmplx_thre_cst_best_mad_dep2 = 300;
497*437bfbebSnyanmisaka reg->cmplx_bst_mad_thd.cmplx_thre_cst_best_grdn_blk_dep0 = 1280;
498*437bfbebSnyanmisaka
499*437bfbebSnyanmisaka reg->cmplx_bst_grdn_thd.cmplx_thre_cst_best_grdn_blk_dep1 = 0;
500*437bfbebSnyanmisaka reg->cmplx_bst_grdn_thd.cmplx_thre_cst_best_grdn_blk_dep2 = 512;
501*437bfbebSnyanmisaka
502*437bfbebSnyanmisaka reg->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep0 = 3;
503*437bfbebSnyanmisaka reg->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep1 = 20;
504*437bfbebSnyanmisaka reg->line_opt_cfg.line_thre_min_cst_best_grdn_blk_dep2 = 20;
505*437bfbebSnyanmisaka reg->line_opt_cfg.line_thre_ratio_best_grdn_blk_dep0 = 7;
506*437bfbebSnyanmisaka reg->line_opt_cfg.line_thre_ratio_best_grdn_blk_dep1 = 8;
507*437bfbebSnyanmisaka
508*437bfbebSnyanmisaka reg->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep0 = 1;
509*437bfbebSnyanmisaka reg->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep1 = 70;
510*437bfbebSnyanmisaka reg->line_cst_bst_grdn.line_thre_max_cst_best_grdn_blk_dep2 = 70;
511*437bfbebSnyanmisaka
512*437bfbebSnyanmisaka reg->subj_opt_dqp0.line_thre_qp = 30;
513*437bfbebSnyanmisaka reg->subj_opt_dqp0.block_strength = 4;
514*437bfbebSnyanmisaka reg->subj_opt_dqp0.block_thre_qp = 30;
515*437bfbebSnyanmisaka reg->subj_opt_dqp0.cmplx_strength = 4;
516*437bfbebSnyanmisaka reg->subj_opt_dqp0.cmplx_thre_qp = 34;
517*437bfbebSnyanmisaka reg->subj_opt_dqp0.cmplx_thre_max_grdn_blk = 32;
518*437bfbebSnyanmisaka }
519*437bfbebSnyanmisaka }
520*437bfbebSnyanmisaka
vepu510_h265_set_anti_blur_regs(H265eVepu510Sqi * reg_sqi,int anti_blur_level)521*437bfbebSnyanmisaka static void vepu510_h265_set_anti_blur_regs(H265eVepu510Sqi *reg_sqi, int anti_blur_level)
522*437bfbebSnyanmisaka {
523*437bfbebSnyanmisaka H265eVepu510Sqi *reg = reg_sqi;
524*437bfbebSnyanmisaka if (anti_blur_level >= 1)
525*437bfbebSnyanmisaka reg->subj_anti_blur_thd.anti_blur_en = 1;
526*437bfbebSnyanmisaka else
527*437bfbebSnyanmisaka reg->subj_anti_blur_thd.anti_blur_en = 0;
528*437bfbebSnyanmisaka reg->subj_anti_blur_thd.blur_low_madi_thd = 5;
529*437bfbebSnyanmisaka reg->subj_anti_blur_thd.blur_high_madi_thd = 27;
530*437bfbebSnyanmisaka reg->subj_anti_blur_thd.blur_low_cnt_thd = 0;
531*437bfbebSnyanmisaka reg->subj_anti_blur_thd.blur_hight_cnt_thd = 0;
532*437bfbebSnyanmisaka reg->subj_anti_blur_thd.blur_sum_cnt_thd = 5;
533*437bfbebSnyanmisaka
534*437bfbebSnyanmisaka reg->subj_anti_blur_sao.blur_motion_thd = 32;
535*437bfbebSnyanmisaka reg->subj_anti_blur_sao.sao_ofst_thd_eo_luma = 2;
536*437bfbebSnyanmisaka reg->subj_anti_blur_sao.sao_ofst_thd_bo_luma = 4;
537*437bfbebSnyanmisaka reg->subj_anti_blur_sao.sao_ofst_thd_eo_chroma = 2;
538*437bfbebSnyanmisaka reg->subj_anti_blur_sao.sao_ofst_thd_bo_chroma = 4;
539*437bfbebSnyanmisaka }
540*437bfbebSnyanmisaka
vepu510_h265_set_anti_stripe_regs(H265eVepu510Sqi * reg_sqi,int atl_level)541*437bfbebSnyanmisaka static void vepu510_h265_set_anti_stripe_regs(H265eVepu510Sqi *reg_sqi, int atl_level)
542*437bfbebSnyanmisaka {
543*437bfbebSnyanmisaka pre_cst_par* pre_i32 = (pre_cst_par*)®_sqi->preintra32_cst;
544*437bfbebSnyanmisaka pre_cst_par* pre_i16 = (pre_cst_par*)®_sqi->preintra16_cst;
545*437bfbebSnyanmisaka
546*437bfbebSnyanmisaka pre_i32->cst_madi_thd0.madi_thd0 = 5;
547*437bfbebSnyanmisaka pre_i32->cst_madi_thd0.madi_thd1 = 15;
548*437bfbebSnyanmisaka pre_i32->cst_madi_thd0.madi_thd2 = 5;
549*437bfbebSnyanmisaka pre_i32->cst_madi_thd0.madi_thd3 = 3;
550*437bfbebSnyanmisaka pre_i32->cst_madi_thd1.madi_thd4 = 3;
551*437bfbebSnyanmisaka pre_i32->cst_madi_thd1.madi_thd5 = 6;
552*437bfbebSnyanmisaka pre_i32->cst_madi_thd1.madi_thd6 = 7;
553*437bfbebSnyanmisaka pre_i32->cst_madi_thd1.madi_thd7 = 5;
554*437bfbebSnyanmisaka pre_i32->cst_madi_thd2.madi_thd8 = 10;
555*437bfbebSnyanmisaka pre_i32->cst_madi_thd2.madi_thd9 = 5;
556*437bfbebSnyanmisaka pre_i32->cst_madi_thd2.madi_thd10 = 7;
557*437bfbebSnyanmisaka pre_i32->cst_madi_thd2.madi_thd11 = 5;
558*437bfbebSnyanmisaka pre_i32->cst_madi_thd3.madi_thd12 = 7;
559*437bfbebSnyanmisaka pre_i32->cst_madi_thd3.madi_thd13 = 5;
560*437bfbebSnyanmisaka pre_i32->cst_madi_thd3.mode_th = 5;
561*437bfbebSnyanmisaka
562*437bfbebSnyanmisaka pre_i32->cst_wgt0.wgt0 = 20;
563*437bfbebSnyanmisaka pre_i32->cst_wgt0.wgt1 = 18;
564*437bfbebSnyanmisaka pre_i32->cst_wgt0.wgt2 = 19;
565*437bfbebSnyanmisaka pre_i32->cst_wgt0.wgt3 = 18;
566*437bfbebSnyanmisaka pre_i32->cst_wgt1.wgt4 = 12;
567*437bfbebSnyanmisaka pre_i32->cst_wgt1.wgt5 = 6;
568*437bfbebSnyanmisaka pre_i32->cst_wgt1.wgt6 = 13;
569*437bfbebSnyanmisaka pre_i32->cst_wgt1.wgt7 = 9;
570*437bfbebSnyanmisaka pre_i32->cst_wgt2.wgt8 = 12;
571*437bfbebSnyanmisaka pre_i32->cst_wgt2.wgt9 = 6;
572*437bfbebSnyanmisaka pre_i32->cst_wgt2.wgt10 = 13;
573*437bfbebSnyanmisaka pre_i32->cst_wgt2.wgt11 = 9;
574*437bfbebSnyanmisaka pre_i32->cst_wgt3.wgt12 = 18;
575*437bfbebSnyanmisaka pre_i32->cst_wgt3.wgt13 = 17;
576*437bfbebSnyanmisaka pre_i32->cst_wgt3.wgt14 = 17;
577*437bfbebSnyanmisaka
578*437bfbebSnyanmisaka pre_i16->cst_madi_thd0.madi_thd0 = 5;
579*437bfbebSnyanmisaka pre_i16->cst_madi_thd0.madi_thd1 = 15;
580*437bfbebSnyanmisaka pre_i16->cst_madi_thd0.madi_thd2 = 5;
581*437bfbebSnyanmisaka pre_i16->cst_madi_thd0.madi_thd3 = 3;
582*437bfbebSnyanmisaka pre_i16->cst_madi_thd1.madi_thd4 = 3;
583*437bfbebSnyanmisaka pre_i16->cst_madi_thd1.madi_thd5 = 6;
584*437bfbebSnyanmisaka pre_i16->cst_madi_thd1.madi_thd6 = 7;
585*437bfbebSnyanmisaka pre_i16->cst_madi_thd1.madi_thd7 = 5;
586*437bfbebSnyanmisaka pre_i16->cst_madi_thd2.madi_thd8 = 10;
587*437bfbebSnyanmisaka pre_i16->cst_madi_thd2.madi_thd9 = 5;
588*437bfbebSnyanmisaka pre_i16->cst_madi_thd2.madi_thd10 = 7;
589*437bfbebSnyanmisaka pre_i16->cst_madi_thd2.madi_thd11 = 5;
590*437bfbebSnyanmisaka pre_i16->cst_madi_thd3.madi_thd12 = 7;
591*437bfbebSnyanmisaka pre_i16->cst_madi_thd3.madi_thd13 = 5;
592*437bfbebSnyanmisaka pre_i16->cst_madi_thd3.mode_th = 5;
593*437bfbebSnyanmisaka
594*437bfbebSnyanmisaka pre_i16->cst_wgt0.wgt0 = 20;
595*437bfbebSnyanmisaka pre_i16->cst_wgt0.wgt1 = 18;
596*437bfbebSnyanmisaka pre_i16->cst_wgt0.wgt2 = 19;
597*437bfbebSnyanmisaka pre_i16->cst_wgt0.wgt3 = 18;
598*437bfbebSnyanmisaka pre_i16->cst_wgt1.wgt4 = 12;
599*437bfbebSnyanmisaka pre_i16->cst_wgt1.wgt5 = 6;
600*437bfbebSnyanmisaka pre_i16->cst_wgt1.wgt6 = 13;
601*437bfbebSnyanmisaka pre_i16->cst_wgt1.wgt7 = 9;
602*437bfbebSnyanmisaka pre_i16->cst_wgt2.wgt8 = 12;
603*437bfbebSnyanmisaka pre_i16->cst_wgt2.wgt9 = 6;
604*437bfbebSnyanmisaka pre_i16->cst_wgt2.wgt10 = 13;
605*437bfbebSnyanmisaka pre_i16->cst_wgt2.wgt11 = 9;
606*437bfbebSnyanmisaka pre_i16->cst_wgt3.wgt12 = 18;
607*437bfbebSnyanmisaka pre_i16->cst_wgt3.wgt13 = 17;
608*437bfbebSnyanmisaka pre_i16->cst_wgt3.wgt14 = 17;
609*437bfbebSnyanmisaka
610*437bfbebSnyanmisaka pre_i32->cst_madi_thd3.qp_thd = 28;
611*437bfbebSnyanmisaka pre_i32->cst_wgt3.lambda_mv_bit_0 = 5; // lv32
612*437bfbebSnyanmisaka pre_i32->cst_wgt3.lambda_mv_bit_1 = 4; // lv16
613*437bfbebSnyanmisaka pre_i16->cst_wgt3.lambda_mv_bit_0 = 4; // lv8
614*437bfbebSnyanmisaka pre_i16->cst_wgt3.lambda_mv_bit_1 = 3; // lv4
615*437bfbebSnyanmisaka if (atl_level >= 1)
616*437bfbebSnyanmisaka pre_i32->cst_wgt3.anti_strp_e = 1;
617*437bfbebSnyanmisaka else
618*437bfbebSnyanmisaka pre_i32->cst_wgt3.anti_strp_e = 0;
619*437bfbebSnyanmisaka }
620*437bfbebSnyanmisaka
vepu510_h265_rdo_cfg(H265eV510HalContext * ctx,H265eVepu510Sqi * reg,MppEncSceneMode sm)621*437bfbebSnyanmisaka static void vepu510_h265_rdo_cfg(H265eV510HalContext *ctx, H265eVepu510Sqi *reg, MppEncSceneMode sm)
622*437bfbebSnyanmisaka {
623*437bfbebSnyanmisaka reg->subj_opt_cfg.subj_opt_en = 1;
624*437bfbebSnyanmisaka reg->subj_opt_cfg.subj_opt_strength = 3;
625*437bfbebSnyanmisaka reg->subj_opt_cfg.aq_subj_en = (sm == MPP_ENC_SCENE_MODE_IPC);
626*437bfbebSnyanmisaka reg->subj_opt_cfg.aq_subj_strength = 4;
627*437bfbebSnyanmisaka
628*437bfbebSnyanmisaka /* skin_opt */
629*437bfbebSnyanmisaka reg->skin_opt_cfg.skin_en = 0;
630*437bfbebSnyanmisaka reg->skin_opt_cfg.skin_strength = 3;
631*437bfbebSnyanmisaka reg->skin_opt_cfg.thre_uvsqr16_skin = 128;
632*437bfbebSnyanmisaka reg->skin_opt_cfg.skin_thre_cst_best_mad = 1000;
633*437bfbebSnyanmisaka reg->skin_opt_cfg.skin_thre_cst_best_grdn_blk = 98;
634*437bfbebSnyanmisaka reg->skin_opt_cfg.frame_skin_ratio = 3;
635*437bfbebSnyanmisaka reg->skin_chrm_thd.thre_sum_mad_intra = 3;
636*437bfbebSnyanmisaka reg->skin_chrm_thd.thre_sum_grdn_blk_intra = 3;
637*437bfbebSnyanmisaka reg->skin_chrm_thd.vld_thre_skin_v = 7;
638*437bfbebSnyanmisaka reg->skin_chrm_thd.thre_min_skin_u = 107;
639*437bfbebSnyanmisaka reg->skin_chrm_thd.thre_max_skin_u = 129;
640*437bfbebSnyanmisaka reg->skin_chrm_thd.thre_min_skin_v = 135;
641*437bfbebSnyanmisaka reg->subj_opt_dqp1.skin_thre_qp = 31;
642*437bfbebSnyanmisaka
643*437bfbebSnyanmisaka /* 0x00002100 reg2112 */
644*437bfbebSnyanmisaka reg->cudecis_thd0.base_thre_rough_mad32_intra = 9;
645*437bfbebSnyanmisaka reg->cudecis_thd0.delta0_thre_rough_mad32_intra = 10;
646*437bfbebSnyanmisaka reg->cudecis_thd0.delta1_thre_rough_mad32_intra = 55;
647*437bfbebSnyanmisaka reg->cudecis_thd0.delta2_thre_rough_mad32_intra = 55;
648*437bfbebSnyanmisaka reg->cudecis_thd0.delta3_thre_rough_mad32_intra = 66;
649*437bfbebSnyanmisaka reg->cudecis_thd0.delta4_thre_rough_mad32_intra_low5 = 2;
650*437bfbebSnyanmisaka
651*437bfbebSnyanmisaka /* 0x00002104 reg2113 */
652*437bfbebSnyanmisaka reg->cudecis_thd1.delta4_thre_rough_mad32_intra_high2 = 2;
653*437bfbebSnyanmisaka reg->cudecis_thd1.delta5_thre_rough_mad32_intra = 74;
654*437bfbebSnyanmisaka reg->cudecis_thd1.delta6_thre_rough_mad32_intra = 106;
655*437bfbebSnyanmisaka reg->cudecis_thd1.base_thre_fine_mad32_intra = 8;
656*437bfbebSnyanmisaka reg->cudecis_thd1.delta0_thre_fine_mad32_intra = 0;
657*437bfbebSnyanmisaka reg->cudecis_thd1.delta1_thre_fine_mad32_intra = 13;
658*437bfbebSnyanmisaka reg->cudecis_thd1.delta2_thre_fine_mad32_intra_low3 = 6;
659*437bfbebSnyanmisaka
660*437bfbebSnyanmisaka /* 0x00002108 reg2114 */
661*437bfbebSnyanmisaka reg->cudecis_thd2.delta2_thre_fine_mad32_intra_high2 = 1;
662*437bfbebSnyanmisaka reg->cudecis_thd2.delta3_thre_fine_mad32_intra = 17;
663*437bfbebSnyanmisaka reg->cudecis_thd2.delta4_thre_fine_mad32_intra = 23;
664*437bfbebSnyanmisaka reg->cudecis_thd2.delta5_thre_fine_mad32_intra = 50;
665*437bfbebSnyanmisaka reg->cudecis_thd2.delta6_thre_fine_mad32_intra = 54;
666*437bfbebSnyanmisaka reg->cudecis_thd2.base_thre_str_edge_mad32_intra = 6;
667*437bfbebSnyanmisaka reg->cudecis_thd2.delta0_thre_str_edge_mad32_intra = 0;
668*437bfbebSnyanmisaka reg->cudecis_thd2.delta1_thre_str_edge_mad32_intra = 0;
669*437bfbebSnyanmisaka
670*437bfbebSnyanmisaka /* 0x0000210c reg2115 */
671*437bfbebSnyanmisaka reg->cudecis_thd3.delta2_thre_str_edge_mad32_intra = 3;
672*437bfbebSnyanmisaka reg->cudecis_thd3.delta3_thre_str_edge_mad32_intra = 8;
673*437bfbebSnyanmisaka reg->cudecis_thd3.base_thre_str_edge_bgrad32_intra = 25;
674*437bfbebSnyanmisaka reg->cudecis_thd3.delta0_thre_str_edge_bgrad32_intra = 0;
675*437bfbebSnyanmisaka reg->cudecis_thd3.delta1_thre_str_edge_bgrad32_intra = 0;
676*437bfbebSnyanmisaka reg->cudecis_thd3.delta2_thre_str_edge_bgrad32_intra = 7;
677*437bfbebSnyanmisaka reg->cudecis_thd3.delta3_thre_str_edge_bgrad32_intra = 19;
678*437bfbebSnyanmisaka reg->cudecis_thd3.base_thre_mad16_intra = 6;
679*437bfbebSnyanmisaka reg->cudecis_thd3.delta0_thre_mad16_intra = 0;
680*437bfbebSnyanmisaka
681*437bfbebSnyanmisaka /* 0x00002110 reg2116 */
682*437bfbebSnyanmisaka reg->cudecis_thd4.delta1_thre_mad16_intra = 3;
683*437bfbebSnyanmisaka reg->cudecis_thd4.delta2_thre_mad16_intra = 3;
684*437bfbebSnyanmisaka reg->cudecis_thd4.delta3_thre_mad16_intra = 24;
685*437bfbebSnyanmisaka reg->cudecis_thd4.delta4_thre_mad16_intra = 28;
686*437bfbebSnyanmisaka reg->cudecis_thd4.delta5_thre_mad16_intra = 40;
687*437bfbebSnyanmisaka reg->cudecis_thd4.delta6_thre_mad16_intra = 52;
688*437bfbebSnyanmisaka reg->cudecis_thd4.delta0_thre_mad16_ratio_intra = 7;
689*437bfbebSnyanmisaka
690*437bfbebSnyanmisaka /* 0x00002114 reg2117 */
691*437bfbebSnyanmisaka reg->cudecis_thd5.delta1_thre_mad16_ratio_intra = 7;
692*437bfbebSnyanmisaka reg->cudecis_thd5.delta2_thre_mad16_ratio_intra = 2;
693*437bfbebSnyanmisaka reg->cudecis_thd5.delta3_thre_mad16_ratio_intra = 2;
694*437bfbebSnyanmisaka reg->cudecis_thd5.delta4_thre_mad16_ratio_intra = 0;
695*437bfbebSnyanmisaka reg->cudecis_thd5.delta5_thre_mad16_ratio_intra = 0;
696*437bfbebSnyanmisaka reg->cudecis_thd5.delta6_thre_mad16_ratio_intra = 0;
697*437bfbebSnyanmisaka reg->cudecis_thd5.delta7_thre_mad16_ratio_intra = 4;
698*437bfbebSnyanmisaka reg->cudecis_thd5.delta0_thre_rough_bgrad32_intra = 1;
699*437bfbebSnyanmisaka reg->cudecis_thd5.delta1_thre_rough_bgrad32_intra = 5;
700*437bfbebSnyanmisaka reg->cudecis_thd5.delta2_thre_rough_bgrad32_intra_low4 = 8;
701*437bfbebSnyanmisaka
702*437bfbebSnyanmisaka /* 0x00002118 reg2118 */
703*437bfbebSnyanmisaka reg->cudecis_thd6.delta2_thre_rough_bgrad32_intra_high2 = 2;
704*437bfbebSnyanmisaka reg->cudecis_thd6.delta3_thre_rough_bgrad32_intra = 540;
705*437bfbebSnyanmisaka reg->cudecis_thd6.delta4_thre_rough_bgrad32_intra = 692;
706*437bfbebSnyanmisaka reg->cudecis_thd6.delta5_thre_rough_bgrad32_intra_low10 = 866;
707*437bfbebSnyanmisaka
708*437bfbebSnyanmisaka /* 0x0000211c reg2119 */
709*437bfbebSnyanmisaka reg->cudecis_thd7.delta5_thre_rough_bgrad32_intra_high1 = 1;
710*437bfbebSnyanmisaka reg->cudecis_thd7.delta6_thre_rough_bgrad32_intra = 3286;
711*437bfbebSnyanmisaka reg->cudecis_thd7.delta7_thre_rough_bgrad32_intra = 6620;
712*437bfbebSnyanmisaka reg->cudecis_thd7.delta0_thre_bgrad16_ratio_intra = 8;
713*437bfbebSnyanmisaka reg->cudecis_thd7.delta1_thre_bgrad16_ratio_intra_low2 = 3;
714*437bfbebSnyanmisaka
715*437bfbebSnyanmisaka /* 0x00002120 reg2120 */
716*437bfbebSnyanmisaka reg->cudecis_thdt8.delta1_thre_bgrad16_ratio_intra_high2 = 2;
717*437bfbebSnyanmisaka reg->cudecis_thdt8.delta2_thre_bgrad16_ratio_intra = 15;
718*437bfbebSnyanmisaka reg->cudecis_thdt8.delta3_thre_bgrad16_ratio_intra = 15;
719*437bfbebSnyanmisaka reg->cudecis_thdt8.delta4_thre_bgrad16_ratio_intra = 13;
720*437bfbebSnyanmisaka reg->cudecis_thdt8.delta5_thre_bgrad16_ratio_intra = 13;
721*437bfbebSnyanmisaka reg->cudecis_thdt8.delta6_thre_bgrad16_ratio_intra = 7;
722*437bfbebSnyanmisaka reg->cudecis_thdt8.delta7_thre_bgrad16_ratio_intra = 15;
723*437bfbebSnyanmisaka reg->cudecis_thdt8.delta0_thre_fme_ratio_inter = 4;
724*437bfbebSnyanmisaka reg->cudecis_thdt8.delta1_thre_fme_ratio_inter = 4;
725*437bfbebSnyanmisaka
726*437bfbebSnyanmisaka /* 0x00002124 reg2121 */
727*437bfbebSnyanmisaka reg->cudecis_thd9.delta2_thre_fme_ratio_inter = 3;
728*437bfbebSnyanmisaka reg->cudecis_thd9.delta3_thre_fme_ratio_inter = 2;
729*437bfbebSnyanmisaka reg->cudecis_thd9.delta4_thre_fme_ratio_inter = 0;
730*437bfbebSnyanmisaka reg->cudecis_thd9.delta5_thre_fme_ratio_inter = 0;
731*437bfbebSnyanmisaka reg->cudecis_thd9.delta6_thre_fme_ratio_inter = 0;
732*437bfbebSnyanmisaka reg->cudecis_thd9.delta7_thre_fme_ratio_inter = 0;
733*437bfbebSnyanmisaka reg->cudecis_thd9.base_thre_fme32_inter = 4;
734*437bfbebSnyanmisaka reg->cudecis_thd9.delta0_thre_fme32_inter = 2;
735*437bfbebSnyanmisaka reg->cudecis_thd9.delta1_thre_fme32_inter = 7;
736*437bfbebSnyanmisaka reg->cudecis_thd9.delta2_thre_fme32_inter = 12;
737*437bfbebSnyanmisaka
738*437bfbebSnyanmisaka /* 0x00002128 reg2122 */
739*437bfbebSnyanmisaka reg->cudecis_thd10.delta3_thre_fme32_inter = 23;
740*437bfbebSnyanmisaka reg->cudecis_thd10.delta4_thre_fme32_inter = 41;
741*437bfbebSnyanmisaka reg->cudecis_thd10.delta5_thre_fme32_inter = 71;
742*437bfbebSnyanmisaka reg->cudecis_thd10.delta6_thre_fme32_inter = 123;
743*437bfbebSnyanmisaka reg->cudecis_thd10.thre_cme32_inter = 48;
744*437bfbebSnyanmisaka
745*437bfbebSnyanmisaka /* 0x0000212c reg2123 */
746*437bfbebSnyanmisaka reg->cudecis_thd11.delta0_thre_mad_fme_ratio_inter = 0;
747*437bfbebSnyanmisaka reg->cudecis_thd11.delta1_thre_mad_fme_ratio_inter = 7;
748*437bfbebSnyanmisaka reg->cudecis_thd11.delta2_thre_mad_fme_ratio_inter = 7;
749*437bfbebSnyanmisaka reg->cudecis_thd11.delta3_thre_mad_fme_ratio_inter = 6;
750*437bfbebSnyanmisaka reg->cudecis_thd11.delta4_thre_mad_fme_ratio_inter = 5;
751*437bfbebSnyanmisaka reg->cudecis_thd11.delta5_thre_mad_fme_ratio_inter = 4;
752*437bfbebSnyanmisaka reg->cudecis_thd11.delta6_thre_mad_fme_ratio_inter = 4;
753*437bfbebSnyanmisaka reg->cudecis_thd11.delta7_thre_mad_fme_ratio_inter = 4;
754*437bfbebSnyanmisaka
755*437bfbebSnyanmisaka vepu510_h265_set_anti_stripe_regs(reg, ctx->cfg->tune.atl_str);
756*437bfbebSnyanmisaka if (ctx->frame_type == INTRA_FRAME)
757*437bfbebSnyanmisaka vepu510_h265_set_atr_regs(reg, sm, ctx->cfg->tune.atr_str_i);
758*437bfbebSnyanmisaka else
759*437bfbebSnyanmisaka vepu510_h265_set_atr_regs(reg, sm, ctx->cfg->tune.atr_str_p);
760*437bfbebSnyanmisaka
761*437bfbebSnyanmisaka if (ctx->frame_type == INTRA_FRAME)
762*437bfbebSnyanmisaka vepu510_h265_set_anti_blur_regs(reg, ctx->cfg->tune.sao_str_i);
763*437bfbebSnyanmisaka else
764*437bfbebSnyanmisaka vepu510_h265_set_anti_blur_regs(reg, ctx->cfg->tune.sao_str_p);
765*437bfbebSnyanmisaka }
766*437bfbebSnyanmisaka
vepu510_h265_atf_cfg(H265eVepu510Sqi * reg,RK_S32 atf_str)767*437bfbebSnyanmisaka static void vepu510_h265_atf_cfg(H265eVepu510Sqi *reg, RK_S32 atf_str)
768*437bfbebSnyanmisaka {
769*437bfbebSnyanmisaka rdo_skip_par *p_rdo_skip = NULL;
770*437bfbebSnyanmisaka rdo_noskip_par *p_rdo_noskip = NULL;
771*437bfbebSnyanmisaka
772*437bfbebSnyanmisaka p_rdo_skip = ®->rdo_b32_skip;
773*437bfbebSnyanmisaka p_rdo_skip->atf_thd0.madp_thd0 = 5 ;
774*437bfbebSnyanmisaka p_rdo_skip->atf_thd0.madp_thd1 = 10 ;
775*437bfbebSnyanmisaka p_rdo_skip->atf_thd1.madp_thd2 = atf_b32_skip_thd2[atf_str];
776*437bfbebSnyanmisaka p_rdo_skip->atf_thd1.madp_thd3 = atf_b32_skip_thd3[atf_str];
777*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt0 = atf_b32_skip_wgt0[atf_str];
778*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt1 = 16 ;
779*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt2 = 16 ;
780*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt3 = atf_b32_skip_wgt3[atf_str];
781*437bfbebSnyanmisaka
782*437bfbebSnyanmisaka p_rdo_noskip = ®->rdo_b32_inter;
783*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd0 = 20;
784*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd1 = 40;
785*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd1.madp_thd2 = 72;
786*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt0 = 16;
787*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt1 = 16;
788*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt2 = 16;
789*437bfbebSnyanmisaka
790*437bfbebSnyanmisaka p_rdo_noskip = ®->rdo_b32_intra;
791*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd0 = atf_b32_intra_thd0[atf_str];
792*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd1 = atf_b32_intra_thd1[atf_str];
793*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd1.madp_thd2 = atf_b32_intra_thd2[atf_str];
794*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt0 = atf_b32_intra_wgt0[atf_str];
795*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt1 = atf_b32_intra_wgt1[atf_str];
796*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt2 = atf_b32_intra_wgt2[atf_str];
797*437bfbebSnyanmisaka
798*437bfbebSnyanmisaka p_rdo_skip = ®->rdo_b16_skip;
799*437bfbebSnyanmisaka p_rdo_skip->atf_thd0.madp_thd0 = 1 ;
800*437bfbebSnyanmisaka p_rdo_skip->atf_thd0.madp_thd1 = 10 ;
801*437bfbebSnyanmisaka p_rdo_skip->atf_thd1.madp_thd2 = atf_b16_skip_thd2[atf_str];
802*437bfbebSnyanmisaka p_rdo_skip->atf_thd1.madp_thd3 = atf_b16_skip_thd3[atf_str];
803*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt0 = atf_b16_skip_wgt0[atf_str];
804*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt1 = 16 ;
805*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt2 = 16 ;
806*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt3 = atf_b16_skip_wgt3[atf_str];
807*437bfbebSnyanmisaka p_rdo_skip->atf_wgt1.wgt4 = 16 ;
808*437bfbebSnyanmisaka
809*437bfbebSnyanmisaka p_rdo_noskip = ®->rdo_b16_inter;
810*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd0 = 20;
811*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd1 = 40;
812*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd1.madp_thd2 = 72;
813*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt0 = 16;
814*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt1 = 16;
815*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt2 = 16;
816*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt3 = 16;
817*437bfbebSnyanmisaka
818*437bfbebSnyanmisaka p_rdo_noskip = ®->rdo_b16_intra;
819*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd0 = atf_b16_intra_thd0[atf_str];
820*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd1 = atf_b16_intra_thd1[atf_str];
821*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd1.madp_thd2 = atf_b16_intra_thd2[atf_str];
822*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt0 = atf_b16_intra_wgt0[atf_str];
823*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt1 = atf_b16_intra_wgt1[atf_str];
824*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt2 = atf_b16_intra_wgt2[atf_str];
825*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt3 = 16;
826*437bfbebSnyanmisaka }
827*437bfbebSnyanmisaka
vepu510_h265_smear_cfg(H265eVepu510Sqi * reg,H265eV510HalContext * ctx)828*437bfbebSnyanmisaka static void vepu510_h265_smear_cfg(H265eVepu510Sqi *reg, H265eV510HalContext *ctx)
829*437bfbebSnyanmisaka {
830*437bfbebSnyanmisaka RK_S32 frame_num = ctx->frame_num;
831*437bfbebSnyanmisaka RK_S32 frame_keyint = (ctx->cfg->rc.gop > 0) ? ctx->cfg->rc.gop : 0x7FFFFFFF;
832*437bfbebSnyanmisaka RK_U32 cover_num = ctx->feedback.acc_cover16_num;
833*437bfbebSnyanmisaka RK_U32 bndry_num = ctx->feedback.acc_bndry16_num;
834*437bfbebSnyanmisaka RK_U32 st_ctu_num = ctx->feedback.st_ctu_num;
835*437bfbebSnyanmisaka RK_S32 deblur_en = ctx->cfg->tune.deblur_en;
836*437bfbebSnyanmisaka RK_S32 deblur_str = ctx->cfg->tune.deblur_str;
837*437bfbebSnyanmisaka RK_S16 flag_cover = 0;
838*437bfbebSnyanmisaka RK_S16 flag_bndry = 0;
839*437bfbebSnyanmisaka
840*437bfbebSnyanmisaka if (cover_num * 1000 < smear_flag_cover_thd0[deblur_str] * st_ctu_num)
841*437bfbebSnyanmisaka flag_cover = 0;
842*437bfbebSnyanmisaka else if (cover_num * 1000 < smear_flag_cover_thd1[deblur_str] * st_ctu_num)
843*437bfbebSnyanmisaka flag_cover = 1;
844*437bfbebSnyanmisaka else
845*437bfbebSnyanmisaka flag_cover = 2;
846*437bfbebSnyanmisaka
847*437bfbebSnyanmisaka if (bndry_num * 1000 < smear_flag_bndry_thd0[deblur_str] * st_ctu_num)
848*437bfbebSnyanmisaka flag_bndry = 0;
849*437bfbebSnyanmisaka else if (bndry_num * 1000 < smear_flag_bndry_thd1[deblur_str] * st_ctu_num)
850*437bfbebSnyanmisaka flag_bndry = 1;
851*437bfbebSnyanmisaka else
852*437bfbebSnyanmisaka flag_bndry = 2;
853*437bfbebSnyanmisaka
854*437bfbebSnyanmisaka reg->subj_opt_dpth_thd.common_thre_num_grdn_point_dep0 = 64;
855*437bfbebSnyanmisaka reg->subj_opt_dpth_thd.common_thre_num_grdn_point_dep1 = 32;
856*437bfbebSnyanmisaka reg->subj_opt_dpth_thd.common_thre_num_grdn_point_dep2 = 16;
857*437bfbebSnyanmisaka reg->subj_opt_inrar_coef.common_rdo_cu_intra_r_coef_dep0 = smear_common_intra_r_dep0[deblur_str] + smear_flag_cover_intra_wgt0[flag_bndry];
858*437bfbebSnyanmisaka reg->subj_opt_inrar_coef.common_rdo_cu_intra_r_coef_dep1 = smear_common_intra_r_dep1[deblur_str] + smear_flag_cover_intra_wgt1[flag_bndry];
859*437bfbebSnyanmisaka
860*437bfbebSnyanmisaka /* anti smear */
861*437bfbebSnyanmisaka reg->smear_opt_cfg0.anti_smear_en = 1;
862*437bfbebSnyanmisaka if (deblur_en == 0)
863*437bfbebSnyanmisaka reg->smear_opt_cfg0.anti_smear_en = 0;
864*437bfbebSnyanmisaka reg->smear_opt_cfg0.smear_strength = smear_strength[deblur_str] + smear_flag_bndry_wgt[flag_cover];
865*437bfbebSnyanmisaka reg->smear_opt_cfg0.thre_mv_inconfor_cime = 8;
866*437bfbebSnyanmisaka reg->smear_opt_cfg0.thre_mv_confor_cime = 2;
867*437bfbebSnyanmisaka reg->smear_opt_cfg0.thre_mv_inconfor_cime_gmv = 8;
868*437bfbebSnyanmisaka reg->smear_opt_cfg0.thre_mv_confor_cime_gmv = 2;
869*437bfbebSnyanmisaka reg->smear_opt_cfg0.thre_num_mv_confor_cime = 3;
870*437bfbebSnyanmisaka reg->smear_opt_cfg0.thre_num_mv_confor_cime_gmv = 2;
871*437bfbebSnyanmisaka reg->smear_opt_cfg0.frm_static = 1;
872*437bfbebSnyanmisaka
873*437bfbebSnyanmisaka if (((frame_num) % frame_keyint == 0) || reg->smear_opt_cfg0.frm_static == 0 || (frame_num) % frame_keyint == 1) {
874*437bfbebSnyanmisaka reg->smear_opt_cfg0.smear_load_en = 0;
875*437bfbebSnyanmisaka } else {
876*437bfbebSnyanmisaka reg->smear_opt_cfg0.smear_load_en = 1;
877*437bfbebSnyanmisaka }
878*437bfbebSnyanmisaka
879*437bfbebSnyanmisaka if (((frame_num) % frame_keyint == 0) || reg->smear_opt_cfg0.frm_static == 0 || (frame_num) % frame_keyint == frame_keyint - 1) {
880*437bfbebSnyanmisaka reg->smear_opt_cfg0.smear_stor_en = 0;
881*437bfbebSnyanmisaka } else {
882*437bfbebSnyanmisaka reg->smear_opt_cfg0.smear_stor_en = 1;
883*437bfbebSnyanmisaka }
884*437bfbebSnyanmisaka
885*437bfbebSnyanmisaka reg->smear_opt_cfg1.dist0_frm_avg = 0;
886*437bfbebSnyanmisaka reg->smear_opt_cfg1.thre_dsp_static = 10;
887*437bfbebSnyanmisaka reg->smear_opt_cfg1.thre_dsp_mov = 15;
888*437bfbebSnyanmisaka reg->smear_opt_cfg1.thre_dist_mv_confor_cime = 32;
889*437bfbebSnyanmisaka
890*437bfbebSnyanmisaka reg->smear_madp_thd.thre_madp_stc_dep0 = 10;
891*437bfbebSnyanmisaka reg->smear_madp_thd.thre_madp_stc_dep1 = 8;
892*437bfbebSnyanmisaka reg->smear_madp_thd.thre_madp_stc_dep2 = 8;
893*437bfbebSnyanmisaka reg->smear_madp_thd.thre_madp_mov_dep0 = 16;
894*437bfbebSnyanmisaka reg->smear_madp_thd.thre_madp_mov_dep1 = 18;
895*437bfbebSnyanmisaka reg->smear_madp_thd.thre_madp_mov_dep2 = 20;
896*437bfbebSnyanmisaka
897*437bfbebSnyanmisaka reg->smear_stat_thd.thre_num_pt_stc_dep0 = 47;
898*437bfbebSnyanmisaka reg->smear_stat_thd.thre_num_pt_stc_dep1 = 11;
899*437bfbebSnyanmisaka reg->smear_stat_thd.thre_num_pt_stc_dep2 = 3;
900*437bfbebSnyanmisaka reg->smear_stat_thd.thre_num_pt_mov_dep0 = 47;
901*437bfbebSnyanmisaka reg->smear_stat_thd.thre_num_pt_mov_dep1 = 11;
902*437bfbebSnyanmisaka reg->smear_stat_thd.thre_num_pt_mov_dep2 = 3;
903*437bfbebSnyanmisaka
904*437bfbebSnyanmisaka reg->smear_bmv_dist_thd0.thre_ratio_dist_mv_confor_cime_gmv0 = 21;
905*437bfbebSnyanmisaka reg->smear_bmv_dist_thd0.thre_ratio_dist_mv_confor_cime_gmv1 = 16;
906*437bfbebSnyanmisaka reg->smear_bmv_dist_thd0.thre_ratio_dist_mv_inconfor_cime_gmv0 = 48;
907*437bfbebSnyanmisaka reg->smear_bmv_dist_thd0.thre_ratio_dist_mv_inconfor_cime_gmv1 = 34;
908*437bfbebSnyanmisaka
909*437bfbebSnyanmisaka reg->smear_bmv_dist_thd1.thre_ratio_dist_mv_inconfor_cime_gmv2 = 32;
910*437bfbebSnyanmisaka reg->smear_bmv_dist_thd1.thre_ratio_dist_mv_inconfor_cime_gmv3 = 29;
911*437bfbebSnyanmisaka reg->smear_bmv_dist_thd1.thre_ratio_dist_mv_inconfor_cime_gmv4 = 27;
912*437bfbebSnyanmisaka
913*437bfbebSnyanmisaka reg->smear_min_bndry_gmv.thre_min_num_confor_csu0_bndry_cime_gmv = 0;
914*437bfbebSnyanmisaka reg->smear_min_bndry_gmv.thre_max_num_confor_csu0_bndry_cime_gmv = 3;
915*437bfbebSnyanmisaka reg->smear_min_bndry_gmv.thre_min_num_inconfor_csu0_bndry_cime_gmv = 0;
916*437bfbebSnyanmisaka reg->smear_min_bndry_gmv.thre_max_num_inconfor_csu0_bndry_cime_gmv = 3;
917*437bfbebSnyanmisaka reg->smear_min_bndry_gmv.thre_split_dep0 = 2;
918*437bfbebSnyanmisaka reg->smear_min_bndry_gmv.thre_zero_srgn = 8;
919*437bfbebSnyanmisaka reg->smear_min_bndry_gmv.madi_thre_dep0 = 22;
920*437bfbebSnyanmisaka reg->smear_min_bndry_gmv.madi_thre_dep1 = 18;
921*437bfbebSnyanmisaka
922*437bfbebSnyanmisaka reg->smear_madp_cov_thd.thre_madp_stc_cover0 = smear_thre_madp_stc_cover0[deblur_str];
923*437bfbebSnyanmisaka reg->smear_madp_cov_thd.thre_madp_stc_cover1 = smear_thre_madp_stc_cover1[deblur_str];
924*437bfbebSnyanmisaka reg->smear_madp_cov_thd.thre_madp_mov_cover0 = smear_thre_madp_mov_cover0[deblur_str];
925*437bfbebSnyanmisaka reg->smear_madp_cov_thd.thre_madp_mov_cover1 = smear_thre_madp_mov_cover1[deblur_str];
926*437bfbebSnyanmisaka reg->smear_madp_cov_thd.smear_qp_strength = smear_qp_strength[deblur_str] + smear_flag_cover_wgt[flag_cover];
927*437bfbebSnyanmisaka reg->smear_madp_cov_thd.smear_thre_qp = 30;
928*437bfbebSnyanmisaka
929*437bfbebSnyanmisaka reg->subj_opt_dqp1.bndry_rdo_cu_intra_r_coef_dep0 = smear_bndry_intra_r_dep0[deblur_str] + smear_flag_bndry_intra_wgt0[flag_bndry];
930*437bfbebSnyanmisaka reg->subj_opt_dqp1.bndry_rdo_cu_intra_r_coef_dep1 = smear_bndry_intra_r_dep1[deblur_str] + smear_flag_bndry_intra_wgt1[flag_bndry];
931*437bfbebSnyanmisaka }
932*437bfbebSnyanmisaka
vepu510_h265_global_cfg_set(H265eV510HalContext * ctx,H265eV510RegSet * regs)933*437bfbebSnyanmisaka static void vepu510_h265_global_cfg_set(H265eV510HalContext *ctx, H265eV510RegSet *regs)
934*437bfbebSnyanmisaka {
935*437bfbebSnyanmisaka MppEncHwCfg *hw = &ctx->cfg->hw;
936*437bfbebSnyanmisaka H265eVepu510Param *reg_param = ®s->reg_param;
937*437bfbebSnyanmisaka H265eVepu510Sqi *reg_sqi = ®s->reg_sqi;
938*437bfbebSnyanmisaka MppEncSceneMode sm = ctx->cfg->tune.scene_mode;
939*437bfbebSnyanmisaka RK_S32 atf_str = ctx->cfg->tune.anti_flicker_str;
940*437bfbebSnyanmisaka RK_S32 lambda_idx = 0;
941*437bfbebSnyanmisaka
942*437bfbebSnyanmisaka vepu510_h265_rdo_cfg(ctx, reg_sqi, sm);
943*437bfbebSnyanmisaka vepu510_h265_atf_cfg(reg_sqi, atf_str);
944*437bfbebSnyanmisaka vepu510_h265_smear_cfg(reg_sqi, ctx);
945*437bfbebSnyanmisaka memcpy(®_param->pprd_lamb_satd_0_51[0], lamd_satd_qp_510, sizeof(lamd_satd_qp));
946*437bfbebSnyanmisaka
947*437bfbebSnyanmisaka if (ctx->frame_type == INTRA_FRAME) {
948*437bfbebSnyanmisaka reg_param->iprd_lamb_satd_ofst.lambda_satd_offset = 11;
949*437bfbebSnyanmisaka lambda_idx = ctx->cfg->tune.lambda_idx_i;
950*437bfbebSnyanmisaka memcpy(®_param->rdo_wgta_qp_grpa_0_51[0],
951*437bfbebSnyanmisaka &rdo_lambda_table_I[lambda_idx], H265E_LAMBDA_TAB_SIZE);
952*437bfbebSnyanmisaka } else {
953*437bfbebSnyanmisaka reg_param->iprd_lamb_satd_ofst.lambda_satd_offset = 11;
954*437bfbebSnyanmisaka lambda_idx = ctx->cfg->tune.lambda_idx_p;
955*437bfbebSnyanmisaka memcpy(®_param->rdo_wgta_qp_grpa_0_51[0],
956*437bfbebSnyanmisaka &rdo_lambda_table_P[lambda_idx], H265E_LAMBDA_TAB_SIZE);
957*437bfbebSnyanmisaka }
958*437bfbebSnyanmisaka
959*437bfbebSnyanmisaka reg_param->qnt_bias_comb.qnt_f_bias_i = 171;
960*437bfbebSnyanmisaka reg_param->qnt_bias_comb.qnt_f_bias_p = 85;
961*437bfbebSnyanmisaka if (hw->qbias_en) {
962*437bfbebSnyanmisaka reg_param->qnt_bias_comb.qnt_f_bias_i = hw->qbias_i;
963*437bfbebSnyanmisaka reg_param->qnt_bias_comb.qnt_f_bias_p = hw->qbias_p;
964*437bfbebSnyanmisaka } else if (ctx->smart_en || ctx->sp_enc_en) {
965*437bfbebSnyanmisaka reg_param->qnt_bias_comb.qnt_f_bias_i = 144;
966*437bfbebSnyanmisaka }
967*437bfbebSnyanmisaka
968*437bfbebSnyanmisaka /* CIME */
969*437bfbebSnyanmisaka {
970*437bfbebSnyanmisaka reg_param->me_sqi_comb.cime_pmv_num = 1;
971*437bfbebSnyanmisaka reg_param->me_sqi_comb.cime_fuse = 1;
972*437bfbebSnyanmisaka reg_param->me_sqi_comb.itp_mode = 1;
973*437bfbebSnyanmisaka reg_param->me_sqi_comb.move_lambda = (sm == MPP_ENC_SCENE_MODE_IPC) ? 2 : 8;
974*437bfbebSnyanmisaka reg_param->me_sqi_comb.rime_lvl_mrg = 1;
975*437bfbebSnyanmisaka reg_param->me_sqi_comb.rime_prelvl_en = 3;
976*437bfbebSnyanmisaka reg_param->me_sqi_comb.rime_prersu_en = 0;
977*437bfbebSnyanmisaka reg_param->cime_mvd_th_comb.cime_mvd_th0 = 8;
978*437bfbebSnyanmisaka reg_param->cime_mvd_th_comb.cime_mvd_th1 = 20;
979*437bfbebSnyanmisaka reg_param->cime_mvd_th_comb.cime_mvd_th2 = 32;
980*437bfbebSnyanmisaka reg_param->cime_madp_th_comb.cime_madp_th = (sm == MPP_ENC_SCENE_MODE_IPC) ? 16 : 0;
981*437bfbebSnyanmisaka
982*437bfbebSnyanmisaka if (sm == MPP_ENC_SCENE_MODE_IPC) {
983*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi0 = 8;
984*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi1 = 12;
985*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi2 = 16;
986*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi3 = 20;
987*437bfbebSnyanmisaka } else {
988*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi0 = 4;
989*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi1 = 4;
990*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi2 = 4;
991*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi3 = 4;
992*437bfbebSnyanmisaka }
993*437bfbebSnyanmisaka }
994*437bfbebSnyanmisaka
995*437bfbebSnyanmisaka /* RIME && FME */
996*437bfbebSnyanmisaka if (sm == MPP_ENC_SCENE_MODE_IPC) {
997*437bfbebSnyanmisaka reg_param->rime_mvd_th_comb.rime_mvd_th0 = 1;
998*437bfbebSnyanmisaka reg_param->rime_mvd_th_comb.rime_mvd_th1 = 2;
999*437bfbebSnyanmisaka reg_param->rime_mvd_th_comb.fme_madp_th = 0;
1000*437bfbebSnyanmisaka reg_param->rime_madp_th_comb.rime_madp_th0 = 8;
1001*437bfbebSnyanmisaka reg_param->rime_madp_th_comb.rime_madp_th1 = 16;
1002*437bfbebSnyanmisaka reg_param->rime_multi_comb.rime_multi0 = 4;
1003*437bfbebSnyanmisaka reg_param->rime_multi_comb.rime_multi1 = 8;
1004*437bfbebSnyanmisaka reg_param->rime_multi_comb.rime_multi2 = 12;
1005*437bfbebSnyanmisaka } else {
1006*437bfbebSnyanmisaka reg_param->rime_mvd_th_comb.rime_mvd_th0 = 0;
1007*437bfbebSnyanmisaka reg_param->rime_mvd_th_comb.rime_mvd_th1 = 0;
1008*437bfbebSnyanmisaka reg_param->rime_mvd_th_comb.fme_madp_th = 30;
1009*437bfbebSnyanmisaka reg_param->rime_madp_th_comb.rime_madp_th0 = 0;
1010*437bfbebSnyanmisaka reg_param->rime_madp_th_comb.rime_madp_th1 = 0;
1011*437bfbebSnyanmisaka reg_param->rime_multi_comb.rime_multi0 = 4;
1012*437bfbebSnyanmisaka reg_param->rime_multi_comb.rime_multi1 = 4;
1013*437bfbebSnyanmisaka reg_param->rime_multi_comb.rime_multi2 = 4;
1014*437bfbebSnyanmisaka }
1015*437bfbebSnyanmisaka
1016*437bfbebSnyanmisaka {
1017*437bfbebSnyanmisaka /* 0x1064 */
1018*437bfbebSnyanmisaka regs->reg_rc_roi.madi_st_thd.madi_th0 = 5;
1019*437bfbebSnyanmisaka regs->reg_rc_roi.madi_st_thd.madi_th1 = 12;
1020*437bfbebSnyanmisaka regs->reg_rc_roi.madi_st_thd.madi_th2 = 20;
1021*437bfbebSnyanmisaka /* 0x1068 */
1022*437bfbebSnyanmisaka regs->reg_rc_roi.madp_st_thd0.madp_th0 = 4 << 4;
1023*437bfbebSnyanmisaka regs->reg_rc_roi.madp_st_thd0.madp_th1 = 9 << 4;
1024*437bfbebSnyanmisaka /* 0x106C */
1025*437bfbebSnyanmisaka regs->reg_rc_roi.madp_st_thd1.madp_th2 = 15 << 4;
1026*437bfbebSnyanmisaka
1027*437bfbebSnyanmisaka /* 0x177C */
1028*437bfbebSnyanmisaka reg_param->cmv_st_th_comb.cmv_th0 = 64;
1029*437bfbebSnyanmisaka reg_param->cmv_st_th_comb.cmv_th1 = 96;
1030*437bfbebSnyanmisaka reg_param->cmv_st_th_comb.cmv_th2 = 128;
1031*437bfbebSnyanmisaka }
1032*437bfbebSnyanmisaka }
1033*437bfbebSnyanmisaka
hal_h265e_v510_deinit(void * hal)1034*437bfbebSnyanmisaka MPP_RET hal_h265e_v510_deinit(void *hal)
1035*437bfbebSnyanmisaka {
1036*437bfbebSnyanmisaka H265eV510HalContext *ctx = (H265eV510HalContext *)hal;
1037*437bfbebSnyanmisaka RK_S32 i = 0;
1038*437bfbebSnyanmisaka
1039*437bfbebSnyanmisaka hal_h265e_enter();
1040*437bfbebSnyanmisaka MPP_FREE(ctx->poll_cfgs);
1041*437bfbebSnyanmisaka MPP_FREE(ctx->input_fmt);
1042*437bfbebSnyanmisaka hal_bufs_deinit(ctx->dpb_bufs);
1043*437bfbebSnyanmisaka
1044*437bfbebSnyanmisaka for (i = 0; i < ctx->task_cnt; i++) {
1045*437bfbebSnyanmisaka Vepu510H265eFrmCfg *frm = ctx->frms[i];
1046*437bfbebSnyanmisaka
1047*437bfbebSnyanmisaka if (!frm)
1048*437bfbebSnyanmisaka continue;
1049*437bfbebSnyanmisaka
1050*437bfbebSnyanmisaka if (frm->roir_buf) {
1051*437bfbebSnyanmisaka mpp_buffer_put(frm->roir_buf);
1052*437bfbebSnyanmisaka frm->roir_buf = NULL;
1053*437bfbebSnyanmisaka frm->roir_buf_size = 0;
1054*437bfbebSnyanmisaka }
1055*437bfbebSnyanmisaka
1056*437bfbebSnyanmisaka MPP_FREE(frm->roi_base_cfg_sw_buf);
1057*437bfbebSnyanmisaka
1058*437bfbebSnyanmisaka if (frm->reg_cfg) {
1059*437bfbebSnyanmisaka mpp_dev_multi_offset_deinit(frm->reg_cfg);
1060*437bfbebSnyanmisaka frm->reg_cfg = NULL;
1061*437bfbebSnyanmisaka }
1062*437bfbebSnyanmisaka
1063*437bfbebSnyanmisaka MPP_FREE(frm->regs_set);
1064*437bfbebSnyanmisaka MPP_FREE(frm->regs_ret);
1065*437bfbebSnyanmisaka MPP_FREE(ctx->frms[i]);
1066*437bfbebSnyanmisaka }
1067*437bfbebSnyanmisaka
1068*437bfbebSnyanmisaka clear_ext_line_bufs(ctx);
1069*437bfbebSnyanmisaka
1070*437bfbebSnyanmisaka if (ctx->ext_line_buf_grp) {
1071*437bfbebSnyanmisaka mpp_buffer_group_put(ctx->ext_line_buf_grp);
1072*437bfbebSnyanmisaka ctx->ext_line_buf_grp = NULL;
1073*437bfbebSnyanmisaka }
1074*437bfbebSnyanmisaka
1075*437bfbebSnyanmisaka if (ctx->buf_pass1) {
1076*437bfbebSnyanmisaka mpp_buffer_put(ctx->buf_pass1);
1077*437bfbebSnyanmisaka ctx->buf_pass1 = NULL;
1078*437bfbebSnyanmisaka }
1079*437bfbebSnyanmisaka
1080*437bfbebSnyanmisaka if (ctx->dev) {
1081*437bfbebSnyanmisaka mpp_dev_deinit(ctx->dev);
1082*437bfbebSnyanmisaka ctx->dev = NULL;
1083*437bfbebSnyanmisaka }
1084*437bfbebSnyanmisaka
1085*437bfbebSnyanmisaka if (ctx->reg_cfg) {
1086*437bfbebSnyanmisaka mpp_dev_multi_offset_deinit(ctx->reg_cfg);
1087*437bfbebSnyanmisaka ctx->reg_cfg = NULL;
1088*437bfbebSnyanmisaka }
1089*437bfbebSnyanmisaka
1090*437bfbebSnyanmisaka if (ctx->roi_grp) {
1091*437bfbebSnyanmisaka mpp_buffer_group_put(ctx->roi_grp);
1092*437bfbebSnyanmisaka ctx->roi_grp = NULL;
1093*437bfbebSnyanmisaka }
1094*437bfbebSnyanmisaka
1095*437bfbebSnyanmisaka if (ctx->tune) {
1096*437bfbebSnyanmisaka vepu510_h265e_tune_deinit(ctx->tune);
1097*437bfbebSnyanmisaka ctx->tune = NULL;
1098*437bfbebSnyanmisaka }
1099*437bfbebSnyanmisaka
1100*437bfbebSnyanmisaka hal_h265e_leave();
1101*437bfbebSnyanmisaka return MPP_OK;
1102*437bfbebSnyanmisaka }
1103*437bfbebSnyanmisaka
hal_h265e_v510_init(void * hal,MppEncHalCfg * cfg)1104*437bfbebSnyanmisaka MPP_RET hal_h265e_v510_init(void *hal, MppEncHalCfg *cfg)
1105*437bfbebSnyanmisaka {
1106*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
1107*437bfbebSnyanmisaka H265eV510HalContext *ctx = (H265eV510HalContext *)hal;
1108*437bfbebSnyanmisaka RK_S32 i = 0;
1109*437bfbebSnyanmisaka
1110*437bfbebSnyanmisaka mpp_env_get_u32("hal_h265e_debug", &hal_h265e_debug, 0);
1111*437bfbebSnyanmisaka hal_h265e_enter();
1112*437bfbebSnyanmisaka
1113*437bfbebSnyanmisaka ctx->task_cnt = cfg->task_cnt;
1114*437bfbebSnyanmisaka mpp_assert(ctx->task_cnt && ctx->task_cnt <= MAX_FRAME_TASK_NUM);
1115*437bfbebSnyanmisaka if (ctx->task_cnt > MAX_FRAME_TASK_NUM)
1116*437bfbebSnyanmisaka ctx->task_cnt = MAX_FRAME_TASK_NUM;
1117*437bfbebSnyanmisaka
1118*437bfbebSnyanmisaka for (i = 0; i < ctx->task_cnt; i++) {
1119*437bfbebSnyanmisaka Vepu510H265eFrmCfg *frm_cfg = mpp_calloc(Vepu510H265eFrmCfg, 1);
1120*437bfbebSnyanmisaka
1121*437bfbebSnyanmisaka frm_cfg->regs_set = mpp_calloc(H265eV510RegSet, 1);
1122*437bfbebSnyanmisaka frm_cfg->regs_ret = mpp_calloc(H265eV510StatusElem, 1);
1123*437bfbebSnyanmisaka frm_cfg->frame_type = INTRA_FRAME;
1124*437bfbebSnyanmisaka ctx->frms[i] = frm_cfg;
1125*437bfbebSnyanmisaka }
1126*437bfbebSnyanmisaka
1127*437bfbebSnyanmisaka ctx->input_fmt = mpp_calloc(VepuFmtCfg, 1);
1128*437bfbebSnyanmisaka ctx->cfg = cfg->cfg;
1129*437bfbebSnyanmisaka hal_bufs_init(&ctx->dpb_bufs);
1130*437bfbebSnyanmisaka
1131*437bfbebSnyanmisaka ctx->frame_count = -1;
1132*437bfbebSnyanmisaka ctx->frame_cnt_gen_ready = 0;
1133*437bfbebSnyanmisaka ctx->enc_mode = 1;
1134*437bfbebSnyanmisaka cfg->cap_recn_out = 1;
1135*437bfbebSnyanmisaka cfg->type = VPU_CLIENT_RKVENC;
1136*437bfbebSnyanmisaka ret = mpp_dev_init(&cfg->dev, cfg->type);
1137*437bfbebSnyanmisaka if (ret) {
1138*437bfbebSnyanmisaka mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
1139*437bfbebSnyanmisaka return ret;
1140*437bfbebSnyanmisaka }
1141*437bfbebSnyanmisaka mpp_dev_multi_offset_init(&ctx->reg_cfg, 24);
1142*437bfbebSnyanmisaka ctx->dev = cfg->dev;
1143*437bfbebSnyanmisaka ctx->frame_type = INTRA_FRAME;
1144*437bfbebSnyanmisaka
1145*437bfbebSnyanmisaka { /* setup default hardware config */
1146*437bfbebSnyanmisaka MppEncHwCfg *hw = &cfg->cfg->hw;
1147*437bfbebSnyanmisaka RK_U32 j;
1148*437bfbebSnyanmisaka
1149*437bfbebSnyanmisaka hw->qp_delta_row_i = 2;
1150*437bfbebSnyanmisaka hw->qp_delta_row = 2;
1151*437bfbebSnyanmisaka hw->qbias_i = 171;
1152*437bfbebSnyanmisaka hw->qbias_p = 85;
1153*437bfbebSnyanmisaka hw->qbias_en = 0;
1154*437bfbebSnyanmisaka
1155*437bfbebSnyanmisaka for (j = 0; j < MPP_ARRAY_ELEMS(hw->mode_bias); j++)
1156*437bfbebSnyanmisaka hw->mode_bias[j] = 8;
1157*437bfbebSnyanmisaka }
1158*437bfbebSnyanmisaka
1159*437bfbebSnyanmisaka ctx->poll_slice_max = 8;
1160*437bfbebSnyanmisaka ctx->poll_cfg_size = (sizeof(ctx->poll_cfgs) + sizeof(RK_S32) * ctx->poll_slice_max) * 2;
1161*437bfbebSnyanmisaka ctx->poll_cfgs = mpp_malloc_size(MppDevPollCfg, ctx->poll_cfg_size);
1162*437bfbebSnyanmisaka
1163*437bfbebSnyanmisaka if (NULL == ctx->poll_cfgs) {
1164*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
1165*437bfbebSnyanmisaka mpp_err_f("init poll cfg buffer failed\n");
1166*437bfbebSnyanmisaka goto DONE;
1167*437bfbebSnyanmisaka }
1168*437bfbebSnyanmisaka
1169*437bfbebSnyanmisaka ctx->output_cb = cfg->output_cb;
1170*437bfbebSnyanmisaka cfg->cap_recn_out = 1;
1171*437bfbebSnyanmisaka
1172*437bfbebSnyanmisaka ctx->tune = vepu510_h265e_tune_init(ctx);
1173*437bfbebSnyanmisaka
1174*437bfbebSnyanmisaka DONE:
1175*437bfbebSnyanmisaka if (ret)
1176*437bfbebSnyanmisaka hal_h265e_v510_deinit(hal);
1177*437bfbebSnyanmisaka
1178*437bfbebSnyanmisaka hal_h265e_leave();
1179*437bfbebSnyanmisaka return ret;
1180*437bfbebSnyanmisaka }
1181*437bfbebSnyanmisaka
hal_h265e_vepu510_prepare(void * hal)1182*437bfbebSnyanmisaka static MPP_RET hal_h265e_vepu510_prepare(void *hal)
1183*437bfbebSnyanmisaka {
1184*437bfbebSnyanmisaka H265eV510HalContext *ctx = (H265eV510HalContext *)hal;
1185*437bfbebSnyanmisaka MppEncPrepCfg *prep = &ctx->cfg->prep;
1186*437bfbebSnyanmisaka
1187*437bfbebSnyanmisaka hal_h265e_dbg_func("enter %p\n", hal);
1188*437bfbebSnyanmisaka
1189*437bfbebSnyanmisaka if (prep->change_res) {
1190*437bfbebSnyanmisaka RK_S32 i;
1191*437bfbebSnyanmisaka
1192*437bfbebSnyanmisaka // pre-alloc required buffers to reduce first frame delay
1193*437bfbebSnyanmisaka vepu510_h265_setup_hal_bufs(ctx);
1194*437bfbebSnyanmisaka for (i = 0; i < ctx->max_buf_cnt; i++)
1195*437bfbebSnyanmisaka hal_bufs_get_buf(ctx->dpb_bufs, i);
1196*437bfbebSnyanmisaka
1197*437bfbebSnyanmisaka prep->change_res = 0;
1198*437bfbebSnyanmisaka }
1199*437bfbebSnyanmisaka
1200*437bfbebSnyanmisaka hal_h265e_dbg_func("leave %p\n", hal);
1201*437bfbebSnyanmisaka
1202*437bfbebSnyanmisaka return MPP_OK;
1203*437bfbebSnyanmisaka }
1204*437bfbebSnyanmisaka
1205*437bfbebSnyanmisaka static MPP_RET
vepu510_h265_set_patch_info(H265eSyntax_new * syn,VepuFmt input_fmt,MppDevRegOffCfgs * offsets,HalEncTask * task)1206*437bfbebSnyanmisaka vepu510_h265_set_patch_info(H265eSyntax_new *syn, VepuFmt input_fmt, MppDevRegOffCfgs *offsets, HalEncTask *task)
1207*437bfbebSnyanmisaka {
1208*437bfbebSnyanmisaka RK_U32 hor_stride = syn->pp.hor_stride;
1209*437bfbebSnyanmisaka RK_U32 ver_stride = syn->pp.ver_stride ? syn->pp.ver_stride : syn->pp.pic_height;
1210*437bfbebSnyanmisaka RK_U32 frame_size = hor_stride * ver_stride;
1211*437bfbebSnyanmisaka RK_U32 u_offset = 0, v_offset = 0;
1212*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
1213*437bfbebSnyanmisaka
1214*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_FBC(mpp_frame_get_fmt(task->frame))) {
1215*437bfbebSnyanmisaka mpp_err("VEPU_510 unsupports FBC format input.\n");
1216*437bfbebSnyanmisaka
1217*437bfbebSnyanmisaka ret = MPP_NOK;
1218*437bfbebSnyanmisaka } else {
1219*437bfbebSnyanmisaka switch (input_fmt) {
1220*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420P: {
1221*437bfbebSnyanmisaka u_offset = frame_size;
1222*437bfbebSnyanmisaka v_offset = frame_size * 5 / 4;
1223*437bfbebSnyanmisaka } break;
1224*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420SP:
1225*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422SP: {
1226*437bfbebSnyanmisaka u_offset = frame_size;
1227*437bfbebSnyanmisaka v_offset = frame_size;
1228*437bfbebSnyanmisaka } break;
1229*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422P: {
1230*437bfbebSnyanmisaka u_offset = frame_size;
1231*437bfbebSnyanmisaka v_offset = frame_size * 3 / 2;
1232*437bfbebSnyanmisaka } break;
1233*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV400:
1234*437bfbebSnyanmisaka case VEPU5xx_FMT_YUYV422:
1235*437bfbebSnyanmisaka case VEPU5xx_FMT_UYVY422: {
1236*437bfbebSnyanmisaka u_offset = 0;
1237*437bfbebSnyanmisaka v_offset = 0;
1238*437bfbebSnyanmisaka } break;
1239*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR565:
1240*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR888:
1241*437bfbebSnyanmisaka case VEPU5xx_FMT_BGRA8888: {
1242*437bfbebSnyanmisaka u_offset = 0;
1243*437bfbebSnyanmisaka v_offset = 0;
1244*437bfbebSnyanmisaka } break;
1245*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV444SP : {
1246*437bfbebSnyanmisaka u_offset = hor_stride * ver_stride;
1247*437bfbebSnyanmisaka v_offset = hor_stride * ver_stride;
1248*437bfbebSnyanmisaka } break;
1249*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV444P : {
1250*437bfbebSnyanmisaka u_offset = hor_stride * ver_stride;
1251*437bfbebSnyanmisaka v_offset = hor_stride * ver_stride * 2;
1252*437bfbebSnyanmisaka } break;
1253*437bfbebSnyanmisaka default: {
1254*437bfbebSnyanmisaka hal_h265e_err("unknown color space: %d\n", input_fmt);
1255*437bfbebSnyanmisaka u_offset = frame_size;
1256*437bfbebSnyanmisaka v_offset = frame_size * 5 / 4;
1257*437bfbebSnyanmisaka }
1258*437bfbebSnyanmisaka }
1259*437bfbebSnyanmisaka }
1260*437bfbebSnyanmisaka mpp_dev_multi_offset_update(offsets, 161, u_offset);
1261*437bfbebSnyanmisaka mpp_dev_multi_offset_update(offsets, 162, v_offset);
1262*437bfbebSnyanmisaka
1263*437bfbebSnyanmisaka return ret;
1264*437bfbebSnyanmisaka }
1265*437bfbebSnyanmisaka
1266*437bfbebSnyanmisaka
1267*437bfbebSnyanmisaka #if 0
1268*437bfbebSnyanmisaka static MPP_RET vepu510_h265_set_roi_regs(H265eV510HalContext *ctx, H265eVepu510Frame *regs)
1269*437bfbebSnyanmisaka {
1270*437bfbebSnyanmisaka /* memset register on start so do not clear registers again here */
1271*437bfbebSnyanmisaka if (ctx->roi_data) {
1272*437bfbebSnyanmisaka /* roi setup */
1273*437bfbebSnyanmisaka MppEncROICfg2 *cfg = ( MppEncROICfg2 *)ctx->roi_data;
1274*437bfbebSnyanmisaka
1275*437bfbebSnyanmisaka regs->reg0192_enc_pic.roi_en = 1;
1276*437bfbebSnyanmisaka regs->reg0178_roi_addr = mpp_dev_get_iova_address(ctx->dev, cfg->base_cfg_buf, 0);
1277*437bfbebSnyanmisaka if (cfg->roi_qp_en) {
1278*437bfbebSnyanmisaka regs->reg0179_roi_qp_addr = mpp_dev_get_iova_address(ctx->dev, cfg->qp_cfg_buf, 0);
1279*437bfbebSnyanmisaka regs->reg0228_roi_en.roi_qp_en = 1;
1280*437bfbebSnyanmisaka }
1281*437bfbebSnyanmisaka
1282*437bfbebSnyanmisaka if (cfg->roi_amv_en) {
1283*437bfbebSnyanmisaka regs->reg0180_roi_amv_addr = mpp_dev_get_iova_address(ctx->dev, cfg->amv_cfg_buf, 0);
1284*437bfbebSnyanmisaka regs->reg0228_roi_en.roi_amv_en = 1;
1285*437bfbebSnyanmisaka }
1286*437bfbebSnyanmisaka
1287*437bfbebSnyanmisaka if (cfg->roi_mv_en) {
1288*437bfbebSnyanmisaka regs->reg0181_roi_mv_addr = mpp_dev_get_iova_address(ctx->dev, cfg->mv_cfg_buf, 0);
1289*437bfbebSnyanmisaka regs->reg0228_roi_en.roi_mv_en = 1;
1290*437bfbebSnyanmisaka }
1291*437bfbebSnyanmisaka }
1292*437bfbebSnyanmisaka
1293*437bfbebSnyanmisaka return MPP_OK;
1294*437bfbebSnyanmisaka }
1295*437bfbebSnyanmisaka #endif
1296*437bfbebSnyanmisaka
vepu510_h265_set_rc_regs(H265eV510HalContext * ctx,H265eV510RegSet * regs,HalEncTask * task)1297*437bfbebSnyanmisaka static MPP_RET vepu510_h265_set_rc_regs(H265eV510HalContext *ctx, H265eV510RegSet *regs, HalEncTask *task)
1298*437bfbebSnyanmisaka {
1299*437bfbebSnyanmisaka H265eSyntax_new *syn = ctx->syn;
1300*437bfbebSnyanmisaka EncRcTaskInfo *rc_cfg = &task->rc_task->info;
1301*437bfbebSnyanmisaka H265eVepu510Frame *reg_frm = ®s->reg_frm;
1302*437bfbebSnyanmisaka Vepu510RcRoi *reg_rc = ®s->reg_rc_roi;
1303*437bfbebSnyanmisaka MppEncCfgSet *cfg = ctx->cfg;
1304*437bfbebSnyanmisaka MppEncRcCfg *rc = &cfg->rc;
1305*437bfbebSnyanmisaka MppEncHwCfg *hw = &cfg->hw;
1306*437bfbebSnyanmisaka MppEncH265Cfg *h265 = &cfg->h265;
1307*437bfbebSnyanmisaka RK_S32 mb_wd32 = (syn->pp.pic_width + 31) / 32;
1308*437bfbebSnyanmisaka RK_S32 mb_h32 = (syn->pp.pic_height + 31) / 32;
1309*437bfbebSnyanmisaka
1310*437bfbebSnyanmisaka RK_U32 ctu_target_bits_mul_16 = (rc_cfg->bit_target << 4) / (mb_wd32 * mb_h32);
1311*437bfbebSnyanmisaka RK_U32 ctu_target_bits;
1312*437bfbebSnyanmisaka RK_S32 negative_bits_thd, positive_bits_thd;
1313*437bfbebSnyanmisaka
1314*437bfbebSnyanmisaka if (rc->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
1315*437bfbebSnyanmisaka reg_frm->common.enc_pic.pic_qp = rc_cfg->quality_target;
1316*437bfbebSnyanmisaka reg_frm->synt_sli1.sli_qp = rc_cfg->quality_target;
1317*437bfbebSnyanmisaka reg_frm->common.rc_qp.rc_max_qp = rc_cfg->quality_target;
1318*437bfbebSnyanmisaka reg_frm->common.rc_qp.rc_min_qp = rc_cfg->quality_target;
1319*437bfbebSnyanmisaka } else {
1320*437bfbebSnyanmisaka if (ctu_target_bits_mul_16 >= 0x100000) {
1321*437bfbebSnyanmisaka ctu_target_bits_mul_16 = 0x50000;
1322*437bfbebSnyanmisaka }
1323*437bfbebSnyanmisaka ctu_target_bits = (ctu_target_bits_mul_16 * mb_wd32) >> 4;
1324*437bfbebSnyanmisaka negative_bits_thd = 0 - 5 * ctu_target_bits / 16;
1325*437bfbebSnyanmisaka positive_bits_thd = 5 * ctu_target_bits / 16;
1326*437bfbebSnyanmisaka
1327*437bfbebSnyanmisaka reg_frm->common.enc_pic.pic_qp = rc_cfg->quality_target;
1328*437bfbebSnyanmisaka reg_frm->synt_sli1.sli_qp = rc_cfg->quality_target;
1329*437bfbebSnyanmisaka reg_frm->common.rc_cfg.rc_en = 1;
1330*437bfbebSnyanmisaka reg_frm->common.rc_cfg.aq_en = 1;
1331*437bfbebSnyanmisaka reg_frm->common.rc_cfg.rc_ctu_num = mb_wd32;
1332*437bfbebSnyanmisaka
1333*437bfbebSnyanmisaka reg_frm->common.rc_qp.rc_max_qp = rc_cfg->quality_max;
1334*437bfbebSnyanmisaka reg_frm->common.rc_qp.rc_min_qp = rc_cfg->quality_min;
1335*437bfbebSnyanmisaka reg_frm->common.rc_tgt.ctu_ebit = ctu_target_bits_mul_16;
1336*437bfbebSnyanmisaka
1337*437bfbebSnyanmisaka if (ctx->smart_en || ctx->sp_enc_en) {
1338*437bfbebSnyanmisaka reg_frm->common.rc_qp.rc_qp_range = 0;
1339*437bfbebSnyanmisaka } else {
1340*437bfbebSnyanmisaka reg_frm->common.rc_qp.rc_qp_range = (ctx->frame_type == INTRA_FRAME) ?
1341*437bfbebSnyanmisaka hw->qp_delta_row_i : hw->qp_delta_row;
1342*437bfbebSnyanmisaka }
1343*437bfbebSnyanmisaka
1344*437bfbebSnyanmisaka {
1345*437bfbebSnyanmisaka /* fixed frame qp */
1346*437bfbebSnyanmisaka RK_S32 fqp_min, fqp_max;
1347*437bfbebSnyanmisaka
1348*437bfbebSnyanmisaka if (ctx->frame_type == INTRA_FRAME) {
1349*437bfbebSnyanmisaka fqp_min = rc->fqp_min_i;
1350*437bfbebSnyanmisaka fqp_max = rc->fqp_max_i;
1351*437bfbebSnyanmisaka } else {
1352*437bfbebSnyanmisaka fqp_min = rc->fqp_min_p;
1353*437bfbebSnyanmisaka fqp_max = rc->fqp_max_p;
1354*437bfbebSnyanmisaka }
1355*437bfbebSnyanmisaka
1356*437bfbebSnyanmisaka if ((fqp_min == fqp_max) && (fqp_min >= 0) && (fqp_max <= 51)) {
1357*437bfbebSnyanmisaka reg_frm->common.enc_pic.pic_qp = fqp_min;
1358*437bfbebSnyanmisaka reg_frm->synt_sli1.sli_qp = fqp_min;
1359*437bfbebSnyanmisaka reg_frm->common.rc_qp.rc_qp_range = 0;
1360*437bfbebSnyanmisaka }
1361*437bfbebSnyanmisaka }
1362*437bfbebSnyanmisaka
1363*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[0] = 2 * negative_bits_thd;
1364*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[1] = negative_bits_thd;
1365*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[2] = positive_bits_thd;
1366*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[3] = 2 * positive_bits_thd;
1367*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[4] = 0x7FFFFFFF;
1368*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[5] = 0x7FFFFFFF;
1369*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[6] = 0x7FFFFFFF;
1370*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[7] = 0x7FFFFFFF;
1371*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[8] = 0x7FFFFFFF;
1372*437bfbebSnyanmisaka
1373*437bfbebSnyanmisaka reg_rc->rc_adj0.qp_adj0 = -2;
1374*437bfbebSnyanmisaka reg_rc->rc_adj0.qp_adj1 = -1;
1375*437bfbebSnyanmisaka reg_rc->rc_adj0.qp_adj2 = 0;
1376*437bfbebSnyanmisaka reg_rc->rc_adj0.qp_adj3 = 1;
1377*437bfbebSnyanmisaka reg_rc->rc_adj0.qp_adj4 = 2;
1378*437bfbebSnyanmisaka reg_rc->rc_adj1.qp_adj5 = 0;
1379*437bfbebSnyanmisaka reg_rc->rc_adj1.qp_adj6 = 0;
1380*437bfbebSnyanmisaka reg_rc->rc_adj1.qp_adj7 = 0;
1381*437bfbebSnyanmisaka reg_rc->rc_adj1.qp_adj8 = 0;
1382*437bfbebSnyanmisaka }
1383*437bfbebSnyanmisaka
1384*437bfbebSnyanmisaka reg_rc->roi_qthd0.qpmin_area0 = h265->qpmin_map[0] > 0 ? h265->qpmin_map[0] : rc_cfg->quality_min;
1385*437bfbebSnyanmisaka reg_rc->roi_qthd0.qpmax_area0 = h265->qpmax_map[0] > 0 ? h265->qpmax_map[0] : rc_cfg->quality_max;
1386*437bfbebSnyanmisaka reg_rc->roi_qthd0.qpmin_area1 = h265->qpmin_map[1] > 0 ? h265->qpmin_map[1] : rc_cfg->quality_min;
1387*437bfbebSnyanmisaka reg_rc->roi_qthd0.qpmax_area1 = h265->qpmax_map[1] > 0 ? h265->qpmax_map[1] : rc_cfg->quality_max;
1388*437bfbebSnyanmisaka reg_rc->roi_qthd0.qpmin_area2 = h265->qpmin_map[2] > 0 ? h265->qpmin_map[2] : rc_cfg->quality_min;
1389*437bfbebSnyanmisaka reg_rc->roi_qthd1.qpmax_area2 = h265->qpmax_map[2] > 0 ? h265->qpmax_map[2] : rc_cfg->quality_max;
1390*437bfbebSnyanmisaka reg_rc->roi_qthd1.qpmin_area3 = h265->qpmin_map[3] > 0 ? h265->qpmin_map[3] : rc_cfg->quality_min;
1391*437bfbebSnyanmisaka reg_rc->roi_qthd1.qpmax_area3 = h265->qpmax_map[3] > 0 ? h265->qpmax_map[3] : rc_cfg->quality_max;
1392*437bfbebSnyanmisaka reg_rc->roi_qthd1.qpmin_area4 = h265->qpmin_map[4] > 0 ? h265->qpmin_map[4] : rc_cfg->quality_min;
1393*437bfbebSnyanmisaka reg_rc->roi_qthd1.qpmax_area4 = h265->qpmax_map[4] > 0 ? h265->qpmax_map[4] : rc_cfg->quality_max;
1394*437bfbebSnyanmisaka reg_rc->roi_qthd2.qpmin_area5 = h265->qpmin_map[5] > 0 ? h265->qpmin_map[5] : rc_cfg->quality_min;
1395*437bfbebSnyanmisaka reg_rc->roi_qthd2.qpmax_area5 = h265->qpmax_map[5] > 0 ? h265->qpmax_map[5] : rc_cfg->quality_max;
1396*437bfbebSnyanmisaka reg_rc->roi_qthd2.qpmin_area6 = h265->qpmin_map[6] > 0 ? h265->qpmin_map[6] : rc_cfg->quality_min;
1397*437bfbebSnyanmisaka reg_rc->roi_qthd2.qpmax_area6 = h265->qpmax_map[6] > 0 ? h265->qpmax_map[6] : rc_cfg->quality_max;
1398*437bfbebSnyanmisaka reg_rc->roi_qthd2.qpmin_area7 = h265->qpmin_map[7] > 0 ? h265->qpmin_map[7] : rc_cfg->quality_min;
1399*437bfbebSnyanmisaka reg_rc->roi_qthd3.qpmax_area7 = h265->qpmax_map[7] > 0 ? h265->qpmax_map[7] : rc_cfg->quality_max;
1400*437bfbebSnyanmisaka reg_rc->roi_qthd3.qpmap_mode = h265->qpmap_mode;
1401*437bfbebSnyanmisaka
1402*437bfbebSnyanmisaka return MPP_OK;
1403*437bfbebSnyanmisaka }
1404*437bfbebSnyanmisaka
vepu510_h265_set_pp_regs(H265eV510RegSet * regs,VepuFmtCfg * fmt,MppEncPrepCfg * prep_cfg)1405*437bfbebSnyanmisaka static MPP_RET vepu510_h265_set_pp_regs(H265eV510RegSet *regs, VepuFmtCfg *fmt, MppEncPrepCfg *prep_cfg)
1406*437bfbebSnyanmisaka {
1407*437bfbebSnyanmisaka Vepu510ControlCfg *reg_ctl = ®s->reg_ctl;
1408*437bfbebSnyanmisaka H265eVepu510Frame *reg_frm = ®s->reg_frm;
1409*437bfbebSnyanmisaka RK_S32 stridey = 0;
1410*437bfbebSnyanmisaka RK_S32 stridec = 0;
1411*437bfbebSnyanmisaka
1412*437bfbebSnyanmisaka reg_ctl->dtrns_map.src_bus_edin = fmt->src_endian;
1413*437bfbebSnyanmisaka reg_frm->common.src_fmt.src_cfmt = fmt->format;
1414*437bfbebSnyanmisaka reg_frm->common.src_fmt.alpha_swap = fmt->alpha_swap;
1415*437bfbebSnyanmisaka reg_frm->common.src_fmt.rbuv_swap = fmt->rbuv_swap;
1416*437bfbebSnyanmisaka
1417*437bfbebSnyanmisaka reg_frm->common.src_fmt.out_fmt = ((prep_cfg->format & MPP_FRAME_FMT_MASK) == MPP_FMT_YUV400) ? 0 : 1;
1418*437bfbebSnyanmisaka
1419*437bfbebSnyanmisaka reg_frm->common.src_proc.src_mirr = prep_cfg->mirroring > 0;
1420*437bfbebSnyanmisaka reg_frm->common.src_proc.src_rot = prep_cfg->rotation;
1421*437bfbebSnyanmisaka reg_frm->common.src_proc.tile4x4_en = 0;
1422*437bfbebSnyanmisaka
1423*437bfbebSnyanmisaka if (prep_cfg->hor_stride) {
1424*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_TILE(prep_cfg->format)) {
1425*437bfbebSnyanmisaka reg_frm->common.src_proc.tile4x4_en = 1;
1426*437bfbebSnyanmisaka
1427*437bfbebSnyanmisaka switch (prep_cfg->format & MPP_FRAME_FMT_MASK) {
1428*437bfbebSnyanmisaka case MPP_FMT_YUV400:
1429*437bfbebSnyanmisaka stridey = prep_cfg->hor_stride * 4;
1430*437bfbebSnyanmisaka break;
1431*437bfbebSnyanmisaka case MPP_FMT_YUV420P:
1432*437bfbebSnyanmisaka case MPP_FMT_YUV420SP:
1433*437bfbebSnyanmisaka stridey = prep_cfg->hor_stride * 4 * 3 / 2;
1434*437bfbebSnyanmisaka break;
1435*437bfbebSnyanmisaka case MPP_FMT_YUV422P:
1436*437bfbebSnyanmisaka case MPP_FMT_YUV422SP:
1437*437bfbebSnyanmisaka stridey = prep_cfg->hor_stride * 4 * 2;
1438*437bfbebSnyanmisaka break;
1439*437bfbebSnyanmisaka case MPP_FMT_YUV444P:
1440*437bfbebSnyanmisaka case MPP_FMT_YUV444SP:
1441*437bfbebSnyanmisaka stridey = prep_cfg->hor_stride * 4 * 3;
1442*437bfbebSnyanmisaka break;
1443*437bfbebSnyanmisaka default:
1444*437bfbebSnyanmisaka mpp_err("Unsupported input format 0x%08x, with TILE mask.\n", fmt);
1445*437bfbebSnyanmisaka return MPP_ERR_VALUE;
1446*437bfbebSnyanmisaka break;
1447*437bfbebSnyanmisaka }
1448*437bfbebSnyanmisaka } else {
1449*437bfbebSnyanmisaka stridey = prep_cfg->hor_stride;
1450*437bfbebSnyanmisaka }
1451*437bfbebSnyanmisaka } else {
1452*437bfbebSnyanmisaka if (reg_frm->common.src_fmt.src_cfmt == VEPU5xx_FMT_BGRA8888)
1453*437bfbebSnyanmisaka stridey = prep_cfg->width * 4;
1454*437bfbebSnyanmisaka else if (reg_frm->common.src_fmt.src_cfmt == VEPU5xx_FMT_BGR888)
1455*437bfbebSnyanmisaka stridey = prep_cfg->width * 3;
1456*437bfbebSnyanmisaka else if (reg_frm->common.src_fmt.src_cfmt == VEPU5xx_FMT_BGR565 ||
1457*437bfbebSnyanmisaka reg_frm->common.src_fmt.src_cfmt == VEPU5xx_FMT_YUYV422 ||
1458*437bfbebSnyanmisaka reg_frm->common.src_fmt.src_cfmt == VEPU5xx_FMT_UYVY422)
1459*437bfbebSnyanmisaka stridey = prep_cfg->width * 2;
1460*437bfbebSnyanmisaka }
1461*437bfbebSnyanmisaka
1462*437bfbebSnyanmisaka stridec = (reg_frm->common.src_fmt.src_cfmt == VEPU5xx_FMT_YUV420SP ||
1463*437bfbebSnyanmisaka reg_frm->common.src_fmt.src_cfmt == VEPU5xx_FMT_YUV422SP ||
1464*437bfbebSnyanmisaka reg_frm->common.src_fmt.src_cfmt == VEPU5xx_FMT_YUV444P) ?
1465*437bfbebSnyanmisaka stridey : stridey / 2;
1466*437bfbebSnyanmisaka
1467*437bfbebSnyanmisaka if (reg_frm->common.src_fmt.src_cfmt == VEPU5xx_FMT_YUV444SP)
1468*437bfbebSnyanmisaka stridec = stridey * 2;
1469*437bfbebSnyanmisaka
1470*437bfbebSnyanmisaka if (reg_frm->common.src_fmt.src_cfmt < VEPU5xx_FMT_ARGB1555) {
1471*437bfbebSnyanmisaka const VepuRgb2YuvCfg *cfg_coeffs = cfg_coeffs = get_rgb2yuv_cfg(prep_cfg->range, prep_cfg->color);
1472*437bfbebSnyanmisaka
1473*437bfbebSnyanmisaka hal_h265e_dbg_simple("input color range %d colorspace %d", prep_cfg->range, prep_cfg->color);
1474*437bfbebSnyanmisaka
1475*437bfbebSnyanmisaka reg_frm->common.src_udfy.csc_wgt_r2y = cfg_coeffs->_2y.r_coeff;
1476*437bfbebSnyanmisaka reg_frm->common.src_udfy.csc_wgt_g2y = cfg_coeffs->_2y.g_coeff;
1477*437bfbebSnyanmisaka reg_frm->common.src_udfy.csc_wgt_b2y = cfg_coeffs->_2y.b_coeff;
1478*437bfbebSnyanmisaka
1479*437bfbebSnyanmisaka reg_frm->common.src_udfu.csc_wgt_r2u = cfg_coeffs->_2u.r_coeff;
1480*437bfbebSnyanmisaka reg_frm->common.src_udfu.csc_wgt_g2u = cfg_coeffs->_2u.g_coeff;
1481*437bfbebSnyanmisaka reg_frm->common.src_udfu.csc_wgt_b2u = cfg_coeffs->_2u.b_coeff;
1482*437bfbebSnyanmisaka
1483*437bfbebSnyanmisaka reg_frm->common.src_udfv.csc_wgt_r2v = cfg_coeffs->_2v.r_coeff;
1484*437bfbebSnyanmisaka reg_frm->common.src_udfv.csc_wgt_g2v = cfg_coeffs->_2v.g_coeff;
1485*437bfbebSnyanmisaka reg_frm->common.src_udfv.csc_wgt_b2v = cfg_coeffs->_2v.b_coeff;
1486*437bfbebSnyanmisaka
1487*437bfbebSnyanmisaka reg_frm->common.src_udfo.csc_ofst_y = cfg_coeffs->_2y.offset;
1488*437bfbebSnyanmisaka reg_frm->common.src_udfo.csc_ofst_u = cfg_coeffs->_2u.offset;
1489*437bfbebSnyanmisaka reg_frm->common.src_udfo.csc_ofst_v = cfg_coeffs->_2v.offset;
1490*437bfbebSnyanmisaka
1491*437bfbebSnyanmisaka hal_h265e_dbg_simple("use color range %d colorspace %d", cfg_coeffs->dst_range, cfg_coeffs->color);
1492*437bfbebSnyanmisaka }
1493*437bfbebSnyanmisaka
1494*437bfbebSnyanmisaka reg_frm->common.src_strd0.src_strd0 = stridey;
1495*437bfbebSnyanmisaka reg_frm->common.src_strd1.src_strd1 = stridec;
1496*437bfbebSnyanmisaka
1497*437bfbebSnyanmisaka return MPP_OK;
1498*437bfbebSnyanmisaka }
1499*437bfbebSnyanmisaka
vepu510_h265_set_slice_regs(H265eSyntax_new * syn,H265eVepu510Frame * regs)1500*437bfbebSnyanmisaka static void vepu510_h265_set_slice_regs(H265eSyntax_new *syn, H265eVepu510Frame *regs)
1501*437bfbebSnyanmisaka {
1502*437bfbebSnyanmisaka regs->synt_sps.smpl_adpt_ofst_e = syn->pp.sample_adaptive_offset_enabled_flag;
1503*437bfbebSnyanmisaka regs->synt_sps.num_st_ref_pic = syn->pp.num_short_term_ref_pic_sets;
1504*437bfbebSnyanmisaka regs->synt_sps.num_lt_ref_pic = syn->pp.num_long_term_ref_pics_sps;
1505*437bfbebSnyanmisaka regs->synt_sps.lt_ref_pic_prsnt = syn->pp.long_term_ref_pics_present_flag;
1506*437bfbebSnyanmisaka regs->synt_sps.tmpl_mvp_e = syn->pp.sps_temporal_mvp_enabled_flag;
1507*437bfbebSnyanmisaka regs->synt_sps.log2_max_poc_lsb = syn->pp.log2_max_pic_order_cnt_lsb_minus4;
1508*437bfbebSnyanmisaka regs->synt_sps.strg_intra_smth = syn->pp.strong_intra_smoothing_enabled_flag;
1509*437bfbebSnyanmisaka
1510*437bfbebSnyanmisaka regs->synt_pps.dpdnt_sli_seg_en = syn->pp.dependent_slice_segments_enabled_flag;
1511*437bfbebSnyanmisaka regs->synt_pps.out_flg_prsnt_flg = syn->pp.output_flag_present_flag;
1512*437bfbebSnyanmisaka regs->synt_pps.num_extr_sli_hdr = syn->pp.num_extra_slice_header_bits;
1513*437bfbebSnyanmisaka regs->synt_pps.sgn_dat_hid_en = syn->pp.sign_data_hiding_enabled_flag;
1514*437bfbebSnyanmisaka regs->synt_pps.cbc_init_prsnt_flg = syn->pp.cabac_init_present_flag;
1515*437bfbebSnyanmisaka regs->synt_pps.pic_init_qp = syn->pp.init_qp_minus26 + 26;
1516*437bfbebSnyanmisaka regs->synt_pps.cu_qp_dlt_en = syn->pp.cu_qp_delta_enabled_flag;
1517*437bfbebSnyanmisaka regs->synt_pps.chrm_qp_ofst_prsn = syn->pp.pps_slice_chroma_qp_offsets_present_flag;
1518*437bfbebSnyanmisaka regs->synt_pps.lp_fltr_acrs_sli = syn->pp.pps_loop_filter_across_slices_enabled_flag;
1519*437bfbebSnyanmisaka regs->synt_pps.dblk_fltr_ovrd_en = syn->pp.deblocking_filter_override_enabled_flag;
1520*437bfbebSnyanmisaka regs->synt_pps.lst_mdfy_prsnt_flg = syn->pp.lists_modification_present_flag;
1521*437bfbebSnyanmisaka regs->synt_pps.sli_seg_hdr_extn = syn->pp.slice_segment_header_extension_present_flag;
1522*437bfbebSnyanmisaka regs->synt_pps.cu_qp_dlt_depth = syn->pp.diff_cu_qp_delta_depth;
1523*437bfbebSnyanmisaka regs->synt_pps.lpf_fltr_acrs_til = syn->pp.loop_filter_across_tiles_enabled_flag;
1524*437bfbebSnyanmisaka regs->synt_pps.csip_flag = syn->pp.constrained_intra_pred_flag;
1525*437bfbebSnyanmisaka
1526*437bfbebSnyanmisaka regs->synt_sli0.cbc_init_flg = syn->sp.cbc_init_flg;
1527*437bfbebSnyanmisaka regs->synt_sli0.mvd_l1_zero_flg = syn->sp.mvd_l1_zero_flg;
1528*437bfbebSnyanmisaka regs->synt_sli0.ref_pic_lst_mdf_l0 = syn->sp.ref_pic_lst_mdf_l0;
1529*437bfbebSnyanmisaka regs->synt_sli0.num_refidx_l1_act = syn->sp.num_refidx_l1_act;
1530*437bfbebSnyanmisaka regs->synt_sli0.num_refidx_l0_act = syn->sp.num_refidx_l0_act;
1531*437bfbebSnyanmisaka
1532*437bfbebSnyanmisaka regs->synt_sli0.num_refidx_act_ovrd = syn->sp.num_refidx_act_ovrd;
1533*437bfbebSnyanmisaka
1534*437bfbebSnyanmisaka regs->synt_sli0.sli_sao_chrm_flg = syn->sp.sli_sao_chrm_flg;
1535*437bfbebSnyanmisaka regs->synt_sli0.sli_sao_luma_flg = syn->sp.sli_sao_luma_flg;
1536*437bfbebSnyanmisaka regs->synt_sli0.sli_tmprl_mvp_e = syn->sp.sli_tmprl_mvp_en;
1537*437bfbebSnyanmisaka regs->common.enc_pic.num_pic_tot_cur_hevc = syn->sp.tot_poc_num;
1538*437bfbebSnyanmisaka
1539*437bfbebSnyanmisaka regs->synt_sli0.pic_out_flg = syn->sp.pic_out_flg;
1540*437bfbebSnyanmisaka regs->synt_sli0.sli_type = syn->sp.slice_type;
1541*437bfbebSnyanmisaka regs->synt_sli0.sli_rsrv_flg = syn->sp.slice_rsrv_flg;
1542*437bfbebSnyanmisaka regs->synt_sli0.dpdnt_sli_seg_flg = syn->sp.dpdnt_sli_seg_flg;
1543*437bfbebSnyanmisaka regs->synt_sli0.sli_pps_id = syn->sp.sli_pps_id;
1544*437bfbebSnyanmisaka regs->synt_sli0.no_out_pri_pic = syn->sp.no_out_pri_pic;
1545*437bfbebSnyanmisaka
1546*437bfbebSnyanmisaka regs->synt_sli1.sp_tc_ofst_div2 = syn->sp.sli_tc_ofst_div2;;
1547*437bfbebSnyanmisaka regs->synt_sli1.sp_beta_ofst_div2 = syn->sp.sli_beta_ofst_div2;
1548*437bfbebSnyanmisaka regs->synt_sli1.sli_lp_fltr_acrs_sli = syn->sp.sli_lp_fltr_acrs_sli;
1549*437bfbebSnyanmisaka regs->synt_sli1.sp_dblk_fltr_dis = syn->sp.sli_dblk_fltr_dis;
1550*437bfbebSnyanmisaka regs->synt_sli1.dblk_fltr_ovrd_flg = syn->sp.dblk_fltr_ovrd_flg;
1551*437bfbebSnyanmisaka regs->synt_sli1.sli_cb_qp_ofst = syn->sp.sli_cb_qp_ofst;
1552*437bfbebSnyanmisaka regs->synt_sli1.max_mrg_cnd = 3;//syn->sp.max_mrg_cnd;
1553*437bfbebSnyanmisaka
1554*437bfbebSnyanmisaka regs->synt_sli1.col_ref_idx = syn->sp.col_ref_idx;
1555*437bfbebSnyanmisaka regs->synt_sli1.col_frm_l0_flg = syn->sp.col_frm_l0_flg;
1556*437bfbebSnyanmisaka regs->synt_sli2.sli_poc_lsb = syn->sp.sli_poc_lsb;
1557*437bfbebSnyanmisaka regs->synt_sli2.sli_hdr_ext_len = syn->sp.sli_hdr_ext_len;
1558*437bfbebSnyanmisaka }
1559*437bfbebSnyanmisaka
vepu510_h265_set_ref_regs(H265eSyntax_new * syn,H265eVepu510Frame * regs)1560*437bfbebSnyanmisaka static void vepu510_h265_set_ref_regs(H265eSyntax_new *syn, H265eVepu510Frame *regs)
1561*437bfbebSnyanmisaka {
1562*437bfbebSnyanmisaka regs->synt_refm0.st_ref_pic_flg = syn->sp.st_ref_pic_flg;
1563*437bfbebSnyanmisaka regs->synt_refm0.poc_lsb_lt0 = syn->sp.poc_lsb_lt0;
1564*437bfbebSnyanmisaka regs->synt_refm0.num_lt_pic = syn->sp.num_lt_pic;
1565*437bfbebSnyanmisaka
1566*437bfbebSnyanmisaka regs->synt_refm1.dlt_poc_msb_prsnt0 = syn->sp.dlt_poc_msb_prsnt0;
1567*437bfbebSnyanmisaka regs->synt_refm1.dlt_poc_msb_cycl0 = syn->sp.dlt_poc_msb_cycl0;
1568*437bfbebSnyanmisaka regs->synt_refm1.used_by_lt_flg0 = syn->sp.used_by_lt_flg0;
1569*437bfbebSnyanmisaka regs->synt_refm1.used_by_lt_flg1 = syn->sp.used_by_lt_flg1;
1570*437bfbebSnyanmisaka regs->synt_refm1.used_by_lt_flg2 = syn->sp.used_by_lt_flg2;
1571*437bfbebSnyanmisaka regs->synt_refm1.dlt_poc_msb_prsnt0 = syn->sp.dlt_poc_msb_prsnt0;
1572*437bfbebSnyanmisaka regs->synt_refm1.dlt_poc_msb_cycl0 = syn->sp.dlt_poc_msb_cycl0;
1573*437bfbebSnyanmisaka regs->synt_refm1.dlt_poc_msb_prsnt1 = syn->sp.dlt_poc_msb_prsnt1;
1574*437bfbebSnyanmisaka regs->synt_refm1.num_negative_pics = syn->sp.num_neg_pic;
1575*437bfbebSnyanmisaka regs->synt_refm1.num_pos_pic = syn->sp.num_pos_pic;
1576*437bfbebSnyanmisaka
1577*437bfbebSnyanmisaka regs->synt_refm1.used_by_s0_flg = syn->sp.used_by_s0_flg;
1578*437bfbebSnyanmisaka regs->synt_refm2.dlt_poc_s0_m10 = syn->sp.dlt_poc_s0_m10;
1579*437bfbebSnyanmisaka regs->synt_refm2.dlt_poc_s0_m11 = syn->sp.dlt_poc_s0_m11;
1580*437bfbebSnyanmisaka regs->synt_refm3.dlt_poc_s0_m12 = syn->sp.dlt_poc_s0_m12;
1581*437bfbebSnyanmisaka regs->synt_refm3.dlt_poc_s0_m13 = syn->sp.dlt_poc_s0_m13;
1582*437bfbebSnyanmisaka
1583*437bfbebSnyanmisaka regs->synt_long_refm0.poc_lsb_lt1 = syn->sp.poc_lsb_lt1;
1584*437bfbebSnyanmisaka regs->synt_long_refm1.dlt_poc_msb_cycl1 = syn->sp.dlt_poc_msb_cycl1;
1585*437bfbebSnyanmisaka regs->synt_long_refm0.poc_lsb_lt2 = syn->sp.poc_lsb_lt2;
1586*437bfbebSnyanmisaka regs->synt_refm1.dlt_poc_msb_prsnt2 = syn->sp.dlt_poc_msb_prsnt2;
1587*437bfbebSnyanmisaka regs->synt_long_refm1.dlt_poc_msb_cycl2 = syn->sp.dlt_poc_msb_cycl2;
1588*437bfbebSnyanmisaka regs->synt_sli1.lst_entry_l0 = syn->sp.lst_entry_l0;
1589*437bfbebSnyanmisaka regs->synt_sli0.ref_pic_lst_mdf_l0 = syn->sp.ref_pic_lst_mdf_l0;
1590*437bfbebSnyanmisaka }
1591*437bfbebSnyanmisaka
vepu510_h265_set_me_regs(H265eV510HalContext * ctx,H265eSyntax_new * syn,H265eVepu510Frame * regs)1592*437bfbebSnyanmisaka static void vepu510_h265_set_me_regs(H265eV510HalContext *ctx, H265eSyntax_new *syn, H265eVepu510Frame *regs)
1593*437bfbebSnyanmisaka {
1594*437bfbebSnyanmisaka regs->common.me_rnge.cime_srch_dwnh = 15;
1595*437bfbebSnyanmisaka regs->common.me_rnge.cime_srch_uph = 15;
1596*437bfbebSnyanmisaka regs->common.me_rnge.cime_srch_rgtw = 12;
1597*437bfbebSnyanmisaka regs->common.me_rnge.cime_srch_lftw = 12;
1598*437bfbebSnyanmisaka regs->common.me_cfg.rme_srch_h = 3;
1599*437bfbebSnyanmisaka regs->common.me_cfg.rme_srch_v = 3;
1600*437bfbebSnyanmisaka
1601*437bfbebSnyanmisaka regs->common.me_cfg.srgn_max_num = 54;
1602*437bfbebSnyanmisaka regs->common.me_cfg.cime_dist_thre = 1024;
1603*437bfbebSnyanmisaka regs->common.me_cfg.rme_dis = 0;
1604*437bfbebSnyanmisaka regs->common.me_cfg.fme_dis = 0;
1605*437bfbebSnyanmisaka regs->common.me_rnge.dlt_frm_num = 0x1;
1606*437bfbebSnyanmisaka
1607*437bfbebSnyanmisaka if (syn->pp.sps_temporal_mvp_enabled_flag &&
1608*437bfbebSnyanmisaka (ctx->frame_type != INTRA_FRAME)) {
1609*437bfbebSnyanmisaka if (ctx->last_frame_type == INTRA_FRAME) {
1610*437bfbebSnyanmisaka regs->common.me_cach.colmv_load_hevc = 0;
1611*437bfbebSnyanmisaka } else {
1612*437bfbebSnyanmisaka regs->common.me_cach.colmv_load_hevc = 1;
1613*437bfbebSnyanmisaka }
1614*437bfbebSnyanmisaka regs->common.me_cach.colmv_stor_hevc = 1;
1615*437bfbebSnyanmisaka }
1616*437bfbebSnyanmisaka
1617*437bfbebSnyanmisaka regs->common.me_cach.cime_zero_thre = (ctx->cfg->tune.scene_mode ==
1618*437bfbebSnyanmisaka MPP_ENC_SCENE_MODE_IPC) ? 1024 : 64;
1619*437bfbebSnyanmisaka regs->common.me_cach.fme_prefsu_en = 0;
1620*437bfbebSnyanmisaka }
1621*437bfbebSnyanmisaka
vepu510_h265_set_hw_address(H265eV510HalContext * ctx,H265eVepu510Frame * regs,HalEncTask * task)1622*437bfbebSnyanmisaka void vepu510_h265_set_hw_address(H265eV510HalContext *ctx, H265eVepu510Frame *regs, HalEncTask *task)
1623*437bfbebSnyanmisaka {
1624*437bfbebSnyanmisaka HalEncTask *enc_task = task;
1625*437bfbebSnyanmisaka HalBuf *recon_buf, *ref_buf;
1626*437bfbebSnyanmisaka MppBuffer md_info_buf = enc_task->md_info;
1627*437bfbebSnyanmisaka Vepu510H265eFrmCfg *frm = ctx->frm;
1628*437bfbebSnyanmisaka H265eSyntax_new *syn = ctx->syn;
1629*437bfbebSnyanmisaka
1630*437bfbebSnyanmisaka hal_h265e_enter();
1631*437bfbebSnyanmisaka
1632*437bfbebSnyanmisaka regs->common.adr_src0 = mpp_buffer_get_fd(enc_task->input);
1633*437bfbebSnyanmisaka regs->common.adr_src1 = regs->common.adr_src0;
1634*437bfbebSnyanmisaka regs->common.adr_src2 = regs->common.adr_src0;
1635*437bfbebSnyanmisaka
1636*437bfbebSnyanmisaka recon_buf = hal_bufs_get_buf(ctx->dpb_bufs, frm->hal_curr_idx);
1637*437bfbebSnyanmisaka ref_buf = hal_bufs_get_buf(ctx->dpb_bufs, frm->hal_refr_idx);
1638*437bfbebSnyanmisaka
1639*437bfbebSnyanmisaka if (!syn->sp.non_reference_flag) {
1640*437bfbebSnyanmisaka regs->common.rfpw_h_addr = mpp_buffer_get_fd(recon_buf->buf[0]);
1641*437bfbebSnyanmisaka regs->common.rfpw_b_addr = regs->common.rfpw_h_addr;
1642*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->reg_cfg, 164, ctx->fbc_header_len);
1643*437bfbebSnyanmisaka }
1644*437bfbebSnyanmisaka regs->common.rfpr_h_addr = mpp_buffer_get_fd(ref_buf->buf[0]);
1645*437bfbebSnyanmisaka regs->common.rfpr_b_addr = regs->common.rfpr_h_addr;
1646*437bfbebSnyanmisaka regs->common.colmvw_addr = mpp_buffer_get_fd(recon_buf->buf[2]);
1647*437bfbebSnyanmisaka regs->common.colmvr_addr = mpp_buffer_get_fd(ref_buf->buf[2]);
1648*437bfbebSnyanmisaka regs->common.dspw_addr = mpp_buffer_get_fd(recon_buf->buf[1]);
1649*437bfbebSnyanmisaka regs->common.dspr_addr = mpp_buffer_get_fd(ref_buf->buf[1]);
1650*437bfbebSnyanmisaka
1651*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->reg_cfg, 166, ctx->fbc_header_len);
1652*437bfbebSnyanmisaka
1653*437bfbebSnyanmisaka if (md_info_buf) {
1654*437bfbebSnyanmisaka regs->common.enc_pic.mei_stor = 1;
1655*437bfbebSnyanmisaka regs->common.meiw_addr = mpp_buffer_get_fd(md_info_buf);
1656*437bfbebSnyanmisaka } else {
1657*437bfbebSnyanmisaka regs->common.enc_pic.mei_stor = 0;
1658*437bfbebSnyanmisaka regs->common.meiw_addr = 0;
1659*437bfbebSnyanmisaka }
1660*437bfbebSnyanmisaka
1661*437bfbebSnyanmisaka regs->common.bsbt_addr = mpp_buffer_get_fd(enc_task->output);
1662*437bfbebSnyanmisaka /* TODO: stream size relative with syntax */
1663*437bfbebSnyanmisaka regs->common.bsbb_addr = regs->common.bsbt_addr;
1664*437bfbebSnyanmisaka regs->common.bsbr_addr = regs->common.bsbt_addr;
1665*437bfbebSnyanmisaka regs->common.adr_bsbs = regs->common.bsbt_addr;
1666*437bfbebSnyanmisaka
1667*437bfbebSnyanmisaka regs->common.rfpt_h_addr = 0xffffffff;
1668*437bfbebSnyanmisaka regs->common.rfpb_h_addr = 0;
1669*437bfbebSnyanmisaka regs->common.rfpt_b_addr = 0xffffffff;
1670*437bfbebSnyanmisaka regs->common.adr_rfpb_b = 0;
1671*437bfbebSnyanmisaka
1672*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->reg_cfg, 174, mpp_packet_get_length(task->packet));
1673*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->reg_cfg, 172, mpp_buffer_get_size(enc_task->output));
1674*437bfbebSnyanmisaka
1675*437bfbebSnyanmisaka regs->common.pic_ofst.pic_ofst_y = mpp_frame_get_offset_y(task->frame);
1676*437bfbebSnyanmisaka regs->common.pic_ofst.pic_ofst_x = mpp_frame_get_offset_x(task->frame);
1677*437bfbebSnyanmisaka
1678*437bfbebSnyanmisaka /* smear bufs */
1679*437bfbebSnyanmisaka regs->common.adr_smear_rd = mpp_buffer_get_fd(ref_buf->buf[3]);
1680*437bfbebSnyanmisaka regs->common.adr_smear_wr = mpp_buffer_get_fd(recon_buf->buf[3]);
1681*437bfbebSnyanmisaka }
1682*437bfbebSnyanmisaka
vepu510_h265e_save_pass1_patch(H265eV510RegSet * regs,H265eV510HalContext * ctx,RK_S32 tiles_enabled_flag)1683*437bfbebSnyanmisaka static MPP_RET vepu510_h265e_save_pass1_patch(H265eV510RegSet *regs, H265eV510HalContext *ctx,
1684*437bfbebSnyanmisaka RK_S32 tiles_enabled_flag)
1685*437bfbebSnyanmisaka {
1686*437bfbebSnyanmisaka H265eVepu510Frame *reg_frm = ®s->reg_frm;
1687*437bfbebSnyanmisaka RK_S32 width = ctx->cfg->prep.width;
1688*437bfbebSnyanmisaka RK_S32 height = ctx->cfg->prep.height;
1689*437bfbebSnyanmisaka RK_S32 width_align = MPP_ALIGN(width, 16);
1690*437bfbebSnyanmisaka RK_S32 height_align = MPP_ALIGN(height, 16);
1691*437bfbebSnyanmisaka
1692*437bfbebSnyanmisaka if (NULL == ctx->buf_pass1) {
1693*437bfbebSnyanmisaka mpp_buffer_get(NULL, &ctx->buf_pass1, width_align * height_align * 3 / 2);
1694*437bfbebSnyanmisaka if (!ctx->buf_pass1) {
1695*437bfbebSnyanmisaka mpp_err("buf_pass1 malloc fail, debreath invaild");
1696*437bfbebSnyanmisaka return MPP_NOK;
1697*437bfbebSnyanmisaka }
1698*437bfbebSnyanmisaka }
1699*437bfbebSnyanmisaka
1700*437bfbebSnyanmisaka reg_frm->common.enc_pic.cur_frm_ref = 1;
1701*437bfbebSnyanmisaka reg_frm->common.rfpw_h_addr = mpp_buffer_get_fd(ctx->buf_pass1);
1702*437bfbebSnyanmisaka reg_frm->common.rfpw_b_addr = reg_frm->common.rfpw_h_addr;
1703*437bfbebSnyanmisaka reg_frm->common.enc_pic.rec_fbc_dis = 1;
1704*437bfbebSnyanmisaka
1705*437bfbebSnyanmisaka if (tiles_enabled_flag)
1706*437bfbebSnyanmisaka reg_frm->synt_pps.lpf_fltr_acrs_til = 0;
1707*437bfbebSnyanmisaka
1708*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->reg_cfg, 164, 0);
1709*437bfbebSnyanmisaka
1710*437bfbebSnyanmisaka /* NOTE: disable split to avoid lowdelay slice output */
1711*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_splt = 0;
1712*437bfbebSnyanmisaka reg_frm->common.enc_pic.slen_fifo = 0;
1713*437bfbebSnyanmisaka
1714*437bfbebSnyanmisaka return MPP_OK;
1715*437bfbebSnyanmisaka }
1716*437bfbebSnyanmisaka
vepu510_h265e_use_pass1_patch(H265eV510RegSet * regs,H265eV510HalContext * ctx)1717*437bfbebSnyanmisaka static MPP_RET vepu510_h265e_use_pass1_patch(H265eV510RegSet *regs, H265eV510HalContext *ctx)
1718*437bfbebSnyanmisaka {
1719*437bfbebSnyanmisaka Vepu510ControlCfg *reg_ctl = ®s->reg_ctl;
1720*437bfbebSnyanmisaka H265eVepu510Frame *reg_frm = ®s->reg_frm;
1721*437bfbebSnyanmisaka RK_U32 hor_stride = MPP_ALIGN(ctx->cfg->prep.width, 16);
1722*437bfbebSnyanmisaka VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
1723*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
1724*437bfbebSnyanmisaka
1725*437bfbebSnyanmisaka hal_h265e_dbg_func("enter\n");
1726*437bfbebSnyanmisaka
1727*437bfbebSnyanmisaka reg_ctl->dtrns_map.src_bus_edin = fmt->src_endian;
1728*437bfbebSnyanmisaka reg_frm->common.src_fmt.src_cfmt = VEPU5xx_FMT_YUV420SP;
1729*437bfbebSnyanmisaka reg_frm->common.src_fmt.alpha_swap = 0;
1730*437bfbebSnyanmisaka reg_frm->common.src_fmt.rbuv_swap = 0;
1731*437bfbebSnyanmisaka reg_frm->common.src_fmt.out_fmt = 1;
1732*437bfbebSnyanmisaka reg_frm->common.src_fmt.src_rcne = 1;
1733*437bfbebSnyanmisaka
1734*437bfbebSnyanmisaka reg_frm->common.src_strd0.src_strd0 = hor_stride;
1735*437bfbebSnyanmisaka reg_frm->common.src_strd1.src_strd1 = 3 * hor_stride;
1736*437bfbebSnyanmisaka
1737*437bfbebSnyanmisaka reg_frm->common.src_proc.src_mirr = 0;
1738*437bfbebSnyanmisaka reg_frm->common.src_proc.src_rot = 0;
1739*437bfbebSnyanmisaka
1740*437bfbebSnyanmisaka reg_frm->common.adr_src0 = mpp_buffer_get_fd(ctx->buf_pass1);
1741*437bfbebSnyanmisaka reg_frm->common.adr_src1 = reg_frm->common.adr_src0;
1742*437bfbebSnyanmisaka reg_frm->common.adr_src2 = 0;
1743*437bfbebSnyanmisaka
1744*437bfbebSnyanmisaka /* input cb addr */
1745*437bfbebSnyanmisaka ret = mpp_dev_multi_offset_update(ctx->reg_cfg, 161, 2 * hor_stride);
1746*437bfbebSnyanmisaka if (ret)
1747*437bfbebSnyanmisaka mpp_err_f("set input cb addr offset failed %d\n", ret);
1748*437bfbebSnyanmisaka
1749*437bfbebSnyanmisaka return MPP_OK;
1750*437bfbebSnyanmisaka }
1751*437bfbebSnyanmisaka
setup_vepu510_ext_line_buf(H265eV510HalContext * ctx,H265eV510RegSet * regs)1752*437bfbebSnyanmisaka static void setup_vepu510_ext_line_buf(H265eV510HalContext *ctx, H265eV510RegSet *regs)
1753*437bfbebSnyanmisaka {
1754*437bfbebSnyanmisaka MppDevRcbInfoCfg rcb_cfg;
1755*437bfbebSnyanmisaka H265eVepu510Frame *reg_frm = ®s->reg_frm;
1756*437bfbebSnyanmisaka RK_S32 offset = 0;
1757*437bfbebSnyanmisaka RK_S32 fd;
1758*437bfbebSnyanmisaka
1759*437bfbebSnyanmisaka if (ctx->ext_line_buf) {
1760*437bfbebSnyanmisaka fd = mpp_buffer_get_fd(ctx->ext_line_buf);
1761*437bfbebSnyanmisaka offset = ctx->ext_line_buf_size;
1762*437bfbebSnyanmisaka
1763*437bfbebSnyanmisaka reg_frm->common.ebufb_addr = fd;
1764*437bfbebSnyanmisaka reg_frm->common.ebuft_addr = fd;
1765*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->reg_cfg, 178, ctx->ext_line_buf_size);
1766*437bfbebSnyanmisaka } else {
1767*437bfbebSnyanmisaka reg_frm->common.ebufb_addr = 0;
1768*437bfbebSnyanmisaka reg_frm->common.ebuft_addr = 0;
1769*437bfbebSnyanmisaka }
1770*437bfbebSnyanmisaka
1771*437bfbebSnyanmisaka /* rcb info for sram */
1772*437bfbebSnyanmisaka rcb_cfg.reg_idx = 179;
1773*437bfbebSnyanmisaka rcb_cfg.size = offset;
1774*437bfbebSnyanmisaka
1775*437bfbebSnyanmisaka mpp_dev_ioctl(ctx->dev, MPP_DEV_RCB_INFO, &rcb_cfg);
1776*437bfbebSnyanmisaka
1777*437bfbebSnyanmisaka rcb_cfg.reg_idx = 178;
1778*437bfbebSnyanmisaka rcb_cfg.size = 0;
1779*437bfbebSnyanmisaka
1780*437bfbebSnyanmisaka mpp_dev_ioctl(ctx->dev, MPP_DEV_RCB_INFO, &rcb_cfg);
1781*437bfbebSnyanmisaka }
1782*437bfbebSnyanmisaka
setup_vepu510_dual_core(H265eV510HalContext * ctx)1783*437bfbebSnyanmisaka static MPP_RET setup_vepu510_dual_core(H265eV510HalContext *ctx)
1784*437bfbebSnyanmisaka {
1785*437bfbebSnyanmisaka Vepu510H265eFrmCfg *frm = ctx->frm;
1786*437bfbebSnyanmisaka H265eV510RegSet *regs = frm->regs_set;
1787*437bfbebSnyanmisaka H265eVepu510Frame *reg_frm = ®s->reg_frm;
1788*437bfbebSnyanmisaka RK_U32 dchs_ofst = 9;
1789*437bfbebSnyanmisaka RK_U32 dchs_dly = 0;
1790*437bfbebSnyanmisaka RK_U32 dchs_rxe = 1;
1791*437bfbebSnyanmisaka
1792*437bfbebSnyanmisaka if (ctx->task_cnt == 1)
1793*437bfbebSnyanmisaka return MPP_OK;
1794*437bfbebSnyanmisaka
1795*437bfbebSnyanmisaka if (ctx->frame_type == INTRA_FRAME) {
1796*437bfbebSnyanmisaka ctx->curr_idx = 0;
1797*437bfbebSnyanmisaka ctx->prev_idx = 0;
1798*437bfbebSnyanmisaka dchs_rxe = 0;
1799*437bfbebSnyanmisaka }
1800*437bfbebSnyanmisaka
1801*437bfbebSnyanmisaka reg_frm->common.dual_core.dchs_txid = ctx->curr_idx;
1802*437bfbebSnyanmisaka reg_frm->common.dual_core.dchs_rxid = ctx->prev_idx;
1803*437bfbebSnyanmisaka reg_frm->common.dual_core.dchs_txe = 1;
1804*437bfbebSnyanmisaka reg_frm->common.dual_core.dchs_rxe = dchs_rxe;
1805*437bfbebSnyanmisaka reg_frm->common.dual_core.dchs_ofst = dchs_ofst;
1806*437bfbebSnyanmisaka reg_frm->common.dual_core.dchs_dly = dchs_dly;
1807*437bfbebSnyanmisaka
1808*437bfbebSnyanmisaka ctx->prev_idx = ctx->curr_idx++;
1809*437bfbebSnyanmisaka if (ctx->curr_idx > 3)
1810*437bfbebSnyanmisaka ctx->curr_idx = 0;
1811*437bfbebSnyanmisaka
1812*437bfbebSnyanmisaka return MPP_OK;
1813*437bfbebSnyanmisaka }
1814*437bfbebSnyanmisaka
setup_vepu510_split(H265eV510RegSet * regs,MppEncCfgSet * enc_cfg,RK_U32 title_en)1815*437bfbebSnyanmisaka static void setup_vepu510_split(H265eV510RegSet *regs, MppEncCfgSet *enc_cfg, RK_U32 title_en)
1816*437bfbebSnyanmisaka {
1817*437bfbebSnyanmisaka MppEncSliceSplit *cfg = &enc_cfg->split;
1818*437bfbebSnyanmisaka
1819*437bfbebSnyanmisaka hal_h265e_dbg_func("enter\n");
1820*437bfbebSnyanmisaka
1821*437bfbebSnyanmisaka switch (cfg->split_mode) {
1822*437bfbebSnyanmisaka case MPP_ENC_SPLIT_NONE : {
1823*437bfbebSnyanmisaka regs->reg_frm.common.sli_splt.sli_splt = 0;
1824*437bfbebSnyanmisaka regs->reg_frm.common.sli_splt.sli_splt_mode = 0;
1825*437bfbebSnyanmisaka regs->reg_frm.common.sli_splt.sli_splt_cpst = 0;
1826*437bfbebSnyanmisaka regs->reg_frm.common.sli_splt.sli_max_num_m1 = 0;
1827*437bfbebSnyanmisaka regs->reg_frm.common.sli_splt.sli_flsh = 0;
1828*437bfbebSnyanmisaka regs->reg_frm.common.sli_cnum.sli_splt_cnum_m1 = 0;
1829*437bfbebSnyanmisaka
1830*437bfbebSnyanmisaka regs->reg_frm.common.sli_byte.sli_splt_byte = 0;
1831*437bfbebSnyanmisaka regs->reg_frm.common.enc_pic.slen_fifo = 0;
1832*437bfbebSnyanmisaka } break;
1833*437bfbebSnyanmisaka case MPP_ENC_SPLIT_BY_BYTE : {
1834*437bfbebSnyanmisaka regs->reg_frm.common.sli_splt.sli_splt = 1;
1835*437bfbebSnyanmisaka regs->reg_frm.common.sli_splt.sli_splt_mode = 0;
1836*437bfbebSnyanmisaka regs->reg_frm.common.sli_splt.sli_splt_cpst = 0;
1837*437bfbebSnyanmisaka regs->reg_frm.common.sli_splt.sli_max_num_m1 = 500;
1838*437bfbebSnyanmisaka regs->reg_frm.common.sli_splt.sli_flsh = 1;
1839*437bfbebSnyanmisaka regs->reg_frm.common.sli_cnum.sli_splt_cnum_m1 = 0;
1840*437bfbebSnyanmisaka
1841*437bfbebSnyanmisaka regs->reg_frm.common.sli_byte.sli_splt_byte = cfg->split_arg;
1842*437bfbebSnyanmisaka regs->reg_frm.common.enc_pic.slen_fifo = cfg->split_out ? 1 : 0;
1843*437bfbebSnyanmisaka regs->reg_ctl.int_en.vslc_done_en = regs->reg_frm.common.enc_pic.slen_fifo ;
1844*437bfbebSnyanmisaka } break;
1845*437bfbebSnyanmisaka case MPP_ENC_SPLIT_BY_CTU : {
1846*437bfbebSnyanmisaka RK_U32 mb_w = MPP_ALIGN(enc_cfg->prep.width, 32) / 32;
1847*437bfbebSnyanmisaka RK_U32 mb_h = MPP_ALIGN(enc_cfg->prep.height, 32) / 32;
1848*437bfbebSnyanmisaka RK_U32 slice_num = 0;
1849*437bfbebSnyanmisaka
1850*437bfbebSnyanmisaka if (title_en)
1851*437bfbebSnyanmisaka mb_w = mb_w / 2;
1852*437bfbebSnyanmisaka
1853*437bfbebSnyanmisaka slice_num = (mb_w * mb_h + cfg->split_arg - 1) / cfg->split_arg;
1854*437bfbebSnyanmisaka
1855*437bfbebSnyanmisaka regs->reg_frm.common.sli_splt.sli_splt = 1;
1856*437bfbebSnyanmisaka regs->reg_frm.common.sli_splt.sli_splt_mode = 1;
1857*437bfbebSnyanmisaka regs->reg_frm.common.sli_splt.sli_splt_cpst = 0;
1858*437bfbebSnyanmisaka regs->reg_frm.common.sli_splt.sli_max_num_m1 = 500;
1859*437bfbebSnyanmisaka regs->reg_frm.common.sli_splt.sli_flsh = 1;
1860*437bfbebSnyanmisaka regs->reg_frm.common.sli_cnum.sli_splt_cnum_m1 = cfg->split_arg - 1;
1861*437bfbebSnyanmisaka
1862*437bfbebSnyanmisaka regs->reg_frm.common.sli_byte.sli_splt_byte = 0;
1863*437bfbebSnyanmisaka regs->reg_frm.common.enc_pic.slen_fifo = cfg->split_out ? 1 : 0;
1864*437bfbebSnyanmisaka if ((cfg->split_out & MPP_ENC_SPLIT_OUT_LOWDELAY) ||
1865*437bfbebSnyanmisaka (regs->reg_frm.common.enc_pic.slen_fifo && (slice_num > VEPU510_SLICE_FIFO_LEN)))
1866*437bfbebSnyanmisaka regs->reg_ctl.int_en.vslc_done_en = 1;
1867*437bfbebSnyanmisaka
1868*437bfbebSnyanmisaka } break;
1869*437bfbebSnyanmisaka default : {
1870*437bfbebSnyanmisaka mpp_log_f("invalide slice split mode %d\n", cfg->split_mode);
1871*437bfbebSnyanmisaka } break;
1872*437bfbebSnyanmisaka }
1873*437bfbebSnyanmisaka
1874*437bfbebSnyanmisaka hal_h265e_dbg_func("leave\n");
1875*437bfbebSnyanmisaka }
1876*437bfbebSnyanmisaka
vepu510_h265_set_scaling_list(H265eV510HalContext * ctx)1877*437bfbebSnyanmisaka static void vepu510_h265_set_scaling_list(H265eV510HalContext *ctx)
1878*437bfbebSnyanmisaka {
1879*437bfbebSnyanmisaka Vepu510H265eFrmCfg *frm_cfg = ctx->frm;
1880*437bfbebSnyanmisaka H265eV510RegSet *regs = frm_cfg->regs_set;
1881*437bfbebSnyanmisaka Vepu510SclCfg *s = ®s->reg_scl;
1882*437bfbebSnyanmisaka RK_U8 *p = (RK_U8 *)&s->tu8_intra_y[0];
1883*437bfbebSnyanmisaka RK_U32 scl_lst_sel = regs->reg_frm.rdo_cfg.scl_lst_sel;
1884*437bfbebSnyanmisaka RK_U8 idx;
1885*437bfbebSnyanmisaka
1886*437bfbebSnyanmisaka hal_h265e_dbg_func("enter\n");
1887*437bfbebSnyanmisaka
1888*437bfbebSnyanmisaka if (scl_lst_sel == 1) {
1889*437bfbebSnyanmisaka for (idx = 0; idx < 64; idx++) {
1890*437bfbebSnyanmisaka /* TU8 intra Y/U/V */
1891*437bfbebSnyanmisaka p[idx + 64 * 0] = vepu510_h265_cqm_intra8[63 - idx];
1892*437bfbebSnyanmisaka p[idx + 64 * 1] = vepu510_h265_cqm_intra8[63 - idx];
1893*437bfbebSnyanmisaka p[idx + 64 * 2] = vepu510_h265_cqm_intra8[63 - idx];
1894*437bfbebSnyanmisaka
1895*437bfbebSnyanmisaka /* TU8 inter Y/U/V */
1896*437bfbebSnyanmisaka p[idx + 64 * 3] = vepu510_h265_cqm_inter8[63 - idx];
1897*437bfbebSnyanmisaka p[idx + 64 * 4] = vepu510_h265_cqm_inter8[63 - idx];
1898*437bfbebSnyanmisaka p[idx + 64 * 5] = vepu510_h265_cqm_inter8[63 - idx];
1899*437bfbebSnyanmisaka
1900*437bfbebSnyanmisaka /* TU16 intra Y/U/V AC */
1901*437bfbebSnyanmisaka p[idx + 64 * 6] = vepu510_h265_cqm_intra8[63 - idx];
1902*437bfbebSnyanmisaka p[idx + 64 * 7] = vepu510_h265_cqm_intra8[63 - idx];
1903*437bfbebSnyanmisaka p[idx + 64 * 8] = vepu510_h265_cqm_intra8[63 - idx];
1904*437bfbebSnyanmisaka
1905*437bfbebSnyanmisaka /* TU16 inter Y/U/V AC */
1906*437bfbebSnyanmisaka p[idx + 64 * 9] = vepu510_h265_cqm_inter8[63 - idx];
1907*437bfbebSnyanmisaka p[idx + 64 * 10] = vepu510_h265_cqm_inter8[63 - idx];
1908*437bfbebSnyanmisaka p[idx + 64 * 11] = vepu510_h265_cqm_inter8[63 - idx];
1909*437bfbebSnyanmisaka
1910*437bfbebSnyanmisaka /* TU32 intra/inter Y AC */
1911*437bfbebSnyanmisaka p[idx + 64 * 12] = vepu510_h265_cqm_intra8[63 - idx];
1912*437bfbebSnyanmisaka p[idx + 64 * 13] = vepu510_h265_cqm_inter8[63 - idx];
1913*437bfbebSnyanmisaka }
1914*437bfbebSnyanmisaka
1915*437bfbebSnyanmisaka s->tu_dc0.tu16_intra_y_dc = 16;
1916*437bfbebSnyanmisaka s->tu_dc0.tu16_intra_u_dc = 16;
1917*437bfbebSnyanmisaka s->tu_dc0.tu16_intra_v_dc = 16;
1918*437bfbebSnyanmisaka s->tu_dc0.tu16_inter_y_dc = 16;
1919*437bfbebSnyanmisaka s->tu_dc1.tu16_inter_u_dc = 16;
1920*437bfbebSnyanmisaka s->tu_dc1.tu16_inter_v_dc = 16;
1921*437bfbebSnyanmisaka s->tu_dc1.tu32_intra_y_dc = 16;
1922*437bfbebSnyanmisaka s->tu_dc1.tu32_inter_y_dc = 16;
1923*437bfbebSnyanmisaka } else if (scl_lst_sel == 2) {
1924*437bfbebSnyanmisaka //TODO: Update scaling list for (scaling_list_mode == 2)
1925*437bfbebSnyanmisaka mpp_log_f("scaling_list_mode 2 is not supported yet\n");
1926*437bfbebSnyanmisaka }
1927*437bfbebSnyanmisaka
1928*437bfbebSnyanmisaka hal_h265e_dbg_func("leave\n");
1929*437bfbebSnyanmisaka }
1930*437bfbebSnyanmisaka
hal_h265e_v510_gen_regs(void * hal,HalEncTask * task)1931*437bfbebSnyanmisaka MPP_RET hal_h265e_v510_gen_regs(void *hal, HalEncTask *task)
1932*437bfbebSnyanmisaka {
1933*437bfbebSnyanmisaka H265eV510HalContext *ctx = (H265eV510HalContext *)hal;
1934*437bfbebSnyanmisaka HalEncTask *enc_task = task;
1935*437bfbebSnyanmisaka EncRcTask *rc_task = enc_task->rc_task;
1936*437bfbebSnyanmisaka EncFrmStatus *frm = &rc_task->frm;
1937*437bfbebSnyanmisaka H265eSyntax_new *syn = ctx->syn;
1938*437bfbebSnyanmisaka Vepu510H265eFrmCfg *frm_cfg = ctx->frm;
1939*437bfbebSnyanmisaka H265eV510RegSet *regs = frm_cfg->regs_set;
1940*437bfbebSnyanmisaka RK_U32 pic_width_align8, pic_height_align8;
1941*437bfbebSnyanmisaka RK_S32 pic_wd32, pic_h32;
1942*437bfbebSnyanmisaka VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
1943*437bfbebSnyanmisaka Vepu510ControlCfg *reg_ctl = ®s->reg_ctl;
1944*437bfbebSnyanmisaka H265eVepu510Frame *reg_frm = ®s->reg_frm;
1945*437bfbebSnyanmisaka Vepu510RcRoi *reg_klut = ®s->reg_rc_roi;
1946*437bfbebSnyanmisaka MppEncSceneMode sm = ctx->cfg->tune.scene_mode;
1947*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
1948*437bfbebSnyanmisaka
1949*437bfbebSnyanmisaka hal_h265e_enter();
1950*437bfbebSnyanmisaka pic_width_align8 = (syn->pp.pic_width + 7) & (~7);
1951*437bfbebSnyanmisaka pic_height_align8 = (syn->pp.pic_height + 7) & (~7);
1952*437bfbebSnyanmisaka pic_wd32 = (syn->pp.pic_width + 31) / 32;
1953*437bfbebSnyanmisaka pic_h32 = (syn->pp.pic_height + 31) / 32;
1954*437bfbebSnyanmisaka
1955*437bfbebSnyanmisaka hal_h265e_dbg_simple("frame %d | type %d | start gen regs",
1956*437bfbebSnyanmisaka ctx->frame_count, ctx->frame_type);
1957*437bfbebSnyanmisaka vepu510_h265e_tune_aq_prepare(ctx->tune);
1958*437bfbebSnyanmisaka memset(regs, 0, sizeof(H265eV510RegSet));
1959*437bfbebSnyanmisaka
1960*437bfbebSnyanmisaka reg_ctl->enc_strt.lkt_num = 0;
1961*437bfbebSnyanmisaka reg_ctl->enc_strt.vepu_cmd = ctx->enc_mode;
1962*437bfbebSnyanmisaka reg_ctl->enc_clr.safe_clr = 0x0;
1963*437bfbebSnyanmisaka reg_ctl->enc_clr.force_clr = 0x0;
1964*437bfbebSnyanmisaka
1965*437bfbebSnyanmisaka reg_ctl->int_en.enc_done_en = 1;
1966*437bfbebSnyanmisaka reg_ctl->int_en.lkt_node_done_en = 1;
1967*437bfbebSnyanmisaka reg_ctl->int_en.sclr_done_en = 1;
1968*437bfbebSnyanmisaka reg_ctl->int_en.vslc_done_en = 0;
1969*437bfbebSnyanmisaka reg_ctl->int_en.vbsf_oflw_en = 1;
1970*437bfbebSnyanmisaka reg_ctl->int_en.vbuf_lens_en = 1;
1971*437bfbebSnyanmisaka reg_ctl->int_en.enc_err_en = 1;
1972*437bfbebSnyanmisaka reg_ctl->int_en.vsrc_err_en = 1;
1973*437bfbebSnyanmisaka reg_ctl->int_en.wdg_en = 1;
1974*437bfbebSnyanmisaka reg_ctl->int_en.lkt_err_int_en = 0;
1975*437bfbebSnyanmisaka reg_ctl->int_en.lkt_err_stop_en = 1;
1976*437bfbebSnyanmisaka reg_ctl->int_en.lkt_force_stop_en = 1;
1977*437bfbebSnyanmisaka reg_ctl->int_en.jslc_done_en = 1;
1978*437bfbebSnyanmisaka reg_ctl->int_en.jbsf_oflw_en = 1;
1979*437bfbebSnyanmisaka reg_ctl->int_en.jbuf_lens_en = 1;
1980*437bfbebSnyanmisaka reg_ctl->int_en.dvbm_err_en = 0;
1981*437bfbebSnyanmisaka
1982*437bfbebSnyanmisaka reg_ctl->dtrns_map.jpeg_bus_edin = 0x0;
1983*437bfbebSnyanmisaka reg_ctl->dtrns_map.src_bus_edin = 0x0;
1984*437bfbebSnyanmisaka reg_ctl->dtrns_map.meiw_bus_edin = 0x0;
1985*437bfbebSnyanmisaka reg_ctl->dtrns_map.bsw_bus_edin = 0x7;
1986*437bfbebSnyanmisaka reg_ctl->dtrns_map.lktw_bus_edin = 0x0;
1987*437bfbebSnyanmisaka reg_ctl->dtrns_map.rec_nfbc_bus_edin = 0x0;
1988*437bfbebSnyanmisaka
1989*437bfbebSnyanmisaka reg_ctl->dtrns_cfg.axi_brsp_cke = 0x0;
1990*437bfbebSnyanmisaka reg_ctl->enc_wdg.vs_load_thd = 0;
1991*437bfbebSnyanmisaka
1992*437bfbebSnyanmisaka reg_ctl->opt_strg.cke = 1;
1993*437bfbebSnyanmisaka reg_ctl->opt_strg.resetn_hw_en = 1;
1994*437bfbebSnyanmisaka reg_ctl->opt_strg.rfpr_err_e = 1;
1995*437bfbebSnyanmisaka
1996*437bfbebSnyanmisaka reg_frm->common.enc_rsl.pic_wd8_m1 = pic_width_align8 / 8 - 1;
1997*437bfbebSnyanmisaka reg_frm->common.src_fill.pic_wfill = (syn->pp.pic_width & 0x7)
1998*437bfbebSnyanmisaka ? (8 - (syn->pp.pic_width & 0x7)) : 0;
1999*437bfbebSnyanmisaka reg_frm->common.enc_rsl.pic_hd8_m1 = pic_height_align8 / 8 - 1;
2000*437bfbebSnyanmisaka reg_frm->common.src_fill.pic_hfill = (syn->pp.pic_height & 0x7)
2001*437bfbebSnyanmisaka ? (8 - (syn->pp.pic_height & 0x7)) : 0;
2002*437bfbebSnyanmisaka
2003*437bfbebSnyanmisaka reg_frm->common.enc_pic.enc_stnd = 1; //H265
2004*437bfbebSnyanmisaka reg_frm->common.enc_pic.cur_frm_ref = !syn->sp.non_reference_flag; //current frame will be refered
2005*437bfbebSnyanmisaka reg_frm->common.enc_pic.bs_scp = 1;
2006*437bfbebSnyanmisaka reg_frm->common.enc_pic.log2_ctu_num_hevc = mpp_ceil_log2(pic_wd32 * pic_h32);
2007*437bfbebSnyanmisaka
2008*437bfbebSnyanmisaka reg_frm->common.src_proc.src_mirr = 0;
2009*437bfbebSnyanmisaka reg_frm->common.src_proc.src_rot = 0;
2010*437bfbebSnyanmisaka reg_frm->common.src_proc.tile4x4_en = 0;
2011*437bfbebSnyanmisaka
2012*437bfbebSnyanmisaka reg_klut->klut_ofst.chrm_klut_ofst = (ctx->frame_type == INTRA_FRAME) ? 6 :
2013*437bfbebSnyanmisaka (sm == MPP_ENC_SCENE_MODE_IPC ? 9 : 6);
2014*437bfbebSnyanmisaka
2015*437bfbebSnyanmisaka reg_frm->sao_cfg.sao_lambda_multi = 5;
2016*437bfbebSnyanmisaka
2017*437bfbebSnyanmisaka setup_vepu510_split(regs, ctx->cfg, syn->pp.tiles_enabled_flag);
2018*437bfbebSnyanmisaka
2019*437bfbebSnyanmisaka if (ctx->task_cnt > 1)
2020*437bfbebSnyanmisaka setup_vepu510_dual_core(ctx);
2021*437bfbebSnyanmisaka
2022*437bfbebSnyanmisaka vepu510_h265_set_me_regs(ctx, syn, reg_frm);
2023*437bfbebSnyanmisaka
2024*437bfbebSnyanmisaka reg_frm->rdo_cfg.chrm_spcl = 0;
2025*437bfbebSnyanmisaka reg_frm->rdo_cfg.cu_inter_e = 0xdb;
2026*437bfbebSnyanmisaka reg_frm->rdo_cfg.lambda_qp_use_avg_cu16_flag = (sm == MPP_ENC_SCENE_MODE_IPC);
2027*437bfbebSnyanmisaka reg_frm->rdo_cfg.yuvskip_calc_en = 1;
2028*437bfbebSnyanmisaka reg_frm->rdo_cfg.atf_e = (sm == MPP_ENC_SCENE_MODE_IPC);
2029*437bfbebSnyanmisaka reg_frm->rdo_cfg.atr_e = 1;
2030*437bfbebSnyanmisaka
2031*437bfbebSnyanmisaka if (syn->pp.num_long_term_ref_pics_sps) {
2032*437bfbebSnyanmisaka reg_frm->rdo_cfg.ltm_col = 0;
2033*437bfbebSnyanmisaka reg_frm->rdo_cfg.ltm_idx0l0 = 1;
2034*437bfbebSnyanmisaka } else {
2035*437bfbebSnyanmisaka reg_frm->rdo_cfg.ltm_col = 0;
2036*437bfbebSnyanmisaka reg_frm->rdo_cfg.ltm_idx0l0 = 0;
2037*437bfbebSnyanmisaka }
2038*437bfbebSnyanmisaka
2039*437bfbebSnyanmisaka reg_frm->rdo_cfg.ccwa_e = 1;
2040*437bfbebSnyanmisaka reg_frm->rdo_cfg.scl_lst_sel = syn->pp.scaling_list_enabled_flag;
2041*437bfbebSnyanmisaka reg_frm->synt_nal.nal_unit_type = h265e_get_nal_type(&syn->sp, ctx->frame_type);
2042*437bfbebSnyanmisaka
2043*437bfbebSnyanmisaka vepu510_h265_set_scaling_list(ctx);
2044*437bfbebSnyanmisaka vepu510_h265_set_hw_address(ctx, reg_frm, task);
2045*437bfbebSnyanmisaka vepu510_h265_set_pp_regs(regs, fmt, &ctx->cfg->prep);
2046*437bfbebSnyanmisaka vepu510_h265_set_rc_regs(ctx, regs, task);
2047*437bfbebSnyanmisaka vepu510_h265_set_slice_regs(syn, reg_frm);
2048*437bfbebSnyanmisaka vepu510_h265_set_ref_regs(syn, reg_frm);
2049*437bfbebSnyanmisaka ret = vepu510_h265_set_patch_info(syn, (VepuFmt)fmt->format, ctx->reg_cfg, enc_task);
2050*437bfbebSnyanmisaka if (ret)
2051*437bfbebSnyanmisaka return ret;
2052*437bfbebSnyanmisaka
2053*437bfbebSnyanmisaka setup_vepu510_ext_line_buf(ctx, regs);
2054*437bfbebSnyanmisaka
2055*437bfbebSnyanmisaka /* ROI configure */
2056*437bfbebSnyanmisaka if (ctx->roi_data)
2057*437bfbebSnyanmisaka vepu510_set_roi(®s->reg_rc_roi.roi_cfg, ctx->roi_data,
2058*437bfbebSnyanmisaka ctx->cfg->prep.width, ctx->cfg->prep.height);
2059*437bfbebSnyanmisaka /*paramet cfg*/
2060*437bfbebSnyanmisaka vepu510_h265_global_cfg_set(ctx, regs);
2061*437bfbebSnyanmisaka vepu510_h265e_tune_reg_patch(ctx->tune, task);
2062*437bfbebSnyanmisaka
2063*437bfbebSnyanmisaka /* two pass register patch */
2064*437bfbebSnyanmisaka if (frm->save_pass1)
2065*437bfbebSnyanmisaka vepu510_h265e_save_pass1_patch(regs, ctx, syn->pp.tiles_enabled_flag);
2066*437bfbebSnyanmisaka
2067*437bfbebSnyanmisaka if (frm->use_pass1)
2068*437bfbebSnyanmisaka vepu510_h265e_use_pass1_patch(regs, ctx);
2069*437bfbebSnyanmisaka
2070*437bfbebSnyanmisaka
2071*437bfbebSnyanmisaka ctx->frame_num++;
2072*437bfbebSnyanmisaka
2073*437bfbebSnyanmisaka hal_h265e_leave();
2074*437bfbebSnyanmisaka return MPP_OK;
2075*437bfbebSnyanmisaka }
2076*437bfbebSnyanmisaka
hal_h265e_v510_start(void * hal,HalEncTask * enc_task)2077*437bfbebSnyanmisaka MPP_RET hal_h265e_v510_start(void *hal, HalEncTask *enc_task)
2078*437bfbebSnyanmisaka {
2079*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
2080*437bfbebSnyanmisaka H265eV510HalContext *ctx = (H265eV510HalContext *)hal;
2081*437bfbebSnyanmisaka Vepu510H265eFrmCfg *frm = ctx->frm;
2082*437bfbebSnyanmisaka RK_U32 *regs = (RK_U32*)frm->regs_set;
2083*437bfbebSnyanmisaka H265eV510RegSet *hw_regs = frm->regs_set;
2084*437bfbebSnyanmisaka H265eV510StatusElem *reg_out = (H265eV510StatusElem *)frm->regs_ret;
2085*437bfbebSnyanmisaka MppDevRegWrCfg cfg;
2086*437bfbebSnyanmisaka MppDevRegRdCfg cfg1;
2087*437bfbebSnyanmisaka RK_U32 i = 0;
2088*437bfbebSnyanmisaka
2089*437bfbebSnyanmisaka hal_h265e_enter();
2090*437bfbebSnyanmisaka if (enc_task->flags.err) {
2091*437bfbebSnyanmisaka hal_h265e_err("enc_task->flags.err %08x, return e arly",
2092*437bfbebSnyanmisaka enc_task->flags.err);
2093*437bfbebSnyanmisaka return MPP_NOK;
2094*437bfbebSnyanmisaka }
2095*437bfbebSnyanmisaka
2096*437bfbebSnyanmisaka cfg.reg = (RK_U32*)&hw_regs->reg_ctl;
2097*437bfbebSnyanmisaka cfg.size = sizeof(Vepu510ControlCfg);
2098*437bfbebSnyanmisaka cfg.offset = VEPU510_CTL_OFFSET;
2099*437bfbebSnyanmisaka
2100*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
2101*437bfbebSnyanmisaka if (ret) {
2102*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2103*437bfbebSnyanmisaka return ret;
2104*437bfbebSnyanmisaka }
2105*437bfbebSnyanmisaka
2106*437bfbebSnyanmisaka if (hal_h265e_debug & HAL_H265E_DBG_CTL_REGS) {
2107*437bfbebSnyanmisaka regs = (RK_U32*)&hw_regs->reg_ctl;
2108*437bfbebSnyanmisaka for (i = 0; i < sizeof(Vepu510ControlCfg) / 4; i++) {
2109*437bfbebSnyanmisaka hal_h265e_dbg_ctl("ctl reg[%04x]: 0%08x\n", i * 4, regs[i]);
2110*437bfbebSnyanmisaka }
2111*437bfbebSnyanmisaka }
2112*437bfbebSnyanmisaka
2113*437bfbebSnyanmisaka cfg.reg = &hw_regs->reg_frm;
2114*437bfbebSnyanmisaka cfg.size = sizeof(H265eVepu510Frame);
2115*437bfbebSnyanmisaka cfg.offset = VEPU510_FRAME_OFFSET;
2116*437bfbebSnyanmisaka
2117*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
2118*437bfbebSnyanmisaka if (ret) {
2119*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2120*437bfbebSnyanmisaka return ret;
2121*437bfbebSnyanmisaka }
2122*437bfbebSnyanmisaka
2123*437bfbebSnyanmisaka if (hal_h265e_debug & HAL_H265E_DBG_REGS) {
2124*437bfbebSnyanmisaka regs = (RK_U32*)(&hw_regs->reg_frm);
2125*437bfbebSnyanmisaka for (i = 0; i < 32; i++) {
2126*437bfbebSnyanmisaka hal_h265e_dbg_regs("hw add cfg reg[%04x]: 0%08x\n", i * 4, regs[i]);
2127*437bfbebSnyanmisaka }
2128*437bfbebSnyanmisaka regs += 32;
2129*437bfbebSnyanmisaka for (i = 0; i < (sizeof(H265eVepu510Frame) - 128) / 4; i++) {
2130*437bfbebSnyanmisaka hal_h265e_dbg_regs("set reg[%04x]: 0%08x\n", i * 4, regs[i]);
2131*437bfbebSnyanmisaka }
2132*437bfbebSnyanmisaka }
2133*437bfbebSnyanmisaka cfg.reg = &hw_regs->reg_rc_roi;
2134*437bfbebSnyanmisaka cfg.size = sizeof(Vepu510RcRoi);
2135*437bfbebSnyanmisaka cfg.offset = VEPU510_RC_ROI_OFFSET;
2136*437bfbebSnyanmisaka
2137*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
2138*437bfbebSnyanmisaka if (ret) {
2139*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2140*437bfbebSnyanmisaka return ret;
2141*437bfbebSnyanmisaka }
2142*437bfbebSnyanmisaka
2143*437bfbebSnyanmisaka if (hal_h265e_debug & HAL_H265E_DBG_RCKUT_REGS) {
2144*437bfbebSnyanmisaka regs = (RK_U32*)&hw_regs->reg_rc_roi;
2145*437bfbebSnyanmisaka for (i = 0; i < sizeof(Vepu510RcRoi) / 4; i++) {
2146*437bfbebSnyanmisaka hal_h265e_dbg_rckut("set reg[%04x]: 0%08x\n", i * 4, regs[i]);
2147*437bfbebSnyanmisaka }
2148*437bfbebSnyanmisaka }
2149*437bfbebSnyanmisaka
2150*437bfbebSnyanmisaka cfg.reg = &hw_regs->reg_param;
2151*437bfbebSnyanmisaka cfg.size = sizeof(H265eVepu510Param);
2152*437bfbebSnyanmisaka cfg.offset = VEPU510_PARAM_OFFSET;
2153*437bfbebSnyanmisaka
2154*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
2155*437bfbebSnyanmisaka if (ret) {
2156*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2157*437bfbebSnyanmisaka return ret;
2158*437bfbebSnyanmisaka }
2159*437bfbebSnyanmisaka
2160*437bfbebSnyanmisaka if (hal_h265e_debug & HAL_H265E_DBG_WGT_REGS) {
2161*437bfbebSnyanmisaka regs = (RK_U32*)&hw_regs->reg_param;
2162*437bfbebSnyanmisaka for (i = 0; i < sizeof(H265eVepu510Param) / 4; i++) {
2163*437bfbebSnyanmisaka hal_h265e_dbg_wgt("set reg[%04x]: 0%08x\n", i * 4, regs[i]);
2164*437bfbebSnyanmisaka }
2165*437bfbebSnyanmisaka }
2166*437bfbebSnyanmisaka
2167*437bfbebSnyanmisaka cfg.reg = &hw_regs->reg_sqi;
2168*437bfbebSnyanmisaka cfg.size = sizeof(H265eVepu510Sqi);
2169*437bfbebSnyanmisaka cfg.offset = VEPU510_SQI_OFFSET;
2170*437bfbebSnyanmisaka
2171*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
2172*437bfbebSnyanmisaka if (ret) {
2173*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2174*437bfbebSnyanmisaka return ret;
2175*437bfbebSnyanmisaka }
2176*437bfbebSnyanmisaka
2177*437bfbebSnyanmisaka cfg.reg = &hw_regs->reg_scl;
2178*437bfbebSnyanmisaka cfg.size = sizeof(hw_regs->reg_scl);
2179*437bfbebSnyanmisaka cfg.offset = VEPU510_SCL_OFFSET ;
2180*437bfbebSnyanmisaka
2181*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
2182*437bfbebSnyanmisaka if (ret) {
2183*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2184*437bfbebSnyanmisaka return ret;
2185*437bfbebSnyanmisaka }
2186*437bfbebSnyanmisaka
2187*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_OFFS, ctx->reg_cfg);
2188*437bfbebSnyanmisaka if (ret) {
2189*437bfbebSnyanmisaka mpp_err_f("set register offsets failed %d\n", ret);
2190*437bfbebSnyanmisaka return ret;
2191*437bfbebSnyanmisaka }
2192*437bfbebSnyanmisaka
2193*437bfbebSnyanmisaka cfg1.reg = ®_out->hw_status;
2194*437bfbebSnyanmisaka cfg1.size = sizeof(RK_U32);
2195*437bfbebSnyanmisaka cfg1.offset = VEPU510_REG_BASE_HW_STATUS;
2196*437bfbebSnyanmisaka
2197*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
2198*437bfbebSnyanmisaka if (ret) {
2199*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
2200*437bfbebSnyanmisaka return ret;
2201*437bfbebSnyanmisaka }
2202*437bfbebSnyanmisaka
2203*437bfbebSnyanmisaka cfg1.reg = ®_out->st;
2204*437bfbebSnyanmisaka cfg1.size = sizeof(H265eV510StatusElem) - 4;
2205*437bfbebSnyanmisaka cfg1.offset = VEPU510_STATUS_OFFSET;
2206*437bfbebSnyanmisaka
2207*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
2208*437bfbebSnyanmisaka if (ret) {
2209*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
2210*437bfbebSnyanmisaka return ret;
2211*437bfbebSnyanmisaka }
2212*437bfbebSnyanmisaka
2213*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
2214*437bfbebSnyanmisaka if (ret) {
2215*437bfbebSnyanmisaka mpp_err_f("send cmd failed %d\n", ret);
2216*437bfbebSnyanmisaka }
2217*437bfbebSnyanmisaka hal_h265e_leave();
2218*437bfbebSnyanmisaka return ret;
2219*437bfbebSnyanmisaka }
2220*437bfbebSnyanmisaka
vepu510_h265_set_feedback(H265eV510HalContext * ctx,HalEncTask * enc_task)2221*437bfbebSnyanmisaka static MPP_RET vepu510_h265_set_feedback(H265eV510HalContext *ctx, HalEncTask *enc_task)
2222*437bfbebSnyanmisaka {
2223*437bfbebSnyanmisaka EncRcTaskInfo *hal_rc_ret = (EncRcTaskInfo *)&enc_task->rc_task->info;
2224*437bfbebSnyanmisaka Vepu510H265eFrmCfg *frm = ctx->frms[enc_task->flags.reg_idx];
2225*437bfbebSnyanmisaka Vepu510H265Fbk *fb = &frm->feedback;
2226*437bfbebSnyanmisaka MppEncCfgSet *cfg = ctx->cfg;
2227*437bfbebSnyanmisaka RK_S32 mb8_num = MPP_ALIGN(cfg->prep.width, 8) * MPP_ALIGN(cfg->prep.height, 8) / 64;
2228*437bfbebSnyanmisaka RK_S32 mb4_num = (mb8_num << 2);
2229*437bfbebSnyanmisaka H265eV510StatusElem *elem = (H265eV510StatusElem *)frm->regs_ret;
2230*437bfbebSnyanmisaka RK_U32 hw_status = elem->hw_status;
2231*437bfbebSnyanmisaka
2232*437bfbebSnyanmisaka hal_h265e_enter();
2233*437bfbebSnyanmisaka
2234*437bfbebSnyanmisaka fb->qp_sum += elem->st.qp_sum;
2235*437bfbebSnyanmisaka fb->out_strm_size += elem->st.bs_lgth_l32;
2236*437bfbebSnyanmisaka fb->sse_sum += (RK_S64)(elem->st.sse_h32 << 16) +
2237*437bfbebSnyanmisaka (elem->st.st_sse_bsl.sse_l16 & 0xffff);
2238*437bfbebSnyanmisaka
2239*437bfbebSnyanmisaka fb->hw_status = hw_status;
2240*437bfbebSnyanmisaka hal_h265e_dbg_detail("hw_status: 0x%08x", hw_status);
2241*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_LINKTABLE_FINISH)
2242*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_LINKTABLE_FINISH");
2243*437bfbebSnyanmisaka
2244*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_ONE_FRAME_FINISH)
2245*437bfbebSnyanmisaka hal_h265e_dbg_detail("RKV_ENC_INT_ONE_FRAME_FINISH");
2246*437bfbebSnyanmisaka
2247*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_ONE_SLICE_FINISH)
2248*437bfbebSnyanmisaka hal_h265e_dbg_detail("RKV_ENC_INT_ONE_SLICE_FINISH");
2249*437bfbebSnyanmisaka
2250*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_SAFE_CLEAR_FINISH)
2251*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_SAFE_CLEAR_FINISH");
2252*437bfbebSnyanmisaka
2253*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_BIT_STREAM_OVERFLOW)
2254*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_BIT_STREAM_OVERFLOW");
2255*437bfbebSnyanmisaka
2256*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_BUS_WRITE_FULL)
2257*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_BUS_WRITE_FULL");
2258*437bfbebSnyanmisaka
2259*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_BUS_WRITE_ERROR)
2260*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_BUS_WRITE_ERROR");
2261*437bfbebSnyanmisaka
2262*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_BUS_READ_ERROR)
2263*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_BUS_READ_ERROR");
2264*437bfbebSnyanmisaka
2265*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_TIMEOUT_ERROR)
2266*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_TIMEOUT_ERROR");
2267*437bfbebSnyanmisaka
2268*437bfbebSnyanmisaka fb->st_mb_num += elem->st.st_bnum_b16.num_b16;
2269*437bfbebSnyanmisaka
2270*437bfbebSnyanmisaka fb->st_lvl64_inter_num += elem->st.st_pnum_p64.pnum_p64;
2271*437bfbebSnyanmisaka fb->st_lvl32_inter_num += elem->st.st_pnum_p32.pnum_p32;
2272*437bfbebSnyanmisaka fb->st_lvl32_intra_num += elem->st.st_pnum_i32.pnum_i32;
2273*437bfbebSnyanmisaka fb->st_lvl16_inter_num += elem->st.st_pnum_p16.pnum_p16;
2274*437bfbebSnyanmisaka fb->st_lvl16_intra_num += elem->st.st_pnum_i16.pnum_i16;
2275*437bfbebSnyanmisaka fb->st_lvl8_inter_num += elem->st.st_pnum_p8.pnum_p8;
2276*437bfbebSnyanmisaka fb->st_lvl8_intra_num += elem->st.st_pnum_i8.pnum_i8;
2277*437bfbebSnyanmisaka fb->st_lvl4_intra_num += elem->st.st_pnum_i4.pnum_i4;
2278*437bfbebSnyanmisaka ctx->feedback.acc_cover16_num = elem->st.st_skin_sum1.acc_cover16_num;
2279*437bfbebSnyanmisaka ctx->feedback.acc_bndry16_num = elem->st.st_skin_sum2.acc_bndry16_num;
2280*437bfbebSnyanmisaka ctx->feedback.acc_zero_mv = elem->st.acc_zero_mv;
2281*437bfbebSnyanmisaka ctx->feedback.st_ctu_num = elem->st.st_bnum_b16.num_b16;
2282*437bfbebSnyanmisaka memcpy(&fb->st_cu_num_qp[0], &elem->st.st_b8_qp, 52 * sizeof(RK_U32));
2283*437bfbebSnyanmisaka
2284*437bfbebSnyanmisaka if (mb4_num > 0)
2285*437bfbebSnyanmisaka hal_rc_ret->iblk4_prop = ((((fb->st_lvl4_intra_num + fb->st_lvl8_intra_num) << 2) +
2286*437bfbebSnyanmisaka (fb->st_lvl16_intra_num << 4) +
2287*437bfbebSnyanmisaka (fb->st_lvl32_intra_num << 6)) << 8) / mb4_num;
2288*437bfbebSnyanmisaka
2289*437bfbebSnyanmisaka if (mb8_num > 0) {
2290*437bfbebSnyanmisaka hal_rc_ret->quality_real = fb->qp_sum / mb8_num;
2291*437bfbebSnyanmisaka }
2292*437bfbebSnyanmisaka
2293*437bfbebSnyanmisaka hal_h265e_leave();
2294*437bfbebSnyanmisaka return MPP_OK;
2295*437bfbebSnyanmisaka }
2296*437bfbebSnyanmisaka
hal_h265e_vepu510_status_check(H265eV510RegSet * regs)2297*437bfbebSnyanmisaka static MPP_RET hal_h265e_vepu510_status_check(H265eV510RegSet *regs)
2298*437bfbebSnyanmisaka {
2299*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
2300*437bfbebSnyanmisaka
2301*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.lkt_node_done_sta)
2302*437bfbebSnyanmisaka hal_h265e_dbg_detail("lkt_done finish");
2303*437bfbebSnyanmisaka
2304*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.enc_done_sta)
2305*437bfbebSnyanmisaka hal_h265e_dbg_detail("enc_done finish");
2306*437bfbebSnyanmisaka
2307*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.vslc_done_sta)
2308*437bfbebSnyanmisaka hal_h265e_dbg_detail("enc_slice finsh");
2309*437bfbebSnyanmisaka
2310*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.sclr_done_sta)
2311*437bfbebSnyanmisaka hal_h265e_dbg_detail("safe clear finsh");
2312*437bfbebSnyanmisaka
2313*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.vbsf_oflw_sta) {
2314*437bfbebSnyanmisaka mpp_err_f("bit stream overflow");
2315*437bfbebSnyanmisaka ret = MPP_NOK;
2316*437bfbebSnyanmisaka }
2317*437bfbebSnyanmisaka
2318*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.vbuf_lens_sta) {
2319*437bfbebSnyanmisaka mpp_err_f("bus write full");
2320*437bfbebSnyanmisaka ret = MPP_NOK;
2321*437bfbebSnyanmisaka }
2322*437bfbebSnyanmisaka
2323*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.enc_err_sta) {
2324*437bfbebSnyanmisaka mpp_err_f("bus error");
2325*437bfbebSnyanmisaka ret = MPP_NOK;
2326*437bfbebSnyanmisaka }
2327*437bfbebSnyanmisaka
2328*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.wdg_sta) {
2329*437bfbebSnyanmisaka mpp_err_f("wdg timeout");
2330*437bfbebSnyanmisaka ret = MPP_NOK;
2331*437bfbebSnyanmisaka }
2332*437bfbebSnyanmisaka
2333*437bfbebSnyanmisaka return ret;
2334*437bfbebSnyanmisaka }
2335*437bfbebSnyanmisaka
2336*437bfbebSnyanmisaka //#define DUMP_DATA
hal_h265e_v510_wait(void * hal,HalEncTask * task)2337*437bfbebSnyanmisaka MPP_RET hal_h265e_v510_wait(void *hal, HalEncTask *task)
2338*437bfbebSnyanmisaka {
2339*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
2340*437bfbebSnyanmisaka H265eV510HalContext *ctx = (H265eV510HalContext *)hal;
2341*437bfbebSnyanmisaka HalEncTask *enc_task = task;
2342*437bfbebSnyanmisaka MppPacket pkt = enc_task->packet;
2343*437bfbebSnyanmisaka RK_U32 split_out = ctx->cfg->split.split_out;
2344*437bfbebSnyanmisaka RK_S32 task_idx = task->flags.reg_idx;
2345*437bfbebSnyanmisaka Vepu510H265eFrmCfg *frm = ctx->frms[task_idx];
2346*437bfbebSnyanmisaka H265eV510RegSet *regs = frm->regs_set;
2347*437bfbebSnyanmisaka RK_U32 offset = mpp_packet_get_length(pkt);
2348*437bfbebSnyanmisaka RK_U32 seg_offset = offset;
2349*437bfbebSnyanmisaka H265eVepu510Frame *reg_frm = ®s->reg_frm;
2350*437bfbebSnyanmisaka RK_U32 type = reg_frm->synt_nal.nal_unit_type;
2351*437bfbebSnyanmisaka H265eV510StatusElem *elem = (H265eV510StatusElem *)frm->regs_ret;
2352*437bfbebSnyanmisaka
2353*437bfbebSnyanmisaka hal_h265e_enter();
2354*437bfbebSnyanmisaka
2355*437bfbebSnyanmisaka if (enc_task->flags.err) {
2356*437bfbebSnyanmisaka hal_h265e_err("enc_task->flags.err %08x, return early",
2357*437bfbebSnyanmisaka enc_task->flags.err);
2358*437bfbebSnyanmisaka return MPP_NOK;
2359*437bfbebSnyanmisaka }
2360*437bfbebSnyanmisaka
2361*437bfbebSnyanmisaka /* if pass1 mode, it will disable split mode and the split out need to be disable */
2362*437bfbebSnyanmisaka if (enc_task->rc_task->frm.save_pass1)
2363*437bfbebSnyanmisaka split_out = 0;
2364*437bfbebSnyanmisaka
2365*437bfbebSnyanmisaka if (split_out) {
2366*437bfbebSnyanmisaka EncOutParam param;
2367*437bfbebSnyanmisaka RK_U32 slice_len = 0;
2368*437bfbebSnyanmisaka RK_U32 slice_last = 0;
2369*437bfbebSnyanmisaka MppDevPollCfg *poll_cfg = (MppDevPollCfg *)((char *)ctx->poll_cfgs);
2370*437bfbebSnyanmisaka param.task = task;
2371*437bfbebSnyanmisaka param.base = mpp_packet_get_data(task->packet);
2372*437bfbebSnyanmisaka
2373*437bfbebSnyanmisaka do {
2374*437bfbebSnyanmisaka RK_S32 i = 0;
2375*437bfbebSnyanmisaka poll_cfg->poll_type = 0;
2376*437bfbebSnyanmisaka poll_cfg->poll_ret = 0;
2377*437bfbebSnyanmisaka poll_cfg->count_max = ctx->poll_slice_max;
2378*437bfbebSnyanmisaka poll_cfg->count_ret = 0;
2379*437bfbebSnyanmisaka
2380*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, poll_cfg);
2381*437bfbebSnyanmisaka for (i = 0; i < poll_cfg->count_ret; i++) {
2382*437bfbebSnyanmisaka slice_last = poll_cfg->slice_info[i].last;
2383*437bfbebSnyanmisaka slice_len = poll_cfg->slice_info[i].length;
2384*437bfbebSnyanmisaka param.length = slice_len;
2385*437bfbebSnyanmisaka
2386*437bfbebSnyanmisaka mpp_packet_add_segment_info(pkt, type, seg_offset, slice_len);
2387*437bfbebSnyanmisaka seg_offset += slice_len;
2388*437bfbebSnyanmisaka
2389*437bfbebSnyanmisaka if (split_out & MPP_ENC_SPLIT_OUT_LOWDELAY) {
2390*437bfbebSnyanmisaka param.length = slice_len;
2391*437bfbebSnyanmisaka if (slice_last)
2392*437bfbebSnyanmisaka ctx->output_cb->cmd = ENC_OUTPUT_FINISH;
2393*437bfbebSnyanmisaka else
2394*437bfbebSnyanmisaka ctx->output_cb->cmd = ENC_OUTPUT_SLICE;
2395*437bfbebSnyanmisaka
2396*437bfbebSnyanmisaka mpp_callback(ctx->output_cb, ¶m);
2397*437bfbebSnyanmisaka }
2398*437bfbebSnyanmisaka }
2399*437bfbebSnyanmisaka } while (!slice_last);
2400*437bfbebSnyanmisaka
2401*437bfbebSnyanmisaka ret = hal_h265e_vepu510_status_check(regs);
2402*437bfbebSnyanmisaka if (!ret)
2403*437bfbebSnyanmisaka task->hw_length += elem->st.bs_lgth_l32;
2404*437bfbebSnyanmisaka
2405*437bfbebSnyanmisaka } else {
2406*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
2407*437bfbebSnyanmisaka if (ret) {
2408*437bfbebSnyanmisaka mpp_err_f("poll cmd failed %d\n", ret);
2409*437bfbebSnyanmisaka ret = MPP_ERR_VPUHW;
2410*437bfbebSnyanmisaka } else {
2411*437bfbebSnyanmisaka ret = hal_h265e_vepu510_status_check(regs);
2412*437bfbebSnyanmisaka if (!ret)
2413*437bfbebSnyanmisaka task->hw_length += elem->st.bs_lgth_l32;
2414*437bfbebSnyanmisaka }
2415*437bfbebSnyanmisaka mpp_packet_add_segment_info(pkt, type, offset, elem->st.bs_lgth_l32);
2416*437bfbebSnyanmisaka }
2417*437bfbebSnyanmisaka
2418*437bfbebSnyanmisaka #ifdef DUMP_DATA
2419*437bfbebSnyanmisaka static FILE *fp_fbd = NULL;
2420*437bfbebSnyanmisaka static FILE *fp_fbh = NULL;
2421*437bfbebSnyanmisaka static FILE *fp_dws = NULL;
2422*437bfbebSnyanmisaka HalBuf *recon_buf;
2423*437bfbebSnyanmisaka static RK_U32 frm_num = 0;
2424*437bfbebSnyanmisaka H265eSyntax_new *syn = (H265eSyntax_new *)enc_task->syntax.data;
2425*437bfbebSnyanmisaka recon_buf = hal_bufs_get_buf(ctx->dpb_bufs, syn->sp.recon_pic.slot_idx);
2426*437bfbebSnyanmisaka char file_name[20] = "";
2427*437bfbebSnyanmisaka size_t rec_size = mpp_buffer_get_size(recon_buf->buf[0]);
2428*437bfbebSnyanmisaka size_t dws_size = mpp_buffer_get_size(recon_buf->buf[1]);
2429*437bfbebSnyanmisaka
2430*437bfbebSnyanmisaka void *ptr = mpp_buffer_get_ptr(recon_buf->buf[0]);
2431*437bfbebSnyanmisaka void *dws_ptr = mpp_buffer_get_ptr(recon_buf->buf[1]);
2432*437bfbebSnyanmisaka
2433*437bfbebSnyanmisaka sprintf(&file_name[0], "fbd%d.bin", frm_num);
2434*437bfbebSnyanmisaka if (fp_fbd != NULL) {
2435*437bfbebSnyanmisaka fclose(fp_fbd);
2436*437bfbebSnyanmisaka fp_fbd = NULL;
2437*437bfbebSnyanmisaka } else {
2438*437bfbebSnyanmisaka fp_fbd = fopen(file_name, "wb+");
2439*437bfbebSnyanmisaka }
2440*437bfbebSnyanmisaka if (fp_fbd) {
2441*437bfbebSnyanmisaka fwrite(ptr + ctx->fbc_header_len, 1, rec_size - ctx->fbc_header_len, fp_fbd);
2442*437bfbebSnyanmisaka fflush(fp_fbd);
2443*437bfbebSnyanmisaka }
2444*437bfbebSnyanmisaka
2445*437bfbebSnyanmisaka sprintf(&file_name[0], "fbh%d.bin", frm_num);
2446*437bfbebSnyanmisaka
2447*437bfbebSnyanmisaka if (fp_fbh != NULL) {
2448*437bfbebSnyanmisaka fclose(fp_fbh);
2449*437bfbebSnyanmisaka fp_fbh = NULL;
2450*437bfbebSnyanmisaka } else {
2451*437bfbebSnyanmisaka fp_fbh = fopen(file_name, "wb+");
2452*437bfbebSnyanmisaka }
2453*437bfbebSnyanmisaka
2454*437bfbebSnyanmisaka if (fp_fbh) {
2455*437bfbebSnyanmisaka fwrite(ptr , 1, ctx->fbc_header_len, fp_fbh);
2456*437bfbebSnyanmisaka fflush(fp_fbh);
2457*437bfbebSnyanmisaka }
2458*437bfbebSnyanmisaka
2459*437bfbebSnyanmisaka sprintf(&file_name[0], "dws%d.bin", frm_num);
2460*437bfbebSnyanmisaka
2461*437bfbebSnyanmisaka if (fp_dws != NULL) {
2462*437bfbebSnyanmisaka fclose(fp_dws);
2463*437bfbebSnyanmisaka fp_dws = NULL;
2464*437bfbebSnyanmisaka } else {
2465*437bfbebSnyanmisaka fp_dws = fopen(file_name, "wb+");
2466*437bfbebSnyanmisaka }
2467*437bfbebSnyanmisaka
2468*437bfbebSnyanmisaka if (fp_dws) {
2469*437bfbebSnyanmisaka fwrite(dws_ptr , 1, dws_size, fp_dws);
2470*437bfbebSnyanmisaka fflush(fp_dws);
2471*437bfbebSnyanmisaka }
2472*437bfbebSnyanmisaka frm_num++;
2473*437bfbebSnyanmisaka #endif
2474*437bfbebSnyanmisaka if (ret)
2475*437bfbebSnyanmisaka mpp_err_f("poll cmd failed %d status %d \n", ret, elem->hw_status);
2476*437bfbebSnyanmisaka
2477*437bfbebSnyanmisaka hal_h265e_leave();
2478*437bfbebSnyanmisaka return ret;
2479*437bfbebSnyanmisaka }
2480*437bfbebSnyanmisaka
hal_h265e_v510_get_task(void * hal,HalEncTask * task)2481*437bfbebSnyanmisaka MPP_RET hal_h265e_v510_get_task(void *hal, HalEncTask *task)
2482*437bfbebSnyanmisaka {
2483*437bfbebSnyanmisaka H265eV510HalContext *ctx = (H265eV510HalContext *)hal;
2484*437bfbebSnyanmisaka Vepu510H265eFrmCfg *frm_cfg = NULL;
2485*437bfbebSnyanmisaka MppFrame frame = task->frame;
2486*437bfbebSnyanmisaka EncFrmStatus *frm_status = &task->rc_task->frm;
2487*437bfbebSnyanmisaka RK_S32 task_idx = ctx->task_idx;
2488*437bfbebSnyanmisaka
2489*437bfbebSnyanmisaka hal_h265e_enter();
2490*437bfbebSnyanmisaka
2491*437bfbebSnyanmisaka ctx->syn = (H265eSyntax_new *)task->syntax.data;
2492*437bfbebSnyanmisaka ctx->dpb = (H265eDpb*)ctx->syn->dpb;
2493*437bfbebSnyanmisaka ctx->smart_en = (ctx->cfg->rc.rc_mode == MPP_ENC_RC_MODE_SMTRC);
2494*437bfbebSnyanmisaka ctx->qpmap_en = ctx->cfg->tune.deblur_en;
2495*437bfbebSnyanmisaka ctx->sp_enc_en = ctx->cfg->rc.rc_mode == MPP_ENC_RC_MODE_SE;
2496*437bfbebSnyanmisaka
2497*437bfbebSnyanmisaka if (vepu510_h265_setup_hal_bufs(ctx)) {
2498*437bfbebSnyanmisaka hal_h265e_err("vepu541_h265_allocate_buffers failed, free buffers and return\n");
2499*437bfbebSnyanmisaka task->flags.err |= HAL_ENC_TASK_ERR_ALLOC;
2500*437bfbebSnyanmisaka return MPP_ERR_MALLOC;
2501*437bfbebSnyanmisaka }
2502*437bfbebSnyanmisaka
2503*437bfbebSnyanmisaka ctx->last_frame_type = ctx->frame_type;
2504*437bfbebSnyanmisaka frm_cfg = ctx->frms[task_idx];
2505*437bfbebSnyanmisaka ctx->frm = frm_cfg;
2506*437bfbebSnyanmisaka
2507*437bfbebSnyanmisaka if (frm_status->is_intra) {
2508*437bfbebSnyanmisaka ctx->frame_type = INTRA_FRAME;
2509*437bfbebSnyanmisaka } else {
2510*437bfbebSnyanmisaka ctx->frame_type = INTER_P_FRAME;
2511*437bfbebSnyanmisaka }
2512*437bfbebSnyanmisaka
2513*437bfbebSnyanmisaka if (!frm_status->reencode && mpp_frame_has_meta(task->frame)) {
2514*437bfbebSnyanmisaka MppMeta meta = mpp_frame_get_meta(frame);
2515*437bfbebSnyanmisaka
2516*437bfbebSnyanmisaka mpp_meta_get_ptr(meta, KEY_ROI_DATA, (void **)&ctx->roi_data);
2517*437bfbebSnyanmisaka }
2518*437bfbebSnyanmisaka
2519*437bfbebSnyanmisaka task->part_first = 1;
2520*437bfbebSnyanmisaka task->part_last = 0;
2521*437bfbebSnyanmisaka task->flags.reg_idx = ctx->task_idx;
2522*437bfbebSnyanmisaka ctx->ext_line_buf = ctx->ext_line_bufs[ctx->task_idx];
2523*437bfbebSnyanmisaka frm_cfg->frame_count = ctx->frame_count++;
2524*437bfbebSnyanmisaka
2525*437bfbebSnyanmisaka ctx->task_idx++;
2526*437bfbebSnyanmisaka if (ctx->task_idx >= ctx->task_cnt)
2527*437bfbebSnyanmisaka ctx->task_idx = 0;
2528*437bfbebSnyanmisaka
2529*437bfbebSnyanmisaka frm_cfg->hal_curr_idx = ctx->syn->sp.recon_pic.slot_idx;
2530*437bfbebSnyanmisaka frm_cfg->hal_refr_idx = ctx->syn->sp.ref_pic.slot_idx;
2531*437bfbebSnyanmisaka
2532*437bfbebSnyanmisaka h265e_dpb_hal_start(ctx->dpb, frm_cfg->hal_curr_idx);
2533*437bfbebSnyanmisaka h265e_dpb_hal_start(ctx->dpb, frm_cfg->hal_refr_idx);
2534*437bfbebSnyanmisaka
2535*437bfbebSnyanmisaka memset(&frm_cfg->feedback, 0, sizeof(Vepu510H265Fbk));
2536*437bfbebSnyanmisaka
2537*437bfbebSnyanmisaka hal_h265e_leave();
2538*437bfbebSnyanmisaka return MPP_OK;
2539*437bfbebSnyanmisaka }
2540*437bfbebSnyanmisaka
hal_h265e_v510_ret_task(void * hal,HalEncTask * task)2541*437bfbebSnyanmisaka MPP_RET hal_h265e_v510_ret_task(void *hal, HalEncTask *task)
2542*437bfbebSnyanmisaka {
2543*437bfbebSnyanmisaka H265eV510HalContext *ctx = (H265eV510HalContext *)hal;
2544*437bfbebSnyanmisaka HalEncTask *enc_task = task;
2545*437bfbebSnyanmisaka RK_S32 task_idx = task->flags.reg_idx;
2546*437bfbebSnyanmisaka Vepu510H265eFrmCfg *frm = ctx->frms[task_idx];
2547*437bfbebSnyanmisaka Vepu510H265Fbk *fb = &frm->feedback;
2548*437bfbebSnyanmisaka EncRcTaskInfo *rc_info = &task->rc_task->info;
2549*437bfbebSnyanmisaka RK_U32 offset = mpp_packet_get_length(enc_task->packet);
2550*437bfbebSnyanmisaka
2551*437bfbebSnyanmisaka hal_h265e_enter();
2552*437bfbebSnyanmisaka
2553*437bfbebSnyanmisaka vepu510_h265_set_feedback(ctx, enc_task);
2554*437bfbebSnyanmisaka mpp_buffer_sync_partial_begin(enc_task->output, offset, fb->out_strm_size);
2555*437bfbebSnyanmisaka hal_h265e_amend_temporal_id(task, fb->out_strm_size);
2556*437bfbebSnyanmisaka
2557*437bfbebSnyanmisaka rc_info->sse = fb->sse_sum;
2558*437bfbebSnyanmisaka rc_info->lvl64_inter_num = fb->st_lvl64_inter_num;
2559*437bfbebSnyanmisaka rc_info->lvl32_inter_num = fb->st_lvl32_inter_num;
2560*437bfbebSnyanmisaka rc_info->lvl16_inter_num = fb->st_lvl16_inter_num;
2561*437bfbebSnyanmisaka rc_info->lvl8_inter_num = fb->st_lvl8_inter_num;
2562*437bfbebSnyanmisaka rc_info->lvl32_intra_num = fb->st_lvl32_intra_num;
2563*437bfbebSnyanmisaka rc_info->lvl16_intra_num = fb->st_lvl16_intra_num;
2564*437bfbebSnyanmisaka rc_info->lvl8_intra_num = fb->st_lvl8_intra_num;
2565*437bfbebSnyanmisaka rc_info->lvl4_intra_num = fb->st_lvl4_intra_num;
2566*437bfbebSnyanmisaka
2567*437bfbebSnyanmisaka enc_task->hw_length = fb->out_strm_size;
2568*437bfbebSnyanmisaka enc_task->length += fb->out_strm_size;
2569*437bfbebSnyanmisaka
2570*437bfbebSnyanmisaka h265e_dpb_hal_end(ctx->dpb, frm->hal_curr_idx);
2571*437bfbebSnyanmisaka h265e_dpb_hal_end(ctx->dpb, frm->hal_refr_idx);
2572*437bfbebSnyanmisaka
2573*437bfbebSnyanmisaka vepu510_h265e_tune_stat_update(ctx->tune, enc_task);
2574*437bfbebSnyanmisaka
2575*437bfbebSnyanmisaka hal_h265e_dbg_detail("output stream size %d\n", fb->out_strm_size);
2576*437bfbebSnyanmisaka hal_h265e_leave();
2577*437bfbebSnyanmisaka return MPP_OK;
2578*437bfbebSnyanmisaka }
2579*437bfbebSnyanmisaka
2580*437bfbebSnyanmisaka const MppEncHalApi hal_h265e_vepu510 = {
2581*437bfbebSnyanmisaka "hal_h265e_v510",
2582*437bfbebSnyanmisaka MPP_VIDEO_CodingHEVC,
2583*437bfbebSnyanmisaka sizeof(H265eV510HalContext),
2584*437bfbebSnyanmisaka 0,
2585*437bfbebSnyanmisaka hal_h265e_v510_init,
2586*437bfbebSnyanmisaka hal_h265e_v510_deinit,
2587*437bfbebSnyanmisaka hal_h265e_vepu510_prepare,
2588*437bfbebSnyanmisaka hal_h265e_v510_get_task,
2589*437bfbebSnyanmisaka hal_h265e_v510_gen_regs,
2590*437bfbebSnyanmisaka hal_h265e_v510_start,
2591*437bfbebSnyanmisaka hal_h265e_v510_wait,
2592*437bfbebSnyanmisaka NULL,
2593*437bfbebSnyanmisaka NULL,
2594*437bfbebSnyanmisaka hal_h265e_v510_ret_task,
2595*437bfbebSnyanmisaka };
2596