xref: /rockchip-linux_mpp/mpp/hal/rkenc/common/vepu511_common.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  "vepu511_common"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <string.h>
9*437bfbebSnyanmisaka 
10*437bfbebSnyanmisaka #include "kmpp_obj.h"
11*437bfbebSnyanmisaka #include "kmpp_buffer.h"
12*437bfbebSnyanmisaka 
13*437bfbebSnyanmisaka #include "mpp_log.h"
14*437bfbebSnyanmisaka #include "mpp_common.h"
15*437bfbebSnyanmisaka #include "vepu511_common.h"
16*437bfbebSnyanmisaka #include "jpege_syntax.h"
17*437bfbebSnyanmisaka #include "vepu5xx_common.h"
18*437bfbebSnyanmisaka #include "hal_enc_task.h"
19*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
20*437bfbebSnyanmisaka #include "mpp_packet.h"
21*437bfbebSnyanmisaka #include "mpp_debug.h"
22*437bfbebSnyanmisaka #include "mpp_mem.h"
23*437bfbebSnyanmisaka 
vepu511_set_osd(Vepu511OsdCfg * cfg,Vepu511Osd * osd_reg)24*437bfbebSnyanmisaka MPP_RET vepu511_set_osd(Vepu511OsdCfg * cfg, Vepu511Osd *osd_reg)
25*437bfbebSnyanmisaka {
26*437bfbebSnyanmisaka     Vepu511Osd *regs = osd_reg;
27*437bfbebSnyanmisaka     MppEncOSDData3 *osd_ptr = cfg->osd_data3;
28*437bfbebSnyanmisaka     Vepu511OsdRegion *osd_regions = &regs->osd_regions[0];
29*437bfbebSnyanmisaka     MppEncOSDRegion3 *region = osd_ptr->region;
30*437bfbebSnyanmisaka     RK_U32 i = 0;
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka     if (NULL == osd_regions) {
33*437bfbebSnyanmisaka         mpp_err_f("invalid reg_regions %p\n", osd_regions);
34*437bfbebSnyanmisaka     }
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka     memset(osd_regions, 0, sizeof(Vepu511OsdRegion) * 8);
37*437bfbebSnyanmisaka     if (osd_ptr->num_region > 8) {
38*437bfbebSnyanmisaka         mpp_err_f("do NOT support more than 8 regions invalid num %d\n",
39*437bfbebSnyanmisaka                   osd_ptr->num_region);
40*437bfbebSnyanmisaka         mpp_assert(osd_ptr->num_region <= 8);
41*437bfbebSnyanmisaka         return MPP_NOK;
42*437bfbebSnyanmisaka     }
43*437bfbebSnyanmisaka 
44*437bfbebSnyanmisaka     for (i = 0; i < osd_ptr->num_region; i++, region++) {
45*437bfbebSnyanmisaka         Vepu511OsdRegion *reg = &osd_reg->osd_regions[i];
46*437bfbebSnyanmisaka         VepuFmtCfg fmt_cfg;
47*437bfbebSnyanmisaka         MppFrameFormat fmt = region->fmt;
48*437bfbebSnyanmisaka         KmppBuffer buffer = NULL;
49*437bfbebSnyanmisaka         KmppBufCfg buf_cfg = NULL;
50*437bfbebSnyanmisaka 
51*437bfbebSnyanmisaka         vepu5xx_set_fmt(&fmt_cfg, fmt);
52*437bfbebSnyanmisaka         reg->cfg0.osd_en = region->enable;
53*437bfbebSnyanmisaka         reg->cfg0.osd_range_trns_en = region->range_trns_en;
54*437bfbebSnyanmisaka         reg->cfg0.osd_range_trns_sel = region->range_trns_sel;
55*437bfbebSnyanmisaka         reg->cfg0.osd_fmt = fmt_cfg.format;
56*437bfbebSnyanmisaka         reg->cfg0.osd_rbuv_swap = region->rbuv_swap;
57*437bfbebSnyanmisaka         reg->cfg1.osd_lt_xcrd = region->lt_x;
58*437bfbebSnyanmisaka         reg->cfg1.osd_lt_ycrd = region->lt_y;
59*437bfbebSnyanmisaka         reg->cfg2.osd_rb_xcrd = region->rb_x;
60*437bfbebSnyanmisaka         reg->cfg2.osd_rb_ycrd = region->rb_y;
61*437bfbebSnyanmisaka 
62*437bfbebSnyanmisaka         reg->cfg1.osd_endn = region->osd_endn;
63*437bfbebSnyanmisaka         reg->cfg5.osd_stride = region->stride;
64*437bfbebSnyanmisaka         reg->cfg5.osd_ch_ds_mode = region->ch_ds_mode;
65*437bfbebSnyanmisaka         reg->cfg0.osd_alpha_swap = region->alpha_cfg.alpha_swap;
66*437bfbebSnyanmisaka         reg->cfg0.osd_fg_alpha = region->alpha_cfg.fg_alpha;
67*437bfbebSnyanmisaka         reg->cfg0.osd_fg_alpha_sel = region->alpha_cfg.fg_alpha_sel;
68*437bfbebSnyanmisaka         reg->cfg0.osd_qp_adj_en = region->qp_cfg.qp_adj_en;
69*437bfbebSnyanmisaka         reg->cfg8.osd_qp_adj_sel = region->qp_cfg.qp_adj_sel;
70*437bfbebSnyanmisaka         reg->cfg8.osd_qp = region->qp_cfg.qp;
71*437bfbebSnyanmisaka         reg->cfg8.osd_qp_max = region->qp_cfg.qp_max;
72*437bfbebSnyanmisaka         reg->cfg8.osd_qp_min = region->qp_cfg.qp_min;
73*437bfbebSnyanmisaka         reg->cfg8.osd_qp_prj = region->qp_cfg.qp_prj;
74*437bfbebSnyanmisaka 
75*437bfbebSnyanmisaka         kmpp_obj_get_by_sptr_f(&buffer, &region->osd_buf);
76*437bfbebSnyanmisaka         if (buffer) {
77*437bfbebSnyanmisaka             buf_cfg = kmpp_buffer_to_cfg(buffer);
78*437bfbebSnyanmisaka             kmpp_buf_cfg_get_fd(buf_cfg, (RK_S32 *)&reg->osd_st_addr);
79*437bfbebSnyanmisaka         }
80*437bfbebSnyanmisaka         memcpy(reg->lut, region->lut, sizeof(region->lut));
81*437bfbebSnyanmisaka     }
82*437bfbebSnyanmisaka 
83*437bfbebSnyanmisaka     regs->osd_whi_cfg0.osd_csc_yr = 77;
84*437bfbebSnyanmisaka     regs->osd_whi_cfg0.osd_csc_yg = 150;
85*437bfbebSnyanmisaka     regs->osd_whi_cfg0.osd_csc_yb = 29;
86*437bfbebSnyanmisaka 
87*437bfbebSnyanmisaka     regs->osd_whi_cfg1.osd_csc_ur = -43;
88*437bfbebSnyanmisaka     regs->osd_whi_cfg1.osd_csc_ug = -85;
89*437bfbebSnyanmisaka     regs->osd_whi_cfg1.osd_csc_ub = 128;
90*437bfbebSnyanmisaka 
91*437bfbebSnyanmisaka     regs->osd_whi_cfg2.osd_csc_vr = 128;
92*437bfbebSnyanmisaka     regs->osd_whi_cfg2.osd_csc_vg = -107;
93*437bfbebSnyanmisaka     regs->osd_whi_cfg2.osd_csc_vb = -21;
94*437bfbebSnyanmisaka 
95*437bfbebSnyanmisaka     regs->osd_whi_cfg3.osd_csc_ofst_y = 0;
96*437bfbebSnyanmisaka     regs->osd_whi_cfg3.osd_csc_ofst_u = 128;
97*437bfbebSnyanmisaka     regs->osd_whi_cfg3.osd_csc_ofst_v = 128;
98*437bfbebSnyanmisaka 
99*437bfbebSnyanmisaka     return MPP_OK;
100*437bfbebSnyanmisaka }
101*437bfbebSnyanmisaka 
vepu511_set_roi(Vepu511RoiCfg * roi_reg_base,MppEncROICfg * roi,RK_S32 w,RK_S32 h)102*437bfbebSnyanmisaka MPP_RET vepu511_set_roi(Vepu511RoiCfg *roi_reg_base, MppEncROICfg * roi, RK_S32 w, RK_S32 h)
103*437bfbebSnyanmisaka {
104*437bfbebSnyanmisaka     MppEncROIRegion *region = roi->regions;
105*437bfbebSnyanmisaka     Vepu511RoiCfg  *roi_cfg = (Vepu511RoiCfg *)roi_reg_base;
106*437bfbebSnyanmisaka     Vepu511RoiRegion *reg_regions = &roi_cfg->regions[0];
107*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
108*437bfbebSnyanmisaka     RK_S32 i = 0;
109*437bfbebSnyanmisaka 
110*437bfbebSnyanmisaka     memset(reg_regions, 0, sizeof(Vepu511RoiRegion) * 8);
111*437bfbebSnyanmisaka     if (NULL == roi_cfg || NULL == roi) {
112*437bfbebSnyanmisaka         mpp_err_f("invalid buf %p roi %p\n", roi_cfg, roi);
113*437bfbebSnyanmisaka         goto DONE;
114*437bfbebSnyanmisaka     }
115*437bfbebSnyanmisaka 
116*437bfbebSnyanmisaka     if (roi->number > VEPU511_MAX_ROI_NUM) {
117*437bfbebSnyanmisaka         mpp_err_f("invalid region number %d\n", roi->number);
118*437bfbebSnyanmisaka         goto DONE;
119*437bfbebSnyanmisaka     }
120*437bfbebSnyanmisaka 
121*437bfbebSnyanmisaka     /* check region config */
122*437bfbebSnyanmisaka     ret = MPP_OK;
123*437bfbebSnyanmisaka     for (i = 0; i < (RK_S32) roi->number; i++, region++) {
124*437bfbebSnyanmisaka         if (region->x + region->w > w || region->y + region->h > h)
125*437bfbebSnyanmisaka             ret = MPP_NOK;
126*437bfbebSnyanmisaka 
127*437bfbebSnyanmisaka         if (region->intra > 1 || region->qp_area_idx >= VEPU511_MAX_ROI_NUM ||
128*437bfbebSnyanmisaka             region->area_map_en > 1 || region->abs_qp_en > 1)
129*437bfbebSnyanmisaka             ret = MPP_NOK;
130*437bfbebSnyanmisaka 
131*437bfbebSnyanmisaka         if ((region->abs_qp_en && region->quality > 51) ||
132*437bfbebSnyanmisaka             (!region->abs_qp_en && (region->quality > 51 || region->quality < -51)))
133*437bfbebSnyanmisaka             ret = MPP_NOK;
134*437bfbebSnyanmisaka 
135*437bfbebSnyanmisaka         if (ret) {
136*437bfbebSnyanmisaka             mpp_err_f("region %d invalid param:\n", i);
137*437bfbebSnyanmisaka             mpp_err_f("position [%d:%d:%d:%d] vs [%d:%d]\n",
138*437bfbebSnyanmisaka                       region->x, region->y, region->w, region->h, w, h);
139*437bfbebSnyanmisaka             mpp_err_f("force intra %d qp area index %d\n",
140*437bfbebSnyanmisaka                       region->intra, region->qp_area_idx);
141*437bfbebSnyanmisaka             mpp_err_f("abs qp mode %d value %d\n",
142*437bfbebSnyanmisaka                       region->abs_qp_en, region->quality);
143*437bfbebSnyanmisaka             goto DONE;
144*437bfbebSnyanmisaka         }
145*437bfbebSnyanmisaka 
146*437bfbebSnyanmisaka         reg_regions->roi_pos_lt.roi_lt_x = MPP_ALIGN(region->x, 16) >> 4;
147*437bfbebSnyanmisaka         reg_regions->roi_pos_lt.roi_lt_y = MPP_ALIGN(region->y, 16) >> 4;
148*437bfbebSnyanmisaka         reg_regions->roi_pos_rb.roi_rb_x = MPP_ALIGN(region->x + region->w, 16) >> 4;
149*437bfbebSnyanmisaka         reg_regions->roi_pos_rb.roi_rb_y = MPP_ALIGN(region->y + region->h, 16) >> 4;
150*437bfbebSnyanmisaka         reg_regions->roi_base.roi_qp_value = region->quality;
151*437bfbebSnyanmisaka         reg_regions->roi_base.roi_qp_adj_mode = region->abs_qp_en;
152*437bfbebSnyanmisaka         reg_regions->roi_base.roi_en = 1;
153*437bfbebSnyanmisaka         reg_regions->roi_base.roi_pri = 0x1f;
154*437bfbebSnyanmisaka         if (region->intra) {
155*437bfbebSnyanmisaka             reg_regions->reg1063.roi0_mdc0_hevc.mdc_intra16 = 1;
156*437bfbebSnyanmisaka             reg_regions->roi_mdc_hevc.mdc_intra32 = 1;
157*437bfbebSnyanmisaka         }
158*437bfbebSnyanmisaka         reg_regions++;
159*437bfbebSnyanmisaka     }
160*437bfbebSnyanmisaka 
161*437bfbebSnyanmisaka DONE:
162*437bfbebSnyanmisaka     return ret;
163*437bfbebSnyanmisaka }
164*437bfbebSnyanmisaka 
165*437bfbebSnyanmisaka 
166