xref: /rockchip-linux_mpp/mpp/hal/rkenc/jpege/hal_jpege_vepu511.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2025 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #define MODULE_TAG  "hal_jpege_v511"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <linux/string.h>
9*437bfbebSnyanmisaka 
10*437bfbebSnyanmisaka #include <string.h>
11*437bfbebSnyanmisaka #include <math.h>
12*437bfbebSnyanmisaka #include <limits.h>
13*437bfbebSnyanmisaka 
14*437bfbebSnyanmisaka #include "mpp_env.h"
15*437bfbebSnyanmisaka #include "mpp_mem.h"
16*437bfbebSnyanmisaka #include "mpp_soc.h"
17*437bfbebSnyanmisaka #include "mpp_common.h"
18*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #include "hal_jpege_debug.h"
21*437bfbebSnyanmisaka #include "jpege_syntax.h"
22*437bfbebSnyanmisaka #include "hal_bufs.h"
23*437bfbebSnyanmisaka #include "rkv_enc_def.h"
24*437bfbebSnyanmisaka #include "vepu5xx_common.h"
25*437bfbebSnyanmisaka #include "vepu511_common.h"
26*437bfbebSnyanmisaka #include "hal_jpege_vepu511.h"
27*437bfbebSnyanmisaka #include "hal_jpege_vepu511_reg.h"
28*437bfbebSnyanmisaka #include "hal_jpege_hdr.h"
29*437bfbebSnyanmisaka 
30*437bfbebSnyanmisaka typedef struct JpegeV511HalContext_t {
31*437bfbebSnyanmisaka     MppEncHalApi        api;
32*437bfbebSnyanmisaka     MppDev              dev;
33*437bfbebSnyanmisaka     void                *regs;
34*437bfbebSnyanmisaka     void                *reg_out;
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka     void                *dump_files;
37*437bfbebSnyanmisaka 
38*437bfbebSnyanmisaka     RK_S32              frame_type;
39*437bfbebSnyanmisaka     RK_S32              last_frame_type;
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka     /* @frame_cnt starts from ZERO */
42*437bfbebSnyanmisaka     RK_U32              frame_cnt;
43*437bfbebSnyanmisaka     void                *roi_data;
44*437bfbebSnyanmisaka     MppEncCfgSet        *cfg;
45*437bfbebSnyanmisaka     Vepu511OsdCfg       osd_cfg;
46*437bfbebSnyanmisaka 
47*437bfbebSnyanmisaka     RK_U32              enc_mode;
48*437bfbebSnyanmisaka     RK_U32              frame_size;
49*437bfbebSnyanmisaka     RK_S32              max_buf_cnt;
50*437bfbebSnyanmisaka     RK_S32              hdr_status;
51*437bfbebSnyanmisaka     void                *input_fmt;
52*437bfbebSnyanmisaka     RK_U8               *src_buf;
53*437bfbebSnyanmisaka     RK_U8               *dst_buf;
54*437bfbebSnyanmisaka     RK_S32              buf_size;
55*437bfbebSnyanmisaka     RK_U32              frame_num;
56*437bfbebSnyanmisaka     RK_S32              fbc_header_len;
57*437bfbebSnyanmisaka     RK_U32              title_num;
58*437bfbebSnyanmisaka 
59*437bfbebSnyanmisaka     JpegeBits           bits;
60*437bfbebSnyanmisaka     JpegeSyntax         syntax;
61*437bfbebSnyanmisaka     HalJpegeRc          hal_rc;
62*437bfbebSnyanmisaka } JpegeV511HalContext;
63*437bfbebSnyanmisaka 
hal_jpege_vepu511_init(void * hal,MppEncHalCfg * cfg)64*437bfbebSnyanmisaka MPP_RET hal_jpege_vepu511_init(void *hal, MppEncHalCfg *cfg)
65*437bfbebSnyanmisaka {
66*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
67*437bfbebSnyanmisaka     JpegeV511HalContext *ctx = (JpegeV511HalContext *)hal;
68*437bfbebSnyanmisaka 
69*437bfbebSnyanmisaka     mpp_env_get_u32("hal_jpege_debug", &hal_jpege_debug, 0);
70*437bfbebSnyanmisaka     hal_jpege_enter();
71*437bfbebSnyanmisaka 
72*437bfbebSnyanmisaka     ctx->reg_out  = mpp_calloc(JpegV511Status, 1);
73*437bfbebSnyanmisaka     ctx->regs           = mpp_calloc(JpegV511RegSet, 1);
74*437bfbebSnyanmisaka     ctx->input_fmt      = mpp_calloc(VepuFmtCfg, 1);
75*437bfbebSnyanmisaka     ctx->cfg            = cfg->cfg;
76*437bfbebSnyanmisaka     ctx->frame_cnt = 0;
77*437bfbebSnyanmisaka     ctx->enc_mode = 1;
78*437bfbebSnyanmisaka     cfg->type = VPU_CLIENT_RKVENC;
79*437bfbebSnyanmisaka     ret = mpp_dev_init(&cfg->dev, cfg->type);
80*437bfbebSnyanmisaka     if (ret) {
81*437bfbebSnyanmisaka         mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
82*437bfbebSnyanmisaka         return ret;
83*437bfbebSnyanmisaka     }
84*437bfbebSnyanmisaka 
85*437bfbebSnyanmisaka     ctx->dev = cfg->dev;
86*437bfbebSnyanmisaka     jpege_bits_init(&ctx->bits);
87*437bfbebSnyanmisaka     mpp_assert(ctx->bits);
88*437bfbebSnyanmisaka     hal_jpege_rc_init(&ctx->hal_rc);
89*437bfbebSnyanmisaka 
90*437bfbebSnyanmisaka     hal_jpege_leave();
91*437bfbebSnyanmisaka     return ret;
92*437bfbebSnyanmisaka }
93*437bfbebSnyanmisaka 
hal_jpege_vepu511_deinit(void * hal)94*437bfbebSnyanmisaka MPP_RET hal_jpege_vepu511_deinit(void *hal)
95*437bfbebSnyanmisaka {
96*437bfbebSnyanmisaka     JpegeV511HalContext *ctx = (JpegeV511HalContext *)hal;
97*437bfbebSnyanmisaka 
98*437bfbebSnyanmisaka     hal_jpege_enter();
99*437bfbebSnyanmisaka     jpege_bits_deinit(ctx->bits);
100*437bfbebSnyanmisaka 
101*437bfbebSnyanmisaka     MPP_FREE(ctx->regs);
102*437bfbebSnyanmisaka     MPP_FREE(ctx->reg_out);
103*437bfbebSnyanmisaka     MPP_FREE(ctx->input_fmt);
104*437bfbebSnyanmisaka 
105*437bfbebSnyanmisaka     if (ctx->dev) {
106*437bfbebSnyanmisaka         mpp_dev_deinit(ctx->dev);
107*437bfbebSnyanmisaka         ctx->dev = NULL;
108*437bfbebSnyanmisaka     }
109*437bfbebSnyanmisaka     hal_jpege_leave();
110*437bfbebSnyanmisaka     return MPP_OK;
111*437bfbebSnyanmisaka }
112*437bfbebSnyanmisaka 
hal_jpege_vepu511_prepare(void * hal)113*437bfbebSnyanmisaka static MPP_RET hal_jpege_vepu511_prepare(void *hal)
114*437bfbebSnyanmisaka {
115*437bfbebSnyanmisaka     JpegeV511HalContext *ctx = (JpegeV511HalContext *)hal;
116*437bfbebSnyanmisaka 
117*437bfbebSnyanmisaka     hal_jpege_dbg_func("enter %p\n", hal);
118*437bfbebSnyanmisaka     VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
119*437bfbebSnyanmisaka     vepu5xx_set_fmt(fmt, ctx->cfg->prep.format);
120*437bfbebSnyanmisaka 
121*437bfbebSnyanmisaka     hal_jpege_dbg_func("leave %p\n", hal);
122*437bfbebSnyanmisaka 
123*437bfbebSnyanmisaka     return MPP_OK;
124*437bfbebSnyanmisaka }
125*437bfbebSnyanmisaka 
vepu511_jpeg_set_patch_info(MppDev dev,JpegeSyntax * syn,VepuFmt input_fmt,HalEncTask * task)126*437bfbebSnyanmisaka static MPP_RET vepu511_jpeg_set_patch_info(MppDev dev, JpegeSyntax *syn,
127*437bfbebSnyanmisaka                                            VepuFmt input_fmt,
128*437bfbebSnyanmisaka                                            HalEncTask *task)
129*437bfbebSnyanmisaka {
130*437bfbebSnyanmisaka     RK_U32 hor_stride = syn->hor_stride;
131*437bfbebSnyanmisaka     RK_U32 ver_stride = syn->ver_stride ? syn->ver_stride : syn->height;
132*437bfbebSnyanmisaka     RK_U32 frame_size = hor_stride * ver_stride;
133*437bfbebSnyanmisaka     RK_U32 u_offset = 0, v_offset = 0;
134*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
135*437bfbebSnyanmisaka 
136*437bfbebSnyanmisaka     if (MPP_FRAME_FMT_IS_FBC(mpp_frame_get_fmt(task->frame))) {
137*437bfbebSnyanmisaka         u_offset = mpp_frame_get_fbc_offset(task->frame);
138*437bfbebSnyanmisaka         v_offset = u_offset;
139*437bfbebSnyanmisaka     } else {
140*437bfbebSnyanmisaka         switch (input_fmt) {
141*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV420P: {
142*437bfbebSnyanmisaka             u_offset = frame_size;
143*437bfbebSnyanmisaka             v_offset = frame_size * 5 / 4;
144*437bfbebSnyanmisaka         } break;
145*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV420SP:
146*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV422SP: {
147*437bfbebSnyanmisaka             u_offset = frame_size;
148*437bfbebSnyanmisaka             v_offset = frame_size;
149*437bfbebSnyanmisaka         } break;
150*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV422P: {
151*437bfbebSnyanmisaka             u_offset = frame_size;
152*437bfbebSnyanmisaka             v_offset = frame_size * 3 / 2;
153*437bfbebSnyanmisaka         } break;
154*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV400 :
155*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUYV422:
156*437bfbebSnyanmisaka         case VEPU5xx_FMT_UYVY422: {
157*437bfbebSnyanmisaka             u_offset = 0;
158*437bfbebSnyanmisaka             v_offset = 0;
159*437bfbebSnyanmisaka         } break;
160*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV444SP : {
161*437bfbebSnyanmisaka             u_offset = frame_size;
162*437bfbebSnyanmisaka             v_offset = frame_size;
163*437bfbebSnyanmisaka         } break;
164*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV444P : {
165*437bfbebSnyanmisaka             u_offset = frame_size;
166*437bfbebSnyanmisaka             v_offset = frame_size * 2;
167*437bfbebSnyanmisaka         } break;
168*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGR565:
169*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGR888:
170*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGRA8888: {
171*437bfbebSnyanmisaka             u_offset = 0;
172*437bfbebSnyanmisaka             v_offset = 0;
173*437bfbebSnyanmisaka         } break;
174*437bfbebSnyanmisaka         default: {
175*437bfbebSnyanmisaka             mpp_err("unknown color space: %d\n", input_fmt);
176*437bfbebSnyanmisaka             u_offset = frame_size;
177*437bfbebSnyanmisaka             v_offset = frame_size * 5 / 4;
178*437bfbebSnyanmisaka         }
179*437bfbebSnyanmisaka         }
180*437bfbebSnyanmisaka     }
181*437bfbebSnyanmisaka 
182*437bfbebSnyanmisaka     /* input cb addr */
183*437bfbebSnyanmisaka     if (u_offset)
184*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(dev, 265, u_offset);
185*437bfbebSnyanmisaka 
186*437bfbebSnyanmisaka     /* input cr addr */
187*437bfbebSnyanmisaka     if (v_offset)
188*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(dev, 266, v_offset);
189*437bfbebSnyanmisaka 
190*437bfbebSnyanmisaka     return ret;
191*437bfbebSnyanmisaka }
192*437bfbebSnyanmisaka 
vepu511_set_jpeg_reg(Vepu511JpegCfg * cfg)193*437bfbebSnyanmisaka MPP_RET vepu511_set_jpeg_reg(Vepu511JpegCfg *cfg)
194*437bfbebSnyanmisaka {
195*437bfbebSnyanmisaka     HalEncTask *task = ( HalEncTask *)cfg->enc_task;
196*437bfbebSnyanmisaka     JpegeSyntax *syn = (JpegeSyntax *)task->syntax.data;
197*437bfbebSnyanmisaka     Vepu511JpegReg *regs = (Vepu511JpegReg *)cfg->jpeg_reg_base;
198*437bfbebSnyanmisaka     VepuFmtCfg *fmt = (VepuFmtCfg *)cfg->input_fmt;
199*437bfbebSnyanmisaka     RK_U32 pic_width_align8, pic_height_align8;
200*437bfbebSnyanmisaka     RK_S32 stridey = 0;
201*437bfbebSnyanmisaka     RK_S32 stridec = 0;
202*437bfbebSnyanmisaka 
203*437bfbebSnyanmisaka     pic_width_align8 = (syn->width + 7) & (~7);
204*437bfbebSnyanmisaka     pic_height_align8 = (syn->height + 7) & (~7);
205*437bfbebSnyanmisaka 
206*437bfbebSnyanmisaka     regs->adr_src0 =  mpp_buffer_get_fd(task->input);
207*437bfbebSnyanmisaka     regs->adr_src1 = regs->adr_src0;
208*437bfbebSnyanmisaka     regs->adr_src2 = regs->adr_src0;
209*437bfbebSnyanmisaka 
210*437bfbebSnyanmisaka     vepu511_jpeg_set_patch_info(cfg->dev, syn, (VepuFmt)fmt->format, task);
211*437bfbebSnyanmisaka 
212*437bfbebSnyanmisaka     regs->adr_bsbt = mpp_buffer_get_fd(task->output);
213*437bfbebSnyanmisaka     regs->adr_bsbb = regs->adr_bsbt;
214*437bfbebSnyanmisaka     regs->adr_bsbs = regs->adr_bsbt;
215*437bfbebSnyanmisaka     regs->adr_bsbr = regs->adr_bsbt;
216*437bfbebSnyanmisaka 
217*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(cfg->dev, 258, mpp_packet_get_length(task->packet));
218*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(cfg->dev, 256, mpp_buffer_get_size(task->output));
219*437bfbebSnyanmisaka 
220*437bfbebSnyanmisaka     regs->enc_rsl.pic_wd8_m1    = pic_width_align8 / 8 - 1;
221*437bfbebSnyanmisaka     regs->src_fill.pic_wfill    = (syn->width & 0x7)
222*437bfbebSnyanmisaka                                   ? (8 - (syn->width & 0x7)) : 0;
223*437bfbebSnyanmisaka     regs->enc_rsl.pic_hd8_m1    = pic_height_align8 / 8 - 1;
224*437bfbebSnyanmisaka     regs->src_fill.pic_hfill    = (syn->height & 0x7)
225*437bfbebSnyanmisaka                                   ? (8 - (syn->height & 0x7)) : 0;
226*437bfbebSnyanmisaka 
227*437bfbebSnyanmisaka     regs->src_fmt.src_cfmt = fmt->format;
228*437bfbebSnyanmisaka     regs->src_fmt.alpha_swap = fmt->alpha_swap;
229*437bfbebSnyanmisaka     regs->src_fmt.rbuv_swap  = fmt->rbuv_swap;
230*437bfbebSnyanmisaka     regs->src_fmt.src_range_trns_en  = 0;
231*437bfbebSnyanmisaka     regs->src_fmt.src_range_trns_sel = 0;
232*437bfbebSnyanmisaka     regs->src_fmt.chroma_ds_mode     = 0;
233*437bfbebSnyanmisaka     regs->src_proc.src_mirr = syn->mirroring > 0;
234*437bfbebSnyanmisaka     regs->src_proc.src_rot = syn->rotation;
235*437bfbebSnyanmisaka 
236*437bfbebSnyanmisaka     if (MPP_FRAME_FMT_IS_FBC(mpp_frame_get_fmt(task->frame))) {
237*437bfbebSnyanmisaka         regs->src_proc.rkfbcd_en = 1;
238*437bfbebSnyanmisaka 
239*437bfbebSnyanmisaka         stridey = mpp_frame_get_fbc_hdr_stride(task->frame);
240*437bfbebSnyanmisaka         if (!stridey)
241*437bfbebSnyanmisaka             stridey = MPP_ALIGN(syn->hor_stride, 16) >> 2;
242*437bfbebSnyanmisaka     } else if (syn->hor_stride) {
243*437bfbebSnyanmisaka         stridey = syn->hor_stride;
244*437bfbebSnyanmisaka     } else {
245*437bfbebSnyanmisaka         if (regs->src_fmt.src_cfmt == VEPU5xx_FMT_BGRA8888)
246*437bfbebSnyanmisaka             stridey = syn->width * 4;
247*437bfbebSnyanmisaka         else if (regs->src_fmt.src_cfmt == VEPU5xx_FMT_BGR888 ||
248*437bfbebSnyanmisaka                  regs->src_fmt.src_cfmt == VEPU5xx_FMT_YUV444P ||
249*437bfbebSnyanmisaka                  regs->src_fmt.src_cfmt == VEPU5xx_FMT_YUV444SP)
250*437bfbebSnyanmisaka             stridey = syn->width * 3;
251*437bfbebSnyanmisaka         else if (regs->src_fmt.src_cfmt == VEPU5xx_FMT_BGR565 ||
252*437bfbebSnyanmisaka                  regs->src_fmt.src_cfmt == VEPU5xx_FMT_YUYV422 ||
253*437bfbebSnyanmisaka                  regs->src_fmt.src_cfmt == VEPU5xx_FMT_UYVY422)
254*437bfbebSnyanmisaka             stridey = syn->width * 2;
255*437bfbebSnyanmisaka     }
256*437bfbebSnyanmisaka 
257*437bfbebSnyanmisaka     stridec = (regs->src_fmt.src_cfmt == VEPU5xx_FMT_YUV422SP ||
258*437bfbebSnyanmisaka                regs->src_fmt.src_cfmt == VEPU5xx_FMT_YUV420SP ||
259*437bfbebSnyanmisaka                regs->src_fmt.src_cfmt == VEPU5xx_FMT_YUV444P) ?
260*437bfbebSnyanmisaka               stridey : stridey / 2;
261*437bfbebSnyanmisaka 
262*437bfbebSnyanmisaka     if (regs->src_fmt.src_cfmt == VEPU5xx_FMT_YUV444SP)
263*437bfbebSnyanmisaka         stridec = stridey * 2;
264*437bfbebSnyanmisaka 
265*437bfbebSnyanmisaka     if (regs->src_fmt.src_cfmt < VEPU5xx_FMT_ARGB1555) {
266*437bfbebSnyanmisaka         regs->src_udfy.csc_wgt_r2y = 66;
267*437bfbebSnyanmisaka         regs->src_udfy.csc_wgt_g2y = 129;
268*437bfbebSnyanmisaka         regs->src_udfy.csc_wgt_b2y = 25;
269*437bfbebSnyanmisaka 
270*437bfbebSnyanmisaka         regs->src_udfu.csc_wgt_r2u = -38;
271*437bfbebSnyanmisaka         regs->src_udfu.csc_wgt_g2u = -74;
272*437bfbebSnyanmisaka         regs->src_udfu.csc_wgt_b2u = 112;
273*437bfbebSnyanmisaka 
274*437bfbebSnyanmisaka         regs->src_udfv.csc_wgt_r2v = 112;
275*437bfbebSnyanmisaka         regs->src_udfv.csc_wgt_g2v = -94;
276*437bfbebSnyanmisaka         regs->src_udfv.csc_wgt_b2v = -18;
277*437bfbebSnyanmisaka 
278*437bfbebSnyanmisaka         regs->src_udfo.csc_ofst_y = 16;
279*437bfbebSnyanmisaka         regs->src_udfo.csc_ofst_u = 128;
280*437bfbebSnyanmisaka         regs->src_udfo.csc_ofst_v = 128;
281*437bfbebSnyanmisaka     }
282*437bfbebSnyanmisaka 
283*437bfbebSnyanmisaka     regs->src_strd0.src_strd0  = stridey;
284*437bfbebSnyanmisaka     regs->src_strd1.src_strd1  = stridec;
285*437bfbebSnyanmisaka     regs->pic_ofst.pic_ofst_y = mpp_frame_get_offset_y(task->frame);
286*437bfbebSnyanmisaka     regs->pic_ofst.pic_ofst_x = mpp_frame_get_offset_x(task->frame);
287*437bfbebSnyanmisaka 
288*437bfbebSnyanmisaka     regs->y_cfg.bias_y = 0;
289*437bfbebSnyanmisaka     regs->u_cfg.bias_u = 0;
290*437bfbebSnyanmisaka     regs->v_cfg.bias_v = 0;
291*437bfbebSnyanmisaka 
292*437bfbebSnyanmisaka     regs->base_cfg.ri  = syn->restart_ri;
293*437bfbebSnyanmisaka     regs->base_cfg.out_mode = 0;
294*437bfbebSnyanmisaka     regs->base_cfg.start_rst_m = 0;
295*437bfbebSnyanmisaka     regs->base_cfg.pic_last_ecs = 1;
296*437bfbebSnyanmisaka     regs->base_cfg.stnd = 1;
297*437bfbebSnyanmisaka 
298*437bfbebSnyanmisaka     regs->uvc_cfg.uvc_partition0_len = 0;
299*437bfbebSnyanmisaka     regs->uvc_cfg.uvc_partition_len = 0;
300*437bfbebSnyanmisaka     regs->uvc_cfg.uvc_skip_len = 0;
301*437bfbebSnyanmisaka     return MPP_OK;
302*437bfbebSnyanmisaka }
303*437bfbebSnyanmisaka 
hal_jpege_vepu511_set_roi(JpegeV511HalContext * ctx)304*437bfbebSnyanmisaka static void hal_jpege_vepu511_set_roi(JpegeV511HalContext *ctx)
305*437bfbebSnyanmisaka {
306*437bfbebSnyanmisaka     MppJpegROICfg *roi_cfg = (MppJpegROICfg *)ctx->roi_data;
307*437bfbebSnyanmisaka     JpegV511RegSet *regs = ctx->regs;
308*437bfbebSnyanmisaka     Vepu511JpegRoiRegion *reg_regions = &regs->reg_base.jpegReg.roi_regions[0];
309*437bfbebSnyanmisaka     MppJpegROIRegion *region;
310*437bfbebSnyanmisaka     RK_U32 frame_width = ctx->cfg->prep.width;
311*437bfbebSnyanmisaka     RK_U32 frame_height = ctx->cfg->prep.height;
312*437bfbebSnyanmisaka     RK_S32 i;
313*437bfbebSnyanmisaka 
314*437bfbebSnyanmisaka     if (roi_cfg == NULL)
315*437bfbebSnyanmisaka         return;
316*437bfbebSnyanmisaka 
317*437bfbebSnyanmisaka     if (roi_cfg->non_roi_en) {
318*437bfbebSnyanmisaka         if (roi_cfg->non_roi_level <= MPP_MAX_JPEG_ROI_LEVEL) {
319*437bfbebSnyanmisaka             reg_regions->roi_cfg1.frm_rdoq_en = 1;
320*437bfbebSnyanmisaka             reg_regions->roi_cfg1.frm_rdoq_level = roi_cfg->non_roi_level;
321*437bfbebSnyanmisaka         } else {
322*437bfbebSnyanmisaka             mpp_err_f("none roi level[%d] is invalid\n", roi_cfg->non_roi_level);
323*437bfbebSnyanmisaka         }
324*437bfbebSnyanmisaka     }
325*437bfbebSnyanmisaka 
326*437bfbebSnyanmisaka     for (i = 0; i < MPP_MAX_JPEG_ROI_NUM; i++) {
327*437bfbebSnyanmisaka         region = &roi_cfg->regions[i];
328*437bfbebSnyanmisaka         if (!region->roi_en)
329*437bfbebSnyanmisaka             continue;
330*437bfbebSnyanmisaka 
331*437bfbebSnyanmisaka         if (region->w == 0 || region->h == 0 ||
332*437bfbebSnyanmisaka             region->x + region->w > frame_width ||
333*437bfbebSnyanmisaka             region->y + region->h > frame_height) {
334*437bfbebSnyanmisaka             mpp_err_f("region[%d]: x[%d] y[%d] w[%d] h[%d] is invalid, frame width[%d] height[%d]\n",
335*437bfbebSnyanmisaka                       i, region->x, region->y, region->w,
336*437bfbebSnyanmisaka                       region->h, frame_width, frame_height);
337*437bfbebSnyanmisaka             continue;
338*437bfbebSnyanmisaka         }
339*437bfbebSnyanmisaka 
340*437bfbebSnyanmisaka         if (region->level > MPP_MAX_JPEG_ROI_LEVEL) {
341*437bfbebSnyanmisaka             mpp_err_f("region[%d]: roi level[%d] is invalid\n", i, region->level);
342*437bfbebSnyanmisaka             continue;
343*437bfbebSnyanmisaka         }
344*437bfbebSnyanmisaka 
345*437bfbebSnyanmisaka         reg_regions->roi_cfg0.roi0_rdoq_en = 1;
346*437bfbebSnyanmisaka         reg_regions->roi_cfg0.roi0_rdoq_start_x = MPP_ALIGN(region->x, 16) >> 3;
347*437bfbebSnyanmisaka         reg_regions->roi_cfg0.roi0_rdoq_start_y = MPP_ALIGN(region->y, 16) >> 3;
348*437bfbebSnyanmisaka         reg_regions->roi_cfg0.roi0_rdoq_level = region->level;
349*437bfbebSnyanmisaka         reg_regions->roi_cfg1.roi0_rdoq_width_m1 = (MPP_ALIGN(region->w, 16) >> 3) - 1;
350*437bfbebSnyanmisaka         reg_regions->roi_cfg1.roi0_rdoq_height_m1 = (MPP_ALIGN(region->h, 16) >> 3) - 1;
351*437bfbebSnyanmisaka         reg_regions++;
352*437bfbebSnyanmisaka     }
353*437bfbebSnyanmisaka }
354*437bfbebSnyanmisaka 
hal_jpege_vepu511_gen_regs(void * hal,HalEncTask * task)355*437bfbebSnyanmisaka MPP_RET hal_jpege_vepu511_gen_regs(void *hal, HalEncTask *task)
356*437bfbebSnyanmisaka {
357*437bfbebSnyanmisaka     JpegeV511HalContext *ctx = (JpegeV511HalContext *)hal;
358*437bfbebSnyanmisaka     JpegV511RegSet *regs = ctx->regs;
359*437bfbebSnyanmisaka     Vepu511ControlCfg *reg_ctl = &regs->reg_ctl;
360*437bfbebSnyanmisaka     JpegVepu511Base *reg_base = &regs->reg_base;
361*437bfbebSnyanmisaka     JpegeBits bits = ctx->bits;
362*437bfbebSnyanmisaka     size_t length = mpp_packet_get_length(task->packet);
363*437bfbebSnyanmisaka     RK_U8  *buf = mpp_buffer_get_ptr(task->output);
364*437bfbebSnyanmisaka     size_t size = mpp_buffer_get_size(task->output);
365*437bfbebSnyanmisaka     JpegeSyntax *syntax = &ctx->syntax;
366*437bfbebSnyanmisaka     VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
367*437bfbebSnyanmisaka     Vepu511JpegCfg cfg;
368*437bfbebSnyanmisaka     RK_S32 bitpos;
369*437bfbebSnyanmisaka 
370*437bfbebSnyanmisaka     hal_jpege_enter();
371*437bfbebSnyanmisaka     cfg.enc_task = task;
372*437bfbebSnyanmisaka     cfg.jpeg_reg_base = &reg_base->jpegReg;
373*437bfbebSnyanmisaka     cfg.dev = ctx->dev;
374*437bfbebSnyanmisaka     cfg.input_fmt = ctx->input_fmt;
375*437bfbebSnyanmisaka 
376*437bfbebSnyanmisaka     memset(regs, 0, sizeof(JpegV511RegSet));
377*437bfbebSnyanmisaka 
378*437bfbebSnyanmisaka     if (syntax->q_mode == JPEG_QFACTOR) {
379*437bfbebSnyanmisaka         syntax->q_factor = 100 - task->rc_task->info.quality_target;
380*437bfbebSnyanmisaka         hal_jpege_rc_update(&ctx->hal_rc, syntax);
381*437bfbebSnyanmisaka     }
382*437bfbebSnyanmisaka 
383*437bfbebSnyanmisaka     /* write header to output buffer */
384*437bfbebSnyanmisaka     jpege_bits_setup(bits, buf, (RK_U32)size);
385*437bfbebSnyanmisaka     /* seek length bytes data */
386*437bfbebSnyanmisaka     jpege_seek_bits(bits, length << 3);
387*437bfbebSnyanmisaka     /* NOTE: write header will update qtable */
388*437bfbebSnyanmisaka     write_jpeg_header(bits, syntax, &ctx->hal_rc);
389*437bfbebSnyanmisaka 
390*437bfbebSnyanmisaka     bitpos = jpege_bits_get_bitpos(bits);
391*437bfbebSnyanmisaka     task->length = (bitpos + 7) >> 3;
392*437bfbebSnyanmisaka     mpp_buffer_sync_partial_end(task->output, 0, task->length);
393*437bfbebSnyanmisaka     mpp_packet_set_length(task->packet, task->length);
394*437bfbebSnyanmisaka     reg_ctl->enc_strt.lkt_num      = 0;
395*437bfbebSnyanmisaka     reg_ctl->enc_strt.vepu_cmd     = ctx->enc_mode;
396*437bfbebSnyanmisaka     reg_ctl->enc_clr.safe_clr      = 0x0;
397*437bfbebSnyanmisaka     reg_ctl->enc_clr.force_clr     = 0x0;
398*437bfbebSnyanmisaka 
399*437bfbebSnyanmisaka     reg_ctl->int_en.enc_done_en         = 1;
400*437bfbebSnyanmisaka     reg_ctl->int_en.lkt_node_done_en    = 1;
401*437bfbebSnyanmisaka     reg_ctl->int_en.sclr_done_en        = 1;
402*437bfbebSnyanmisaka     reg_ctl->int_en.vslc_done_en         = 1;
403*437bfbebSnyanmisaka     reg_ctl->int_en.vbsf_oflw_en         = 1;
404*437bfbebSnyanmisaka 
405*437bfbebSnyanmisaka     reg_ctl->int_en.jbuf_lens_en        = 1;
406*437bfbebSnyanmisaka     reg_ctl->int_en.enc_err_en          = 1;
407*437bfbebSnyanmisaka     reg_ctl->int_en.vsrc_err_en         = 1;
408*437bfbebSnyanmisaka     reg_ctl->int_en.wdg_en              = 1;
409*437bfbebSnyanmisaka     reg_ctl->int_en.lkt_err_int_en      = 0;
410*437bfbebSnyanmisaka     reg_ctl->int_en.lkt_err_stop_en     = 0;
411*437bfbebSnyanmisaka     reg_ctl->int_en.lkt_force_stop_en   = 0;
412*437bfbebSnyanmisaka     reg_ctl->int_en.jslc_done_en        = 0;
413*437bfbebSnyanmisaka     reg_ctl->int_en.jbsf_oflw_en        = 0;
414*437bfbebSnyanmisaka     reg_ctl->int_en.dvbm_err_en         = 0;
415*437bfbebSnyanmisaka 
416*437bfbebSnyanmisaka     reg_ctl->dtrns_map.jpeg_bus_edin    = 0x7;
417*437bfbebSnyanmisaka     reg_ctl->dtrns_map.src_bus_edin     = 0x0;
418*437bfbebSnyanmisaka     reg_ctl->dtrns_map.meiw_bus_edin    = 0x0;
419*437bfbebSnyanmisaka     reg_ctl->dtrns_map.bsw_bus_edin     = 0x0;
420*437bfbebSnyanmisaka     reg_ctl->dtrns_map.lktr_bus_edin    = 0x0;
421*437bfbebSnyanmisaka     reg_ctl->dtrns_map.roir_bus_edin    = 0x0;
422*437bfbebSnyanmisaka     reg_ctl->dtrns_map.lktw_bus_edin    = 0x0;
423*437bfbebSnyanmisaka     reg_ctl->dtrns_map.rec_nfbc_bus_edin   = 0x0;
424*437bfbebSnyanmisaka     reg_ctl->dtrns_cfg.jsrc_bus_edin = fmt->src_endian;
425*437bfbebSnyanmisaka     reg_base->common.enc_pic.enc_stnd = 2; // disable h264 or hevc
426*437bfbebSnyanmisaka 
427*437bfbebSnyanmisaka     reg_ctl->dtrns_cfg.axi_brsp_cke     = 0x0;
428*437bfbebSnyanmisaka     reg_ctl->enc_wdg.vs_load_thd        = 0x1fffff;
429*437bfbebSnyanmisaka     reg_base->common.enc_pic.jpeg_slen_fifo = 0;
430*437bfbebSnyanmisaka 
431*437bfbebSnyanmisaka     vepu511_set_jpeg_reg(&cfg);
432*437bfbebSnyanmisaka     hal_jpege_vepu511_set_roi(ctx);
433*437bfbebSnyanmisaka 
434*437bfbebSnyanmisaka     if (ctx->osd_cfg.osd_data3 || ctx->osd_cfg.osd_data)
435*437bfbebSnyanmisaka         vepu511_set_osd(&ctx->osd_cfg, &regs->reg_osd.osd_jpeg_cfg);
436*437bfbebSnyanmisaka 
437*437bfbebSnyanmisaka     {
438*437bfbebSnyanmisaka         RK_U16 *tbl = &regs->jpeg_table.qua_tab0[0];
439*437bfbebSnyanmisaka         RK_U32 i, j;
440*437bfbebSnyanmisaka 
441*437bfbebSnyanmisaka         for ( i = 0; i < 8; i++) {
442*437bfbebSnyanmisaka             for ( j = 0; j < 8; j++) {
443*437bfbebSnyanmisaka                 tbl[i * 8 + j] = 0x8000 / ctx->hal_rc.qtables[0][j * 8 + i];
444*437bfbebSnyanmisaka             }
445*437bfbebSnyanmisaka         }
446*437bfbebSnyanmisaka         tbl += 64;
447*437bfbebSnyanmisaka         for ( i = 0; i < 8; i++) {
448*437bfbebSnyanmisaka             for ( j = 0; j < 8; j++) {
449*437bfbebSnyanmisaka                 tbl[i * 8 + j] = 0x8000 / ctx->hal_rc.qtables[1][j * 8 + i];
450*437bfbebSnyanmisaka             }
451*437bfbebSnyanmisaka         }
452*437bfbebSnyanmisaka         tbl += 64;
453*437bfbebSnyanmisaka         for ( i = 0; i < 8; i++) {
454*437bfbebSnyanmisaka             for ( j = 0; j < 8; j++) {
455*437bfbebSnyanmisaka                 tbl[i * 8 + j] = 0x8000 / ctx->hal_rc.qtables[1][j * 8 + i];
456*437bfbebSnyanmisaka             }
457*437bfbebSnyanmisaka         }
458*437bfbebSnyanmisaka     }
459*437bfbebSnyanmisaka     ctx->frame_num++;
460*437bfbebSnyanmisaka 
461*437bfbebSnyanmisaka     hal_jpege_leave();
462*437bfbebSnyanmisaka     return MPP_OK;
463*437bfbebSnyanmisaka }
464*437bfbebSnyanmisaka 
hal_jpege_vepu511_start(void * hal,HalEncTask * enc_task)465*437bfbebSnyanmisaka MPP_RET hal_jpege_vepu511_start(void *hal, HalEncTask *enc_task)
466*437bfbebSnyanmisaka {
467*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
468*437bfbebSnyanmisaka     JpegeV511HalContext *ctx = (JpegeV511HalContext *)hal;
469*437bfbebSnyanmisaka     JpegV511RegSet *hw_regs = ctx->regs;
470*437bfbebSnyanmisaka     JpegV511Status *reg_out = ctx->reg_out;
471*437bfbebSnyanmisaka     MppDevRegWrCfg cfg;
472*437bfbebSnyanmisaka     MppDevRegRdCfg cfg1;
473*437bfbebSnyanmisaka     hal_jpege_enter();
474*437bfbebSnyanmisaka 
475*437bfbebSnyanmisaka     if (enc_task->flags.err) {
476*437bfbebSnyanmisaka         mpp_err_f("enc_task->flags.err %08x, return e arly",
477*437bfbebSnyanmisaka                   enc_task->flags.err);
478*437bfbebSnyanmisaka         return MPP_NOK;
479*437bfbebSnyanmisaka     }
480*437bfbebSnyanmisaka 
481*437bfbebSnyanmisaka     cfg.reg = (RK_U32*)&hw_regs->reg_ctl;
482*437bfbebSnyanmisaka     cfg.size = sizeof(Vepu511ControlCfg);
483*437bfbebSnyanmisaka     cfg.offset = VEPU511_CTL_OFFSET;
484*437bfbebSnyanmisaka 
485*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
486*437bfbebSnyanmisaka     if (ret) {
487*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
488*437bfbebSnyanmisaka         return ret;
489*437bfbebSnyanmisaka     }
490*437bfbebSnyanmisaka 
491*437bfbebSnyanmisaka     cfg.reg = &hw_regs->jpeg_table;
492*437bfbebSnyanmisaka     cfg.size = sizeof(JpegVepu511Tab);
493*437bfbebSnyanmisaka     cfg.offset = VEPU511_JPEGTAB_OFFSET;
494*437bfbebSnyanmisaka 
495*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
496*437bfbebSnyanmisaka     if (ret) {
497*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
498*437bfbebSnyanmisaka         return ret;
499*437bfbebSnyanmisaka     }
500*437bfbebSnyanmisaka 
501*437bfbebSnyanmisaka     cfg.reg = &hw_regs->reg_base;
502*437bfbebSnyanmisaka     cfg.size = sizeof(JpegVepu511Base);
503*437bfbebSnyanmisaka     cfg.offset = VEPU511_FRAME_OFFSET;
504*437bfbebSnyanmisaka 
505*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
506*437bfbebSnyanmisaka     if (ret) {
507*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
508*437bfbebSnyanmisaka         return ret;
509*437bfbebSnyanmisaka     }
510*437bfbebSnyanmisaka 
511*437bfbebSnyanmisaka     cfg.reg = &hw_regs->reg_osd;
512*437bfbebSnyanmisaka     cfg.size = sizeof(Vepu511OsdRegs);
513*437bfbebSnyanmisaka     cfg.offset = VEPU511_OSD_OFFSET;
514*437bfbebSnyanmisaka 
515*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
516*437bfbebSnyanmisaka     if (ret) {
517*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
518*437bfbebSnyanmisaka         return ret;
519*437bfbebSnyanmisaka     }
520*437bfbebSnyanmisaka 
521*437bfbebSnyanmisaka     cfg1.reg = &reg_out->hw_status;
522*437bfbebSnyanmisaka     cfg1.size = sizeof(RK_U32);
523*437bfbebSnyanmisaka     cfg1.offset = VEPU511_REG_BASE_HW_STATUS;
524*437bfbebSnyanmisaka 
525*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
526*437bfbebSnyanmisaka     if (ret) {
527*437bfbebSnyanmisaka         mpp_err_f("set register read failed %d\n", ret);
528*437bfbebSnyanmisaka         return ret;
529*437bfbebSnyanmisaka     }
530*437bfbebSnyanmisaka 
531*437bfbebSnyanmisaka     cfg1.reg = &reg_out->st;
532*437bfbebSnyanmisaka     cfg1.size = sizeof(JpegV511Status) - 4;
533*437bfbebSnyanmisaka     cfg1.offset = VEPU511_STATUS_OFFSET;
534*437bfbebSnyanmisaka 
535*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
536*437bfbebSnyanmisaka     if (ret) {
537*437bfbebSnyanmisaka         mpp_err_f("set register read failed %d\n", ret);
538*437bfbebSnyanmisaka         return ret;
539*437bfbebSnyanmisaka     }
540*437bfbebSnyanmisaka 
541*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
542*437bfbebSnyanmisaka     if (ret) {
543*437bfbebSnyanmisaka         mpp_err_f("send cmd failed %d\n", ret);
544*437bfbebSnyanmisaka     }
545*437bfbebSnyanmisaka     hal_jpege_leave();
546*437bfbebSnyanmisaka     return ret;
547*437bfbebSnyanmisaka }
548*437bfbebSnyanmisaka 
hal_jpege_vepu511_status_check(void * hal)549*437bfbebSnyanmisaka static MPP_RET hal_jpege_vepu511_status_check(void *hal)
550*437bfbebSnyanmisaka {
551*437bfbebSnyanmisaka     JpegeV511HalContext *ctx = (JpegeV511HalContext *)hal;
552*437bfbebSnyanmisaka     JpegV511Status *elem = (JpegV511Status *)ctx->reg_out;
553*437bfbebSnyanmisaka 
554*437bfbebSnyanmisaka     RK_U32 hw_status = elem->hw_status;
555*437bfbebSnyanmisaka 
556*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_LINKTABLE_FINISH)
557*437bfbebSnyanmisaka         mpp_err_f("RKV_ENC_INT_LINKTABLE_FINISH");
558*437bfbebSnyanmisaka 
559*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_ONE_SLICE_FINISH)
560*437bfbebSnyanmisaka         mpp_err_f("RKV_ENC_INT_ONE_SLICE_FINISH");
561*437bfbebSnyanmisaka 
562*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_SAFE_CLEAR_FINISH)
563*437bfbebSnyanmisaka         mpp_err_f("RKV_ENC_INT_SAFE_CLEAR_FINISH");
564*437bfbebSnyanmisaka 
565*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BIT_STREAM_OVERFLOW)
566*437bfbebSnyanmisaka         mpp_err_f("RKV_ENC_INT_BIT_STREAM_OVERFLOW");
567*437bfbebSnyanmisaka 
568*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BUS_WRITE_FULL)
569*437bfbebSnyanmisaka         mpp_err_f("RKV_ENC_INT_BUS_WRITE_FULL");
570*437bfbebSnyanmisaka 
571*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BUS_WRITE_ERROR)
572*437bfbebSnyanmisaka         mpp_err_f("RKV_ENC_INT_BUS_WRITE_ERROR");
573*437bfbebSnyanmisaka 
574*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BUS_READ_ERROR)
575*437bfbebSnyanmisaka         mpp_err_f("RKV_ENC_INT_BUS_READ_ERROR");
576*437bfbebSnyanmisaka 
577*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_TIMEOUT_ERROR)
578*437bfbebSnyanmisaka         mpp_err_f("RKV_ENC_INT_TIMEOUT_ERROR");
579*437bfbebSnyanmisaka 
580*437bfbebSnyanmisaka     return MPP_OK;
581*437bfbebSnyanmisaka }
582*437bfbebSnyanmisaka 
hal_jpege_vepu511_wait(void * hal,HalEncTask * task)583*437bfbebSnyanmisaka MPP_RET hal_jpege_vepu511_wait(void *hal, HalEncTask *task)
584*437bfbebSnyanmisaka {
585*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
586*437bfbebSnyanmisaka     JpegeV511HalContext *ctx = (JpegeV511HalContext *)hal;
587*437bfbebSnyanmisaka     HalEncTask *enc_task = task;
588*437bfbebSnyanmisaka     JpegV511Status *elem = (JpegV511Status *)ctx->reg_out;
589*437bfbebSnyanmisaka     hal_jpege_enter();
590*437bfbebSnyanmisaka 
591*437bfbebSnyanmisaka     if (enc_task->flags.err) {
592*437bfbebSnyanmisaka         mpp_err_f("enc_task->flags.err %08x, return early",
593*437bfbebSnyanmisaka                   enc_task->flags.err);
594*437bfbebSnyanmisaka         return MPP_NOK;
595*437bfbebSnyanmisaka     }
596*437bfbebSnyanmisaka 
597*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
598*437bfbebSnyanmisaka     if (ret) {
599*437bfbebSnyanmisaka         mpp_err_f("poll cmd failed %d\n", ret);
600*437bfbebSnyanmisaka         ret = MPP_ERR_VPUHW;
601*437bfbebSnyanmisaka     } else {
602*437bfbebSnyanmisaka         hal_jpege_vepu511_status_check(hal);
603*437bfbebSnyanmisaka         task->hw_length += elem->st.jpeg_head_bits_l32;
604*437bfbebSnyanmisaka     }
605*437bfbebSnyanmisaka 
606*437bfbebSnyanmisaka     hal_jpege_leave();
607*437bfbebSnyanmisaka     return ret;
608*437bfbebSnyanmisaka }
609*437bfbebSnyanmisaka 
hal_jpege_vepu511_get_task(void * hal,HalEncTask * task)610*437bfbebSnyanmisaka MPP_RET hal_jpege_vepu511_get_task(void *hal, HalEncTask *task)
611*437bfbebSnyanmisaka {
612*437bfbebSnyanmisaka     JpegeV511HalContext *ctx = (JpegeV511HalContext *)hal;
613*437bfbebSnyanmisaka     MppFrame frame = task->frame;
614*437bfbebSnyanmisaka     EncFrmStatus  *frm_status = &task->rc_task->frm;
615*437bfbebSnyanmisaka     JpegeSyntax *syntax = (JpegeSyntax *)task->syntax.data;
616*437bfbebSnyanmisaka 
617*437bfbebSnyanmisaka     hal_jpege_enter();
618*437bfbebSnyanmisaka 
619*437bfbebSnyanmisaka     memcpy(&ctx->syntax, syntax, sizeof(ctx->syntax));
620*437bfbebSnyanmisaka     ctx->last_frame_type = ctx->frame_type;
621*437bfbebSnyanmisaka 
622*437bfbebSnyanmisaka     if (!frm_status->reencode && mpp_frame_has_meta(task->frame)) {
623*437bfbebSnyanmisaka         MppMeta meta = mpp_frame_get_meta(frame);
624*437bfbebSnyanmisaka 
625*437bfbebSnyanmisaka         mpp_meta_get_ptr(meta, KEY_JPEG_ROI_DATA, (void **)&ctx->roi_data);
626*437bfbebSnyanmisaka         mpp_meta_get_ptr(meta, KEY_OSD_DATA3, (void **)&ctx->osd_cfg.osd_data3);
627*437bfbebSnyanmisaka 
628*437bfbebSnyanmisaka     }
629*437bfbebSnyanmisaka 
630*437bfbebSnyanmisaka     if (ctx->cfg->jpeg.update) {
631*437bfbebSnyanmisaka         hal_jpege_rc_update(&ctx->hal_rc, syntax);
632*437bfbebSnyanmisaka         ctx->cfg->jpeg.update = 0;
633*437bfbebSnyanmisaka     }
634*437bfbebSnyanmisaka 
635*437bfbebSnyanmisaka     task->rc_task->frm.is_intra = 1;
636*437bfbebSnyanmisaka 
637*437bfbebSnyanmisaka     hal_jpege_leave();
638*437bfbebSnyanmisaka     return MPP_OK;
639*437bfbebSnyanmisaka }
640*437bfbebSnyanmisaka 
hal_jpege_vepu511_ret_task(void * hal,HalEncTask * task)641*437bfbebSnyanmisaka MPP_RET hal_jpege_vepu511_ret_task(void *hal, HalEncTask *task)
642*437bfbebSnyanmisaka {
643*437bfbebSnyanmisaka     (void)hal;
644*437bfbebSnyanmisaka     EncRcTaskInfo *rc_info = &task->rc_task->info;
645*437bfbebSnyanmisaka     hal_jpege_enter();
646*437bfbebSnyanmisaka 
647*437bfbebSnyanmisaka     task->length += task->hw_length;
648*437bfbebSnyanmisaka 
649*437bfbebSnyanmisaka     // setup bit length for rate control
650*437bfbebSnyanmisaka     rc_info->bit_real = task->hw_length * 8;
651*437bfbebSnyanmisaka     rc_info->quality_real = rc_info->quality_target;
652*437bfbebSnyanmisaka 
653*437bfbebSnyanmisaka     hal_jpege_leave();
654*437bfbebSnyanmisaka     return MPP_OK;
655*437bfbebSnyanmisaka }
656*437bfbebSnyanmisaka 
657*437bfbebSnyanmisaka const MppEncHalApi hal_jpege_vepu511 = {
658*437bfbebSnyanmisaka     .name       = "hal_jpege_v511",
659*437bfbebSnyanmisaka     .coding     = MPP_VIDEO_CodingMJPEG,
660*437bfbebSnyanmisaka     .ctx_size   = sizeof(JpegeV511HalContext),
661*437bfbebSnyanmisaka     .flag       = 0,
662*437bfbebSnyanmisaka     .init       = hal_jpege_vepu511_init,
663*437bfbebSnyanmisaka     .deinit     = hal_jpege_vepu511_deinit,
664*437bfbebSnyanmisaka     .prepare    = hal_jpege_vepu511_prepare,
665*437bfbebSnyanmisaka     .get_task   = hal_jpege_vepu511_get_task,
666*437bfbebSnyanmisaka     .gen_regs   = hal_jpege_vepu511_gen_regs,
667*437bfbebSnyanmisaka     .start      = hal_jpege_vepu511_start,
668*437bfbebSnyanmisaka     .wait       = hal_jpege_vepu511_wait,
669*437bfbebSnyanmisaka     .part_start = NULL,
670*437bfbebSnyanmisaka     .part_wait  = NULL,
671*437bfbebSnyanmisaka     .ret_task   = hal_jpege_vepu511_ret_task,
672*437bfbebSnyanmisaka };
673