1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka * Copyright 2022 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka *
4*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka * You may obtain a copy of the License at
7*437bfbebSnyanmisaka *
8*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka *
10*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka * limitations under the License.
15*437bfbebSnyanmisaka */
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisaka #define MODULE_TAG "hal_h265e_v540c"
18*437bfbebSnyanmisaka
19*437bfbebSnyanmisaka #include <linux/string.h>
20*437bfbebSnyanmisaka
21*437bfbebSnyanmisaka #include <string.h>
22*437bfbebSnyanmisaka #include <math.h>
23*437bfbebSnyanmisaka #include <limits.h>
24*437bfbebSnyanmisaka
25*437bfbebSnyanmisaka #include "mpp_env.h"
26*437bfbebSnyanmisaka #include "mpp_mem.h"
27*437bfbebSnyanmisaka #include "mpp_soc.h"
28*437bfbebSnyanmisaka #include "mpp_common.h"
29*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
30*437bfbebSnyanmisaka
31*437bfbebSnyanmisaka #include "hal_h265e_debug.h"
32*437bfbebSnyanmisaka #include "h265e_syntax_new.h"
33*437bfbebSnyanmisaka #include "hal_h265e_stream_amend.h"
34*437bfbebSnyanmisaka #include "hal_bufs.h"
35*437bfbebSnyanmisaka #include "rkv_enc_def.h"
36*437bfbebSnyanmisaka #include "vepu5xx_common.h"
37*437bfbebSnyanmisaka #include "vepu540c_common.h"
38*437bfbebSnyanmisaka #include "hal_h265e_vepu540c.h"
39*437bfbebSnyanmisaka #include "hal_h265e_vepu540c_reg.h"
40*437bfbebSnyanmisaka
41*437bfbebSnyanmisaka #define MAX_TITLE_NUM 2
42*437bfbebSnyanmisaka
43*437bfbebSnyanmisaka #define hal_h265e_err(fmt, ...) \
44*437bfbebSnyanmisaka do {\
45*437bfbebSnyanmisaka mpp_err_f(fmt, ## __VA_ARGS__);\
46*437bfbebSnyanmisaka } while (0)
47*437bfbebSnyanmisaka
48*437bfbebSnyanmisaka typedef struct vepu540c_h265_fbk_t {
49*437bfbebSnyanmisaka vepu540c_hw_status hw_status;
50*437bfbebSnyanmisaka RK_U32 qp_sum;
51*437bfbebSnyanmisaka RK_U32 out_strm_size;
52*437bfbebSnyanmisaka RK_U32 out_hw_strm_size;
53*437bfbebSnyanmisaka RK_S64 sse_sum;
54*437bfbebSnyanmisaka RK_U32 st_lvl64_inter_num;
55*437bfbebSnyanmisaka RK_U32 st_lvl32_inter_num;
56*437bfbebSnyanmisaka RK_U32 st_lvl16_inter_num;
57*437bfbebSnyanmisaka RK_U32 st_lvl8_inter_num;
58*437bfbebSnyanmisaka RK_U32 st_lvl32_intra_num;
59*437bfbebSnyanmisaka RK_U32 st_lvl16_intra_num;
60*437bfbebSnyanmisaka RK_U32 st_lvl8_intra_num;
61*437bfbebSnyanmisaka RK_U32 st_lvl4_intra_num;
62*437bfbebSnyanmisaka RK_U32 st_cu_num_qp[52];
63*437bfbebSnyanmisaka RK_U32 st_madp;
64*437bfbebSnyanmisaka RK_U32 st_madi;
65*437bfbebSnyanmisaka RK_U32 st_mb_num;
66*437bfbebSnyanmisaka RK_U32 st_ctu_num;
67*437bfbebSnyanmisaka } vepu540c_h265_fbk;
68*437bfbebSnyanmisaka
69*437bfbebSnyanmisaka typedef struct H265eV540cHalContext_t {
70*437bfbebSnyanmisaka MppEncHalApi api;
71*437bfbebSnyanmisaka MppDev dev;
72*437bfbebSnyanmisaka void *regs;
73*437bfbebSnyanmisaka void *reg_out[MAX_TITLE_NUM];
74*437bfbebSnyanmisaka
75*437bfbebSnyanmisaka vepu540c_h265_fbk feedback;
76*437bfbebSnyanmisaka void *dump_files;
77*437bfbebSnyanmisaka RK_U32 frame_cnt_gen_ready;
78*437bfbebSnyanmisaka
79*437bfbebSnyanmisaka RK_S32 frame_type;
80*437bfbebSnyanmisaka RK_S32 last_frame_type;
81*437bfbebSnyanmisaka
82*437bfbebSnyanmisaka /* @frame_cnt starts from ZERO */
83*437bfbebSnyanmisaka RK_U32 frame_cnt;
84*437bfbebSnyanmisaka void *roi_data;
85*437bfbebSnyanmisaka MppEncCfgSet *cfg;
86*437bfbebSnyanmisaka
87*437bfbebSnyanmisaka RK_U32 enc_mode;
88*437bfbebSnyanmisaka RK_U32 frame_size;
89*437bfbebSnyanmisaka RK_S32 max_buf_cnt;
90*437bfbebSnyanmisaka RK_S32 hdr_status;
91*437bfbebSnyanmisaka void *input_fmt;
92*437bfbebSnyanmisaka RK_U8 *src_buf;
93*437bfbebSnyanmisaka RK_U8 *dst_buf;
94*437bfbebSnyanmisaka RK_S32 buf_size;
95*437bfbebSnyanmisaka RK_U32 frame_num;
96*437bfbebSnyanmisaka HalBufs dpb_bufs;
97*437bfbebSnyanmisaka RK_S32 fbc_header_len;
98*437bfbebSnyanmisaka RK_U32 title_num;
99*437bfbebSnyanmisaka
100*437bfbebSnyanmisaka /* external line buffer over 3K */
101*437bfbebSnyanmisaka MppBufferGroup ext_line_buf_grp;
102*437bfbebSnyanmisaka RK_S32 ext_line_buf_size;
103*437bfbebSnyanmisaka MppBuffer ext_line_buf;
104*437bfbebSnyanmisaka } H265eV540cHalContext;
105*437bfbebSnyanmisaka
106*437bfbebSnyanmisaka #define TILE_BUF_SIZE MPP_ALIGN(128 * 1024, 256)
107*437bfbebSnyanmisaka
108*437bfbebSnyanmisaka static RK_U32 aq_thd_default[16] = {
109*437bfbebSnyanmisaka 0, 0, 0, 0,
110*437bfbebSnyanmisaka 3, 3, 5, 5,
111*437bfbebSnyanmisaka 8, 8, 8, 15,
112*437bfbebSnyanmisaka 15, 20, 25, 25
113*437bfbebSnyanmisaka };
114*437bfbebSnyanmisaka
115*437bfbebSnyanmisaka static RK_S32 aq_qp_dealt_default[16] = {
116*437bfbebSnyanmisaka -8, -7, -6, -5,
117*437bfbebSnyanmisaka -4, -3, -2, -1,
118*437bfbebSnyanmisaka 0, 1, 2, 3,
119*437bfbebSnyanmisaka 4, 5, 6, 8,
120*437bfbebSnyanmisaka };
121*437bfbebSnyanmisaka
vepu540c_h265_setup_hal_bufs(H265eV540cHalContext * ctx)122*437bfbebSnyanmisaka static MPP_RET vepu540c_h265_setup_hal_bufs(H265eV540cHalContext *ctx)
123*437bfbebSnyanmisaka {
124*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
125*437bfbebSnyanmisaka VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
126*437bfbebSnyanmisaka RK_U32 frame_size;
127*437bfbebSnyanmisaka VepuFmt input_fmt = VEPU5xx_FMT_YUV420P;
128*437bfbebSnyanmisaka RK_S32 mb_wd64, mb_h64;
129*437bfbebSnyanmisaka MppEncRefCfg ref_cfg = ctx->cfg->ref_cfg;
130*437bfbebSnyanmisaka MppEncPrepCfg *prep = &ctx->cfg->prep;
131*437bfbebSnyanmisaka RK_S32 old_max_cnt = ctx->max_buf_cnt;
132*437bfbebSnyanmisaka RK_S32 new_max_cnt = 2;
133*437bfbebSnyanmisaka RK_S32 alignment = 32;
134*437bfbebSnyanmisaka RK_S32 aligned_w = MPP_ALIGN(prep->width, alignment);
135*437bfbebSnyanmisaka
136*437bfbebSnyanmisaka hal_h265e_enter();
137*437bfbebSnyanmisaka
138*437bfbebSnyanmisaka mb_wd64 = (prep->width + 63) / 64;
139*437bfbebSnyanmisaka mb_h64 = (prep->height + 63) / 64;
140*437bfbebSnyanmisaka
141*437bfbebSnyanmisaka frame_size = MPP_ALIGN(prep->width, 16) * MPP_ALIGN(prep->height, 16);
142*437bfbebSnyanmisaka vepu5xx_set_fmt(fmt, ctx->cfg->prep.format);
143*437bfbebSnyanmisaka input_fmt = (VepuFmt)fmt->format;
144*437bfbebSnyanmisaka switch (input_fmt) {
145*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV400:
146*437bfbebSnyanmisaka break;
147*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420P:
148*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420SP: {
149*437bfbebSnyanmisaka frame_size = frame_size * 3 / 2;
150*437bfbebSnyanmisaka } break;
151*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422P:
152*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422SP:
153*437bfbebSnyanmisaka case VEPU5xx_FMT_YUYV422:
154*437bfbebSnyanmisaka case VEPU5xx_FMT_UYVY422:
155*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR565: {
156*437bfbebSnyanmisaka frame_size *= 2;
157*437bfbebSnyanmisaka } break;
158*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR888: {
159*437bfbebSnyanmisaka frame_size *= 3;
160*437bfbebSnyanmisaka } break;
161*437bfbebSnyanmisaka case VEPU5xx_FMT_BGRA8888: {
162*437bfbebSnyanmisaka frame_size *= 4;
163*437bfbebSnyanmisaka } break;
164*437bfbebSnyanmisaka default: {
165*437bfbebSnyanmisaka hal_h265e_err("invalid src color space: %d\n", input_fmt);
166*437bfbebSnyanmisaka return MPP_NOK;
167*437bfbebSnyanmisaka }
168*437bfbebSnyanmisaka }
169*437bfbebSnyanmisaka
170*437bfbebSnyanmisaka if (ref_cfg) {
171*437bfbebSnyanmisaka MppEncCpbInfo *info = mpp_enc_ref_cfg_get_cpb_info(ref_cfg);
172*437bfbebSnyanmisaka new_max_cnt = MPP_MAX(new_max_cnt, info->dpb_size + 1);
173*437bfbebSnyanmisaka }
174*437bfbebSnyanmisaka
175*437bfbebSnyanmisaka if (aligned_w > (3 * SZ_1K)) {
176*437bfbebSnyanmisaka RK_S32 ext_line_buf_size = (aligned_w / 32 - 91) * 26 * 16;
177*437bfbebSnyanmisaka
178*437bfbebSnyanmisaka if (NULL == ctx->ext_line_buf_grp)
179*437bfbebSnyanmisaka mpp_buffer_group_get_internal(&ctx->ext_line_buf_grp, MPP_BUFFER_TYPE_ION);
180*437bfbebSnyanmisaka else if (ext_line_buf_size != ctx->ext_line_buf_size) {
181*437bfbebSnyanmisaka mpp_buffer_put(ctx->ext_line_buf);
182*437bfbebSnyanmisaka ctx->ext_line_buf = NULL;
183*437bfbebSnyanmisaka mpp_buffer_group_clear(ctx->ext_line_buf_grp);
184*437bfbebSnyanmisaka }
185*437bfbebSnyanmisaka
186*437bfbebSnyanmisaka mpp_assert(ctx->ext_line_buf_grp);
187*437bfbebSnyanmisaka
188*437bfbebSnyanmisaka if (NULL == ctx->ext_line_buf)
189*437bfbebSnyanmisaka mpp_buffer_get(ctx->ext_line_buf_grp, &ctx->ext_line_buf, ext_line_buf_size);
190*437bfbebSnyanmisaka
191*437bfbebSnyanmisaka ctx->ext_line_buf_size = ext_line_buf_size;
192*437bfbebSnyanmisaka } else {
193*437bfbebSnyanmisaka if (ctx->ext_line_buf) {
194*437bfbebSnyanmisaka mpp_buffer_put(ctx->ext_line_buf);
195*437bfbebSnyanmisaka ctx->ext_line_buf = NULL;
196*437bfbebSnyanmisaka }
197*437bfbebSnyanmisaka
198*437bfbebSnyanmisaka if (ctx->ext_line_buf_grp) {
199*437bfbebSnyanmisaka mpp_buffer_group_clear(ctx->ext_line_buf_grp);
200*437bfbebSnyanmisaka mpp_buffer_group_put(ctx->ext_line_buf_grp);
201*437bfbebSnyanmisaka ctx->ext_line_buf_grp = NULL;
202*437bfbebSnyanmisaka }
203*437bfbebSnyanmisaka ctx->ext_line_buf_size = 0;
204*437bfbebSnyanmisaka }
205*437bfbebSnyanmisaka
206*437bfbebSnyanmisaka if (frame_size > ctx->frame_size || new_max_cnt > old_max_cnt) {
207*437bfbebSnyanmisaka size_t size[3] = {0};
208*437bfbebSnyanmisaka
209*437bfbebSnyanmisaka hal_bufs_deinit(ctx->dpb_bufs);
210*437bfbebSnyanmisaka hal_bufs_init(&ctx->dpb_bufs);
211*437bfbebSnyanmisaka
212*437bfbebSnyanmisaka ctx->fbc_header_len = MPP_ALIGN(((mb_wd64 * mb_h64) << 6), SZ_8K);
213*437bfbebSnyanmisaka size[0] = ctx->fbc_header_len + ((mb_wd64 * mb_h64) << 12) * 3 / 2; //fbc_h + fbc_b
214*437bfbebSnyanmisaka size[1] = (mb_wd64 * mb_h64 << 8);
215*437bfbebSnyanmisaka size[2] = MPP_ALIGN(mb_wd64 * mb_h64 * 16 * 4, 256) * 16;
216*437bfbebSnyanmisaka new_max_cnt = MPP_MAX(new_max_cnt, old_max_cnt);
217*437bfbebSnyanmisaka
218*437bfbebSnyanmisaka hal_h265e_dbg_detail("frame size %d -> %d max count %d -> %d\n",
219*437bfbebSnyanmisaka ctx->frame_size, frame_size, old_max_cnt, new_max_cnt);
220*437bfbebSnyanmisaka
221*437bfbebSnyanmisaka hal_bufs_setup(ctx->dpb_bufs, new_max_cnt, 3, size);
222*437bfbebSnyanmisaka
223*437bfbebSnyanmisaka ctx->frame_size = frame_size;
224*437bfbebSnyanmisaka ctx->max_buf_cnt = new_max_cnt;
225*437bfbebSnyanmisaka }
226*437bfbebSnyanmisaka hal_h265e_leave();
227*437bfbebSnyanmisaka return ret;
228*437bfbebSnyanmisaka }
229*437bfbebSnyanmisaka
vepu540c_h265_rdo_cfg(vepu540c_rdo_cfg * reg)230*437bfbebSnyanmisaka static void vepu540c_h265_rdo_cfg (vepu540c_rdo_cfg *reg)
231*437bfbebSnyanmisaka {
232*437bfbebSnyanmisaka rdo_skip_par *p_rdo_skip = NULL;
233*437bfbebSnyanmisaka rdo_noskip_par *p_rdo_noskip = NULL;
234*437bfbebSnyanmisaka pre_cst_par *p_pre_cst = NULL;
235*437bfbebSnyanmisaka
236*437bfbebSnyanmisaka reg->rdo_segment_cfg.rdo_segment_multi = 28;
237*437bfbebSnyanmisaka reg->rdo_segment_cfg.rdo_segment_en = 1;
238*437bfbebSnyanmisaka reg->rdo_smear_cfg_comb.rdo_smear_en = 0;
239*437bfbebSnyanmisaka reg->rdo_smear_cfg_comb.rdo_smear_lvl16_multi = 9;
240*437bfbebSnyanmisaka reg->rdo_segment_cfg.rdo_smear_lvl8_multi = 8;
241*437bfbebSnyanmisaka reg->rdo_segment_cfg.rdo_smear_lvl4_multi = 8;
242*437bfbebSnyanmisaka reg->rdo_smear_cfg_comb.rdo_smear_dlt_qp = 0 ;
243*437bfbebSnyanmisaka reg->rdo_smear_cfg_comb.rdo_smear_order_state = 0;
244*437bfbebSnyanmisaka reg->rdo_smear_cfg_comb.stated_mode = 0;
245*437bfbebSnyanmisaka reg->rdo_smear_cfg_comb.online_en = 0;
246*437bfbebSnyanmisaka reg->rdo_smear_cfg_comb.smear_stride = 0;
247*437bfbebSnyanmisaka reg->rdo_smear_madp_thd0_comb.rdo_smear_madp_cur_thd0 = 0 ;
248*437bfbebSnyanmisaka reg->rdo_smear_madp_thd0_comb.rdo_smear_madp_cur_thd1 = 24;
249*437bfbebSnyanmisaka reg->rdo_smear_madp_thd1_comb.rdo_smear_madp_cur_thd2 = 48;
250*437bfbebSnyanmisaka reg->rdo_smear_madp_thd1_comb.rdo_smear_madp_cur_thd3 = 64;
251*437bfbebSnyanmisaka reg->rdo_smear_madp_thd2_comb.rdo_smear_madp_around_thd0 = 16;
252*437bfbebSnyanmisaka reg->rdo_smear_madp_thd2_comb.rdo_smear_madp_around_thd1 = 32;
253*437bfbebSnyanmisaka reg->rdo_smear_madp_thd3_comb.rdo_smear_madp_around_thd2 = 48;
254*437bfbebSnyanmisaka reg->rdo_smear_madp_thd3_comb.rdo_smear_madp_around_thd3 = 96;
255*437bfbebSnyanmisaka reg->rdo_smear_madp_thd4_comb.rdo_smear_madp_around_thd4 = 48;
256*437bfbebSnyanmisaka reg->rdo_smear_madp_thd4_comb.rdo_smear_madp_around_thd5 = 24;
257*437bfbebSnyanmisaka reg->rdo_smear_madp_thd5_comb.rdo_smear_madp_ref_thd0 = 96;
258*437bfbebSnyanmisaka reg->rdo_smear_madp_thd5_comb.rdo_smear_madp_ref_thd1 = 48;
259*437bfbebSnyanmisaka reg->rdo_smear_cnt_thd0_comb.rdo_smear_cnt_cur_thd0 = 1 ;
260*437bfbebSnyanmisaka reg->rdo_smear_cnt_thd0_comb.rdo_smear_cnt_cur_thd1 = 3;
261*437bfbebSnyanmisaka reg->rdo_smear_cnt_thd0_comb.rdo_smear_cnt_cur_thd2 = 1 ;
262*437bfbebSnyanmisaka reg->rdo_smear_cnt_thd0_comb.rdo_smear_cnt_cur_thd3 = 3;
263*437bfbebSnyanmisaka reg->rdo_smear_cnt_thd1_comb.rdo_smear_cnt_around_thd0 = 1 ;
264*437bfbebSnyanmisaka reg->rdo_smear_cnt_thd1_comb.rdo_smear_cnt_around_thd1 = 4 ;
265*437bfbebSnyanmisaka reg->rdo_smear_cnt_thd1_comb.rdo_smear_cnt_around_thd2 = 1 ;
266*437bfbebSnyanmisaka reg->rdo_smear_cnt_thd1_comb.rdo_smear_cnt_around_thd3 = 4 ;
267*437bfbebSnyanmisaka reg->rdo_smear_cnt_thd2_comb.rdo_smear_cnt_around_thd4 = 0;
268*437bfbebSnyanmisaka reg->rdo_smear_cnt_thd2_comb.rdo_smear_cnt_around_thd5 = 3;
269*437bfbebSnyanmisaka reg->rdo_smear_cnt_thd2_comb.rdo_smear_cnt_around_thd6 = 0;
270*437bfbebSnyanmisaka reg->rdo_smear_cnt_thd2_comb.rdo_smear_cnt_around_thd7 = 3;
271*437bfbebSnyanmisaka reg->rdo_smear_cnt_thd3_comb.rdo_smear_cnt_ref_thd0 = 1;
272*437bfbebSnyanmisaka reg->rdo_smear_cnt_thd3_comb.rdo_smear_cnt_ref_thd1 = 3;
273*437bfbebSnyanmisaka reg->rdo_smear_resi_thd0_comb.rdo_smear_resi_small_cur_th0 = 6;
274*437bfbebSnyanmisaka reg->rdo_smear_resi_thd0_comb.rdo_smear_resi_big_cur_th0 = 9;
275*437bfbebSnyanmisaka reg->rdo_smear_resi_thd0_comb.rdo_smear_resi_small_cur_th1 = 6;
276*437bfbebSnyanmisaka reg->rdo_smear_resi_thd0_comb.rdo_smear_resi_big_cur_th1 = 9;
277*437bfbebSnyanmisaka reg->rdo_smear_resi_thd1_comb.rdo_smear_resi_small_around_th0 = 6;
278*437bfbebSnyanmisaka reg->rdo_smear_resi_thd1_comb.rdo_smear_resi_big_around_th0 = 11;
279*437bfbebSnyanmisaka reg->rdo_smear_resi_thd1_comb.rdo_smear_resi_small_around_th1 = 6;
280*437bfbebSnyanmisaka reg->rdo_smear_resi_thd1_comb.rdo_smear_resi_big_around_th1 = 8;
281*437bfbebSnyanmisaka reg->rdo_smear_resi_thd2_comb.rdo_smear_resi_small_around_th2 = 9;
282*437bfbebSnyanmisaka reg->rdo_smear_resi_thd2_comb.rdo_smear_resi_big_around_th2 = 20;
283*437bfbebSnyanmisaka reg->rdo_smear_resi_thd2_comb.rdo_smear_resi_small_around_th3 = 6;
284*437bfbebSnyanmisaka reg->rdo_smear_resi_thd2_comb.rdo_smear_resi_big_around_th3 = 20;
285*437bfbebSnyanmisaka reg->rdo_smear_resi_thd3_comb.rdo_smear_resi_small_ref_th0 = 7;
286*437bfbebSnyanmisaka reg->rdo_smear_resi_thd3_comb.rdo_smear_resi_big_ref_th0 = 16;
287*437bfbebSnyanmisaka reg->rdo_smear_st_thd0_comb.rdo_smear_resi_th0 = 9;
288*437bfbebSnyanmisaka reg->rdo_smear_st_thd0_comb.rdo_smear_resi_th1 = 6;
289*437bfbebSnyanmisaka reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th0 = 1;
290*437bfbebSnyanmisaka reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th1 = 5;
291*437bfbebSnyanmisaka reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th2 = 1;
292*437bfbebSnyanmisaka reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th3 = 3;
293*437bfbebSnyanmisaka reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th4 = 1;
294*437bfbebSnyanmisaka reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th5 = 2;
295*437bfbebSnyanmisaka
296*437bfbebSnyanmisaka p_rdo_skip = ®->rdo_b32_skip;
297*437bfbebSnyanmisaka p_rdo_skip->atf_thd0.madp_thd0 = 5 ;
298*437bfbebSnyanmisaka p_rdo_skip->atf_thd0.madp_thd1 = 10 ;
299*437bfbebSnyanmisaka p_rdo_skip->atf_thd1.madp_thd2 = 15 ;
300*437bfbebSnyanmisaka p_rdo_skip->atf_thd1.madp_thd3 = 72;
301*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt0 = 20;
302*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt1 = 16;
303*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt2 = 16;
304*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt3 = 16;
305*437bfbebSnyanmisaka p_rdo_skip->atf_wgt1.wgt4 = 16;
306*437bfbebSnyanmisaka
307*437bfbebSnyanmisaka p_rdo_noskip = ®->rdo_b32_inter;
308*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd0 = 20;
309*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd1 = 40;
310*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd1.madp_thd2 = 72;
311*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt0 = 16;
312*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt1 = 16;
313*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt2 = 16;
314*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt3 = 16;
315*437bfbebSnyanmisaka
316*437bfbebSnyanmisaka p_rdo_noskip = ®->rdo_b32_intra;
317*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd0 = 20;
318*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd1 = 40;
319*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd1.madp_thd2 = 72;
320*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt0 = 27;
321*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt1 = 25;
322*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt2 = 20;
323*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt3 = 19;
324*437bfbebSnyanmisaka
325*437bfbebSnyanmisaka p_rdo_skip = ®->rdo_b16_skip;
326*437bfbebSnyanmisaka p_rdo_skip->atf_thd0.madp_thd0 = 1;
327*437bfbebSnyanmisaka p_rdo_skip->atf_thd0.madp_thd1 = 10 ;
328*437bfbebSnyanmisaka p_rdo_skip->atf_thd1.madp_thd2 = 15 ;
329*437bfbebSnyanmisaka p_rdo_skip->atf_thd1.madp_thd3 = 25 ;
330*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt0 = 20 ;
331*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt1 = 16;
332*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt2 = 16;
333*437bfbebSnyanmisaka p_rdo_skip->atf_wgt0.wgt3 = 16;
334*437bfbebSnyanmisaka p_rdo_skip->atf_wgt1.wgt4 = 16;
335*437bfbebSnyanmisaka
336*437bfbebSnyanmisaka p_rdo_noskip = ®->rdo_b16_inter;
337*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd0 = 20;
338*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd1 = 40;
339*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd1.madp_thd2 = 72;
340*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt0 = 16;
341*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt1 = 16;
342*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt2 = 16;
343*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt3 = 16;
344*437bfbebSnyanmisaka
345*437bfbebSnyanmisaka p_rdo_noskip = ®->rdo_b16_intra;
346*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd0 = 20;
347*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd0.madp_thd1 = 40;
348*437bfbebSnyanmisaka p_rdo_noskip->ratf_thd1.madp_thd2 = 72;
349*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt0 = 27;
350*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt1 = 25;
351*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt2 = 20;
352*437bfbebSnyanmisaka p_rdo_noskip->atf_wgt.wgt3 = 16;
353*437bfbebSnyanmisaka
354*437bfbebSnyanmisaka reg->rdo_b32_intra_atf_cnt_thd.thd0 = 1;
355*437bfbebSnyanmisaka reg->rdo_b32_intra_atf_cnt_thd.thd1 = 4;
356*437bfbebSnyanmisaka reg->rdo_b32_intra_atf_cnt_thd.thd2 = 1;
357*437bfbebSnyanmisaka reg->rdo_b32_intra_atf_cnt_thd.thd3 = 4;
358*437bfbebSnyanmisaka
359*437bfbebSnyanmisaka reg->rdo_b16_intra_atf_cnt_thd_comb.thd0 = 1;
360*437bfbebSnyanmisaka reg->rdo_b16_intra_atf_cnt_thd_comb.thd1 = 4;
361*437bfbebSnyanmisaka reg->rdo_b16_intra_atf_cnt_thd_comb.thd2 = 1;
362*437bfbebSnyanmisaka reg->rdo_b16_intra_atf_cnt_thd_comb.thd3 = 4;
363*437bfbebSnyanmisaka reg->rdo_atf_resi_thd_comb.big_th0 = 16;
364*437bfbebSnyanmisaka reg->rdo_atf_resi_thd_comb.big_th1 = 16;
365*437bfbebSnyanmisaka reg->rdo_atf_resi_thd_comb.small_th0 = 8;
366*437bfbebSnyanmisaka reg->rdo_atf_resi_thd_comb.small_th1 = 8;
367*437bfbebSnyanmisaka
368*437bfbebSnyanmisaka p_pre_cst = ®->preintra32_cst;
369*437bfbebSnyanmisaka p_pre_cst->cst_madi_thd0.madi_thd0 = 5;
370*437bfbebSnyanmisaka p_pre_cst->cst_madi_thd0.madi_thd1 = 3;
371*437bfbebSnyanmisaka p_pre_cst->cst_madi_thd0.madi_thd2 = 3;
372*437bfbebSnyanmisaka p_pre_cst->cst_madi_thd0.madi_thd3 = 6;
373*437bfbebSnyanmisaka p_pre_cst->cst_madi_thd1.madi_thd4 = 7;
374*437bfbebSnyanmisaka p_pre_cst->cst_madi_thd1.madi_thd5 = 10;
375*437bfbebSnyanmisaka p_pre_cst->cst_wgt0.wgt0 = 20;
376*437bfbebSnyanmisaka p_pre_cst->cst_wgt0.wgt1 = 18;
377*437bfbebSnyanmisaka p_pre_cst->cst_wgt0.wgt2 = 19;
378*437bfbebSnyanmisaka p_pre_cst->cst_wgt0.wgt3 = 18;
379*437bfbebSnyanmisaka p_pre_cst->cst_wgt1.wgt4 = 6;
380*437bfbebSnyanmisaka p_pre_cst->cst_wgt1.wgt5 = 9;
381*437bfbebSnyanmisaka p_pre_cst->cst_wgt1.wgt6 = 14;
382*437bfbebSnyanmisaka p_pre_cst->cst_wgt1.wgt7 = 18;
383*437bfbebSnyanmisaka p_pre_cst->cst_wgt2.wgt8 = 17;
384*437bfbebSnyanmisaka p_pre_cst->cst_wgt2.wgt9 = 17;
385*437bfbebSnyanmisaka p_pre_cst->cst_wgt2.mode_th = 5;
386*437bfbebSnyanmisaka
387*437bfbebSnyanmisaka p_pre_cst = ®->preintra16_cst;
388*437bfbebSnyanmisaka p_pre_cst->cst_madi_thd0.madi_thd0 = 5;
389*437bfbebSnyanmisaka p_pre_cst->cst_madi_thd0.madi_thd1 = 3;
390*437bfbebSnyanmisaka p_pre_cst->cst_madi_thd0.madi_thd2 = 3;
391*437bfbebSnyanmisaka p_pre_cst->cst_madi_thd0.madi_thd3 = 6;
392*437bfbebSnyanmisaka p_pre_cst->cst_madi_thd1.madi_thd4 = 5;
393*437bfbebSnyanmisaka p_pre_cst->cst_madi_thd1.madi_thd5 = 7;
394*437bfbebSnyanmisaka p_pre_cst->cst_wgt0.wgt0 = 20;
395*437bfbebSnyanmisaka p_pre_cst->cst_wgt0.wgt1 = 18;
396*437bfbebSnyanmisaka p_pre_cst->cst_wgt0.wgt2 = 19;
397*437bfbebSnyanmisaka p_pre_cst->cst_wgt0.wgt3 = 18;
398*437bfbebSnyanmisaka p_pre_cst->cst_wgt1.wgt4 = 6;
399*437bfbebSnyanmisaka p_pre_cst->cst_wgt1.wgt5 = 9;
400*437bfbebSnyanmisaka p_pre_cst->cst_wgt1.wgt6 = 14;
401*437bfbebSnyanmisaka p_pre_cst->cst_wgt1.wgt7 = 18;
402*437bfbebSnyanmisaka p_pre_cst->cst_wgt2.wgt8 = 17;
403*437bfbebSnyanmisaka p_pre_cst->cst_wgt2.wgt9 = 17;
404*437bfbebSnyanmisaka p_pre_cst->cst_wgt2.mode_th = 5;
405*437bfbebSnyanmisaka
406*437bfbebSnyanmisaka reg->preintra_sqi_cfg.pre_intra_qp_thd = 28;
407*437bfbebSnyanmisaka reg->preintra_sqi_cfg.pre_intra4_lambda_mv_bit = 3;
408*437bfbebSnyanmisaka reg->preintra_sqi_cfg.pre_intra8_lambda_mv_bit = 4;
409*437bfbebSnyanmisaka reg->preintra_sqi_cfg.pre_intra16_lambda_mv_bit = 4;
410*437bfbebSnyanmisaka reg->preintra_sqi_cfg.pre_intra32_lambda_mv_bit = 5;
411*437bfbebSnyanmisaka reg->rdo_atr_i_cu32_madi_cfg0.i_cu32_madi_thd0 = 3;
412*437bfbebSnyanmisaka reg->rdo_atr_i_cu32_madi_cfg0.i_cu32_madi_thd1 = 35;
413*437bfbebSnyanmisaka reg->rdo_atr_i_cu32_madi_cfg0.i_cu32_madi_thd2 = 25;
414*437bfbebSnyanmisaka reg->rdo_atr_i_cu32_madi_cfg1.i_cu32_madi_cnt_thd3 = 0;
415*437bfbebSnyanmisaka reg->rdo_atr_i_cu32_madi_cfg1.i_cu32_madi_thd4 = 20;
416*437bfbebSnyanmisaka reg->rdo_atr_i_cu32_madi_cfg1.i_cu32_madi_cost_multi = 24;
417*437bfbebSnyanmisaka reg->rdo_atr_i_cu16_madi_cfg0.i_cu16_madi_thd0 = 4;
418*437bfbebSnyanmisaka reg->rdo_atr_i_cu16_madi_cfg0.i_cu16_madi_thd1 = 6;
419*437bfbebSnyanmisaka reg->rdo_atr_i_cu16_madi_cfg0.i_cu16_madi_cost_multi = 24;
420*437bfbebSnyanmisaka
421*437bfbebSnyanmisaka }
422*437bfbebSnyanmisaka
vepu540c_h265_global_cfg_set(H265eV540cHalContext * ctx,H265eV540cRegSet * regs)423*437bfbebSnyanmisaka static void vepu540c_h265_global_cfg_set(H265eV540cHalContext *ctx, H265eV540cRegSet *regs)
424*437bfbebSnyanmisaka {
425*437bfbebSnyanmisaka MppEncHwCfg *hw = &ctx->cfg->hw;
426*437bfbebSnyanmisaka RK_U32 i;
427*437bfbebSnyanmisaka hevc_vepu540c_rc_roi *rc_regs = ®s->reg_rc_roi;
428*437bfbebSnyanmisaka hevc_vepu540c_wgt *reg_wgt = ®s->reg_wgt;
429*437bfbebSnyanmisaka vepu540c_rdo_cfg *reg_rdo = ®s->reg_rdo;
430*437bfbebSnyanmisaka vepu540c_h265_rdo_cfg(reg_rdo);
431*437bfbebSnyanmisaka
432*437bfbebSnyanmisaka if (ctx->frame_type == INTRA_FRAME) {
433*437bfbebSnyanmisaka for (i = 0; i < MPP_ARRAY_ELEMS(aq_thd_default); i++) {
434*437bfbebSnyanmisaka rc_regs->aq_tthd[i] = hw->aq_thrd_i[i];
435*437bfbebSnyanmisaka rc_regs->aq_step[i] = hw->aq_step_i[i] & 0x3f;
436*437bfbebSnyanmisaka }
437*437bfbebSnyanmisaka reg_wgt->iprd_lamb_satd_ofst.lambda_satd_offset = 11;
438*437bfbebSnyanmisaka memcpy(®_wgt->rdo_wgta_qp_grpa_0_51[0], lamd_moda_qp, sizeof(lamd_moda_qp));
439*437bfbebSnyanmisaka } else {
440*437bfbebSnyanmisaka for (i = 0; i < MPP_ARRAY_ELEMS(aq_thd_default); i++) {
441*437bfbebSnyanmisaka rc_regs->aq_tthd[i] = hw->aq_thrd_p[i];
442*437bfbebSnyanmisaka rc_regs->aq_step[i] = hw->aq_step_p[i] & 0x3f;
443*437bfbebSnyanmisaka }
444*437bfbebSnyanmisaka reg_wgt->iprd_lamb_satd_ofst.lambda_satd_offset = 11;
445*437bfbebSnyanmisaka memcpy(®_wgt->rdo_wgta_qp_grpa_0_51[0], lamd_modb_qp, sizeof(lamd_modb_qp));
446*437bfbebSnyanmisaka }
447*437bfbebSnyanmisaka reg_wgt->reg1484_qnt_bias_comb.qnt_bias_i = 171;
448*437bfbebSnyanmisaka reg_wgt->reg1484_qnt_bias_comb.qnt_bias_p = 85;
449*437bfbebSnyanmisaka if (hw->qbias_en) {
450*437bfbebSnyanmisaka reg_wgt->reg1484_qnt_bias_comb.qnt_bias_i = hw->qbias_i;
451*437bfbebSnyanmisaka reg_wgt->reg1484_qnt_bias_comb.qnt_bias_p = hw->qbias_p;
452*437bfbebSnyanmisaka }
453*437bfbebSnyanmisaka /* CIME */
454*437bfbebSnyanmisaka {
455*437bfbebSnyanmisaka /* 0x1760 */
456*437bfbebSnyanmisaka regs->reg_wgt.me_sqi_cfg.cime_pmv_num = 1;
457*437bfbebSnyanmisaka regs->reg_wgt.me_sqi_cfg.cime_fuse = 1;
458*437bfbebSnyanmisaka regs->reg_wgt.me_sqi_cfg.itp_mode = 0;
459*437bfbebSnyanmisaka regs->reg_wgt.me_sqi_cfg.move_lambda = 2;
460*437bfbebSnyanmisaka regs->reg_wgt.me_sqi_cfg.rime_lvl_mrg = 0;
461*437bfbebSnyanmisaka regs->reg_wgt.me_sqi_cfg.rime_prelvl_en = 3;
462*437bfbebSnyanmisaka regs->reg_wgt.me_sqi_cfg.rime_prersu_en = 3;
463*437bfbebSnyanmisaka
464*437bfbebSnyanmisaka /* 0x1764 */
465*437bfbebSnyanmisaka regs->reg_wgt.cime_mvd_th.cime_mvd_th0 = 8;
466*437bfbebSnyanmisaka regs->reg_wgt.cime_mvd_th.cime_mvd_th1 = 20;
467*437bfbebSnyanmisaka regs->reg_wgt.cime_mvd_th.cime_mvd_th2 = 32;
468*437bfbebSnyanmisaka
469*437bfbebSnyanmisaka /* 0x1768 */
470*437bfbebSnyanmisaka regs->reg_wgt.cime_madp_th.cime_madp_th = 16;
471*437bfbebSnyanmisaka
472*437bfbebSnyanmisaka /* 0x176c */
473*437bfbebSnyanmisaka regs->reg_wgt.cime_multi.cime_multi0 = 8;
474*437bfbebSnyanmisaka regs->reg_wgt.cime_multi.cime_multi1 = 12;
475*437bfbebSnyanmisaka regs->reg_wgt.cime_multi.cime_multi2 = 16;
476*437bfbebSnyanmisaka regs->reg_wgt.cime_multi.cime_multi3 = 20;
477*437bfbebSnyanmisaka }
478*437bfbebSnyanmisaka
479*437bfbebSnyanmisaka /* RIME && FME */
480*437bfbebSnyanmisaka {
481*437bfbebSnyanmisaka /* 0x1770 */
482*437bfbebSnyanmisaka regs->reg_wgt.rime_mvd_th.rime_mvd_th0 = 1;
483*437bfbebSnyanmisaka regs->reg_wgt.rime_mvd_th.rime_mvd_th1 = 2;
484*437bfbebSnyanmisaka regs->reg_wgt.rime_mvd_th.fme_madp_th = 0;
485*437bfbebSnyanmisaka
486*437bfbebSnyanmisaka /* 0x1774 */
487*437bfbebSnyanmisaka regs->reg_wgt.rime_madp_th.rime_madp_th0 = 8;
488*437bfbebSnyanmisaka regs->reg_wgt.rime_madp_th.rime_madp_th1 = 16;
489*437bfbebSnyanmisaka
490*437bfbebSnyanmisaka /* 0x1778 */
491*437bfbebSnyanmisaka regs->reg_wgt.rime_multi.rime_multi0 = 4;
492*437bfbebSnyanmisaka regs->reg_wgt.rime_multi.rime_multi1 = 8;
493*437bfbebSnyanmisaka regs->reg_wgt.rime_multi.rime_multi2 = 12;
494*437bfbebSnyanmisaka
495*437bfbebSnyanmisaka /* 0x177C */
496*437bfbebSnyanmisaka regs->reg_wgt.cmv_st_th.cmv_th0 = 64;
497*437bfbebSnyanmisaka regs->reg_wgt.cmv_st_th.cmv_th1 = 96;
498*437bfbebSnyanmisaka regs->reg_wgt.cmv_st_th.cmv_th2 = 128;
499*437bfbebSnyanmisaka }
500*437bfbebSnyanmisaka }
501*437bfbebSnyanmisaka
hal_h265e_v540c_init(void * hal,MppEncHalCfg * cfg)502*437bfbebSnyanmisaka MPP_RET hal_h265e_v540c_init(void *hal, MppEncHalCfg *cfg)
503*437bfbebSnyanmisaka {
504*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
505*437bfbebSnyanmisaka H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
506*437bfbebSnyanmisaka RK_U32 i = 0;
507*437bfbebSnyanmisaka
508*437bfbebSnyanmisaka mpp_env_get_u32("hal_h265e_debug", &hal_h265e_debug, 0);
509*437bfbebSnyanmisaka
510*437bfbebSnyanmisaka hal_h265e_enter();
511*437bfbebSnyanmisaka
512*437bfbebSnyanmisaka for ( i = 0; i < MAX_TITLE_NUM; i++) {
513*437bfbebSnyanmisaka ctx->reg_out[i] = mpp_calloc(H265eV540cStatusElem, 1);
514*437bfbebSnyanmisaka }
515*437bfbebSnyanmisaka
516*437bfbebSnyanmisaka ctx->regs = mpp_calloc(H265eV540cRegSet, 1);
517*437bfbebSnyanmisaka ctx->input_fmt = mpp_calloc(VepuFmtCfg, 1);
518*437bfbebSnyanmisaka ctx->cfg = cfg->cfg;
519*437bfbebSnyanmisaka hal_bufs_init(&ctx->dpb_bufs);
520*437bfbebSnyanmisaka
521*437bfbebSnyanmisaka ctx->frame_cnt = 0;
522*437bfbebSnyanmisaka ctx->frame_cnt_gen_ready = 0;
523*437bfbebSnyanmisaka ctx->enc_mode = 1;
524*437bfbebSnyanmisaka cfg->type = VPU_CLIENT_RKVENC;
525*437bfbebSnyanmisaka ret = mpp_dev_init(&cfg->dev, cfg->type);
526*437bfbebSnyanmisaka if (ret) {
527*437bfbebSnyanmisaka mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
528*437bfbebSnyanmisaka return ret;
529*437bfbebSnyanmisaka }
530*437bfbebSnyanmisaka
531*437bfbebSnyanmisaka ctx->dev = cfg->dev;
532*437bfbebSnyanmisaka ctx->frame_type = INTRA_FRAME;
533*437bfbebSnyanmisaka
534*437bfbebSnyanmisaka { /* setup default hardware config */
535*437bfbebSnyanmisaka MppEncHwCfg *hw = &cfg->cfg->hw;
536*437bfbebSnyanmisaka
537*437bfbebSnyanmisaka hw->qp_delta_row_i = 2;
538*437bfbebSnyanmisaka hw->qp_delta_row = 2;
539*437bfbebSnyanmisaka hw->qbias_i = 171;
540*437bfbebSnyanmisaka hw->qbias_p = 85;
541*437bfbebSnyanmisaka hw->qbias_en = 0;
542*437bfbebSnyanmisaka
543*437bfbebSnyanmisaka memcpy(hw->aq_thrd_i, aq_thd_default, sizeof(hw->aq_thrd_i));
544*437bfbebSnyanmisaka memcpy(hw->aq_thrd_p, aq_thd_default, sizeof(hw->aq_thrd_p));
545*437bfbebSnyanmisaka memcpy(hw->aq_step_i, aq_qp_dealt_default, sizeof(hw->aq_step_i));
546*437bfbebSnyanmisaka memcpy(hw->aq_step_p, aq_qp_dealt_default, sizeof(hw->aq_step_p));
547*437bfbebSnyanmisaka }
548*437bfbebSnyanmisaka
549*437bfbebSnyanmisaka hal_h265e_leave();
550*437bfbebSnyanmisaka return ret;
551*437bfbebSnyanmisaka }
552*437bfbebSnyanmisaka
hal_h265e_v540c_deinit(void * hal)553*437bfbebSnyanmisaka MPP_RET hal_h265e_v540c_deinit(void *hal)
554*437bfbebSnyanmisaka {
555*437bfbebSnyanmisaka H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
556*437bfbebSnyanmisaka RK_U32 i = 0;
557*437bfbebSnyanmisaka
558*437bfbebSnyanmisaka hal_h265e_enter();
559*437bfbebSnyanmisaka MPP_FREE(ctx->regs);
560*437bfbebSnyanmisaka
561*437bfbebSnyanmisaka for ( i = 0; i < MAX_TITLE_NUM; i++) {
562*437bfbebSnyanmisaka MPP_FREE(ctx->reg_out[i]);
563*437bfbebSnyanmisaka }
564*437bfbebSnyanmisaka
565*437bfbebSnyanmisaka MPP_FREE(ctx->input_fmt);
566*437bfbebSnyanmisaka hal_bufs_deinit(ctx->dpb_bufs);
567*437bfbebSnyanmisaka
568*437bfbebSnyanmisaka if (ctx->ext_line_buf) {
569*437bfbebSnyanmisaka mpp_buffer_put(ctx->ext_line_buf);
570*437bfbebSnyanmisaka ctx->ext_line_buf = NULL;
571*437bfbebSnyanmisaka }
572*437bfbebSnyanmisaka
573*437bfbebSnyanmisaka if (ctx->ext_line_buf_grp) {
574*437bfbebSnyanmisaka mpp_buffer_group_put(ctx->ext_line_buf_grp);
575*437bfbebSnyanmisaka ctx->ext_line_buf_grp = NULL;
576*437bfbebSnyanmisaka }
577*437bfbebSnyanmisaka
578*437bfbebSnyanmisaka if (ctx->dev) {
579*437bfbebSnyanmisaka mpp_dev_deinit(ctx->dev);
580*437bfbebSnyanmisaka ctx->dev = NULL;
581*437bfbebSnyanmisaka }
582*437bfbebSnyanmisaka hal_h265e_leave();
583*437bfbebSnyanmisaka return MPP_OK;
584*437bfbebSnyanmisaka }
585*437bfbebSnyanmisaka
hal_h265e_vepu540c_prepare(void * hal)586*437bfbebSnyanmisaka static MPP_RET hal_h265e_vepu540c_prepare(void *hal)
587*437bfbebSnyanmisaka {
588*437bfbebSnyanmisaka H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
589*437bfbebSnyanmisaka MppEncPrepCfg *prep = &ctx->cfg->prep;
590*437bfbebSnyanmisaka
591*437bfbebSnyanmisaka hal_h265e_dbg_func("enter %p\n", hal);
592*437bfbebSnyanmisaka
593*437bfbebSnyanmisaka if (prep->change_res) {
594*437bfbebSnyanmisaka RK_S32 i;
595*437bfbebSnyanmisaka
596*437bfbebSnyanmisaka // pre-alloc required buffers to reduce first frame delay
597*437bfbebSnyanmisaka vepu540c_h265_setup_hal_bufs(ctx);
598*437bfbebSnyanmisaka for (i = 0; i < ctx->max_buf_cnt; i++)
599*437bfbebSnyanmisaka hal_bufs_get_buf(ctx->dpb_bufs, i);
600*437bfbebSnyanmisaka
601*437bfbebSnyanmisaka prep->change_res = 0;
602*437bfbebSnyanmisaka }
603*437bfbebSnyanmisaka
604*437bfbebSnyanmisaka hal_h265e_dbg_func("leave %p\n", hal);
605*437bfbebSnyanmisaka
606*437bfbebSnyanmisaka return MPP_OK;
607*437bfbebSnyanmisaka }
608*437bfbebSnyanmisaka
609*437bfbebSnyanmisaka static MPP_RET
vepu540c_h265_set_patch_info(MppDev dev,H265eSyntax_new * syn,VepuFmt input_fmt,HalEncTask * task)610*437bfbebSnyanmisaka vepu540c_h265_set_patch_info(MppDev dev, H265eSyntax_new *syn, VepuFmt input_fmt, HalEncTask *task)
611*437bfbebSnyanmisaka {
612*437bfbebSnyanmisaka RK_U32 hor_stride = syn->pp.hor_stride;
613*437bfbebSnyanmisaka RK_U32 ver_stride = syn->pp.ver_stride ? syn->pp.ver_stride : syn->pp.pic_height;
614*437bfbebSnyanmisaka RK_U32 frame_size = hor_stride * ver_stride;
615*437bfbebSnyanmisaka RK_U32 u_offset = 0, v_offset = 0;
616*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
617*437bfbebSnyanmisaka
618*437bfbebSnyanmisaka
619*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_FBC(mpp_frame_get_fmt(task->frame))) {
620*437bfbebSnyanmisaka u_offset = mpp_frame_get_fbc_offset(task->frame);
621*437bfbebSnyanmisaka v_offset = 0;
622*437bfbebSnyanmisaka mpp_log("fbc case u_offset = %d", u_offset);
623*437bfbebSnyanmisaka } else {
624*437bfbebSnyanmisaka switch (input_fmt) {
625*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420P: {
626*437bfbebSnyanmisaka u_offset = frame_size;
627*437bfbebSnyanmisaka v_offset = frame_size * 5 / 4;
628*437bfbebSnyanmisaka } break;
629*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420SP:
630*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422SP: {
631*437bfbebSnyanmisaka u_offset = frame_size;
632*437bfbebSnyanmisaka v_offset = frame_size;
633*437bfbebSnyanmisaka } break;
634*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422P: {
635*437bfbebSnyanmisaka u_offset = frame_size;
636*437bfbebSnyanmisaka v_offset = frame_size * 3 / 2;
637*437bfbebSnyanmisaka } break;
638*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV400:
639*437bfbebSnyanmisaka case VEPU5xx_FMT_YUYV422:
640*437bfbebSnyanmisaka case VEPU5xx_FMT_UYVY422: {
641*437bfbebSnyanmisaka u_offset = 0;
642*437bfbebSnyanmisaka v_offset = 0;
643*437bfbebSnyanmisaka } break;
644*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR565:
645*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR888:
646*437bfbebSnyanmisaka case VEPU5xx_FMT_BGRA8888: {
647*437bfbebSnyanmisaka u_offset = 0;
648*437bfbebSnyanmisaka v_offset = 0;
649*437bfbebSnyanmisaka } break;
650*437bfbebSnyanmisaka default: {
651*437bfbebSnyanmisaka hal_h265e_err("unknown color space: %d\n", input_fmt);
652*437bfbebSnyanmisaka u_offset = frame_size;
653*437bfbebSnyanmisaka v_offset = frame_size * 5 / 4;
654*437bfbebSnyanmisaka }
655*437bfbebSnyanmisaka }
656*437bfbebSnyanmisaka }
657*437bfbebSnyanmisaka
658*437bfbebSnyanmisaka /* input cb addr */
659*437bfbebSnyanmisaka if (u_offset) {
660*437bfbebSnyanmisaka ret = mpp_dev_set_reg_offset(dev, 161, u_offset);
661*437bfbebSnyanmisaka if (ret)
662*437bfbebSnyanmisaka mpp_err_f("set input cb addr offset failed %d\n", ret);
663*437bfbebSnyanmisaka }
664*437bfbebSnyanmisaka
665*437bfbebSnyanmisaka /* input cr addr */
666*437bfbebSnyanmisaka if (v_offset) {
667*437bfbebSnyanmisaka ret = mpp_dev_set_reg_offset(dev, 162, v_offset);
668*437bfbebSnyanmisaka if (ret)
669*437bfbebSnyanmisaka mpp_err_f("set input cr addr offset failed %d\n", ret);
670*437bfbebSnyanmisaka }
671*437bfbebSnyanmisaka
672*437bfbebSnyanmisaka return ret;
673*437bfbebSnyanmisaka }
674*437bfbebSnyanmisaka
675*437bfbebSnyanmisaka
676*437bfbebSnyanmisaka #if 0
677*437bfbebSnyanmisaka static MPP_RET vepu540c_h265_set_roi_regs(H265eV540cHalContext *ctx, hevc_vepu540c_base *regs)
678*437bfbebSnyanmisaka {
679*437bfbebSnyanmisaka /* memset register on start so do not clear registers again here */
680*437bfbebSnyanmisaka if (ctx->roi_data) {
681*437bfbebSnyanmisaka /* roi setup */
682*437bfbebSnyanmisaka MppEncROICfg2 *cfg = ( MppEncROICfg2 *)ctx->roi_data;
683*437bfbebSnyanmisaka
684*437bfbebSnyanmisaka regs->reg0192_enc_pic.roi_en = 1;
685*437bfbebSnyanmisaka regs->reg0178_roi_addr = mpp_dev_get_iova_address(ctx->dev, cfg->base_cfg_buf, 0);
686*437bfbebSnyanmisaka if (cfg->roi_qp_en) {
687*437bfbebSnyanmisaka regs->reg0179_roi_qp_addr = mpp_dev_get_iova_address(ctx->dev, cfg->qp_cfg_buf, 0);
688*437bfbebSnyanmisaka regs->reg0228_roi_en.roi_qp_en = 1;
689*437bfbebSnyanmisaka }
690*437bfbebSnyanmisaka
691*437bfbebSnyanmisaka if (cfg->roi_amv_en) {
692*437bfbebSnyanmisaka regs->reg0180_roi_amv_addr = mpp_dev_get_iova_address(ctx->dev, cfg->amv_cfg_buf, 0);
693*437bfbebSnyanmisaka regs->reg0228_roi_en.roi_amv_en = 1;
694*437bfbebSnyanmisaka }
695*437bfbebSnyanmisaka
696*437bfbebSnyanmisaka if (cfg->roi_mv_en) {
697*437bfbebSnyanmisaka regs->reg0181_roi_mv_addr = mpp_dev_get_iova_address(ctx->dev, cfg->mv_cfg_buf, 0);
698*437bfbebSnyanmisaka regs->reg0228_roi_en.roi_mv_en = 1;
699*437bfbebSnyanmisaka }
700*437bfbebSnyanmisaka }
701*437bfbebSnyanmisaka
702*437bfbebSnyanmisaka return MPP_OK;
703*437bfbebSnyanmisaka }
704*437bfbebSnyanmisaka #endif
705*437bfbebSnyanmisaka
vepu540c_h265_set_rc_regs(H265eV540cHalContext * ctx,H265eV540cRegSet * regs,HalEncTask * task)706*437bfbebSnyanmisaka static MPP_RET vepu540c_h265_set_rc_regs(H265eV540cHalContext *ctx, H265eV540cRegSet *regs, HalEncTask *task)
707*437bfbebSnyanmisaka {
708*437bfbebSnyanmisaka H265eSyntax_new *syn = (H265eSyntax_new *)task->syntax.data;
709*437bfbebSnyanmisaka EncRcTaskInfo *rc_cfg = &task->rc_task->info;
710*437bfbebSnyanmisaka hevc_vepu540c_base *reg_base = ®s->reg_base;
711*437bfbebSnyanmisaka hevc_vepu540c_rc_roi *reg_rc = ®s->reg_rc_roi;
712*437bfbebSnyanmisaka MppEncCfgSet *cfg = ctx->cfg;
713*437bfbebSnyanmisaka MppEncRcCfg *rc = &cfg->rc;
714*437bfbebSnyanmisaka MppEncHwCfg *hw = &cfg->hw;
715*437bfbebSnyanmisaka MppEncH265Cfg *h265 = &cfg->h265;
716*437bfbebSnyanmisaka RK_S32 mb_wd32 = (syn->pp.pic_width + 31) / 32;
717*437bfbebSnyanmisaka RK_S32 mb_h32 = (syn->pp.pic_height + 31) / 32;
718*437bfbebSnyanmisaka
719*437bfbebSnyanmisaka RK_U32 ctu_target_bits_mul_16 = (rc_cfg->bit_target << 4) / (mb_wd32 * mb_h32);
720*437bfbebSnyanmisaka RK_U32 ctu_target_bits;
721*437bfbebSnyanmisaka RK_S32 negative_bits_thd, positive_bits_thd;
722*437bfbebSnyanmisaka
723*437bfbebSnyanmisaka if (rc->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
724*437bfbebSnyanmisaka reg_base->reg0192_enc_pic.pic_qp = rc_cfg->quality_target;
725*437bfbebSnyanmisaka reg_base->reg0240_synt_sli1.sli_qp = rc_cfg->quality_target;
726*437bfbebSnyanmisaka
727*437bfbebSnyanmisaka reg_base->reg213_rc_qp.rc_max_qp = rc_cfg->quality_target;
728*437bfbebSnyanmisaka reg_base->reg213_rc_qp.rc_min_qp = rc_cfg->quality_target;
729*437bfbebSnyanmisaka } else {
730*437bfbebSnyanmisaka if (ctu_target_bits_mul_16 >= 0x100000) {
731*437bfbebSnyanmisaka ctu_target_bits_mul_16 = 0x50000;
732*437bfbebSnyanmisaka }
733*437bfbebSnyanmisaka ctu_target_bits = (ctu_target_bits_mul_16 * mb_wd32) >> 4;
734*437bfbebSnyanmisaka negative_bits_thd = 0 - 5 * ctu_target_bits / 16;
735*437bfbebSnyanmisaka positive_bits_thd = 5 * ctu_target_bits / 16;
736*437bfbebSnyanmisaka
737*437bfbebSnyanmisaka reg_base->reg0192_enc_pic.pic_qp = rc_cfg->quality_target;
738*437bfbebSnyanmisaka reg_base->reg0240_synt_sli1.sli_qp = rc_cfg->quality_target;
739*437bfbebSnyanmisaka reg_base->reg212_rc_cfg.rc_en = 1;
740*437bfbebSnyanmisaka reg_base->reg212_rc_cfg.aq_en = 1;
741*437bfbebSnyanmisaka reg_base->reg212_rc_cfg.aq_mode = 0;
742*437bfbebSnyanmisaka reg_base->reg212_rc_cfg.rc_ctu_num = mb_wd32;
743*437bfbebSnyanmisaka reg_base->reg213_rc_qp.rc_qp_range = (ctx->frame_type == INTRA_FRAME) ?
744*437bfbebSnyanmisaka hw->qp_delta_row_i : hw->qp_delta_row;
745*437bfbebSnyanmisaka reg_base->reg213_rc_qp.rc_max_qp = rc_cfg->quality_max;
746*437bfbebSnyanmisaka reg_base->reg213_rc_qp.rc_min_qp = rc_cfg->quality_min;
747*437bfbebSnyanmisaka reg_base->reg214_rc_tgt.ctu_ebit = ctu_target_bits_mul_16;
748*437bfbebSnyanmisaka
749*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[0] = 4 * negative_bits_thd;
750*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[1] = negative_bits_thd;
751*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[2] = positive_bits_thd;
752*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[3] = 4 * positive_bits_thd;
753*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[4] = 0x7FFFFFFF;
754*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[5] = 0x7FFFFFFF;
755*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[6] = 0x7FFFFFFF;
756*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[7] = 0x7FFFFFFF;
757*437bfbebSnyanmisaka reg_rc->rc_dthd_0_8[8] = 0x7FFFFFFF;
758*437bfbebSnyanmisaka
759*437bfbebSnyanmisaka reg_rc->rc_adj0.qp_adj0 = -2;
760*437bfbebSnyanmisaka reg_rc->rc_adj0.qp_adj1 = -1;
761*437bfbebSnyanmisaka reg_rc->rc_adj0.qp_adj2 = 0;
762*437bfbebSnyanmisaka reg_rc->rc_adj0.qp_adj3 = 1;
763*437bfbebSnyanmisaka reg_rc->rc_adj0.qp_adj4 = 2;
764*437bfbebSnyanmisaka reg_rc->rc_adj1.qp_adj5 = 0;
765*437bfbebSnyanmisaka reg_rc->rc_adj1.qp_adj6 = 0;
766*437bfbebSnyanmisaka reg_rc->rc_adj1.qp_adj7 = 0;
767*437bfbebSnyanmisaka reg_rc->rc_adj1.qp_adj8 = 0;
768*437bfbebSnyanmisaka }
769*437bfbebSnyanmisaka
770*437bfbebSnyanmisaka reg_rc->roi_qthd0.qpmin_area0 = h265->qpmin_map[0] > 0 ? h265->qpmin_map[0] : rc_cfg->quality_min;
771*437bfbebSnyanmisaka reg_rc->roi_qthd0.qpmax_area0 = h265->qpmax_map[0] > 0 ? h265->qpmax_map[0] : rc_cfg->quality_max;
772*437bfbebSnyanmisaka reg_rc->roi_qthd0.qpmin_area1 = h265->qpmin_map[1] > 0 ? h265->qpmin_map[1] : rc_cfg->quality_min;
773*437bfbebSnyanmisaka reg_rc->roi_qthd0.qpmax_area1 = h265->qpmax_map[1] > 0 ? h265->qpmax_map[1] : rc_cfg->quality_max;
774*437bfbebSnyanmisaka reg_rc->roi_qthd0.qpmin_area2 = h265->qpmin_map[2] > 0 ? h265->qpmin_map[2] : rc_cfg->quality_min;
775*437bfbebSnyanmisaka reg_rc->roi_qthd1.qpmax_area2 = h265->qpmax_map[2] > 0 ? h265->qpmax_map[2] : rc_cfg->quality_max;
776*437bfbebSnyanmisaka reg_rc->roi_qthd1.qpmin_area3 = h265->qpmin_map[3] > 0 ? h265->qpmin_map[3] : rc_cfg->quality_min;
777*437bfbebSnyanmisaka reg_rc->roi_qthd1.qpmax_area3 = h265->qpmax_map[3] > 0 ? h265->qpmax_map[3] : rc_cfg->quality_max;
778*437bfbebSnyanmisaka reg_rc->roi_qthd1.qpmin_area4 = h265->qpmin_map[4] > 0 ? h265->qpmin_map[4] : rc_cfg->quality_min;
779*437bfbebSnyanmisaka reg_rc->roi_qthd1.qpmax_area4 = h265->qpmax_map[4] > 0 ? h265->qpmax_map[4] : rc_cfg->quality_max;
780*437bfbebSnyanmisaka reg_rc->roi_qthd2.qpmin_area5 = h265->qpmin_map[5] > 0 ? h265->qpmin_map[5] : rc_cfg->quality_min;
781*437bfbebSnyanmisaka reg_rc->roi_qthd2.qpmax_area5 = h265->qpmax_map[5] > 0 ? h265->qpmax_map[5] : rc_cfg->quality_max;
782*437bfbebSnyanmisaka reg_rc->roi_qthd2.qpmin_area6 = h265->qpmin_map[6] > 0 ? h265->qpmin_map[6] : rc_cfg->quality_min;
783*437bfbebSnyanmisaka reg_rc->roi_qthd2.qpmax_area6 = h265->qpmax_map[6] > 0 ? h265->qpmax_map[6] : rc_cfg->quality_max;
784*437bfbebSnyanmisaka reg_rc->roi_qthd2.qpmin_area7 = h265->qpmin_map[7] > 0 ? h265->qpmin_map[7] : rc_cfg->quality_min;
785*437bfbebSnyanmisaka reg_rc->roi_qthd3.qpmax_area7 = h265->qpmax_map[7] > 0 ? h265->qpmax_map[7] : rc_cfg->quality_max;
786*437bfbebSnyanmisaka reg_rc->roi_qthd3.qpmap_mode = h265->qpmap_mode;
787*437bfbebSnyanmisaka
788*437bfbebSnyanmisaka return MPP_OK;
789*437bfbebSnyanmisaka }
790*437bfbebSnyanmisaka
vepu540c_h265_set_pp_regs(H265eV540cRegSet * regs,VepuFmtCfg * fmt,MppEncPrepCfg * prep_cfg)791*437bfbebSnyanmisaka static MPP_RET vepu540c_h265_set_pp_regs(H265eV540cRegSet *regs, VepuFmtCfg *fmt, MppEncPrepCfg *prep_cfg)
792*437bfbebSnyanmisaka {
793*437bfbebSnyanmisaka hevc_vepu540c_control_cfg *reg_ctl = ®s->reg_ctl;
794*437bfbebSnyanmisaka hevc_vepu540c_base *reg_base = ®s->reg_base;
795*437bfbebSnyanmisaka RK_S32 stridey = 0;
796*437bfbebSnyanmisaka RK_S32 stridec = 0;
797*437bfbebSnyanmisaka
798*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.src_bus_edin = fmt->src_endian;
799*437bfbebSnyanmisaka reg_base->reg0198_src_fmt.src_cfmt = fmt->format;
800*437bfbebSnyanmisaka reg_base->reg0198_src_fmt.alpha_swap = fmt->alpha_swap;
801*437bfbebSnyanmisaka reg_base->reg0198_src_fmt.rbuv_swap = fmt->rbuv_swap;
802*437bfbebSnyanmisaka
803*437bfbebSnyanmisaka reg_base->reg0198_src_fmt.out_fmt = (prep_cfg->format == MPP_FMT_YUV400) ? 0 : 1;
804*437bfbebSnyanmisaka reg_base->reg0203_src_proc.src_mirr = prep_cfg->mirroring > 0;
805*437bfbebSnyanmisaka reg_base->reg0203_src_proc.src_rot = prep_cfg->rotation;
806*437bfbebSnyanmisaka
807*437bfbebSnyanmisaka if (prep_cfg->hor_stride) {
808*437bfbebSnyanmisaka stridey = prep_cfg->hor_stride;
809*437bfbebSnyanmisaka } else {
810*437bfbebSnyanmisaka if (reg_base->reg0198_src_fmt.src_cfmt == VEPU5xx_FMT_BGRA8888 )
811*437bfbebSnyanmisaka stridey = prep_cfg->width * 4;
812*437bfbebSnyanmisaka else if (reg_base->reg0198_src_fmt.src_cfmt == VEPU5xx_FMT_BGR888 )
813*437bfbebSnyanmisaka stridey = prep_cfg->width * 3;
814*437bfbebSnyanmisaka else if (reg_base->reg0198_src_fmt.src_cfmt == VEPU5xx_FMT_BGR565 ||
815*437bfbebSnyanmisaka reg_base->reg0198_src_fmt.src_cfmt == VEPU5xx_FMT_YUYV422 ||
816*437bfbebSnyanmisaka reg_base->reg0198_src_fmt.src_cfmt == VEPU5xx_FMT_UYVY422)
817*437bfbebSnyanmisaka stridey = prep_cfg->width * 2;
818*437bfbebSnyanmisaka }
819*437bfbebSnyanmisaka
820*437bfbebSnyanmisaka stridec = (reg_base->reg0198_src_fmt.src_cfmt == VEPU5xx_FMT_YUV422SP ||
821*437bfbebSnyanmisaka reg_base->reg0198_src_fmt.src_cfmt == VEPU5xx_FMT_YUV420SP) ?
822*437bfbebSnyanmisaka stridey : stridey / 2;
823*437bfbebSnyanmisaka
824*437bfbebSnyanmisaka if (reg_base->reg0198_src_fmt.src_cfmt < VEPU5xx_FMT_ARGB1555) {
825*437bfbebSnyanmisaka const VepuRgb2YuvCfg *cfg_coeffs = cfg_coeffs = get_rgb2yuv_cfg(prep_cfg->range, prep_cfg->color);
826*437bfbebSnyanmisaka
827*437bfbebSnyanmisaka hal_h265e_dbg_simple("input color range %d colorspace %d", prep_cfg->range, prep_cfg->color);
828*437bfbebSnyanmisaka
829*437bfbebSnyanmisaka reg_base->reg0199_src_udfy.csc_wgt_r2y = cfg_coeffs->_2y.r_coeff;
830*437bfbebSnyanmisaka reg_base->reg0199_src_udfy.csc_wgt_g2y = cfg_coeffs->_2y.g_coeff;
831*437bfbebSnyanmisaka reg_base->reg0199_src_udfy.csc_wgt_b2y = cfg_coeffs->_2y.b_coeff;
832*437bfbebSnyanmisaka
833*437bfbebSnyanmisaka reg_base->reg0200_src_udfu.csc_wgt_r2u = cfg_coeffs->_2u.r_coeff;
834*437bfbebSnyanmisaka reg_base->reg0200_src_udfu.csc_wgt_g2u = cfg_coeffs->_2u.g_coeff;
835*437bfbebSnyanmisaka reg_base->reg0200_src_udfu.csc_wgt_b2u = cfg_coeffs->_2u.b_coeff;
836*437bfbebSnyanmisaka
837*437bfbebSnyanmisaka reg_base->reg0201_src_udfv.csc_wgt_r2v = cfg_coeffs->_2v.r_coeff;
838*437bfbebSnyanmisaka reg_base->reg0201_src_udfv.csc_wgt_g2v = cfg_coeffs->_2v.g_coeff;
839*437bfbebSnyanmisaka reg_base->reg0201_src_udfv.csc_wgt_b2v = cfg_coeffs->_2v.b_coeff;
840*437bfbebSnyanmisaka
841*437bfbebSnyanmisaka reg_base->reg0202_src_udfo.csc_ofst_y = cfg_coeffs->_2y.offset;
842*437bfbebSnyanmisaka reg_base->reg0202_src_udfo.csc_ofst_u = cfg_coeffs->_2u.offset;
843*437bfbebSnyanmisaka reg_base->reg0202_src_udfo.csc_ofst_v = cfg_coeffs->_2v.offset;
844*437bfbebSnyanmisaka
845*437bfbebSnyanmisaka hal_h265e_dbg_simple("use color range %d colorspace %d", cfg_coeffs->dst_range, cfg_coeffs->color);
846*437bfbebSnyanmisaka }
847*437bfbebSnyanmisaka
848*437bfbebSnyanmisaka reg_base->reg0205_src_strd0.src_strd0 = stridey;
849*437bfbebSnyanmisaka reg_base->reg0206_src_strd1.src_strd1 = stridec;
850*437bfbebSnyanmisaka
851*437bfbebSnyanmisaka return MPP_OK;
852*437bfbebSnyanmisaka }
853*437bfbebSnyanmisaka
vepu540c_h265_set_slice_regs(H265eSyntax_new * syn,hevc_vepu540c_base * regs)854*437bfbebSnyanmisaka static void vepu540c_h265_set_slice_regs(H265eSyntax_new *syn, hevc_vepu540c_base *regs)
855*437bfbebSnyanmisaka {
856*437bfbebSnyanmisaka regs->reg0237_synt_sps.smpl_adpt_ofst_e = syn->pp.sample_adaptive_offset_enabled_flag;
857*437bfbebSnyanmisaka regs->reg0237_synt_sps.num_st_ref_pic = syn->pp.num_short_term_ref_pic_sets;
858*437bfbebSnyanmisaka regs->reg0237_synt_sps.num_lt_ref_pic = syn->pp.num_long_term_ref_pics_sps;
859*437bfbebSnyanmisaka regs->reg0237_synt_sps.lt_ref_pic_prsnt = syn->pp.long_term_ref_pics_present_flag;
860*437bfbebSnyanmisaka regs->reg0237_synt_sps.tmpl_mvp_e = syn->pp.sps_temporal_mvp_enabled_flag;
861*437bfbebSnyanmisaka regs->reg0237_synt_sps.log2_max_poc_lsb = syn->pp.log2_max_pic_order_cnt_lsb_minus4;
862*437bfbebSnyanmisaka regs->reg0237_synt_sps.strg_intra_smth = syn->pp.strong_intra_smoothing_enabled_flag;
863*437bfbebSnyanmisaka
864*437bfbebSnyanmisaka regs->reg0238_synt_pps.dpdnt_sli_seg_en = syn->pp.dependent_slice_segments_enabled_flag;
865*437bfbebSnyanmisaka regs->reg0238_synt_pps.out_flg_prsnt_flg = syn->pp.output_flag_present_flag;
866*437bfbebSnyanmisaka regs->reg0238_synt_pps.num_extr_sli_hdr = syn->pp.num_extra_slice_header_bits;
867*437bfbebSnyanmisaka regs->reg0238_synt_pps.sgn_dat_hid_en = syn->pp.sign_data_hiding_enabled_flag;
868*437bfbebSnyanmisaka regs->reg0238_synt_pps.cbc_init_prsnt_flg = syn->pp.cabac_init_present_flag;
869*437bfbebSnyanmisaka regs->reg0238_synt_pps.pic_init_qp = syn->pp.init_qp_minus26 + 26;
870*437bfbebSnyanmisaka regs->reg0238_synt_pps.cu_qp_dlt_en = syn->pp.cu_qp_delta_enabled_flag;
871*437bfbebSnyanmisaka regs->reg0238_synt_pps.chrm_qp_ofst_prsn = syn->pp.pps_slice_chroma_qp_offsets_present_flag;
872*437bfbebSnyanmisaka regs->reg0238_synt_pps.lp_fltr_acrs_sli = syn->pp.pps_loop_filter_across_slices_enabled_flag;
873*437bfbebSnyanmisaka regs->reg0238_synt_pps.dblk_fltr_ovrd_en = syn->pp.deblocking_filter_override_enabled_flag;
874*437bfbebSnyanmisaka regs->reg0238_synt_pps.lst_mdfy_prsnt_flg = syn->pp.lists_modification_present_flag;
875*437bfbebSnyanmisaka regs->reg0238_synt_pps.sli_seg_hdr_extn = syn->pp.slice_segment_header_extension_present_flag;
876*437bfbebSnyanmisaka regs->reg0238_synt_pps.cu_qp_dlt_depth = syn->pp.diff_cu_qp_delta_depth;
877*437bfbebSnyanmisaka regs->reg0238_synt_pps.lpf_fltr_acrs_til = syn->pp.loop_filter_across_tiles_enabled_flag;
878*437bfbebSnyanmisaka
879*437bfbebSnyanmisaka regs->reg0239_synt_sli0.cbc_init_flg = syn->sp.cbc_init_flg;
880*437bfbebSnyanmisaka regs->reg0239_synt_sli0.mvd_l1_zero_flg = syn->sp.mvd_l1_zero_flg;
881*437bfbebSnyanmisaka regs->reg0239_synt_sli0.mrg_up_flg = syn->sp.merge_up_flag;
882*437bfbebSnyanmisaka regs->reg0239_synt_sli0.mrg_lft_flg = syn->sp.merge_left_flag;
883*437bfbebSnyanmisaka regs->reg0239_synt_sli0.ref_pic_lst_mdf_l0 = syn->sp.ref_pic_lst_mdf_l0;
884*437bfbebSnyanmisaka
885*437bfbebSnyanmisaka regs->reg0239_synt_sli0.num_refidx_l1_act = syn->sp.num_refidx_l1_act;
886*437bfbebSnyanmisaka regs->reg0239_synt_sli0.num_refidx_l0_act = syn->sp.num_refidx_l0_act;
887*437bfbebSnyanmisaka
888*437bfbebSnyanmisaka regs->reg0239_synt_sli0.num_refidx_act_ovrd = syn->sp.num_refidx_act_ovrd;
889*437bfbebSnyanmisaka
890*437bfbebSnyanmisaka regs->reg0239_synt_sli0.sli_sao_chrm_flg = syn->sp.sli_sao_chrm_flg;
891*437bfbebSnyanmisaka regs->reg0239_synt_sli0.sli_sao_luma_flg = syn->sp.sli_sao_luma_flg;
892*437bfbebSnyanmisaka regs->reg0239_synt_sli0.sli_tmprl_mvp_e = syn->sp.sli_tmprl_mvp_en;
893*437bfbebSnyanmisaka regs->reg0192_enc_pic.num_pic_tot_cur = syn->sp.tot_poc_num;
894*437bfbebSnyanmisaka
895*437bfbebSnyanmisaka regs->reg0239_synt_sli0.pic_out_flg = syn->sp.pic_out_flg;
896*437bfbebSnyanmisaka regs->reg0239_synt_sli0.sli_type = syn->sp.slice_type;
897*437bfbebSnyanmisaka regs->reg0239_synt_sli0.sli_rsrv_flg = syn->sp.slice_rsrv_flg;
898*437bfbebSnyanmisaka regs->reg0239_synt_sli0.dpdnt_sli_seg_flg = syn->sp.dpdnt_sli_seg_flg;
899*437bfbebSnyanmisaka regs->reg0239_synt_sli0.sli_pps_id = syn->sp.sli_pps_id;
900*437bfbebSnyanmisaka regs->reg0239_synt_sli0.no_out_pri_pic = syn->sp.no_out_pri_pic;
901*437bfbebSnyanmisaka
902*437bfbebSnyanmisaka
903*437bfbebSnyanmisaka regs->reg0240_synt_sli1.sp_tc_ofst_div2 = syn->sp.sli_tc_ofst_div2;;
904*437bfbebSnyanmisaka regs->reg0240_synt_sli1.sp_beta_ofst_div2 = syn->sp.sli_beta_ofst_div2;
905*437bfbebSnyanmisaka regs->reg0240_synt_sli1.sli_lp_fltr_acrs_sli = syn->sp.sli_lp_fltr_acrs_sli;
906*437bfbebSnyanmisaka regs->reg0240_synt_sli1.sp_dblk_fltr_dis = syn->sp.sli_dblk_fltr_dis;
907*437bfbebSnyanmisaka regs->reg0240_synt_sli1.dblk_fltr_ovrd_flg = syn->sp.dblk_fltr_ovrd_flg;
908*437bfbebSnyanmisaka regs->reg0240_synt_sli1.sli_cb_qp_ofst = syn->sp.sli_cb_qp_ofst;
909*437bfbebSnyanmisaka regs->reg0240_synt_sli1.max_mrg_cnd = syn->sp.max_mrg_cnd;
910*437bfbebSnyanmisaka
911*437bfbebSnyanmisaka regs->reg0240_synt_sli1.col_ref_idx = syn->sp.col_ref_idx;
912*437bfbebSnyanmisaka regs->reg0240_synt_sli1.col_frm_l0_flg = syn->sp.col_frm_l0_flg;
913*437bfbebSnyanmisaka regs->reg0241_synt_sli2.sli_poc_lsb = syn->sp.sli_poc_lsb;
914*437bfbebSnyanmisaka regs->reg0241_synt_sli2.sli_hdr_ext_len = syn->sp.sli_hdr_ext_len;
915*437bfbebSnyanmisaka
916*437bfbebSnyanmisaka }
917*437bfbebSnyanmisaka
vepu540c_h265_set_ref_regs(H265eSyntax_new * syn,hevc_vepu540c_base * regs)918*437bfbebSnyanmisaka static void vepu540c_h265_set_ref_regs(H265eSyntax_new *syn, hevc_vepu540c_base *regs)
919*437bfbebSnyanmisaka {
920*437bfbebSnyanmisaka regs->reg0242_synt_refm0.st_ref_pic_flg = syn->sp.st_ref_pic_flg;
921*437bfbebSnyanmisaka regs->reg0242_synt_refm0.poc_lsb_lt0 = syn->sp.poc_lsb_lt0;
922*437bfbebSnyanmisaka regs->reg0242_synt_refm0.num_lt_pic = syn->sp.num_lt_pic;
923*437bfbebSnyanmisaka
924*437bfbebSnyanmisaka regs->reg0243_synt_refm1.dlt_poc_msb_prsnt0 = syn->sp.dlt_poc_msb_prsnt0;
925*437bfbebSnyanmisaka regs->reg0243_synt_refm1.dlt_poc_msb_cycl0 = syn->sp.dlt_poc_msb_cycl0;
926*437bfbebSnyanmisaka regs->reg0243_synt_refm1.used_by_lt_flg0 = syn->sp.used_by_lt_flg0;
927*437bfbebSnyanmisaka regs->reg0243_synt_refm1.used_by_lt_flg1 = syn->sp.used_by_lt_flg1;
928*437bfbebSnyanmisaka regs->reg0243_synt_refm1.used_by_lt_flg2 = syn->sp.used_by_lt_flg2;
929*437bfbebSnyanmisaka regs->reg0243_synt_refm1.dlt_poc_msb_prsnt0 = syn->sp.dlt_poc_msb_prsnt0;
930*437bfbebSnyanmisaka regs->reg0243_synt_refm1.dlt_poc_msb_cycl0 = syn->sp.dlt_poc_msb_cycl0;
931*437bfbebSnyanmisaka regs->reg0243_synt_refm1.dlt_poc_msb_prsnt1 = syn->sp.dlt_poc_msb_prsnt1;
932*437bfbebSnyanmisaka regs->reg0243_synt_refm1.num_negative_pics = syn->sp.num_neg_pic;
933*437bfbebSnyanmisaka regs->reg0243_synt_refm1.num_pos_pic = syn->sp.num_pos_pic;
934*437bfbebSnyanmisaka
935*437bfbebSnyanmisaka regs->reg0243_synt_refm1.used_by_s0_flg = syn->sp.used_by_s0_flg;
936*437bfbebSnyanmisaka regs->reg0244_synt_refm2.dlt_poc_s0_m10 = syn->sp.dlt_poc_s0_m10;
937*437bfbebSnyanmisaka regs->reg0244_synt_refm2.dlt_poc_s0_m11 = syn->sp.dlt_poc_s0_m11;
938*437bfbebSnyanmisaka regs->reg0245_synt_refm3.dlt_poc_s0_m12 = syn->sp.dlt_poc_s0_m12;
939*437bfbebSnyanmisaka regs->reg0245_synt_refm3.dlt_poc_s0_m13 = syn->sp.dlt_poc_s0_m13;
940*437bfbebSnyanmisaka
941*437bfbebSnyanmisaka regs->reg0246_synt_long_refm0.poc_lsb_lt1 = syn->sp.poc_lsb_lt1;
942*437bfbebSnyanmisaka regs->reg0247_synt_long_refm1.dlt_poc_msb_cycl1 = syn->sp.dlt_poc_msb_cycl1;
943*437bfbebSnyanmisaka regs->reg0246_synt_long_refm0.poc_lsb_lt2 = syn->sp.poc_lsb_lt2;
944*437bfbebSnyanmisaka regs->reg0243_synt_refm1.dlt_poc_msb_prsnt2 = syn->sp.dlt_poc_msb_prsnt2;
945*437bfbebSnyanmisaka regs->reg0247_synt_long_refm1.dlt_poc_msb_cycl2 = syn->sp.dlt_poc_msb_cycl2;
946*437bfbebSnyanmisaka regs->reg0240_synt_sli1.lst_entry_l0 = syn->sp.lst_entry_l0;
947*437bfbebSnyanmisaka regs->reg0239_synt_sli0.ref_pic_lst_mdf_l0 = syn->sp.ref_pic_lst_mdf_l0;
948*437bfbebSnyanmisaka
949*437bfbebSnyanmisaka return;
950*437bfbebSnyanmisaka }
vepu540c_h265_set_me_regs(H265eV540cHalContext * ctx,H265eSyntax_new * syn,hevc_vepu540c_base * regs)951*437bfbebSnyanmisaka static void vepu540c_h265_set_me_regs(H265eV540cHalContext *ctx, H265eSyntax_new *syn, hevc_vepu540c_base *regs)
952*437bfbebSnyanmisaka {
953*437bfbebSnyanmisaka
954*437bfbebSnyanmisaka RK_S32 x_gmv = 0;
955*437bfbebSnyanmisaka RK_S32 y_gmv = 0;
956*437bfbebSnyanmisaka RK_S32 srch_lftw, srch_rgtw, srch_uph, srch_dwnh;
957*437bfbebSnyanmisaka RK_S32 frm_sta = 0, frm_end = 0, pic_w = 0;
958*437bfbebSnyanmisaka RK_S32 pic_wdt_align = ((regs->reg0196_enc_rsl.pic_wd8_m1 + 1) * 8 + 31) / 32 ;
959*437bfbebSnyanmisaka
960*437bfbebSnyanmisaka
961*437bfbebSnyanmisaka regs->reg0220_me_rnge.cime_srch_dwnh = 15;
962*437bfbebSnyanmisaka regs->reg0220_me_rnge.cime_srch_uph = 14;
963*437bfbebSnyanmisaka regs->reg0220_me_rnge.cime_srch_rgtw = 12;
964*437bfbebSnyanmisaka regs->reg0220_me_rnge.cime_srch_lftw = 12;
965*437bfbebSnyanmisaka regs->reg0221_me_cfg.rme_srch_h = 3;
966*437bfbebSnyanmisaka regs->reg0221_me_cfg.rme_srch_v = 3;
967*437bfbebSnyanmisaka
968*437bfbebSnyanmisaka regs->reg0221_me_cfg.srgn_max_num = 72;
969*437bfbebSnyanmisaka regs->reg0221_me_cfg.cime_dist_thre = 1024;
970*437bfbebSnyanmisaka regs->reg0221_me_cfg.rme_dis = 0;
971*437bfbebSnyanmisaka regs->reg0221_me_cfg.fme_dis = 0;
972*437bfbebSnyanmisaka regs->reg0220_me_rnge.dlt_frm_num = 0x1;
973*437bfbebSnyanmisaka srch_lftw = regs->reg0220_me_rnge.cime_srch_lftw * 4;
974*437bfbebSnyanmisaka srch_rgtw = regs->reg0220_me_rnge.cime_srch_rgtw * 4;
975*437bfbebSnyanmisaka srch_uph = regs->reg0220_me_rnge.cime_srch_uph * 2;
976*437bfbebSnyanmisaka srch_dwnh = regs->reg0220_me_rnge.cime_srch_dwnh * 2;
977*437bfbebSnyanmisaka
978*437bfbebSnyanmisaka if (syn->pp.sps_temporal_mvp_enabled_flag &&
979*437bfbebSnyanmisaka (ctx->frame_type != INTRA_FRAME)) {
980*437bfbebSnyanmisaka if (ctx->last_frame_type == INTRA_FRAME) {
981*437bfbebSnyanmisaka regs->reg0222_me_cach.colmv_load = 0;
982*437bfbebSnyanmisaka } else {
983*437bfbebSnyanmisaka regs->reg0222_me_cach.colmv_load = 1;
984*437bfbebSnyanmisaka }
985*437bfbebSnyanmisaka regs->reg0222_me_cach.colmv_stor = 1;
986*437bfbebSnyanmisaka }
987*437bfbebSnyanmisaka // calc cme_linebuf_w
988*437bfbebSnyanmisaka {
989*437bfbebSnyanmisaka if (x_gmv - srch_lftw < 0) {
990*437bfbebSnyanmisaka frm_sta = (x_gmv - srch_lftw - 15) / 16;
991*437bfbebSnyanmisaka } else {
992*437bfbebSnyanmisaka frm_sta = (x_gmv - srch_lftw) / 16;
993*437bfbebSnyanmisaka }
994*437bfbebSnyanmisaka if (x_gmv + srch_rgtw < 0) {
995*437bfbebSnyanmisaka frm_end = pic_wdt_align - 1 + (x_gmv + srch_rgtw) / 16;
996*437bfbebSnyanmisaka } else {
997*437bfbebSnyanmisaka frm_end = pic_wdt_align - 1 + (x_gmv + srch_rgtw + 15) / 16;
998*437bfbebSnyanmisaka }
999*437bfbebSnyanmisaka
1000*437bfbebSnyanmisaka if (frm_sta < 0) {
1001*437bfbebSnyanmisaka frm_sta = 0;
1002*437bfbebSnyanmisaka } else if (frm_sta > pic_wdt_align - 1) {
1003*437bfbebSnyanmisaka frm_sta = pic_wdt_align - 1;
1004*437bfbebSnyanmisaka }
1005*437bfbebSnyanmisaka frm_end = mpp_clip(frm_end, 0, pic_wdt_align - 1);
1006*437bfbebSnyanmisaka pic_w = (frm_end - frm_sta + 1) * 32;
1007*437bfbebSnyanmisaka regs->reg0222_me_cach.cme_linebuf_w = pic_w / 32;
1008*437bfbebSnyanmisaka }
1009*437bfbebSnyanmisaka
1010*437bfbebSnyanmisaka // calc cime_hgt_rama and cime_size_rama
1011*437bfbebSnyanmisaka {
1012*437bfbebSnyanmisaka RK_U32 rama_size = 1796;
1013*437bfbebSnyanmisaka RK_U32 ramb_h;
1014*437bfbebSnyanmisaka RK_U32 ctu_2_h = 4;
1015*437bfbebSnyanmisaka RK_U32 ctu_8_w = 1 ;
1016*437bfbebSnyanmisaka RK_U32 cur_srch_8_w, cur_srch_2_h, cur_srch_h;
1017*437bfbebSnyanmisaka
1018*437bfbebSnyanmisaka if ((y_gmv % 8 - srch_uph % 8) < 0) {
1019*437bfbebSnyanmisaka cur_srch_2_h = (8 + (y_gmv % 8 - srch_uph % 8) % 8 + srch_uph + srch_dwnh) / 2 + ctu_2_h;
1020*437bfbebSnyanmisaka } else {
1021*437bfbebSnyanmisaka cur_srch_2_h = ((y_gmv % 8 - srch_uph % 8) % 8 + srch_uph + srch_dwnh) / 2 + ctu_2_h;
1022*437bfbebSnyanmisaka }
1023*437bfbebSnyanmisaka regs->reg0222_me_cach.cime_size_rama = (cur_srch_2_h + 3) / 4 * 4;
1024*437bfbebSnyanmisaka
1025*437bfbebSnyanmisaka if ((x_gmv % 8 - srch_lftw % 8) < 0) {
1026*437bfbebSnyanmisaka cur_srch_8_w = (8 + (x_gmv % 8 - srch_lftw % 8) % 8 + srch_lftw + srch_rgtw + 7) / 8 + ctu_8_w;
1027*437bfbebSnyanmisaka } else {
1028*437bfbebSnyanmisaka cur_srch_8_w = ((x_gmv % 8 - srch_lftw % 8) % 8 + srch_lftw + srch_rgtw + 7) / 8 + ctu_8_w;
1029*437bfbebSnyanmisaka }
1030*437bfbebSnyanmisaka
1031*437bfbebSnyanmisaka cur_srch_h = ctu_2_h;
1032*437bfbebSnyanmisaka ramb_h = cur_srch_2_h;
1033*437bfbebSnyanmisaka while ((rama_size > ((cur_srch_h - ctu_2_h) * regs->reg0222_me_cach.cme_linebuf_w + (ramb_h * cur_srch_8_w)))
1034*437bfbebSnyanmisaka && (cur_srch_h < regs->reg0222_me_cach.cime_size_rama)) {
1035*437bfbebSnyanmisaka cur_srch_h = cur_srch_h + ctu_2_h;
1036*437bfbebSnyanmisaka if (ramb_h > ctu_2_h * 2) {
1037*437bfbebSnyanmisaka ramb_h = ramb_h - ctu_2_h;
1038*437bfbebSnyanmisaka } else {
1039*437bfbebSnyanmisaka ramb_h = ctu_2_h;
1040*437bfbebSnyanmisaka }
1041*437bfbebSnyanmisaka }
1042*437bfbebSnyanmisaka
1043*437bfbebSnyanmisaka if (cur_srch_2_h == ctu_2_h * 2) {
1044*437bfbebSnyanmisaka cur_srch_h = cur_srch_h + ctu_2_h;
1045*437bfbebSnyanmisaka ramb_h = ctu_2_h;
1046*437bfbebSnyanmisaka }
1047*437bfbebSnyanmisaka
1048*437bfbebSnyanmisaka if (rama_size < ((cur_srch_h - ctu_2_h) * regs->reg0222_me_cach.cme_linebuf_w + (ramb_h * cur_srch_8_w))) {
1049*437bfbebSnyanmisaka cur_srch_h = cur_srch_h - ctu_2_h;
1050*437bfbebSnyanmisaka }
1051*437bfbebSnyanmisaka
1052*437bfbebSnyanmisaka regs->reg0222_me_cach.cime_size_rama = ((cur_srch_h - ctu_2_h) * regs->reg0222_me_cach.cme_linebuf_w + ctu_2_h * cur_srch_8_w) / 4;
1053*437bfbebSnyanmisaka regs->reg0222_me_cach.cime_hgt_rama = cur_srch_h / 2;
1054*437bfbebSnyanmisaka regs->reg0222_me_cach.fme_prefsu_en = 1;
1055*437bfbebSnyanmisaka }
1056*437bfbebSnyanmisaka
1057*437bfbebSnyanmisaka }
1058*437bfbebSnyanmisaka
vepu540c_h265_set_hw_address(H265eV540cHalContext * ctx,hevc_vepu540c_base * regs,HalEncTask * task)1059*437bfbebSnyanmisaka void vepu540c_h265_set_hw_address(H265eV540cHalContext *ctx, hevc_vepu540c_base *regs, HalEncTask *task)
1060*437bfbebSnyanmisaka {
1061*437bfbebSnyanmisaka HalEncTask *enc_task = task;
1062*437bfbebSnyanmisaka HalBuf *recon_buf, *ref_buf;
1063*437bfbebSnyanmisaka MppBuffer md_info_buf = enc_task->md_info;
1064*437bfbebSnyanmisaka H265eSyntax_new *syn = (H265eSyntax_new *)enc_task->syntax.data;
1065*437bfbebSnyanmisaka
1066*437bfbebSnyanmisaka hal_h265e_enter();
1067*437bfbebSnyanmisaka
1068*437bfbebSnyanmisaka regs->reg0160_adr_src0 = mpp_buffer_get_fd(enc_task->input);
1069*437bfbebSnyanmisaka regs->reg0161_adr_src1 = regs->reg0160_adr_src0;
1070*437bfbebSnyanmisaka regs->reg0162_adr_src2 = regs->reg0160_adr_src0;
1071*437bfbebSnyanmisaka
1072*437bfbebSnyanmisaka recon_buf = hal_bufs_get_buf(ctx->dpb_bufs, syn->sp.recon_pic.slot_idx);
1073*437bfbebSnyanmisaka ref_buf = hal_bufs_get_buf(ctx->dpb_bufs, syn->sp.ref_pic.slot_idx);
1074*437bfbebSnyanmisaka
1075*437bfbebSnyanmisaka if (!syn->sp.non_reference_flag) {
1076*437bfbebSnyanmisaka regs->reg0163_rfpw_h_addr = mpp_buffer_get_fd(recon_buf->buf[0]);
1077*437bfbebSnyanmisaka regs->reg0164_rfpw_b_addr = regs->reg0163_rfpw_h_addr;
1078*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 164, ctx->fbc_header_len);
1079*437bfbebSnyanmisaka }
1080*437bfbebSnyanmisaka regs->reg0165_rfpr_h_addr = mpp_buffer_get_fd(ref_buf->buf[0]);
1081*437bfbebSnyanmisaka regs->reg0166_rfpr_b_addr = regs->reg0165_rfpr_h_addr;
1082*437bfbebSnyanmisaka regs->reg0167_cmvw_addr = mpp_buffer_get_fd(recon_buf->buf[2]);
1083*437bfbebSnyanmisaka regs->reg0168_cmvr_addr = mpp_buffer_get_fd(ref_buf->buf[2]);
1084*437bfbebSnyanmisaka regs->reg0169_dspw_addr = mpp_buffer_get_fd(recon_buf->buf[1]);
1085*437bfbebSnyanmisaka regs->reg0170_dspr_addr = mpp_buffer_get_fd(ref_buf->buf[1]);
1086*437bfbebSnyanmisaka
1087*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 166, ctx->fbc_header_len);
1088*437bfbebSnyanmisaka
1089*437bfbebSnyanmisaka if (md_info_buf) {
1090*437bfbebSnyanmisaka regs->reg0192_enc_pic.mei_stor = 1;
1091*437bfbebSnyanmisaka regs->reg0171_meiw_addr = mpp_buffer_get_fd(md_info_buf);
1092*437bfbebSnyanmisaka } else {
1093*437bfbebSnyanmisaka regs->reg0192_enc_pic.mei_stor = 0;
1094*437bfbebSnyanmisaka regs->reg0171_meiw_addr = 0;
1095*437bfbebSnyanmisaka }
1096*437bfbebSnyanmisaka
1097*437bfbebSnyanmisaka regs->reg0172_bsbt_addr = mpp_buffer_get_fd(enc_task->output);
1098*437bfbebSnyanmisaka /* TODO: stream size relative with syntax */
1099*437bfbebSnyanmisaka regs->reg0173_bsbb_addr = regs->reg0172_bsbt_addr;
1100*437bfbebSnyanmisaka regs->reg0175_bsbr_addr = regs->reg0172_bsbt_addr;
1101*437bfbebSnyanmisaka regs->reg0174_adr_bsbs = regs->reg0172_bsbt_addr;
1102*437bfbebSnyanmisaka
1103*437bfbebSnyanmisaka regs->reg0180_adr_rfpt_h = 0xffffffff;
1104*437bfbebSnyanmisaka regs->reg0181_adr_rfpb_h = 0;
1105*437bfbebSnyanmisaka regs->reg0182_adr_rfpt_b = 0xffffffff;
1106*437bfbebSnyanmisaka regs->reg0183_adr_rfpb_b = 0;
1107*437bfbebSnyanmisaka
1108*437bfbebSnyanmisaka
1109*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 174, mpp_packet_get_length(task->packet));
1110*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 172, mpp_buffer_get_size(enc_task->output));
1111*437bfbebSnyanmisaka
1112*437bfbebSnyanmisaka regs->reg0204_pic_ofst.pic_ofst_y = mpp_frame_get_offset_y(task->frame);
1113*437bfbebSnyanmisaka regs->reg0204_pic_ofst.pic_ofst_x = mpp_frame_get_offset_x(task->frame);
1114*437bfbebSnyanmisaka }
1115*437bfbebSnyanmisaka
setup_vepu540c_ext_line_buf(H265eV540cHalContext * ctx,H265eV540cRegSet * regs)1116*437bfbebSnyanmisaka static void setup_vepu540c_ext_line_buf(H265eV540cHalContext *ctx, H265eV540cRegSet *regs)
1117*437bfbebSnyanmisaka {
1118*437bfbebSnyanmisaka if (ctx->ext_line_buf) {
1119*437bfbebSnyanmisaka RK_S32 fd = mpp_buffer_get_fd(ctx->ext_line_buf);
1120*437bfbebSnyanmisaka
1121*437bfbebSnyanmisaka regs->reg_base.reg0179_adr_ebufb = fd;
1122*437bfbebSnyanmisaka regs->reg_base.reg0178_adr_ebuft = fd;
1123*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 178, ctx->ext_line_buf_size);
1124*437bfbebSnyanmisaka } else {
1125*437bfbebSnyanmisaka regs->reg_base.reg0179_adr_ebufb = 0;
1126*437bfbebSnyanmisaka regs->reg_base.reg0178_adr_ebuft = 0;
1127*437bfbebSnyanmisaka }
1128*437bfbebSnyanmisaka }
1129*437bfbebSnyanmisaka
vepu540c_h265_set_split(H265eV540cRegSet * regs,MppEncCfgSet * enc_cfg,RK_U32 title_en)1130*437bfbebSnyanmisaka static void vepu540c_h265_set_split(H265eV540cRegSet *regs, MppEncCfgSet *enc_cfg, RK_U32 title_en)
1131*437bfbebSnyanmisaka {
1132*437bfbebSnyanmisaka MppEncSliceSplit *cfg = &enc_cfg->split;
1133*437bfbebSnyanmisaka
1134*437bfbebSnyanmisaka hal_h265e_dbg_func("enter\n");
1135*437bfbebSnyanmisaka
1136*437bfbebSnyanmisaka switch (cfg->split_mode) {
1137*437bfbebSnyanmisaka case MPP_ENC_SPLIT_NONE : {
1138*437bfbebSnyanmisaka regs->reg_base.reg0216_sli_splt.sli_splt = 0;
1139*437bfbebSnyanmisaka regs->reg_base.reg0216_sli_splt.sli_splt_mode = 0;
1140*437bfbebSnyanmisaka regs->reg_base.reg0216_sli_splt.sli_splt_cpst = 0;
1141*437bfbebSnyanmisaka regs->reg_base.reg0216_sli_splt.sli_max_num_m1 = 0;
1142*437bfbebSnyanmisaka regs->reg_base.reg0216_sli_splt.sli_flsh = 0;
1143*437bfbebSnyanmisaka regs->reg_base.reg0218_sli_cnum.sli_splt_cnum_m1 = 0;
1144*437bfbebSnyanmisaka
1145*437bfbebSnyanmisaka regs->reg_base.reg0217_sli_byte.sli_splt_byte = 0;
1146*437bfbebSnyanmisaka regs->reg_base.reg0192_enc_pic.slen_fifo = 0;
1147*437bfbebSnyanmisaka } break;
1148*437bfbebSnyanmisaka case MPP_ENC_SPLIT_BY_BYTE : {
1149*437bfbebSnyanmisaka regs->reg_base.reg0216_sli_splt.sli_splt = 1;
1150*437bfbebSnyanmisaka regs->reg_base.reg0216_sli_splt.sli_splt_mode = 0;
1151*437bfbebSnyanmisaka regs->reg_base.reg0216_sli_splt.sli_splt_cpst = 0;
1152*437bfbebSnyanmisaka regs->reg_base.reg0216_sli_splt.sli_max_num_m1 = 500;
1153*437bfbebSnyanmisaka regs->reg_base.reg0216_sli_splt.sli_flsh = 1;
1154*437bfbebSnyanmisaka regs->reg_base.reg0218_sli_cnum.sli_splt_cnum_m1 = 0;
1155*437bfbebSnyanmisaka
1156*437bfbebSnyanmisaka regs->reg_base.reg0217_sli_byte.sli_splt_byte = cfg->split_arg;
1157*437bfbebSnyanmisaka regs->reg_base.reg0192_enc_pic.slen_fifo = cfg->split_out ? 1 : 0;
1158*437bfbebSnyanmisaka regs->reg_ctl.reg0008_int_en.vslc_done_en = regs->reg_base.reg0192_enc_pic.slen_fifo;
1159*437bfbebSnyanmisaka } break;
1160*437bfbebSnyanmisaka case MPP_ENC_SPLIT_BY_CTU : {
1161*437bfbebSnyanmisaka RK_U32 mb_w = MPP_ALIGN(enc_cfg->prep.width, 64) / 64;
1162*437bfbebSnyanmisaka RK_U32 mb_h = MPP_ALIGN(enc_cfg->prep.height, 64) / 64;
1163*437bfbebSnyanmisaka RK_U32 slice_num = 0;
1164*437bfbebSnyanmisaka
1165*437bfbebSnyanmisaka if (title_en)
1166*437bfbebSnyanmisaka mb_w = mb_w / 2;
1167*437bfbebSnyanmisaka
1168*437bfbebSnyanmisaka slice_num = (mb_w * mb_h + cfg->split_arg - 1) / cfg->split_arg;
1169*437bfbebSnyanmisaka
1170*437bfbebSnyanmisaka regs->reg_base.reg0216_sli_splt.sli_splt = 1;
1171*437bfbebSnyanmisaka regs->reg_base.reg0216_sli_splt.sli_splt_mode = 1;
1172*437bfbebSnyanmisaka regs->reg_base.reg0216_sli_splt.sli_splt_cpst = 0;
1173*437bfbebSnyanmisaka regs->reg_base.reg0216_sli_splt.sli_max_num_m1 = 500;
1174*437bfbebSnyanmisaka regs->reg_base.reg0216_sli_splt.sli_flsh = 1;
1175*437bfbebSnyanmisaka regs->reg_base.reg0218_sli_cnum.sli_splt_cnum_m1 = cfg->split_arg - 1;
1176*437bfbebSnyanmisaka
1177*437bfbebSnyanmisaka regs->reg_base.reg0217_sli_byte.sli_splt_byte = 0;
1178*437bfbebSnyanmisaka regs->reg_base.reg0192_enc_pic.slen_fifo = cfg->split_out ? 1 : 0;
1179*437bfbebSnyanmisaka
1180*437bfbebSnyanmisaka if ((cfg->split_out & MPP_ENC_SPLIT_OUT_LOWDELAY) ||
1181*437bfbebSnyanmisaka (regs->reg_base.reg0192_enc_pic.slen_fifo && (slice_num > VEPU540C_SLICE_FIFO_LEN)))
1182*437bfbebSnyanmisaka regs->reg_ctl.reg0008_int_en.vslc_done_en = 1 ;
1183*437bfbebSnyanmisaka } break;
1184*437bfbebSnyanmisaka default : {
1185*437bfbebSnyanmisaka mpp_log_f("invalide slice split mode %d\n", cfg->split_mode);
1186*437bfbebSnyanmisaka } break;
1187*437bfbebSnyanmisaka }
1188*437bfbebSnyanmisaka
1189*437bfbebSnyanmisaka hal_h265e_dbg_func("leave\n");
1190*437bfbebSnyanmisaka }
1191*437bfbebSnyanmisaka
hal_h265e_v540c_gen_regs(void * hal,HalEncTask * task)1192*437bfbebSnyanmisaka MPP_RET hal_h265e_v540c_gen_regs(void *hal, HalEncTask *task)
1193*437bfbebSnyanmisaka {
1194*437bfbebSnyanmisaka H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
1195*437bfbebSnyanmisaka HalEncTask *enc_task = task;
1196*437bfbebSnyanmisaka H265eSyntax_new *syn = (H265eSyntax_new *)enc_task->syntax.data;
1197*437bfbebSnyanmisaka H265eV540cRegSet *regs = ctx->regs;
1198*437bfbebSnyanmisaka RK_U32 pic_width_align8, pic_height_align8;
1199*437bfbebSnyanmisaka RK_S32 pic_wd32, pic_h32;
1200*437bfbebSnyanmisaka VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
1201*437bfbebSnyanmisaka hevc_vepu540c_control_cfg *reg_ctl = ®s->reg_ctl;
1202*437bfbebSnyanmisaka hevc_vepu540c_base *reg_base = ®s->reg_base;
1203*437bfbebSnyanmisaka hevc_vepu540c_rc_roi *reg_klut = ®s->reg_rc_roi;
1204*437bfbebSnyanmisaka
1205*437bfbebSnyanmisaka hal_h265e_enter();
1206*437bfbebSnyanmisaka pic_width_align8 = (syn->pp.pic_width + 7) & (~7);
1207*437bfbebSnyanmisaka pic_height_align8 = (syn->pp.pic_height + 7) & (~7);
1208*437bfbebSnyanmisaka pic_wd32 = (syn->pp.pic_width + 31) / 32;
1209*437bfbebSnyanmisaka pic_h32 = (syn->pp.pic_height + 31) / 32;
1210*437bfbebSnyanmisaka
1211*437bfbebSnyanmisaka hal_h265e_dbg_simple("frame %d | type %d | start gen regs",
1212*437bfbebSnyanmisaka ctx->frame_cnt, ctx->frame_type);
1213*437bfbebSnyanmisaka
1214*437bfbebSnyanmisaka memset(regs, 0, sizeof(H265eV540cRegSet));
1215*437bfbebSnyanmisaka
1216*437bfbebSnyanmisaka reg_ctl->reg0004_enc_strt.lkt_num = 0;
1217*437bfbebSnyanmisaka reg_ctl->reg0004_enc_strt.vepu_cmd = ctx->enc_mode;
1218*437bfbebSnyanmisaka reg_ctl->reg0005_enc_clr.safe_clr = 0x0;
1219*437bfbebSnyanmisaka reg_ctl->reg0005_enc_clr.force_clr = 0x0;
1220*437bfbebSnyanmisaka
1221*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.enc_done_en = 1;
1222*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.lkt_node_done_en = 1;
1223*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.sclr_done_en = 1;
1224*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.vslc_done_en = 0;
1225*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.vbsf_oflw_en = 1;
1226*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.vbuf_lens_en = 1;
1227*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.enc_err_en = 1;
1228*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.dvbm_fcfg_en = 1;
1229*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.wdg_en = 1;
1230*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.lkt_err_int_en = 0;
1231*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.lkt_err_stop_en = 1;
1232*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.lkt_force_stop_en = 1;
1233*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.jslc_done_en = 1;
1234*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.jbsf_oflw_en = 1;
1235*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.jbuf_lens_en = 1;
1236*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.dvbm_dcnt_en = 1;
1237*437bfbebSnyanmisaka
1238*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.jpeg_bus_edin = 0x0;
1239*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.src_bus_edin = 0x0;
1240*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.meiw_bus_edin = 0x0;
1241*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.bsw_bus_edin = 0x7;
1242*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.lktr_bus_edin = 0x0;
1243*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.roir_bus_edin = 0x0;
1244*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.lktw_bus_edin = 0x0;
1245*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.rec_nfbc_bus_edin = 0x0;
1246*437bfbebSnyanmisaka /* enable rdo clk gating */
1247*437bfbebSnyanmisaka {
1248*437bfbebSnyanmisaka RK_U32 *rdo_ckg = (RK_U32*)®_ctl->reg0022_rdo_ckg;
1249*437bfbebSnyanmisaka
1250*437bfbebSnyanmisaka *rdo_ckg = 0xffffffff;
1251*437bfbebSnyanmisaka }
1252*437bfbebSnyanmisaka // reg_ctl->reg0013_dtrns_cfg.dspr_otsd = (ctx->frame_type == INTER_P_FRAME);
1253*437bfbebSnyanmisaka reg_ctl->reg0013_dtrns_cfg.axi_brsp_cke = 0x0;
1254*437bfbebSnyanmisaka reg_ctl->reg0014_enc_wdg.vs_load_thd = 0x1fffff;
1255*437bfbebSnyanmisaka reg_ctl->reg0014_enc_wdg.rfp_load_thd = 0xff;
1256*437bfbebSnyanmisaka
1257*437bfbebSnyanmisaka reg_ctl->reg0021_func_en.cke = 1;
1258*437bfbebSnyanmisaka reg_ctl->reg0021_func_en.resetn_hw_en = 1;
1259*437bfbebSnyanmisaka reg_ctl->reg0021_func_en.enc_done_tmvp_en = 1;
1260*437bfbebSnyanmisaka
1261*437bfbebSnyanmisaka reg_base->reg0196_enc_rsl.pic_wd8_m1 = pic_width_align8 / 8 - 1;
1262*437bfbebSnyanmisaka reg_base->reg0197_src_fill.pic_wfill = (syn->pp.pic_width & 0x7)
1263*437bfbebSnyanmisaka ? (8 - (syn->pp.pic_width & 0x7)) : 0;
1264*437bfbebSnyanmisaka reg_base->reg0196_enc_rsl.pic_hd8_m1 = pic_height_align8 / 8 - 1;
1265*437bfbebSnyanmisaka reg_base->reg0197_src_fill.pic_hfill = (syn->pp.pic_height & 0x7)
1266*437bfbebSnyanmisaka ? (8 - (syn->pp.pic_height & 0x7)) : 0;
1267*437bfbebSnyanmisaka
1268*437bfbebSnyanmisaka reg_base->reg0192_enc_pic.enc_stnd = 1; //H265
1269*437bfbebSnyanmisaka reg_base->reg0192_enc_pic.cur_frm_ref = !syn->sp.non_reference_flag; //current frame will be refered
1270*437bfbebSnyanmisaka reg_base->reg0192_enc_pic.bs_scp = 1;
1271*437bfbebSnyanmisaka reg_base->reg0192_enc_pic.log2_ctu_num = mpp_ceil_log2(pic_wd32 * pic_h32);
1272*437bfbebSnyanmisaka
1273*437bfbebSnyanmisaka reg_base->reg0203_src_proc.src_mirr = 0;
1274*437bfbebSnyanmisaka reg_base->reg0203_src_proc.src_rot = 0;
1275*437bfbebSnyanmisaka
1276*437bfbebSnyanmisaka reg_klut->klut_ofst.chrm_klut_ofst = (ctx->frame_type == INTRA_FRAME) ? 6 :
1277*437bfbebSnyanmisaka (ctx->cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC ? 9 : 6);
1278*437bfbebSnyanmisaka reg_klut->klut_ofst.inter_chrm_dist_multi = 4;
1279*437bfbebSnyanmisaka reg_base->reg0248_sao_cfg.sao_lambda_multi = 5;
1280*437bfbebSnyanmisaka
1281*437bfbebSnyanmisaka vepu540c_h265_set_me_regs(ctx, syn, reg_base);
1282*437bfbebSnyanmisaka
1283*437bfbebSnyanmisaka reg_base->reg0232_rdo_cfg.chrm_spcl = 0;
1284*437bfbebSnyanmisaka reg_base->reg0232_rdo_cfg.cu_inter_e = 0x0092;
1285*437bfbebSnyanmisaka reg_base->reg0232_rdo_cfg.cu_intra_e = 0xe;
1286*437bfbebSnyanmisaka reg_base->reg0232_rdo_cfg.lambda_qp_use_avg_cu16_flag = 1;
1287*437bfbebSnyanmisaka reg_base->reg0232_rdo_cfg.yuvskip_calc_en = 1;
1288*437bfbebSnyanmisaka reg_base->reg0232_rdo_cfg.atf_e = 1;
1289*437bfbebSnyanmisaka reg_base->reg0232_rdo_cfg.atr_e = 1;
1290*437bfbebSnyanmisaka
1291*437bfbebSnyanmisaka if (syn->pp.num_long_term_ref_pics_sps) {
1292*437bfbebSnyanmisaka reg_base->reg0232_rdo_cfg.ltm_col = 0;
1293*437bfbebSnyanmisaka reg_base->reg0232_rdo_cfg.ltm_idx0l0 = 1;
1294*437bfbebSnyanmisaka } else {
1295*437bfbebSnyanmisaka reg_base->reg0232_rdo_cfg.ltm_col = 0;
1296*437bfbebSnyanmisaka reg_base->reg0232_rdo_cfg.ltm_idx0l0 = 0;
1297*437bfbebSnyanmisaka }
1298*437bfbebSnyanmisaka
1299*437bfbebSnyanmisaka reg_base->reg0232_rdo_cfg.ccwa_e = 1;
1300*437bfbebSnyanmisaka reg_base->reg0232_rdo_cfg.scl_lst_sel = syn->pp.scaling_list_enabled_flag;
1301*437bfbebSnyanmisaka reg_base->reg0236_synt_nal.nal_unit_type = h265e_get_nal_type(&syn->sp, ctx->frame_type);
1302*437bfbebSnyanmisaka
1303*437bfbebSnyanmisaka vepu540c_h265_set_hw_address(ctx, reg_base, task);
1304*437bfbebSnyanmisaka vepu540c_h265_set_pp_regs(regs, fmt, &ctx->cfg->prep);
1305*437bfbebSnyanmisaka vepu540c_h265_set_rc_regs(ctx, regs, task);
1306*437bfbebSnyanmisaka vepu540c_h265_set_slice_regs(syn, reg_base);
1307*437bfbebSnyanmisaka vepu540c_h265_set_ref_regs(syn, reg_base);
1308*437bfbebSnyanmisaka vepu540c_h265_set_patch_info(ctx->dev, syn, (VepuFmt)fmt->format, enc_task);
1309*437bfbebSnyanmisaka setup_vepu540c_ext_line_buf(ctx, ctx->regs);
1310*437bfbebSnyanmisaka vepu540c_h265_set_split(regs, ctx->cfg, syn->pp.tiles_enabled_flag);
1311*437bfbebSnyanmisaka
1312*437bfbebSnyanmisaka /* ROI configure */
1313*437bfbebSnyanmisaka if (ctx->roi_data)
1314*437bfbebSnyanmisaka vepu540c_set_roi(®s->reg_rc_roi.roi_cfg, ctx->roi_data,
1315*437bfbebSnyanmisaka ctx->cfg->prep.width, ctx->cfg->prep.height);
1316*437bfbebSnyanmisaka /*paramet cfg*/
1317*437bfbebSnyanmisaka vepu540c_h265_global_cfg_set(ctx, regs);
1318*437bfbebSnyanmisaka
1319*437bfbebSnyanmisaka ctx->frame_num++;
1320*437bfbebSnyanmisaka
1321*437bfbebSnyanmisaka hal_h265e_leave();
1322*437bfbebSnyanmisaka return MPP_OK;
1323*437bfbebSnyanmisaka }
1324*437bfbebSnyanmisaka
hal_h265e_v540c_start(void * hal,HalEncTask * enc_task)1325*437bfbebSnyanmisaka MPP_RET hal_h265e_v540c_start(void *hal, HalEncTask *enc_task)
1326*437bfbebSnyanmisaka {
1327*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
1328*437bfbebSnyanmisaka H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
1329*437bfbebSnyanmisaka RK_U32 *regs = (RK_U32*)ctx->regs;
1330*437bfbebSnyanmisaka H265eV540cRegSet *hw_regs = ctx->regs;
1331*437bfbebSnyanmisaka H265eV540cStatusElem *reg_out = (H265eV540cStatusElem *)ctx->reg_out[0];
1332*437bfbebSnyanmisaka MppDevRegWrCfg cfg;
1333*437bfbebSnyanmisaka MppDevRegRdCfg cfg1;
1334*437bfbebSnyanmisaka RK_U32 i = 0;
1335*437bfbebSnyanmisaka hal_h265e_enter();
1336*437bfbebSnyanmisaka
1337*437bfbebSnyanmisaka if (enc_task->flags.err) {
1338*437bfbebSnyanmisaka hal_h265e_err("enc_task->flags.err %08x, return e arly",
1339*437bfbebSnyanmisaka enc_task->flags.err);
1340*437bfbebSnyanmisaka return MPP_NOK;
1341*437bfbebSnyanmisaka }
1342*437bfbebSnyanmisaka
1343*437bfbebSnyanmisaka cfg.reg = (RK_U32*)&hw_regs->reg_ctl;
1344*437bfbebSnyanmisaka cfg.size = sizeof(hevc_vepu540c_control_cfg);
1345*437bfbebSnyanmisaka cfg.offset = VEPU540C_CTL_OFFSET;
1346*437bfbebSnyanmisaka
1347*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
1348*437bfbebSnyanmisaka if (ret) {
1349*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
1350*437bfbebSnyanmisaka return ret;
1351*437bfbebSnyanmisaka }
1352*437bfbebSnyanmisaka
1353*437bfbebSnyanmisaka if (hal_h265e_debug & HAL_H265E_DBG_CTL_REGS) {
1354*437bfbebSnyanmisaka regs = (RK_U32*)&hw_regs->reg_ctl;
1355*437bfbebSnyanmisaka for (i = 0; i < sizeof(hevc_vepu540c_control_cfg) / 4; i++) {
1356*437bfbebSnyanmisaka hal_h265e_dbg_ctl("ctl reg[%04x]: 0%08x\n", i * 4, regs[i]);
1357*437bfbebSnyanmisaka }
1358*437bfbebSnyanmisaka }
1359*437bfbebSnyanmisaka
1360*437bfbebSnyanmisaka cfg.reg = &hw_regs->reg_base;
1361*437bfbebSnyanmisaka cfg.size = sizeof(hevc_vepu540c_base);
1362*437bfbebSnyanmisaka cfg.offset = VEPU540C_BASE_OFFSET;
1363*437bfbebSnyanmisaka
1364*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
1365*437bfbebSnyanmisaka if (ret) {
1366*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
1367*437bfbebSnyanmisaka return ret;
1368*437bfbebSnyanmisaka }
1369*437bfbebSnyanmisaka
1370*437bfbebSnyanmisaka if (hal_h265e_debug & HAL_H265E_DBG_REGS) {
1371*437bfbebSnyanmisaka regs = (RK_U32*)(&hw_regs->reg_base);
1372*437bfbebSnyanmisaka for (i = 0; i < 32; i++) {
1373*437bfbebSnyanmisaka hal_h265e_dbg_regs("hw add cfg reg[%04x]: 0%08x\n", i * 4, regs[i]);
1374*437bfbebSnyanmisaka }
1375*437bfbebSnyanmisaka regs += 32;
1376*437bfbebSnyanmisaka for (i = 0; i < (sizeof(hevc_vepu540c_base) - 128) / 4; i++) {
1377*437bfbebSnyanmisaka hal_h265e_dbg_regs("set reg[%04x]: 0%08x\n", i * 4, regs[i]);
1378*437bfbebSnyanmisaka }
1379*437bfbebSnyanmisaka }
1380*437bfbebSnyanmisaka cfg.reg = &hw_regs->reg_rc_roi;
1381*437bfbebSnyanmisaka cfg.size = sizeof(hevc_vepu540c_rc_roi);
1382*437bfbebSnyanmisaka cfg.offset = VEPU540C_RCROI_OFFSET;
1383*437bfbebSnyanmisaka
1384*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
1385*437bfbebSnyanmisaka if (ret) {
1386*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
1387*437bfbebSnyanmisaka return ret;
1388*437bfbebSnyanmisaka }
1389*437bfbebSnyanmisaka
1390*437bfbebSnyanmisaka if (hal_h265e_debug & HAL_H265E_DBG_RCKUT_REGS) {
1391*437bfbebSnyanmisaka regs = (RK_U32*)&hw_regs->reg_rc_roi;
1392*437bfbebSnyanmisaka for (i = 0; i < sizeof(hevc_vepu540c_rc_roi) / 4; i++) {
1393*437bfbebSnyanmisaka hal_h265e_dbg_rckut("set reg[%04x]: 0%08x\n", i * 4, regs[i]);
1394*437bfbebSnyanmisaka }
1395*437bfbebSnyanmisaka }
1396*437bfbebSnyanmisaka
1397*437bfbebSnyanmisaka cfg.reg = &hw_regs->reg_wgt;
1398*437bfbebSnyanmisaka cfg.size = sizeof(hevc_vepu540c_wgt);
1399*437bfbebSnyanmisaka cfg.offset = VEPU540C_WEG_OFFSET;
1400*437bfbebSnyanmisaka
1401*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
1402*437bfbebSnyanmisaka if (ret) {
1403*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
1404*437bfbebSnyanmisaka return ret;
1405*437bfbebSnyanmisaka }
1406*437bfbebSnyanmisaka
1407*437bfbebSnyanmisaka if (hal_h265e_debug & HAL_H265E_DBG_WGT_REGS) {
1408*437bfbebSnyanmisaka regs = (RK_U32*)&hw_regs->reg_wgt;
1409*437bfbebSnyanmisaka for (i = 0; i < sizeof(hevc_vepu540c_wgt) / 4; i++) {
1410*437bfbebSnyanmisaka hal_h265e_dbg_wgt("set reg[%04x]: 0%08x\n", i * 4, regs[i]);
1411*437bfbebSnyanmisaka }
1412*437bfbebSnyanmisaka }
1413*437bfbebSnyanmisaka
1414*437bfbebSnyanmisaka cfg.reg = &hw_regs->reg_rdo;
1415*437bfbebSnyanmisaka cfg.size = sizeof(vepu540c_rdo_cfg);
1416*437bfbebSnyanmisaka cfg.offset = VEPU540C_RDOCFG_OFFSET;
1417*437bfbebSnyanmisaka
1418*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
1419*437bfbebSnyanmisaka if (ret) {
1420*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
1421*437bfbebSnyanmisaka return ret;
1422*437bfbebSnyanmisaka }
1423*437bfbebSnyanmisaka
1424*437bfbebSnyanmisaka cfg1.reg = ®_out->hw_status;
1425*437bfbebSnyanmisaka cfg1.size = sizeof(RK_U32);
1426*437bfbebSnyanmisaka cfg1.offset = VEPU540C_REG_BASE_HW_STATUS;
1427*437bfbebSnyanmisaka
1428*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
1429*437bfbebSnyanmisaka if (ret) {
1430*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
1431*437bfbebSnyanmisaka return ret;
1432*437bfbebSnyanmisaka }
1433*437bfbebSnyanmisaka
1434*437bfbebSnyanmisaka cfg1.reg = ®_out->st;
1435*437bfbebSnyanmisaka cfg1.size = sizeof(H265eV540cStatusElem) - 4;
1436*437bfbebSnyanmisaka cfg1.offset = VEPU540C_STATUS_OFFSET;
1437*437bfbebSnyanmisaka
1438*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
1439*437bfbebSnyanmisaka if (ret) {
1440*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
1441*437bfbebSnyanmisaka return ret;
1442*437bfbebSnyanmisaka }
1443*437bfbebSnyanmisaka
1444*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
1445*437bfbebSnyanmisaka if (ret) {
1446*437bfbebSnyanmisaka mpp_err_f("send cmd failed %d\n", ret);
1447*437bfbebSnyanmisaka }
1448*437bfbebSnyanmisaka hal_h265e_leave();
1449*437bfbebSnyanmisaka return ret;
1450*437bfbebSnyanmisaka }
1451*437bfbebSnyanmisaka
vepu540c_h265_set_feedback(H265eV540cHalContext * ctx,HalEncTask * enc_task)1452*437bfbebSnyanmisaka static MPP_RET vepu540c_h265_set_feedback(H265eV540cHalContext *ctx, HalEncTask *enc_task)
1453*437bfbebSnyanmisaka {
1454*437bfbebSnyanmisaka EncRcTaskInfo *hal_rc_ret = (EncRcTaskInfo *)&enc_task->rc_task->info;
1455*437bfbebSnyanmisaka vepu540c_h265_fbk *fb = &ctx->feedback;
1456*437bfbebSnyanmisaka MppEncCfgSet *cfg = ctx->cfg;
1457*437bfbebSnyanmisaka RK_S32 mb64_num = ((cfg->prep.width + 63) / 64) * ((cfg->prep.height + 63) / 64);
1458*437bfbebSnyanmisaka RK_S32 mb8_num = (mb64_num << 6);
1459*437bfbebSnyanmisaka RK_S32 mb4_num = (mb8_num << 2);
1460*437bfbebSnyanmisaka H265eV540cStatusElem *elem = (H265eV540cStatusElem *)ctx->reg_out[0];
1461*437bfbebSnyanmisaka vepu540c_hw_status hw_status = elem->hw_status;
1462*437bfbebSnyanmisaka
1463*437bfbebSnyanmisaka hal_h265e_enter();
1464*437bfbebSnyanmisaka
1465*437bfbebSnyanmisaka fb->qp_sum += elem->st.qp_sum;
1466*437bfbebSnyanmisaka
1467*437bfbebSnyanmisaka fb->out_strm_size += elem->st.bs_lgth_l32;
1468*437bfbebSnyanmisaka
1469*437bfbebSnyanmisaka fb->sse_sum += (RK_S64)(elem->st.sse_h32 << 16) +
1470*437bfbebSnyanmisaka (elem->st.st_sse_bsl.sse_l16 & 0xffff) ;
1471*437bfbebSnyanmisaka
1472*437bfbebSnyanmisaka fb->hw_status = hw_status;
1473*437bfbebSnyanmisaka hal_h265e_dbg_detail("hw_status: 0x%08x", hw_status.val);
1474*437bfbebSnyanmisaka if (hw_status.int_sta.enc_done_sta)
1475*437bfbebSnyanmisaka hal_h265e_dbg_detail("RKV_ENC_INT_ENC_DONE");
1476*437bfbebSnyanmisaka
1477*437bfbebSnyanmisaka if (hw_status.int_sta.lkt_node_done_sta)
1478*437bfbebSnyanmisaka hal_h265e_dbg_detail("RKV_ENC_INT_LKT_NODE_DONE");
1479*437bfbebSnyanmisaka
1480*437bfbebSnyanmisaka if (hw_status.int_sta.sclr_done_sta)
1481*437bfbebSnyanmisaka hal_h265e_dbg_detail("RKV_ENC_INT_SCLR_DONE");
1482*437bfbebSnyanmisaka
1483*437bfbebSnyanmisaka if (hw_status.int_sta.vslc_done_sta)
1484*437bfbebSnyanmisaka hal_h265e_dbg_detail("RKV_ENC_INT_VSLC_DONE");
1485*437bfbebSnyanmisaka
1486*437bfbebSnyanmisaka if (hw_status.int_sta.vbsf_oflw_sta)
1487*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_VBSF_OFLOW");
1488*437bfbebSnyanmisaka
1489*437bfbebSnyanmisaka if (hw_status.int_sta.vbuf_lens_sta)
1490*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_VBUF_LENS");
1491*437bfbebSnyanmisaka
1492*437bfbebSnyanmisaka if (hw_status.int_sta.enc_err_sta)
1493*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_ENC_ERR");
1494*437bfbebSnyanmisaka
1495*437bfbebSnyanmisaka if (hw_status.int_sta.dvbm_fcfg_sta)
1496*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_DVBM_FCFG");
1497*437bfbebSnyanmisaka
1498*437bfbebSnyanmisaka if (hw_status.int_sta.wdg_sta)
1499*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_WDG_TIMEOUT");
1500*437bfbebSnyanmisaka
1501*437bfbebSnyanmisaka // fb->st_madi += elem->st.madi;
1502*437bfbebSnyanmisaka //fb->st_madp += elem->st.madp;
1503*437bfbebSnyanmisaka fb->st_mb_num += elem->st.st_bnum_b16.num_b16;
1504*437bfbebSnyanmisaka // fb->st_ctu_num += elem->st.st_bnum_cme.num_ctu;
1505*437bfbebSnyanmisaka
1506*437bfbebSnyanmisaka fb->st_lvl64_inter_num += elem->st.st_pnum_p64.pnum_p64;
1507*437bfbebSnyanmisaka fb->st_lvl32_inter_num += elem->st.st_pnum_p32.pnum_p32;
1508*437bfbebSnyanmisaka fb->st_lvl32_intra_num += elem->st.st_pnum_i32.pnum_i32;
1509*437bfbebSnyanmisaka fb->st_lvl16_inter_num += elem->st.st_pnum_p16.pnum_p16;
1510*437bfbebSnyanmisaka fb->st_lvl16_intra_num += elem->st.st_pnum_i16.pnum_i16;
1511*437bfbebSnyanmisaka fb->st_lvl8_inter_num += elem->st.st_pnum_p8.pnum_p8;
1512*437bfbebSnyanmisaka fb->st_lvl8_intra_num += elem->st.st_pnum_i8.pnum_i8;
1513*437bfbebSnyanmisaka fb->st_lvl4_intra_num += elem->st.st_pnum_i4.pnum_i4;
1514*437bfbebSnyanmisaka memcpy(&fb->st_cu_num_qp[0], &elem->st.st_b8_qp, 52 * sizeof(RK_U32));
1515*437bfbebSnyanmisaka
1516*437bfbebSnyanmisaka hal_rc_ret->bit_real += fb->out_strm_size * 8;
1517*437bfbebSnyanmisaka
1518*437bfbebSnyanmisaka if (fb->st_mb_num) {
1519*437bfbebSnyanmisaka fb->st_madi = fb->st_madi / fb->st_mb_num;
1520*437bfbebSnyanmisaka } else {
1521*437bfbebSnyanmisaka fb->st_madi = 0;
1522*437bfbebSnyanmisaka }
1523*437bfbebSnyanmisaka if (fb->st_ctu_num) {
1524*437bfbebSnyanmisaka fb->st_madp = fb->st_madp / fb->st_ctu_num;
1525*437bfbebSnyanmisaka } else {
1526*437bfbebSnyanmisaka fb->st_madp = 0;
1527*437bfbebSnyanmisaka }
1528*437bfbebSnyanmisaka
1529*437bfbebSnyanmisaka if (mb4_num > 0)
1530*437bfbebSnyanmisaka hal_rc_ret->iblk4_prop = ((((fb->st_lvl4_intra_num + fb->st_lvl8_intra_num) << 2) +
1531*437bfbebSnyanmisaka (fb->st_lvl16_intra_num << 4) +
1532*437bfbebSnyanmisaka (fb->st_lvl32_intra_num << 6)) << 8) / mb4_num;
1533*437bfbebSnyanmisaka
1534*437bfbebSnyanmisaka if (mb64_num > 0) {
1535*437bfbebSnyanmisaka /*
1536*437bfbebSnyanmisaka hal_cfg[k].inter_lv8_prop = ((fb->st_lvl8_inter_num + (fb->st_lvl16_inter_num << 2) +
1537*437bfbebSnyanmisaka (fb->st_lvl32_inter_num << 4) +
1538*437bfbebSnyanmisaka (fb->st_lvl64_inter_num << 6)) << 8) / mb8_num;*/
1539*437bfbebSnyanmisaka
1540*437bfbebSnyanmisaka hal_rc_ret->quality_real = fb->qp_sum / mb8_num;
1541*437bfbebSnyanmisaka // hal_cfg[k].sse = fb->sse_sum / mb64_num;
1542*437bfbebSnyanmisaka }
1543*437bfbebSnyanmisaka
1544*437bfbebSnyanmisaka hal_rc_ret->madi = fb->st_madi;
1545*437bfbebSnyanmisaka hal_rc_ret->madp = fb->st_madp;
1546*437bfbebSnyanmisaka hal_h265e_leave();
1547*437bfbebSnyanmisaka return MPP_OK;
1548*437bfbebSnyanmisaka }
1549*437bfbebSnyanmisaka
1550*437bfbebSnyanmisaka
1551*437bfbebSnyanmisaka //#define DUMP_DATA
hal_h265e_v540c_wait(void * hal,HalEncTask * task)1552*437bfbebSnyanmisaka MPP_RET hal_h265e_v540c_wait(void *hal, HalEncTask *task)
1553*437bfbebSnyanmisaka {
1554*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
1555*437bfbebSnyanmisaka H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
1556*437bfbebSnyanmisaka HalEncTask *enc_task = task;
1557*437bfbebSnyanmisaka H265eV540cStatusElem *elem = (H265eV540cStatusElem *)ctx->reg_out;
1558*437bfbebSnyanmisaka hal_h265e_enter();
1559*437bfbebSnyanmisaka
1560*437bfbebSnyanmisaka if (enc_task->flags.err) {
1561*437bfbebSnyanmisaka hal_h265e_err("enc_task->flags.err %08x, return early",
1562*437bfbebSnyanmisaka enc_task->flags.err);
1563*437bfbebSnyanmisaka return MPP_NOK;
1564*437bfbebSnyanmisaka }
1565*437bfbebSnyanmisaka
1566*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
1567*437bfbebSnyanmisaka
1568*437bfbebSnyanmisaka #ifdef DUMP_DATA
1569*437bfbebSnyanmisaka static FILE *fp_fbd = NULL;
1570*437bfbebSnyanmisaka static FILE *fp_fbh = NULL;
1571*437bfbebSnyanmisaka static FILE *fp_dws = NULL;
1572*437bfbebSnyanmisaka HalBuf *recon_buf;
1573*437bfbebSnyanmisaka static RK_U32 frm_num = 0;
1574*437bfbebSnyanmisaka H265eSyntax_new *syn = (H265eSyntax_new *)enc_task->syntax.data;
1575*437bfbebSnyanmisaka recon_buf = hal_bufs_get_buf(ctx->dpb_bufs, syn->sp.recon_pic.slot_idx);
1576*437bfbebSnyanmisaka char file_name[20] = "";
1577*437bfbebSnyanmisaka size_t rec_size = mpp_buffer_get_size(recon_buf->buf[0]);
1578*437bfbebSnyanmisaka size_t dws_size = mpp_buffer_get_size(recon_buf->buf[1]);
1579*437bfbebSnyanmisaka
1580*437bfbebSnyanmisaka void *ptr = mpp_buffer_get_ptr(recon_buf->buf[0]);
1581*437bfbebSnyanmisaka void *dws_ptr = mpp_buffer_get_ptr(recon_buf->buf[1]);
1582*437bfbebSnyanmisaka
1583*437bfbebSnyanmisaka sprintf(&file_name[0], "fbd%d.bin", frm_num);
1584*437bfbebSnyanmisaka if (fp_fbd != NULL) {
1585*437bfbebSnyanmisaka fclose(fp_fbd);
1586*437bfbebSnyanmisaka fp_fbd = NULL;
1587*437bfbebSnyanmisaka } else {
1588*437bfbebSnyanmisaka fp_fbd = fopen(file_name, "wb+");
1589*437bfbebSnyanmisaka }
1590*437bfbebSnyanmisaka if (fp_fbd) {
1591*437bfbebSnyanmisaka fwrite(ptr + ctx->fbc_header_len, 1, rec_size - ctx->fbc_header_len, fp_fbd);
1592*437bfbebSnyanmisaka fflush(fp_fbd);
1593*437bfbebSnyanmisaka }
1594*437bfbebSnyanmisaka
1595*437bfbebSnyanmisaka sprintf(&file_name[0], "fbh%d.bin", frm_num);
1596*437bfbebSnyanmisaka
1597*437bfbebSnyanmisaka if (fp_fbh != NULL) {
1598*437bfbebSnyanmisaka fclose(fp_fbh);
1599*437bfbebSnyanmisaka fp_fbh = NULL;
1600*437bfbebSnyanmisaka } else {
1601*437bfbebSnyanmisaka fp_fbh = fopen(file_name, "wb+");
1602*437bfbebSnyanmisaka }
1603*437bfbebSnyanmisaka
1604*437bfbebSnyanmisaka if (fp_fbh) {
1605*437bfbebSnyanmisaka fwrite(ptr , 1, ctx->fbc_header_len, fp_fbh);
1606*437bfbebSnyanmisaka fflush(fp_fbh);
1607*437bfbebSnyanmisaka }
1608*437bfbebSnyanmisaka
1609*437bfbebSnyanmisaka
1610*437bfbebSnyanmisaka sprintf(&file_name[0], "dws%d.bin", frm_num);
1611*437bfbebSnyanmisaka
1612*437bfbebSnyanmisaka if (fp_dws != NULL) {
1613*437bfbebSnyanmisaka fclose(fp_dws);
1614*437bfbebSnyanmisaka fp_dws = NULL;
1615*437bfbebSnyanmisaka } else {
1616*437bfbebSnyanmisaka fp_dws = fopen(file_name, "wb+");
1617*437bfbebSnyanmisaka }
1618*437bfbebSnyanmisaka
1619*437bfbebSnyanmisaka if (fp_dws) {
1620*437bfbebSnyanmisaka fwrite(dws_ptr , 1, dws_size, fp_dws);
1621*437bfbebSnyanmisaka fflush(fp_dws);
1622*437bfbebSnyanmisaka }
1623*437bfbebSnyanmisaka frm_num++;
1624*437bfbebSnyanmisaka #endif
1625*437bfbebSnyanmisaka if (ret)
1626*437bfbebSnyanmisaka mpp_err_f("poll cmd failed %d status %d \n", ret, elem->hw_status.val);
1627*437bfbebSnyanmisaka
1628*437bfbebSnyanmisaka hal_h265e_leave();
1629*437bfbebSnyanmisaka return ret;
1630*437bfbebSnyanmisaka }
1631*437bfbebSnyanmisaka
hal_h265e_v540c_get_task(void * hal,HalEncTask * task)1632*437bfbebSnyanmisaka MPP_RET hal_h265e_v540c_get_task(void *hal, HalEncTask *task)
1633*437bfbebSnyanmisaka {
1634*437bfbebSnyanmisaka H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
1635*437bfbebSnyanmisaka MppFrame frame = task->frame;
1636*437bfbebSnyanmisaka EncFrmStatus *frm_status = &task->rc_task->frm;
1637*437bfbebSnyanmisaka
1638*437bfbebSnyanmisaka hal_h265e_enter();
1639*437bfbebSnyanmisaka
1640*437bfbebSnyanmisaka if (vepu540c_h265_setup_hal_bufs(ctx)) {
1641*437bfbebSnyanmisaka hal_h265e_err("vepu541_h265_allocate_buffers failed, free buffers and return\n");
1642*437bfbebSnyanmisaka task->flags.err |= HAL_ENC_TASK_ERR_ALLOC;
1643*437bfbebSnyanmisaka return MPP_ERR_MALLOC;
1644*437bfbebSnyanmisaka }
1645*437bfbebSnyanmisaka
1646*437bfbebSnyanmisaka ctx->last_frame_type = ctx->frame_type;
1647*437bfbebSnyanmisaka if (frm_status->is_intra) {
1648*437bfbebSnyanmisaka ctx->frame_type = INTRA_FRAME;
1649*437bfbebSnyanmisaka } else {
1650*437bfbebSnyanmisaka ctx->frame_type = INTER_P_FRAME;
1651*437bfbebSnyanmisaka }
1652*437bfbebSnyanmisaka if (!frm_status->reencode && mpp_frame_has_meta(task->frame)) {
1653*437bfbebSnyanmisaka MppMeta meta = mpp_frame_get_meta(frame);
1654*437bfbebSnyanmisaka
1655*437bfbebSnyanmisaka mpp_meta_get_ptr(meta, KEY_ROI_DATA, (void **)&ctx->roi_data);
1656*437bfbebSnyanmisaka }
1657*437bfbebSnyanmisaka memset(&ctx->feedback, 0, sizeof(vepu540c_h265_fbk));
1658*437bfbebSnyanmisaka
1659*437bfbebSnyanmisaka hal_h265e_leave();
1660*437bfbebSnyanmisaka return MPP_OK;
1661*437bfbebSnyanmisaka }
1662*437bfbebSnyanmisaka
hal_h265e_v540c_ret_task(void * hal,HalEncTask * task)1663*437bfbebSnyanmisaka MPP_RET hal_h265e_v540c_ret_task(void *hal, HalEncTask *task)
1664*437bfbebSnyanmisaka {
1665*437bfbebSnyanmisaka H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
1666*437bfbebSnyanmisaka HalEncTask *enc_task = task;
1667*437bfbebSnyanmisaka vepu540c_h265_fbk *fb = &ctx->feedback;
1668*437bfbebSnyanmisaka EncRcTaskInfo *rc_info = &task->rc_task->info;
1669*437bfbebSnyanmisaka RK_U32 offset = mpp_packet_get_length(enc_task->packet);
1670*437bfbebSnyanmisaka
1671*437bfbebSnyanmisaka hal_h265e_enter();
1672*437bfbebSnyanmisaka
1673*437bfbebSnyanmisaka vepu540c_h265_set_feedback(ctx, enc_task);
1674*437bfbebSnyanmisaka mpp_buffer_sync_partial_begin(enc_task->output, offset, fb->out_strm_size);
1675*437bfbebSnyanmisaka hal_h265e_amend_temporal_id(task, fb->out_strm_size);
1676*437bfbebSnyanmisaka
1677*437bfbebSnyanmisaka rc_info->sse = fb->sse_sum;
1678*437bfbebSnyanmisaka rc_info->lvl64_inter_num = fb->st_lvl64_inter_num;
1679*437bfbebSnyanmisaka rc_info->lvl32_inter_num = fb->st_lvl32_inter_num;
1680*437bfbebSnyanmisaka rc_info->lvl16_inter_num = fb->st_lvl16_inter_num;
1681*437bfbebSnyanmisaka rc_info->lvl8_inter_num = fb->st_lvl8_inter_num;
1682*437bfbebSnyanmisaka rc_info->lvl32_intra_num = fb->st_lvl32_intra_num;
1683*437bfbebSnyanmisaka rc_info->lvl16_intra_num = fb->st_lvl16_intra_num;
1684*437bfbebSnyanmisaka rc_info->lvl8_intra_num = fb->st_lvl8_intra_num;
1685*437bfbebSnyanmisaka rc_info->lvl4_intra_num = fb->st_lvl4_intra_num;
1686*437bfbebSnyanmisaka
1687*437bfbebSnyanmisaka enc_task->hw_length = fb->out_strm_size;
1688*437bfbebSnyanmisaka enc_task->length += fb->out_strm_size;
1689*437bfbebSnyanmisaka
1690*437bfbebSnyanmisaka hal_h265e_dbg_detail("output stream size %d\n", fb->out_strm_size);
1691*437bfbebSnyanmisaka
1692*437bfbebSnyanmisaka hal_h265e_leave();
1693*437bfbebSnyanmisaka return MPP_OK;
1694*437bfbebSnyanmisaka }
1695*437bfbebSnyanmisaka
1696*437bfbebSnyanmisaka const MppEncHalApi hal_h265e_vepu540c = {
1697*437bfbebSnyanmisaka "hal_h265e_v540c",
1698*437bfbebSnyanmisaka MPP_VIDEO_CodingHEVC,
1699*437bfbebSnyanmisaka sizeof(H265eV540cHalContext),
1700*437bfbebSnyanmisaka 0,
1701*437bfbebSnyanmisaka hal_h265e_v540c_init,
1702*437bfbebSnyanmisaka hal_h265e_v540c_deinit,
1703*437bfbebSnyanmisaka hal_h265e_vepu540c_prepare,
1704*437bfbebSnyanmisaka hal_h265e_v540c_get_task,
1705*437bfbebSnyanmisaka hal_h265e_v540c_gen_regs,
1706*437bfbebSnyanmisaka hal_h265e_v540c_start,
1707*437bfbebSnyanmisaka hal_h265e_v540c_wait,
1708*437bfbebSnyanmisaka NULL,
1709*437bfbebSnyanmisaka NULL,
1710*437bfbebSnyanmisaka hal_h265e_v540c_ret_task,
1711*437bfbebSnyanmisaka };
1712