1 /* SPDX-License-Identifier: Apache-2.0 */
2 /*
3 * Copyright (c) 2024 Rockchip Electronics Co., Ltd.
4 */
5
6 #define MODULE_TAG "vepu510_common"
7
8 #include <string.h>
9 #include "mpp_log.h"
10 #include "mpp_common.h"
11 #include "vepu510_common.h"
12
vepu510_set_roi(void * roi_reg_base,MppEncROICfg * roi,RK_S32 w,RK_S32 h)13 MPP_RET vepu510_set_roi(void *roi_reg_base, MppEncROICfg * roi,
14 RK_S32 w, RK_S32 h)
15 {
16 MppEncROIRegion *region = roi->regions;
17 Vepu510RoiCfg *roi_cfg = (Vepu510RoiCfg *)roi_reg_base;
18 Vepu510RoiRegion *reg_regions = &roi_cfg->regions[0];
19 MPP_RET ret = MPP_NOK;
20 RK_S32 i = 0;
21
22 if (NULL == reg_regions) {
23 mpp_err_f("invalid reg_regions %p\n", reg_regions);
24 goto DONE;
25 }
26 memset(reg_regions, 0, sizeof(Vepu510RoiRegion) * 8);
27
28 if (NULL == roi_cfg || NULL == roi) {
29 mpp_err_f("invalid buf %p roi %p\n", roi_cfg, roi);
30 goto DONE;
31 }
32
33 if (roi->number > VEPU510_MAX_ROI_NUM) {
34 mpp_err_f("invalid region number %d\n", roi->number);
35 goto DONE;
36 }
37
38 /* check region config */
39 ret = MPP_OK;
40 for (i = 0; i < (RK_S32) roi->number; i++, region++) {
41 if (region->x + region->w > w || region->y + region->h > h)
42 ret = MPP_NOK;
43
44 if (region->intra > 1
45 || region->qp_area_idx >= VEPU510_MAX_ROI_NUM
46 || region->area_map_en > 1 || region->abs_qp_en > 1)
47 ret = MPP_NOK;
48
49 if ((region->abs_qp_en && region->quality > 51) ||
50 (!region->abs_qp_en
51 && (region->quality > 51 || region->quality < -51)))
52 ret = MPP_NOK;
53
54 if (ret) {
55 mpp_err_f("region %d invalid param:\n", i);
56 mpp_err_f("position [%d:%d:%d:%d] vs [%d:%d]\n",
57 region->x, region->y, region->w, region->h, w,
58 h);
59 mpp_err_f("force intra %d qp area index %d\n",
60 region->intra, region->qp_area_idx);
61 mpp_err_f("abs qp mode %d value %d\n",
62 region->abs_qp_en, region->quality);
63 goto DONE;
64 }
65 reg_regions->roi_pos_lt.roi_lt_x = MPP_ALIGN(region->x, 16) >> 4;
66 reg_regions->roi_pos_lt.roi_lt_y = MPP_ALIGN(region->y, 16) >> 4;
67 reg_regions->roi_pos_rb.roi_rb_x = MPP_ALIGN(region->x + region->w, 16) >> 4;
68 reg_regions->roi_pos_rb.roi_rb_y = MPP_ALIGN(region->y + region->h, 16) >> 4;
69 reg_regions->roi_base.roi_qp_value = region->quality;
70 reg_regions->roi_base.roi_qp_adj_mode = region->abs_qp_en;
71 reg_regions->roi_base.roi_en = 1;
72 reg_regions->roi_base.roi_pri = 0x1f;
73 if (region->intra) {
74 reg_regions->roi_mdc.roi_mdc_intra16 = 1;
75 reg_regions->roi_mdc.roi0_mdc_intra32_hevc = 1;
76 }
77 reg_regions++;
78 }
79
80 DONE:
81 return ret;
82 }
83
84