1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka * Copyright (c) 2025 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka */
5*437bfbebSnyanmisaka
6*437bfbebSnyanmisaka #define MODULE_TAG "hal_h264e_vepu511"
7*437bfbebSnyanmisaka
8*437bfbebSnyanmisaka #include <string.h>
9*437bfbebSnyanmisaka
10*437bfbebSnyanmisaka #include "mpp_env.h"
11*437bfbebSnyanmisaka #include "mpp_mem.h"
12*437bfbebSnyanmisaka #include "mpp_common.h"
13*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
14*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
15*437bfbebSnyanmisaka #include "mpp_enc_cb_param.h"
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisaka #include "rkv_enc_def.h"
18*437bfbebSnyanmisaka #include "hal_h264e_debug.h"
19*437bfbebSnyanmisaka #include "hal_bufs.h"
20*437bfbebSnyanmisaka #include "hal_h264e_vepu511_reg.h"
21*437bfbebSnyanmisaka #include "hal_h264e_vepu511.h"
22*437bfbebSnyanmisaka #include "hal_h264e_stream_amend.h"
23*437bfbebSnyanmisaka #include "h264e_dpb.h"
24*437bfbebSnyanmisaka
25*437bfbebSnyanmisaka #include "vepu5xx.h"
26*437bfbebSnyanmisaka #include "vepu5xx_common.h"
27*437bfbebSnyanmisaka #include "vepu511_common.h"
28*437bfbebSnyanmisaka
29*437bfbebSnyanmisaka #define DUMP_REG 0
30*437bfbebSnyanmisaka #define MAX_TASK_CNT 2
31*437bfbebSnyanmisaka #define VEPU540C_MAX_ROI_NUM 8
32*437bfbebSnyanmisaka
33*437bfbebSnyanmisaka /* Custom Quant Matrices: Joint Video Team */
34*437bfbebSnyanmisaka static RK_U8 vepu511_h264_cqm_jvt8i[64] = {
35*437bfbebSnyanmisaka 6, 10, 13, 16, 18, 23, 25, 27,
36*437bfbebSnyanmisaka 10, 11, 16, 18, 23, 25, 27, 29,
37*437bfbebSnyanmisaka 13, 16, 18, 23, 25, 27, 29, 31,
38*437bfbebSnyanmisaka 16, 18, 23, 25, 27, 29, 31, 33,
39*437bfbebSnyanmisaka 18, 23, 25, 27, 29, 31, 33, 36,
40*437bfbebSnyanmisaka 23, 25, 27, 29, 31, 33, 36, 38,
41*437bfbebSnyanmisaka 25, 27, 29, 31, 33, 36, 38, 40,
42*437bfbebSnyanmisaka 27, 29, 31, 33, 36, 38, 40, 42
43*437bfbebSnyanmisaka };
44*437bfbebSnyanmisaka
45*437bfbebSnyanmisaka static RK_U8 vepu511_h264_cqm_jvt8p[64] = {
46*437bfbebSnyanmisaka 9, 13, 15, 17, 19, 21, 22, 24,
47*437bfbebSnyanmisaka 13, 13, 17, 19, 21, 22, 24, 25,
48*437bfbebSnyanmisaka 15, 17, 19, 21, 22, 24, 25, 27,
49*437bfbebSnyanmisaka 17, 19, 21, 22, 24, 25, 27, 28,
50*437bfbebSnyanmisaka 19, 21, 22, 24, 25, 27, 28, 30,
51*437bfbebSnyanmisaka 21, 22, 24, 25, 27, 28, 30, 32,
52*437bfbebSnyanmisaka 22, 24, 25, 27, 28, 30, 32, 33,
53*437bfbebSnyanmisaka 24, 25, 27, 28, 30, 32, 33, 35
54*437bfbebSnyanmisaka };
55*437bfbebSnyanmisaka
56*437bfbebSnyanmisaka typedef struct Vepu511RoiH264BsCfg_t {
57*437bfbebSnyanmisaka RK_U64 force_inter : 42;
58*437bfbebSnyanmisaka RK_U64 mode_mask : 9;
59*437bfbebSnyanmisaka RK_U64 reserved : 10;
60*437bfbebSnyanmisaka RK_U64 force_intra : 1;
61*437bfbebSnyanmisaka RK_U64 qp_adj_en : 1;
62*437bfbebSnyanmisaka RK_U64 amv_en : 1;
63*437bfbebSnyanmisaka } Vepu511RoiH264BsCfg;
64*437bfbebSnyanmisaka
65*437bfbebSnyanmisaka typedef struct Vepu511H264Fbk_t {
66*437bfbebSnyanmisaka RK_U32 hw_status; /* 0:corret, 1:error */
67*437bfbebSnyanmisaka RK_U32 frame_type;
68*437bfbebSnyanmisaka RK_U32 qp_sum;
69*437bfbebSnyanmisaka RK_U32 out_strm_size;
70*437bfbebSnyanmisaka RK_U32 out_hw_strm_size;
71*437bfbebSnyanmisaka RK_S64 sse_sum;
72*437bfbebSnyanmisaka RK_U32 st_lvl64_inter_num;
73*437bfbebSnyanmisaka RK_U32 st_lvl32_inter_num;
74*437bfbebSnyanmisaka RK_U32 st_lvl16_inter_num;
75*437bfbebSnyanmisaka RK_U32 st_lvl8_inter_num;
76*437bfbebSnyanmisaka RK_U32 st_lvl32_intra_num;
77*437bfbebSnyanmisaka RK_U32 st_lvl16_intra_num;
78*437bfbebSnyanmisaka RK_U32 st_lvl8_intra_num;
79*437bfbebSnyanmisaka RK_U32 st_lvl4_intra_num;
80*437bfbebSnyanmisaka RK_U32 st_cu_num_qp[52];
81*437bfbebSnyanmisaka RK_U32 st_madp;
82*437bfbebSnyanmisaka RK_U32 st_madi;
83*437bfbebSnyanmisaka RK_U32 st_mb_num;
84*437bfbebSnyanmisaka RK_U32 st_ctu_num;
85*437bfbebSnyanmisaka RK_U32 st_smear_cnt[5];
86*437bfbebSnyanmisaka } Vepu511H264Fbk;
87*437bfbebSnyanmisaka
88*437bfbebSnyanmisaka typedef struct HalH264eVepu511Ctx_t {
89*437bfbebSnyanmisaka MppEncCfgSet *cfg;
90*437bfbebSnyanmisaka
91*437bfbebSnyanmisaka MppDev dev;
92*437bfbebSnyanmisaka RK_S32 frame_cnt;
93*437bfbebSnyanmisaka RK_U32 task_cnt;
94*437bfbebSnyanmisaka
95*437bfbebSnyanmisaka /* buffers management */
96*437bfbebSnyanmisaka HalBufs hw_recn;
97*437bfbebSnyanmisaka RK_S32 pixel_buf_fbc_hdr_size;
98*437bfbebSnyanmisaka RK_S32 pixel_buf_fbc_bdy_size;
99*437bfbebSnyanmisaka RK_S32 pixel_buf_size;
100*437bfbebSnyanmisaka RK_S32 thumb_buf_size;
101*437bfbebSnyanmisaka RK_S32 max_buf_cnt;
102*437bfbebSnyanmisaka MppDevRegOffCfgs *offsets;
103*437bfbebSnyanmisaka
104*437bfbebSnyanmisaka /* external line buffer over 4K */
105*437bfbebSnyanmisaka MppBufferGroup ext_line_buf_grp;
106*437bfbebSnyanmisaka MppBuffer ext_line_bufs[MAX_TASK_CNT];
107*437bfbebSnyanmisaka RK_S32 ext_line_buf_size;
108*437bfbebSnyanmisaka
109*437bfbebSnyanmisaka /* syntax for input from enc_impl */
110*437bfbebSnyanmisaka RK_U32 updated;
111*437bfbebSnyanmisaka H264eSps *sps;
112*437bfbebSnyanmisaka H264ePps *pps;
113*437bfbebSnyanmisaka H264eDpb *dpb;
114*437bfbebSnyanmisaka H264eFrmInfo *frms;
115*437bfbebSnyanmisaka
116*437bfbebSnyanmisaka /* async encode TSVC info */
117*437bfbebSnyanmisaka H264eReorderInfo *reorder;
118*437bfbebSnyanmisaka H264eMarkingInfo *marking;
119*437bfbebSnyanmisaka
120*437bfbebSnyanmisaka /* syntax for output to enc_impl */
121*437bfbebSnyanmisaka EncRcTaskInfo hal_rc_cfg;
122*437bfbebSnyanmisaka
123*437bfbebSnyanmisaka /* osd */
124*437bfbebSnyanmisaka Vepu511OsdCfg osd_cfg;
125*437bfbebSnyanmisaka
126*437bfbebSnyanmisaka /* roi */
127*437bfbebSnyanmisaka void *roi_data;
128*437bfbebSnyanmisaka MppBufferGroup roi_grp;
129*437bfbebSnyanmisaka MppBuffer roi_base_cfg_buf;
130*437bfbebSnyanmisaka RK_S32 roi_base_buf_size;
131*437bfbebSnyanmisaka
132*437bfbebSnyanmisaka /* two-pass deflicker */
133*437bfbebSnyanmisaka MppBuffer buf_pass1;
134*437bfbebSnyanmisaka
135*437bfbebSnyanmisaka /* register */
136*437bfbebSnyanmisaka HalVepu511RegSet *regs_sets;
137*437bfbebSnyanmisaka HalH264eVepuStreamAmend *amend_sets;
138*437bfbebSnyanmisaka
139*437bfbebSnyanmisaka H264ePrefixNal *prefix_sets;
140*437bfbebSnyanmisaka H264eSlice *slice_sets;
141*437bfbebSnyanmisaka
142*437bfbebSnyanmisaka /* frame parallel info */
143*437bfbebSnyanmisaka RK_S32 task_idx;
144*437bfbebSnyanmisaka RK_S32 curr_idx;
145*437bfbebSnyanmisaka RK_S32 prev_idx;
146*437bfbebSnyanmisaka HalVepu511RegSet *regs_set;
147*437bfbebSnyanmisaka HalH264eVepuStreamAmend *amend;
148*437bfbebSnyanmisaka H264ePrefixNal *prefix;
149*437bfbebSnyanmisaka H264eSlice *slice;
150*437bfbebSnyanmisaka
151*437bfbebSnyanmisaka MppBuffer ext_line_buf;
152*437bfbebSnyanmisaka
153*437bfbebSnyanmisaka /* slice low delay output callback */
154*437bfbebSnyanmisaka MppCbCtx *output_cb;
155*437bfbebSnyanmisaka RK_S32 poll_slice_max;
156*437bfbebSnyanmisaka RK_S32 poll_cfg_size;
157*437bfbebSnyanmisaka MppDevPollCfg *poll_cfgs;
158*437bfbebSnyanmisaka
159*437bfbebSnyanmisaka Vepu511H264Fbk feedback;
160*437bfbebSnyanmisaka Vepu511H264Fbk last_frame_fb;
161*437bfbebSnyanmisaka
162*437bfbebSnyanmisaka void *tune;
163*437bfbebSnyanmisaka RK_S32 smart_en;
164*437bfbebSnyanmisaka RK_S32 qpmap_en;
165*437bfbebSnyanmisaka } HalH264eVepu511Ctx;
166*437bfbebSnyanmisaka
167*437bfbebSnyanmisaka static RK_S32 h264_aq_tthd_default[16] = {
168*437bfbebSnyanmisaka 0, 0, 0, 0, 3, 3, 5, 5,
169*437bfbebSnyanmisaka 8, 8, 8, 15, 15, 20, 25, 25
170*437bfbebSnyanmisaka };
171*437bfbebSnyanmisaka
172*437bfbebSnyanmisaka static RK_S32 h264_P_aq_step_default[16] = {
173*437bfbebSnyanmisaka -8, -7, -6, -5, -4, -3, -2, -1,
174*437bfbebSnyanmisaka 0, 1, 2, 3, 4, 5, 7, 8
175*437bfbebSnyanmisaka };
176*437bfbebSnyanmisaka
177*437bfbebSnyanmisaka static RK_S32 h264_I_aq_step_default[16] = {
178*437bfbebSnyanmisaka -8, -7, -6, -5, -4, -3, -2, -1,
179*437bfbebSnyanmisaka 0, 1, 2, 3, 4, 5, 7, 8
180*437bfbebSnyanmisaka };
181*437bfbebSnyanmisaka
setup_ext_line_bufs(HalH264eVepu511Ctx * ctx)182*437bfbebSnyanmisaka static void setup_ext_line_bufs(HalH264eVepu511Ctx *ctx)
183*437bfbebSnyanmisaka {
184*437bfbebSnyanmisaka RK_U32 i;
185*437bfbebSnyanmisaka
186*437bfbebSnyanmisaka for (i = 0; i < ctx->task_cnt; i++) {
187*437bfbebSnyanmisaka if (ctx->ext_line_bufs[i])
188*437bfbebSnyanmisaka continue;
189*437bfbebSnyanmisaka
190*437bfbebSnyanmisaka mpp_buffer_get(ctx->ext_line_buf_grp, &ctx->ext_line_bufs[i],
191*437bfbebSnyanmisaka ctx->ext_line_buf_size);
192*437bfbebSnyanmisaka }
193*437bfbebSnyanmisaka }
194*437bfbebSnyanmisaka
clear_ext_line_bufs(HalH264eVepu511Ctx * ctx)195*437bfbebSnyanmisaka static void clear_ext_line_bufs(HalH264eVepu511Ctx *ctx)
196*437bfbebSnyanmisaka {
197*437bfbebSnyanmisaka RK_U32 i;
198*437bfbebSnyanmisaka
199*437bfbebSnyanmisaka for (i = 0; i < ctx->task_cnt; i++) {
200*437bfbebSnyanmisaka if (ctx->ext_line_bufs[i]) {
201*437bfbebSnyanmisaka mpp_buffer_put(ctx->ext_line_bufs[i]);
202*437bfbebSnyanmisaka ctx->ext_line_bufs[i] = NULL;
203*437bfbebSnyanmisaka }
204*437bfbebSnyanmisaka }
205*437bfbebSnyanmisaka }
206*437bfbebSnyanmisaka
hal_h264e_vepu511_deinit(void * hal)207*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu511_deinit(void *hal)
208*437bfbebSnyanmisaka {
209*437bfbebSnyanmisaka HalH264eVepu511Ctx *p = (HalH264eVepu511Ctx *)hal;
210*437bfbebSnyanmisaka RK_U32 i;
211*437bfbebSnyanmisaka
212*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", p);
213*437bfbebSnyanmisaka
214*437bfbebSnyanmisaka if (p->dev) {
215*437bfbebSnyanmisaka mpp_dev_deinit(p->dev);
216*437bfbebSnyanmisaka p->dev = NULL;
217*437bfbebSnyanmisaka }
218*437bfbebSnyanmisaka
219*437bfbebSnyanmisaka clear_ext_line_bufs(p);
220*437bfbebSnyanmisaka
221*437bfbebSnyanmisaka if (p->amend_sets) {
222*437bfbebSnyanmisaka for (i = 0; i < p->task_cnt; i++)
223*437bfbebSnyanmisaka h264e_vepu_stream_amend_deinit(&p->amend_sets[i]);
224*437bfbebSnyanmisaka }
225*437bfbebSnyanmisaka
226*437bfbebSnyanmisaka MPP_FREE(p->regs_sets);
227*437bfbebSnyanmisaka MPP_FREE(p->amend_sets);
228*437bfbebSnyanmisaka MPP_FREE(p->prefix_sets);
229*437bfbebSnyanmisaka MPP_FREE(p->slice_sets);
230*437bfbebSnyanmisaka MPP_FREE(p->reorder);
231*437bfbebSnyanmisaka MPP_FREE(p->marking);
232*437bfbebSnyanmisaka MPP_FREE(p->poll_cfgs);
233*437bfbebSnyanmisaka
234*437bfbebSnyanmisaka if (p->ext_line_buf_grp) {
235*437bfbebSnyanmisaka mpp_buffer_group_put(p->ext_line_buf_grp);
236*437bfbebSnyanmisaka p->ext_line_buf_grp = NULL;
237*437bfbebSnyanmisaka }
238*437bfbebSnyanmisaka
239*437bfbebSnyanmisaka if (p->hw_recn) {
240*437bfbebSnyanmisaka hal_bufs_deinit(p->hw_recn);
241*437bfbebSnyanmisaka p->hw_recn = NULL;
242*437bfbebSnyanmisaka }
243*437bfbebSnyanmisaka
244*437bfbebSnyanmisaka if (p->roi_base_cfg_buf) {
245*437bfbebSnyanmisaka mpp_buffer_put(p->roi_base_cfg_buf);
246*437bfbebSnyanmisaka p->roi_base_cfg_buf = NULL;
247*437bfbebSnyanmisaka p->roi_base_buf_size = 0;
248*437bfbebSnyanmisaka }
249*437bfbebSnyanmisaka
250*437bfbebSnyanmisaka if (p->roi_grp) {
251*437bfbebSnyanmisaka mpp_buffer_group_put(p->roi_grp);
252*437bfbebSnyanmisaka p->roi_grp = NULL;
253*437bfbebSnyanmisaka }
254*437bfbebSnyanmisaka
255*437bfbebSnyanmisaka if (p->offsets) {
256*437bfbebSnyanmisaka mpp_dev_multi_offset_deinit(p->offsets);
257*437bfbebSnyanmisaka p->offsets = NULL;
258*437bfbebSnyanmisaka }
259*437bfbebSnyanmisaka
260*437bfbebSnyanmisaka if (p->buf_pass1) {
261*437bfbebSnyanmisaka mpp_buffer_put(p->buf_pass1);
262*437bfbebSnyanmisaka p->buf_pass1 = NULL;
263*437bfbebSnyanmisaka }
264*437bfbebSnyanmisaka
265*437bfbebSnyanmisaka if (p->tune) {
266*437bfbebSnyanmisaka // vepu511_h264e_tune_deinit(p->tune);
267*437bfbebSnyanmisaka p->tune = NULL;
268*437bfbebSnyanmisaka }
269*437bfbebSnyanmisaka
270*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p\n", p);
271*437bfbebSnyanmisaka
272*437bfbebSnyanmisaka return MPP_OK;
273*437bfbebSnyanmisaka }
274*437bfbebSnyanmisaka
hal_h264e_vepu511_init(void * hal,MppEncHalCfg * cfg)275*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu511_init(void *hal, MppEncHalCfg *cfg)
276*437bfbebSnyanmisaka {
277*437bfbebSnyanmisaka HalH264eVepu511Ctx *p = (HalH264eVepu511Ctx *)hal;
278*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
279*437bfbebSnyanmisaka RK_U32 i;
280*437bfbebSnyanmisaka
281*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", p);
282*437bfbebSnyanmisaka
283*437bfbebSnyanmisaka p->cfg = cfg->cfg;
284*437bfbebSnyanmisaka /* update output to MppEnc */
285*437bfbebSnyanmisaka cfg->type = VPU_CLIENT_RKVENC;
286*437bfbebSnyanmisaka ret = mpp_dev_init(&cfg->dev, cfg->type);
287*437bfbebSnyanmisaka if (ret) {
288*437bfbebSnyanmisaka mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
289*437bfbebSnyanmisaka goto DONE;
290*437bfbebSnyanmisaka }
291*437bfbebSnyanmisaka p->dev = cfg->dev;
292*437bfbebSnyanmisaka p->task_cnt = cfg->task_cnt;
293*437bfbebSnyanmisaka mpp_assert(p->task_cnt && p->task_cnt <= MAX_TASK_CNT);
294*437bfbebSnyanmisaka
295*437bfbebSnyanmisaka ret = hal_bufs_init(&p->hw_recn);
296*437bfbebSnyanmisaka if (ret) {
297*437bfbebSnyanmisaka mpp_err_f("init vepu buffer failed ret: %d\n", ret);
298*437bfbebSnyanmisaka goto DONE;
299*437bfbebSnyanmisaka }
300*437bfbebSnyanmisaka
301*437bfbebSnyanmisaka p->regs_sets = mpp_malloc(HalVepu511RegSet, p->task_cnt);
302*437bfbebSnyanmisaka if (NULL == p->regs_sets) {
303*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
304*437bfbebSnyanmisaka mpp_err_f("init register buffer failed\n");
305*437bfbebSnyanmisaka goto DONE;
306*437bfbebSnyanmisaka }
307*437bfbebSnyanmisaka
308*437bfbebSnyanmisaka p->amend_sets = mpp_malloc(HalH264eVepuStreamAmend, p->task_cnt);
309*437bfbebSnyanmisaka if (NULL == p->amend_sets) {
310*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
311*437bfbebSnyanmisaka mpp_err_f("init amend data failed\n");
312*437bfbebSnyanmisaka goto DONE;
313*437bfbebSnyanmisaka }
314*437bfbebSnyanmisaka
315*437bfbebSnyanmisaka if (p->task_cnt > 1) {
316*437bfbebSnyanmisaka p->prefix_sets = mpp_malloc(H264ePrefixNal, p->task_cnt);
317*437bfbebSnyanmisaka if (NULL == p->prefix_sets) {
318*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
319*437bfbebSnyanmisaka mpp_err_f("init amend data failed\n");
320*437bfbebSnyanmisaka goto DONE;
321*437bfbebSnyanmisaka }
322*437bfbebSnyanmisaka
323*437bfbebSnyanmisaka p->slice_sets = mpp_malloc(H264eSlice, p->task_cnt);
324*437bfbebSnyanmisaka if (NULL == p->slice_sets) {
325*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
326*437bfbebSnyanmisaka mpp_err_f("init amend data failed\n");
327*437bfbebSnyanmisaka goto DONE;
328*437bfbebSnyanmisaka }
329*437bfbebSnyanmisaka
330*437bfbebSnyanmisaka p->reorder = mpp_malloc(H264eReorderInfo, 1);
331*437bfbebSnyanmisaka if (NULL == p->reorder) {
332*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
333*437bfbebSnyanmisaka mpp_err_f("init amend data failed\n");
334*437bfbebSnyanmisaka goto DONE;
335*437bfbebSnyanmisaka }
336*437bfbebSnyanmisaka
337*437bfbebSnyanmisaka p->marking = mpp_malloc(H264eMarkingInfo, 1);
338*437bfbebSnyanmisaka if (NULL == p->marking) {
339*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
340*437bfbebSnyanmisaka mpp_err_f("init amend data failed\n");
341*437bfbebSnyanmisaka goto DONE;
342*437bfbebSnyanmisaka }
343*437bfbebSnyanmisaka }
344*437bfbebSnyanmisaka
345*437bfbebSnyanmisaka p->poll_slice_max = 8;
346*437bfbebSnyanmisaka p->poll_cfg_size = (sizeof(p->poll_cfgs) + sizeof(RK_S32) * p->poll_slice_max);
347*437bfbebSnyanmisaka p->poll_cfgs = mpp_malloc_size(MppDevPollCfg, p->poll_cfg_size * p->task_cnt);
348*437bfbebSnyanmisaka if (NULL == p->poll_cfgs) {
349*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
350*437bfbebSnyanmisaka mpp_err_f("init poll cfg buffer failed\n");
351*437bfbebSnyanmisaka goto DONE;
352*437bfbebSnyanmisaka }
353*437bfbebSnyanmisaka
354*437bfbebSnyanmisaka { /* setup default hardware config */
355*437bfbebSnyanmisaka MppEncHwCfg *hw = &cfg->cfg->hw;
356*437bfbebSnyanmisaka
357*437bfbebSnyanmisaka hw->qp_delta_row_i = 1;
358*437bfbebSnyanmisaka hw->qp_delta_row = 2;
359*437bfbebSnyanmisaka hw->extra_buf = 1;
360*437bfbebSnyanmisaka hw->qbias_i = 683;
361*437bfbebSnyanmisaka hw->qbias_p = 341;
362*437bfbebSnyanmisaka hw->qbias_en = 0;
363*437bfbebSnyanmisaka
364*437bfbebSnyanmisaka memcpy(hw->aq_thrd_i, h264_aq_tthd_default, sizeof(hw->aq_thrd_i));
365*437bfbebSnyanmisaka memcpy(hw->aq_thrd_p, h264_aq_tthd_default, sizeof(hw->aq_thrd_p));
366*437bfbebSnyanmisaka memcpy(hw->aq_step_i, h264_I_aq_step_default, sizeof(hw->aq_step_i));
367*437bfbebSnyanmisaka memcpy(hw->aq_step_p, h264_P_aq_step_default, sizeof(hw->aq_step_p));
368*437bfbebSnyanmisaka
369*437bfbebSnyanmisaka for (i = 0; i < MPP_ARRAY_ELEMS(hw->mode_bias); i++)
370*437bfbebSnyanmisaka hw->mode_bias[i] = 8;
371*437bfbebSnyanmisaka
372*437bfbebSnyanmisaka hw->skip_sad = 8;
373*437bfbebSnyanmisaka hw->skip_bias = 8;
374*437bfbebSnyanmisaka }
375*437bfbebSnyanmisaka
376*437bfbebSnyanmisaka mpp_dev_multi_offset_init(&p->offsets, 24);
377*437bfbebSnyanmisaka p->output_cb = cfg->output_cb;
378*437bfbebSnyanmisaka cfg->cap_recn_out = 1;
379*437bfbebSnyanmisaka for (i = 0; i < p->task_cnt; i++)
380*437bfbebSnyanmisaka h264e_vepu_stream_amend_init(&p->amend_sets[i]);
381*437bfbebSnyanmisaka
382*437bfbebSnyanmisaka // p->tune = vepu511_h264e_tune_init(p);
383*437bfbebSnyanmisaka
384*437bfbebSnyanmisaka DONE:
385*437bfbebSnyanmisaka if (ret)
386*437bfbebSnyanmisaka hal_h264e_vepu511_deinit(hal);
387*437bfbebSnyanmisaka
388*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p\n", p);
389*437bfbebSnyanmisaka return ret;
390*437bfbebSnyanmisaka }
391*437bfbebSnyanmisaka
392*437bfbebSnyanmisaka /*
393*437bfbebSnyanmisaka * NOTE: recon / refer buffer is FBC data buffer.
394*437bfbebSnyanmisaka * And FBC data require extra 16 lines space for hardware io.
395*437bfbebSnyanmisaka */
setup_hal_bufs(HalH264eVepu511Ctx * ctx)396*437bfbebSnyanmisaka static void setup_hal_bufs(HalH264eVepu511Ctx *ctx)
397*437bfbebSnyanmisaka {
398*437bfbebSnyanmisaka MppEncCfgSet *cfg = ctx->cfg;
399*437bfbebSnyanmisaka MppEncPrepCfg *prep = &cfg->prep;
400*437bfbebSnyanmisaka RK_S32 alignment_w = 64;
401*437bfbebSnyanmisaka RK_S32 alignment_h = 16;
402*437bfbebSnyanmisaka RK_S32 aligned_w = MPP_ALIGN(prep->width, alignment_w);
403*437bfbebSnyanmisaka RK_S32 aligned_h = MPP_ALIGN(prep->height, alignment_h) + 16;
404*437bfbebSnyanmisaka RK_S32 pixel_buf_fbc_hdr_size = MPP_ALIGN(aligned_w * aligned_h / 64, SZ_8K);
405*437bfbebSnyanmisaka RK_S32 pixel_buf_fbc_bdy_size = aligned_w * aligned_h * 3 / 2;
406*437bfbebSnyanmisaka RK_S32 pixel_buf_size = pixel_buf_fbc_hdr_size + pixel_buf_fbc_bdy_size;
407*437bfbebSnyanmisaka RK_S32 thumb_buf_size = MPP_ALIGN(aligned_w / 64 * aligned_h / 64 * 256, SZ_8K);
408*437bfbebSnyanmisaka RK_S32 old_max_cnt = ctx->max_buf_cnt;
409*437bfbebSnyanmisaka RK_S32 new_max_cnt = 4;
410*437bfbebSnyanmisaka MppEncRefCfg ref_cfg = cfg->ref_cfg;
411*437bfbebSnyanmisaka
412*437bfbebSnyanmisaka if (ref_cfg) {
413*437bfbebSnyanmisaka MppEncCpbInfo *info = mpp_enc_ref_cfg_get_cpb_info(ref_cfg);
414*437bfbebSnyanmisaka if (new_max_cnt < MPP_MAX(new_max_cnt, info->dpb_size + 1))
415*437bfbebSnyanmisaka new_max_cnt = MPP_MAX(new_max_cnt, info->dpb_size + 1);
416*437bfbebSnyanmisaka }
417*437bfbebSnyanmisaka
418*437bfbebSnyanmisaka if (aligned_w > SZ_4K) {
419*437bfbebSnyanmisaka RK_S32 ctu_w = (aligned_w + 63) / 64;
420*437bfbebSnyanmisaka RK_S32 ext_line_buf_size = ((ctu_w - 53) * 53 + 15) / 16 * 16 * 16;
421*437bfbebSnyanmisaka
422*437bfbebSnyanmisaka if (NULL == ctx->ext_line_buf_grp)
423*437bfbebSnyanmisaka mpp_buffer_group_get_internal(&ctx->ext_line_buf_grp, MPP_BUFFER_TYPE_ION);
424*437bfbebSnyanmisaka else if (ext_line_buf_size != ctx->ext_line_buf_size) {
425*437bfbebSnyanmisaka clear_ext_line_bufs(ctx);
426*437bfbebSnyanmisaka mpp_buffer_group_clear(ctx->ext_line_buf_grp);
427*437bfbebSnyanmisaka }
428*437bfbebSnyanmisaka
429*437bfbebSnyanmisaka mpp_assert(ctx->ext_line_buf_grp);
430*437bfbebSnyanmisaka
431*437bfbebSnyanmisaka ctx->ext_line_buf_size = ext_line_buf_size;
432*437bfbebSnyanmisaka setup_ext_line_bufs(ctx);
433*437bfbebSnyanmisaka } else {
434*437bfbebSnyanmisaka clear_ext_line_bufs(ctx);
435*437bfbebSnyanmisaka if (ctx->ext_line_buf_grp) {
436*437bfbebSnyanmisaka mpp_buffer_group_clear(ctx->ext_line_buf_grp);
437*437bfbebSnyanmisaka mpp_buffer_group_put(ctx->ext_line_buf_grp);
438*437bfbebSnyanmisaka ctx->ext_line_buf_grp = NULL;
439*437bfbebSnyanmisaka }
440*437bfbebSnyanmisaka ctx->ext_line_buf_size = 0;
441*437bfbebSnyanmisaka }
442*437bfbebSnyanmisaka
443*437bfbebSnyanmisaka if ((ctx->pixel_buf_fbc_hdr_size != pixel_buf_fbc_hdr_size) ||
444*437bfbebSnyanmisaka (ctx->pixel_buf_fbc_bdy_size != pixel_buf_fbc_bdy_size) ||
445*437bfbebSnyanmisaka (ctx->pixel_buf_size != pixel_buf_size) ||
446*437bfbebSnyanmisaka (ctx->thumb_buf_size != thumb_buf_size) ||
447*437bfbebSnyanmisaka (new_max_cnt > old_max_cnt)) {
448*437bfbebSnyanmisaka size_t sizes[3];
449*437bfbebSnyanmisaka
450*437bfbebSnyanmisaka hal_h264e_dbg_detail("frame size %d -> %d max count %d -> %d\n",
451*437bfbebSnyanmisaka ctx->pixel_buf_size, pixel_buf_size,
452*437bfbebSnyanmisaka old_max_cnt, new_max_cnt);
453*437bfbebSnyanmisaka
454*437bfbebSnyanmisaka /* pixel buffer */
455*437bfbebSnyanmisaka sizes[0] = pixel_buf_size;
456*437bfbebSnyanmisaka /* thumb buffer */
457*437bfbebSnyanmisaka sizes[1] = thumb_buf_size;
458*437bfbebSnyanmisaka /* smear buffer */
459*437bfbebSnyanmisaka sizes[2] = MPP_ALIGN(aligned_w / 64, 16) * MPP_ALIGN(aligned_h / 16, 16);
460*437bfbebSnyanmisaka new_max_cnt = MPP_MAX(new_max_cnt, old_max_cnt);
461*437bfbebSnyanmisaka
462*437bfbebSnyanmisaka hal_bufs_setup(ctx->hw_recn, new_max_cnt, MPP_ARRAY_ELEMS(sizes), sizes);
463*437bfbebSnyanmisaka
464*437bfbebSnyanmisaka ctx->pixel_buf_fbc_hdr_size = pixel_buf_fbc_hdr_size;
465*437bfbebSnyanmisaka ctx->pixel_buf_fbc_bdy_size = pixel_buf_fbc_bdy_size;
466*437bfbebSnyanmisaka ctx->pixel_buf_size = pixel_buf_size;
467*437bfbebSnyanmisaka ctx->thumb_buf_size = thumb_buf_size;
468*437bfbebSnyanmisaka ctx->max_buf_cnt = new_max_cnt;
469*437bfbebSnyanmisaka }
470*437bfbebSnyanmisaka }
471*437bfbebSnyanmisaka
hal_h264e_vepu511_prepare(void * hal)472*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu511_prepare(void *hal)
473*437bfbebSnyanmisaka {
474*437bfbebSnyanmisaka HalH264eVepu511Ctx *ctx = (HalH264eVepu511Ctx *)hal;
475*437bfbebSnyanmisaka MppEncPrepCfg *prep = &ctx->cfg->prep;
476*437bfbebSnyanmisaka
477*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", hal);
478*437bfbebSnyanmisaka
479*437bfbebSnyanmisaka if (prep->change_res) {
480*437bfbebSnyanmisaka RK_S32 i;
481*437bfbebSnyanmisaka
482*437bfbebSnyanmisaka // pre-alloc required buffers to reduce first frame delay
483*437bfbebSnyanmisaka setup_hal_bufs(ctx);
484*437bfbebSnyanmisaka for (i = 0; i < ctx->max_buf_cnt; i++)
485*437bfbebSnyanmisaka hal_bufs_get_buf(ctx->hw_recn, i);
486*437bfbebSnyanmisaka
487*437bfbebSnyanmisaka prep->change_res = 0;
488*437bfbebSnyanmisaka }
489*437bfbebSnyanmisaka
490*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p\n", hal);
491*437bfbebSnyanmisaka
492*437bfbebSnyanmisaka return MPP_OK;
493*437bfbebSnyanmisaka }
494*437bfbebSnyanmisaka
update_vepu511_syntax(HalH264eVepu511Ctx * ctx,MppSyntax * syntax)495*437bfbebSnyanmisaka static RK_U32 update_vepu511_syntax(HalH264eVepu511Ctx *ctx, MppSyntax *syntax)
496*437bfbebSnyanmisaka {
497*437bfbebSnyanmisaka H264eSyntaxDesc *desc = syntax->data;
498*437bfbebSnyanmisaka RK_S32 syn_num = syntax->number;
499*437bfbebSnyanmisaka RK_U32 updated = 0;
500*437bfbebSnyanmisaka RK_S32 i;
501*437bfbebSnyanmisaka
502*437bfbebSnyanmisaka for (i = 0; i < syn_num; i++, desc++) {
503*437bfbebSnyanmisaka switch (desc->type) {
504*437bfbebSnyanmisaka case H264E_SYN_CFG : {
505*437bfbebSnyanmisaka hal_h264e_dbg_detail("update cfg");
506*437bfbebSnyanmisaka ctx->cfg = desc->p;
507*437bfbebSnyanmisaka } break;
508*437bfbebSnyanmisaka case H264E_SYN_SPS : {
509*437bfbebSnyanmisaka hal_h264e_dbg_detail("update sps");
510*437bfbebSnyanmisaka ctx->sps = desc->p;
511*437bfbebSnyanmisaka } break;
512*437bfbebSnyanmisaka case H264E_SYN_PPS : {
513*437bfbebSnyanmisaka hal_h264e_dbg_detail("update pps");
514*437bfbebSnyanmisaka ctx->pps = desc->p;
515*437bfbebSnyanmisaka } break;
516*437bfbebSnyanmisaka case H264E_SYN_DPB : {
517*437bfbebSnyanmisaka hal_h264e_dbg_detail("update dpb");
518*437bfbebSnyanmisaka ctx->dpb = desc->p;
519*437bfbebSnyanmisaka } break;
520*437bfbebSnyanmisaka case H264E_SYN_SLICE : {
521*437bfbebSnyanmisaka hal_h264e_dbg_detail("update slice");
522*437bfbebSnyanmisaka ctx->slice = desc->p;
523*437bfbebSnyanmisaka } break;
524*437bfbebSnyanmisaka case H264E_SYN_FRAME : {
525*437bfbebSnyanmisaka hal_h264e_dbg_detail("update frames");
526*437bfbebSnyanmisaka ctx->frms = desc->p;
527*437bfbebSnyanmisaka } break;
528*437bfbebSnyanmisaka case H264E_SYN_PREFIX : {
529*437bfbebSnyanmisaka hal_h264e_dbg_detail("update prefix nal");
530*437bfbebSnyanmisaka ctx->prefix = desc->p;
531*437bfbebSnyanmisaka } break;
532*437bfbebSnyanmisaka default : {
533*437bfbebSnyanmisaka mpp_log_f("invalid syntax type %d\n", desc->type);
534*437bfbebSnyanmisaka } break;
535*437bfbebSnyanmisaka }
536*437bfbebSnyanmisaka
537*437bfbebSnyanmisaka updated |= SYN_TYPE_FLAG(desc->type);
538*437bfbebSnyanmisaka }
539*437bfbebSnyanmisaka
540*437bfbebSnyanmisaka return updated;
541*437bfbebSnyanmisaka }
542*437bfbebSnyanmisaka
hal_h264e_vepu511_get_task(void * hal,HalEncTask * task)543*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu511_get_task(void *hal, HalEncTask *task)
544*437bfbebSnyanmisaka {
545*437bfbebSnyanmisaka HalH264eVepu511Ctx *ctx = (HalH264eVepu511Ctx *)hal;
546*437bfbebSnyanmisaka MppEncCfgSet *cfg_set = ctx->cfg;
547*437bfbebSnyanmisaka MppEncRefCfgImpl *ref = (MppEncRefCfgImpl *)cfg_set->ref_cfg;
548*437bfbebSnyanmisaka MppEncH264HwCfg *hw_cfg = &cfg_set->h264.hw_cfg;
549*437bfbebSnyanmisaka RK_U32 updated = update_vepu511_syntax(ctx, &task->syntax);
550*437bfbebSnyanmisaka EncFrmStatus *frm_status = &task->rc_task->frm;
551*437bfbebSnyanmisaka H264eFrmInfo *frms = ctx->frms;
552*437bfbebSnyanmisaka
553*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", hal);
554*437bfbebSnyanmisaka
555*437bfbebSnyanmisaka ctx->smart_en = (ctx->cfg->rc.rc_mode == MPP_ENC_RC_MODE_SMTRC);
556*437bfbebSnyanmisaka ctx->qpmap_en = ctx->cfg->tune.deblur_en;
557*437bfbebSnyanmisaka
558*437bfbebSnyanmisaka if (updated & SYN_TYPE_FLAG(H264E_SYN_CFG))
559*437bfbebSnyanmisaka setup_hal_bufs(ctx);
560*437bfbebSnyanmisaka
561*437bfbebSnyanmisaka if (!frm_status->reencode && mpp_frame_has_meta(task->frame)) {
562*437bfbebSnyanmisaka MppMeta meta = mpp_frame_get_meta(task->frame);
563*437bfbebSnyanmisaka mpp_meta_get_ptr(meta, KEY_ROI_DATA, (void **)&ctx->roi_data);
564*437bfbebSnyanmisaka mpp_meta_get_ptr_d(meta, KEY_OSD_DATA3, (void **)&ctx->osd_cfg.osd_data3, NULL);
565*437bfbebSnyanmisaka }
566*437bfbebSnyanmisaka
567*437bfbebSnyanmisaka if (!frm_status->reencode)
568*437bfbebSnyanmisaka ctx->last_frame_fb = ctx->feedback;
569*437bfbebSnyanmisaka
570*437bfbebSnyanmisaka if (ctx->dpb) {
571*437bfbebSnyanmisaka h264e_dpb_hal_start(ctx->dpb, frms->curr_idx);
572*437bfbebSnyanmisaka h264e_dpb_hal_start(ctx->dpb, frms->refr_idx);
573*437bfbebSnyanmisaka }
574*437bfbebSnyanmisaka
575*437bfbebSnyanmisaka task->flags.reg_idx = ctx->task_idx;
576*437bfbebSnyanmisaka task->flags.curr_idx = frms->curr_idx;
577*437bfbebSnyanmisaka task->flags.refr_idx = frms->refr_idx;
578*437bfbebSnyanmisaka task->part_first = 1;
579*437bfbebSnyanmisaka task->part_last = 0;
580*437bfbebSnyanmisaka
581*437bfbebSnyanmisaka ctx->ext_line_buf = ctx->ext_line_bufs[ctx->task_idx];
582*437bfbebSnyanmisaka ctx->regs_set = &ctx->regs_sets[ctx->task_idx];
583*437bfbebSnyanmisaka ctx->amend = &ctx->amend_sets[ctx->task_idx];
584*437bfbebSnyanmisaka
585*437bfbebSnyanmisaka /* if not VEPU1/2, update log2_max_frame_num_minus4 in hw_cfg */
586*437bfbebSnyanmisaka hw_cfg->hw_log2_max_frame_num_minus4 = ctx->sps->log2_max_frame_num_minus4;
587*437bfbebSnyanmisaka hw_cfg->hw_poc_type = ctx->sps->pic_order_cnt_type;
588*437bfbebSnyanmisaka
589*437bfbebSnyanmisaka if (ctx->task_cnt > 1 && (ref->lt_cfg_cnt || ref->st_cfg_cnt > 1)) {
590*437bfbebSnyanmisaka H264ePrefixNal *prefix = &ctx->prefix_sets[ctx->task_idx];
591*437bfbebSnyanmisaka H264eSlice *slice = &ctx->slice_sets[ctx->task_idx];
592*437bfbebSnyanmisaka
593*437bfbebSnyanmisaka //store async encode TSVC info
594*437bfbebSnyanmisaka if (ctx->prefix)
595*437bfbebSnyanmisaka memcpy(prefix, ctx->prefix, sizeof(H264ePrefixNal));
596*437bfbebSnyanmisaka else
597*437bfbebSnyanmisaka prefix = NULL;
598*437bfbebSnyanmisaka
599*437bfbebSnyanmisaka if (ctx->slice) {
600*437bfbebSnyanmisaka memcpy(slice, ctx->slice, sizeof(H264eSlice));
601*437bfbebSnyanmisaka
602*437bfbebSnyanmisaka /*
603*437bfbebSnyanmisaka * Generally, reorder and marking are shared by dpb and slice.
604*437bfbebSnyanmisaka * However, async encoding TSVC will change reorder and marking in each task.
605*437bfbebSnyanmisaka * Therefore, malloc a special space for async encoding TSVC.
606*437bfbebSnyanmisaka */
607*437bfbebSnyanmisaka ctx->amend->reorder = ctx->reorder;
608*437bfbebSnyanmisaka ctx->amend->marking = ctx->marking;
609*437bfbebSnyanmisaka }
610*437bfbebSnyanmisaka
611*437bfbebSnyanmisaka h264e_vepu_stream_amend_config(ctx->amend, task->packet, ctx->cfg,
612*437bfbebSnyanmisaka slice, prefix);
613*437bfbebSnyanmisaka } else {
614*437bfbebSnyanmisaka h264e_vepu_stream_amend_config(ctx->amend, task->packet, ctx->cfg,
615*437bfbebSnyanmisaka ctx->slice, ctx->prefix);
616*437bfbebSnyanmisaka }
617*437bfbebSnyanmisaka
618*437bfbebSnyanmisaka if (ctx->task_cnt > 1)
619*437bfbebSnyanmisaka ctx->task_idx = !ctx->task_idx;
620*437bfbebSnyanmisaka
621*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p\n", hal);
622*437bfbebSnyanmisaka
623*437bfbebSnyanmisaka return MPP_OK;
624*437bfbebSnyanmisaka }
625*437bfbebSnyanmisaka
setup_vepu511_normal(HalVepu511RegSet * regs)626*437bfbebSnyanmisaka static void setup_vepu511_normal(HalVepu511RegSet *regs)
627*437bfbebSnyanmisaka {
628*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
629*437bfbebSnyanmisaka /* reg000 VERSION is read only */
630*437bfbebSnyanmisaka
631*437bfbebSnyanmisaka /* reg001 ENC_STRT */
632*437bfbebSnyanmisaka regs->reg_ctl.enc_strt.lkt_num = 0;
633*437bfbebSnyanmisaka regs->reg_ctl.enc_strt.vepu_cmd = 1;
634*437bfbebSnyanmisaka
635*437bfbebSnyanmisaka regs->reg_ctl.opt_strg.cke = 1;
636*437bfbebSnyanmisaka regs->reg_ctl.opt_strg.resetn_hw_en = 1;
637*437bfbebSnyanmisaka
638*437bfbebSnyanmisaka /* reg002 ENC_CLR */
639*437bfbebSnyanmisaka regs->reg_ctl.enc_clr.safe_clr = 0;
640*437bfbebSnyanmisaka regs->reg_ctl.enc_clr.force_clr = 0;
641*437bfbebSnyanmisaka
642*437bfbebSnyanmisaka /* reg004 INT_EN */
643*437bfbebSnyanmisaka regs->reg_ctl.int_en.enc_done_en = 1;
644*437bfbebSnyanmisaka regs->reg_ctl.int_en.lkt_node_done_en = 1;
645*437bfbebSnyanmisaka regs->reg_ctl.int_en.sclr_done_en = 1;
646*437bfbebSnyanmisaka regs->reg_ctl.int_en.vslc_done_en = 0;
647*437bfbebSnyanmisaka regs->reg_ctl.int_en.vbsf_oflw_en = 1;
648*437bfbebSnyanmisaka regs->reg_ctl.int_en.vbuf_lens_en = 1;
649*437bfbebSnyanmisaka regs->reg_ctl.int_en.enc_err_en = 1;
650*437bfbebSnyanmisaka
651*437bfbebSnyanmisaka regs->reg_ctl.int_en.wdg_en = 1;
652*437bfbebSnyanmisaka regs->reg_ctl.int_en.vsrc_err_en = 1;
653*437bfbebSnyanmisaka regs->reg_ctl.int_en.wdg_en = 1;
654*437bfbebSnyanmisaka regs->reg_ctl.int_en.lkt_err_int_en = 1;
655*437bfbebSnyanmisaka regs->reg_ctl.int_en.lkt_err_stop_en = 1;
656*437bfbebSnyanmisaka regs->reg_ctl.int_en.lkt_force_stop_en = 1;
657*437bfbebSnyanmisaka regs->reg_ctl.int_en.jslc_done_en = 1;
658*437bfbebSnyanmisaka regs->reg_ctl.int_en.jbsf_oflw_en = 1;
659*437bfbebSnyanmisaka regs->reg_ctl.int_en.jbuf_lens_en = 1;
660*437bfbebSnyanmisaka regs->reg_ctl.int_en.dvbm_err_en = 0;
661*437bfbebSnyanmisaka
662*437bfbebSnyanmisaka /* reg005 INT_MSK */
663*437bfbebSnyanmisaka regs->reg_ctl.int_msk.enc_done_msk = 0;
664*437bfbebSnyanmisaka regs->reg_ctl.int_msk.lkt_node_done_msk = 0;
665*437bfbebSnyanmisaka regs->reg_ctl.int_msk.sclr_done_msk = 0;
666*437bfbebSnyanmisaka regs->reg_ctl.int_msk.vslc_done_msk = 0;
667*437bfbebSnyanmisaka regs->reg_ctl.int_msk.vbsf_oflw_msk = 0;
668*437bfbebSnyanmisaka regs->reg_ctl.int_msk.vbuf_lens_msk = 0;
669*437bfbebSnyanmisaka regs->reg_ctl.int_msk.enc_err_msk = 0;
670*437bfbebSnyanmisaka regs->reg_ctl.int_msk.vsrc_err_msk = 0;
671*437bfbebSnyanmisaka regs->reg_ctl.int_msk.wdg_msk = 0;
672*437bfbebSnyanmisaka regs->reg_ctl.int_msk.lkt_err_int_msk = 0;
673*437bfbebSnyanmisaka regs->reg_ctl.int_msk.lkt_err_stop_msk = 0;
674*437bfbebSnyanmisaka regs->reg_ctl.int_msk.lkt_force_stop_msk = 0;
675*437bfbebSnyanmisaka regs->reg_ctl.int_msk.jslc_done_msk = 0;
676*437bfbebSnyanmisaka regs->reg_ctl.int_msk.jbsf_oflw_msk = 0;
677*437bfbebSnyanmisaka regs->reg_ctl.int_msk.jbuf_lens_msk = 0;
678*437bfbebSnyanmisaka regs->reg_ctl.int_msk.dvbm_err_msk = 0;
679*437bfbebSnyanmisaka
680*437bfbebSnyanmisaka /* reg006 INT_CLR is not set */
681*437bfbebSnyanmisaka /* reg007 INT_STA is read only */
682*437bfbebSnyanmisaka /* reg008 ~ reg0011 gap */
683*437bfbebSnyanmisaka regs->reg_ctl.enc_wdg.vs_load_thd = 0;
684*437bfbebSnyanmisaka
685*437bfbebSnyanmisaka /* reg015 DTRNS_MAP */
686*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.jpeg_bus_edin = 0;
687*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.src_bus_edin = 0;
688*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.meiw_bus_edin = 0;
689*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.bsw_bus_edin = 7;
690*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.lktw_bus_edin = 0;
691*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.rec_nfbc_bus_edin = 0;
692*437bfbebSnyanmisaka
693*437bfbebSnyanmisaka regs->reg_ctl.dtrns_cfg.axi_brsp_cke = 0;
694*437bfbebSnyanmisaka
695*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
696*437bfbebSnyanmisaka }
697*437bfbebSnyanmisaka
setup_vepu511_prep(HalVepu511RegSet * regs,MppEncPrepCfg * prep,HalEncTask * task)698*437bfbebSnyanmisaka static MPP_RET setup_vepu511_prep(HalVepu511RegSet *regs, MppEncPrepCfg *prep, HalEncTask *task)
699*437bfbebSnyanmisaka {
700*437bfbebSnyanmisaka H264eVepu511Frame *reg_frm = ®s->reg_frm;
701*437bfbebSnyanmisaka VepuFmtCfg cfg;
702*437bfbebSnyanmisaka MppFrameFormat fmt = prep->format;
703*437bfbebSnyanmisaka MPP_RET ret = vepu5xx_set_fmt(&cfg, fmt);
704*437bfbebSnyanmisaka RK_U32 hw_fmt = cfg.format;
705*437bfbebSnyanmisaka RK_S32 y_stride;
706*437bfbebSnyanmisaka RK_S32 c_stride;
707*437bfbebSnyanmisaka
708*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
709*437bfbebSnyanmisaka
710*437bfbebSnyanmisaka /* do nothing when color format is not supported */
711*437bfbebSnyanmisaka if (ret)
712*437bfbebSnyanmisaka return ret;
713*437bfbebSnyanmisaka
714*437bfbebSnyanmisaka reg_frm->common.enc_rsl.pic_wd8_m1 = MPP_ALIGN(prep->width, 16) / 8 - 1;
715*437bfbebSnyanmisaka reg_frm->common.src_fill.pic_wfill = MPP_ALIGN(prep->width, 16) - prep->width;
716*437bfbebSnyanmisaka reg_frm->common.enc_rsl.pic_hd8_m1 = MPP_ALIGN(prep->height, 16) / 8 - 1;
717*437bfbebSnyanmisaka reg_frm->common.src_fill.pic_hfill = MPP_ALIGN(prep->height, 16) - prep->height;
718*437bfbebSnyanmisaka
719*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.src_bus_edin = cfg.src_endian;
720*437bfbebSnyanmisaka
721*437bfbebSnyanmisaka reg_frm->common.src_fmt.src_cfmt = hw_fmt;
722*437bfbebSnyanmisaka reg_frm->common.src_fmt.alpha_swap = cfg.alpha_swap;
723*437bfbebSnyanmisaka reg_frm->common.src_fmt.rbuv_swap = cfg.rbuv_swap;
724*437bfbebSnyanmisaka reg_frm->common.src_fmt.out_fmt = ((fmt & MPP_FRAME_FMT_MASK) == MPP_FMT_YUV400 ? 0 : 1);
725*437bfbebSnyanmisaka
726*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_FBC(fmt)) {
727*437bfbebSnyanmisaka reg_frm->common.src_proc.rkfbcd_en = 1;
728*437bfbebSnyanmisaka
729*437bfbebSnyanmisaka y_stride = mpp_frame_get_fbc_hdr_stride(task->frame);
730*437bfbebSnyanmisaka if (!y_stride)
731*437bfbebSnyanmisaka y_stride = MPP_ALIGN(prep->hor_stride, 64) >> 2;
732*437bfbebSnyanmisaka } else if (prep->hor_stride) {
733*437bfbebSnyanmisaka y_stride = prep->hor_stride;
734*437bfbebSnyanmisaka } else {
735*437bfbebSnyanmisaka if (hw_fmt == VEPU5xx_FMT_BGRA8888 )
736*437bfbebSnyanmisaka y_stride = prep->width * 4;
737*437bfbebSnyanmisaka else if (hw_fmt == VEPU5xx_FMT_BGR888 )
738*437bfbebSnyanmisaka y_stride = prep->width * 3;
739*437bfbebSnyanmisaka else if (hw_fmt == VEPU5xx_FMT_BGR565 ||
740*437bfbebSnyanmisaka hw_fmt == VEPU5xx_FMT_YUYV422 ||
741*437bfbebSnyanmisaka hw_fmt == VEPU5xx_FMT_UYVY422)
742*437bfbebSnyanmisaka y_stride = prep->width * 2;
743*437bfbebSnyanmisaka else
744*437bfbebSnyanmisaka y_stride = prep->width;
745*437bfbebSnyanmisaka }
746*437bfbebSnyanmisaka
747*437bfbebSnyanmisaka switch (hw_fmt) {
748*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV444SP : {
749*437bfbebSnyanmisaka c_stride = y_stride * 2;
750*437bfbebSnyanmisaka } break;
751*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422SP :
752*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420SP :
753*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV444P : {
754*437bfbebSnyanmisaka c_stride = y_stride;
755*437bfbebSnyanmisaka } break;
756*437bfbebSnyanmisaka default : {
757*437bfbebSnyanmisaka c_stride = y_stride / 2;
758*437bfbebSnyanmisaka } break;
759*437bfbebSnyanmisaka }
760*437bfbebSnyanmisaka
761*437bfbebSnyanmisaka if (hw_fmt < VEPU5xx_FMT_ARGB1555) {
762*437bfbebSnyanmisaka const VepuRgb2YuvCfg *cfg_coeffs = get_rgb2yuv_cfg(prep->range, prep->color);
763*437bfbebSnyanmisaka
764*437bfbebSnyanmisaka hal_h264e_dbg_flow("input color range %d colorspace %d", prep->range, prep->color);
765*437bfbebSnyanmisaka
766*437bfbebSnyanmisaka reg_frm->common.src_udfy.csc_wgt_b2y = cfg_coeffs->_2y.b_coeff;
767*437bfbebSnyanmisaka reg_frm->common.src_udfy.csc_wgt_g2y = cfg_coeffs->_2y.g_coeff;
768*437bfbebSnyanmisaka reg_frm->common.src_udfy.csc_wgt_r2y = cfg_coeffs->_2y.r_coeff;
769*437bfbebSnyanmisaka
770*437bfbebSnyanmisaka reg_frm->common.src_udfu.csc_wgt_b2u = cfg_coeffs->_2u.b_coeff;
771*437bfbebSnyanmisaka reg_frm->common.src_udfu.csc_wgt_g2u = cfg_coeffs->_2u.g_coeff;
772*437bfbebSnyanmisaka reg_frm->common.src_udfu.csc_wgt_r2u = cfg_coeffs->_2u.r_coeff;
773*437bfbebSnyanmisaka
774*437bfbebSnyanmisaka reg_frm->common.src_udfv.csc_wgt_b2v = cfg_coeffs->_2v.b_coeff;
775*437bfbebSnyanmisaka reg_frm->common.src_udfv.csc_wgt_g2v = cfg_coeffs->_2v.g_coeff;
776*437bfbebSnyanmisaka reg_frm->common.src_udfv.csc_wgt_r2v = cfg_coeffs->_2v.r_coeff;
777*437bfbebSnyanmisaka
778*437bfbebSnyanmisaka reg_frm->common.src_udfo.csc_ofst_y = cfg_coeffs->_2y.offset;
779*437bfbebSnyanmisaka reg_frm->common.src_udfo.csc_ofst_u = cfg_coeffs->_2u.offset;
780*437bfbebSnyanmisaka reg_frm->common.src_udfo.csc_ofst_v = cfg_coeffs->_2v.offset;
781*437bfbebSnyanmisaka
782*437bfbebSnyanmisaka hal_h264e_dbg_flow("use color range %d colorspace %d", cfg_coeffs->dst_range, cfg_coeffs->color);
783*437bfbebSnyanmisaka } else {
784*437bfbebSnyanmisaka reg_frm->common.src_udfy.csc_wgt_b2y = cfg.weight[0];
785*437bfbebSnyanmisaka reg_frm->common.src_udfy.csc_wgt_g2y = cfg.weight[1];
786*437bfbebSnyanmisaka reg_frm->common.src_udfy.csc_wgt_r2y = cfg.weight[2];
787*437bfbebSnyanmisaka
788*437bfbebSnyanmisaka reg_frm->common.src_udfu.csc_wgt_b2u = cfg.weight[3];
789*437bfbebSnyanmisaka reg_frm->common.src_udfu.csc_wgt_g2u = cfg.weight[4];
790*437bfbebSnyanmisaka reg_frm->common.src_udfu.csc_wgt_r2u = cfg.weight[5];
791*437bfbebSnyanmisaka
792*437bfbebSnyanmisaka reg_frm->common.src_udfv.csc_wgt_b2v = cfg.weight[6];
793*437bfbebSnyanmisaka reg_frm->common.src_udfv.csc_wgt_g2v = cfg.weight[7];
794*437bfbebSnyanmisaka reg_frm->common.src_udfv.csc_wgt_r2v = cfg.weight[8];
795*437bfbebSnyanmisaka
796*437bfbebSnyanmisaka reg_frm->common.src_udfo.csc_ofst_y = cfg.offset[0];
797*437bfbebSnyanmisaka reg_frm->common.src_udfo.csc_ofst_u = cfg.offset[1];
798*437bfbebSnyanmisaka reg_frm->common.src_udfo.csc_ofst_v = cfg.offset[2];
799*437bfbebSnyanmisaka }
800*437bfbebSnyanmisaka
801*437bfbebSnyanmisaka reg_frm->common.src_strd0.src_strd0 = y_stride;
802*437bfbebSnyanmisaka reg_frm->common.src_strd1.src_strd1 = c_stride;
803*437bfbebSnyanmisaka
804*437bfbebSnyanmisaka reg_frm->common.src_proc.src_mirr = prep->mirroring > 0;
805*437bfbebSnyanmisaka reg_frm->common.src_proc.src_rot = prep->rotation;
806*437bfbebSnyanmisaka
807*437bfbebSnyanmisaka reg_frm->sli_cfg.mv_v_lmt_thd = 0;
808*437bfbebSnyanmisaka reg_frm->sli_cfg.mv_v_lmt_en = 0;
809*437bfbebSnyanmisaka
810*437bfbebSnyanmisaka reg_frm->common.pic_ofst.pic_ofst_y = 0;
811*437bfbebSnyanmisaka reg_frm->common.pic_ofst.pic_ofst_x = 0;
812*437bfbebSnyanmisaka
813*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
814*437bfbebSnyanmisaka
815*437bfbebSnyanmisaka return ret;
816*437bfbebSnyanmisaka }
817*437bfbebSnyanmisaka
vepu511_h264e_save_pass1_patch(HalVepu511RegSet * regs,HalH264eVepu511Ctx * ctx)818*437bfbebSnyanmisaka static MPP_RET vepu511_h264e_save_pass1_patch(HalVepu511RegSet *regs, HalH264eVepu511Ctx *ctx)
819*437bfbebSnyanmisaka {
820*437bfbebSnyanmisaka H264eVepu511Frame *reg_frm = ®s->reg_frm;
821*437bfbebSnyanmisaka RK_S32 width_align = MPP_ALIGN(ctx->cfg->prep.width, 16);
822*437bfbebSnyanmisaka RK_S32 height_align = MPP_ALIGN(ctx->cfg->prep.height, 16);
823*437bfbebSnyanmisaka
824*437bfbebSnyanmisaka if (NULL == ctx->buf_pass1) {
825*437bfbebSnyanmisaka mpp_buffer_get(NULL, &ctx->buf_pass1, width_align * height_align * 3 / 2);
826*437bfbebSnyanmisaka if (!ctx->buf_pass1) {
827*437bfbebSnyanmisaka mpp_err("buf_pass1 malloc fail, debreath invaild");
828*437bfbebSnyanmisaka return MPP_NOK;
829*437bfbebSnyanmisaka }
830*437bfbebSnyanmisaka }
831*437bfbebSnyanmisaka
832*437bfbebSnyanmisaka reg_frm->common.enc_pic.cur_frm_ref = 1;
833*437bfbebSnyanmisaka reg_frm->common.rfpw_h_addr = mpp_buffer_get_fd(ctx->buf_pass1);
834*437bfbebSnyanmisaka reg_frm->common.rfpw_b_addr = reg_frm->common.rfpw_h_addr;
835*437bfbebSnyanmisaka reg_frm->common.enc_pic.rec_fbc_dis = 1;
836*437bfbebSnyanmisaka
837*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->offsets, 164, width_align * height_align);
838*437bfbebSnyanmisaka
839*437bfbebSnyanmisaka /* NOTE: disable split to avoid lowdelay slice output */
840*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_splt = 0;
841*437bfbebSnyanmisaka reg_frm->common.enc_pic.slen_fifo = 0;
842*437bfbebSnyanmisaka
843*437bfbebSnyanmisaka return MPP_OK;
844*437bfbebSnyanmisaka }
845*437bfbebSnyanmisaka
vepu511_h264e_use_pass1_patch(HalVepu511RegSet * regs,HalH264eVepu511Ctx * ctx)846*437bfbebSnyanmisaka static MPP_RET vepu511_h264e_use_pass1_patch(HalVepu511RegSet *regs, HalH264eVepu511Ctx *ctx)
847*437bfbebSnyanmisaka {
848*437bfbebSnyanmisaka H264eVepu511Frame *reg_frm = ®s->reg_frm;
849*437bfbebSnyanmisaka RK_S32 fd_in = mpp_buffer_get_fd(ctx->buf_pass1);
850*437bfbebSnyanmisaka RK_S32 width_align = MPP_ALIGN(ctx->cfg->prep.width, 16);
851*437bfbebSnyanmisaka RK_S32 height_align = MPP_ALIGN(ctx->cfg->prep.height, 16);
852*437bfbebSnyanmisaka RK_S32 y_stride = width_align;
853*437bfbebSnyanmisaka
854*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
855*437bfbebSnyanmisaka
856*437bfbebSnyanmisaka reg_frm->common.enc_pic.rfpr_compress_mode = 1;
857*437bfbebSnyanmisaka reg_frm->common.src_fmt.src_cfmt = VEPU5xx_FMT_YUV420SP;
858*437bfbebSnyanmisaka reg_frm->common.src_fmt.alpha_swap = 0;
859*437bfbebSnyanmisaka reg_frm->common.src_fmt.rbuv_swap = 0;
860*437bfbebSnyanmisaka reg_frm->common.src_fmt.out_fmt = 1;
861*437bfbebSnyanmisaka
862*437bfbebSnyanmisaka reg_frm->common.src_strd0.src_strd0 = y_stride;
863*437bfbebSnyanmisaka reg_frm->common.src_strd1.src_strd1 = y_stride;
864*437bfbebSnyanmisaka
865*437bfbebSnyanmisaka reg_frm->common.src_proc.src_mirr = 0;
866*437bfbebSnyanmisaka reg_frm->common.src_proc.src_rot = 0;
867*437bfbebSnyanmisaka
868*437bfbebSnyanmisaka reg_frm->common.pic_ofst.pic_ofst_y = 0;
869*437bfbebSnyanmisaka reg_frm->common.pic_ofst.pic_ofst_x = 0;
870*437bfbebSnyanmisaka
871*437bfbebSnyanmisaka reg_frm->common.adr_src0 = fd_in;
872*437bfbebSnyanmisaka reg_frm->common.adr_src1 = fd_in;
873*437bfbebSnyanmisaka
874*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->offsets, 161, width_align * height_align);
875*437bfbebSnyanmisaka
876*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
877*437bfbebSnyanmisaka return MPP_OK;
878*437bfbebSnyanmisaka }
879*437bfbebSnyanmisaka
setup_vepu511_codec(HalVepu511RegSet * regs,HalH264eVepu511Ctx * ctx)880*437bfbebSnyanmisaka static void setup_vepu511_codec(HalVepu511RegSet *regs, HalH264eVepu511Ctx *ctx)
881*437bfbebSnyanmisaka {
882*437bfbebSnyanmisaka H264eVepu511Frame *reg_frm = ®s->reg_frm;
883*437bfbebSnyanmisaka H264eSps *sps = ctx->sps;
884*437bfbebSnyanmisaka H264ePps *pps = ctx->pps;
885*437bfbebSnyanmisaka H264eSlice *slice = ctx->slice;
886*437bfbebSnyanmisaka
887*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
888*437bfbebSnyanmisaka
889*437bfbebSnyanmisaka reg_frm->common.enc_pic.enc_stnd = 0;
890*437bfbebSnyanmisaka reg_frm->common.enc_pic.cur_frm_ref = slice->nal_reference_idc > 0;
891*437bfbebSnyanmisaka reg_frm->common.enc_pic.bs_scp = 1;
892*437bfbebSnyanmisaka
893*437bfbebSnyanmisaka reg_frm->synt_nal.nal_ref_idc = slice->nal_reference_idc;
894*437bfbebSnyanmisaka reg_frm->synt_nal.nal_unit_type = slice->nalu_type;
895*437bfbebSnyanmisaka
896*437bfbebSnyanmisaka reg_frm->synt_sps.max_fnum = sps->log2_max_frame_num_minus4;
897*437bfbebSnyanmisaka reg_frm->synt_sps.drct_8x8 = sps->direct8x8_inference;
898*437bfbebSnyanmisaka reg_frm->synt_sps.mpoc_lm4 = sps->log2_max_poc_lsb_minus4;
899*437bfbebSnyanmisaka reg_frm->synt_sps.poc_type = sps->pic_order_cnt_type;
900*437bfbebSnyanmisaka
901*437bfbebSnyanmisaka reg_frm->synt_pps.etpy_mode = pps->entropy_coding_mode;
902*437bfbebSnyanmisaka reg_frm->synt_pps.trns_8x8 = pps->transform_8x8_mode;
903*437bfbebSnyanmisaka reg_frm->synt_pps.csip_flag = pps->constrained_intra_pred;
904*437bfbebSnyanmisaka reg_frm->synt_pps.num_ref0_idx = pps->num_ref_idx_l0_default_active - 1;
905*437bfbebSnyanmisaka reg_frm->synt_pps.num_ref1_idx = pps->num_ref_idx_l1_default_active - 1;
906*437bfbebSnyanmisaka reg_frm->synt_pps.pic_init_qp = pps->pic_init_qp;
907*437bfbebSnyanmisaka reg_frm->synt_pps.cb_ofst = pps->chroma_qp_index_offset;
908*437bfbebSnyanmisaka reg_frm->synt_pps.cr_ofst = pps->second_chroma_qp_index_offset;
909*437bfbebSnyanmisaka reg_frm->synt_pps.dbf_cp_flg = pps->deblocking_filter_control;
910*437bfbebSnyanmisaka
911*437bfbebSnyanmisaka reg_frm->synt_sli0.sli_type = (slice->slice_type == H264_I_SLICE) ? (2) : (0);
912*437bfbebSnyanmisaka reg_frm->synt_sli0.pps_id = slice->pic_parameter_set_id;
913*437bfbebSnyanmisaka reg_frm->synt_sli0.drct_smvp = 0;
914*437bfbebSnyanmisaka reg_frm->synt_sli0.num_ref_ovrd = slice->num_ref_idx_override;
915*437bfbebSnyanmisaka reg_frm->synt_sli0.cbc_init_idc = slice->cabac_init_idc;
916*437bfbebSnyanmisaka reg_frm->synt_sli0.frm_num = slice->frame_num;
917*437bfbebSnyanmisaka
918*437bfbebSnyanmisaka reg_frm->synt_sli1.idr_pid = (slice->slice_type == H264_I_SLICE) ? slice->idr_pic_id : (RK_U32)(-1);
919*437bfbebSnyanmisaka reg_frm->synt_sli1.poc_lsb = slice->pic_order_cnt_lsb;
920*437bfbebSnyanmisaka
921*437bfbebSnyanmisaka reg_frm->synt_sli2.dis_dblk_idc = slice->disable_deblocking_filter_idc;
922*437bfbebSnyanmisaka reg_frm->synt_sli2.sli_alph_ofst = slice->slice_alpha_c0_offset_div2;
923*437bfbebSnyanmisaka
924*437bfbebSnyanmisaka h264e_reorder_rd_rewind(slice->reorder);
925*437bfbebSnyanmisaka { /* reorder process */
926*437bfbebSnyanmisaka H264eRplmo rplmo;
927*437bfbebSnyanmisaka MPP_RET ret = h264e_reorder_rd_op(slice->reorder, &rplmo);
928*437bfbebSnyanmisaka
929*437bfbebSnyanmisaka if (MPP_OK == ret) {
930*437bfbebSnyanmisaka reg_frm->synt_sli2.ref_list0_rodr = 1;
931*437bfbebSnyanmisaka reg_frm->synt_sli2.rodr_pic_idx = rplmo.modification_of_pic_nums_idc;
932*437bfbebSnyanmisaka
933*437bfbebSnyanmisaka switch (rplmo.modification_of_pic_nums_idc) {
934*437bfbebSnyanmisaka case 0 :
935*437bfbebSnyanmisaka case 1 : {
936*437bfbebSnyanmisaka reg_frm->synt_sli2.rodr_pic_num = rplmo.abs_diff_pic_num_minus1;
937*437bfbebSnyanmisaka } break;
938*437bfbebSnyanmisaka case 2 : {
939*437bfbebSnyanmisaka reg_frm->synt_sli2.rodr_pic_num = rplmo.long_term_pic_idx;
940*437bfbebSnyanmisaka } break;
941*437bfbebSnyanmisaka default : {
942*437bfbebSnyanmisaka mpp_err_f("invalid modification_of_pic_nums_idc %d\n",
943*437bfbebSnyanmisaka rplmo.modification_of_pic_nums_idc);
944*437bfbebSnyanmisaka } break;
945*437bfbebSnyanmisaka }
946*437bfbebSnyanmisaka } else {
947*437bfbebSnyanmisaka // slice->ref_pic_list_modification_flag;
948*437bfbebSnyanmisaka reg_frm->synt_sli2.ref_list0_rodr = 0;
949*437bfbebSnyanmisaka reg_frm->synt_sli2.rodr_pic_idx = 0;
950*437bfbebSnyanmisaka reg_frm->synt_sli2.rodr_pic_num = 0;
951*437bfbebSnyanmisaka }
952*437bfbebSnyanmisaka }
953*437bfbebSnyanmisaka
954*437bfbebSnyanmisaka /* clear all mmco arg first */
955*437bfbebSnyanmisaka reg_frm->synt_refm0.nopp_flg = 0;
956*437bfbebSnyanmisaka reg_frm->synt_refm0.ltrf_flg = 0;
957*437bfbebSnyanmisaka reg_frm->synt_refm0.arpm_flg = 0;
958*437bfbebSnyanmisaka reg_frm->synt_refm0.mmco4_pre = 0;
959*437bfbebSnyanmisaka reg_frm->synt_refm0.mmco_type0 = 0;
960*437bfbebSnyanmisaka reg_frm->synt_refm0.mmco_parm0 = 0;
961*437bfbebSnyanmisaka reg_frm->synt_refm0.mmco_type1 = 0;
962*437bfbebSnyanmisaka reg_frm->synt_refm1.mmco_parm1 = 0;
963*437bfbebSnyanmisaka reg_frm->synt_refm0.mmco_type2 = 0;
964*437bfbebSnyanmisaka reg_frm->synt_refm1.mmco_parm2 = 0;
965*437bfbebSnyanmisaka reg_frm->synt_refm2.long_term_frame_idx0 = 0;
966*437bfbebSnyanmisaka reg_frm->synt_refm2.long_term_frame_idx1 = 0;
967*437bfbebSnyanmisaka reg_frm->synt_refm2.long_term_frame_idx2 = 0;
968*437bfbebSnyanmisaka
969*437bfbebSnyanmisaka h264e_marking_rd_rewind(slice->marking);
970*437bfbebSnyanmisaka
971*437bfbebSnyanmisaka /* only update used parameter */
972*437bfbebSnyanmisaka if (slice->slice_type == H264_I_SLICE) {
973*437bfbebSnyanmisaka reg_frm->synt_refm0.nopp_flg = slice->no_output_of_prior_pics;
974*437bfbebSnyanmisaka reg_frm->synt_refm0.ltrf_flg = slice->long_term_reference_flag;
975*437bfbebSnyanmisaka } else {
976*437bfbebSnyanmisaka if (!h264e_marking_is_empty(slice->marking)) {
977*437bfbebSnyanmisaka H264eMmco mmco;
978*437bfbebSnyanmisaka
979*437bfbebSnyanmisaka reg_frm->synt_refm0.arpm_flg = 1;
980*437bfbebSnyanmisaka
981*437bfbebSnyanmisaka /* max 3 mmco */
982*437bfbebSnyanmisaka do {
983*437bfbebSnyanmisaka RK_S32 type = 0;
984*437bfbebSnyanmisaka RK_S32 param_0 = 0;
985*437bfbebSnyanmisaka RK_S32 param_1 = 0;
986*437bfbebSnyanmisaka
987*437bfbebSnyanmisaka h264e_marking_rd_op(slice->marking, &mmco);
988*437bfbebSnyanmisaka type = mmco.mmco;
989*437bfbebSnyanmisaka switch (type) {
990*437bfbebSnyanmisaka case 1 : {
991*437bfbebSnyanmisaka param_0 = mmco.difference_of_pic_nums_minus1;
992*437bfbebSnyanmisaka } break;
993*437bfbebSnyanmisaka case 2 : {
994*437bfbebSnyanmisaka param_0 = mmco.long_term_pic_num;
995*437bfbebSnyanmisaka } break;
996*437bfbebSnyanmisaka case 3 : {
997*437bfbebSnyanmisaka param_0 = mmco.difference_of_pic_nums_minus1;
998*437bfbebSnyanmisaka param_1 = mmco.long_term_frame_idx;
999*437bfbebSnyanmisaka } break;
1000*437bfbebSnyanmisaka case 4 : {
1001*437bfbebSnyanmisaka param_0 = mmco.max_long_term_frame_idx_plus1;
1002*437bfbebSnyanmisaka } break;
1003*437bfbebSnyanmisaka case 5 : {
1004*437bfbebSnyanmisaka } break;
1005*437bfbebSnyanmisaka case 6 : {
1006*437bfbebSnyanmisaka param_0 = mmco.long_term_frame_idx;
1007*437bfbebSnyanmisaka } break;
1008*437bfbebSnyanmisaka default : {
1009*437bfbebSnyanmisaka mpp_err_f("unsupported mmco 0 %d\n", type);
1010*437bfbebSnyanmisaka type = 0;
1011*437bfbebSnyanmisaka } break;
1012*437bfbebSnyanmisaka }
1013*437bfbebSnyanmisaka
1014*437bfbebSnyanmisaka reg_frm->synt_refm0.mmco_type0 = type;
1015*437bfbebSnyanmisaka reg_frm->synt_refm0.mmco_parm0 = param_0;
1016*437bfbebSnyanmisaka reg_frm->synt_refm2.long_term_frame_idx0 = param_1;
1017*437bfbebSnyanmisaka
1018*437bfbebSnyanmisaka if (h264e_marking_is_empty(slice->marking))
1019*437bfbebSnyanmisaka break;
1020*437bfbebSnyanmisaka
1021*437bfbebSnyanmisaka h264e_marking_rd_op(slice->marking, &mmco);
1022*437bfbebSnyanmisaka type = mmco.mmco;
1023*437bfbebSnyanmisaka param_0 = 0;
1024*437bfbebSnyanmisaka param_1 = 0;
1025*437bfbebSnyanmisaka switch (type) {
1026*437bfbebSnyanmisaka case 1 : {
1027*437bfbebSnyanmisaka param_0 = mmco.difference_of_pic_nums_minus1;
1028*437bfbebSnyanmisaka } break;
1029*437bfbebSnyanmisaka case 2 : {
1030*437bfbebSnyanmisaka param_0 = mmco.long_term_pic_num;
1031*437bfbebSnyanmisaka } break;
1032*437bfbebSnyanmisaka case 3 : {
1033*437bfbebSnyanmisaka param_0 = mmco.difference_of_pic_nums_minus1;
1034*437bfbebSnyanmisaka param_1 = mmco.long_term_frame_idx;
1035*437bfbebSnyanmisaka } break;
1036*437bfbebSnyanmisaka case 4 : {
1037*437bfbebSnyanmisaka param_0 = mmco.max_long_term_frame_idx_plus1;
1038*437bfbebSnyanmisaka } break;
1039*437bfbebSnyanmisaka case 5 : {
1040*437bfbebSnyanmisaka } break;
1041*437bfbebSnyanmisaka case 6 : {
1042*437bfbebSnyanmisaka param_0 = mmco.long_term_frame_idx;
1043*437bfbebSnyanmisaka } break;
1044*437bfbebSnyanmisaka default : {
1045*437bfbebSnyanmisaka mpp_err_f("unsupported mmco 0 %d\n", type);
1046*437bfbebSnyanmisaka type = 0;
1047*437bfbebSnyanmisaka } break;
1048*437bfbebSnyanmisaka }
1049*437bfbebSnyanmisaka
1050*437bfbebSnyanmisaka reg_frm->synt_refm0.mmco_type1 = type;
1051*437bfbebSnyanmisaka reg_frm->synt_refm1.mmco_parm1 = param_0;
1052*437bfbebSnyanmisaka reg_frm->synt_refm2.long_term_frame_idx1 = param_1;
1053*437bfbebSnyanmisaka
1054*437bfbebSnyanmisaka if (h264e_marking_is_empty(slice->marking))
1055*437bfbebSnyanmisaka break;
1056*437bfbebSnyanmisaka
1057*437bfbebSnyanmisaka h264e_marking_rd_op(slice->marking, &mmco);
1058*437bfbebSnyanmisaka type = mmco.mmco;
1059*437bfbebSnyanmisaka param_0 = 0;
1060*437bfbebSnyanmisaka param_1 = 0;
1061*437bfbebSnyanmisaka switch (type) {
1062*437bfbebSnyanmisaka case 1 : {
1063*437bfbebSnyanmisaka param_0 = mmco.difference_of_pic_nums_minus1;
1064*437bfbebSnyanmisaka } break;
1065*437bfbebSnyanmisaka case 2 : {
1066*437bfbebSnyanmisaka param_0 = mmco.long_term_pic_num;
1067*437bfbebSnyanmisaka } break;
1068*437bfbebSnyanmisaka case 3 : {
1069*437bfbebSnyanmisaka param_0 = mmco.difference_of_pic_nums_minus1;
1070*437bfbebSnyanmisaka param_1 = mmco.long_term_frame_idx;
1071*437bfbebSnyanmisaka } break;
1072*437bfbebSnyanmisaka case 4 : {
1073*437bfbebSnyanmisaka param_0 = mmco.max_long_term_frame_idx_plus1;
1074*437bfbebSnyanmisaka } break;
1075*437bfbebSnyanmisaka case 5 : {
1076*437bfbebSnyanmisaka } break;
1077*437bfbebSnyanmisaka case 6 : {
1078*437bfbebSnyanmisaka param_0 = mmco.long_term_frame_idx;
1079*437bfbebSnyanmisaka } break;
1080*437bfbebSnyanmisaka default : {
1081*437bfbebSnyanmisaka mpp_err_f("unsupported mmco 0 %d\n", type);
1082*437bfbebSnyanmisaka type = 0;
1083*437bfbebSnyanmisaka } break;
1084*437bfbebSnyanmisaka }
1085*437bfbebSnyanmisaka
1086*437bfbebSnyanmisaka reg_frm->synt_refm0.mmco_type2 = type;
1087*437bfbebSnyanmisaka reg_frm->synt_refm1.mmco_parm2 = param_0;
1088*437bfbebSnyanmisaka reg_frm->synt_refm2.long_term_frame_idx2 = param_1;
1089*437bfbebSnyanmisaka } while (0);
1090*437bfbebSnyanmisaka }
1091*437bfbebSnyanmisaka }
1092*437bfbebSnyanmisaka
1093*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1094*437bfbebSnyanmisaka }
1095*437bfbebSnyanmisaka
setup_vepu511_rdo_pred(HalH264eVepu511Ctx * ctx)1096*437bfbebSnyanmisaka static void setup_vepu511_rdo_pred(HalH264eVepu511Ctx *ctx)
1097*437bfbebSnyanmisaka {
1098*437bfbebSnyanmisaka HalVepu511RegSet *regs = ctx->regs_set;
1099*437bfbebSnyanmisaka H264eVepu511Frame *reg_frm = ®s->reg_frm;
1100*437bfbebSnyanmisaka H264eSps *sps = ctx->sps;
1101*437bfbebSnyanmisaka H264ePps *pps = ctx->pps;
1102*437bfbebSnyanmisaka H264eSlice *slice = ctx->slice;
1103*437bfbebSnyanmisaka RK_U32 is_ipc_scene = (ctx->cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC);
1104*437bfbebSnyanmisaka
1105*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1106*437bfbebSnyanmisaka
1107*437bfbebSnyanmisaka /*
1108*437bfbebSnyanmisaka * H264 Mode Mask of Mode Decision.
1109*437bfbebSnyanmisaka * More prediction modes lead to better compression performance but increase computational cycles.
1110*437bfbebSnyanmisaka *
1111*437bfbebSnyanmisaka * Default speed preset configuration to 0.67 PPC, ~40 FPS for 4K resolution at 500MHz:
1112*437bfbebSnyanmisaka * - Set i4/i16 partition RDO numbers to 1 for P-frames and all other CU RDO numbers to 2.
1113*437bfbebSnyanmisaka * - Set cime_fuse = 0, enable dual-window search for higher compression performance.
1114*437bfbebSnyanmisaka * - Set fme_lvl_mrg = 1, enable FME's depth1 and depth2 joint search,
1115*437bfbebSnyanmisaka * improves real-time performance but will reduce the compression ratio.
1116*437bfbebSnyanmisaka * - Set cime_srch_lftw/rgtw/uph/dwnh = 12/12/15/15, expand CIME search range degraded real-time performance.
1117*437bfbebSnyanmisaka * - Set rime_prelvl_en = 0, disable RIME pre-level to improve real-time performance.
1118*437bfbebSnyanmisaka */
1119*437bfbebSnyanmisaka if (slice->slice_type == H264_I_SLICE) {
1120*437bfbebSnyanmisaka regs->reg_rc_roi.klut_ofst.chrm_klut_ofst = 6;
1121*437bfbebSnyanmisaka reg_frm->rdo_mark_mode.iframe_i4_rdo_num = 2;
1122*437bfbebSnyanmisaka reg_frm->rdo_mark_mode.i8_rdo_num = 2;
1123*437bfbebSnyanmisaka reg_frm->rdo_mark_mode.iframe_i16_rdo_num = 2;
1124*437bfbebSnyanmisaka reg_frm->rdo_mark_mode.rdo_mark_mode = 0;
1125*437bfbebSnyanmisaka } else {
1126*437bfbebSnyanmisaka regs->reg_rc_roi.klut_ofst.chrm_klut_ofst = is_ipc_scene ? 9 : 6;
1127*437bfbebSnyanmisaka reg_frm->rdo_mark_mode.p16_interp_num = 2;
1128*437bfbebSnyanmisaka reg_frm->rdo_mark_mode.p16t8_rdo_num = 2;
1129*437bfbebSnyanmisaka reg_frm->rdo_mark_mode.p16t4_rmd_num = 2;
1130*437bfbebSnyanmisaka reg_frm->rdo_mark_mode.rdo_mark_mode = 0;
1131*437bfbebSnyanmisaka reg_frm->rdo_mark_mode.p8_interp_num = 2;
1132*437bfbebSnyanmisaka reg_frm->rdo_mark_mode.p8t8_rdo_num = 2;
1133*437bfbebSnyanmisaka reg_frm->rdo_mark_mode.p8t4_rmd_num = 2;
1134*437bfbebSnyanmisaka regs->reg_frm.rdo_mark_mode.i8_rdo_num = 2;
1135*437bfbebSnyanmisaka regs->reg_frm.rdo_mark_mode.iframe_i4_rdo_num = 1;
1136*437bfbebSnyanmisaka regs->reg_frm.rdo_mark_mode.iframe_i16_rdo_num = 1;
1137*437bfbebSnyanmisaka }
1138*437bfbebSnyanmisaka
1139*437bfbebSnyanmisaka reg_frm->rdo_cfg.rect_size = (sps->profile_idc == H264_PROFILE_BASELINE &&
1140*437bfbebSnyanmisaka sps->level_idc <= H264_LEVEL_3_0) ? 1 : 0;
1141*437bfbebSnyanmisaka reg_frm->rdo_cfg.vlc_lmt = (sps->profile_idc < H264_PROFILE_MAIN) &&
1142*437bfbebSnyanmisaka !pps->entropy_coding_mode;
1143*437bfbebSnyanmisaka reg_frm->rdo_cfg.ccwa_e = 1;
1144*437bfbebSnyanmisaka reg_frm->rdo_cfg.scl_lst_sel = pps->pic_scaling_matrix_present;
1145*437bfbebSnyanmisaka reg_frm->rdo_cfg.atf_e = ctx->cfg->tune.anti_flicker_str > 0;
1146*437bfbebSnyanmisaka reg_frm->rdo_cfg.atr_e = ctx->cfg->tune.atr_str_i > 0;
1147*437bfbebSnyanmisaka reg_frm->rdo_cfg.atr_mult_sel_e = 1;
1148*437bfbebSnyanmisaka
1149*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1150*437bfbebSnyanmisaka }
1151*437bfbebSnyanmisaka
setup_vepu511_rc_base(HalVepu511RegSet * regs,HalH264eVepu511Ctx * ctx,EncRcTask * rc_task)1152*437bfbebSnyanmisaka static void setup_vepu511_rc_base(HalVepu511RegSet *regs, HalH264eVepu511Ctx *ctx, EncRcTask *rc_task)
1153*437bfbebSnyanmisaka {
1154*437bfbebSnyanmisaka H264eSps *sps = ctx->sps;
1155*437bfbebSnyanmisaka H264eSlice *slice = ctx->slice;
1156*437bfbebSnyanmisaka MppEncCfgSet *cfg = ctx->cfg;
1157*437bfbebSnyanmisaka MppEncRcCfg *rc = &cfg->rc;
1158*437bfbebSnyanmisaka MppEncHwCfg *hw = &cfg->hw;
1159*437bfbebSnyanmisaka EncRcTaskInfo *rc_info = &rc_task->info;
1160*437bfbebSnyanmisaka H264eVepu511Frame *reg_frm = ®s->reg_frm;
1161*437bfbebSnyanmisaka RK_S32 mb_w = sps->pic_width_in_mbs;
1162*437bfbebSnyanmisaka RK_S32 mb_h = sps->pic_height_in_mbs;
1163*437bfbebSnyanmisaka RK_U32 qp_target = rc_info->quality_target;
1164*437bfbebSnyanmisaka RK_U32 qp_min = rc_info->quality_min;
1165*437bfbebSnyanmisaka RK_U32 qp_max = rc_info->quality_max;
1166*437bfbebSnyanmisaka RK_S32 mb_target_bits_mul_16 = (rc_info->bit_target << 4) / (mb_w * mb_h);
1167*437bfbebSnyanmisaka RK_S32 mb_target_bits;
1168*437bfbebSnyanmisaka RK_S32 negative_bits_thd;
1169*437bfbebSnyanmisaka RK_S32 positive_bits_thd;
1170*437bfbebSnyanmisaka
1171*437bfbebSnyanmisaka hal_h264e_dbg_rc("bittarget %d qp [%d %d %d]\n", rc_info->bit_target,
1172*437bfbebSnyanmisaka qp_min, qp_target, qp_max);
1173*437bfbebSnyanmisaka
1174*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1175*437bfbebSnyanmisaka
1176*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd0.qpmin_area0 = qp_min;
1177*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd0.qpmax_area0 = qp_max;
1178*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd0.qpmin_area1 = qp_min;
1179*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd0.qpmax_area1 = qp_max;
1180*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd0.qpmin_area2 = qp_min;
1181*437bfbebSnyanmisaka
1182*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd1.qpmax_area2 = qp_max;
1183*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd1.qpmin_area3 = qp_min;
1184*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd1.qpmax_area3 = qp_max;
1185*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd1.qpmin_area4 = qp_min;
1186*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd1.qpmax_area4 = qp_max;
1187*437bfbebSnyanmisaka
1188*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd2.qpmin_area5 = qp_min;
1189*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd2.qpmax_area5 = qp_max;
1190*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd2.qpmin_area6 = qp_min;
1191*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd2.qpmax_area6 = qp_max;
1192*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd2.qpmin_area7 = qp_min;
1193*437bfbebSnyanmisaka regs->reg_rc_roi.roi_qthd3.qpmax_area7 = qp_max;
1194*437bfbebSnyanmisaka
1195*437bfbebSnyanmisaka if (rc->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
1196*437bfbebSnyanmisaka reg_frm->common.enc_pic.pic_qp = rc_info->quality_target;
1197*437bfbebSnyanmisaka reg_frm->common.rc_qp.rc_max_qp = rc_info->quality_target;
1198*437bfbebSnyanmisaka reg_frm->common.rc_qp.rc_min_qp = rc_info->quality_target;
1199*437bfbebSnyanmisaka
1200*437bfbebSnyanmisaka return;
1201*437bfbebSnyanmisaka }
1202*437bfbebSnyanmisaka
1203*437bfbebSnyanmisaka if (mb_target_bits_mul_16 >= 0x100000)
1204*437bfbebSnyanmisaka mb_target_bits_mul_16 = 0x50000;
1205*437bfbebSnyanmisaka
1206*437bfbebSnyanmisaka mb_target_bits = (mb_target_bits_mul_16 * mb_w) >> 4;
1207*437bfbebSnyanmisaka negative_bits_thd = 0 - 5 * mb_target_bits / 16;
1208*437bfbebSnyanmisaka positive_bits_thd = 5 * mb_target_bits / 16;
1209*437bfbebSnyanmisaka
1210*437bfbebSnyanmisaka reg_frm->common.enc_pic.pic_qp = qp_target;
1211*437bfbebSnyanmisaka
1212*437bfbebSnyanmisaka reg_frm->common.rc_cfg.rc_en = 1;
1213*437bfbebSnyanmisaka reg_frm->common.rc_cfg.aq_en = 1;
1214*437bfbebSnyanmisaka reg_frm->common.rc_cfg.rc_ctu_num = mb_w;
1215*437bfbebSnyanmisaka
1216*437bfbebSnyanmisaka reg_frm->common.rc_qp.rc_max_qp = qp_max;
1217*437bfbebSnyanmisaka reg_frm->common.rc_qp.rc_min_qp = qp_min;
1218*437bfbebSnyanmisaka reg_frm->common.rc_tgt.ctu_ebit = mb_target_bits_mul_16;
1219*437bfbebSnyanmisaka
1220*437bfbebSnyanmisaka if (rc->rc_mode == MPP_ENC_RC_MODE_SMTRC) {
1221*437bfbebSnyanmisaka reg_frm->common.rc_qp.rc_qp_range = 0;
1222*437bfbebSnyanmisaka } else {
1223*437bfbebSnyanmisaka reg_frm->common.rc_qp.rc_qp_range = (slice->slice_type == H264_I_SLICE) ?
1224*437bfbebSnyanmisaka hw->qp_delta_row_i : hw->qp_delta_row;
1225*437bfbebSnyanmisaka }
1226*437bfbebSnyanmisaka
1227*437bfbebSnyanmisaka {
1228*437bfbebSnyanmisaka /* fixed frame level QP */
1229*437bfbebSnyanmisaka RK_S32 fqp_min, fqp_max;
1230*437bfbebSnyanmisaka
1231*437bfbebSnyanmisaka if (slice->slice_type == H264_I_SLICE) {
1232*437bfbebSnyanmisaka fqp_min = rc->fqp_min_i;
1233*437bfbebSnyanmisaka fqp_max = rc->fqp_max_i;
1234*437bfbebSnyanmisaka } else {
1235*437bfbebSnyanmisaka fqp_min = rc->fqp_min_p;
1236*437bfbebSnyanmisaka fqp_max = rc->fqp_max_p;
1237*437bfbebSnyanmisaka }
1238*437bfbebSnyanmisaka
1239*437bfbebSnyanmisaka if ((fqp_min == fqp_max) && (fqp_min >= 1) && (fqp_max <= 51)) {
1240*437bfbebSnyanmisaka reg_frm->common.enc_pic.pic_qp = fqp_min;
1241*437bfbebSnyanmisaka reg_frm->common.rc_qp.rc_qp_range = 0;
1242*437bfbebSnyanmisaka }
1243*437bfbebSnyanmisaka }
1244*437bfbebSnyanmisaka
1245*437bfbebSnyanmisaka regs->reg_rc_roi.rc_adj0.qp_adj0 = -2;
1246*437bfbebSnyanmisaka regs->reg_rc_roi.rc_adj0.qp_adj1 = -1;
1247*437bfbebSnyanmisaka regs->reg_rc_roi.rc_adj0.qp_adj2 = 0;
1248*437bfbebSnyanmisaka regs->reg_rc_roi.rc_adj0.qp_adj3 = 1;
1249*437bfbebSnyanmisaka regs->reg_rc_roi.rc_adj0.qp_adj4 = 2;
1250*437bfbebSnyanmisaka regs->reg_rc_roi.rc_adj1.qp_adj5 = 0;
1251*437bfbebSnyanmisaka regs->reg_rc_roi.rc_adj1.qp_adj6 = 0;
1252*437bfbebSnyanmisaka regs->reg_rc_roi.rc_adj1.qp_adj7 = 0;
1253*437bfbebSnyanmisaka regs->reg_rc_roi.rc_adj1.qp_adj8 = 0;
1254*437bfbebSnyanmisaka
1255*437bfbebSnyanmisaka regs->reg_rc_roi.rc_dthd_0_8[0] = 4 * negative_bits_thd;
1256*437bfbebSnyanmisaka regs->reg_rc_roi.rc_dthd_0_8[1] = negative_bits_thd;
1257*437bfbebSnyanmisaka regs->reg_rc_roi.rc_dthd_0_8[2] = positive_bits_thd;
1258*437bfbebSnyanmisaka regs->reg_rc_roi.rc_dthd_0_8[3] = 4 * positive_bits_thd;
1259*437bfbebSnyanmisaka regs->reg_rc_roi.rc_dthd_0_8[4] = 0x7FFFFFFF;
1260*437bfbebSnyanmisaka regs->reg_rc_roi.rc_dthd_0_8[5] = 0x7FFFFFFF;
1261*437bfbebSnyanmisaka regs->reg_rc_roi.rc_dthd_0_8[6] = 0x7FFFFFFF;
1262*437bfbebSnyanmisaka regs->reg_rc_roi.rc_dthd_0_8[7] = 0x7FFFFFFF;
1263*437bfbebSnyanmisaka regs->reg_rc_roi.rc_dthd_0_8[8] = 0x7FFFFFFF;
1264*437bfbebSnyanmisaka
1265*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1266*437bfbebSnyanmisaka }
1267*437bfbebSnyanmisaka
setup_vepu511_io_buf(HalVepu511RegSet * regs,MppDevRegOffCfgs * offsets,HalEncTask * task)1268*437bfbebSnyanmisaka static void setup_vepu511_io_buf(HalVepu511RegSet *regs, MppDevRegOffCfgs *offsets,
1269*437bfbebSnyanmisaka HalEncTask *task)
1270*437bfbebSnyanmisaka {
1271*437bfbebSnyanmisaka MppFrame frm = task->frame;
1272*437bfbebSnyanmisaka MppPacket pkt = task->packet;
1273*437bfbebSnyanmisaka MppBuffer buf_in = mpp_frame_get_buffer(frm);
1274*437bfbebSnyanmisaka MppBuffer buf_out = task->output;
1275*437bfbebSnyanmisaka MppFrameFormat fmt = mpp_frame_get_fmt(frm);
1276*437bfbebSnyanmisaka H264eVepu511Frame *reg_frm = ®s->reg_frm;
1277*437bfbebSnyanmisaka RK_S32 hor_stride = mpp_frame_get_hor_stride(frm);
1278*437bfbebSnyanmisaka RK_S32 ver_stride = mpp_frame_get_ver_stride(frm);
1279*437bfbebSnyanmisaka RK_S32 fd_in = mpp_buffer_get_fd(buf_in);
1280*437bfbebSnyanmisaka RK_U32 off_in[2] = {0};
1281*437bfbebSnyanmisaka RK_U32 off_out = mpp_packet_get_length(pkt);
1282*437bfbebSnyanmisaka size_t siz_out = mpp_buffer_get_size(buf_out);
1283*437bfbebSnyanmisaka RK_S32 fd_out = mpp_buffer_get_fd(buf_out);
1284*437bfbebSnyanmisaka
1285*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1286*437bfbebSnyanmisaka
1287*437bfbebSnyanmisaka reg_frm->common.adr_src0 = fd_in;
1288*437bfbebSnyanmisaka reg_frm->common.adr_src1 = fd_in;
1289*437bfbebSnyanmisaka reg_frm->common.adr_src2 = fd_in;
1290*437bfbebSnyanmisaka
1291*437bfbebSnyanmisaka reg_frm->common.bsbt_addr = fd_out;
1292*437bfbebSnyanmisaka reg_frm->common.bsbb_addr = fd_out;
1293*437bfbebSnyanmisaka reg_frm->common.adr_bsbs = fd_out;
1294*437bfbebSnyanmisaka reg_frm->common.bsbr_addr = fd_out;
1295*437bfbebSnyanmisaka
1296*437bfbebSnyanmisaka reg_frm->common.rfpt_h_addr = 0xffffffff;
1297*437bfbebSnyanmisaka reg_frm->common.rfpb_h_addr = 0;
1298*437bfbebSnyanmisaka reg_frm->common.rfpt_b_addr = 0xffffffff;
1299*437bfbebSnyanmisaka reg_frm->common.adr_rfpb_b = 0;
1300*437bfbebSnyanmisaka
1301*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_FBC(mpp_frame_get_fmt(task->frame))) {
1302*437bfbebSnyanmisaka off_in[0] = mpp_frame_get_fbc_offset(task->frame);;
1303*437bfbebSnyanmisaka off_in[1] = off_in[0];
1304*437bfbebSnyanmisaka } else if (MPP_FRAME_FMT_IS_YUV(fmt)) {
1305*437bfbebSnyanmisaka VepuFmtCfg cfg;
1306*437bfbebSnyanmisaka
1307*437bfbebSnyanmisaka vepu5xx_set_fmt(&cfg, fmt);
1308*437bfbebSnyanmisaka switch (cfg.format) {
1309*437bfbebSnyanmisaka case VEPU5xx_FMT_BGRA8888 :
1310*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR888 :
1311*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR565 : {
1312*437bfbebSnyanmisaka off_in[0] = 0;
1313*437bfbebSnyanmisaka off_in[1] = 0;
1314*437bfbebSnyanmisaka } break;
1315*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420SP :
1316*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422SP : {
1317*437bfbebSnyanmisaka off_in[0] = hor_stride * ver_stride;
1318*437bfbebSnyanmisaka off_in[1] = hor_stride * ver_stride;
1319*437bfbebSnyanmisaka } break;
1320*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422P : {
1321*437bfbebSnyanmisaka off_in[0] = hor_stride * ver_stride;
1322*437bfbebSnyanmisaka off_in[1] = hor_stride * ver_stride * 3 / 2;
1323*437bfbebSnyanmisaka } break;
1324*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420P : {
1325*437bfbebSnyanmisaka off_in[0] = hor_stride * ver_stride;
1326*437bfbebSnyanmisaka off_in[1] = hor_stride * ver_stride * 5 / 4;
1327*437bfbebSnyanmisaka } break;
1328*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV400 :
1329*437bfbebSnyanmisaka case VEPU5xx_FMT_YUYV422 :
1330*437bfbebSnyanmisaka case VEPU5xx_FMT_UYVY422 : {
1331*437bfbebSnyanmisaka off_in[0] = 0;
1332*437bfbebSnyanmisaka off_in[1] = 0;
1333*437bfbebSnyanmisaka } break;
1334*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV444SP : {
1335*437bfbebSnyanmisaka off_in[0] = hor_stride * ver_stride;
1336*437bfbebSnyanmisaka off_in[1] = hor_stride * ver_stride;
1337*437bfbebSnyanmisaka } break;
1338*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV444P : {
1339*437bfbebSnyanmisaka off_in[0] = hor_stride * ver_stride;
1340*437bfbebSnyanmisaka off_in[1] = hor_stride * ver_stride * 2;
1341*437bfbebSnyanmisaka } break;
1342*437bfbebSnyanmisaka default : {
1343*437bfbebSnyanmisaka off_in[0] = 0;
1344*437bfbebSnyanmisaka off_in[1] = 0;
1345*437bfbebSnyanmisaka } break;
1346*437bfbebSnyanmisaka }
1347*437bfbebSnyanmisaka }
1348*437bfbebSnyanmisaka
1349*437bfbebSnyanmisaka mpp_dev_multi_offset_update(offsets, 161, off_in[0]);
1350*437bfbebSnyanmisaka mpp_dev_multi_offset_update(offsets, 162, off_in[1]);
1351*437bfbebSnyanmisaka mpp_dev_multi_offset_update(offsets, 172, siz_out);
1352*437bfbebSnyanmisaka mpp_dev_multi_offset_update(offsets, 174, off_out);
1353*437bfbebSnyanmisaka
1354*437bfbebSnyanmisaka reg_frm->common.meiw_addr = task->md_info ? mpp_buffer_get_fd(task->md_info) : 0;
1355*437bfbebSnyanmisaka reg_frm->common.enc_pic.mei_stor = 0;
1356*437bfbebSnyanmisaka reg_frm->common.pic_ofst.pic_ofst_y = mpp_frame_get_offset_y(task->frame);
1357*437bfbebSnyanmisaka reg_frm->common.pic_ofst.pic_ofst_x = mpp_frame_get_offset_x(task->frame);
1358*437bfbebSnyanmisaka
1359*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1360*437bfbebSnyanmisaka }
1361*437bfbebSnyanmisaka
vepu511_h264_set_one_roi(void * buf,MppEncROIRegion * region,RK_S32 w,RK_S32 h)1362*437bfbebSnyanmisaka static MPP_RET vepu511_h264_set_one_roi(void *buf, MppEncROIRegion *region, RK_S32 w, RK_S32 h)
1363*437bfbebSnyanmisaka {
1364*437bfbebSnyanmisaka Vepu511RoiH264BsCfg *ptr = (Vepu511RoiH264BsCfg *)buf;
1365*437bfbebSnyanmisaka RK_S32 mb_w = MPP_ALIGN(w, 16) / 16;
1366*437bfbebSnyanmisaka RK_S32 mb_h = MPP_ALIGN(h, 16) / 16;
1367*437bfbebSnyanmisaka RK_S32 stride_h = MPP_ALIGN(mb_w, 4);
1368*437bfbebSnyanmisaka Vepu511RoiH264BsCfg cfg;
1369*437bfbebSnyanmisaka MPP_RET ret = MPP_NOK;
1370*437bfbebSnyanmisaka
1371*437bfbebSnyanmisaka if (NULL == buf || NULL == region) {
1372*437bfbebSnyanmisaka mpp_err_f("invalid buf %p roi %p\n", buf, region);
1373*437bfbebSnyanmisaka goto DONE;
1374*437bfbebSnyanmisaka }
1375*437bfbebSnyanmisaka
1376*437bfbebSnyanmisaka RK_S32 roi_width = (region->w + 15) / 16;
1377*437bfbebSnyanmisaka RK_S32 roi_height = (region->h + 15) / 16;
1378*437bfbebSnyanmisaka RK_S32 pos_x_init = region->x / 16;
1379*437bfbebSnyanmisaka RK_S32 pos_y_init = region->y / 16;
1380*437bfbebSnyanmisaka RK_S32 pos_x_end = pos_x_init + roi_width;
1381*437bfbebSnyanmisaka RK_S32 pos_y_end = pos_y_init + roi_height;
1382*437bfbebSnyanmisaka RK_S32 x, y;
1383*437bfbebSnyanmisaka
1384*437bfbebSnyanmisaka pos_x_end = MPP_MIN(pos_x_end, mb_w);
1385*437bfbebSnyanmisaka pos_y_end = MPP_MIN(pos_y_end, mb_h);
1386*437bfbebSnyanmisaka pos_x_init = MPP_MAX(pos_x_init, 0);
1387*437bfbebSnyanmisaka pos_y_init = MPP_MAX(pos_y_init, 0);
1388*437bfbebSnyanmisaka
1389*437bfbebSnyanmisaka mpp_assert(pos_x_end > pos_x_init);
1390*437bfbebSnyanmisaka mpp_assert(pos_y_end > pos_y_init);
1391*437bfbebSnyanmisaka
1392*437bfbebSnyanmisaka cfg.force_intra = 1;
1393*437bfbebSnyanmisaka
1394*437bfbebSnyanmisaka ptr += pos_y_init * stride_h + pos_x_init;
1395*437bfbebSnyanmisaka roi_width = pos_x_end - pos_x_init;
1396*437bfbebSnyanmisaka roi_height = pos_y_end - pos_y_init;
1397*437bfbebSnyanmisaka
1398*437bfbebSnyanmisaka for (y = 0; y < roi_height; y++) {
1399*437bfbebSnyanmisaka Vepu511RoiH264BsCfg *dst = ptr;
1400*437bfbebSnyanmisaka
1401*437bfbebSnyanmisaka for (x = 0; x < roi_width; x++, dst++)
1402*437bfbebSnyanmisaka memcpy(dst, &cfg, sizeof(cfg));
1403*437bfbebSnyanmisaka
1404*437bfbebSnyanmisaka ptr += stride_h;
1405*437bfbebSnyanmisaka }
1406*437bfbebSnyanmisaka DONE:
1407*437bfbebSnyanmisaka return ret;
1408*437bfbebSnyanmisaka }
1409*437bfbebSnyanmisaka
setup_vepu511_intra_refresh(HalVepu511RegSet * regs,HalH264eVepu511Ctx * ctx,RK_U32 refresh_idx)1410*437bfbebSnyanmisaka static MPP_RET setup_vepu511_intra_refresh(HalVepu511RegSet *regs, HalH264eVepu511Ctx *ctx, RK_U32 refresh_idx)
1411*437bfbebSnyanmisaka {
1412*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
1413*437bfbebSnyanmisaka RK_U32 mb_w = ctx->sps->pic_width_in_mbs;
1414*437bfbebSnyanmisaka RK_U32 mb_h = ctx->sps->pic_height_in_mbs;
1415*437bfbebSnyanmisaka RK_U32 w = mb_w * 16;
1416*437bfbebSnyanmisaka RK_U32 h = mb_h * 16;
1417*437bfbebSnyanmisaka MppEncROIRegion *region = NULL;
1418*437bfbebSnyanmisaka H264eVepu511Frame *reg_frm = ®s->reg_frm;
1419*437bfbebSnyanmisaka RK_U32 refresh_num = ctx->cfg->rc.refresh_num;
1420*437bfbebSnyanmisaka RK_U32 stride_h = MPP_ALIGN(mb_w, 4);
1421*437bfbebSnyanmisaka RK_U32 stride_v = MPP_ALIGN(mb_h, 4);
1422*437bfbebSnyanmisaka RK_U32 roi_base_buf_size = stride_h * stride_v * 8;
1423*437bfbebSnyanmisaka RK_U32 i = 0;
1424*437bfbebSnyanmisaka
1425*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1426*437bfbebSnyanmisaka
1427*437bfbebSnyanmisaka if (!ctx->cfg->rc.refresh_en) {
1428*437bfbebSnyanmisaka ret = MPP_ERR_VALUE;
1429*437bfbebSnyanmisaka goto RET;
1430*437bfbebSnyanmisaka }
1431*437bfbebSnyanmisaka
1432*437bfbebSnyanmisaka if (NULL == ctx->roi_base_cfg_buf) {
1433*437bfbebSnyanmisaka if (NULL == ctx->roi_grp)
1434*437bfbebSnyanmisaka mpp_buffer_group_get_internal(&ctx->roi_grp, MPP_BUFFER_TYPE_ION);
1435*437bfbebSnyanmisaka mpp_buffer_get(ctx->roi_grp, &ctx->roi_base_cfg_buf, roi_base_buf_size);
1436*437bfbebSnyanmisaka ctx->roi_base_buf_size = roi_base_buf_size;
1437*437bfbebSnyanmisaka }
1438*437bfbebSnyanmisaka
1439*437bfbebSnyanmisaka mpp_assert(ctx->roi_base_cfg_buf);
1440*437bfbebSnyanmisaka void *base_cfg_buf = mpp_buffer_get_ptr(ctx->roi_base_cfg_buf);
1441*437bfbebSnyanmisaka Vepu511RoiH264BsCfg base_cfg;
1442*437bfbebSnyanmisaka Vepu511RoiH264BsCfg *base_cfg_ptr = (Vepu511RoiH264BsCfg *)base_cfg_buf;
1443*437bfbebSnyanmisaka
1444*437bfbebSnyanmisaka base_cfg.force_intra = 0;
1445*437bfbebSnyanmisaka base_cfg.qp_adj_en = 1;
1446*437bfbebSnyanmisaka
1447*437bfbebSnyanmisaka for (i = 0; i < stride_h * stride_v; i++, base_cfg_ptr++)
1448*437bfbebSnyanmisaka memcpy(base_cfg_ptr, &base_cfg, sizeof(base_cfg));
1449*437bfbebSnyanmisaka
1450*437bfbebSnyanmisaka region = mpp_calloc(MppEncROIRegion, 1);
1451*437bfbebSnyanmisaka
1452*437bfbebSnyanmisaka if (NULL == region) {
1453*437bfbebSnyanmisaka mpp_err_f("Failed to calloc for MppEncROIRegion !\n");
1454*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
1455*437bfbebSnyanmisaka }
1456*437bfbebSnyanmisaka
1457*437bfbebSnyanmisaka if (ctx->cfg->rc.refresh_mode == MPP_ENC_RC_INTRA_REFRESH_ROW) {
1458*437bfbebSnyanmisaka region->x = 0;
1459*437bfbebSnyanmisaka region->w = w;
1460*437bfbebSnyanmisaka if (refresh_idx > 0) {
1461*437bfbebSnyanmisaka region->y = refresh_idx * 16 * refresh_num - 32;
1462*437bfbebSnyanmisaka region->h = 16 * refresh_num + 32;
1463*437bfbebSnyanmisaka } else {
1464*437bfbebSnyanmisaka region->y = refresh_idx * 16 * refresh_num;
1465*437bfbebSnyanmisaka region->h = 16 * refresh_num;
1466*437bfbebSnyanmisaka }
1467*437bfbebSnyanmisaka reg_frm->common.me_rnge.cime_srch_uph = 1;
1468*437bfbebSnyanmisaka } else if (ctx->cfg->rc.refresh_mode == MPP_ENC_RC_INTRA_REFRESH_COL) {
1469*437bfbebSnyanmisaka region->y = 0;
1470*437bfbebSnyanmisaka region->h = h;
1471*437bfbebSnyanmisaka if (refresh_idx > 0) {
1472*437bfbebSnyanmisaka region->x = refresh_idx * 16 * refresh_num - 32;
1473*437bfbebSnyanmisaka region->w = 16 * refresh_num + 32;
1474*437bfbebSnyanmisaka } else {
1475*437bfbebSnyanmisaka region->x = refresh_idx * 16 * refresh_num;
1476*437bfbebSnyanmisaka region->w = 16 * refresh_num;
1477*437bfbebSnyanmisaka }
1478*437bfbebSnyanmisaka reg_frm->common.me_rnge.cime_srch_dwnh = 1;
1479*437bfbebSnyanmisaka }
1480*437bfbebSnyanmisaka
1481*437bfbebSnyanmisaka region->intra = 1;
1482*437bfbebSnyanmisaka region->quality = -ctx->cfg->rc.qp_delta_ip;
1483*437bfbebSnyanmisaka
1484*437bfbebSnyanmisaka region->area_map_en = 1;
1485*437bfbebSnyanmisaka region->qp_area_idx = 1;
1486*437bfbebSnyanmisaka region->abs_qp_en = 0;
1487*437bfbebSnyanmisaka
1488*437bfbebSnyanmisaka vepu511_h264_set_one_roi(base_cfg_buf, region, w, h);
1489*437bfbebSnyanmisaka mpp_free(region);
1490*437bfbebSnyanmisaka RET:
1491*437bfbebSnyanmisaka hal_h264e_dbg_func("leave, ret %d\n", ret);
1492*437bfbebSnyanmisaka return ret;
1493*437bfbebSnyanmisaka }
1494*437bfbebSnyanmisaka
setup_vepu511_recn_refr(HalH264eVepu511Ctx * ctx,HalVepu511RegSet * regs)1495*437bfbebSnyanmisaka static void setup_vepu511_recn_refr(HalH264eVepu511Ctx *ctx, HalVepu511RegSet *regs)
1496*437bfbebSnyanmisaka {
1497*437bfbebSnyanmisaka
1498*437bfbebSnyanmisaka H264eVepu511Frame *reg_frm = ®s->reg_frm;
1499*437bfbebSnyanmisaka H264eFrmInfo *frms = ctx->frms;
1500*437bfbebSnyanmisaka HalBufs bufs = ctx->hw_recn;
1501*437bfbebSnyanmisaka RK_S32 fbc_hdr_size = ctx->pixel_buf_fbc_hdr_size;
1502*437bfbebSnyanmisaka
1503*437bfbebSnyanmisaka HalBuf *curr = hal_bufs_get_buf(bufs, frms->curr_idx);
1504*437bfbebSnyanmisaka HalBuf *refr = hal_bufs_get_buf(bufs, frms->refr_idx);
1505*437bfbebSnyanmisaka
1506*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1507*437bfbebSnyanmisaka
1508*437bfbebSnyanmisaka if (curr && curr->cnt) {
1509*437bfbebSnyanmisaka MppBuffer buf_pixel = curr->buf[0];
1510*437bfbebSnyanmisaka MppBuffer buf_thumb = curr->buf[1];
1511*437bfbebSnyanmisaka MppBuffer buf_smear = curr->buf[2];
1512*437bfbebSnyanmisaka RK_S32 fd = mpp_buffer_get_fd(buf_pixel);
1513*437bfbebSnyanmisaka
1514*437bfbebSnyanmisaka mpp_assert(buf_pixel);
1515*437bfbebSnyanmisaka mpp_assert(buf_thumb);
1516*437bfbebSnyanmisaka
1517*437bfbebSnyanmisaka reg_frm->common.rfpw_h_addr = fd;
1518*437bfbebSnyanmisaka reg_frm->common.rfpw_b_addr = fd;
1519*437bfbebSnyanmisaka reg_frm->common.dspw_addr = mpp_buffer_get_fd(buf_thumb);
1520*437bfbebSnyanmisaka reg_frm->common.adr_smear_wr = mpp_buffer_get_fd(buf_smear);
1521*437bfbebSnyanmisaka }
1522*437bfbebSnyanmisaka
1523*437bfbebSnyanmisaka if (refr && refr->cnt) {
1524*437bfbebSnyanmisaka MppBuffer buf_pixel = refr->buf[0];
1525*437bfbebSnyanmisaka MppBuffer buf_thumb = refr->buf[1];
1526*437bfbebSnyanmisaka MppBuffer buf_smear = curr->buf[2];
1527*437bfbebSnyanmisaka RK_S32 fd = mpp_buffer_get_fd(buf_pixel);
1528*437bfbebSnyanmisaka
1529*437bfbebSnyanmisaka mpp_assert(buf_pixel);
1530*437bfbebSnyanmisaka mpp_assert(buf_thumb);
1531*437bfbebSnyanmisaka
1532*437bfbebSnyanmisaka reg_frm->common.rfpr_h_addr = fd;
1533*437bfbebSnyanmisaka reg_frm->common.rfpr_b_addr = fd;
1534*437bfbebSnyanmisaka reg_frm->common.dspr_addr = mpp_buffer_get_fd(buf_thumb);
1535*437bfbebSnyanmisaka reg_frm->common.adr_smear_rd = mpp_buffer_get_fd(buf_smear);
1536*437bfbebSnyanmisaka }
1537*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->offsets, 164, fbc_hdr_size);
1538*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->offsets, 166, fbc_hdr_size);
1539*437bfbebSnyanmisaka
1540*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1541*437bfbebSnyanmisaka }
1542*437bfbebSnyanmisaka
setup_vepu511_split(HalVepu511RegSet * regs,MppEncCfgSet * enc_cfg)1543*437bfbebSnyanmisaka static void setup_vepu511_split(HalVepu511RegSet *regs, MppEncCfgSet *enc_cfg)
1544*437bfbebSnyanmisaka {
1545*437bfbebSnyanmisaka H264eVepu511Frame *reg_frm = ®s->reg_frm;
1546*437bfbebSnyanmisaka MppEncSliceSplit *cfg = &enc_cfg->split;
1547*437bfbebSnyanmisaka
1548*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1549*437bfbebSnyanmisaka
1550*437bfbebSnyanmisaka switch (cfg->split_mode) {
1551*437bfbebSnyanmisaka case MPP_ENC_SPLIT_NONE : {
1552*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_splt = 0;
1553*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_splt_mode = 0;
1554*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_splt_cpst = 0;
1555*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_max_num_m1 = 0;
1556*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_flsh = 0;
1557*437bfbebSnyanmisaka reg_frm->common.sli_cnum.sli_splt_cnum_m1 = 0;
1558*437bfbebSnyanmisaka
1559*437bfbebSnyanmisaka reg_frm->common.sli_byte.sli_splt_byte = 0;
1560*437bfbebSnyanmisaka reg_frm->common.enc_pic.slen_fifo = 0;
1561*437bfbebSnyanmisaka } break;
1562*437bfbebSnyanmisaka case MPP_ENC_SPLIT_BY_BYTE : {
1563*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_splt = 1;
1564*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_splt_mode = 0;
1565*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_splt_cpst = 0;
1566*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_max_num_m1 = 500;
1567*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_flsh = 1;
1568*437bfbebSnyanmisaka reg_frm->common.sli_cnum.sli_splt_cnum_m1 = 0;
1569*437bfbebSnyanmisaka
1570*437bfbebSnyanmisaka reg_frm->common.sli_byte.sli_splt_byte = cfg->split_arg;
1571*437bfbebSnyanmisaka reg_frm->common.enc_pic.slen_fifo = cfg->split_out ? 1 : 0;
1572*437bfbebSnyanmisaka regs->reg_ctl.int_en.vslc_done_en = reg_frm->common.enc_pic.slen_fifo;
1573*437bfbebSnyanmisaka } break;
1574*437bfbebSnyanmisaka case MPP_ENC_SPLIT_BY_CTU : {
1575*437bfbebSnyanmisaka RK_U32 mb_w = MPP_ALIGN(enc_cfg->prep.width, 16) / 16;
1576*437bfbebSnyanmisaka RK_U32 mb_h = MPP_ALIGN(enc_cfg->prep.height, 16) / 16;
1577*437bfbebSnyanmisaka RK_U32 slice_num = (mb_w * mb_h + cfg->split_arg - 1) / cfg->split_arg;
1578*437bfbebSnyanmisaka
1579*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_splt = 1;
1580*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_splt_mode = 1;
1581*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_splt_cpst = 0;
1582*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_max_num_m1 = 500;
1583*437bfbebSnyanmisaka reg_frm->common.sli_splt.sli_flsh = 1;
1584*437bfbebSnyanmisaka reg_frm->common.sli_cnum.sli_splt_cnum_m1 = cfg->split_arg - 1;
1585*437bfbebSnyanmisaka
1586*437bfbebSnyanmisaka reg_frm->common.sli_byte.sli_splt_byte = 0;
1587*437bfbebSnyanmisaka reg_frm->common.enc_pic.slen_fifo = cfg->split_out ? 1 : 0;
1588*437bfbebSnyanmisaka if ((cfg->split_out & MPP_ENC_SPLIT_OUT_LOWDELAY) ||
1589*437bfbebSnyanmisaka (regs->reg_frm.common.enc_pic.slen_fifo && (slice_num > VEPU511_SLICE_FIFO_LEN)))
1590*437bfbebSnyanmisaka regs->reg_ctl.int_en.vslc_done_en = 1;
1591*437bfbebSnyanmisaka } break;
1592*437bfbebSnyanmisaka default : {
1593*437bfbebSnyanmisaka mpp_log_f("invalide slice split mode %d\n", cfg->split_mode);
1594*437bfbebSnyanmisaka } break;
1595*437bfbebSnyanmisaka }
1596*437bfbebSnyanmisaka
1597*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1598*437bfbebSnyanmisaka }
1599*437bfbebSnyanmisaka
setup_vepu511_me(HalH264eVepu511Ctx * ctx)1600*437bfbebSnyanmisaka static void setup_vepu511_me(HalH264eVepu511Ctx *ctx)
1601*437bfbebSnyanmisaka {
1602*437bfbebSnyanmisaka HalVepu511RegSet *regs = ctx->regs_set;
1603*437bfbebSnyanmisaka H264eVepu511Frame *reg_frm = ®s->reg_frm;
1604*437bfbebSnyanmisaka H264eVepu511Param *reg_param = ®s->reg_param;
1605*437bfbebSnyanmisaka MppEncSceneMode sm = ctx->cfg->tune.scene_mode;
1606*437bfbebSnyanmisaka
1607*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1608*437bfbebSnyanmisaka
1609*437bfbebSnyanmisaka reg_frm->common.me_rnge.cime_srch_dwnh = 15;
1610*437bfbebSnyanmisaka reg_frm->common.me_rnge.cime_srch_uph = 15;
1611*437bfbebSnyanmisaka reg_frm->common.me_rnge.cime_srch_rgtw = 12;
1612*437bfbebSnyanmisaka reg_frm->common.me_rnge.cime_srch_lftw = 12;
1613*437bfbebSnyanmisaka reg_frm->common.me_cfg.rme_srch_h = 3;
1614*437bfbebSnyanmisaka reg_frm->common.me_cfg.rme_srch_v = 3;
1615*437bfbebSnyanmisaka
1616*437bfbebSnyanmisaka reg_frm->common.me_cfg.srgn_max_num = 72;
1617*437bfbebSnyanmisaka reg_frm->common.me_cfg.cime_dist_thre = 1024;
1618*437bfbebSnyanmisaka reg_frm->common.me_cfg.rme_dis = 0;
1619*437bfbebSnyanmisaka reg_frm->common.me_cfg.fme_dis = 0;
1620*437bfbebSnyanmisaka reg_frm->common.me_rnge.dlt_frm_num = 0x0;
1621*437bfbebSnyanmisaka reg_frm->common.me_cach.cime_zero_thre = 64;
1622*437bfbebSnyanmisaka
1623*437bfbebSnyanmisaka /* CIME: 0x1760 - 0x176C */
1624*437bfbebSnyanmisaka reg_param->me_sqi_comb.cime_pmv_num = 1;
1625*437bfbebSnyanmisaka reg_param->me_sqi_comb.cime_fuse = 0;
1626*437bfbebSnyanmisaka reg_param->me_sqi_comb.move_lambda = 0;
1627*437bfbebSnyanmisaka reg_param->me_sqi_comb.rime_lvl_mrg = 1;
1628*437bfbebSnyanmisaka reg_param->me_sqi_comb.rime_prelvl_en = 0;
1629*437bfbebSnyanmisaka reg_param->me_sqi_comb.rime_prersu_en = 0;
1630*437bfbebSnyanmisaka reg_param->me_sqi_comb.fme_lvl_mrg = 1;
1631*437bfbebSnyanmisaka reg_param->cime_mvd_th_comb.cime_mvd_th0 = 16;
1632*437bfbebSnyanmisaka reg_param->cime_mvd_th_comb.cime_mvd_th1 = 48;
1633*437bfbebSnyanmisaka reg_param->cime_mvd_th_comb.cime_mvd_th2 = 80;
1634*437bfbebSnyanmisaka reg_param->cime_madp_th_comb.cime_madp_th = 16;
1635*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi0 = 8;
1636*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi1 = 12;
1637*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi2 = 16;
1638*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi3 = 20;
1639*437bfbebSnyanmisaka
1640*437bfbebSnyanmisaka /* RFME: 0x1770 - 0x1778 */
1641*437bfbebSnyanmisaka reg_param->rime_mvd_th_comb.rime_mvd_th0 = 1;
1642*437bfbebSnyanmisaka reg_param->rime_mvd_th_comb.rime_mvd_th1 = 2;
1643*437bfbebSnyanmisaka reg_param->rime_mvd_th_comb.fme_madp_th = 0;
1644*437bfbebSnyanmisaka reg_param->rime_madp_th_comb.rime_madp_th0 = 8;
1645*437bfbebSnyanmisaka reg_param->rime_madp_th_comb.rime_madp_th1 = 16;
1646*437bfbebSnyanmisaka reg_param->rime_multi_comb.rime_multi0 = 4;
1647*437bfbebSnyanmisaka reg_param->rime_multi_comb.rime_multi1 = 8;
1648*437bfbebSnyanmisaka reg_param->rime_multi_comb.rime_multi2 = 12;
1649*437bfbebSnyanmisaka reg_param->cmv_st_th_comb.cmv_th0 = 64;
1650*437bfbebSnyanmisaka reg_param->cmv_st_th_comb.cmv_th1 = 96;
1651*437bfbebSnyanmisaka reg_param->cmv_st_th_comb.cmv_th2 = 128;
1652*437bfbebSnyanmisaka
1653*437bfbebSnyanmisaka if (sm != MPP_ENC_SCENE_MODE_IPC) {
1654*437bfbebSnyanmisaka /* disable subjective optimization */
1655*437bfbebSnyanmisaka reg_param->cime_madp_th_comb.cime_madp_th = 0;
1656*437bfbebSnyanmisaka reg_param->rime_madp_th_comb.rime_madp_th0 = 0;
1657*437bfbebSnyanmisaka reg_param->rime_madp_th_comb.rime_madp_th1 = 0;
1658*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi0 = 4;
1659*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi1 = 4;
1660*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi2 = 4;
1661*437bfbebSnyanmisaka reg_param->cime_multi_comb.cime_multi3 = 4;
1662*437bfbebSnyanmisaka reg_param->rime_multi_comb.rime_multi0 = 4;
1663*437bfbebSnyanmisaka reg_param->rime_multi_comb.rime_multi1 = 4;
1664*437bfbebSnyanmisaka reg_param->rime_multi_comb.rime_multi2 = 4;
1665*437bfbebSnyanmisaka }
1666*437bfbebSnyanmisaka
1667*437bfbebSnyanmisaka /* 0x1064 */
1668*437bfbebSnyanmisaka regs->reg_rc_roi.madi_st_thd.madi_th0 = 5;
1669*437bfbebSnyanmisaka regs->reg_rc_roi.madi_st_thd.madi_th1 = 12;
1670*437bfbebSnyanmisaka regs->reg_rc_roi.madi_st_thd.madi_th2 = 20;
1671*437bfbebSnyanmisaka /* 0x1068 */
1672*437bfbebSnyanmisaka regs->reg_rc_roi.madp_st_thd0.madp_th0 = 4 << 4;
1673*437bfbebSnyanmisaka regs->reg_rc_roi.madp_st_thd0.madp_th1 = 9 << 4;
1674*437bfbebSnyanmisaka /* 0x106C */
1675*437bfbebSnyanmisaka regs->reg_rc_roi.madp_st_thd1.madp_th2 = 15 << 4;
1676*437bfbebSnyanmisaka
1677*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1678*437bfbebSnyanmisaka }
1679*437bfbebSnyanmisaka
1680*437bfbebSnyanmisaka #define H264E_LAMBDA_TAB_SIZE (52 * sizeof(RK_U32))
1681*437bfbebSnyanmisaka
1682*437bfbebSnyanmisaka static RK_U32 h264e_lambda_default[60] = {
1683*437bfbebSnyanmisaka 0x00000005, 0x00000006, 0x00000007, 0x00000009,
1684*437bfbebSnyanmisaka 0x0000000b, 0x0000000e, 0x00000012, 0x00000016,
1685*437bfbebSnyanmisaka 0x0000001c, 0x00000024, 0x0000002d, 0x00000039,
1686*437bfbebSnyanmisaka 0x00000048, 0x0000005b, 0x00000073, 0x00000091,
1687*437bfbebSnyanmisaka 0x000000b6, 0x000000e6, 0x00000122, 0x0000016d,
1688*437bfbebSnyanmisaka 0x000001cc, 0x00000244, 0x000002db, 0x00000399,
1689*437bfbebSnyanmisaka 0x00000489, 0x000005b6, 0x00000733, 0x00000912,
1690*437bfbebSnyanmisaka 0x00000b6d, 0x00000e66, 0x00001224, 0x000016db,
1691*437bfbebSnyanmisaka 0x00001ccc, 0x00002449, 0x00002db7, 0x00003999,
1692*437bfbebSnyanmisaka 0x00004892, 0x00005b6f, 0x00007333, 0x00009124,
1693*437bfbebSnyanmisaka 0x0000b6de, 0x0000e666, 0x00012249, 0x00016dbc,
1694*437bfbebSnyanmisaka 0x0001cccc, 0x00024492, 0x0002db79, 0x00039999,
1695*437bfbebSnyanmisaka 0x00048924, 0x0005b6f2, 0x00073333, 0x00091249,
1696*437bfbebSnyanmisaka 0x000b6de5, 0x000e6666, 0x00122492, 0x0016dbcb,
1697*437bfbebSnyanmisaka 0x001ccccc, 0x00244924, 0x002db796, 0x00399998,
1698*437bfbebSnyanmisaka };
1699*437bfbebSnyanmisaka
1700*437bfbebSnyanmisaka static RK_U32 h264e_lambda_cvr[60] = {
1701*437bfbebSnyanmisaka 0x00000009, 0x0000000b, 0x0000000e, 0x00000011,
1702*437bfbebSnyanmisaka 0x00000016, 0x0000001b, 0x00000022, 0x0000002b,
1703*437bfbebSnyanmisaka 0x00000036, 0x00000045, 0x00000056, 0x0000006d,
1704*437bfbebSnyanmisaka 0x00000089, 0x000000ad, 0x000000da, 0x00000112,
1705*437bfbebSnyanmisaka 0x00000159, 0x000001b3, 0x00000224, 0x000002b3,
1706*437bfbebSnyanmisaka 0x00000366, 0x00000449, 0x00000566, 0x000006cd,
1707*437bfbebSnyanmisaka 0x00000891, 0x00000acb, 0x00000d9a, 0x000013c1,
1708*437bfbebSnyanmisaka 0x000018e4, 0x00001f5c, 0x00002783, 0x000031c8,
1709*437bfbebSnyanmisaka 0x00003eb8, 0x00004f06, 0x00006390, 0x00008e14,
1710*437bfbebSnyanmisaka 0x0000b302, 0x0000e18a, 0x00011c29, 0x00016605,
1711*437bfbebSnyanmisaka 0x0001c313, 0x00027ae1, 0x00031fe6, 0x0003efcf,
1712*437bfbebSnyanmisaka 0x0004f5c3, 0x0006e785, 0x0008b2ef, 0x000af5c3,
1713*437bfbebSnyanmisaka 0x000f1e7a, 0x00130c7f, 0x00180000, 0x001e3cf4,
1714*437bfbebSnyanmisaka 0x002618fe, 0x00300000, 0x003c79e8, 0x004c31fc,
1715*437bfbebSnyanmisaka 0x00600000, 0x0078f3d0, 0x009863f8, 0x0c000000,
1716*437bfbebSnyanmisaka };
1717*437bfbebSnyanmisaka
1718*437bfbebSnyanmisaka static void
setup_vepu511_l2(HalH264eVepu511Ctx * ctx)1719*437bfbebSnyanmisaka setup_vepu511_l2(HalH264eVepu511Ctx *ctx)
1720*437bfbebSnyanmisaka {
1721*437bfbebSnyanmisaka HalVepu511RegSet *regs = ctx->regs_set;
1722*437bfbebSnyanmisaka MppEncSceneMode sm = ctx->cfg->tune.scene_mode;
1723*437bfbebSnyanmisaka RK_S32 lambda_idx = ctx->cfg->tune.lambda_idx_i; //TODO: lambda_idx_p
1724*437bfbebSnyanmisaka
1725*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1726*437bfbebSnyanmisaka
1727*437bfbebSnyanmisaka if (sm == MPP_ENC_SCENE_MODE_IPC) {
1728*437bfbebSnyanmisaka memcpy(regs->reg_param.rdo_wgta_qp_grpa_0_51,
1729*437bfbebSnyanmisaka &h264e_lambda_default[lambda_idx], H264E_LAMBDA_TAB_SIZE);
1730*437bfbebSnyanmisaka } else {
1731*437bfbebSnyanmisaka memcpy(regs->reg_param.rdo_wgta_qp_grpa_0_51,
1732*437bfbebSnyanmisaka &h264e_lambda_cvr[lambda_idx], H264E_LAMBDA_TAB_SIZE);
1733*437bfbebSnyanmisaka }
1734*437bfbebSnyanmisaka
1735*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1736*437bfbebSnyanmisaka }
1737*437bfbebSnyanmisaka
setup_vepu511_ext_line_buf(HalVepu511RegSet * regs,HalH264eVepu511Ctx * ctx)1738*437bfbebSnyanmisaka static void setup_vepu511_ext_line_buf(HalVepu511RegSet *regs, HalH264eVepu511Ctx *ctx)
1739*437bfbebSnyanmisaka {
1740*437bfbebSnyanmisaka H264eVepu511Frame *reg_frm = ®s->reg_frm;
1741*437bfbebSnyanmisaka MppDevRcbInfoCfg rcb_cfg;
1742*437bfbebSnyanmisaka RK_S32 offset = 0;
1743*437bfbebSnyanmisaka RK_S32 fd;
1744*437bfbebSnyanmisaka
1745*437bfbebSnyanmisaka if (!ctx->ext_line_buf) {
1746*437bfbebSnyanmisaka reg_frm->common.ebufb_addr = 0;
1747*437bfbebSnyanmisaka reg_frm->common.ebufb_addr = 0;
1748*437bfbebSnyanmisaka return;
1749*437bfbebSnyanmisaka }
1750*437bfbebSnyanmisaka
1751*437bfbebSnyanmisaka fd = mpp_buffer_get_fd(ctx->ext_line_buf);
1752*437bfbebSnyanmisaka offset = ctx->ext_line_buf_size;
1753*437bfbebSnyanmisaka
1754*437bfbebSnyanmisaka reg_frm->common.ebuft_addr = fd;
1755*437bfbebSnyanmisaka reg_frm->common.ebufb_addr = fd;
1756*437bfbebSnyanmisaka
1757*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->offsets, 178, offset);
1758*437bfbebSnyanmisaka
1759*437bfbebSnyanmisaka /* rcb info for sram */
1760*437bfbebSnyanmisaka rcb_cfg.reg_idx = 179;
1761*437bfbebSnyanmisaka rcb_cfg.size = offset;
1762*437bfbebSnyanmisaka
1763*437bfbebSnyanmisaka mpp_dev_ioctl(ctx->dev, MPP_DEV_RCB_INFO, &rcb_cfg);
1764*437bfbebSnyanmisaka
1765*437bfbebSnyanmisaka rcb_cfg.reg_idx = 178;
1766*437bfbebSnyanmisaka rcb_cfg.size = 0;
1767*437bfbebSnyanmisaka
1768*437bfbebSnyanmisaka mpp_dev_ioctl(ctx->dev, MPP_DEV_RCB_INFO, &rcb_cfg);
1769*437bfbebSnyanmisaka }
1770*437bfbebSnyanmisaka
setup_vepu511_aq(HalH264eVepu511Ctx * ctx)1771*437bfbebSnyanmisaka static void setup_vepu511_aq(HalH264eVepu511Ctx *ctx)
1772*437bfbebSnyanmisaka {
1773*437bfbebSnyanmisaka MppEncCfgSet *cfg = ctx->cfg;
1774*437bfbebSnyanmisaka MppEncHwCfg *hw = &cfg->hw;
1775*437bfbebSnyanmisaka Vepu511RcRoi *s = &ctx->regs_set->reg_rc_roi;
1776*437bfbebSnyanmisaka RK_S32 *aq_step, *aq_thd;
1777*437bfbebSnyanmisaka RK_U8 i;
1778*437bfbebSnyanmisaka
1779*437bfbebSnyanmisaka if (ctx->slice->slice_type == H264_I_SLICE) {
1780*437bfbebSnyanmisaka aq_thd = (RK_S32 *)&hw->aq_thrd_i[0];
1781*437bfbebSnyanmisaka aq_step = &hw->aq_step_i[0];
1782*437bfbebSnyanmisaka } else {
1783*437bfbebSnyanmisaka aq_thd = (RK_S32 *)&hw->aq_thrd_p[0];
1784*437bfbebSnyanmisaka aq_step = &hw->aq_step_p[0];
1785*437bfbebSnyanmisaka }
1786*437bfbebSnyanmisaka
1787*437bfbebSnyanmisaka for (i = 0; i < 16; i++)
1788*437bfbebSnyanmisaka s->aq_tthd[i] = aq_thd[i] & 0xff;
1789*437bfbebSnyanmisaka
1790*437bfbebSnyanmisaka s->aq_stp0.aq_stp_s0 = aq_step[0] & 0x1f;
1791*437bfbebSnyanmisaka s->aq_stp0.aq_stp_0t1 = aq_step[1] & 0x1f;
1792*437bfbebSnyanmisaka s->aq_stp0.aq_stp_1t2 = aq_step[2] & 0x1f;
1793*437bfbebSnyanmisaka s->aq_stp0.aq_stp_2t3 = aq_step[3] & 0x1f;
1794*437bfbebSnyanmisaka s->aq_stp0.aq_stp_3t4 = aq_step[4] & 0x1f;
1795*437bfbebSnyanmisaka s->aq_stp0.aq_stp_4t5 = aq_step[5] & 0x1f;
1796*437bfbebSnyanmisaka s->aq_stp1.aq_stp_5t6 = aq_step[6] & 0x1f;
1797*437bfbebSnyanmisaka s->aq_stp1.aq_stp_6t7 = aq_step[7] & 0x1f;
1798*437bfbebSnyanmisaka s->aq_stp1.aq_stp_7t8 = 0;
1799*437bfbebSnyanmisaka s->aq_stp1.aq_stp_8t9 = aq_step[8] & 0x1f;
1800*437bfbebSnyanmisaka s->aq_stp1.aq_stp_9t10 = aq_step[9] & 0x1f;
1801*437bfbebSnyanmisaka s->aq_stp1.aq_stp_10t11 = aq_step[10] & 0x1f;
1802*437bfbebSnyanmisaka s->aq_stp2.aq_stp_11t12 = aq_step[11] & 0x1f;
1803*437bfbebSnyanmisaka s->aq_stp2.aq_stp_12t13 = aq_step[12] & 0x1f;
1804*437bfbebSnyanmisaka s->aq_stp2.aq_stp_13t14 = aq_step[13] & 0x1f;
1805*437bfbebSnyanmisaka s->aq_stp2.aq_stp_14t15 = aq_step[14] & 0x1f;
1806*437bfbebSnyanmisaka s->aq_stp2.aq_stp_b15 = aq_step[15] & 0x1f;
1807*437bfbebSnyanmisaka }
1808*437bfbebSnyanmisaka
setup_vepu511_anti_stripe(HalH264eVepu511Ctx * ctx)1809*437bfbebSnyanmisaka static void setup_vepu511_anti_stripe(HalH264eVepu511Ctx *ctx)
1810*437bfbebSnyanmisaka {
1811*437bfbebSnyanmisaka HalVepu511RegSet *regs = ctx->regs_set;
1812*437bfbebSnyanmisaka H264eVepu511Param *s = ®s->reg_param;
1813*437bfbebSnyanmisaka RK_S32 str = ctx->cfg->tune.atl_str;
1814*437bfbebSnyanmisaka
1815*437bfbebSnyanmisaka s->iprd_tthdy4_0.iprd_tthdy4_0 = 1;
1816*437bfbebSnyanmisaka s->iprd_tthdy4_0.iprd_tthdy4_1 = 3;
1817*437bfbebSnyanmisaka s->iprd_tthdy4_1.iprd_tthdy4_2 = 6;
1818*437bfbebSnyanmisaka s->iprd_tthdy4_1.iprd_tthdy4_3 = 8;
1819*437bfbebSnyanmisaka s->iprd_tthdc8_0.iprd_tthdc8_0 = 1;
1820*437bfbebSnyanmisaka s->iprd_tthdc8_0.iprd_tthdc8_1 = 3;
1821*437bfbebSnyanmisaka s->iprd_tthdc8_1.iprd_tthdc8_2 = 6;
1822*437bfbebSnyanmisaka s->iprd_tthdc8_1.iprd_tthdc8_3 = 8;
1823*437bfbebSnyanmisaka s->iprd_tthdy8_0.iprd_tthdy8_0 = 1;
1824*437bfbebSnyanmisaka s->iprd_tthdy8_0.iprd_tthdy8_1 = 3;
1825*437bfbebSnyanmisaka s->iprd_tthdy8_1.iprd_tthdy8_2 = 6;
1826*437bfbebSnyanmisaka s->iprd_tthdy8_1.iprd_tthdy8_3 = 8;
1827*437bfbebSnyanmisaka
1828*437bfbebSnyanmisaka if (ctx->cfg->tune.scene_mode != MPP_ENC_SCENE_MODE_IPC)
1829*437bfbebSnyanmisaka s->iprd_tthd_ul.iprd_tthd_ul = 4095; /* disable anti-stripe */
1830*437bfbebSnyanmisaka else
1831*437bfbebSnyanmisaka s->iprd_tthd_ul.iprd_tthd_ul = str ? 4 : 255;
1832*437bfbebSnyanmisaka
1833*437bfbebSnyanmisaka s->iprd_wgty8.iprd_wgty8_0 = str ? 22 : 16;
1834*437bfbebSnyanmisaka s->iprd_wgty8.iprd_wgty8_1 = str ? 23 : 16;
1835*437bfbebSnyanmisaka s->iprd_wgty8.iprd_wgty8_2 = str ? 20 : 16;
1836*437bfbebSnyanmisaka s->iprd_wgty8.iprd_wgty8_3 = str ? 22 : 16;
1837*437bfbebSnyanmisaka s->iprd_wgty4.iprd_wgty4_0 = str ? 22 : 16;
1838*437bfbebSnyanmisaka s->iprd_wgty4.iprd_wgty4_1 = str ? 26 : 16;
1839*437bfbebSnyanmisaka s->iprd_wgty4.iprd_wgty4_2 = str ? 20 : 16;
1840*437bfbebSnyanmisaka s->iprd_wgty4.iprd_wgty4_3 = str ? 22 : 16;
1841*437bfbebSnyanmisaka s->iprd_wgty16.iprd_wgty16_0 = 22;
1842*437bfbebSnyanmisaka s->iprd_wgty16.iprd_wgty16_1 = 26;
1843*437bfbebSnyanmisaka s->iprd_wgty16.iprd_wgty16_2 = 20;
1844*437bfbebSnyanmisaka s->iprd_wgty16.iprd_wgty16_3 = 22;
1845*437bfbebSnyanmisaka s->iprd_wgtc8.iprd_wgtc8_0 = 18;
1846*437bfbebSnyanmisaka s->iprd_wgtc8.iprd_wgtc8_1 = 21;
1847*437bfbebSnyanmisaka s->iprd_wgtc8.iprd_wgtc8_2 = 20;
1848*437bfbebSnyanmisaka s->iprd_wgtc8.iprd_wgtc8_3 = 19;
1849*437bfbebSnyanmisaka }
1850*437bfbebSnyanmisaka
setup_vepu511_anti_ringing(HalH264eVepu511Ctx * ctx)1851*437bfbebSnyanmisaka static void setup_vepu511_anti_ringing(HalH264eVepu511Ctx *ctx)
1852*437bfbebSnyanmisaka {
1853*437bfbebSnyanmisaka HalVepu511RegSet *regs = ctx->regs_set;
1854*437bfbebSnyanmisaka H264eVepu511Sqi *s = ®s->reg_sqi;
1855*437bfbebSnyanmisaka MppEncSceneMode sm = ctx->cfg->tune.scene_mode;
1856*437bfbebSnyanmisaka
1857*437bfbebSnyanmisaka s->atr_thd.atr_qp = (sm == MPP_ENC_SCENE_MODE_IPC) ? 32 : 45;
1858*437bfbebSnyanmisaka if (ctx->slice->slice_type == H264_I_SLICE) {
1859*437bfbebSnyanmisaka s->atr_thd.atr_thd0 = 1;
1860*437bfbebSnyanmisaka s->atr_thd.atr_thd1 = 2;
1861*437bfbebSnyanmisaka s->atr_thd.atr_thd2 = 6;
1862*437bfbebSnyanmisaka s->atr_wgt16.atr_lv16_wgt0 = 16;
1863*437bfbebSnyanmisaka s->atr_wgt16.atr_lv16_wgt1 = 16;
1864*437bfbebSnyanmisaka s->atr_wgt16.atr_lv16_wgt2 = 16;
1865*437bfbebSnyanmisaka
1866*437bfbebSnyanmisaka if (sm == MPP_ENC_SCENE_MODE_IPC) {
1867*437bfbebSnyanmisaka s->atr_wgt8.atr_lv8_wgt0 = 22;
1868*437bfbebSnyanmisaka s->atr_wgt8.atr_lv8_wgt1 = 21;
1869*437bfbebSnyanmisaka s->atr_wgt8.atr_lv8_wgt2 = 20;
1870*437bfbebSnyanmisaka s->atr_wgt4.atr_lv4_wgt0 = 20;
1871*437bfbebSnyanmisaka s->atr_wgt4.atr_lv4_wgt1 = 18;
1872*437bfbebSnyanmisaka s->atr_wgt4.atr_lv4_wgt2 = 16;
1873*437bfbebSnyanmisaka } else {
1874*437bfbebSnyanmisaka s->atr_wgt8.atr_lv8_wgt0 = 18;
1875*437bfbebSnyanmisaka s->atr_wgt8.atr_lv8_wgt1 = 17;
1876*437bfbebSnyanmisaka s->atr_wgt8.atr_lv8_wgt2 = 18;
1877*437bfbebSnyanmisaka s->atr_wgt4.atr_lv4_wgt0 = 16;
1878*437bfbebSnyanmisaka s->atr_wgt4.atr_lv4_wgt1 = 16;
1879*437bfbebSnyanmisaka s->atr_wgt4.atr_lv4_wgt2 = 16;
1880*437bfbebSnyanmisaka }
1881*437bfbebSnyanmisaka } else {
1882*437bfbebSnyanmisaka if (sm == MPP_ENC_SCENE_MODE_IPC) {
1883*437bfbebSnyanmisaka s->atr_thd.atr_thd0 = 2;
1884*437bfbebSnyanmisaka s->atr_thd.atr_thd1 = 4;
1885*437bfbebSnyanmisaka s->atr_thd.atr_thd2 = 9;
1886*437bfbebSnyanmisaka s->atr_wgt16.atr_lv16_wgt0 = 25;
1887*437bfbebSnyanmisaka s->atr_wgt16.atr_lv16_wgt1 = 20;
1888*437bfbebSnyanmisaka s->atr_wgt16.atr_lv16_wgt2 = 16;
1889*437bfbebSnyanmisaka s->atr_wgt8.atr_lv8_wgt0 = 25;
1890*437bfbebSnyanmisaka s->atr_wgt8.atr_lv8_wgt1 = 20;
1891*437bfbebSnyanmisaka s->atr_wgt8.atr_lv8_wgt2 = 18;
1892*437bfbebSnyanmisaka s->atr_wgt4.atr_lv4_wgt0 = 25;
1893*437bfbebSnyanmisaka s->atr_wgt4.atr_lv4_wgt1 = 20;
1894*437bfbebSnyanmisaka s->atr_wgt4.atr_lv4_wgt2 = 16;
1895*437bfbebSnyanmisaka } else {
1896*437bfbebSnyanmisaka s->atr_thd.atr_thd0 = 1;
1897*437bfbebSnyanmisaka s->atr_thd.atr_thd1 = 2;
1898*437bfbebSnyanmisaka s->atr_thd.atr_thd2 = 7;
1899*437bfbebSnyanmisaka s->atr_wgt16.atr_lv16_wgt0 = 23;
1900*437bfbebSnyanmisaka s->atr_wgt16.atr_lv16_wgt1 = 22;
1901*437bfbebSnyanmisaka s->atr_wgt16.atr_lv16_wgt2 = 20;
1902*437bfbebSnyanmisaka s->atr_wgt8.atr_lv8_wgt0 = 24;
1903*437bfbebSnyanmisaka s->atr_wgt8.atr_lv8_wgt1 = 24;
1904*437bfbebSnyanmisaka s->atr_wgt8.atr_lv8_wgt2 = 24;
1905*437bfbebSnyanmisaka s->atr_wgt4.atr_lv4_wgt0 = 23;
1906*437bfbebSnyanmisaka s->atr_wgt4.atr_lv4_wgt1 = 22;
1907*437bfbebSnyanmisaka s->atr_wgt4.atr_lv4_wgt2 = 20;
1908*437bfbebSnyanmisaka }
1909*437bfbebSnyanmisaka }
1910*437bfbebSnyanmisaka }
1911*437bfbebSnyanmisaka
setup_vepu511_anti_flicker(HalH264eVepu511Ctx * ctx)1912*437bfbebSnyanmisaka static void setup_vepu511_anti_flicker(HalH264eVepu511Ctx *ctx)
1913*437bfbebSnyanmisaka {
1914*437bfbebSnyanmisaka HalVepu511RegSet *regs = ctx->regs_set;
1915*437bfbebSnyanmisaka H264eVepu511Sqi *reg = ®s->reg_sqi;
1916*437bfbebSnyanmisaka RK_U32 str = ctx->cfg->tune.anti_flicker_str;
1917*437bfbebSnyanmisaka rdo_skip_par *p_skip = NULL;
1918*437bfbebSnyanmisaka rdo_noskip_par *p_no_skip = NULL;
1919*437bfbebSnyanmisaka
1920*437bfbebSnyanmisaka static RK_U8 pskip_atf_th0[4] = { 0, 0, 0, 1 };
1921*437bfbebSnyanmisaka static RK_U8 pskip_atf_th1[4] = { 7, 7, 7, 10 };
1922*437bfbebSnyanmisaka static RK_U8 pskip_atf_wgt0[4] = { 16, 16, 16, 20 };
1923*437bfbebSnyanmisaka static RK_U8 pskip_atf_wgt1[4] = { 16, 16, 14, 16 };
1924*437bfbebSnyanmisaka static RK_U8 intra_atf_th0[4] = { 8, 16, 20, 20 };
1925*437bfbebSnyanmisaka static RK_U8 intra_atf_th1[4] = { 16, 32, 40, 40 };
1926*437bfbebSnyanmisaka static RK_U8 intra_atf_th2[4] = { 32, 56, 72, 72 };
1927*437bfbebSnyanmisaka static RK_U8 intra_atf_wgt0[4] = { 16, 24, 27, 27 };
1928*437bfbebSnyanmisaka static RK_U8 intra_atf_wgt1[4] = { 16, 22, 25, 25 };
1929*437bfbebSnyanmisaka static RK_U8 intra_atf_wgt2[4] = { 16, 19, 20, 20 };
1930*437bfbebSnyanmisaka
1931*437bfbebSnyanmisaka p_skip = ®->rdo_b16_skip;
1932*437bfbebSnyanmisaka p_skip->atf_thd0.madp_thd0 = pskip_atf_th0[str];
1933*437bfbebSnyanmisaka p_skip->atf_thd0.madp_thd1 = pskip_atf_th1[str];
1934*437bfbebSnyanmisaka p_skip->atf_thd1.madp_thd2 = 15;
1935*437bfbebSnyanmisaka p_skip->atf_thd1.madp_thd3 = 25;
1936*437bfbebSnyanmisaka p_skip->atf_wgt0.wgt0 = pskip_atf_wgt0[str];
1937*437bfbebSnyanmisaka p_skip->atf_wgt0.wgt1 = pskip_atf_wgt1[str];
1938*437bfbebSnyanmisaka p_skip->atf_wgt0.wgt2 = 16;
1939*437bfbebSnyanmisaka p_skip->atf_wgt0.wgt3 = 16;
1940*437bfbebSnyanmisaka p_skip->atf_wgt1.wgt4 = 16;
1941*437bfbebSnyanmisaka
1942*437bfbebSnyanmisaka p_no_skip = ®->rdo_b16_inter;
1943*437bfbebSnyanmisaka p_no_skip->ratf_thd0.madp_thd0 = 20;
1944*437bfbebSnyanmisaka p_no_skip->ratf_thd0.madp_thd1 = 40;
1945*437bfbebSnyanmisaka p_no_skip->ratf_thd1.madp_thd2 = 72;
1946*437bfbebSnyanmisaka p_no_skip->atf_wgt.wgt0 = 16;
1947*437bfbebSnyanmisaka p_no_skip->atf_wgt.wgt1 = 16;
1948*437bfbebSnyanmisaka p_no_skip->atf_wgt.wgt2 = 16;
1949*437bfbebSnyanmisaka p_no_skip->atf_wgt.wgt3 = 16;
1950*437bfbebSnyanmisaka
1951*437bfbebSnyanmisaka p_no_skip = ®->rdo_b16_intra;
1952*437bfbebSnyanmisaka p_no_skip->ratf_thd0.madp_thd0 = intra_atf_th0[str];
1953*437bfbebSnyanmisaka p_no_skip->ratf_thd0.madp_thd1 = intra_atf_th1[str];
1954*437bfbebSnyanmisaka p_no_skip->ratf_thd1.madp_thd2 = intra_atf_th2[str];
1955*437bfbebSnyanmisaka p_no_skip->atf_wgt.wgt0 = intra_atf_wgt0[str];
1956*437bfbebSnyanmisaka p_no_skip->atf_wgt.wgt1 = intra_atf_wgt1[str];
1957*437bfbebSnyanmisaka p_no_skip->atf_wgt.wgt2 = intra_atf_wgt2[str];
1958*437bfbebSnyanmisaka p_no_skip->atf_wgt.wgt3 = 16;
1959*437bfbebSnyanmisaka
1960*437bfbebSnyanmisaka reg->rdo_b16_intra_atf_cnt_thd.thd0 = 1;
1961*437bfbebSnyanmisaka reg->rdo_b16_intra_atf_cnt_thd.thd1 = 4;
1962*437bfbebSnyanmisaka reg->rdo_b16_intra_atf_cnt_thd.thd2 = 1;
1963*437bfbebSnyanmisaka reg->rdo_b16_intra_atf_cnt_thd.thd3 = 4;
1964*437bfbebSnyanmisaka
1965*437bfbebSnyanmisaka reg->rdo_atf_resi_thd.big_th0 = 16;
1966*437bfbebSnyanmisaka reg->rdo_atf_resi_thd.big_th1 = 16;
1967*437bfbebSnyanmisaka reg->rdo_atf_resi_thd.small_th0 = 8;
1968*437bfbebSnyanmisaka reg->rdo_atf_resi_thd.small_th1 = 8;
1969*437bfbebSnyanmisaka }
1970*437bfbebSnyanmisaka
setup_vepu511_anti_smear(HalH264eVepu511Ctx * ctx)1971*437bfbebSnyanmisaka static void setup_vepu511_anti_smear(HalH264eVepu511Ctx *ctx)
1972*437bfbebSnyanmisaka {
1973*437bfbebSnyanmisaka HalVepu511RegSet *regs = ctx->regs_set;
1974*437bfbebSnyanmisaka H264eVepu511Sqi *reg = ®s->reg_sqi;
1975*437bfbebSnyanmisaka H264eSlice *slice = ctx->slice;
1976*437bfbebSnyanmisaka Vepu511H264Fbk *last_fb = &ctx->last_frame_fb;
1977*437bfbebSnyanmisaka RK_U32 mb_cnt = last_fb->st_mb_num;
1978*437bfbebSnyanmisaka RK_U32 *smear_cnt = last_fb->st_smear_cnt;
1979*437bfbebSnyanmisaka RK_S32 deblur_str = ctx->cfg->tune.deblur_str;
1980*437bfbebSnyanmisaka RK_S32 delta_qp = 0;
1981*437bfbebSnyanmisaka RK_S32 flg0 = smear_cnt[4] < (mb_cnt >> 6);
1982*437bfbebSnyanmisaka RK_S32 flg1 = 1, flg2 = 0, flg3 = 0;
1983*437bfbebSnyanmisaka RK_S32 smear_multi[4] = { 9, 12, 16, 16 };
1984*437bfbebSnyanmisaka
1985*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1986*437bfbebSnyanmisaka
1987*437bfbebSnyanmisaka if ((smear_cnt[3] < ((5 * mb_cnt) >> 10)) ||
1988*437bfbebSnyanmisaka (smear_cnt[3] < ((1126 * MPP_MAX3(smear_cnt[0], smear_cnt[1], smear_cnt[2])) >> 10)) ||
1989*437bfbebSnyanmisaka (deblur_str == 6) || (deblur_str == 7))
1990*437bfbebSnyanmisaka flg1 = 0;
1991*437bfbebSnyanmisaka
1992*437bfbebSnyanmisaka flg3 = flg1 ? 3 : (smear_cnt[4] > ((102 * mb_cnt) >> 10)) ? 2 :
1993*437bfbebSnyanmisaka (smear_cnt[4] > ((66 * mb_cnt) >> 10)) ? 1 : 0;
1994*437bfbebSnyanmisaka
1995*437bfbebSnyanmisaka if (ctx->cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC) {
1996*437bfbebSnyanmisaka reg->smear_opt_cfg.rdo_smear_en = ctx->qpmap_en;
1997*437bfbebSnyanmisaka if (ctx->qpmap_en && deblur_str > 3)
1998*437bfbebSnyanmisaka reg->smear_opt_cfg.rdo_smear_lvl16_multi = smear_multi[flg3];
1999*437bfbebSnyanmisaka else
2000*437bfbebSnyanmisaka reg->smear_opt_cfg.rdo_smear_lvl16_multi = flg0 ? 9 : 12;
2001*437bfbebSnyanmisaka } else {
2002*437bfbebSnyanmisaka reg->smear_opt_cfg.rdo_smear_en = 0;
2003*437bfbebSnyanmisaka reg->smear_opt_cfg.rdo_smear_lvl16_multi = 16;
2004*437bfbebSnyanmisaka }
2005*437bfbebSnyanmisaka
2006*437bfbebSnyanmisaka if (ctx->qpmap_en && deblur_str > 3) {
2007*437bfbebSnyanmisaka flg2 = 1;
2008*437bfbebSnyanmisaka if (smear_cnt[2] + smear_cnt[3] > (3 * smear_cnt[4] / 4))
2009*437bfbebSnyanmisaka delta_qp = 1;
2010*437bfbebSnyanmisaka if (smear_cnt[4] < (mb_cnt >> 4))
2011*437bfbebSnyanmisaka delta_qp -= 8;
2012*437bfbebSnyanmisaka else if (smear_cnt[4] < ((3 * mb_cnt) >> 5))
2013*437bfbebSnyanmisaka delta_qp -= 7;
2014*437bfbebSnyanmisaka else
2015*437bfbebSnyanmisaka delta_qp -= 6;
2016*437bfbebSnyanmisaka
2017*437bfbebSnyanmisaka if (flg3 == 2)
2018*437bfbebSnyanmisaka delta_qp = 0;
2019*437bfbebSnyanmisaka else if (flg3 == 1)
2020*437bfbebSnyanmisaka delta_qp = -2;
2021*437bfbebSnyanmisaka } else {
2022*437bfbebSnyanmisaka if (smear_cnt[2] + smear_cnt[3] > smear_cnt[4] / 2)
2023*437bfbebSnyanmisaka delta_qp = 1;
2024*437bfbebSnyanmisaka if (smear_cnt[4] < (mb_cnt >> 8))
2025*437bfbebSnyanmisaka delta_qp -= (deblur_str < 2) ? 6 : 8;
2026*437bfbebSnyanmisaka else if (smear_cnt[4] < (mb_cnt >> 7))
2027*437bfbebSnyanmisaka delta_qp -= (deblur_str < 2) ? 5 : 6;
2028*437bfbebSnyanmisaka else if (smear_cnt[4] < (mb_cnt >> 6))
2029*437bfbebSnyanmisaka delta_qp -= (deblur_str < 2) ? 3 : 4;
2030*437bfbebSnyanmisaka else
2031*437bfbebSnyanmisaka delta_qp -= 1;
2032*437bfbebSnyanmisaka }
2033*437bfbebSnyanmisaka reg->smear_opt_cfg.rdo_smear_dlt_qp = delta_qp;
2034*437bfbebSnyanmisaka
2035*437bfbebSnyanmisaka if ((H264_I_SLICE == slice->slice_type) ||
2036*437bfbebSnyanmisaka (H264_I_SLICE == last_fb->frame_type))
2037*437bfbebSnyanmisaka reg->smear_opt_cfg.stated_mode = 1;
2038*437bfbebSnyanmisaka else
2039*437bfbebSnyanmisaka reg->smear_opt_cfg.stated_mode = 2;
2040*437bfbebSnyanmisaka
2041*437bfbebSnyanmisaka reg->smear_madp_thd0.madp_cur_thd0 = 0;
2042*437bfbebSnyanmisaka reg->smear_madp_thd0.madp_cur_thd1 = flg2 ? 48 : 24;
2043*437bfbebSnyanmisaka reg->smear_madp_thd1.madp_cur_thd2 = flg2 ? 64 : 48;
2044*437bfbebSnyanmisaka reg->smear_madp_thd1.madp_cur_thd3 = flg2 ? 72 : 64;
2045*437bfbebSnyanmisaka reg->smear_madp_thd2.madp_around_thd0 = flg2 ? 4095 : 16;
2046*437bfbebSnyanmisaka reg->smear_madp_thd2.madp_around_thd1 = 32;
2047*437bfbebSnyanmisaka reg->smear_madp_thd3.madp_around_thd2 = 48;
2048*437bfbebSnyanmisaka reg->smear_madp_thd3.madp_around_thd3 = flg2 ? 0 : 96;
2049*437bfbebSnyanmisaka reg->smear_madp_thd4.madp_around_thd4 = 48;
2050*437bfbebSnyanmisaka reg->smear_madp_thd4.madp_around_thd5 = 24;
2051*437bfbebSnyanmisaka reg->smear_madp_thd5.madp_ref_thd0 = flg2 ? 64 : 96;
2052*437bfbebSnyanmisaka reg->smear_madp_thd5.madp_ref_thd1 = 48;
2053*437bfbebSnyanmisaka
2054*437bfbebSnyanmisaka reg->smear_cnt_thd0.cnt_cur_thd0 = flg2 ? 2 : 1;
2055*437bfbebSnyanmisaka reg->smear_cnt_thd0.cnt_cur_thd1 = flg2 ? 5 : 3;
2056*437bfbebSnyanmisaka reg->smear_cnt_thd0.cnt_cur_thd2 = 1;
2057*437bfbebSnyanmisaka reg->smear_cnt_thd0.cnt_cur_thd3 = 3;
2058*437bfbebSnyanmisaka reg->smear_cnt_thd1.cnt_around_thd0 = 1;
2059*437bfbebSnyanmisaka reg->smear_cnt_thd1.cnt_around_thd1 = 4;
2060*437bfbebSnyanmisaka reg->smear_cnt_thd1.cnt_around_thd2 = 1;
2061*437bfbebSnyanmisaka reg->smear_cnt_thd1.cnt_around_thd3 = 4;
2062*437bfbebSnyanmisaka reg->smear_cnt_thd2.cnt_around_thd4 = 0;
2063*437bfbebSnyanmisaka reg->smear_cnt_thd2.cnt_around_thd5 = 3;
2064*437bfbebSnyanmisaka reg->smear_cnt_thd2.cnt_around_thd6 = 0;
2065*437bfbebSnyanmisaka reg->smear_cnt_thd2.cnt_around_thd7 = 3;
2066*437bfbebSnyanmisaka reg->smear_cnt_thd3.cnt_ref_thd0 = 1;
2067*437bfbebSnyanmisaka reg->smear_cnt_thd3.cnt_ref_thd1 = 3;
2068*437bfbebSnyanmisaka
2069*437bfbebSnyanmisaka reg->smear_resi_thd0.resi_small_cur_th0 = 6;
2070*437bfbebSnyanmisaka reg->smear_resi_thd0.resi_big_cur_th0 = 9;
2071*437bfbebSnyanmisaka reg->smear_resi_thd0.resi_small_cur_th1 = 6;
2072*437bfbebSnyanmisaka reg->smear_resi_thd0.resi_big_cur_th1 = 9;
2073*437bfbebSnyanmisaka reg->smear_resi_thd1.resi_small_around_th0 = 6;
2074*437bfbebSnyanmisaka reg->smear_resi_thd1.resi_big_around_th0 = 11;
2075*437bfbebSnyanmisaka reg->smear_resi_thd1.resi_small_around_th1 = 6;
2076*437bfbebSnyanmisaka reg->smear_resi_thd1.resi_big_around_th1 = 8;
2077*437bfbebSnyanmisaka reg->smear_resi_thd2.resi_small_around_th2 = 9;
2078*437bfbebSnyanmisaka reg->smear_resi_thd2.resi_big_around_th2 = 20;
2079*437bfbebSnyanmisaka reg->smear_resi_thd2.resi_small_around_th3 = 6;
2080*437bfbebSnyanmisaka reg->smear_resi_thd2.resi_big_around_th3 = 20;
2081*437bfbebSnyanmisaka reg->smear_resi_thd3.resi_small_ref_th0 = 7;
2082*437bfbebSnyanmisaka reg->smear_resi_thd3.resi_big_ref_th0 = 16;
2083*437bfbebSnyanmisaka reg->smear_resi_thd4.resi_th0 = flg2 ? 0 : 10;
2084*437bfbebSnyanmisaka reg->smear_resi_thd4.resi_th1 = flg2 ? 0 : 6;
2085*437bfbebSnyanmisaka
2086*437bfbebSnyanmisaka reg->smear_st_thd.madp_cnt_th0 = flg2 ? 0 : 1;
2087*437bfbebSnyanmisaka reg->smear_st_thd.madp_cnt_th1 = flg2 ? 0 : 5;
2088*437bfbebSnyanmisaka reg->smear_st_thd.madp_cnt_th2 = flg2 ? 0 : 1;
2089*437bfbebSnyanmisaka reg->smear_st_thd.madp_cnt_th3 = flg2 ? 0 : 3;
2090*437bfbebSnyanmisaka
2091*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
2092*437bfbebSnyanmisaka }
2093*437bfbebSnyanmisaka
setup_vepu511_scaling_list(HalH264eVepu511Ctx * ctx)2094*437bfbebSnyanmisaka static void setup_vepu511_scaling_list(HalH264eVepu511Ctx *ctx)
2095*437bfbebSnyanmisaka {
2096*437bfbebSnyanmisaka HalVepu511RegSet *regs = ctx->regs_set;
2097*437bfbebSnyanmisaka H264eVepu511SclCfg *s = ®s->reg_scl;
2098*437bfbebSnyanmisaka RK_U8 *p = (RK_U8 *)&s->tu8_intra_y[0];
2099*437bfbebSnyanmisaka RK_U8 idx;
2100*437bfbebSnyanmisaka
2101*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
2102*437bfbebSnyanmisaka
2103*437bfbebSnyanmisaka /* intra4x4 and inter4x4 is not supported on VEPU500.
2104*437bfbebSnyanmisaka * valid range: 0x2200 ~ 0x221F
2105*437bfbebSnyanmisaka */
2106*437bfbebSnyanmisaka if (ctx->pps->pic_scaling_matrix_present == 1) {
2107*437bfbebSnyanmisaka for (idx = 0; idx < 64; idx++) {
2108*437bfbebSnyanmisaka p[idx] = vepu511_h264_cqm_jvt8i[63 - idx]; /* intra8x8 */
2109*437bfbebSnyanmisaka p[idx + 64] = vepu511_h264_cqm_jvt8p[63 - idx]; /* inter8x8 */
2110*437bfbebSnyanmisaka }
2111*437bfbebSnyanmisaka } else if (ctx->pps->pic_scaling_matrix_present == 2) {
2112*437bfbebSnyanmisaka //TODO: Update scaling list for (scaling_list_mode == 2)
2113*437bfbebSnyanmisaka mpp_log_f("scaling_list_mode 2 is not supported yet\n");
2114*437bfbebSnyanmisaka }
2115*437bfbebSnyanmisaka
2116*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
2117*437bfbebSnyanmisaka }
2118*437bfbebSnyanmisaka
hal_h264e_vepu511_gen_regs(void * hal,HalEncTask * task)2119*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu511_gen_regs(void *hal, HalEncTask *task)
2120*437bfbebSnyanmisaka {
2121*437bfbebSnyanmisaka HalH264eVepu511Ctx *ctx = (HalH264eVepu511Ctx *)hal;
2122*437bfbebSnyanmisaka HalVepu511RegSet *regs = ctx->regs_set;
2123*437bfbebSnyanmisaka MppEncCfgSet *cfg = ctx->cfg;
2124*437bfbebSnyanmisaka EncRcTask *rc_task = task->rc_task;
2125*437bfbebSnyanmisaka EncFrmStatus *frm = &rc_task->frm;
2126*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
2127*437bfbebSnyanmisaka
2128*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", hal);
2129*437bfbebSnyanmisaka hal_h264e_dbg_detail("frame %d generate regs now", ctx->frms->seq_idx);
2130*437bfbebSnyanmisaka
2131*437bfbebSnyanmisaka /* register setup */
2132*437bfbebSnyanmisaka memset(regs, 0, sizeof(*regs));
2133*437bfbebSnyanmisaka
2134*437bfbebSnyanmisaka setup_vepu511_normal(regs);
2135*437bfbebSnyanmisaka ret = setup_vepu511_prep(regs, &ctx->cfg->prep, task);
2136*437bfbebSnyanmisaka if (ret)
2137*437bfbebSnyanmisaka return ret;
2138*437bfbebSnyanmisaka
2139*437bfbebSnyanmisaka setup_vepu511_codec(regs, ctx);
2140*437bfbebSnyanmisaka setup_vepu511_rdo_pred(ctx);
2141*437bfbebSnyanmisaka setup_vepu511_aq(ctx);
2142*437bfbebSnyanmisaka setup_vepu511_anti_stripe(ctx);
2143*437bfbebSnyanmisaka setup_vepu511_anti_ringing(ctx);
2144*437bfbebSnyanmisaka setup_vepu511_anti_flicker(ctx);
2145*437bfbebSnyanmisaka setup_vepu511_anti_smear(ctx);
2146*437bfbebSnyanmisaka setup_vepu511_scaling_list(ctx);
2147*437bfbebSnyanmisaka
2148*437bfbebSnyanmisaka setup_vepu511_rc_base(regs, ctx, rc_task);
2149*437bfbebSnyanmisaka setup_vepu511_io_buf(regs, ctx->offsets, task);
2150*437bfbebSnyanmisaka setup_vepu511_recn_refr(ctx, regs);
2151*437bfbebSnyanmisaka setup_vepu511_split(regs, cfg);
2152*437bfbebSnyanmisaka setup_vepu511_me(ctx);
2153*437bfbebSnyanmisaka
2154*437bfbebSnyanmisaka if (frm->is_i_refresh)
2155*437bfbebSnyanmisaka setup_vepu511_intra_refresh(regs, ctx, frm->seq_idx % cfg->rc.gop);
2156*437bfbebSnyanmisaka
2157*437bfbebSnyanmisaka setup_vepu511_l2(ctx);
2158*437bfbebSnyanmisaka setup_vepu511_ext_line_buf(regs, ctx);
2159*437bfbebSnyanmisaka
2160*437bfbebSnyanmisaka if (ctx->osd_cfg.osd_data3)
2161*437bfbebSnyanmisaka vepu511_set_osd(&ctx->osd_cfg, ®s->reg_osd.osd_comb_cfg);
2162*437bfbebSnyanmisaka
2163*437bfbebSnyanmisaka if (ctx->roi_data)
2164*437bfbebSnyanmisaka vepu511_set_roi(&ctx->regs_set->reg_rc_roi.roi_cfg, ctx->roi_data,
2165*437bfbebSnyanmisaka ctx->cfg->prep.width, ctx->cfg->prep.height);
2166*437bfbebSnyanmisaka
2167*437bfbebSnyanmisaka /* two pass register patch */
2168*437bfbebSnyanmisaka if (frm->save_pass1)
2169*437bfbebSnyanmisaka vepu511_h264e_save_pass1_patch(regs, ctx);
2170*437bfbebSnyanmisaka
2171*437bfbebSnyanmisaka if (frm->use_pass1)
2172*437bfbebSnyanmisaka vepu511_h264e_use_pass1_patch(regs, ctx);
2173*437bfbebSnyanmisaka
2174*437bfbebSnyanmisaka ctx->frame_cnt++;
2175*437bfbebSnyanmisaka
2176*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p\n", hal);
2177*437bfbebSnyanmisaka return MPP_OK;
2178*437bfbebSnyanmisaka }
2179*437bfbebSnyanmisaka
hal_h264e_vepu511_start(void * hal,HalEncTask * task)2180*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu511_start(void *hal, HalEncTask *task)
2181*437bfbebSnyanmisaka {
2182*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
2183*437bfbebSnyanmisaka HalH264eVepu511Ctx *ctx = (HalH264eVepu511Ctx *)hal;
2184*437bfbebSnyanmisaka HalVepu511RegSet *regs = ctx->regs_set;
2185*437bfbebSnyanmisaka
2186*437bfbebSnyanmisaka (void) task;
2187*437bfbebSnyanmisaka
2188*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", hal);
2189*437bfbebSnyanmisaka
2190*437bfbebSnyanmisaka do {
2191*437bfbebSnyanmisaka MppDevRegWrCfg wr_cfg;
2192*437bfbebSnyanmisaka MppDevRegRdCfg rd_cfg;
2193*437bfbebSnyanmisaka
2194*437bfbebSnyanmisaka wr_cfg.reg = ®s->reg_ctl;
2195*437bfbebSnyanmisaka wr_cfg.size = sizeof(regs->reg_ctl);
2196*437bfbebSnyanmisaka wr_cfg.offset = VEPU511_CTL_OFFSET;
2197*437bfbebSnyanmisaka #if DUMP_REG
2198*437bfbebSnyanmisaka {
2199*437bfbebSnyanmisaka RK_U32 i;
2200*437bfbebSnyanmisaka RK_U32 *reg = (RK_U32)wr_cfg.reg;
2201*437bfbebSnyanmisaka for ( i = 0; i < sizeof(regs->reg_ctl) / sizeof(RK_U32); i++) {
2202*437bfbebSnyanmisaka mpp_log("reg[%d] = 0x%08x\n", i, reg[i]);
2203*437bfbebSnyanmisaka }
2204*437bfbebSnyanmisaka
2205*437bfbebSnyanmisaka }
2206*437bfbebSnyanmisaka #endif
2207*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
2208*437bfbebSnyanmisaka if (ret) {
2209*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2210*437bfbebSnyanmisaka break;
2211*437bfbebSnyanmisaka }
2212*437bfbebSnyanmisaka
2213*437bfbebSnyanmisaka wr_cfg.reg = ®s->reg_frm;
2214*437bfbebSnyanmisaka wr_cfg.size = sizeof(regs->reg_frm);
2215*437bfbebSnyanmisaka wr_cfg.offset = VEPU511_FRAME_OFFSET;
2216*437bfbebSnyanmisaka
2217*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
2218*437bfbebSnyanmisaka if (ret) {
2219*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2220*437bfbebSnyanmisaka break;
2221*437bfbebSnyanmisaka }
2222*437bfbebSnyanmisaka
2223*437bfbebSnyanmisaka wr_cfg.reg = ®s->reg_rc_roi;
2224*437bfbebSnyanmisaka wr_cfg.size = sizeof(regs->reg_rc_roi);
2225*437bfbebSnyanmisaka wr_cfg.offset = VEPU511_RC_ROI_OFFSET;
2226*437bfbebSnyanmisaka
2227*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
2228*437bfbebSnyanmisaka if (ret) {
2229*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2230*437bfbebSnyanmisaka break;
2231*437bfbebSnyanmisaka }
2232*437bfbebSnyanmisaka
2233*437bfbebSnyanmisaka wr_cfg.reg = ®s->reg_param;
2234*437bfbebSnyanmisaka wr_cfg.size = sizeof(regs->reg_param);
2235*437bfbebSnyanmisaka wr_cfg.offset = VEPU511_PARAM_OFFSET;
2236*437bfbebSnyanmisaka
2237*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
2238*437bfbebSnyanmisaka if (ret) {
2239*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2240*437bfbebSnyanmisaka break;
2241*437bfbebSnyanmisaka }
2242*437bfbebSnyanmisaka
2243*437bfbebSnyanmisaka wr_cfg.reg = ®s->reg_sqi;
2244*437bfbebSnyanmisaka wr_cfg.size = sizeof(regs->reg_sqi);
2245*437bfbebSnyanmisaka wr_cfg.offset = VEPU511_SQI_OFFSET;
2246*437bfbebSnyanmisaka
2247*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
2248*437bfbebSnyanmisaka if (ret) {
2249*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2250*437bfbebSnyanmisaka break;
2251*437bfbebSnyanmisaka }
2252*437bfbebSnyanmisaka
2253*437bfbebSnyanmisaka wr_cfg.reg = ®s->reg_scl;
2254*437bfbebSnyanmisaka wr_cfg.size = sizeof(regs->reg_scl);
2255*437bfbebSnyanmisaka wr_cfg.offset = VEPU511_SCL_OFFSET ;
2256*437bfbebSnyanmisaka
2257*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
2258*437bfbebSnyanmisaka if (ret) {
2259*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2260*437bfbebSnyanmisaka break;
2261*437bfbebSnyanmisaka }
2262*437bfbebSnyanmisaka
2263*437bfbebSnyanmisaka wr_cfg.reg = ®s->reg_osd;
2264*437bfbebSnyanmisaka wr_cfg.size = sizeof(regs->reg_osd);
2265*437bfbebSnyanmisaka wr_cfg.offset = VEPU511_OSD_OFFSET ;
2266*437bfbebSnyanmisaka
2267*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
2268*437bfbebSnyanmisaka if (ret) {
2269*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2270*437bfbebSnyanmisaka return ret;
2271*437bfbebSnyanmisaka }
2272*437bfbebSnyanmisaka
2273*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_OFFS, ctx->offsets);
2274*437bfbebSnyanmisaka if (ret) {
2275*437bfbebSnyanmisaka mpp_err_f("set register offsets failed %d\n", ret);
2276*437bfbebSnyanmisaka break;
2277*437bfbebSnyanmisaka }
2278*437bfbebSnyanmisaka
2279*437bfbebSnyanmisaka rd_cfg.reg = ®s->reg_ctl.int_sta;
2280*437bfbebSnyanmisaka rd_cfg.size = sizeof(RK_U32);
2281*437bfbebSnyanmisaka rd_cfg.offset = VEPU511_REG_BASE_HW_STATUS;
2282*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &rd_cfg);
2283*437bfbebSnyanmisaka if (ret) {
2284*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
2285*437bfbebSnyanmisaka break;
2286*437bfbebSnyanmisaka }
2287*437bfbebSnyanmisaka
2288*437bfbebSnyanmisaka rd_cfg.reg = ®s->reg_st;
2289*437bfbebSnyanmisaka rd_cfg.size = sizeof(regs->reg_st);
2290*437bfbebSnyanmisaka rd_cfg.offset = VEPU511_STATUS_OFFSET;
2291*437bfbebSnyanmisaka
2292*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &rd_cfg);
2293*437bfbebSnyanmisaka if (ret) {
2294*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
2295*437bfbebSnyanmisaka break;
2296*437bfbebSnyanmisaka }
2297*437bfbebSnyanmisaka
2298*437bfbebSnyanmisaka /* send request to hardware */
2299*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
2300*437bfbebSnyanmisaka if (ret) {
2301*437bfbebSnyanmisaka mpp_err_f("send cmd failed %d\n", ret);
2302*437bfbebSnyanmisaka break;
2303*437bfbebSnyanmisaka }
2304*437bfbebSnyanmisaka } while (0);
2305*437bfbebSnyanmisaka
2306*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p\n", hal);
2307*437bfbebSnyanmisaka
2308*437bfbebSnyanmisaka return ret;
2309*437bfbebSnyanmisaka }
2310*437bfbebSnyanmisaka
hal_h264e_vepu511_status_check(HalVepu511RegSet * regs)2311*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu511_status_check(HalVepu511RegSet *regs)
2312*437bfbebSnyanmisaka {
2313*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
2314*437bfbebSnyanmisaka
2315*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.lkt_node_done_sta)
2316*437bfbebSnyanmisaka hal_h264e_dbg_detail("lkt_done finish");
2317*437bfbebSnyanmisaka
2318*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.enc_done_sta)
2319*437bfbebSnyanmisaka hal_h264e_dbg_detail("enc_done finish");
2320*437bfbebSnyanmisaka
2321*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.vslc_done_sta)
2322*437bfbebSnyanmisaka hal_h264e_dbg_detail("enc_slice finsh");
2323*437bfbebSnyanmisaka
2324*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.sclr_done_sta)
2325*437bfbebSnyanmisaka hal_h264e_dbg_detail("safe clear finsh");
2326*437bfbebSnyanmisaka
2327*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.vbsf_oflw_sta) {
2328*437bfbebSnyanmisaka mpp_err_f("bit stream overflow");
2329*437bfbebSnyanmisaka ret = MPP_NOK;
2330*437bfbebSnyanmisaka }
2331*437bfbebSnyanmisaka
2332*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.vbuf_lens_sta) {
2333*437bfbebSnyanmisaka mpp_err_f("bus write full");
2334*437bfbebSnyanmisaka ret = MPP_NOK;
2335*437bfbebSnyanmisaka }
2336*437bfbebSnyanmisaka
2337*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.enc_err_sta) {
2338*437bfbebSnyanmisaka mpp_err_f("bus error");
2339*437bfbebSnyanmisaka ret = MPP_NOK;
2340*437bfbebSnyanmisaka }
2341*437bfbebSnyanmisaka
2342*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.wdg_sta) {
2343*437bfbebSnyanmisaka mpp_err_f("wdg timeout");
2344*437bfbebSnyanmisaka ret = MPP_NOK;
2345*437bfbebSnyanmisaka }
2346*437bfbebSnyanmisaka
2347*437bfbebSnyanmisaka return ret;
2348*437bfbebSnyanmisaka }
2349*437bfbebSnyanmisaka
hal_h264e_vepu511_wait(void * hal,HalEncTask * task)2350*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu511_wait(void *hal, HalEncTask *task)
2351*437bfbebSnyanmisaka {
2352*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
2353*437bfbebSnyanmisaka HalH264eVepu511Ctx *ctx = (HalH264eVepu511Ctx *)hal;
2354*437bfbebSnyanmisaka HalVepu511RegSet *regs = &ctx->regs_sets[task->flags.reg_idx];
2355*437bfbebSnyanmisaka RK_U32 split_out = ctx->cfg->split.split_out;
2356*437bfbebSnyanmisaka MppPacket pkt = task->packet;
2357*437bfbebSnyanmisaka RK_S32 offset = mpp_packet_get_length(pkt);
2358*437bfbebSnyanmisaka H264NaluType type = task->rc_task->frm.is_idr ? H264_NALU_TYPE_IDR : H264_NALU_TYPE_SLICE;
2359*437bfbebSnyanmisaka MppEncH264HwCfg *hw_cfg = &ctx->cfg->h264.hw_cfg;
2360*437bfbebSnyanmisaka RK_S32 i;
2361*437bfbebSnyanmisaka
2362*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", hal);
2363*437bfbebSnyanmisaka
2364*437bfbebSnyanmisaka /* if pass1 mode, it will disable split mode and the split out need to be disable */
2365*437bfbebSnyanmisaka if (task->rc_task->frm.save_pass1)
2366*437bfbebSnyanmisaka split_out = 0;
2367*437bfbebSnyanmisaka
2368*437bfbebSnyanmisaka /* update split_out in hw_cfg */
2369*437bfbebSnyanmisaka hw_cfg->hw_split_out = split_out;
2370*437bfbebSnyanmisaka
2371*437bfbebSnyanmisaka if (split_out) {
2372*437bfbebSnyanmisaka EncOutParam param;
2373*437bfbebSnyanmisaka RK_U32 slice_len;
2374*437bfbebSnyanmisaka RK_U32 slice_last;
2375*437bfbebSnyanmisaka MppDevPollCfg *poll_cfg = (MppDevPollCfg *)((char *)ctx->poll_cfgs +
2376*437bfbebSnyanmisaka task->flags.reg_idx * ctx->poll_cfg_size);
2377*437bfbebSnyanmisaka param.task = task;
2378*437bfbebSnyanmisaka param.base = mpp_packet_get_data(task->packet);
2379*437bfbebSnyanmisaka
2380*437bfbebSnyanmisaka do {
2381*437bfbebSnyanmisaka poll_cfg->poll_type = 0;
2382*437bfbebSnyanmisaka poll_cfg->poll_ret = 0;
2383*437bfbebSnyanmisaka poll_cfg->count_max = ctx->poll_slice_max;
2384*437bfbebSnyanmisaka poll_cfg->count_ret = 0;
2385*437bfbebSnyanmisaka
2386*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, poll_cfg);
2387*437bfbebSnyanmisaka
2388*437bfbebSnyanmisaka for (i = 0; i < poll_cfg->count_ret; i++) {
2389*437bfbebSnyanmisaka slice_last = poll_cfg->slice_info[i].last;
2390*437bfbebSnyanmisaka slice_len = poll_cfg->slice_info[i].length;
2391*437bfbebSnyanmisaka
2392*437bfbebSnyanmisaka mpp_packet_add_segment_info(pkt, type, offset, slice_len);
2393*437bfbebSnyanmisaka offset += slice_len;
2394*437bfbebSnyanmisaka
2395*437bfbebSnyanmisaka if (split_out & MPP_ENC_SPLIT_OUT_LOWDELAY) {
2396*437bfbebSnyanmisaka param.length = slice_len;
2397*437bfbebSnyanmisaka
2398*437bfbebSnyanmisaka if (slice_last)
2399*437bfbebSnyanmisaka ctx->output_cb->cmd = ENC_OUTPUT_FINISH;
2400*437bfbebSnyanmisaka else
2401*437bfbebSnyanmisaka ctx->output_cb->cmd = ENC_OUTPUT_SLICE;
2402*437bfbebSnyanmisaka
2403*437bfbebSnyanmisaka mpp_callback(ctx->output_cb, ¶m);
2404*437bfbebSnyanmisaka }
2405*437bfbebSnyanmisaka }
2406*437bfbebSnyanmisaka } while (!slice_last);
2407*437bfbebSnyanmisaka
2408*437bfbebSnyanmisaka ret = hal_h264e_vepu511_status_check(regs);
2409*437bfbebSnyanmisaka if (!ret)
2410*437bfbebSnyanmisaka task->hw_length += regs->reg_st.bs_lgth_l32;
2411*437bfbebSnyanmisaka } else {
2412*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
2413*437bfbebSnyanmisaka if (ret) {
2414*437bfbebSnyanmisaka mpp_err_f("poll cmd failed %d\n", ret);
2415*437bfbebSnyanmisaka ret = MPP_ERR_VPUHW;
2416*437bfbebSnyanmisaka } else {
2417*437bfbebSnyanmisaka ret = hal_h264e_vepu511_status_check(regs);
2418*437bfbebSnyanmisaka if (!ret)
2419*437bfbebSnyanmisaka task->hw_length += regs->reg_st.bs_lgth_l32;
2420*437bfbebSnyanmisaka }
2421*437bfbebSnyanmisaka
2422*437bfbebSnyanmisaka mpp_packet_add_segment_info(pkt, type, offset, regs->reg_st.bs_lgth_l32);
2423*437bfbebSnyanmisaka }
2424*437bfbebSnyanmisaka
2425*437bfbebSnyanmisaka if (!(split_out & MPP_ENC_SPLIT_OUT_LOWDELAY) && !ret) {
2426*437bfbebSnyanmisaka HalH264eVepuStreamAmend *amend = &ctx->amend_sets[task->flags.reg_idx];
2427*437bfbebSnyanmisaka
2428*437bfbebSnyanmisaka if (amend->enable) {
2429*437bfbebSnyanmisaka amend->old_length = task->hw_length;
2430*437bfbebSnyanmisaka amend->slice->is_multi_slice = (ctx->cfg->split.split_mode > 0);
2431*437bfbebSnyanmisaka h264e_vepu_stream_amend_proc(amend, &ctx->cfg->h264.hw_cfg);
2432*437bfbebSnyanmisaka task->hw_length = amend->new_length;
2433*437bfbebSnyanmisaka } else if (amend->prefix) {
2434*437bfbebSnyanmisaka /* check prefix value */
2435*437bfbebSnyanmisaka amend->old_length = task->hw_length;
2436*437bfbebSnyanmisaka h264e_vepu_stream_amend_sync_ref_idc(amend);
2437*437bfbebSnyanmisaka }
2438*437bfbebSnyanmisaka }
2439*437bfbebSnyanmisaka
2440*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p ret %d\n", hal, ret);
2441*437bfbebSnyanmisaka
2442*437bfbebSnyanmisaka return ret;
2443*437bfbebSnyanmisaka }
2444*437bfbebSnyanmisaka
vepu511_h264e_update_tune_stat(HalH264eVepu511Ctx * ctx,HalEncTask * task)2445*437bfbebSnyanmisaka static void vepu511_h264e_update_tune_stat(HalH264eVepu511Ctx *ctx, HalEncTask *task)
2446*437bfbebSnyanmisaka {
2447*437bfbebSnyanmisaka HalVepu511RegSet *regs = &ctx->regs_sets[task->flags.reg_idx];
2448*437bfbebSnyanmisaka Vepu511Status *reg_st = ®s->reg_st;
2449*437bfbebSnyanmisaka EncRcTaskInfo *rc_info = &task->rc_task->info;
2450*437bfbebSnyanmisaka RK_U32 mb_w = ctx->sps->pic_width_in_mbs;
2451*437bfbebSnyanmisaka RK_U32 mb_h = ctx->sps->pic_height_in_mbs;
2452*437bfbebSnyanmisaka RK_U32 mbs = mb_w * mb_h;
2453*437bfbebSnyanmisaka RK_U32 madi_th_cnt[4], madp_th_cnt[4];
2454*437bfbebSnyanmisaka RK_U32 madi_cnt = 0, madp_cnt = 0;
2455*437bfbebSnyanmisaka RK_U32 md_cnt;
2456*437bfbebSnyanmisaka
2457*437bfbebSnyanmisaka madi_th_cnt[0] = reg_st->st_madi_lt_num0.madi_th_lt_cnt0 +
2458*437bfbebSnyanmisaka reg_st->st_madi_rt_num0.madi_th_rt_cnt0 +
2459*437bfbebSnyanmisaka reg_st->st_madi_lb_num0.madi_th_lb_cnt0 +
2460*437bfbebSnyanmisaka reg_st->st_madi_rb_num0.madi_th_rb_cnt0;
2461*437bfbebSnyanmisaka madi_th_cnt[1] = reg_st->st_madi_lt_num0.madi_th_lt_cnt1 +
2462*437bfbebSnyanmisaka reg_st->st_madi_rt_num0.madi_th_rt_cnt1 +
2463*437bfbebSnyanmisaka reg_st->st_madi_lb_num0.madi_th_lb_cnt1 +
2464*437bfbebSnyanmisaka reg_st->st_madi_rb_num0.madi_th_rb_cnt1;
2465*437bfbebSnyanmisaka madi_th_cnt[2] = reg_st->st_madi_lt_num1.madi_th_lt_cnt2 +
2466*437bfbebSnyanmisaka reg_st->st_madi_rt_num1.madi_th_rt_cnt2 +
2467*437bfbebSnyanmisaka reg_st->st_madi_lb_num1.madi_th_lb_cnt2 +
2468*437bfbebSnyanmisaka reg_st->st_madi_rb_num1.madi_th_rb_cnt2;
2469*437bfbebSnyanmisaka madi_th_cnt[3] = reg_st->st_madi_lt_num1.madi_th_lt_cnt3 +
2470*437bfbebSnyanmisaka reg_st->st_madi_rt_num1.madi_th_rt_cnt3 +
2471*437bfbebSnyanmisaka reg_st->st_madi_lb_num1.madi_th_lb_cnt3 +
2472*437bfbebSnyanmisaka reg_st->st_madi_rb_num1.madi_th_rb_cnt3;
2473*437bfbebSnyanmisaka madp_th_cnt[0] = reg_st->st_madp_lt_num0.madp_th_lt_cnt0 +
2474*437bfbebSnyanmisaka reg_st->st_madp_rt_num0.madp_th_rt_cnt0 +
2475*437bfbebSnyanmisaka reg_st->st_madp_lb_num0.madp_th_lb_cnt0 +
2476*437bfbebSnyanmisaka reg_st->st_madp_rb_num0.madp_th_rb_cnt0;
2477*437bfbebSnyanmisaka madp_th_cnt[1] = reg_st->st_madp_lt_num0.madp_th_lt_cnt1 +
2478*437bfbebSnyanmisaka reg_st->st_madp_rt_num0.madp_th_rt_cnt1 +
2479*437bfbebSnyanmisaka reg_st->st_madp_lb_num0.madp_th_lb_cnt1 +
2480*437bfbebSnyanmisaka reg_st->st_madp_rb_num0.madp_th_rb_cnt1;
2481*437bfbebSnyanmisaka madp_th_cnt[2] = reg_st->st_madp_lt_num1.madp_th_lt_cnt2 +
2482*437bfbebSnyanmisaka reg_st->st_madp_rt_num1.madp_th_rt_cnt2 +
2483*437bfbebSnyanmisaka reg_st->st_madp_lb_num1.madp_th_lb_cnt2 +
2484*437bfbebSnyanmisaka reg_st->st_madp_rb_num1.madp_th_rb_cnt2;
2485*437bfbebSnyanmisaka madp_th_cnt[3] = reg_st->st_madp_lt_num1.madp_th_lt_cnt3 +
2486*437bfbebSnyanmisaka reg_st->st_madp_rt_num1.madp_th_rt_cnt3 +
2487*437bfbebSnyanmisaka reg_st->st_madp_lb_num1.madp_th_lb_cnt3 +
2488*437bfbebSnyanmisaka reg_st->st_madp_rb_num1.madp_th_rb_cnt3;
2489*437bfbebSnyanmisaka
2490*437bfbebSnyanmisaka if (ctx->smart_en)
2491*437bfbebSnyanmisaka md_cnt = (12 * madp_th_cnt[3] + 11 * madp_th_cnt[2] + 8 * madp_th_cnt[1]) >> 2;
2492*437bfbebSnyanmisaka else
2493*437bfbebSnyanmisaka md_cnt = (24 * madp_th_cnt[3] + 22 * madp_th_cnt[2] + 17 * madp_th_cnt[1]) >> 2;
2494*437bfbebSnyanmisaka madi_cnt = (6 * madi_th_cnt[3] + 5 * madi_th_cnt[2] + 4 * madi_th_cnt[1]) >> 2;
2495*437bfbebSnyanmisaka
2496*437bfbebSnyanmisaka /* fill rc info */
2497*437bfbebSnyanmisaka if (md_cnt * 100 > 15 * mbs)
2498*437bfbebSnyanmisaka rc_info->motion_level = 200;
2499*437bfbebSnyanmisaka else if (md_cnt * 100 > 5 * mbs)
2500*437bfbebSnyanmisaka rc_info->motion_level = 100;
2501*437bfbebSnyanmisaka else if (md_cnt * 100 > (mbs >> 2))
2502*437bfbebSnyanmisaka rc_info->motion_level = 1;
2503*437bfbebSnyanmisaka else
2504*437bfbebSnyanmisaka rc_info->motion_level = 0;
2505*437bfbebSnyanmisaka
2506*437bfbebSnyanmisaka if (madi_cnt * 100 > 30 * mbs)
2507*437bfbebSnyanmisaka rc_info->complex_level = 2;
2508*437bfbebSnyanmisaka else if (madi_cnt * 100 > 13 * mbs)
2509*437bfbebSnyanmisaka rc_info->complex_level = 1;
2510*437bfbebSnyanmisaka else
2511*437bfbebSnyanmisaka rc_info->complex_level = 0;
2512*437bfbebSnyanmisaka
2513*437bfbebSnyanmisaka rc_info->madi = madi_th_cnt[0] * regs->reg_rc_roi.madi_st_thd.madi_th0 +
2514*437bfbebSnyanmisaka madi_th_cnt[1] * (regs->reg_rc_roi.madi_st_thd.madi_th0 +
2515*437bfbebSnyanmisaka regs->reg_rc_roi.madi_st_thd.madi_th1) / 2 +
2516*437bfbebSnyanmisaka madi_th_cnt[2] * (regs->reg_rc_roi.madi_st_thd.madi_th1 +
2517*437bfbebSnyanmisaka regs->reg_rc_roi.madi_st_thd.madi_th2) / 2 +
2518*437bfbebSnyanmisaka madi_th_cnt[3] * regs->reg_rc_roi.madi_st_thd.madi_th2;
2519*437bfbebSnyanmisaka
2520*437bfbebSnyanmisaka madi_cnt = madi_th_cnt[0] + madi_th_cnt[1] + madi_th_cnt[2] + madi_th_cnt[3];
2521*437bfbebSnyanmisaka if (madi_cnt)
2522*437bfbebSnyanmisaka rc_info->madi = rc_info->madi / madi_cnt;
2523*437bfbebSnyanmisaka
2524*437bfbebSnyanmisaka rc_info->madp = madp_th_cnt[0] * regs->reg_rc_roi.madp_st_thd0.madp_th0 +
2525*437bfbebSnyanmisaka madp_th_cnt[1] * (regs->reg_rc_roi.madp_st_thd0.madp_th0 +
2526*437bfbebSnyanmisaka regs->reg_rc_roi.madp_st_thd0.madp_th1) / 2 +
2527*437bfbebSnyanmisaka madp_th_cnt[2] * (regs->reg_rc_roi.madp_st_thd0.madp_th1 +
2528*437bfbebSnyanmisaka regs->reg_rc_roi.madp_st_thd1.madp_th2) / 2 +
2529*437bfbebSnyanmisaka madp_th_cnt[3] * regs->reg_rc_roi.madp_st_thd1.madp_th2;
2530*437bfbebSnyanmisaka
2531*437bfbebSnyanmisaka madp_cnt = madp_th_cnt[0] + madp_th_cnt[1] + madp_th_cnt[2] + madp_th_cnt[3];
2532*437bfbebSnyanmisaka
2533*437bfbebSnyanmisaka if (madp_cnt)
2534*437bfbebSnyanmisaka rc_info->madp = rc_info->madp / madp_cnt;
2535*437bfbebSnyanmisaka
2536*437bfbebSnyanmisaka hal_h264e_dbg_rc("complex_level %d motion_level %d\n",
2537*437bfbebSnyanmisaka rc_info->complex_level, rc_info->motion_level);
2538*437bfbebSnyanmisaka }
2539*437bfbebSnyanmisaka
hal_h264e_vepu511_ret_task(void * hal,HalEncTask * task)2540*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu511_ret_task(void * hal, HalEncTask * task)
2541*437bfbebSnyanmisaka {
2542*437bfbebSnyanmisaka HalH264eVepu511Ctx *ctx = (HalH264eVepu511Ctx *)hal;
2543*437bfbebSnyanmisaka HalVepu511RegSet *regs = &ctx->regs_sets[task->flags.reg_idx];
2544*437bfbebSnyanmisaka EncRcTaskInfo *rc_info = &task->rc_task->info;
2545*437bfbebSnyanmisaka Vepu511H264Fbk *fb = &ctx->feedback;
2546*437bfbebSnyanmisaka Vepu511Status *reg_st = ®s->reg_st;
2547*437bfbebSnyanmisaka RK_U32 mb_w = ctx->sps->pic_width_in_mbs;
2548*437bfbebSnyanmisaka RK_U32 mb_h = ctx->sps->pic_height_in_mbs;
2549*437bfbebSnyanmisaka RK_U32 mbs = mb_w * mb_h;
2550*437bfbebSnyanmisaka
2551*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", hal);
2552*437bfbebSnyanmisaka
2553*437bfbebSnyanmisaka fb->st_mb_num = mbs;
2554*437bfbebSnyanmisaka fb->st_smear_cnt[0] = reg_st->st_smear_cnt0.rdo_smear_cnt0 * 4;
2555*437bfbebSnyanmisaka fb->st_smear_cnt[1] = reg_st->st_smear_cnt0.rdo_smear_cnt1 * 4;
2556*437bfbebSnyanmisaka fb->st_smear_cnt[2] = reg_st->st_smear_cnt1.rdo_smear_cnt2 * 4;
2557*437bfbebSnyanmisaka fb->st_smear_cnt[3] = reg_st->st_smear_cnt1.rdo_smear_cnt3 * 4;
2558*437bfbebSnyanmisaka fb->st_smear_cnt[4] = fb->st_smear_cnt[0] + fb->st_smear_cnt[1] +
2559*437bfbebSnyanmisaka fb->st_smear_cnt[2] + fb->st_smear_cnt[3];
2560*437bfbebSnyanmisaka fb->frame_type = ctx->slice->slice_type;
2561*437bfbebSnyanmisaka
2562*437bfbebSnyanmisaka // update total hardware length
2563*437bfbebSnyanmisaka task->length += task->hw_length;
2564*437bfbebSnyanmisaka
2565*437bfbebSnyanmisaka // setup bit length for rate control
2566*437bfbebSnyanmisaka rc_info->bit_real = task->hw_length * 8;
2567*437bfbebSnyanmisaka rc_info->quality_real = regs->reg_st.qp_sum / mbs;
2568*437bfbebSnyanmisaka rc_info->iblk4_prop = (regs->reg_st.st_pnum_i4.pnum_i4 +
2569*437bfbebSnyanmisaka regs->reg_st.st_pnum_i8.pnum_i8 +
2570*437bfbebSnyanmisaka regs->reg_st.st_pnum_i16.pnum_i16) * 256 / mbs;
2571*437bfbebSnyanmisaka
2572*437bfbebSnyanmisaka rc_info->sse = ((RK_S64)regs->reg_st.sse_h32 << 16) +
2573*437bfbebSnyanmisaka (regs->reg_st.st_sse_bsl.sse_l16 & 0xffff);
2574*437bfbebSnyanmisaka rc_info->lvl16_inter_num = regs->reg_st.st_pnum_p16.pnum_p16;
2575*437bfbebSnyanmisaka rc_info->lvl8_inter_num = regs->reg_st.st_pnum_p8.pnum_p8;
2576*437bfbebSnyanmisaka rc_info->lvl16_intra_num = regs->reg_st.st_pnum_i16.pnum_i16;
2577*437bfbebSnyanmisaka rc_info->lvl8_intra_num = regs->reg_st.st_pnum_i8.pnum_i8;
2578*437bfbebSnyanmisaka rc_info->lvl4_intra_num = regs->reg_st.st_pnum_i4.pnum_i4;
2579*437bfbebSnyanmisaka
2580*437bfbebSnyanmisaka ctx->hal_rc_cfg.bit_real = rc_info->bit_real;
2581*437bfbebSnyanmisaka ctx->hal_rc_cfg.quality_real = rc_info->quality_real;
2582*437bfbebSnyanmisaka ctx->hal_rc_cfg.iblk4_prop = rc_info->iblk4_prop;
2583*437bfbebSnyanmisaka
2584*437bfbebSnyanmisaka task->hal_ret.data = &ctx->hal_rc_cfg;
2585*437bfbebSnyanmisaka task->hal_ret.number = 1;
2586*437bfbebSnyanmisaka
2587*437bfbebSnyanmisaka mpp_dev_multi_offset_reset(ctx->offsets);
2588*437bfbebSnyanmisaka
2589*437bfbebSnyanmisaka if (ctx->dpb) {
2590*437bfbebSnyanmisaka h264e_dpb_hal_end(ctx->dpb, task->flags.curr_idx);
2591*437bfbebSnyanmisaka h264e_dpb_hal_end(ctx->dpb, task->flags.refr_idx);
2592*437bfbebSnyanmisaka }
2593*437bfbebSnyanmisaka
2594*437bfbebSnyanmisaka vepu511_h264e_update_tune_stat(ctx, task);
2595*437bfbebSnyanmisaka
2596*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p\n", hal);
2597*437bfbebSnyanmisaka
2598*437bfbebSnyanmisaka return MPP_OK;
2599*437bfbebSnyanmisaka }
2600*437bfbebSnyanmisaka
2601*437bfbebSnyanmisaka const MppEncHalApi hal_h264e_vepu511 = {
2602*437bfbebSnyanmisaka .name = "hal_h264e_vepu511",
2603*437bfbebSnyanmisaka .coding = MPP_VIDEO_CodingAVC,
2604*437bfbebSnyanmisaka .ctx_size = sizeof(HalH264eVepu511Ctx),
2605*437bfbebSnyanmisaka .flag = 0,
2606*437bfbebSnyanmisaka .init = hal_h264e_vepu511_init,
2607*437bfbebSnyanmisaka .deinit = hal_h264e_vepu511_deinit,
2608*437bfbebSnyanmisaka .prepare = hal_h264e_vepu511_prepare,
2609*437bfbebSnyanmisaka .get_task = hal_h264e_vepu511_get_task,
2610*437bfbebSnyanmisaka .gen_regs = hal_h264e_vepu511_gen_regs,
2611*437bfbebSnyanmisaka .start = hal_h264e_vepu511_start,
2612*437bfbebSnyanmisaka .wait = hal_h264e_vepu511_wait,
2613*437bfbebSnyanmisaka .part_start = NULL,
2614*437bfbebSnyanmisaka .part_wait = NULL,
2615*437bfbebSnyanmisaka .ret_task = hal_h264e_vepu511_ret_task,
2616*437bfbebSnyanmisaka };
2617