1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka * Copyright 2015 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_v541"
18*437bfbebSnyanmisaka
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka #include <math.h>
21*437bfbebSnyanmisaka #include <limits.h>
22*437bfbebSnyanmisaka
23*437bfbebSnyanmisaka #include "mpp_env.h"
24*437bfbebSnyanmisaka #include "mpp_mem.h"
25*437bfbebSnyanmisaka #include "mpp_soc.h"
26*437bfbebSnyanmisaka #include "mpp_common.h"
27*437bfbebSnyanmisaka #include "mpp_device.h"
28*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
29*437bfbebSnyanmisaka
30*437bfbebSnyanmisaka #include "h265e_syntax_new.h"
31*437bfbebSnyanmisaka #include "hal_h265e_debug.h"
32*437bfbebSnyanmisaka #include "hal_h265e_stream_amend.h"
33*437bfbebSnyanmisaka #include "hal_h265e_vepu541_reg.h"
34*437bfbebSnyanmisaka #include "hal_h265e_vepu54x_reg_l2.h"
35*437bfbebSnyanmisaka #include "vepu541_common.h"
36*437bfbebSnyanmisaka #include "vepu5xx_common.h"
37*437bfbebSnyanmisaka #include "rkv_enc_def.h"
38*437bfbebSnyanmisaka #include "mpp_enc_hal.h"
39*437bfbebSnyanmisaka #include "hal_bufs.h"
40*437bfbebSnyanmisaka #include "mpp_enc_ref.h"
41*437bfbebSnyanmisaka
42*437bfbebSnyanmisaka #define hal_h265e_err(fmt, ...) \
43*437bfbebSnyanmisaka do {\
44*437bfbebSnyanmisaka mpp_err_f(fmt, ## __VA_ARGS__);\
45*437bfbebSnyanmisaka } while (0)
46*437bfbebSnyanmisaka #define VEPU541_L2_SIZE 768
47*437bfbebSnyanmisaka
48*437bfbebSnyanmisaka #define TILE_BUF_SIZE MPP_ALIGN(128 * 1024, 256)
49*437bfbebSnyanmisaka
50*437bfbebSnyanmisaka typedef struct vepu541_h265_fbk_t {
51*437bfbebSnyanmisaka RK_U32 hw_status; /* 0:corret, 1:error */
52*437bfbebSnyanmisaka RK_U32 qp_sum;
53*437bfbebSnyanmisaka RK_U32 out_strm_size;
54*437bfbebSnyanmisaka RK_U32 out_hw_strm_size;
55*437bfbebSnyanmisaka RK_S64 sse_sum;
56*437bfbebSnyanmisaka RK_U32 st_lvl64_inter_num;
57*437bfbebSnyanmisaka RK_U32 st_lvl32_inter_num;
58*437bfbebSnyanmisaka RK_U32 st_lvl16_inter_num;
59*437bfbebSnyanmisaka RK_U32 st_lvl8_inter_num;
60*437bfbebSnyanmisaka RK_U32 st_lvl32_intra_num;
61*437bfbebSnyanmisaka RK_U32 st_lvl16_intra_num;
62*437bfbebSnyanmisaka RK_U32 st_lvl8_intra_num;
63*437bfbebSnyanmisaka RK_U32 st_lvl4_intra_num;
64*437bfbebSnyanmisaka RK_U32 st_cu_num_qp[52];
65*437bfbebSnyanmisaka RK_U32 st_madp;
66*437bfbebSnyanmisaka RK_U32 st_madi;
67*437bfbebSnyanmisaka RK_U32 st_mb_num;
68*437bfbebSnyanmisaka RK_U32 st_ctu_num;
69*437bfbebSnyanmisaka } vepu541_h265_fbk;
70*437bfbebSnyanmisaka
71*437bfbebSnyanmisaka typedef struct H265eV541HalContext_t {
72*437bfbebSnyanmisaka MppEncHalApi api;
73*437bfbebSnyanmisaka MppDev dev;
74*437bfbebSnyanmisaka void *regs;
75*437bfbebSnyanmisaka void *l2_regs;
76*437bfbebSnyanmisaka void *reg_out;
77*437bfbebSnyanmisaka
78*437bfbebSnyanmisaka vepu541_h265_fbk feedback;
79*437bfbebSnyanmisaka void *dump_files;
80*437bfbebSnyanmisaka RK_U32 frame_cnt_gen_ready;
81*437bfbebSnyanmisaka
82*437bfbebSnyanmisaka RK_S32 frame_type;
83*437bfbebSnyanmisaka RK_S32 last_frame_type;
84*437bfbebSnyanmisaka
85*437bfbebSnyanmisaka /* @frame_cnt starts from ZERO */
86*437bfbebSnyanmisaka RK_U32 frame_cnt;
87*437bfbebSnyanmisaka Vepu5xxOsdCfg osd_cfg;
88*437bfbebSnyanmisaka MppEncROICfg *roi_data;
89*437bfbebSnyanmisaka MppEncROICfg2 *roi_data2;
90*437bfbebSnyanmisaka Vepu541RoiCfg *roi_buf_tmp;
91*437bfbebSnyanmisaka MppBufferGroup roi_grp;
92*437bfbebSnyanmisaka MppBuffer roi_buf;
93*437bfbebSnyanmisaka RK_U32 roi_buf_size;
94*437bfbebSnyanmisaka MppBuffer qpmap;
95*437bfbebSnyanmisaka
96*437bfbebSnyanmisaka MppEncCfgSet *cfg;
97*437bfbebSnyanmisaka
98*437bfbebSnyanmisaka MppBufferGroup tile_grp;
99*437bfbebSnyanmisaka MppBuffer hw_tile_buf[2];
100*437bfbebSnyanmisaka
101*437bfbebSnyanmisaka RK_U32 enc_mode;
102*437bfbebSnyanmisaka RK_U32 frame_size;
103*437bfbebSnyanmisaka RK_S32 max_buf_cnt;
104*437bfbebSnyanmisaka RK_S32 hdr_status;
105*437bfbebSnyanmisaka void *input_fmt;
106*437bfbebSnyanmisaka RK_U8 *src_buf;
107*437bfbebSnyanmisaka RK_U8 *dst_buf;
108*437bfbebSnyanmisaka RK_S32 buf_size;
109*437bfbebSnyanmisaka RK_U32 frame_num;
110*437bfbebSnyanmisaka HalBufs dpb_bufs;
111*437bfbebSnyanmisaka RK_U32 is_vepu540;
112*437bfbebSnyanmisaka RK_S32 fbc_header_len;
113*437bfbebSnyanmisaka } H265eV541HalContext;
114*437bfbebSnyanmisaka
115*437bfbebSnyanmisaka static RK_U32 aq_thd_default[16] = {
116*437bfbebSnyanmisaka 0, 0, 0, 0,
117*437bfbebSnyanmisaka 3, 3, 5, 5,
118*437bfbebSnyanmisaka 8, 8, 8, 15,
119*437bfbebSnyanmisaka 15, 20, 25, 35
120*437bfbebSnyanmisaka };
121*437bfbebSnyanmisaka
122*437bfbebSnyanmisaka static RK_S32 aq_qp_dealt_default[16] = {
123*437bfbebSnyanmisaka -8, -7, -6, -5,
124*437bfbebSnyanmisaka -4, -3, -2, -1,
125*437bfbebSnyanmisaka 0, 1, 2, 3,
126*437bfbebSnyanmisaka 4, 5, 7, 8,
127*437bfbebSnyanmisaka };
128*437bfbebSnyanmisaka
129*437bfbebSnyanmisaka static RK_U16 lvl32_intra_cst_thd[4] = {2, 6, 16, 36};
130*437bfbebSnyanmisaka
131*437bfbebSnyanmisaka static RK_U16 lvl16_intra_cst_thd[4] = {2, 6, 16, 36};
132*437bfbebSnyanmisaka
133*437bfbebSnyanmisaka static RK_U8 lvl32_intra_cst_wgt[8] = {23, 22, 21, 20, 22, 24, 26};
134*437bfbebSnyanmisaka
135*437bfbebSnyanmisaka static RK_U8 lvl16_intra_cst_wgt[8] = {17, 17, 17, 18, 17, 18, 18};
136*437bfbebSnyanmisaka
137*437bfbebSnyanmisaka static RK_U16 atr_thd[4] = {0, 0, 0, 0};
138*437bfbebSnyanmisaka
139*437bfbebSnyanmisaka static RK_U8 lvl16_4_atr_wgt[12] = {0};
140*437bfbebSnyanmisaka
141*437bfbebSnyanmisaka //RK_U16 atf_thd[14] = {0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 16, 16, 16, 16}; /*thd 4, sad 4, wgt 6*/
142*437bfbebSnyanmisaka static RK_U16 atf_thd[14] = {4, 36, 4, 36, 4, 36, 4, 36, 0, 4, 22, 22, 22, 22}; /*thd 4, sad 4, wgt 6*/
143*437bfbebSnyanmisaka
144*437bfbebSnyanmisaka static RK_U16 atf_sad_ofst[4] = {0, 0, 0, 0};
145*437bfbebSnyanmisaka
vepu54x_h265_setup_hal_bufs(H265eV541HalContext * ctx)146*437bfbebSnyanmisaka static MPP_RET vepu54x_h265_setup_hal_bufs(H265eV541HalContext *ctx)
147*437bfbebSnyanmisaka {
148*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
149*437bfbebSnyanmisaka VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
150*437bfbebSnyanmisaka RK_U32 frame_size;
151*437bfbebSnyanmisaka VepuFmt input_fmt = VEPU5xx_FMT_YUV420P;
152*437bfbebSnyanmisaka RK_S32 mb_wd64, mb_h64;
153*437bfbebSnyanmisaka MppEncRefCfg ref_cfg = ctx->cfg->ref_cfg;
154*437bfbebSnyanmisaka MppEncPrepCfg *prep = &ctx->cfg->prep;
155*437bfbebSnyanmisaka RK_S32 old_max_cnt = ctx->max_buf_cnt;
156*437bfbebSnyanmisaka RK_S32 new_max_cnt = 2;
157*437bfbebSnyanmisaka
158*437bfbebSnyanmisaka hal_h265e_enter();
159*437bfbebSnyanmisaka
160*437bfbebSnyanmisaka mb_wd64 = (prep->width + 63) / 64;
161*437bfbebSnyanmisaka mb_h64 = (prep->height + 63) / 64 + 1;
162*437bfbebSnyanmisaka
163*437bfbebSnyanmisaka frame_size = MPP_ALIGN(prep->width, 16) * MPP_ALIGN(prep->height, 16);
164*437bfbebSnyanmisaka vepu5xx_set_fmt(fmt, ctx->cfg->prep.format);
165*437bfbebSnyanmisaka input_fmt = (VepuFmt)fmt->format;
166*437bfbebSnyanmisaka switch (input_fmt) {
167*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV400:
168*437bfbebSnyanmisaka break;
169*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420P:
170*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420SP: {
171*437bfbebSnyanmisaka frame_size = frame_size * 3 / 2;
172*437bfbebSnyanmisaka } break;
173*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422P:
174*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422SP:
175*437bfbebSnyanmisaka case VEPU5xx_FMT_YUYV422:
176*437bfbebSnyanmisaka case VEPU5xx_FMT_UYVY422:
177*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR565: {
178*437bfbebSnyanmisaka frame_size *= 2;
179*437bfbebSnyanmisaka } break;
180*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR888: {
181*437bfbebSnyanmisaka frame_size *= 3;
182*437bfbebSnyanmisaka } break;
183*437bfbebSnyanmisaka case VEPU5xx_FMT_BGRA8888: {
184*437bfbebSnyanmisaka frame_size *= 4;
185*437bfbebSnyanmisaka } break;
186*437bfbebSnyanmisaka default: {
187*437bfbebSnyanmisaka hal_h265e_err("invalid src color space: %d\n", input_fmt);
188*437bfbebSnyanmisaka return MPP_NOK;
189*437bfbebSnyanmisaka }
190*437bfbebSnyanmisaka }
191*437bfbebSnyanmisaka
192*437bfbebSnyanmisaka if (ref_cfg) {
193*437bfbebSnyanmisaka MppEncCpbInfo *info = mpp_enc_ref_cfg_get_cpb_info(ref_cfg);
194*437bfbebSnyanmisaka new_max_cnt = MPP_MAX(new_max_cnt, info->dpb_size + 1);
195*437bfbebSnyanmisaka }
196*437bfbebSnyanmisaka
197*437bfbebSnyanmisaka if (frame_size > ctx->frame_size || new_max_cnt > old_max_cnt) {
198*437bfbebSnyanmisaka size_t size[3] = {0};
199*437bfbebSnyanmisaka
200*437bfbebSnyanmisaka hal_bufs_deinit(ctx->dpb_bufs);
201*437bfbebSnyanmisaka hal_bufs_init(&ctx->dpb_bufs);
202*437bfbebSnyanmisaka
203*437bfbebSnyanmisaka ctx->fbc_header_len = MPP_ALIGN(((mb_wd64 * mb_h64) << 6), SZ_8K);
204*437bfbebSnyanmisaka size[0] = ctx->fbc_header_len + ((mb_wd64 * mb_h64) << 12) * 3 / 2; //fbc_h + fbc_b
205*437bfbebSnyanmisaka size[1] = (mb_wd64 * mb_h64 << 8);
206*437bfbebSnyanmisaka size[2] = MPP_ALIGN(mb_wd64 * mb_h64 * 16 * 4, 256);
207*437bfbebSnyanmisaka new_max_cnt = MPP_MAX(new_max_cnt, old_max_cnt);
208*437bfbebSnyanmisaka
209*437bfbebSnyanmisaka hal_h265e_dbg_detail("frame size %d -> %d max count %d -> %d\n",
210*437bfbebSnyanmisaka ctx->frame_size, frame_size, old_max_cnt, new_max_cnt);
211*437bfbebSnyanmisaka
212*437bfbebSnyanmisaka hal_bufs_setup(ctx->dpb_bufs, new_max_cnt, 3, size);
213*437bfbebSnyanmisaka
214*437bfbebSnyanmisaka ctx->frame_size = frame_size;
215*437bfbebSnyanmisaka ctx->max_buf_cnt = new_max_cnt;
216*437bfbebSnyanmisaka }
217*437bfbebSnyanmisaka hal_h265e_leave();
218*437bfbebSnyanmisaka return ret;
219*437bfbebSnyanmisaka }
220*437bfbebSnyanmisaka
vepu540_h265_set_l2_regs(H265eV54xL2RegSet * reg)221*437bfbebSnyanmisaka static void vepu540_h265_set_l2_regs(H265eV54xL2RegSet *reg)
222*437bfbebSnyanmisaka {
223*437bfbebSnyanmisaka reg->pre_intra_cla0_B0.pre_intra_cla0_m0 = 10;
224*437bfbebSnyanmisaka reg->pre_intra_cla0_B0.pre_intra_cla0_m1 = 11;
225*437bfbebSnyanmisaka reg->pre_intra_cla0_B0.pre_intra_cla0_m2 = 12;
226*437bfbebSnyanmisaka reg->pre_intra_cla0_B0.pre_intra_cla0_m3 = 13;
227*437bfbebSnyanmisaka reg->pre_intra_cla0_B0.pre_intra_cla0_m4 = 14;
228*437bfbebSnyanmisaka reg->pre_intra_cla0_B1.pre_intra_cla0_m5 = 9;
229*437bfbebSnyanmisaka reg->pre_intra_cla0_B1.pre_intra_cla0_m6 = 15;
230*437bfbebSnyanmisaka reg->pre_intra_cla0_B1.pre_intra_cla0_m7 = 8;
231*437bfbebSnyanmisaka reg->pre_intra_cla0_B1.pre_intra_cla0_m8 = 16;
232*437bfbebSnyanmisaka reg->pre_intra_cla0_B1.pre_intra_cla0_m9 = 7;
233*437bfbebSnyanmisaka
234*437bfbebSnyanmisaka reg->pre_intra_cla1_B0.pre_intra_cla1_m0 = 10;
235*437bfbebSnyanmisaka reg->pre_intra_cla1_B0.pre_intra_cla1_m1 = 9;
236*437bfbebSnyanmisaka reg->pre_intra_cla1_B0.pre_intra_cla1_m2 = 8;
237*437bfbebSnyanmisaka reg->pre_intra_cla1_B0.pre_intra_cla1_m3 = 7;
238*437bfbebSnyanmisaka reg->pre_intra_cla1_B0.pre_intra_cla1_m4 = 6;
239*437bfbebSnyanmisaka reg->pre_intra_cla1_B1.pre_intra_cla1_m5 = 11;
240*437bfbebSnyanmisaka reg->pre_intra_cla1_B1.pre_intra_cla1_m6 = 5;
241*437bfbebSnyanmisaka reg->pre_intra_cla1_B1.pre_intra_cla1_m7 = 12;
242*437bfbebSnyanmisaka reg->pre_intra_cla1_B1.pre_intra_cla1_m8 = 4;
243*437bfbebSnyanmisaka reg->pre_intra_cla1_B1.pre_intra_cla1_m9 = 13;
244*437bfbebSnyanmisaka
245*437bfbebSnyanmisaka reg->pre_intra_cla2_B0.pre_intra_cla2_m0 = 18;
246*437bfbebSnyanmisaka reg->pre_intra_cla2_B0.pre_intra_cla2_m1 = 17;
247*437bfbebSnyanmisaka reg->pre_intra_cla2_B0.pre_intra_cla2_m2 = 16;
248*437bfbebSnyanmisaka reg->pre_intra_cla2_B0.pre_intra_cla2_m3 = 15;
249*437bfbebSnyanmisaka reg->pre_intra_cla2_B0.pre_intra_cla2_m4 = 14;
250*437bfbebSnyanmisaka reg->pre_intra_cla2_B1.pre_intra_cla2_m5 = 19;
251*437bfbebSnyanmisaka reg->pre_intra_cla2_B1.pre_intra_cla2_m6 = 13;
252*437bfbebSnyanmisaka reg->pre_intra_cla2_B1.pre_intra_cla2_m7 = 20;
253*437bfbebSnyanmisaka reg->pre_intra_cla2_B1.pre_intra_cla2_m8 = 12;
254*437bfbebSnyanmisaka reg->pre_intra_cla2_B1.pre_intra_cla2_m9 = 21;
255*437bfbebSnyanmisaka
256*437bfbebSnyanmisaka reg->pre_intra_cla3_B0.pre_intra_cla3_m0 = 18;
257*437bfbebSnyanmisaka reg->pre_intra_cla3_B0.pre_intra_cla3_m1 = 19;
258*437bfbebSnyanmisaka reg->pre_intra_cla3_B0.pre_intra_cla3_m2 = 20;
259*437bfbebSnyanmisaka reg->pre_intra_cla3_B0.pre_intra_cla3_m3 = 21;
260*437bfbebSnyanmisaka reg->pre_intra_cla3_B0.pre_intra_cla3_m4 = 22;
261*437bfbebSnyanmisaka reg->pre_intra_cla3_B1.pre_intra_cla3_m5 = 17;
262*437bfbebSnyanmisaka reg->pre_intra_cla3_B1.pre_intra_cla3_m6 = 23;
263*437bfbebSnyanmisaka reg->pre_intra_cla3_B1.pre_intra_cla3_m7 = 16;
264*437bfbebSnyanmisaka reg->pre_intra_cla3_B1.pre_intra_cla3_m8 = 24;
265*437bfbebSnyanmisaka reg->pre_intra_cla3_B1.pre_intra_cla3_m9 = 15;
266*437bfbebSnyanmisaka
267*437bfbebSnyanmisaka reg->pre_intra_cla4_B0.pre_intra_cla4_m0 = 25;
268*437bfbebSnyanmisaka reg->pre_intra_cla4_B0.pre_intra_cla4_m1 = 26;
269*437bfbebSnyanmisaka reg->pre_intra_cla4_B0.pre_intra_cla4_m2 = 24;
270*437bfbebSnyanmisaka reg->pre_intra_cla4_B0.pre_intra_cla4_m3 = 23;
271*437bfbebSnyanmisaka reg->pre_intra_cla4_B0.pre_intra_cla4_m4 = 22;
272*437bfbebSnyanmisaka reg->pre_intra_cla4_B1.pre_intra_cla4_m5 = 27;
273*437bfbebSnyanmisaka reg->pre_intra_cla4_B1.pre_intra_cla4_m6 = 21;
274*437bfbebSnyanmisaka reg->pre_intra_cla4_B1.pre_intra_cla4_m7 = 28;
275*437bfbebSnyanmisaka reg->pre_intra_cla4_B1.pre_intra_cla4_m8 = 20;
276*437bfbebSnyanmisaka reg->pre_intra_cla4_B1.pre_intra_cla4_m9 = 29;
277*437bfbebSnyanmisaka ;
278*437bfbebSnyanmisaka reg->pre_intra_cla5_B0.pre_intra_cla5_m0 = 27;
279*437bfbebSnyanmisaka reg->pre_intra_cla5_B0.pre_intra_cla5_m1 = 26;
280*437bfbebSnyanmisaka reg->pre_intra_cla5_B0.pre_intra_cla5_m2 = 28;
281*437bfbebSnyanmisaka reg->pre_intra_cla5_B0.pre_intra_cla5_m3 = 29;
282*437bfbebSnyanmisaka reg->pre_intra_cla5_B0.pre_intra_cla5_m4 = 30;
283*437bfbebSnyanmisaka reg->pre_intra_cla5_B1.pre_intra_cla5_m5 = 25;
284*437bfbebSnyanmisaka reg->pre_intra_cla5_B1.pre_intra_cla5_m6 = 31;
285*437bfbebSnyanmisaka reg->pre_intra_cla5_B1.pre_intra_cla5_m7 = 24;
286*437bfbebSnyanmisaka reg->pre_intra_cla5_B1.pre_intra_cla5_m8 = 32;
287*437bfbebSnyanmisaka reg->pre_intra_cla5_B1.pre_intra_cla5_m9 = 23;
288*437bfbebSnyanmisaka ;
289*437bfbebSnyanmisaka reg->pre_intra_cla6_B0.pre_intra_cla6_m0 = 34;
290*437bfbebSnyanmisaka reg->pre_intra_cla6_B0.pre_intra_cla6_m1 = 33;
291*437bfbebSnyanmisaka reg->pre_intra_cla6_B0.pre_intra_cla6_m2 = 32;
292*437bfbebSnyanmisaka reg->pre_intra_cla6_B0.pre_intra_cla6_m3 = 31;
293*437bfbebSnyanmisaka reg->pre_intra_cla6_B0.pre_intra_cla6_m4 = 30;
294*437bfbebSnyanmisaka reg->pre_intra_cla6_B1.pre_intra_cla6_m5 = 2 ;
295*437bfbebSnyanmisaka reg->pre_intra_cla6_B1.pre_intra_cla6_m6 = 29;
296*437bfbebSnyanmisaka reg->pre_intra_cla6_B1.pre_intra_cla6_m7 = 3 ;
297*437bfbebSnyanmisaka reg->pre_intra_cla6_B1.pre_intra_cla6_m8 = 28;
298*437bfbebSnyanmisaka reg->pre_intra_cla6_B1.pre_intra_cla6_m9 = 4 ;
299*437bfbebSnyanmisaka ;
300*437bfbebSnyanmisaka reg->pre_intra_cla7_B0.pre_intra_cla7_m0 = 34;
301*437bfbebSnyanmisaka reg->pre_intra_cla7_B0.pre_intra_cla7_m1 = 2 ;
302*437bfbebSnyanmisaka reg->pre_intra_cla7_B0.pre_intra_cla7_m2 = 3 ;
303*437bfbebSnyanmisaka reg->pre_intra_cla7_B0.pre_intra_cla7_m3 = 4 ;
304*437bfbebSnyanmisaka reg->pre_intra_cla7_B0.pre_intra_cla7_m4 = 5 ;
305*437bfbebSnyanmisaka reg->pre_intra_cla7_B1.pre_intra_cla7_m5 = 33;
306*437bfbebSnyanmisaka reg->pre_intra_cla7_B1.pre_intra_cla7_m6 = 6 ;
307*437bfbebSnyanmisaka reg->pre_intra_cla7_B1.pre_intra_cla7_m7 = 32;
308*437bfbebSnyanmisaka reg->pre_intra_cla7_B1.pre_intra_cla7_m8 = 7 ;
309*437bfbebSnyanmisaka reg->pre_intra_cla7_B1.pre_intra_cla7_m9 = 31;
310*437bfbebSnyanmisaka ;
311*437bfbebSnyanmisaka reg->pre_intra_cla8_B0.pre_intra_cla8_m0 = 10;
312*437bfbebSnyanmisaka reg->pre_intra_cla8_B0.pre_intra_cla8_m1 = 26;
313*437bfbebSnyanmisaka reg->pre_intra_cla8_B0.pre_intra_cla8_m2 = 18;
314*437bfbebSnyanmisaka reg->pre_intra_cla8_B0.pre_intra_cla8_m3 = 34;
315*437bfbebSnyanmisaka reg->pre_intra_cla8_B0.pre_intra_cla8_m4 = 6 ;
316*437bfbebSnyanmisaka reg->pre_intra_cla8_B1.pre_intra_cla8_m5 = 14;
317*437bfbebSnyanmisaka reg->pre_intra_cla8_B1.pre_intra_cla8_m6 = 22;
318*437bfbebSnyanmisaka reg->pre_intra_cla8_B1.pre_intra_cla8_m7 = 30;
319*437bfbebSnyanmisaka reg->pre_intra_cla8_B1.pre_intra_cla8_m8 = 2 ;
320*437bfbebSnyanmisaka reg->pre_intra_cla8_B1.pre_intra_cla8_m9 = 24;
321*437bfbebSnyanmisaka ;
322*437bfbebSnyanmisaka reg->pre_intra_cla9_B0.pre_intra_cla9_m0 = 0 ;
323*437bfbebSnyanmisaka reg->pre_intra_cla9_B0.pre_intra_cla9_m1 = 0 ;
324*437bfbebSnyanmisaka reg->pre_intra_cla9_B0.pre_intra_cla9_m2 = 0 ;
325*437bfbebSnyanmisaka reg->pre_intra_cla9_B0.pre_intra_cla9_m3 = 0 ;
326*437bfbebSnyanmisaka reg->pre_intra_cla9_B0.pre_intra_cla9_m4 = 0 ;
327*437bfbebSnyanmisaka reg->pre_intra_cla9_B1.pre_intra_cla9_m5 = 0 ;
328*437bfbebSnyanmisaka reg->pre_intra_cla9_B1.pre_intra_cla9_m6 = 0 ;
329*437bfbebSnyanmisaka reg->pre_intra_cla9_B1.pre_intra_cla9_m7 = 0 ;
330*437bfbebSnyanmisaka reg->pre_intra_cla9_B1.pre_intra_cla9_m8 = 0 ;
331*437bfbebSnyanmisaka reg->pre_intra_cla9_B1.pre_intra_cla9_m9 = 0 ;
332*437bfbebSnyanmisaka
333*437bfbebSnyanmisaka reg->pre_intra_cla10_B0.pre_intra_cla10_m0 = 0;
334*437bfbebSnyanmisaka reg->pre_intra_cla10_B0.pre_intra_cla10_m1 = 0;
335*437bfbebSnyanmisaka reg->pre_intra_cla10_B0.pre_intra_cla10_m2 = 0;
336*437bfbebSnyanmisaka reg->pre_intra_cla10_B0.pre_intra_cla10_m3 = 0;
337*437bfbebSnyanmisaka reg->pre_intra_cla10_B0.pre_intra_cla10_m4 = 0;
338*437bfbebSnyanmisaka reg->pre_intra_cla10_B1.pre_intra_cla10_m5 = 0;
339*437bfbebSnyanmisaka reg->pre_intra_cla10_B1.pre_intra_cla10_m6 = 0;
340*437bfbebSnyanmisaka reg->pre_intra_cla10_B1.pre_intra_cla10_m7 = 0;
341*437bfbebSnyanmisaka reg->pre_intra_cla10_B1.pre_intra_cla10_m8 = 0;
342*437bfbebSnyanmisaka reg->pre_intra_cla10_B1.pre_intra_cla10_m9 = 0;
343*437bfbebSnyanmisaka
344*437bfbebSnyanmisaka reg->pre_intra_cla11_B0.pre_intra_cla11_m0 = 0;
345*437bfbebSnyanmisaka reg->pre_intra_cla11_B0.pre_intra_cla11_m1 = 0;
346*437bfbebSnyanmisaka reg->pre_intra_cla11_B0.pre_intra_cla11_m2 = 0;
347*437bfbebSnyanmisaka reg->pre_intra_cla11_B0.pre_intra_cla11_m3 = 0;
348*437bfbebSnyanmisaka reg->pre_intra_cla11_B0.pre_intra_cla11_m4 = 0;
349*437bfbebSnyanmisaka reg->pre_intra_cla11_B1.pre_intra_cla11_m5 = 0;
350*437bfbebSnyanmisaka reg->pre_intra_cla11_B1.pre_intra_cla11_m6 = 0;
351*437bfbebSnyanmisaka reg->pre_intra_cla11_B1.pre_intra_cla11_m7 = 0;
352*437bfbebSnyanmisaka reg->pre_intra_cla11_B1.pre_intra_cla11_m8 = 0;
353*437bfbebSnyanmisaka reg->pre_intra_cla11_B1.pre_intra_cla11_m9 = 0;
354*437bfbebSnyanmisaka
355*437bfbebSnyanmisaka reg->pre_intra_cla12_B0.pre_intra_cla12_m0 = 0;
356*437bfbebSnyanmisaka reg->pre_intra_cla12_B0.pre_intra_cla12_m1 = 0;
357*437bfbebSnyanmisaka reg->pre_intra_cla12_B0.pre_intra_cla12_m2 = 0;
358*437bfbebSnyanmisaka reg->pre_intra_cla12_B0.pre_intra_cla12_m3 = 0;
359*437bfbebSnyanmisaka reg->pre_intra_cla12_B0.pre_intra_cla12_m4 = 0;
360*437bfbebSnyanmisaka reg->pre_intra_cla12_B1.pre_intra_cla12_m5 = 0;
361*437bfbebSnyanmisaka reg->pre_intra_cla12_B1.pre_intra_cla12_m6 = 0;
362*437bfbebSnyanmisaka reg->pre_intra_cla12_B1.pre_intra_cla12_m7 = 0;
363*437bfbebSnyanmisaka reg->pre_intra_cla12_B1.pre_intra_cla12_m8 = 0;
364*437bfbebSnyanmisaka reg->pre_intra_cla12_B1.pre_intra_cla12_m9 = 0;
365*437bfbebSnyanmisaka
366*437bfbebSnyanmisaka reg->pre_intra_cla13_B0.pre_intra_cla13_m0 = 0;
367*437bfbebSnyanmisaka reg->pre_intra_cla13_B0.pre_intra_cla13_m1 = 0;
368*437bfbebSnyanmisaka reg->pre_intra_cla13_B0.pre_intra_cla13_m2 = 0;
369*437bfbebSnyanmisaka reg->pre_intra_cla13_B0.pre_intra_cla13_m3 = 0;
370*437bfbebSnyanmisaka reg->pre_intra_cla13_B0.pre_intra_cla13_m4 = 0;
371*437bfbebSnyanmisaka reg->pre_intra_cla13_B1.pre_intra_cla13_m5 = 0;
372*437bfbebSnyanmisaka reg->pre_intra_cla13_B1.pre_intra_cla13_m6 = 0;
373*437bfbebSnyanmisaka reg->pre_intra_cla13_B1.pre_intra_cla13_m7 = 0;
374*437bfbebSnyanmisaka reg->pre_intra_cla13_B1.pre_intra_cla13_m8 = 0;
375*437bfbebSnyanmisaka reg->pre_intra_cla13_B1.pre_intra_cla13_m9 = 0;
376*437bfbebSnyanmisaka
377*437bfbebSnyanmisaka reg->pre_intra_cla14_B0.pre_intra_cla14_m0 = 0;
378*437bfbebSnyanmisaka reg->pre_intra_cla14_B0.pre_intra_cla14_m1 = 0;
379*437bfbebSnyanmisaka reg->pre_intra_cla14_B0.pre_intra_cla14_m2 = 0;
380*437bfbebSnyanmisaka reg->pre_intra_cla14_B0.pre_intra_cla14_m3 = 0;
381*437bfbebSnyanmisaka reg->pre_intra_cla14_B0.pre_intra_cla14_m4 = 0;
382*437bfbebSnyanmisaka reg->pre_intra_cla14_B1.pre_intra_cla14_m5 = 0;
383*437bfbebSnyanmisaka reg->pre_intra_cla14_B1.pre_intra_cla14_m6 = 0;
384*437bfbebSnyanmisaka reg->pre_intra_cla14_B1.pre_intra_cla14_m7 = 0;
385*437bfbebSnyanmisaka reg->pre_intra_cla14_B1.pre_intra_cla14_m8 = 0;
386*437bfbebSnyanmisaka reg->pre_intra_cla14_B1.pre_intra_cla14_m9 = 0;
387*437bfbebSnyanmisaka
388*437bfbebSnyanmisaka reg->pre_intra_cla15_B0.pre_intra_cla15_m0 = 0;
389*437bfbebSnyanmisaka reg->pre_intra_cla15_B0.pre_intra_cla15_m1 = 0;
390*437bfbebSnyanmisaka reg->pre_intra_cla15_B0.pre_intra_cla15_m2 = 0;
391*437bfbebSnyanmisaka reg->pre_intra_cla15_B0.pre_intra_cla15_m3 = 0;
392*437bfbebSnyanmisaka reg->pre_intra_cla15_B0.pre_intra_cla15_m4 = 0;
393*437bfbebSnyanmisaka reg->pre_intra_cla15_B1.pre_intra_cla15_m5 = 0;
394*437bfbebSnyanmisaka reg->pre_intra_cla15_B1.pre_intra_cla15_m6 = 0;
395*437bfbebSnyanmisaka reg->pre_intra_cla15_B1.pre_intra_cla15_m7 = 0;
396*437bfbebSnyanmisaka reg->pre_intra_cla15_B1.pre_intra_cla15_m8 = 0;
397*437bfbebSnyanmisaka reg->pre_intra_cla15_B1.pre_intra_cla15_m9 = 0;
398*437bfbebSnyanmisaka
399*437bfbebSnyanmisaka reg->pre_intra_cla16_B0.pre_intra_cla16_m0 = 0;
400*437bfbebSnyanmisaka reg->pre_intra_cla16_B0.pre_intra_cla16_m1 = 0;
401*437bfbebSnyanmisaka reg->pre_intra_cla16_B0.pre_intra_cla16_m2 = 0;
402*437bfbebSnyanmisaka reg->pre_intra_cla16_B0.pre_intra_cla16_m3 = 0;
403*437bfbebSnyanmisaka reg->pre_intra_cla16_B0.pre_intra_cla16_m4 = 0;
404*437bfbebSnyanmisaka reg->pre_intra_cla16_B1.pre_intra_cla16_m5 = 0;
405*437bfbebSnyanmisaka reg->pre_intra_cla16_B1.pre_intra_cla16_m6 = 0;
406*437bfbebSnyanmisaka reg->pre_intra_cla16_B1.pre_intra_cla16_m7 = 0;
407*437bfbebSnyanmisaka reg->pre_intra_cla16_B1.pre_intra_cla16_m8 = 0;
408*437bfbebSnyanmisaka reg->pre_intra_cla16_B1.pre_intra_cla16_m9 = 0;
409*437bfbebSnyanmisaka
410*437bfbebSnyanmisaka reg->i16_sobel_t_hevc.intra_l16_sobel_t0 = 64 ;
411*437bfbebSnyanmisaka reg->i16_sobel_t_hevc.intra_l16_sobel_t1 = 200;
412*437bfbebSnyanmisaka reg->i16_sobel_a_00_hevc.intra_l16_sobel_a0_qp0 = 32 ;
413*437bfbebSnyanmisaka reg->i16_sobel_a_00_hevc.intra_l16_sobel_a0_qp1 = 32 ;
414*437bfbebSnyanmisaka reg->i16_sobel_a_00_hevc.intra_l16_sobel_a0_qp2 = 32 ;
415*437bfbebSnyanmisaka reg->i16_sobel_a_00_hevc.intra_l16_sobel_a0_qp3 = 32 ;
416*437bfbebSnyanmisaka reg->i16_sobel_a_00_hevc.intra_l16_sobel_a0_qp4 = 32 ;
417*437bfbebSnyanmisaka reg->i16_sobel_a_01_hevc.intra_l16_sobel_a0_qp5 = 32 ;
418*437bfbebSnyanmisaka reg->i16_sobel_a_01_hevc.intra_l16_sobel_a0_qp6 = 32 ;
419*437bfbebSnyanmisaka reg->i16_sobel_a_01_hevc.intra_l16_sobel_a0_qp7 = 32 ;
420*437bfbebSnyanmisaka reg->i16_sobel_a_01_hevc.intra_l16_sobel_a0_qp8 = 32 ;
421*437bfbebSnyanmisaka reg->i16_sobel_b_00_hevc.intra_l16_sobel_b0_qp0 = 0 ;
422*437bfbebSnyanmisaka reg->i16_sobel_b_00_hevc.intra_l16_sobel_b0_qp1 = 0 ;
423*437bfbebSnyanmisaka reg->i16_sobel_b_01_hevc.intra_l16_sobel_b0_qp2 = 0 ;
424*437bfbebSnyanmisaka reg->i16_sobel_b_01_hevc.intra_l16_sobel_b0_qp3 = 0 ;
425*437bfbebSnyanmisaka reg->i16_sobel_b_02_hevc.intra_l16_sobel_b0_qp4 = 0 ;
426*437bfbebSnyanmisaka reg->i16_sobel_b_02_hevc.intra_l16_sobel_b0_qp5 = 0 ;
427*437bfbebSnyanmisaka reg->i16_sobel_b_03_hevc.intra_l16_sobel_b0_qp6 = 0 ;
428*437bfbebSnyanmisaka reg->i16_sobel_b_03_hevc.intra_l16_sobel_b0_qp7 = 0 ;
429*437bfbebSnyanmisaka reg->i16_sobel_b_04_hevc.intra_l16_sobel_b0_qp8 = 0 ;
430*437bfbebSnyanmisaka reg->i16_sobel_c_00_hevc.intra_l16_sobel_c0_qp0 = 13;
431*437bfbebSnyanmisaka reg->i16_sobel_c_00_hevc.intra_l16_sobel_c0_qp1 = 13;
432*437bfbebSnyanmisaka reg->i16_sobel_c_00_hevc.intra_l16_sobel_c0_qp2 = 13;
433*437bfbebSnyanmisaka reg->i16_sobel_c_00_hevc.intra_l16_sobel_c0_qp3 = 13;
434*437bfbebSnyanmisaka reg->i16_sobel_c_00_hevc.intra_l16_sobel_c0_qp4 = 13;
435*437bfbebSnyanmisaka reg->i16_sobel_c_01_hevc.intra_l16_sobel_c0_qp5 = 13;
436*437bfbebSnyanmisaka reg->i16_sobel_c_01_hevc.intra_l16_sobel_c0_qp6 = 13;
437*437bfbebSnyanmisaka reg->i16_sobel_c_01_hevc.intra_l16_sobel_c0_qp7 = 13;
438*437bfbebSnyanmisaka reg->i16_sobel_c_01_hevc.intra_l16_sobel_c0_qp8 = 13;
439*437bfbebSnyanmisaka reg->i16_sobel_d_00_hevc.intra_l16_sobel_d0_qp0 = 23750;
440*437bfbebSnyanmisaka reg->i16_sobel_d_00_hevc.intra_l16_sobel_d0_qp1 = 23750;
441*437bfbebSnyanmisaka reg->i16_sobel_d_01_hevc.intra_l16_sobel_d0_qp2 = 23750;
442*437bfbebSnyanmisaka reg->i16_sobel_d_01_hevc.intra_l16_sobel_d0_qp3 = 23750;
443*437bfbebSnyanmisaka reg->i16_sobel_d_02_hevc.intra_l16_sobel_d0_qp4 = 23750;
444*437bfbebSnyanmisaka reg->i16_sobel_d_02_hevc.intra_l16_sobel_d0_qp5 = 23750;
445*437bfbebSnyanmisaka reg->i16_sobel_d_03_hevc.intra_l16_sobel_d0_qp6 = 23750;
446*437bfbebSnyanmisaka reg->i16_sobel_d_03_hevc.intra_l16_sobel_d0_qp7 = 23750;
447*437bfbebSnyanmisaka reg->i16_sobel_d_04_hevc.intra_l16_sobel_d0_qp8 = 23750;
448*437bfbebSnyanmisaka
449*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[0] = 20000;
450*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[2] = 20000;
451*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[4] = 20000;
452*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[6] = 20000;
453*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[8] = 20000;
454*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[10] = 20000;
455*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[12] = 20000;
456*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[14] = 20000;
457*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[16] = 20000;
458*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[1] = 0;
459*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[3] = 0;
460*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[5] = 0;
461*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[7] = 0;
462*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[9] = 0;
463*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[11] = 0;
464*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[13] = 0;
465*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[15] = 0;
466*437bfbebSnyanmisaka reg->i16_sobel_e_00_17_hevc[17] = 0;
467*437bfbebSnyanmisaka
468*437bfbebSnyanmisaka reg->i32_sobel_t_00_hevc.intra_l32_sobel_t2 = 640 ;
469*437bfbebSnyanmisaka reg->i32_sobel_t_00_hevc.intra_l32_sobel_t3 = 0 ;
470*437bfbebSnyanmisaka reg->i32_sobel_t_01_hevc.intra_l32_sobel_t4 = 8 ;
471*437bfbebSnyanmisaka reg->i32_sobel_t_02_hevc.intra_l32_sobel_t5 = 100 ;
472*437bfbebSnyanmisaka reg->i32_sobel_t_02_hevc.intra_l32_sobel_t6 = 100 ;
473*437bfbebSnyanmisaka
474*437bfbebSnyanmisaka reg->i32_sobel_a_hevc.intra_l32_sobel_a1_qp0 = 18;
475*437bfbebSnyanmisaka reg->i32_sobel_a_hevc.intra_l32_sobel_a1_qp1 = 18;
476*437bfbebSnyanmisaka reg->i32_sobel_a_hevc.intra_l32_sobel_a1_qp2 = 18;
477*437bfbebSnyanmisaka reg->i32_sobel_a_hevc.intra_l32_sobel_a1_qp3 = 18;
478*437bfbebSnyanmisaka reg->i32_sobel_a_hevc.intra_l32_sobel_a1_qp4 = 18;
479*437bfbebSnyanmisaka
480*437bfbebSnyanmisaka reg->i32_sobel_b_00_hevc.intra_l32_sobel_b1_qp0 = 0;
481*437bfbebSnyanmisaka reg->i32_sobel_b_00_hevc.intra_l32_sobel_b1_qp1 = 0;
482*437bfbebSnyanmisaka reg->i32_sobel_b_01_hevc.intra_l32_sobel_b1_qp2 = 0;
483*437bfbebSnyanmisaka reg->i32_sobel_b_01_hevc.intra_l32_sobel_b1_qp3 = 0;
484*437bfbebSnyanmisaka reg->i32_sobel_b_02_hevc.intra_l32_sobel_b1_qp4 = 0;
485*437bfbebSnyanmisaka
486*437bfbebSnyanmisaka reg->i32_sobel_c_hevc.intra_l32_sobel_c1_qp0 = 18;
487*437bfbebSnyanmisaka reg->i32_sobel_c_hevc.intra_l32_sobel_c1_qp1 = 18;
488*437bfbebSnyanmisaka reg->i32_sobel_c_hevc.intra_l32_sobel_c1_qp2 = 18;
489*437bfbebSnyanmisaka reg->i32_sobel_c_hevc.intra_l32_sobel_c1_qp3 = 18;
490*437bfbebSnyanmisaka reg->i32_sobel_c_hevc.intra_l32_sobel_c1_qp4 = 18;
491*437bfbebSnyanmisaka
492*437bfbebSnyanmisaka reg->i32_sobel_d_00_hevc.intra_l32_sobel_d1_qp0 = 0;
493*437bfbebSnyanmisaka reg->i32_sobel_d_00_hevc.intra_l32_sobel_d1_qp1 = 0;
494*437bfbebSnyanmisaka reg->i32_sobel_d_01_hevc.intra_l32_sobel_d1_qp2 = 0;
495*437bfbebSnyanmisaka reg->i32_sobel_d_01_hevc.intra_l32_sobel_d1_qp3 = 0;
496*437bfbebSnyanmisaka reg->i32_sobel_d_02_hevc.intra_l32_sobel_d1_qp4 = 0;
497*437bfbebSnyanmisaka
498*437bfbebSnyanmisaka reg->i32_sobel_e_00_09_hevc[0] = 20000;
499*437bfbebSnyanmisaka reg->i32_sobel_e_00_09_hevc[2] = 20000;
500*437bfbebSnyanmisaka reg->i32_sobel_e_00_09_hevc[4] = 20000;
501*437bfbebSnyanmisaka reg->i32_sobel_e_00_09_hevc[6] = 20000;
502*437bfbebSnyanmisaka reg->i32_sobel_e_00_09_hevc[8] = 20000;
503*437bfbebSnyanmisaka
504*437bfbebSnyanmisaka reg->i32_sobel_e_00_09_hevc[1] = 0;
505*437bfbebSnyanmisaka reg->i32_sobel_e_00_09_hevc[3] = 0;
506*437bfbebSnyanmisaka reg->i32_sobel_e_00_09_hevc[5] = 0;
507*437bfbebSnyanmisaka reg->i32_sobel_e_00_09_hevc[7] = 0;
508*437bfbebSnyanmisaka reg->i32_sobel_e_00_09_hevc[9] = 0;
509*437bfbebSnyanmisaka }
vepu541_h265_set_l2_regs(H265eV541HalContext * ctx,H265eV54xL2RegSet * regs)510*437bfbebSnyanmisaka static void vepu541_h265_set_l2_regs(H265eV541HalContext *ctx, H265eV54xL2RegSet *regs)
511*437bfbebSnyanmisaka {
512*437bfbebSnyanmisaka MppEncHwCfg *hw = &ctx->cfg->hw;
513*437bfbebSnyanmisaka RK_U32 i;
514*437bfbebSnyanmisaka
515*437bfbebSnyanmisaka memcpy(®s->lvl32_intra_CST_THD0, lvl32_intra_cst_thd, sizeof(lvl32_intra_cst_thd));
516*437bfbebSnyanmisaka memcpy(®s->lvl16_intra_CST_THD0, lvl16_intra_cst_thd, sizeof(lvl16_intra_cst_thd));
517*437bfbebSnyanmisaka memcpy(®s->lvl32_intra_CST_WGT0, lvl32_intra_cst_wgt, sizeof(lvl32_intra_cst_wgt));
518*437bfbebSnyanmisaka memcpy(®s->lvl16_intra_CST_WGT0, lvl16_intra_cst_wgt, sizeof(lvl16_intra_cst_wgt));
519*437bfbebSnyanmisaka regs->rdo_quant.quant_f_bias_I = 171;
520*437bfbebSnyanmisaka regs->rdo_quant.quant_f_bias_P = 85;
521*437bfbebSnyanmisaka memcpy(®s->atr_thd0, atr_thd, sizeof(atr_thd));
522*437bfbebSnyanmisaka memcpy(®s->lvl16_atr_wgt, lvl16_4_atr_wgt, sizeof(lvl16_4_atr_wgt));
523*437bfbebSnyanmisaka if (!ctx->is_vepu540) {
524*437bfbebSnyanmisaka memcpy(®s->thd_541.atf_thd0, atf_thd, sizeof(atf_thd));
525*437bfbebSnyanmisaka regs->thd_541.atf_thd0.atf_thd0_i32 = 0;
526*437bfbebSnyanmisaka regs->thd_541.atf_thd0.atf_thd1_i32 = 63;
527*437bfbebSnyanmisaka regs->thd_541.atf_thd1.atf_thd0_i16 = 0;
528*437bfbebSnyanmisaka regs->thd_541.atf_thd1.atf_thd1_i16 = 63;
529*437bfbebSnyanmisaka regs->thd_541.atf_sad_thd0.atf_thd0_p64 = 0;
530*437bfbebSnyanmisaka regs->thd_541.atf_sad_thd0.atf_thd1_p64 = 63;
531*437bfbebSnyanmisaka regs->thd_541.atf_sad_thd1.atf_thd0_p32 = 0;
532*437bfbebSnyanmisaka regs->thd_541.atf_sad_thd1.atf_thd1_p32 = 63;
533*437bfbebSnyanmisaka regs->thd_541.atf_sad_wgt0.atf_thd0_p16 = 0;
534*437bfbebSnyanmisaka regs->thd_541.atf_sad_wgt0.atf_thd1_p16 = 63;
535*437bfbebSnyanmisaka } else {
536*437bfbebSnyanmisaka memcpy(®s->thd_540.atf_thd0, atf_thd, sizeof(atf_thd));
537*437bfbebSnyanmisaka regs->thd_540.atf_thd0.atf_thd0_i32 = 0;
538*437bfbebSnyanmisaka regs->thd_540.atf_thd0.atf_thd1_i32 = 63;
539*437bfbebSnyanmisaka regs->thd_540.atf_thd1.atf_thd0_i16 = 0;
540*437bfbebSnyanmisaka regs->thd_540.atf_thd1.atf_thd1_i16 = 63;
541*437bfbebSnyanmisaka regs->thd_540.atf_sad_thd0.atf_thd0_p64 = 0;
542*437bfbebSnyanmisaka regs->thd_540.atf_sad_thd0.atf_thd1_p64 = 63;
543*437bfbebSnyanmisaka regs->thd_540.atf_sad_thd1.atf_thd0_p32 = 0;
544*437bfbebSnyanmisaka regs->thd_540.atf_sad_thd1.atf_thd1_p32 = 63;
545*437bfbebSnyanmisaka regs->thd_540.atf_sad_wgt0.atf_thd0_p16 = 0;
546*437bfbebSnyanmisaka regs->thd_540.atf_sad_wgt0.atf_thd1_p16 = 63;
547*437bfbebSnyanmisaka vepu540_h265_set_l2_regs(regs);
548*437bfbebSnyanmisaka }
549*437bfbebSnyanmisaka
550*437bfbebSnyanmisaka if (ctx->cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC) {
551*437bfbebSnyanmisaka regs->atf_sad_wgt1.atf_wgt_i16 = 19;
552*437bfbebSnyanmisaka regs->atf_sad_wgt1.atf_wgt_i32 = 19;
553*437bfbebSnyanmisaka regs->atf_sad_wgt2.atf_wgt_p32 = 13;
554*437bfbebSnyanmisaka regs->atf_sad_wgt2.atf_wgt_p64 = 13;
555*437bfbebSnyanmisaka regs->atf_sad_ofst0.atf_wgt_p16 = 13;
556*437bfbebSnyanmisaka } else {
557*437bfbebSnyanmisaka regs->atf_sad_wgt1.atf_wgt_i16 = 16;
558*437bfbebSnyanmisaka regs->atf_sad_wgt1.atf_wgt_i32 = 16;
559*437bfbebSnyanmisaka regs->atf_sad_wgt2.atf_wgt_p32 = 16;
560*437bfbebSnyanmisaka regs->atf_sad_wgt2.atf_wgt_p64 = 16;
561*437bfbebSnyanmisaka regs->atf_sad_ofst0.atf_wgt_p16 = 16;
562*437bfbebSnyanmisaka }
563*437bfbebSnyanmisaka
564*437bfbebSnyanmisaka memcpy(®s->atf_sad_ofst1, atf_sad_ofst, sizeof(atf_sad_ofst));
565*437bfbebSnyanmisaka memcpy(®s->lamd_satd_qp[0], lamd_satd_qp, sizeof(lamd_satd_qp));
566*437bfbebSnyanmisaka memcpy(®s->lamd_moda_qp[0], lamd_moda_qp, sizeof(lamd_moda_qp));
567*437bfbebSnyanmisaka memcpy(®s->lamd_modb_qp[0], lamd_modb_qp, sizeof(lamd_modb_qp));
568*437bfbebSnyanmisaka
569*437bfbebSnyanmisaka if (ctx->frame_type == INTRA_FRAME) {
570*437bfbebSnyanmisaka for (i = 0; i < MPP_ARRAY_ELEMS(aq_thd_default); i++) {
571*437bfbebSnyanmisaka regs->aq_tthd[i] = hw->aq_thrd_i[i];
572*437bfbebSnyanmisaka regs->aq_step[i] = hw->aq_step_i[i] & 0x3f;
573*437bfbebSnyanmisaka }
574*437bfbebSnyanmisaka } else {
575*437bfbebSnyanmisaka for (i = 0; i < MPP_ARRAY_ELEMS(aq_thd_default); i++) {
576*437bfbebSnyanmisaka regs->aq_tthd[i] = hw->aq_thrd_p[i];
577*437bfbebSnyanmisaka regs->aq_step[i] = hw->aq_step_p[i] & 0x3f;
578*437bfbebSnyanmisaka }
579*437bfbebSnyanmisaka }
580*437bfbebSnyanmisaka
581*437bfbebSnyanmisaka if (hw->qbias_en) {
582*437bfbebSnyanmisaka regs->rdo_quant.quant_f_bias_I = hw->qbias_i;
583*437bfbebSnyanmisaka regs->rdo_quant.quant_f_bias_P = hw->qbias_p;
584*437bfbebSnyanmisaka }
585*437bfbebSnyanmisaka
586*437bfbebSnyanmisaka MppDevRegWrCfg cfg;
587*437bfbebSnyanmisaka cfg.reg = regs;
588*437bfbebSnyanmisaka if (ctx->is_vepu540) {
589*437bfbebSnyanmisaka cfg.size = sizeof(H265eV54xL2RegSet);
590*437bfbebSnyanmisaka } else {
591*437bfbebSnyanmisaka cfg.size = VEPU541_L2_SIZE ;
592*437bfbebSnyanmisaka }
593*437bfbebSnyanmisaka cfg.offset = VEPU541_REG_BASE_L2;
594*437bfbebSnyanmisaka mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
595*437bfbebSnyanmisaka }
596*437bfbebSnyanmisaka
hal_h265e_v541_init(void * hal,MppEncHalCfg * cfg)597*437bfbebSnyanmisaka MPP_RET hal_h265e_v541_init(void *hal, MppEncHalCfg *cfg)
598*437bfbebSnyanmisaka {
599*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
600*437bfbebSnyanmisaka H265eV541HalContext *ctx = (H265eV541HalContext *)hal;
601*437bfbebSnyanmisaka
602*437bfbebSnyanmisaka mpp_env_get_u32("hal_h265e_debug", &hal_h265e_debug, 0);
603*437bfbebSnyanmisaka hal_h265e_enter();
604*437bfbebSnyanmisaka ctx->reg_out = mpp_calloc(H265eV541IoctlOutputElem, 1);
605*437bfbebSnyanmisaka ctx->regs = mpp_calloc(H265eV541RegSet, 1);
606*437bfbebSnyanmisaka ctx->l2_regs = mpp_calloc(H265eV54xL2RegSet, 1);
607*437bfbebSnyanmisaka ctx->input_fmt = mpp_calloc(VepuFmtCfg, 1);
608*437bfbebSnyanmisaka ctx->cfg = cfg->cfg;
609*437bfbebSnyanmisaka hal_bufs_init(&ctx->dpb_bufs);
610*437bfbebSnyanmisaka
611*437bfbebSnyanmisaka ctx->frame_cnt = 0;
612*437bfbebSnyanmisaka ctx->frame_cnt_gen_ready = 0;
613*437bfbebSnyanmisaka ctx->enc_mode = RKV_ENC_MODE;
614*437bfbebSnyanmisaka cfg->type = VPU_CLIENT_RKVENC;
615*437bfbebSnyanmisaka ret = mpp_dev_init(&cfg->dev, cfg->type);
616*437bfbebSnyanmisaka if (ret) {
617*437bfbebSnyanmisaka mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
618*437bfbebSnyanmisaka return ret;
619*437bfbebSnyanmisaka }
620*437bfbebSnyanmisaka
621*437bfbebSnyanmisaka ctx->dev = cfg->dev;
622*437bfbebSnyanmisaka {
623*437bfbebSnyanmisaka RockchipSocType soc_type = mpp_get_soc_type();
624*437bfbebSnyanmisaka
625*437bfbebSnyanmisaka if (soc_type == ROCKCHIP_SOC_RK3566 || soc_type == ROCKCHIP_SOC_RK3568)
626*437bfbebSnyanmisaka ctx->is_vepu540 = 1;
627*437bfbebSnyanmisaka }
628*437bfbebSnyanmisaka
629*437bfbebSnyanmisaka ctx->osd_cfg.reg_base = ctx->regs;
630*437bfbebSnyanmisaka ctx->osd_cfg.dev = ctx->dev;
631*437bfbebSnyanmisaka ctx->osd_cfg.reg_cfg = NULL;
632*437bfbebSnyanmisaka ctx->osd_cfg.plt_cfg = &ctx->cfg->plt_cfg;
633*437bfbebSnyanmisaka ctx->osd_cfg.osd_data = NULL;
634*437bfbebSnyanmisaka ctx->osd_cfg.osd_data2 = NULL;
635*437bfbebSnyanmisaka
636*437bfbebSnyanmisaka ctx->frame_type = INTRA_FRAME;
637*437bfbebSnyanmisaka
638*437bfbebSnyanmisaka { /* setup default hardware config */
639*437bfbebSnyanmisaka MppEncHwCfg *hw = &cfg->cfg->hw;
640*437bfbebSnyanmisaka
641*437bfbebSnyanmisaka hw->qp_delta_row_i = 0;
642*437bfbebSnyanmisaka hw->qp_delta_row = 1;
643*437bfbebSnyanmisaka hw->qbias_i = 171;
644*437bfbebSnyanmisaka hw->qbias_p = 85;
645*437bfbebSnyanmisaka hw->qbias_en = 0;
646*437bfbebSnyanmisaka
647*437bfbebSnyanmisaka memcpy(hw->aq_thrd_i, aq_thd_default, sizeof(hw->aq_thrd_i));
648*437bfbebSnyanmisaka memcpy(hw->aq_thrd_p, aq_thd_default, sizeof(hw->aq_thrd_p));
649*437bfbebSnyanmisaka memcpy(hw->aq_step_i, aq_qp_dealt_default, sizeof(hw->aq_step_i));
650*437bfbebSnyanmisaka memcpy(hw->aq_step_p, aq_qp_dealt_default, sizeof(hw->aq_step_p));
651*437bfbebSnyanmisaka }
652*437bfbebSnyanmisaka
653*437bfbebSnyanmisaka hal_h265e_leave();
654*437bfbebSnyanmisaka return ret;
655*437bfbebSnyanmisaka }
656*437bfbebSnyanmisaka
hal_h265e_v541_deinit(void * hal)657*437bfbebSnyanmisaka MPP_RET hal_h265e_v541_deinit(void *hal)
658*437bfbebSnyanmisaka {
659*437bfbebSnyanmisaka H265eV541HalContext *ctx = (H265eV541HalContext *)hal;
660*437bfbebSnyanmisaka hal_h265e_enter();
661*437bfbebSnyanmisaka MPP_FREE(ctx->regs);
662*437bfbebSnyanmisaka MPP_FREE(ctx->l2_regs);
663*437bfbebSnyanmisaka MPP_FREE(ctx->reg_out);
664*437bfbebSnyanmisaka MPP_FREE(ctx->input_fmt);
665*437bfbebSnyanmisaka MPP_FREE(ctx->roi_buf_tmp);
666*437bfbebSnyanmisaka
667*437bfbebSnyanmisaka if (ctx->roi_buf) {
668*437bfbebSnyanmisaka mpp_buffer_put(ctx->roi_buf);
669*437bfbebSnyanmisaka ctx->roi_buf = NULL;
670*437bfbebSnyanmisaka }
671*437bfbebSnyanmisaka hal_bufs_deinit(ctx->dpb_bufs);
672*437bfbebSnyanmisaka
673*437bfbebSnyanmisaka if (ctx->roi_grp) {
674*437bfbebSnyanmisaka mpp_buffer_group_put(ctx->roi_grp);
675*437bfbebSnyanmisaka ctx->roi_grp = NULL;
676*437bfbebSnyanmisaka }
677*437bfbebSnyanmisaka
678*437bfbebSnyanmisaka if (ctx->hw_tile_buf[0]) {
679*437bfbebSnyanmisaka mpp_buffer_put(ctx->hw_tile_buf[0]);
680*437bfbebSnyanmisaka ctx->hw_tile_buf[0] = NULL;
681*437bfbebSnyanmisaka }
682*437bfbebSnyanmisaka
683*437bfbebSnyanmisaka if (ctx->hw_tile_buf[1]) {
684*437bfbebSnyanmisaka mpp_buffer_put(ctx->hw_tile_buf[1]);
685*437bfbebSnyanmisaka ctx->hw_tile_buf[1] = NULL;
686*437bfbebSnyanmisaka }
687*437bfbebSnyanmisaka
688*437bfbebSnyanmisaka if (ctx->tile_grp) {
689*437bfbebSnyanmisaka mpp_buffer_group_put(ctx->tile_grp);
690*437bfbebSnyanmisaka ctx->tile_grp = NULL;
691*437bfbebSnyanmisaka }
692*437bfbebSnyanmisaka
693*437bfbebSnyanmisaka if (ctx->dev) {
694*437bfbebSnyanmisaka mpp_dev_deinit(ctx->dev);
695*437bfbebSnyanmisaka ctx->dev = NULL;
696*437bfbebSnyanmisaka }
697*437bfbebSnyanmisaka hal_h265e_leave();
698*437bfbebSnyanmisaka return MPP_OK;
699*437bfbebSnyanmisaka }
700*437bfbebSnyanmisaka
hal_h265e_vepu54x_prepare(void * hal)701*437bfbebSnyanmisaka static MPP_RET hal_h265e_vepu54x_prepare(void *hal)
702*437bfbebSnyanmisaka {
703*437bfbebSnyanmisaka H265eV541HalContext *ctx = (H265eV541HalContext *)hal;
704*437bfbebSnyanmisaka MppEncPrepCfg *prep = &ctx->cfg->prep;
705*437bfbebSnyanmisaka
706*437bfbebSnyanmisaka hal_h265e_dbg_func("enter %p\n", hal);
707*437bfbebSnyanmisaka
708*437bfbebSnyanmisaka if (prep->change_res) {
709*437bfbebSnyanmisaka RK_S32 i;
710*437bfbebSnyanmisaka
711*437bfbebSnyanmisaka // pre-alloc required buffers to reduce first frame delay
712*437bfbebSnyanmisaka vepu54x_h265_setup_hal_bufs(ctx);
713*437bfbebSnyanmisaka for (i = 0; i < ctx->max_buf_cnt; i++)
714*437bfbebSnyanmisaka hal_bufs_get_buf(ctx->dpb_bufs, i);
715*437bfbebSnyanmisaka
716*437bfbebSnyanmisaka prep->change_res = 0;
717*437bfbebSnyanmisaka }
718*437bfbebSnyanmisaka
719*437bfbebSnyanmisaka hal_h265e_dbg_func("leave %p\n", hal);
720*437bfbebSnyanmisaka
721*437bfbebSnyanmisaka return MPP_OK;
722*437bfbebSnyanmisaka }
723*437bfbebSnyanmisaka
724*437bfbebSnyanmisaka static MPP_RET
vepu541_h265_set_patch_info(MppDev dev,H265eSyntax_new * syn,VepuFmt input_fmt,HalEncTask * task)725*437bfbebSnyanmisaka vepu541_h265_set_patch_info(MppDev dev, H265eSyntax_new *syn, VepuFmt input_fmt, HalEncTask *task)
726*437bfbebSnyanmisaka {
727*437bfbebSnyanmisaka RK_U32 hor_stride = syn->pp.hor_stride;
728*437bfbebSnyanmisaka RK_U32 ver_stride = syn->pp.ver_stride ? syn->pp.ver_stride : syn->pp.pic_height;
729*437bfbebSnyanmisaka RK_U32 frame_size = hor_stride * ver_stride;
730*437bfbebSnyanmisaka RK_U32 u_offset = 0, v_offset = 0;
731*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
732*437bfbebSnyanmisaka
733*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_FBC(mpp_frame_get_fmt(task->frame))) {
734*437bfbebSnyanmisaka u_offset = mpp_frame_get_fbc_offset(task->frame);
735*437bfbebSnyanmisaka v_offset = 0;
736*437bfbebSnyanmisaka } else {
737*437bfbebSnyanmisaka switch (input_fmt) {
738*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420P: {
739*437bfbebSnyanmisaka u_offset = frame_size;
740*437bfbebSnyanmisaka v_offset = frame_size * 5 / 4;
741*437bfbebSnyanmisaka } break;
742*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420SP:
743*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422SP: {
744*437bfbebSnyanmisaka u_offset = frame_size;
745*437bfbebSnyanmisaka v_offset = frame_size;
746*437bfbebSnyanmisaka } break;
747*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422P: {
748*437bfbebSnyanmisaka u_offset = frame_size;
749*437bfbebSnyanmisaka v_offset = frame_size * 3 / 2;
750*437bfbebSnyanmisaka } break;
751*437bfbebSnyanmisaka case VEPU5xx_FMT_YUYV422:
752*437bfbebSnyanmisaka case VEPU5xx_FMT_UYVY422: {
753*437bfbebSnyanmisaka u_offset = 0;
754*437bfbebSnyanmisaka v_offset = 0;
755*437bfbebSnyanmisaka } break;
756*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR565:
757*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR888:
758*437bfbebSnyanmisaka case VEPU5xx_FMT_BGRA8888: {
759*437bfbebSnyanmisaka u_offset = 0;
760*437bfbebSnyanmisaka v_offset = 0;
761*437bfbebSnyanmisaka } break;
762*437bfbebSnyanmisaka default: {
763*437bfbebSnyanmisaka hal_h265e_err("unknown color space: %d\n", input_fmt);
764*437bfbebSnyanmisaka u_offset = frame_size;
765*437bfbebSnyanmisaka v_offset = frame_size * 5 / 4;
766*437bfbebSnyanmisaka }
767*437bfbebSnyanmisaka }
768*437bfbebSnyanmisaka }
769*437bfbebSnyanmisaka
770*437bfbebSnyanmisaka /* input cb addr */
771*437bfbebSnyanmisaka if (u_offset) {
772*437bfbebSnyanmisaka mpp_dev_set_reg_offset(dev, 71, u_offset);
773*437bfbebSnyanmisaka if (ret)
774*437bfbebSnyanmisaka mpp_err_f("set input cb addr offset failed %d\n", ret);
775*437bfbebSnyanmisaka }
776*437bfbebSnyanmisaka
777*437bfbebSnyanmisaka /* input cr addr */
778*437bfbebSnyanmisaka if (v_offset) {
779*437bfbebSnyanmisaka mpp_dev_set_reg_offset(dev, 72, v_offset);
780*437bfbebSnyanmisaka if (ret)
781*437bfbebSnyanmisaka mpp_err_f("set input cr addr offset failed %d\n", ret);
782*437bfbebSnyanmisaka }
783*437bfbebSnyanmisaka
784*437bfbebSnyanmisaka mpp_dev_set_reg_offset(dev, 83, mpp_buffer_get_size(task->output));
785*437bfbebSnyanmisaka if (ret)
786*437bfbebSnyanmisaka mpp_err_f("set output max addr offset failed %d\n", ret);
787*437bfbebSnyanmisaka
788*437bfbebSnyanmisaka return ret;
789*437bfbebSnyanmisaka }
790*437bfbebSnyanmisaka
vepu541_h265_set_roi(void * dst_buf,void * src_buf,RK_S32 w,RK_S32 h)791*437bfbebSnyanmisaka MPP_RET vepu541_h265_set_roi(void *dst_buf, void *src_buf, RK_S32 w, RK_S32 h)
792*437bfbebSnyanmisaka {
793*437bfbebSnyanmisaka Vepu541RoiCfg *src = (Vepu541RoiCfg *)src_buf;
794*437bfbebSnyanmisaka Vepu541RoiCfg *dst = (Vepu541RoiCfg *)dst_buf;
795*437bfbebSnyanmisaka RK_S32 mb_w = MPP_ALIGN(w, 64) / 64;
796*437bfbebSnyanmisaka RK_S32 mb_h = MPP_ALIGN(h, 64) / 64;
797*437bfbebSnyanmisaka RK_S32 ctu_line = mb_w;
798*437bfbebSnyanmisaka RK_S32 i, j, cu16cnt;
799*437bfbebSnyanmisaka
800*437bfbebSnyanmisaka for (j = 0; j < mb_h; j++) {
801*437bfbebSnyanmisaka for ( i = 0; i < mb_w; i++) {
802*437bfbebSnyanmisaka RK_S32 ctu_addr = j * ctu_line + i;
803*437bfbebSnyanmisaka RK_S32 cu16_num_line = ctu_line * 4;
804*437bfbebSnyanmisaka for ( cu16cnt = 0; cu16cnt < 16; cu16cnt++) {
805*437bfbebSnyanmisaka RK_S32 cu16_x;
806*437bfbebSnyanmisaka RK_S32 cu16_y;
807*437bfbebSnyanmisaka RK_S32 cu16_addr_in_frame;
808*437bfbebSnyanmisaka cu16_x = cu16cnt & 3;
809*437bfbebSnyanmisaka cu16_y = cu16cnt / 4;
810*437bfbebSnyanmisaka cu16_x += i * 4;
811*437bfbebSnyanmisaka cu16_y += j * 4;
812*437bfbebSnyanmisaka cu16_addr_in_frame = cu16_x + cu16_y * cu16_num_line;
813*437bfbebSnyanmisaka dst[ctu_addr * 16 + cu16cnt] = src[cu16_addr_in_frame];
814*437bfbebSnyanmisaka }
815*437bfbebSnyanmisaka }
816*437bfbebSnyanmisaka }
817*437bfbebSnyanmisaka return MPP_OK;
818*437bfbebSnyanmisaka }
819*437bfbebSnyanmisaka
setup_vepu541_intra_refresh(H265eV541RegSet * regs,H265eV541HalContext * ctx,RK_U32 refresh_idx)820*437bfbebSnyanmisaka static MPP_RET setup_vepu541_intra_refresh(H265eV541RegSet *regs, H265eV541HalContext *ctx, RK_U32 refresh_idx)
821*437bfbebSnyanmisaka {
822*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
823*437bfbebSnyanmisaka RK_U32 h = ctx->cfg->prep.height;
824*437bfbebSnyanmisaka RK_U32 w = ctx->cfg->prep.width;
825*437bfbebSnyanmisaka MppEncROIRegion *region = NULL;
826*437bfbebSnyanmisaka RK_U32 stride_h = MPP_ALIGN(w / 16, 4);
827*437bfbebSnyanmisaka RK_U32 stride_v = MPP_ALIGN(h / 16, 4);
828*437bfbebSnyanmisaka RK_U32 i = 0;
829*437bfbebSnyanmisaka RK_U32 roi_buf_size;
830*437bfbebSnyanmisaka
831*437bfbebSnyanmisaka hal_h265e_dbg_func("enter\n");
832*437bfbebSnyanmisaka
833*437bfbebSnyanmisaka if (!ctx->cfg->rc.refresh_en) {
834*437bfbebSnyanmisaka ret = MPP_ERR_VALUE;
835*437bfbebSnyanmisaka goto RET;
836*437bfbebSnyanmisaka }
837*437bfbebSnyanmisaka
838*437bfbebSnyanmisaka roi_buf_size = vepu541_get_roi_buf_size(w, h);
839*437bfbebSnyanmisaka if (ctx->roi_buf_size < roi_buf_size) {
840*437bfbebSnyanmisaka if (NULL == ctx->roi_grp)
841*437bfbebSnyanmisaka mpp_buffer_group_get_internal(&ctx->roi_grp, MPP_BUFFER_TYPE_ION);
842*437bfbebSnyanmisaka if (ctx->roi_buf)
843*437bfbebSnyanmisaka mpp_buffer_put(ctx->roi_buf);
844*437bfbebSnyanmisaka MPP_FREE(ctx->roi_buf_tmp);
845*437bfbebSnyanmisaka ctx->roi_buf_tmp = mpp_calloc_size(Vepu541RoiCfg, roi_buf_size);
846*437bfbebSnyanmisaka mpp_buffer_get(ctx->roi_grp, &ctx->roi_buf, roi_buf_size);
847*437bfbebSnyanmisaka ctx->roi_buf_size = roi_buf_size;
848*437bfbebSnyanmisaka }
849*437bfbebSnyanmisaka
850*437bfbebSnyanmisaka mpp_assert(ctx->roi_buf);
851*437bfbebSnyanmisaka mpp_assert(ctx->roi_buf_tmp);
852*437bfbebSnyanmisaka RK_S32 fd = mpp_buffer_get_fd(ctx->roi_buf);
853*437bfbebSnyanmisaka void *buf = ctx->roi_buf_tmp;
854*437bfbebSnyanmisaka void *dst_buf = mpp_buffer_get_ptr(ctx->roi_buf);
855*437bfbebSnyanmisaka Vepu541RoiCfg cfg;
856*437bfbebSnyanmisaka Vepu541RoiCfg *ptr = (Vepu541RoiCfg *)buf;
857*437bfbebSnyanmisaka cfg.force_intra = 0;
858*437bfbebSnyanmisaka cfg.reserved = 0;
859*437bfbebSnyanmisaka cfg.qp_area_idx = 0;
860*437bfbebSnyanmisaka cfg.qp_area_en = 1;
861*437bfbebSnyanmisaka cfg.qp_adj = 0;
862*437bfbebSnyanmisaka cfg.qp_adj_mode = 0;
863*437bfbebSnyanmisaka
864*437bfbebSnyanmisaka for (i = 0; i < stride_h * stride_v; i++, ptr++)
865*437bfbebSnyanmisaka memcpy(ptr, &cfg, sizeof(cfg));
866*437bfbebSnyanmisaka
867*437bfbebSnyanmisaka region = mpp_calloc(MppEncROIRegion, 1);
868*437bfbebSnyanmisaka
869*437bfbebSnyanmisaka if (NULL == region) {
870*437bfbebSnyanmisaka mpp_err_f("Failed to calloc for MppEncROIRegion !\n");
871*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
872*437bfbebSnyanmisaka }
873*437bfbebSnyanmisaka
874*437bfbebSnyanmisaka if (ctx->cfg->rc.refresh_mode == MPP_ENC_RC_INTRA_REFRESH_ROW) {
875*437bfbebSnyanmisaka region->x = 0;
876*437bfbebSnyanmisaka region->w = w;
877*437bfbebSnyanmisaka if (refresh_idx > 0) {
878*437bfbebSnyanmisaka region->y = refresh_idx * 64 * ctx->cfg->rc.refresh_num - 128;
879*437bfbebSnyanmisaka region->h = 64 * ctx->cfg->rc.refresh_num + 128;
880*437bfbebSnyanmisaka } else {
881*437bfbebSnyanmisaka region->y = refresh_idx * 64 * ctx->cfg->rc.refresh_num;
882*437bfbebSnyanmisaka region->h = 64 * ctx->cfg->rc.refresh_num;
883*437bfbebSnyanmisaka }
884*437bfbebSnyanmisaka regs->me_rnge.cime_srch_v = 1;
885*437bfbebSnyanmisaka } else if (ctx->cfg->rc.refresh_mode == MPP_ENC_RC_INTRA_REFRESH_COL) {
886*437bfbebSnyanmisaka region->y = 0;
887*437bfbebSnyanmisaka region->h = h;
888*437bfbebSnyanmisaka if (refresh_idx > 0) {
889*437bfbebSnyanmisaka region->x = refresh_idx * 64 * ctx->cfg->rc.refresh_num - 128;
890*437bfbebSnyanmisaka region->w = 64 * ctx->cfg->rc.refresh_num + 128;
891*437bfbebSnyanmisaka } else {
892*437bfbebSnyanmisaka region->x = refresh_idx * 64 * ctx->cfg->rc.refresh_num;
893*437bfbebSnyanmisaka region->w = 64 * ctx->cfg->rc.refresh_num;
894*437bfbebSnyanmisaka }
895*437bfbebSnyanmisaka regs->me_rnge.cime_srch_h = 1;
896*437bfbebSnyanmisaka }
897*437bfbebSnyanmisaka
898*437bfbebSnyanmisaka region->intra = 1;
899*437bfbebSnyanmisaka region->quality = -ctx->cfg->rc.qp_delta_ip;
900*437bfbebSnyanmisaka
901*437bfbebSnyanmisaka region->area_map_en = 1;
902*437bfbebSnyanmisaka region->qp_area_idx = 1;
903*437bfbebSnyanmisaka region->abs_qp_en = 0;
904*437bfbebSnyanmisaka
905*437bfbebSnyanmisaka regs->enc_pic.roi_en = 1;
906*437bfbebSnyanmisaka regs->roi_addr_hevc = fd;
907*437bfbebSnyanmisaka vepu541_set_one_roi(buf, region, w, h);
908*437bfbebSnyanmisaka vepu541_h265_set_roi(dst_buf, buf, w, h);
909*437bfbebSnyanmisaka mpp_free(region);
910*437bfbebSnyanmisaka mpp_buffer_sync_end(ctx->roi_buf);
911*437bfbebSnyanmisaka
912*437bfbebSnyanmisaka RET:
913*437bfbebSnyanmisaka hal_h265e_dbg_func("leave, ret %d\n", ret);
914*437bfbebSnyanmisaka return ret;
915*437bfbebSnyanmisaka }
916*437bfbebSnyanmisaka
917*437bfbebSnyanmisaka static MPP_RET
vepu541_h265_set_roi_regs(H265eV541HalContext * ctx,H265eV541RegSet * regs)918*437bfbebSnyanmisaka vepu541_h265_set_roi_regs(H265eV541HalContext *ctx, H265eV541RegSet *regs)
919*437bfbebSnyanmisaka {
920*437bfbebSnyanmisaka if (ctx->roi_data2) {
921*437bfbebSnyanmisaka MppEncROICfg2 *cfg = ( MppEncROICfg2 *)ctx->roi_data2;
922*437bfbebSnyanmisaka
923*437bfbebSnyanmisaka regs->enc_pic.roi_en = 1;
924*437bfbebSnyanmisaka regs->roi_addr_hevc = mpp_buffer_get_fd(cfg->base_cfg_buf);
925*437bfbebSnyanmisaka } else if (ctx->qpmap) {
926*437bfbebSnyanmisaka regs->enc_pic.roi_en = 1;
927*437bfbebSnyanmisaka regs->roi_addr_hevc = mpp_buffer_get_fd(ctx->qpmap);
928*437bfbebSnyanmisaka } else {
929*437bfbebSnyanmisaka MppEncROICfg *cfg = (MppEncROICfg*)ctx->roi_data;
930*437bfbebSnyanmisaka RK_U32 h = ctx->cfg->prep.height;
931*437bfbebSnyanmisaka RK_U32 w = ctx->cfg->prep.width;
932*437bfbebSnyanmisaka RK_U8 *roi_base;
933*437bfbebSnyanmisaka
934*437bfbebSnyanmisaka if (!cfg)
935*437bfbebSnyanmisaka return MPP_OK;
936*437bfbebSnyanmisaka
937*437bfbebSnyanmisaka if (cfg->number && cfg->regions) {
938*437bfbebSnyanmisaka RK_U32 roi_buf_size = vepu541_get_roi_buf_size(w, h);
939*437bfbebSnyanmisaka
940*437bfbebSnyanmisaka if (!ctx->roi_buf || roi_buf_size != ctx->roi_buf_size) {
941*437bfbebSnyanmisaka if (NULL == ctx->roi_grp)
942*437bfbebSnyanmisaka mpp_buffer_group_get_internal(&ctx->roi_grp, MPP_BUFFER_TYPE_ION);
943*437bfbebSnyanmisaka else if (roi_buf_size != ctx->roi_buf_size) {
944*437bfbebSnyanmisaka if (ctx->roi_buf) {
945*437bfbebSnyanmisaka mpp_buffer_put(ctx->roi_buf);
946*437bfbebSnyanmisaka ctx->roi_buf = NULL;
947*437bfbebSnyanmisaka }
948*437bfbebSnyanmisaka MPP_FREE(ctx->roi_buf_tmp);
949*437bfbebSnyanmisaka mpp_buffer_group_clear(ctx->roi_grp);
950*437bfbebSnyanmisaka }
951*437bfbebSnyanmisaka mpp_assert(ctx->roi_grp);
952*437bfbebSnyanmisaka if (NULL == ctx->roi_buf)
953*437bfbebSnyanmisaka mpp_buffer_get(ctx->roi_grp, &ctx->roi_buf, roi_buf_size);
954*437bfbebSnyanmisaka
955*437bfbebSnyanmisaka if (ctx->roi_buf_tmp == NULL)
956*437bfbebSnyanmisaka ctx->roi_buf_tmp = (Vepu541RoiCfg*)mpp_malloc(RK_U8, roi_buf_size);
957*437bfbebSnyanmisaka
958*437bfbebSnyanmisaka ctx->roi_buf_size = roi_buf_size;
959*437bfbebSnyanmisaka }
960*437bfbebSnyanmisaka
961*437bfbebSnyanmisaka regs->enc_pic.roi_en = 1;
962*437bfbebSnyanmisaka regs->roi_addr_hevc = mpp_buffer_get_fd(ctx->roi_buf);
963*437bfbebSnyanmisaka roi_base = (RK_U8 *)mpp_buffer_get_ptr(ctx->roi_buf);
964*437bfbebSnyanmisaka vepu541_set_roi(ctx->roi_buf_tmp, cfg, w, h);
965*437bfbebSnyanmisaka vepu541_h265_set_roi(roi_base, ctx->roi_buf_tmp, w, h);
966*437bfbebSnyanmisaka }
967*437bfbebSnyanmisaka }
968*437bfbebSnyanmisaka
969*437bfbebSnyanmisaka return MPP_OK;
970*437bfbebSnyanmisaka }
971*437bfbebSnyanmisaka
vepu541_h265_set_rc_regs(H265eV541HalContext * ctx,H265eV541RegSet * regs,HalEncTask * task)972*437bfbebSnyanmisaka static MPP_RET vepu541_h265_set_rc_regs(H265eV541HalContext *ctx, H265eV541RegSet *regs, HalEncTask *task)
973*437bfbebSnyanmisaka {
974*437bfbebSnyanmisaka H265eSyntax_new *syn = (H265eSyntax_new *)task->syntax.data;
975*437bfbebSnyanmisaka EncRcTaskInfo *rc_cfg = &task->rc_task->info;
976*437bfbebSnyanmisaka MppEncCfgSet *cfg = ctx->cfg;
977*437bfbebSnyanmisaka MppEncRcCfg *rc = &cfg->rc;
978*437bfbebSnyanmisaka MppEncHwCfg *hw = &cfg->hw;
979*437bfbebSnyanmisaka MppEncH265Cfg *h265 = &cfg->h265;
980*437bfbebSnyanmisaka RK_S32 mb_wd64, mb_h64;
981*437bfbebSnyanmisaka mb_wd64 = (syn->pp.pic_width + 63) / 64;
982*437bfbebSnyanmisaka mb_h64 = (syn->pp.pic_height + 63) / 64;
983*437bfbebSnyanmisaka
984*437bfbebSnyanmisaka RK_U32 ctu_target_bits_mul_16 = (rc_cfg->bit_target << 4) / (mb_wd64 * mb_h64);
985*437bfbebSnyanmisaka RK_U32 ctu_target_bits;
986*437bfbebSnyanmisaka RK_S32 negative_bits_thd, positive_bits_thd;
987*437bfbebSnyanmisaka
988*437bfbebSnyanmisaka if (rc->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
989*437bfbebSnyanmisaka regs->enc_pic.pic_qp = rc_cfg->quality_target;
990*437bfbebSnyanmisaka regs->synt_sli1.sli_qp = rc_cfg->quality_target;
991*437bfbebSnyanmisaka
992*437bfbebSnyanmisaka regs->rc_qp.rc_max_qp = rc_cfg->quality_target;
993*437bfbebSnyanmisaka regs->rc_qp.rc_min_qp = rc_cfg->quality_target;
994*437bfbebSnyanmisaka } else {
995*437bfbebSnyanmisaka if (ctu_target_bits_mul_16 >= 0x100000) {
996*437bfbebSnyanmisaka ctu_target_bits_mul_16 = 0x50000;
997*437bfbebSnyanmisaka }
998*437bfbebSnyanmisaka ctu_target_bits = (ctu_target_bits_mul_16 * mb_wd64) >> 4;
999*437bfbebSnyanmisaka negative_bits_thd = 0 - 5 * ctu_target_bits / 16;
1000*437bfbebSnyanmisaka positive_bits_thd = 5 * ctu_target_bits / 16;
1001*437bfbebSnyanmisaka
1002*437bfbebSnyanmisaka regs->enc_pic.pic_qp = rc_cfg->quality_target;
1003*437bfbebSnyanmisaka regs->synt_sli1.sli_qp = rc_cfg->quality_target;
1004*437bfbebSnyanmisaka regs->rc_cfg.rc_en = 1;
1005*437bfbebSnyanmisaka regs->rc_cfg.aqmode_en = 1;
1006*437bfbebSnyanmisaka regs->rc_cfg.qp_mode = 1;
1007*437bfbebSnyanmisaka
1008*437bfbebSnyanmisaka regs->rc_cfg.rc_ctu_num = mb_wd64;
1009*437bfbebSnyanmisaka
1010*437bfbebSnyanmisaka regs->rc_qp.rc_qp_range = (ctx->frame_type == INTRA_FRAME) ?
1011*437bfbebSnyanmisaka hw->qp_delta_row_i : hw->qp_delta_row;
1012*437bfbebSnyanmisaka regs->rc_qp.rc_max_qp = rc_cfg->quality_max;
1013*437bfbebSnyanmisaka regs->rc_qp.rc_min_qp = rc_cfg->quality_min;
1014*437bfbebSnyanmisaka regs->rc_tgt.ctu_ebits = ctu_target_bits_mul_16;
1015*437bfbebSnyanmisaka
1016*437bfbebSnyanmisaka regs->rc_erp0.bits_thd0 = 2 * negative_bits_thd;
1017*437bfbebSnyanmisaka regs->rc_erp1.bits_thd1 = negative_bits_thd;
1018*437bfbebSnyanmisaka regs->rc_erp2.bits_thd2 = positive_bits_thd;
1019*437bfbebSnyanmisaka regs->rc_erp3.bits_thd3 = 2 * positive_bits_thd;
1020*437bfbebSnyanmisaka regs->rc_erp4.bits_thd4 = 0x7FFFFFFF;
1021*437bfbebSnyanmisaka regs->rc_erp5.bits_thd5 = 0x7FFFFFFF;
1022*437bfbebSnyanmisaka regs->rc_erp6.bits_thd6 = 0x7FFFFFFF;
1023*437bfbebSnyanmisaka regs->rc_erp7.bits_thd7 = 0x7FFFFFFF;
1024*437bfbebSnyanmisaka regs->rc_erp8.bits_thd8 = 0x7FFFFFFF;
1025*437bfbebSnyanmisaka
1026*437bfbebSnyanmisaka regs->rc_adj0.qp_adjust0 = -2;
1027*437bfbebSnyanmisaka regs->rc_adj0.qp_adjust1 = -1;
1028*437bfbebSnyanmisaka regs->rc_adj0.qp_adjust2 = 0;
1029*437bfbebSnyanmisaka regs->rc_adj0.qp_adjust3 = 1;
1030*437bfbebSnyanmisaka regs->rc_adj0.qp_adjust4 = 2;
1031*437bfbebSnyanmisaka regs->rc_adj1.qp_adjust5 = 0;
1032*437bfbebSnyanmisaka regs->rc_adj1.qp_adjust6 = 0;
1033*437bfbebSnyanmisaka regs->rc_adj1.qp_adjust7 = 0;
1034*437bfbebSnyanmisaka regs->rc_adj1.qp_adjust8 = 0;
1035*437bfbebSnyanmisaka
1036*437bfbebSnyanmisaka regs->qpmap0.qpmin_area0 = h265->qpmin_map[0] > 0 ? h265->qpmin_map[0] : rc_cfg->quality_min;
1037*437bfbebSnyanmisaka regs->qpmap0.qpmax_area0 = h265->qpmax_map[0] > 0 ? h265->qpmax_map[0] : rc_cfg->quality_max;
1038*437bfbebSnyanmisaka regs->qpmap0.qpmin_area1 = h265->qpmin_map[1] > 0 ? h265->qpmin_map[1] : rc_cfg->quality_min;
1039*437bfbebSnyanmisaka regs->qpmap0.qpmax_area1 = h265->qpmax_map[1] > 0 ? h265->qpmax_map[1] : rc_cfg->quality_max;
1040*437bfbebSnyanmisaka regs->qpmap0.qpmin_area2 = h265->qpmin_map[2] > 0 ? h265->qpmin_map[2] : rc_cfg->quality_min;;
1041*437bfbebSnyanmisaka regs->qpmap1.qpmax_area2 = h265->qpmax_map[2] > 0 ? h265->qpmax_map[2] : rc_cfg->quality_max;
1042*437bfbebSnyanmisaka regs->qpmap1.qpmin_area3 = h265->qpmin_map[3] > 0 ? h265->qpmin_map[3] : rc_cfg->quality_min;;
1043*437bfbebSnyanmisaka regs->qpmap1.qpmax_area3 = h265->qpmax_map[3] > 0 ? h265->qpmax_map[3] : rc_cfg->quality_max;
1044*437bfbebSnyanmisaka regs->qpmap1.qpmin_area4 = h265->qpmin_map[4] > 0 ? h265->qpmin_map[4] : rc_cfg->quality_min;;
1045*437bfbebSnyanmisaka regs->qpmap1.qpmax_area4 = h265->qpmax_map[4] > 0 ? h265->qpmax_map[4] : rc_cfg->quality_max;
1046*437bfbebSnyanmisaka regs->qpmap2.qpmin_area5 = h265->qpmin_map[5] > 0 ? h265->qpmin_map[5] : rc_cfg->quality_min;;
1047*437bfbebSnyanmisaka regs->qpmap2.qpmax_area5 = h265->qpmax_map[5] > 0 ? h265->qpmax_map[5] : rc_cfg->quality_max;
1048*437bfbebSnyanmisaka regs->qpmap2.qpmin_area6 = h265->qpmin_map[6] > 0 ? h265->qpmin_map[6] : rc_cfg->quality_min;;
1049*437bfbebSnyanmisaka regs->qpmap2.qpmax_area6 = h265->qpmax_map[6] > 0 ? h265->qpmax_map[6] : rc_cfg->quality_max;
1050*437bfbebSnyanmisaka regs->qpmap2.qpmin_area7 = h265->qpmin_map[7] > 0 ? h265->qpmin_map[7] : rc_cfg->quality_min;;
1051*437bfbebSnyanmisaka regs->qpmap3.qpmax_area7 = h265->qpmax_map[7] > 0 ? h265->qpmax_map[7] : rc_cfg->quality_max;
1052*437bfbebSnyanmisaka regs->qpmap3.qpmap_mode = h265->qpmap_mode;
1053*437bfbebSnyanmisaka }
1054*437bfbebSnyanmisaka if (ctx->frame_type == INTRA_FRAME) {
1055*437bfbebSnyanmisaka regs->enc_pic.rdo_wgt_sel = 0;
1056*437bfbebSnyanmisaka } else {
1057*437bfbebSnyanmisaka regs->enc_pic.rdo_wgt_sel = 1;
1058*437bfbebSnyanmisaka }
1059*437bfbebSnyanmisaka return MPP_OK;
1060*437bfbebSnyanmisaka }
1061*437bfbebSnyanmisaka
vepu541_h265_set_pp_regs(VepuFmtCfg * fmt,H265eV541HalContext * ctx,HalEncTask * task)1062*437bfbebSnyanmisaka static MPP_RET vepu541_h265_set_pp_regs(VepuFmtCfg *fmt, H265eV541HalContext *ctx, HalEncTask *task)
1063*437bfbebSnyanmisaka {
1064*437bfbebSnyanmisaka RK_S32 stridey = 0;
1065*437bfbebSnyanmisaka RK_S32 stridec = 0;
1066*437bfbebSnyanmisaka H265eV541RegSet *regs = ctx->regs;
1067*437bfbebSnyanmisaka MppEncPrepCfg *prep_cfg = &ctx->cfg->prep;
1068*437bfbebSnyanmisaka MppFrameFormat prep_fmt = prep_cfg->format;
1069*437bfbebSnyanmisaka
1070*437bfbebSnyanmisaka regs->dtrns_map.src_bus_edin = fmt->src_endian;
1071*437bfbebSnyanmisaka regs->src_fmt.src_cfmt = fmt->format;
1072*437bfbebSnyanmisaka regs->src_fmt.alpha_swap = fmt->alpha_swap;
1073*437bfbebSnyanmisaka regs->src_fmt.rbuv_swap = fmt->rbuv_swap;
1074*437bfbebSnyanmisaka regs->src_fmt.src_range = fmt->src_range;
1075*437bfbebSnyanmisaka regs->src_proc.src_mirr = prep_cfg->mirroring > 0;
1076*437bfbebSnyanmisaka regs->src_proc.src_rot = prep_cfg->rotation;
1077*437bfbebSnyanmisaka
1078*437bfbebSnyanmisaka if (!ctx->frame_num && (prep_fmt == MPP_FMT_YUV420SP_VU || prep_fmt == MPP_FMT_YUV422SP_VU))
1079*437bfbebSnyanmisaka mpp_logw("Warning: nv21/nv42 fmt not supported, will encode as nv12/nv24.\n");
1080*437bfbebSnyanmisaka
1081*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_FBC(prep_fmt)) {
1082*437bfbebSnyanmisaka stridey = mpp_frame_get_fbc_hdr_stride(task->frame);
1083*437bfbebSnyanmisaka if (!stridey)
1084*437bfbebSnyanmisaka stridey = MPP_ALIGN(prep_cfg->hor_stride, 16);
1085*437bfbebSnyanmisaka } else if (prep_cfg->hor_stride) {
1086*437bfbebSnyanmisaka stridey = prep_cfg->hor_stride;
1087*437bfbebSnyanmisaka } else {
1088*437bfbebSnyanmisaka if (regs->src_fmt.src_cfmt == VEPU5xx_FMT_BGRA8888)
1089*437bfbebSnyanmisaka stridey = prep_cfg->width * 4;
1090*437bfbebSnyanmisaka else if (regs->src_fmt.src_cfmt == VEPU5xx_FMT_BGR888)
1091*437bfbebSnyanmisaka stridey = prep_cfg->width * 3;
1092*437bfbebSnyanmisaka else if (regs->src_fmt.src_cfmt == VEPU5xx_FMT_BGR565 ||
1093*437bfbebSnyanmisaka regs->src_fmt.src_cfmt == VEPU5xx_FMT_YUYV422 ||
1094*437bfbebSnyanmisaka regs->src_fmt.src_cfmt == VEPU5xx_FMT_UYVY422)
1095*437bfbebSnyanmisaka stridey = prep_cfg->width * 2;
1096*437bfbebSnyanmisaka }
1097*437bfbebSnyanmisaka
1098*437bfbebSnyanmisaka stridec = (regs->src_fmt.src_cfmt == VEPU5xx_FMT_YUV422SP ||
1099*437bfbebSnyanmisaka regs->src_fmt.src_cfmt == VEPU5xx_FMT_YUV420SP) ?
1100*437bfbebSnyanmisaka stridey : stridey / 2;
1101*437bfbebSnyanmisaka
1102*437bfbebSnyanmisaka if (regs->src_fmt.src_cfmt < VEPU5xx_FMT_ARGB1555) {
1103*437bfbebSnyanmisaka const VepuRgb2YuvCfg *cfg_coeffs = cfg_coeffs = get_rgb2yuv_cfg(prep_cfg->range, prep_cfg->color);
1104*437bfbebSnyanmisaka
1105*437bfbebSnyanmisaka hal_h265e_dbg_simple("input color range %d colorspace %d", prep_cfg->range, prep_cfg->color);
1106*437bfbebSnyanmisaka
1107*437bfbebSnyanmisaka regs->src_udfy.wght_r2y = cfg_coeffs->_2y.r_coeff;
1108*437bfbebSnyanmisaka regs->src_udfy.wght_g2y = cfg_coeffs->_2y.g_coeff;
1109*437bfbebSnyanmisaka regs->src_udfy.wght_b2y = cfg_coeffs->_2y.b_coeff;
1110*437bfbebSnyanmisaka
1111*437bfbebSnyanmisaka regs->src_udfu.wght_r2u = cfg_coeffs->_2u.r_coeff;
1112*437bfbebSnyanmisaka regs->src_udfu.wght_g2u = cfg_coeffs->_2u.g_coeff;
1113*437bfbebSnyanmisaka regs->src_udfu.wght_b2u = cfg_coeffs->_2u.b_coeff;
1114*437bfbebSnyanmisaka
1115*437bfbebSnyanmisaka regs->src_udfv.wght_r2v = cfg_coeffs->_2v.r_coeff;
1116*437bfbebSnyanmisaka regs->src_udfv.wght_g2v = cfg_coeffs->_2v.g_coeff;
1117*437bfbebSnyanmisaka regs->src_udfv.wght_b2v = cfg_coeffs->_2v.b_coeff;
1118*437bfbebSnyanmisaka
1119*437bfbebSnyanmisaka regs->src_udfo.ofst_y = cfg_coeffs->_2y.offset;
1120*437bfbebSnyanmisaka regs->src_udfo.ofst_u = cfg_coeffs->_2u.offset;
1121*437bfbebSnyanmisaka regs->src_udfo.ofst_v = cfg_coeffs->_2v.offset;
1122*437bfbebSnyanmisaka
1123*437bfbebSnyanmisaka hal_h265e_dbg_simple("use color range %d colorspace %d", cfg_coeffs->dst_range, cfg_coeffs->color);
1124*437bfbebSnyanmisaka }
1125*437bfbebSnyanmisaka
1126*437bfbebSnyanmisaka regs->src_strid.src_ystrid = stridey;
1127*437bfbebSnyanmisaka regs->src_strid.src_cstrid = stridec;
1128*437bfbebSnyanmisaka
1129*437bfbebSnyanmisaka return MPP_OK;
1130*437bfbebSnyanmisaka }
1131*437bfbebSnyanmisaka
vepu541_h265_set_slice_regs(H265eSyntax_new * syn,H265eV541RegSet * regs)1132*437bfbebSnyanmisaka static void vepu541_h265_set_slice_regs(H265eSyntax_new *syn, H265eV541RegSet *regs)
1133*437bfbebSnyanmisaka {
1134*437bfbebSnyanmisaka regs->synt_sps.smpl_adpt_ofst_en = syn->pp.sample_adaptive_offset_enabled_flag;//slice->m_sps->m_bUseSAO;
1135*437bfbebSnyanmisaka regs->synt_sps.num_st_ref_pic = syn->pp.num_short_term_ref_pic_sets;
1136*437bfbebSnyanmisaka regs->synt_sps.num_lt_ref_pic = syn->pp.num_long_term_ref_pics_sps;
1137*437bfbebSnyanmisaka regs->synt_sps.lt_ref_pic_prsnt = syn->pp.long_term_ref_pics_present_flag;
1138*437bfbebSnyanmisaka regs->synt_sps.tmpl_mvp_en = syn->pp.sps_temporal_mvp_enabled_flag;
1139*437bfbebSnyanmisaka regs->synt_sps.log2_max_poc_lsb = syn->pp.log2_max_pic_order_cnt_lsb_minus4;
1140*437bfbebSnyanmisaka regs->synt_sps.strg_intra_smth = syn->pp.strong_intra_smoothing_enabled_flag;
1141*437bfbebSnyanmisaka
1142*437bfbebSnyanmisaka regs->synt_pps.dpdnt_sli_seg_en = syn->pp.dependent_slice_segments_enabled_flag;
1143*437bfbebSnyanmisaka regs->synt_pps.out_flg_prsnt_flg = syn->pp.output_flag_present_flag;
1144*437bfbebSnyanmisaka regs->synt_pps.num_extr_sli_hdr = syn->pp.num_extra_slice_header_bits;
1145*437bfbebSnyanmisaka regs->synt_pps.sgn_dat_hid_en = syn->pp.sign_data_hiding_enabled_flag;
1146*437bfbebSnyanmisaka regs->synt_pps.cbc_init_prsnt_flg = syn->pp.cabac_init_present_flag;
1147*437bfbebSnyanmisaka regs->synt_pps.pic_init_qp = syn->pp.init_qp_minus26 + 26;
1148*437bfbebSnyanmisaka regs->synt_pps.cu_qp_dlt_en = syn->pp.cu_qp_delta_enabled_flag;
1149*437bfbebSnyanmisaka regs->synt_pps.chrm_qp_ofst_prsn = syn->pp.pps_slice_chroma_qp_offsets_present_flag;
1150*437bfbebSnyanmisaka regs->synt_pps.lp_fltr_acrs_sli = syn->pp.pps_loop_filter_across_slices_enabled_flag;
1151*437bfbebSnyanmisaka regs->synt_pps.dblk_fltr_ovrd_en = syn->pp.deblocking_filter_override_enabled_flag;
1152*437bfbebSnyanmisaka regs->synt_pps.lst_mdfy_prsnt_flg = syn->pp.lists_modification_present_flag;
1153*437bfbebSnyanmisaka regs->synt_pps.sli_seg_hdr_extn = syn->pp.slice_segment_header_extension_present_flag;
1154*437bfbebSnyanmisaka regs->synt_pps.cu_qp_dlt_depth = syn->pp.diff_cu_qp_delta_depth;
1155*437bfbebSnyanmisaka regs->synt_pps.lpf_fltr_acrs_til = syn->pp.loop_filter_across_tiles_enabled_flag;
1156*437bfbebSnyanmisaka
1157*437bfbebSnyanmisaka regs->synt_sli0.cbc_init_flg = syn->sp.cbc_init_flg;
1158*437bfbebSnyanmisaka regs->synt_sli0.mvd_l1_zero_flg = syn->sp.mvd_l1_zero_flg;
1159*437bfbebSnyanmisaka regs->synt_sli0.merge_up_flag = syn->sp.merge_up_flag;
1160*437bfbebSnyanmisaka regs->synt_sli0.merge_left_flag = syn->sp.merge_left_flag;
1161*437bfbebSnyanmisaka regs->synt_sli0.ref_pic_lst_mdf_l0 = syn->sp.ref_pic_lst_mdf_l0;
1162*437bfbebSnyanmisaka
1163*437bfbebSnyanmisaka regs->synt_sli0.num_refidx_l1_act = syn->sp.num_refidx_l1_act;
1164*437bfbebSnyanmisaka regs->synt_sli0.num_refidx_l0_act = syn->sp.num_refidx_l0_act;
1165*437bfbebSnyanmisaka
1166*437bfbebSnyanmisaka regs->synt_sli0.num_refidx_act_ovrd = syn->sp.num_refidx_act_ovrd;
1167*437bfbebSnyanmisaka
1168*437bfbebSnyanmisaka regs->synt_sli0.sli_sao_chrm_flg = syn->sp.sli_sao_chrm_flg;
1169*437bfbebSnyanmisaka regs->synt_sli0.sli_sao_luma_flg = syn->sp.sli_sao_luma_flg;
1170*437bfbebSnyanmisaka regs->synt_sli0.sli_tmprl_mvp_en = syn->sp.sli_tmprl_mvp_en;
1171*437bfbebSnyanmisaka regs->enc_pic.tot_poc_num = syn->sp.tot_poc_num;
1172*437bfbebSnyanmisaka
1173*437bfbebSnyanmisaka regs->synt_sli0.pic_out_flg = syn->sp.pic_out_flg;
1174*437bfbebSnyanmisaka regs->synt_sli0.sli_type = syn->sp.slice_type;
1175*437bfbebSnyanmisaka regs->synt_sli0.sli_rsrv_flg = syn->sp.slice_rsrv_flg;
1176*437bfbebSnyanmisaka regs->synt_sli0.dpdnt_sli_seg_flg = syn->sp.dpdnt_sli_seg_flg;
1177*437bfbebSnyanmisaka regs->synt_sli0.sli_pps_id = syn->sp.sli_pps_id;
1178*437bfbebSnyanmisaka regs->synt_sli0.no_out_pri_pic = syn->sp.no_out_pri_pic;
1179*437bfbebSnyanmisaka
1180*437bfbebSnyanmisaka
1181*437bfbebSnyanmisaka regs->synt_sli1.sli_tc_ofst_div2 = syn->sp.sli_tc_ofst_div2;;
1182*437bfbebSnyanmisaka regs->synt_sli1.sli_beta_ofst_div2 = syn->sp.sli_beta_ofst_div2;
1183*437bfbebSnyanmisaka regs->synt_sli1.sli_lp_fltr_acrs_sli = syn->sp.sli_lp_fltr_acrs_sli;
1184*437bfbebSnyanmisaka regs->synt_sli1.sli_dblk_fltr_dis = syn->sp.sli_dblk_fltr_dis;
1185*437bfbebSnyanmisaka regs->synt_sli1.dblk_fltr_ovrd_flg = syn->sp.dblk_fltr_ovrd_flg;
1186*437bfbebSnyanmisaka regs->synt_sli1.sli_cb_qp_ofst = syn->pp.pps_slice_chroma_qp_offsets_present_flag ?
1187*437bfbebSnyanmisaka syn->sp.sli_cb_qp_ofst : syn->pp.pps_cb_qp_offset;
1188*437bfbebSnyanmisaka regs->synt_sli1.max_mrg_cnd = syn->sp.max_mrg_cnd;
1189*437bfbebSnyanmisaka
1190*437bfbebSnyanmisaka regs->synt_sli1.col_ref_idx = syn->sp.col_ref_idx;
1191*437bfbebSnyanmisaka regs->synt_sli1.col_frm_l0_flg = syn->sp.col_frm_l0_flg;
1192*437bfbebSnyanmisaka regs->synt_sli2_rodr.sli_poc_lsb = syn->sp.sli_poc_lsb;
1193*437bfbebSnyanmisaka regs->synt_sli2_rodr.sli_hdr_ext_len = syn->sp.sli_hdr_ext_len;
1194*437bfbebSnyanmisaka
1195*437bfbebSnyanmisaka }
1196*437bfbebSnyanmisaka
vepu541_h265_set_ref_regs(H265eSyntax_new * syn,H265eV541RegSet * regs)1197*437bfbebSnyanmisaka static void vepu541_h265_set_ref_regs(H265eSyntax_new *syn, H265eV541RegSet *regs)
1198*437bfbebSnyanmisaka {
1199*437bfbebSnyanmisaka regs->synt_ref_mark0.st_ref_pic_flg = syn->sp.st_ref_pic_flg;
1200*437bfbebSnyanmisaka regs->synt_ref_mark0.poc_lsb_lt0 = syn->sp.poc_lsb_lt0;
1201*437bfbebSnyanmisaka regs->synt_ref_mark0.num_lt_pic = syn->sp.num_lt_pic;
1202*437bfbebSnyanmisaka
1203*437bfbebSnyanmisaka regs->synt_ref_mark1.dlt_poc_msb_prsnt0 = syn->sp.dlt_poc_msb_prsnt0;
1204*437bfbebSnyanmisaka regs->synt_ref_mark1.dlt_poc_msb_cycl0 = syn->sp.dlt_poc_msb_cycl0;
1205*437bfbebSnyanmisaka regs->synt_ref_mark1.used_by_lt_flg0 = syn->sp.used_by_lt_flg0;
1206*437bfbebSnyanmisaka regs->synt_ref_mark1.used_by_lt_flg1 = syn->sp.used_by_lt_flg1;
1207*437bfbebSnyanmisaka regs->synt_ref_mark1.used_by_lt_flg2 = syn->sp.used_by_lt_flg2;
1208*437bfbebSnyanmisaka regs->synt_ref_mark1.dlt_poc_msb_prsnt0 = syn->sp.dlt_poc_msb_prsnt0;
1209*437bfbebSnyanmisaka regs->synt_ref_mark1.dlt_poc_msb_cycl0 = syn->sp.dlt_poc_msb_cycl0;
1210*437bfbebSnyanmisaka regs->synt_ref_mark1.dlt_poc_msb_prsnt1 = syn->sp.dlt_poc_msb_prsnt1;
1211*437bfbebSnyanmisaka regs->synt_ref_mark1.num_neg_pic = syn->sp.num_neg_pic;
1212*437bfbebSnyanmisaka regs->synt_ref_mark1.num_pos_pic = syn->sp.num_pos_pic;
1213*437bfbebSnyanmisaka
1214*437bfbebSnyanmisaka regs->synt_ref_mark1.used_by_s0_flg = syn->sp.used_by_s0_flg;
1215*437bfbebSnyanmisaka regs->synt_ref_mark2.dlt_poc_s0_m10 = syn->sp.dlt_poc_s0_m10;
1216*437bfbebSnyanmisaka regs->synt_ref_mark2.dlt_poc_s0_m11 = syn->sp.dlt_poc_s0_m11;
1217*437bfbebSnyanmisaka regs->synt_ref_mark3.dlt_poc_s0_m12 = syn->sp.dlt_poc_s0_m12;
1218*437bfbebSnyanmisaka regs->synt_ref_mark3.dlt_poc_s0_m13 = syn->sp.dlt_poc_s0_m13;
1219*437bfbebSnyanmisaka
1220*437bfbebSnyanmisaka regs->synt_ref_mark4.poc_lsb_lt1 = syn->sp.poc_lsb_lt1;
1221*437bfbebSnyanmisaka regs->synt_ref_mark5.dlt_poc_msb_cycl1 = syn->sp.dlt_poc_msb_cycl1;
1222*437bfbebSnyanmisaka regs->synt_ref_mark4.poc_lsb_lt2 = syn->sp.poc_lsb_lt2;
1223*437bfbebSnyanmisaka regs->synt_ref_mark1.dlt_poc_msb_prsnt2 = syn->sp.dlt_poc_msb_prsnt2;
1224*437bfbebSnyanmisaka regs->synt_ref_mark5.dlt_poc_msb_cycl2 = syn->sp.dlt_poc_msb_cycl2;
1225*437bfbebSnyanmisaka regs->synt_sli1.lst_entry_l0 = syn->sp.lst_entry_l0;
1226*437bfbebSnyanmisaka regs->synt_sli0.ref_pic_lst_mdf_l0 = syn->sp.ref_pic_lst_mdf_l0;
1227*437bfbebSnyanmisaka
1228*437bfbebSnyanmisaka return;
1229*437bfbebSnyanmisaka }
vepu541_h265_set_me_regs(H265eV541HalContext * ctx,H265eSyntax_new * syn,H265eV541RegSet * regs)1230*437bfbebSnyanmisaka static void vepu541_h265_set_me_regs(H265eV541HalContext *ctx, H265eSyntax_new *syn, H265eV541RegSet *regs)
1231*437bfbebSnyanmisaka {
1232*437bfbebSnyanmisaka
1233*437bfbebSnyanmisaka RK_U32 cime_w = 11, cime_h = 7;
1234*437bfbebSnyanmisaka RK_S32 merangx = (cime_w + 1) * 32;
1235*437bfbebSnyanmisaka RK_S32 merangy = (cime_h + 1) * 32;
1236*437bfbebSnyanmisaka RK_S32 pic_wd64 = MPP_ALIGN(syn->pp.pic_width, 64) >> 6;
1237*437bfbebSnyanmisaka
1238*437bfbebSnyanmisaka if (merangx > 384) {
1239*437bfbebSnyanmisaka merangx = 384;
1240*437bfbebSnyanmisaka }
1241*437bfbebSnyanmisaka if (merangy > 320) {
1242*437bfbebSnyanmisaka merangy = 320;
1243*437bfbebSnyanmisaka }
1244*437bfbebSnyanmisaka
1245*437bfbebSnyanmisaka if (syn->pp.pic_width < merangx + 60 || syn->pp.pic_width <= 352) {
1246*437bfbebSnyanmisaka if (merangx > syn->pp.pic_width ) {
1247*437bfbebSnyanmisaka merangx = syn->pp.pic_width;
1248*437bfbebSnyanmisaka }
1249*437bfbebSnyanmisaka merangx = merangx / 4 * 2;
1250*437bfbebSnyanmisaka }
1251*437bfbebSnyanmisaka
1252*437bfbebSnyanmisaka if (syn->pp.pic_height < merangy + 60 || syn->pp.pic_height <= 288) {
1253*437bfbebSnyanmisaka if (merangy > syn->pp.pic_height) {
1254*437bfbebSnyanmisaka merangy = syn->pp.pic_height;
1255*437bfbebSnyanmisaka }
1256*437bfbebSnyanmisaka merangy = merangy / 4 * 2;
1257*437bfbebSnyanmisaka }
1258*437bfbebSnyanmisaka
1259*437bfbebSnyanmisaka {
1260*437bfbebSnyanmisaka RK_S32 merange_x = merangx / 2;
1261*437bfbebSnyanmisaka RK_S32 merange_y = merangy / 2;
1262*437bfbebSnyanmisaka RK_S32 mxneg = ((-(merange_x << 2)) >> 2) / 4;
1263*437bfbebSnyanmisaka RK_S32 myneg = ((-(merange_y << 2)) >> 2) / 4;
1264*437bfbebSnyanmisaka RK_S32 mxpos = (((merange_x << 2) - 4) >> 2) / 4;
1265*437bfbebSnyanmisaka RK_S32 mypos = (((merange_y << 2) - 4) >> 2) / 4;
1266*437bfbebSnyanmisaka
1267*437bfbebSnyanmisaka mxneg = MPP_MIN(abs(mxneg), mxpos) * 4;
1268*437bfbebSnyanmisaka myneg = MPP_MIN(abs(myneg), mypos) * 4;
1269*437bfbebSnyanmisaka
1270*437bfbebSnyanmisaka merangx = mxneg * 2;
1271*437bfbebSnyanmisaka merangy = myneg * 2;
1272*437bfbebSnyanmisaka }
1273*437bfbebSnyanmisaka regs->me_rnge.cime_srch_h = merangx / 32;
1274*437bfbebSnyanmisaka regs->me_rnge.cime_srch_v = merangy / 32;
1275*437bfbebSnyanmisaka
1276*437bfbebSnyanmisaka regs->me_rnge.rime_srch_h = 7;
1277*437bfbebSnyanmisaka regs->me_rnge.rime_srch_v = 5;
1278*437bfbebSnyanmisaka regs->me_rnge.dlt_frm_num = 0x1;
1279*437bfbebSnyanmisaka
1280*437bfbebSnyanmisaka regs->me_cnst.pmv_mdst_h = 5;
1281*437bfbebSnyanmisaka regs->me_cnst.pmv_mdst_v = 5;
1282*437bfbebSnyanmisaka regs->me_cnst.mv_limit = 0;
1283*437bfbebSnyanmisaka regs->me_cnst.mv_num = 2;
1284*437bfbebSnyanmisaka
1285*437bfbebSnyanmisaka if (syn->pp.sps_temporal_mvp_enabled_flag &&
1286*437bfbebSnyanmisaka (ctx->frame_type != INTRA_FRAME)) {
1287*437bfbebSnyanmisaka if (ctx->last_frame_type == INTRA_FRAME) {
1288*437bfbebSnyanmisaka regs->me_cnst.colmv_load = 0;
1289*437bfbebSnyanmisaka } else {
1290*437bfbebSnyanmisaka regs->me_cnst.colmv_load = 1;
1291*437bfbebSnyanmisaka }
1292*437bfbebSnyanmisaka regs->me_cnst.colmv_store = 1;
1293*437bfbebSnyanmisaka }
1294*437bfbebSnyanmisaka
1295*437bfbebSnyanmisaka if (syn->pp.pic_width > 2688) {
1296*437bfbebSnyanmisaka regs->me_ram.cime_rama_h = 12;
1297*437bfbebSnyanmisaka } else if (syn->pp.pic_width > 2048) {
1298*437bfbebSnyanmisaka regs->me_ram.cime_rama_h = 16;
1299*437bfbebSnyanmisaka } else {
1300*437bfbebSnyanmisaka regs->me_ram.cime_rama_h = 20;
1301*437bfbebSnyanmisaka }
1302*437bfbebSnyanmisaka
1303*437bfbebSnyanmisaka {
1304*437bfbebSnyanmisaka RK_S32 swin_scope_wd16 = (regs->me_rnge.cime_srch_h + 3 + 1) / 4 * 2 + 1;
1305*437bfbebSnyanmisaka RK_S32 tmpMin = (regs->me_rnge.cime_srch_v + 3) / 4 * 2 + 1;
1306*437bfbebSnyanmisaka if (regs->me_ram.cime_rama_h / 4 < tmpMin) {
1307*437bfbebSnyanmisaka tmpMin = regs->me_ram.cime_rama_h / 4;
1308*437bfbebSnyanmisaka }
1309*437bfbebSnyanmisaka regs->me_ram.cime_rama_max =
1310*437bfbebSnyanmisaka (pic_wd64 * (tmpMin - 1)) + ((pic_wd64 >= swin_scope_wd16) ? swin_scope_wd16 : pic_wd64 * 2);
1311*437bfbebSnyanmisaka }
1312*437bfbebSnyanmisaka regs->me_ram.cach_l2_tag = 0x0;
1313*437bfbebSnyanmisaka
1314*437bfbebSnyanmisaka pic_wd64 = pic_wd64 << 6;
1315*437bfbebSnyanmisaka
1316*437bfbebSnyanmisaka if (pic_wd64 <= 512)
1317*437bfbebSnyanmisaka regs->me_ram.cach_l2_tag = 0x0;
1318*437bfbebSnyanmisaka else if (pic_wd64 <= 1024)
1319*437bfbebSnyanmisaka regs->me_ram.cach_l2_tag = 0x1;
1320*437bfbebSnyanmisaka else if (pic_wd64 <= 2048)
1321*437bfbebSnyanmisaka regs->me_ram.cach_l2_tag = 0x2;
1322*437bfbebSnyanmisaka else if (pic_wd64 <= 4096)
1323*437bfbebSnyanmisaka regs->me_ram.cach_l2_tag = 0x3;
1324*437bfbebSnyanmisaka }
1325*437bfbebSnyanmisaka
vepu540_h265_set_me_ram(H265eSyntax_new * syn,H265eV541RegSet * regs,RK_U32 index,RK_S32 tile_start_x)1326*437bfbebSnyanmisaka static void vepu540_h265_set_me_ram(H265eSyntax_new *syn, H265eV541RegSet *regs,
1327*437bfbebSnyanmisaka RK_U32 index, RK_S32 tile_start_x)
1328*437bfbebSnyanmisaka {
1329*437bfbebSnyanmisaka RK_U32 cime_w = 11, cime_h = 7;
1330*437bfbebSnyanmisaka RK_U32 pic_cime_temp = 0;
1331*437bfbebSnyanmisaka if (syn->pp.tiles_enabled_flag == 0) {
1332*437bfbebSnyanmisaka pic_cime_temp = ((regs->enc_rsl.pic_wd8_m1 + 1) * 8 + 63) / 64 * 64;
1333*437bfbebSnyanmisaka regs->me_ram.cime_linebuf_w = pic_cime_temp / 64;
1334*437bfbebSnyanmisaka } else {
1335*437bfbebSnyanmisaka RK_S32 pic_wd64 = MPP_ALIGN(syn->pp.pic_width, 64) >> 6;
1336*437bfbebSnyanmisaka RK_S32 tile_ctu_stax = tile_start_x;
1337*437bfbebSnyanmisaka RK_S32 tile_ctu_endx = tile_start_x + syn->pp.column_width_minus1[index];
1338*437bfbebSnyanmisaka RK_S32 cime_srch_w = regs->me_rnge.cime_srch_h;
1339*437bfbebSnyanmisaka
1340*437bfbebSnyanmisaka if (tile_ctu_stax < (cime_srch_w + 3) / 4) {
1341*437bfbebSnyanmisaka if (tile_ctu_endx + 1 + (cime_srch_w + 3) / 4 > pic_wd64)
1342*437bfbebSnyanmisaka pic_cime_temp = pic_wd64 * 64;
1343*437bfbebSnyanmisaka else
1344*437bfbebSnyanmisaka pic_cime_temp = (tile_ctu_endx + 1 + (cime_srch_w + 3) / 4) * 64;
1345*437bfbebSnyanmisaka } else {
1346*437bfbebSnyanmisaka if (tile_ctu_endx + 1 + (cime_srch_w + 3) / 4 > pic_wd64)
1347*437bfbebSnyanmisaka pic_cime_temp = (pic_wd64 - tile_ctu_stax + (cime_srch_w + 3) / 4) * 64;
1348*437bfbebSnyanmisaka else
1349*437bfbebSnyanmisaka pic_cime_temp = (tile_ctu_endx - tile_ctu_stax + 1 + (cime_srch_w + 3) / 4 * 2) * 64;
1350*437bfbebSnyanmisaka }
1351*437bfbebSnyanmisaka regs->me_ram.cime_linebuf_w = pic_cime_temp / 64;
1352*437bfbebSnyanmisaka
1353*437bfbebSnyanmisaka }
1354*437bfbebSnyanmisaka
1355*437bfbebSnyanmisaka {
1356*437bfbebSnyanmisaka
1357*437bfbebSnyanmisaka RK_S32 w_temp = 1296;
1358*437bfbebSnyanmisaka RK_S32 h_temp = 4;
1359*437bfbebSnyanmisaka RK_S32 h_val_0 = 4;
1360*437bfbebSnyanmisaka RK_S32 h_val_1 = 24;
1361*437bfbebSnyanmisaka
1362*437bfbebSnyanmisaka while ((w_temp > ((h_temp - h_val_0)*regs->me_ram.cime_linebuf_w * 4 + ((h_val_1 - h_temp) * 4 * 7)))
1363*437bfbebSnyanmisaka && (h_temp < 17)) {
1364*437bfbebSnyanmisaka h_temp = h_temp + h_val_0;
1365*437bfbebSnyanmisaka }
1366*437bfbebSnyanmisaka if (w_temp < (RK_S32)((h_temp - h_val_0)*regs->me_ram.cime_linebuf_w * 4 + ((h_val_1 - h_temp) * 4 * 7)))
1367*437bfbebSnyanmisaka h_temp = h_temp - h_val_0;
1368*437bfbebSnyanmisaka
1369*437bfbebSnyanmisaka regs->me_ram.cime_rama_h = h_temp;
1370*437bfbebSnyanmisaka }
1371*437bfbebSnyanmisaka
1372*437bfbebSnyanmisaka // calc cime_rama_max
1373*437bfbebSnyanmisaka {
1374*437bfbebSnyanmisaka RK_S32 pic_wd64 = pic_cime_temp / 64;
1375*437bfbebSnyanmisaka RK_S32 swin_scope_wd16 = (cime_w + 3 + 1) / 4 * 2 + 1;
1376*437bfbebSnyanmisaka RK_S32 tmpMin = (cime_h + 3) / 4 * 2 + 1;
1377*437bfbebSnyanmisaka if (regs->me_ram.cime_rama_h / 4 < tmpMin) {
1378*437bfbebSnyanmisaka tmpMin = regs->me_ram.cime_rama_h / 4;
1379*437bfbebSnyanmisaka }
1380*437bfbebSnyanmisaka regs->me_ram.cime_rama_max = (pic_wd64 * (tmpMin - 1)) + ((pic_wd64 >= swin_scope_wd16) ? swin_scope_wd16 : pic_wd64 * 2);
1381*437bfbebSnyanmisaka }
1382*437bfbebSnyanmisaka
1383*437bfbebSnyanmisaka hal_h265e_dbg_detail("cime_rama_h %d, cime_rama_max %d, cime_linebuf_w %d",
1384*437bfbebSnyanmisaka regs->me_ram.cime_rama_h, regs->me_ram.cime_rama_max, regs->me_ram.cime_linebuf_w);
1385*437bfbebSnyanmisaka }
vepu54x_h265_set_hw_address(H265eV541HalContext * ctx,H265eV541RegSet * regs,HalEncTask * task)1386*437bfbebSnyanmisaka void vepu54x_h265_set_hw_address(H265eV541HalContext *ctx, H265eV541RegSet *regs, HalEncTask *task)
1387*437bfbebSnyanmisaka {
1388*437bfbebSnyanmisaka HalEncTask *enc_task = task;
1389*437bfbebSnyanmisaka HalBuf *recon_buf, *ref_buf;
1390*437bfbebSnyanmisaka MppBuffer md_info_buf = enc_task->md_info;
1391*437bfbebSnyanmisaka H265eSyntax_new *syn = (H265eSyntax_new *)enc_task->syntax.data;
1392*437bfbebSnyanmisaka
1393*437bfbebSnyanmisaka hal_h265e_enter();
1394*437bfbebSnyanmisaka
1395*437bfbebSnyanmisaka regs->adr_srcy_hevc = mpp_buffer_get_fd(enc_task->input);
1396*437bfbebSnyanmisaka regs->adr_srcu_hevc = regs->adr_srcy_hevc;
1397*437bfbebSnyanmisaka regs->adr_srcv_hevc = regs->adr_srcy_hevc;
1398*437bfbebSnyanmisaka
1399*437bfbebSnyanmisaka recon_buf = hal_bufs_get_buf(ctx->dpb_bufs, syn->sp.recon_pic.slot_idx);
1400*437bfbebSnyanmisaka ref_buf = hal_bufs_get_buf(ctx->dpb_bufs, syn->sp.ref_pic.slot_idx);
1401*437bfbebSnyanmisaka if (!syn->sp.non_reference_flag) {
1402*437bfbebSnyanmisaka regs->rfpw_h_addr_hevc = mpp_buffer_get_fd(recon_buf->buf[0]);
1403*437bfbebSnyanmisaka regs->rfpw_b_addr_hevc = regs->rfpw_h_addr_hevc;
1404*437bfbebSnyanmisaka
1405*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 75, ctx->fbc_header_len);
1406*437bfbebSnyanmisaka }
1407*437bfbebSnyanmisaka
1408*437bfbebSnyanmisaka regs->dspw_addr_hevc = mpp_buffer_get_fd(recon_buf->buf[1]);
1409*437bfbebSnyanmisaka regs->cmvw_addr_hevc = mpp_buffer_get_fd(recon_buf->buf[2]);
1410*437bfbebSnyanmisaka regs->rfpr_h_addr_hevc = mpp_buffer_get_fd(ref_buf->buf[0]);
1411*437bfbebSnyanmisaka regs->rfpr_b_addr_hevc = regs->rfpr_h_addr_hevc;
1412*437bfbebSnyanmisaka regs->dspr_addr_hevc = mpp_buffer_get_fd(ref_buf->buf[1]);
1413*437bfbebSnyanmisaka regs->cmvr_addr_hevc = mpp_buffer_get_fd(ref_buf->buf[2]);
1414*437bfbebSnyanmisaka
1415*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 77, ctx->fbc_header_len);
1416*437bfbebSnyanmisaka
1417*437bfbebSnyanmisaka if (syn->pp.tiles_enabled_flag) {
1418*437bfbebSnyanmisaka if (NULL == ctx->tile_grp)
1419*437bfbebSnyanmisaka mpp_buffer_group_get_internal(&ctx->tile_grp, MPP_BUFFER_TYPE_ION);
1420*437bfbebSnyanmisaka
1421*437bfbebSnyanmisaka mpp_assert(ctx->tile_grp);
1422*437bfbebSnyanmisaka
1423*437bfbebSnyanmisaka if (NULL == ctx->hw_tile_buf[0]) {
1424*437bfbebSnyanmisaka mpp_buffer_get(ctx->tile_grp, &ctx->hw_tile_buf[0], TILE_BUF_SIZE);
1425*437bfbebSnyanmisaka }
1426*437bfbebSnyanmisaka
1427*437bfbebSnyanmisaka if (NULL == ctx->hw_tile_buf[1]) {
1428*437bfbebSnyanmisaka mpp_buffer_get(ctx->tile_grp, &ctx->hw_tile_buf[1], TILE_BUF_SIZE);
1429*437bfbebSnyanmisaka }
1430*437bfbebSnyanmisaka
1431*437bfbebSnyanmisaka regs->lpfw_addr_hevc = mpp_buffer_get_fd(ctx->hw_tile_buf[0]);
1432*437bfbebSnyanmisaka regs->lpfr_addr_hevc = mpp_buffer_get_fd(ctx->hw_tile_buf[1]);
1433*437bfbebSnyanmisaka }
1434*437bfbebSnyanmisaka
1435*437bfbebSnyanmisaka if (md_info_buf) {
1436*437bfbebSnyanmisaka regs->enc_pic.mei_stor = 1;
1437*437bfbebSnyanmisaka regs->meiw_addr_hevc = mpp_buffer_get_fd(md_info_buf);
1438*437bfbebSnyanmisaka } else {
1439*437bfbebSnyanmisaka regs->enc_pic.mei_stor = 0;
1440*437bfbebSnyanmisaka regs->meiw_addr_hevc = 0;
1441*437bfbebSnyanmisaka }
1442*437bfbebSnyanmisaka
1443*437bfbebSnyanmisaka regs->bsbb_addr_hevc = mpp_buffer_get_fd(enc_task->output);
1444*437bfbebSnyanmisaka /* TODO: stream size relative with syntax */
1445*437bfbebSnyanmisaka regs->bsbt_addr_hevc = regs->bsbb_addr_hevc;
1446*437bfbebSnyanmisaka regs->bsbr_addr_hevc = regs->bsbb_addr_hevc;
1447*437bfbebSnyanmisaka regs->bsbw_addr_hevc = regs->bsbb_addr_hevc;
1448*437bfbebSnyanmisaka
1449*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 86, mpp_packet_get_length(task->packet));
1450*437bfbebSnyanmisaka
1451*437bfbebSnyanmisaka regs->pic_ofst.pic_ofst_y = mpp_frame_get_offset_y(task->frame);
1452*437bfbebSnyanmisaka regs->pic_ofst.pic_ofst_x = mpp_frame_get_offset_x(task->frame);
1453*437bfbebSnyanmisaka }
1454*437bfbebSnyanmisaka
setup_vepu541_split(H265eV541RegSet * regs,MppEncSliceSplit * cfg)1455*437bfbebSnyanmisaka static void setup_vepu541_split(H265eV541RegSet *regs, MppEncSliceSplit *cfg)
1456*437bfbebSnyanmisaka {
1457*437bfbebSnyanmisaka hal_h265e_dbg_func("enter\n");
1458*437bfbebSnyanmisaka
1459*437bfbebSnyanmisaka switch (cfg->split_mode) {
1460*437bfbebSnyanmisaka case MPP_ENC_SPLIT_NONE : {
1461*437bfbebSnyanmisaka regs->sli_spl.sli_splt = 0;
1462*437bfbebSnyanmisaka regs->sli_spl.sli_splt_mode = 0;
1463*437bfbebSnyanmisaka regs->sli_spl.sli_splt_cpst = 0;
1464*437bfbebSnyanmisaka regs->sli_spl.sli_max_num_m1 = 0;
1465*437bfbebSnyanmisaka regs->sli_spl.sli_flsh = 0;
1466*437bfbebSnyanmisaka regs->sli_spl.sli_splt_cnum_m1 = 0;
1467*437bfbebSnyanmisaka
1468*437bfbebSnyanmisaka regs->sli_spl_byte.sli_splt_byte = 0;
1469*437bfbebSnyanmisaka regs->enc_pic.slen_fifo = 0;
1470*437bfbebSnyanmisaka } break;
1471*437bfbebSnyanmisaka case MPP_ENC_SPLIT_BY_BYTE : {
1472*437bfbebSnyanmisaka regs->sli_spl.sli_splt = 1;
1473*437bfbebSnyanmisaka regs->sli_spl.sli_splt_mode = 0;
1474*437bfbebSnyanmisaka regs->sli_spl.sli_splt_cpst = 0;
1475*437bfbebSnyanmisaka regs->sli_spl.sli_max_num_m1 = 500;
1476*437bfbebSnyanmisaka regs->sli_spl.sli_flsh = 1;
1477*437bfbebSnyanmisaka regs->sli_spl.sli_splt_cnum_m1 = 0;
1478*437bfbebSnyanmisaka
1479*437bfbebSnyanmisaka regs->sli_spl_byte.sli_splt_byte = cfg->split_arg;
1480*437bfbebSnyanmisaka regs->enc_pic.slen_fifo = 0;
1481*437bfbebSnyanmisaka } break;
1482*437bfbebSnyanmisaka case MPP_ENC_SPLIT_BY_CTU : {
1483*437bfbebSnyanmisaka regs->sli_spl.sli_splt = 1;
1484*437bfbebSnyanmisaka regs->sli_spl.sli_splt_mode = 1;
1485*437bfbebSnyanmisaka regs->sli_spl.sli_splt_cpst = 0;
1486*437bfbebSnyanmisaka regs->sli_spl.sli_max_num_m1 = 500;
1487*437bfbebSnyanmisaka regs->sli_spl.sli_flsh = 1;
1488*437bfbebSnyanmisaka regs->sli_spl.sli_splt_cnum_m1 = cfg->split_arg - 1;
1489*437bfbebSnyanmisaka
1490*437bfbebSnyanmisaka regs->sli_spl_byte.sli_splt_byte = 0;
1491*437bfbebSnyanmisaka regs->enc_pic.slen_fifo = 0;
1492*437bfbebSnyanmisaka } break;
1493*437bfbebSnyanmisaka default : {
1494*437bfbebSnyanmisaka mpp_log_f("invalide slice split mode %d\n", cfg->split_mode);
1495*437bfbebSnyanmisaka } break;
1496*437bfbebSnyanmisaka }
1497*437bfbebSnyanmisaka
1498*437bfbebSnyanmisaka hal_h265e_dbg_func("leave\n");
1499*437bfbebSnyanmisaka }
1500*437bfbebSnyanmisaka
hal_h265e_v541_gen_regs(void * hal,HalEncTask * task)1501*437bfbebSnyanmisaka MPP_RET hal_h265e_v541_gen_regs(void *hal, HalEncTask *task)
1502*437bfbebSnyanmisaka {
1503*437bfbebSnyanmisaka H265eV541HalContext *ctx = (H265eV541HalContext *)hal;
1504*437bfbebSnyanmisaka HalEncTask *enc_task = task;
1505*437bfbebSnyanmisaka H265eSyntax_new *syn = (H265eSyntax_new *)enc_task->syntax.data;
1506*437bfbebSnyanmisaka H265eV541RegSet *regs = ctx->regs;
1507*437bfbebSnyanmisaka RK_U32 pic_width_align8, pic_height_align8;
1508*437bfbebSnyanmisaka RK_S32 pic_wd64, pic_h64;
1509*437bfbebSnyanmisaka VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
1510*437bfbebSnyanmisaka EncFrmStatus *frm_status = &task->rc_task->frm;
1511*437bfbebSnyanmisaka
1512*437bfbebSnyanmisaka hal_h265e_enter();
1513*437bfbebSnyanmisaka pic_width_align8 = (syn->pp.pic_width + 7) & (~7);
1514*437bfbebSnyanmisaka pic_height_align8 = (syn->pp.pic_height + 7) & (~7);
1515*437bfbebSnyanmisaka pic_wd64 = (syn->pp.pic_width + 63) / 64;
1516*437bfbebSnyanmisaka pic_h64 = (syn->pp.pic_height + 63) / 64;
1517*437bfbebSnyanmisaka
1518*437bfbebSnyanmisaka hal_h265e_dbg_simple("frame %d | type %d | start gen regs",
1519*437bfbebSnyanmisaka ctx->frame_cnt, ctx->frame_type);
1520*437bfbebSnyanmisaka
1521*437bfbebSnyanmisaka
1522*437bfbebSnyanmisaka memset(regs, 0, sizeof(H265eV541RegSet));
1523*437bfbebSnyanmisaka regs->enc_strt.lkt_num = 0;
1524*437bfbebSnyanmisaka regs->enc_strt.rkvenc_cmd = ctx->enc_mode;
1525*437bfbebSnyanmisaka regs->enc_strt.enc_cke = 1;
1526*437bfbebSnyanmisaka regs->enc_clr.safe_clr = 0x0;
1527*437bfbebSnyanmisaka
1528*437bfbebSnyanmisaka regs->lkt_addr.lkt_addr = 0x0;
1529*437bfbebSnyanmisaka regs->int_en.enc_done_en = 1;
1530*437bfbebSnyanmisaka regs->int_en.lkt_done_en = 1;
1531*437bfbebSnyanmisaka regs->int_en.sclr_done_en = 1;
1532*437bfbebSnyanmisaka regs->int_en.slc_done_en = 1;
1533*437bfbebSnyanmisaka regs->int_en.bsf_ovflw_en = 1;
1534*437bfbebSnyanmisaka regs->int_en.brsp_ostd_en = 1;
1535*437bfbebSnyanmisaka regs->int_en.wbus_err_en = 1;
1536*437bfbebSnyanmisaka regs->int_en.rbus_err_en = 1;
1537*437bfbebSnyanmisaka regs->int_en.wdg_en = 0;
1538*437bfbebSnyanmisaka
1539*437bfbebSnyanmisaka regs->enc_rsl.pic_wd8_m1 = pic_width_align8 / 8 - 1;
1540*437bfbebSnyanmisaka regs->enc_rsl.pic_wfill = (syn->pp.pic_width & 0x7)
1541*437bfbebSnyanmisaka ? (8 - (syn->pp.pic_width & 0x7)) : 0;
1542*437bfbebSnyanmisaka regs->enc_rsl.pic_hd8_m1 = pic_height_align8 / 8 - 1;
1543*437bfbebSnyanmisaka regs->enc_rsl.pic_hfill = (syn->pp.pic_height & 0x7)
1544*437bfbebSnyanmisaka ? (8 - (syn->pp.pic_height & 0x7)) : 0;
1545*437bfbebSnyanmisaka
1546*437bfbebSnyanmisaka regs->enc_pic.enc_stnd = 1; //H265
1547*437bfbebSnyanmisaka regs->enc_pic.cur_frm_ref = !syn->sp.non_reference_flag; //current frame will be refered
1548*437bfbebSnyanmisaka regs->enc_pic.bs_scp = 1;
1549*437bfbebSnyanmisaka regs->enc_pic.node_int = 0;
1550*437bfbebSnyanmisaka regs->enc_pic.log2_ctu_num = ceil(log2((double)pic_wd64 * pic_h64));
1551*437bfbebSnyanmisaka
1552*437bfbebSnyanmisaka regs->enc_pic.rdo_wgt_sel = (ctx->frame_type == INTRA_FRAME) ? 0 : 1;
1553*437bfbebSnyanmisaka
1554*437bfbebSnyanmisaka regs->enc_wdg.vs_load_thd = 0;
1555*437bfbebSnyanmisaka regs->enc_wdg.rfp_load_thd = 0;
1556*437bfbebSnyanmisaka
1557*437bfbebSnyanmisaka if (ctx->is_vepu540) {
1558*437bfbebSnyanmisaka regs->dtrns_cfg_540.cime_dspw_orsd = (ctx->frame_type == INTER_P_FRAME);
1559*437bfbebSnyanmisaka regs->dtrns_cfg_540.axi_brsp_cke = 0x0;
1560*437bfbebSnyanmisaka } else {
1561*437bfbebSnyanmisaka regs->dtrns_cfg_541.cime_dspw_orsd = (ctx->frame_type == INTER_P_FRAME);
1562*437bfbebSnyanmisaka regs->dtrns_cfg_541.axi_brsp_cke = 0x0;
1563*437bfbebSnyanmisaka }
1564*437bfbebSnyanmisaka
1565*437bfbebSnyanmisaka regs->dtrns_map.lpfw_bus_ordr = 0x0;
1566*437bfbebSnyanmisaka regs->dtrns_map.cmvw_bus_ordr = 0x0;
1567*437bfbebSnyanmisaka regs->dtrns_map.dspw_bus_ordr = 0x0;
1568*437bfbebSnyanmisaka regs->dtrns_map.rfpw_bus_ordr = 0x0;
1569*437bfbebSnyanmisaka regs->dtrns_map.src_bus_edin = 0x0;
1570*437bfbebSnyanmisaka regs->dtrns_map.meiw_bus_edin = 0x0;
1571*437bfbebSnyanmisaka regs->dtrns_map.bsw_bus_edin = 0x7;
1572*437bfbebSnyanmisaka regs->dtrns_map.lktr_bus_edin = 0x0;
1573*437bfbebSnyanmisaka regs->dtrns_map.roir_bus_edin = 0x0;
1574*437bfbebSnyanmisaka regs->dtrns_map.lktw_bus_edin = 0x0;
1575*437bfbebSnyanmisaka regs->dtrns_map.afbc_bsize = 0x1;
1576*437bfbebSnyanmisaka
1577*437bfbebSnyanmisaka
1578*437bfbebSnyanmisaka regs->src_proc.src_mirr = 0;
1579*437bfbebSnyanmisaka regs->src_proc.src_rot = 0;
1580*437bfbebSnyanmisaka regs->src_proc.txa_en = 1;
1581*437bfbebSnyanmisaka regs->src_proc.afbcd_en = (MPP_FRAME_FMT_IS_FBC(syn->pp.mpp_format)) ? 1 : 0;
1582*437bfbebSnyanmisaka
1583*437bfbebSnyanmisaka if (!ctx->is_vepu540)
1584*437bfbebSnyanmisaka vepu541_h265_set_patch_info(ctx->dev, syn, (VepuFmt)fmt->format, task);
1585*437bfbebSnyanmisaka
1586*437bfbebSnyanmisaka regs->klut_ofst.chrm_kult_ofst = (ctx->frame_type == INTRA_FRAME) ? 0 : 3;
1587*437bfbebSnyanmisaka memcpy(®s->klut_wgt0, &klut_weight[0], sizeof(klut_weight));
1588*437bfbebSnyanmisaka
1589*437bfbebSnyanmisaka regs->adr_srcy_hevc = mpp_buffer_get_fd(enc_task->input);
1590*437bfbebSnyanmisaka regs->adr_srcu_hevc = regs->adr_srcy_hevc;
1591*437bfbebSnyanmisaka regs->adr_srcv_hevc = regs->adr_srcy_hevc;
1592*437bfbebSnyanmisaka
1593*437bfbebSnyanmisaka setup_vepu541_split(regs, &ctx->cfg->split);
1594*437bfbebSnyanmisaka
1595*437bfbebSnyanmisaka vepu541_h265_set_me_regs(ctx, syn, regs);
1596*437bfbebSnyanmisaka
1597*437bfbebSnyanmisaka regs->rdo_cfg.chrm_special = 1;
1598*437bfbebSnyanmisaka regs->rdo_cfg.cu_inter_en = 0xf;
1599*437bfbebSnyanmisaka regs->rdo_cfg.cu_intra_en = 0xf;
1600*437bfbebSnyanmisaka
1601*437bfbebSnyanmisaka if (syn->pp.num_long_term_ref_pics_sps) {
1602*437bfbebSnyanmisaka regs->rdo_cfg.ltm_col = 0;
1603*437bfbebSnyanmisaka regs->rdo_cfg.ltm_idx0l0 = 1;
1604*437bfbebSnyanmisaka } else {
1605*437bfbebSnyanmisaka regs->rdo_cfg.ltm_col = 0;
1606*437bfbebSnyanmisaka regs->rdo_cfg.ltm_idx0l0 = 0;
1607*437bfbebSnyanmisaka }
1608*437bfbebSnyanmisaka
1609*437bfbebSnyanmisaka regs->rdo_cfg.chrm_klut_en = 1;
1610*437bfbebSnyanmisaka regs->rdo_cfg.seq_scaling_matrix_present_flg = syn->pp.scaling_list_enabled_flag;
1611*437bfbebSnyanmisaka regs->synt_nal.nal_unit_type = h265e_get_nal_type(&syn->sp, ctx->frame_type);
1612*437bfbebSnyanmisaka
1613*437bfbebSnyanmisaka vepu54x_h265_set_hw_address(ctx, regs, task);
1614*437bfbebSnyanmisaka vepu541_h265_set_pp_regs(fmt, ctx, task);
1615*437bfbebSnyanmisaka
1616*437bfbebSnyanmisaka vepu541_h265_set_rc_regs(ctx, regs, task);
1617*437bfbebSnyanmisaka
1618*437bfbebSnyanmisaka vepu541_h265_set_slice_regs(syn, regs);
1619*437bfbebSnyanmisaka
1620*437bfbebSnyanmisaka vepu541_h265_set_ref_regs(syn, regs);
1621*437bfbebSnyanmisaka if (ctx->is_vepu540) {
1622*437bfbebSnyanmisaka vepu540_set_osd(&ctx->osd_cfg);
1623*437bfbebSnyanmisaka } else {
1624*437bfbebSnyanmisaka vepu541_set_osd(&ctx->osd_cfg);
1625*437bfbebSnyanmisaka }
1626*437bfbebSnyanmisaka /* ROI configure */
1627*437bfbebSnyanmisaka vepu541_h265_set_roi_regs(ctx, regs);
1628*437bfbebSnyanmisaka
1629*437bfbebSnyanmisaka if (frm_status->is_i_refresh)
1630*437bfbebSnyanmisaka setup_vepu541_intra_refresh(regs, ctx, frm_status->seq_idx % ctx->cfg->rc.gop);
1631*437bfbebSnyanmisaka
1632*437bfbebSnyanmisaka ctx->frame_num++;
1633*437bfbebSnyanmisaka
1634*437bfbebSnyanmisaka hal_h265e_leave();
1635*437bfbebSnyanmisaka return MPP_OK;
1636*437bfbebSnyanmisaka }
hal_h265e_v540_set_uniform_tile(H265eV541RegSet * regs,H265eSyntax_new * syn,RK_U32 index,RK_S32 tile_start_x)1637*437bfbebSnyanmisaka void hal_h265e_v540_set_uniform_tile(H265eV541RegSet *regs, H265eSyntax_new *syn,
1638*437bfbebSnyanmisaka RK_U32 index, RK_S32 tile_start_x)
1639*437bfbebSnyanmisaka {
1640*437bfbebSnyanmisaka if (syn->pp.tiles_enabled_flag) {
1641*437bfbebSnyanmisaka RK_S32 mb_h = MPP_ALIGN(syn->pp.pic_height, 64) / 64;
1642*437bfbebSnyanmisaka RK_S32 tile_width = syn->pp.column_width_minus1[index] + 1;
1643*437bfbebSnyanmisaka
1644*437bfbebSnyanmisaka regs->tile_cfg.tile_width_m1 = tile_width - 1;
1645*437bfbebSnyanmisaka regs->tile_cfg.tile_height_m1 = mb_h - 1;
1646*437bfbebSnyanmisaka regs->rc_cfg.rc_ctu_num = tile_width;
1647*437bfbebSnyanmisaka regs->tile_cfg.tile_en = syn->pp.tiles_enabled_flag;
1648*437bfbebSnyanmisaka regs->tile_pos.tile_x = tile_start_x;
1649*437bfbebSnyanmisaka regs->tile_pos.tile_y = 0;
1650*437bfbebSnyanmisaka if (index > 0) {
1651*437bfbebSnyanmisaka RK_U32 tmp = regs->lpfr_addr_hevc;
1652*437bfbebSnyanmisaka regs->lpfr_addr_hevc = regs->lpfw_addr_hevc;
1653*437bfbebSnyanmisaka regs->lpfw_addr_hevc = tmp;
1654*437bfbebSnyanmisaka }
1655*437bfbebSnyanmisaka
1656*437bfbebSnyanmisaka hal_h265e_dbg_detail("tile_x %d, rc_ctu_num %d, tile_width_m1 %d",
1657*437bfbebSnyanmisaka regs->tile_pos.tile_x, regs->rc_cfg.rc_ctu_num,
1658*437bfbebSnyanmisaka regs->tile_cfg.tile_width_m1);
1659*437bfbebSnyanmisaka }
1660*437bfbebSnyanmisaka }
1661*437bfbebSnyanmisaka
hal_h265e_v540_start(void * hal,HalEncTask * enc_task)1662*437bfbebSnyanmisaka MPP_RET hal_h265e_v540_start(void *hal, HalEncTask *enc_task)
1663*437bfbebSnyanmisaka {
1664*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
1665*437bfbebSnyanmisaka H265eV541HalContext *ctx = (H265eV541HalContext *)hal;
1666*437bfbebSnyanmisaka RK_U32 length = 0, k = 0;
1667*437bfbebSnyanmisaka H265eV541IoctlOutputElem *reg_out = (H265eV541IoctlOutputElem *)ctx->reg_out;
1668*437bfbebSnyanmisaka H265eSyntax_new *syn = (H265eSyntax_new *)enc_task->syntax.data;
1669*437bfbebSnyanmisaka RK_U32 title_num = (syn->pp.num_tile_columns_minus1 + 1) * (syn->pp.num_tile_rows_minus1 + 1);
1670*437bfbebSnyanmisaka hal_h265e_enter();
1671*437bfbebSnyanmisaka RK_U32 stream_len = 0;
1672*437bfbebSnyanmisaka VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
1673*437bfbebSnyanmisaka RK_S32 tile_start_x = 0;
1674*437bfbebSnyanmisaka
1675*437bfbebSnyanmisaka if (enc_task->flags.err) {
1676*437bfbebSnyanmisaka hal_h265e_err("enc_task->flags.err %08x, return e arly",
1677*437bfbebSnyanmisaka enc_task->flags.err);
1678*437bfbebSnyanmisaka return MPP_NOK;
1679*437bfbebSnyanmisaka }
1680*437bfbebSnyanmisaka
1681*437bfbebSnyanmisaka for (k = 0; k < title_num; k++) { //v540 no support link list
1682*437bfbebSnyanmisaka RK_U32 i;
1683*437bfbebSnyanmisaka RK_U32 *regs = (RK_U32*)ctx->regs;
1684*437bfbebSnyanmisaka H265eV541RegSet *hw_regs = ctx->regs;
1685*437bfbebSnyanmisaka MppDevRegWrCfg cfg;
1686*437bfbebSnyanmisaka MppDevRegRdCfg cfg1;
1687*437bfbebSnyanmisaka
1688*437bfbebSnyanmisaka vepu540_h265_set_me_ram(syn, hw_regs, k, tile_start_x);
1689*437bfbebSnyanmisaka
1690*437bfbebSnyanmisaka /* set input info */
1691*437bfbebSnyanmisaka vepu541_h265_set_l2_regs(ctx, (H265eV54xL2RegSet*)ctx->l2_regs);
1692*437bfbebSnyanmisaka vepu541_h265_set_patch_info(ctx->dev, syn, (VepuFmt)fmt->format, enc_task);
1693*437bfbebSnyanmisaka if (title_num > 1)
1694*437bfbebSnyanmisaka hal_h265e_v540_set_uniform_tile(hw_regs, syn, k, tile_start_x);
1695*437bfbebSnyanmisaka if (k > 0) {
1696*437bfbebSnyanmisaka RK_U32 offset = mpp_packet_get_length(enc_task->packet);
1697*437bfbebSnyanmisaka
1698*437bfbebSnyanmisaka offset += stream_len;
1699*437bfbebSnyanmisaka hw_regs->bsbb_addr_hevc = mpp_buffer_get_fd(enc_task->output);
1700*437bfbebSnyanmisaka hw_regs->bsbw_addr_hevc = hw_regs->bsbb_addr_hevc;
1701*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 86, offset);
1702*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 75, ctx->fbc_header_len);
1703*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 77, ctx->fbc_header_len);
1704*437bfbebSnyanmisaka }
1705*437bfbebSnyanmisaka
1706*437bfbebSnyanmisaka cfg.reg = ctx->regs;
1707*437bfbebSnyanmisaka cfg.size = sizeof(H265eV541RegSet);
1708*437bfbebSnyanmisaka cfg.offset = 0;
1709*437bfbebSnyanmisaka
1710*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
1711*437bfbebSnyanmisaka if (ret) {
1712*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
1713*437bfbebSnyanmisaka break;
1714*437bfbebSnyanmisaka }
1715*437bfbebSnyanmisaka
1716*437bfbebSnyanmisaka
1717*437bfbebSnyanmisaka cfg1.reg = ®_out->hw_status;
1718*437bfbebSnyanmisaka cfg1.size = sizeof(RK_U32);
1719*437bfbebSnyanmisaka cfg1.offset = VEPU541_REG_BASE_HW_STATUS;
1720*437bfbebSnyanmisaka
1721*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
1722*437bfbebSnyanmisaka if (ret) {
1723*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
1724*437bfbebSnyanmisaka break;
1725*437bfbebSnyanmisaka }
1726*437bfbebSnyanmisaka
1727*437bfbebSnyanmisaka cfg1.reg = ®_out->st_bsl;
1728*437bfbebSnyanmisaka cfg1.size = sizeof(H265eV541IoctlOutputElem) - 4;
1729*437bfbebSnyanmisaka cfg1.offset = VEPU541_REG_BASE_STATISTICS;
1730*437bfbebSnyanmisaka
1731*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
1732*437bfbebSnyanmisaka if (ret) {
1733*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
1734*437bfbebSnyanmisaka break;
1735*437bfbebSnyanmisaka }
1736*437bfbebSnyanmisaka for (i = 0; i < sizeof(H265eV541RegSet) / 4; i++) {
1737*437bfbebSnyanmisaka hal_h265e_dbg_regs("set reg[%04x]: 0%08x\n", i * 4, regs[i]);
1738*437bfbebSnyanmisaka }
1739*437bfbebSnyanmisaka
1740*437bfbebSnyanmisaka if (k < title_num - 1) {
1741*437bfbebSnyanmisaka vepu541_h265_fbk *fb = &ctx->feedback;
1742*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
1743*437bfbebSnyanmisaka if (ret) {
1744*437bfbebSnyanmisaka mpp_err_f("send cmd failed %d\n", ret);
1745*437bfbebSnyanmisaka break;
1746*437bfbebSnyanmisaka }
1747*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
1748*437bfbebSnyanmisaka
1749*437bfbebSnyanmisaka stream_len += reg_out->st_bsl.bs_lgth;
1750*437bfbebSnyanmisaka fb->qp_sum += reg_out->st_sse_qp.qp_sum;
1751*437bfbebSnyanmisaka fb->out_strm_size += reg_out->st_bsl.bs_lgth;
1752*437bfbebSnyanmisaka fb->sse_sum += reg_out->st_sse_l32.sse_l32 +
1753*437bfbebSnyanmisaka ((RK_S64)(reg_out->st_sse_qp.sse_h8 & 0xff) << 32);
1754*437bfbebSnyanmisaka fb->st_madi += reg_out->st_madi;
1755*437bfbebSnyanmisaka fb->st_madp += reg_out->st_madi;
1756*437bfbebSnyanmisaka fb->st_mb_num += reg_out->st_mb_num;
1757*437bfbebSnyanmisaka fb->st_ctu_num += reg_out->st_ctu_num;
1758*437bfbebSnyanmisaka
1759*437bfbebSnyanmisaka if (ret) {
1760*437bfbebSnyanmisaka mpp_err_f("poll cmd failed %d\n", ret);
1761*437bfbebSnyanmisaka ret = MPP_ERR_VPUHW;
1762*437bfbebSnyanmisaka }
1763*437bfbebSnyanmisaka
1764*437bfbebSnyanmisaka }
1765*437bfbebSnyanmisaka tile_start_x += (syn->pp.column_width_minus1[k] + 1);
1766*437bfbebSnyanmisaka }
1767*437bfbebSnyanmisaka
1768*437bfbebSnyanmisaka hal_h265e_dbg_detail("vpu client is sending %d regs", length);
1769*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
1770*437bfbebSnyanmisaka if (ret) {
1771*437bfbebSnyanmisaka mpp_err_f("send cmd failed %d\n", ret);
1772*437bfbebSnyanmisaka }
1773*437bfbebSnyanmisaka hal_h265e_leave();
1774*437bfbebSnyanmisaka return ret;
1775*437bfbebSnyanmisaka }
1776*437bfbebSnyanmisaka
hal_h265e_v541_start(void * hal,HalEncTask * task)1777*437bfbebSnyanmisaka MPP_RET hal_h265e_v541_start(void *hal, HalEncTask *task)
1778*437bfbebSnyanmisaka {
1779*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
1780*437bfbebSnyanmisaka H265eV541HalContext *ctx = (H265eV541HalContext *)hal;
1781*437bfbebSnyanmisaka RK_U32 length = 0;
1782*437bfbebSnyanmisaka HalEncTask *enc_task = task;
1783*437bfbebSnyanmisaka H265eV541IoctlOutputElem *reg_out = (H265eV541IoctlOutputElem *)ctx->reg_out;
1784*437bfbebSnyanmisaka RK_U32 i;
1785*437bfbebSnyanmisaka RK_U32 *regs = (RK_U32*)ctx->regs;
1786*437bfbebSnyanmisaka hal_h265e_enter();
1787*437bfbebSnyanmisaka
1788*437bfbebSnyanmisaka if (enc_task->flags.err) {
1789*437bfbebSnyanmisaka hal_h265e_err("enc_task->flags.err %08x, return early",
1790*437bfbebSnyanmisaka enc_task->flags.err);
1791*437bfbebSnyanmisaka return MPP_NOK;
1792*437bfbebSnyanmisaka }
1793*437bfbebSnyanmisaka vepu541_h265_set_l2_regs(ctx, (H265eV54xL2RegSet*)ctx->l2_regs);
1794*437bfbebSnyanmisaka
1795*437bfbebSnyanmisaka do {
1796*437bfbebSnyanmisaka MppDevRegWrCfg cfg;
1797*437bfbebSnyanmisaka
1798*437bfbebSnyanmisaka cfg.reg = ctx->regs;
1799*437bfbebSnyanmisaka cfg.size = sizeof(H265eV541RegSet);
1800*437bfbebSnyanmisaka cfg.offset = 0;
1801*437bfbebSnyanmisaka
1802*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
1803*437bfbebSnyanmisaka if (ret) {
1804*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
1805*437bfbebSnyanmisaka break;
1806*437bfbebSnyanmisaka }
1807*437bfbebSnyanmisaka
1808*437bfbebSnyanmisaka MppDevRegRdCfg cfg1;
1809*437bfbebSnyanmisaka
1810*437bfbebSnyanmisaka cfg1.reg = ®_out->hw_status;
1811*437bfbebSnyanmisaka cfg1.size = sizeof(RK_U32);
1812*437bfbebSnyanmisaka cfg1.offset = VEPU541_REG_BASE_HW_STATUS;
1813*437bfbebSnyanmisaka
1814*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
1815*437bfbebSnyanmisaka if (ret) {
1816*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
1817*437bfbebSnyanmisaka break;
1818*437bfbebSnyanmisaka }
1819*437bfbebSnyanmisaka
1820*437bfbebSnyanmisaka cfg1.reg = ®_out->st_bsl;
1821*437bfbebSnyanmisaka cfg1.size = sizeof(H265eV541IoctlOutputElem) - 4;
1822*437bfbebSnyanmisaka cfg1.offset = VEPU541_REG_BASE_STATISTICS;
1823*437bfbebSnyanmisaka
1824*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
1825*437bfbebSnyanmisaka if (ret) {
1826*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
1827*437bfbebSnyanmisaka break;
1828*437bfbebSnyanmisaka }
1829*437bfbebSnyanmisaka
1830*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
1831*437bfbebSnyanmisaka if (ret) {
1832*437bfbebSnyanmisaka mpp_err_f("send cmd failed %d\n", ret);
1833*437bfbebSnyanmisaka break;
1834*437bfbebSnyanmisaka }
1835*437bfbebSnyanmisaka } while (0);
1836*437bfbebSnyanmisaka
1837*437bfbebSnyanmisaka for (i = 0; i < sizeof(H265eV541RegSet) / 4; i++) {
1838*437bfbebSnyanmisaka hal_h265e_dbg_regs("set reg[%04d]: 0%08x\n", i, regs[i]);
1839*437bfbebSnyanmisaka }
1840*437bfbebSnyanmisaka
1841*437bfbebSnyanmisaka hal_h265e_dbg_detail("vpu client is sending %d regs", length);
1842*437bfbebSnyanmisaka hal_h265e_leave();
1843*437bfbebSnyanmisaka return ret;
1844*437bfbebSnyanmisaka }
1845*437bfbebSnyanmisaka
hal_h265e_v54x_start(void * hal,HalEncTask * task)1846*437bfbebSnyanmisaka MPP_RET hal_h265e_v54x_start(void *hal, HalEncTask *task)
1847*437bfbebSnyanmisaka {
1848*437bfbebSnyanmisaka H265eV541HalContext *ctx = (H265eV541HalContext *)hal;
1849*437bfbebSnyanmisaka task->hw_length = 0;
1850*437bfbebSnyanmisaka if (ctx->is_vepu540) {
1851*437bfbebSnyanmisaka return hal_h265e_v540_start(hal, task);
1852*437bfbebSnyanmisaka } else {
1853*437bfbebSnyanmisaka return hal_h265e_v541_start(hal, task);
1854*437bfbebSnyanmisaka }
1855*437bfbebSnyanmisaka return MPP_OK;
1856*437bfbebSnyanmisaka }
1857*437bfbebSnyanmisaka
vepu541_h265_set_feedback(H265eV541HalContext * ctx,HalEncTask * enc_task)1858*437bfbebSnyanmisaka static MPP_RET vepu541_h265_set_feedback(H265eV541HalContext *ctx, HalEncTask *enc_task)
1859*437bfbebSnyanmisaka {
1860*437bfbebSnyanmisaka EncRcTaskInfo *hal_rc_ret = (EncRcTaskInfo *)&enc_task->rc_task->info;
1861*437bfbebSnyanmisaka vepu541_h265_fbk *fb = &ctx->feedback;
1862*437bfbebSnyanmisaka MppEncCfgSet *cfg = ctx->cfg;
1863*437bfbebSnyanmisaka RK_S32 mb64_num = ((cfg->prep.width + 63) / 64) * ((cfg->prep.height + 63) / 64);
1864*437bfbebSnyanmisaka RK_S32 mb8_num = (mb64_num << 6);
1865*437bfbebSnyanmisaka RK_S32 mb4_num = (mb8_num << 2);
1866*437bfbebSnyanmisaka
1867*437bfbebSnyanmisaka hal_h265e_enter();
1868*437bfbebSnyanmisaka H265eV541IoctlOutputElem *elem = (H265eV541IoctlOutputElem *)ctx->reg_out;
1869*437bfbebSnyanmisaka RK_U32 hw_status = elem->hw_status;
1870*437bfbebSnyanmisaka fb->qp_sum += elem->st_sse_qp.qp_sum;
1871*437bfbebSnyanmisaka fb->out_strm_size += elem->st_bsl.bs_lgth;
1872*437bfbebSnyanmisaka fb->sse_sum += elem->st_sse_l32.sse_l32 +
1873*437bfbebSnyanmisaka ((RK_S64)(elem->st_sse_qp.sse_h8 & 0xff) << 32);
1874*437bfbebSnyanmisaka
1875*437bfbebSnyanmisaka fb->hw_status = hw_status;
1876*437bfbebSnyanmisaka hal_h265e_dbg_detail("hw_status: 0x%08x", hw_status);
1877*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_LINKTABLE_FINISH)
1878*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_LINKTABLE_FINISH");
1879*437bfbebSnyanmisaka
1880*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_ONE_FRAME_FINISH)
1881*437bfbebSnyanmisaka hal_h265e_dbg_detail("RKV_ENC_INT_ONE_FRAME_FINISH");
1882*437bfbebSnyanmisaka
1883*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_ONE_SLICE_FINISH)
1884*437bfbebSnyanmisaka hal_h265e_dbg_detail("RKV_ENC_INT_ONE_SLICE_FINISH");
1885*437bfbebSnyanmisaka
1886*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_SAFE_CLEAR_FINISH)
1887*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_SAFE_CLEAR_FINISH");
1888*437bfbebSnyanmisaka
1889*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_BIT_STREAM_OVERFLOW)
1890*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_BIT_STREAM_OVERFLOW");
1891*437bfbebSnyanmisaka
1892*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_BUS_WRITE_FULL)
1893*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_BUS_WRITE_FULL");
1894*437bfbebSnyanmisaka
1895*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_BUS_WRITE_ERROR)
1896*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_BUS_WRITE_ERROR");
1897*437bfbebSnyanmisaka
1898*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_BUS_READ_ERROR)
1899*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_BUS_READ_ERROR");
1900*437bfbebSnyanmisaka
1901*437bfbebSnyanmisaka if (hw_status & RKV_ENC_INT_TIMEOUT_ERROR)
1902*437bfbebSnyanmisaka hal_h265e_err("RKV_ENC_INT_TIMEOUT_ERROR");
1903*437bfbebSnyanmisaka
1904*437bfbebSnyanmisaka fb->st_madi += elem->st_madi;
1905*437bfbebSnyanmisaka fb->st_madp += elem->st_madp;
1906*437bfbebSnyanmisaka fb->st_mb_num += elem->st_mb_num;
1907*437bfbebSnyanmisaka fb->st_ctu_num += elem->st_ctu_num;
1908*437bfbebSnyanmisaka
1909*437bfbebSnyanmisaka if (fb->st_mb_num) {
1910*437bfbebSnyanmisaka fb->st_madi = fb->st_madi / fb->st_mb_num;
1911*437bfbebSnyanmisaka } else {
1912*437bfbebSnyanmisaka fb->st_madi = 0;
1913*437bfbebSnyanmisaka }
1914*437bfbebSnyanmisaka if (fb->st_ctu_num) {
1915*437bfbebSnyanmisaka fb->st_madp = fb->st_madp / fb->st_ctu_num;
1916*437bfbebSnyanmisaka } else {
1917*437bfbebSnyanmisaka fb->st_madp = 0;
1918*437bfbebSnyanmisaka }
1919*437bfbebSnyanmisaka
1920*437bfbebSnyanmisaka fb->st_lvl64_inter_num = elem->st_lvl64_inter_num;
1921*437bfbebSnyanmisaka fb->st_lvl32_inter_num = elem->st_lvl32_inter_num;
1922*437bfbebSnyanmisaka fb->st_lvl32_intra_num = elem->st_lvl32_intra_num;
1923*437bfbebSnyanmisaka fb->st_lvl16_inter_num = elem->st_lvl16_inter_num;
1924*437bfbebSnyanmisaka fb->st_lvl16_intra_num = elem->st_lvl16_intra_num;
1925*437bfbebSnyanmisaka fb->st_lvl8_inter_num = elem->st_lvl8_inter_num;
1926*437bfbebSnyanmisaka fb->st_lvl8_intra_num = elem->st_lvl8_intra_num;
1927*437bfbebSnyanmisaka fb->st_lvl4_intra_num = elem->st_lvl4_intra_num;
1928*437bfbebSnyanmisaka memcpy(&fb->st_cu_num_qp[0], &elem->st_cu_num_qp[0], sizeof(elem->st_cu_num_qp));
1929*437bfbebSnyanmisaka
1930*437bfbebSnyanmisaka hal_rc_ret->madi = fb->st_madi;
1931*437bfbebSnyanmisaka hal_rc_ret->madp = fb->st_madp;
1932*437bfbebSnyanmisaka hal_rc_ret->bit_real = fb->out_strm_size * 8;
1933*437bfbebSnyanmisaka
1934*437bfbebSnyanmisaka if (mb4_num > 0)
1935*437bfbebSnyanmisaka hal_rc_ret->iblk4_prop = ((((fb->st_lvl4_intra_num + fb->st_lvl8_intra_num) << 2) +
1936*437bfbebSnyanmisaka (fb->st_lvl16_intra_num << 4) +
1937*437bfbebSnyanmisaka (fb->st_lvl32_intra_num << 6)) << 8) / mb4_num;
1938*437bfbebSnyanmisaka
1939*437bfbebSnyanmisaka if (mb64_num > 0) {
1940*437bfbebSnyanmisaka /*
1941*437bfbebSnyanmisaka hal_cfg[k].inter_lv8_prop = ((fb->st_lvl8_inter_num + (fb->st_lvl16_inter_num << 2) +
1942*437bfbebSnyanmisaka (fb->st_lvl32_inter_num << 4) +
1943*437bfbebSnyanmisaka (fb->st_lvl64_inter_num << 6)) << 8) / mb8_num;*/
1944*437bfbebSnyanmisaka
1945*437bfbebSnyanmisaka hal_rc_ret->quality_real = fb->qp_sum / mb8_num;
1946*437bfbebSnyanmisaka // hal_cfg[k].sse = fb->sse_sum / mb64_num;
1947*437bfbebSnyanmisaka }
1948*437bfbebSnyanmisaka
1949*437bfbebSnyanmisaka hal_h265e_leave();
1950*437bfbebSnyanmisaka
1951*437bfbebSnyanmisaka return MPP_OK;
1952*437bfbebSnyanmisaka }
1953*437bfbebSnyanmisaka
1954*437bfbebSnyanmisaka
hal_h265e_v541_wait(void * hal,HalEncTask * task)1955*437bfbebSnyanmisaka MPP_RET hal_h265e_v541_wait(void *hal, HalEncTask *task)
1956*437bfbebSnyanmisaka {
1957*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
1958*437bfbebSnyanmisaka H265eV541HalContext *ctx = (H265eV541HalContext *)hal;
1959*437bfbebSnyanmisaka HalEncTask *enc_task = task;
1960*437bfbebSnyanmisaka H265eV541IoctlOutputElem *elem = (H265eV541IoctlOutputElem *)ctx->reg_out;
1961*437bfbebSnyanmisaka hal_h265e_enter();
1962*437bfbebSnyanmisaka if (enc_task->flags.err) {
1963*437bfbebSnyanmisaka hal_h265e_err("enc_task->flags.err %08x, return early",
1964*437bfbebSnyanmisaka enc_task->flags.err);
1965*437bfbebSnyanmisaka return MPP_NOK;
1966*437bfbebSnyanmisaka }
1967*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
1968*437bfbebSnyanmisaka if (ret)
1969*437bfbebSnyanmisaka mpp_err_f("poll cmd failed %d status %d \n", ret, elem->hw_status);
1970*437bfbebSnyanmisaka
1971*437bfbebSnyanmisaka hal_h265e_leave();
1972*437bfbebSnyanmisaka return ret;
1973*437bfbebSnyanmisaka }
1974*437bfbebSnyanmisaka
hal_h265e_v541_get_task(void * hal,HalEncTask * task)1975*437bfbebSnyanmisaka MPP_RET hal_h265e_v541_get_task(void *hal, HalEncTask *task)
1976*437bfbebSnyanmisaka {
1977*437bfbebSnyanmisaka H265eV541HalContext *ctx = (H265eV541HalContext *)hal;
1978*437bfbebSnyanmisaka MppFrame frame = task->frame;
1979*437bfbebSnyanmisaka EncFrmStatus *frm_status = &task->rc_task->frm;
1980*437bfbebSnyanmisaka
1981*437bfbebSnyanmisaka hal_h265e_enter();
1982*437bfbebSnyanmisaka
1983*437bfbebSnyanmisaka if (vepu54x_h265_setup_hal_bufs(ctx)) {
1984*437bfbebSnyanmisaka hal_h265e_err("vepu541_h265_allocate_buffers failed, free buffers and return\n");
1985*437bfbebSnyanmisaka task->flags.err |= HAL_ENC_TASK_ERR_ALLOC;
1986*437bfbebSnyanmisaka return MPP_ERR_MALLOC;
1987*437bfbebSnyanmisaka }
1988*437bfbebSnyanmisaka
1989*437bfbebSnyanmisaka if (!frm_status->reencode)
1990*437bfbebSnyanmisaka ctx->last_frame_type = ctx->frame_type;
1991*437bfbebSnyanmisaka
1992*437bfbebSnyanmisaka if (frm_status->is_intra) {
1993*437bfbebSnyanmisaka ctx->frame_type = INTRA_FRAME;
1994*437bfbebSnyanmisaka } else {
1995*437bfbebSnyanmisaka ctx->frame_type = INTER_P_FRAME;
1996*437bfbebSnyanmisaka }
1997*437bfbebSnyanmisaka if (!frm_status->reencode && mpp_frame_has_meta(task->frame)) {
1998*437bfbebSnyanmisaka MppMeta meta = mpp_frame_get_meta(frame);
1999*437bfbebSnyanmisaka
2000*437bfbebSnyanmisaka mpp_meta_get_ptr_d(meta, KEY_ROI_DATA, (void **)&ctx->roi_data, NULL);
2001*437bfbebSnyanmisaka mpp_meta_get_ptr_d(meta, KEY_ROI_DATA2, (void **)&ctx->roi_data2, NULL);
2002*437bfbebSnyanmisaka mpp_meta_get_ptr_d(meta, KEY_OSD_DATA, (void **)&ctx->osd_cfg.osd_data, NULL);
2003*437bfbebSnyanmisaka mpp_meta_get_ptr_d(meta, KEY_OSD_DATA2, (void **)&ctx->osd_cfg.osd_data2, NULL);
2004*437bfbebSnyanmisaka mpp_meta_get_buffer_d(meta, KEY_QPMAP0, &ctx->qpmap, NULL);
2005*437bfbebSnyanmisaka }
2006*437bfbebSnyanmisaka memset(&ctx->feedback, 0, sizeof(vepu541_h265_fbk));
2007*437bfbebSnyanmisaka
2008*437bfbebSnyanmisaka hal_h265e_leave();
2009*437bfbebSnyanmisaka return MPP_OK;
2010*437bfbebSnyanmisaka }
2011*437bfbebSnyanmisaka
hal_h265e_v541_ret_task(void * hal,HalEncTask * task)2012*437bfbebSnyanmisaka MPP_RET hal_h265e_v541_ret_task(void *hal, HalEncTask *task)
2013*437bfbebSnyanmisaka {
2014*437bfbebSnyanmisaka H265eV541HalContext *ctx = (H265eV541HalContext *)hal;
2015*437bfbebSnyanmisaka HalEncTask *enc_task = task;
2016*437bfbebSnyanmisaka vepu541_h265_fbk *fb = &ctx->feedback;
2017*437bfbebSnyanmisaka EncRcTaskInfo *rc_info = &task->rc_task->info;
2018*437bfbebSnyanmisaka RK_U32 offset = mpp_packet_get_length(enc_task->packet);
2019*437bfbebSnyanmisaka
2020*437bfbebSnyanmisaka hal_h265e_enter();
2021*437bfbebSnyanmisaka
2022*437bfbebSnyanmisaka vepu541_h265_set_feedback(ctx, enc_task);
2023*437bfbebSnyanmisaka mpp_buffer_sync_partial_begin(enc_task->output, offset, fb->out_strm_size);
2024*437bfbebSnyanmisaka hal_h265e_amend_temporal_id(task, fb->out_strm_size);
2025*437bfbebSnyanmisaka
2026*437bfbebSnyanmisaka rc_info->sse = fb->sse_sum;
2027*437bfbebSnyanmisaka rc_info->lvl64_inter_num = fb->st_lvl64_inter_num;
2028*437bfbebSnyanmisaka rc_info->lvl32_inter_num = fb->st_lvl32_inter_num;
2029*437bfbebSnyanmisaka rc_info->lvl16_inter_num = fb->st_lvl16_inter_num;
2030*437bfbebSnyanmisaka rc_info->lvl8_inter_num = fb->st_lvl8_inter_num;
2031*437bfbebSnyanmisaka rc_info->lvl32_intra_num = fb->st_lvl32_intra_num;
2032*437bfbebSnyanmisaka rc_info->lvl16_intra_num = fb->st_lvl16_intra_num;
2033*437bfbebSnyanmisaka rc_info->lvl8_intra_num = fb->st_lvl8_intra_num;
2034*437bfbebSnyanmisaka rc_info->lvl4_intra_num = fb->st_lvl4_intra_num;
2035*437bfbebSnyanmisaka
2036*437bfbebSnyanmisaka enc_task->hw_length = fb->out_strm_size;
2037*437bfbebSnyanmisaka enc_task->length += fb->out_strm_size;
2038*437bfbebSnyanmisaka
2039*437bfbebSnyanmisaka hal_h265e_dbg_detail("output stream size %d\n", fb->out_strm_size);
2040*437bfbebSnyanmisaka
2041*437bfbebSnyanmisaka hal_h265e_leave();
2042*437bfbebSnyanmisaka return MPP_OK;
2043*437bfbebSnyanmisaka }
2044*437bfbebSnyanmisaka
2045*437bfbebSnyanmisaka const MppEncHalApi hal_h265e_vepu541 = {
2046*437bfbebSnyanmisaka "h265e_v541_v2",
2047*437bfbebSnyanmisaka MPP_VIDEO_CodingHEVC,
2048*437bfbebSnyanmisaka sizeof(H265eV541HalContext),
2049*437bfbebSnyanmisaka 0,
2050*437bfbebSnyanmisaka hal_h265e_v541_init,
2051*437bfbebSnyanmisaka hal_h265e_v541_deinit,
2052*437bfbebSnyanmisaka hal_h265e_vepu54x_prepare,
2053*437bfbebSnyanmisaka hal_h265e_v541_get_task,
2054*437bfbebSnyanmisaka hal_h265e_v541_gen_regs,
2055*437bfbebSnyanmisaka hal_h265e_v54x_start,
2056*437bfbebSnyanmisaka hal_h265e_v541_wait,
2057*437bfbebSnyanmisaka NULL,
2058*437bfbebSnyanmisaka NULL,
2059*437bfbebSnyanmisaka hal_h265e_v541_ret_task,
2060*437bfbebSnyanmisaka };
2061*437bfbebSnyanmisaka
2062