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