xref: /rockchip-linux_mpp/mpp/vproc/vdpp/hwpq_vdpp_proc.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2024 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #include <stdio.h>
7*437bfbebSnyanmisaka #include <stdlib.h>
8*437bfbebSnyanmisaka #include <string.h>
9*437bfbebSnyanmisaka #include <sys/mman.h>
10*437bfbebSnyanmisaka #include <unistd.h>
11*437bfbebSnyanmisaka #include <sys/syscall.h>
12*437bfbebSnyanmisaka 
13*437bfbebSnyanmisaka #include "mpp_mem.h"
14*437bfbebSnyanmisaka #include "mpp_env.h"
15*437bfbebSnyanmisaka #include "mpp_buffer.h"
16*437bfbebSnyanmisaka #include "mpp_soc.h"
17*437bfbebSnyanmisaka 
18*437bfbebSnyanmisaka #include "vdpp_api.h"
19*437bfbebSnyanmisaka #include "hwpq_vdpp_proc_api.h"
20*437bfbebSnyanmisaka #include "hwpq_debug.h"
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka RK_U32 hwpq_vdpp_debug = 0;
23*437bfbebSnyanmisaka 
24*437bfbebSnyanmisaka #define HWPQ_VDPP_MAX_FILE_NAME_LEN         (256)
25*437bfbebSnyanmisaka #define HWPQ_VDPP_DEBUG_CFG_PROP            "vendor.vdpp.debug_cfg"
26*437bfbebSnyanmisaka 
27*437bfbebSnyanmisaka static const char hwpq_vdpp_in_path[] = "/data/vendor/rkalgo/hwpq_vdpp_in.bin";
28*437bfbebSnyanmisaka static const char hwpq_vdpp_out_path[] = "/data/vendor/rkalgo/hwpq_vdpp_out.bin";
29*437bfbebSnyanmisaka 
30*437bfbebSnyanmisaka typedef struct VdppCtxImpl_e {
31*437bfbebSnyanmisaka     vdpp_com_ctx* vdpp;
32*437bfbebSnyanmisaka 
33*437bfbebSnyanmisaka     MppBufferGroup memGroup;
34*437bfbebSnyanmisaka     MppBuffer histbuf;
35*437bfbebSnyanmisaka } VdppCtxImpl;
36*437bfbebSnyanmisaka 
set_dmsr_default_config(struct vdpp_api_params * p_api_params)37*437bfbebSnyanmisaka static void set_dmsr_default_config(struct vdpp_api_params* p_api_params)
38*437bfbebSnyanmisaka {
39*437bfbebSnyanmisaka     p_api_params->ptype = VDPP_PARAM_TYPE_DMSR;
40*437bfbebSnyanmisaka     p_api_params->param.dmsr.enable = 1;
41*437bfbebSnyanmisaka     p_api_params->param.dmsr.str_pri_y = 10;
42*437bfbebSnyanmisaka     p_api_params->param.dmsr.str_sec_y = 4;
43*437bfbebSnyanmisaka     p_api_params->param.dmsr.dumping_y = 6;
44*437bfbebSnyanmisaka     p_api_params->param.dmsr.wgt_pri_gain_even_1 = 12;
45*437bfbebSnyanmisaka     p_api_params->param.dmsr.wgt_pri_gain_even_2 = 12;
46*437bfbebSnyanmisaka     p_api_params->param.dmsr.wgt_pri_gain_odd_1 = 8;
47*437bfbebSnyanmisaka     p_api_params->param.dmsr.wgt_pri_gain_odd_2 = 16;
48*437bfbebSnyanmisaka     p_api_params->param.dmsr.wgt_sec_gain = 5;
49*437bfbebSnyanmisaka     p_api_params->param.dmsr.blk_flat_th = 20;
50*437bfbebSnyanmisaka     p_api_params->param.dmsr.contrast_to_conf_map_x0 = 1680;
51*437bfbebSnyanmisaka     p_api_params->param.dmsr.contrast_to_conf_map_x1 = 6720;
52*437bfbebSnyanmisaka     p_api_params->param.dmsr.contrast_to_conf_map_y0 = 0;
53*437bfbebSnyanmisaka     p_api_params->param.dmsr.contrast_to_conf_map_y1 = 65535;
54*437bfbebSnyanmisaka     p_api_params->param.dmsr.diff_core_th0 = 1;
55*437bfbebSnyanmisaka     p_api_params->param.dmsr.diff_core_th1 = 5;
56*437bfbebSnyanmisaka     p_api_params->param.dmsr.diff_core_wgt0 = 16;
57*437bfbebSnyanmisaka     p_api_params->param.dmsr.diff_core_wgt1 = 16;
58*437bfbebSnyanmisaka     p_api_params->param.dmsr.diff_core_wgt2 = 16;
59*437bfbebSnyanmisaka     p_api_params->param.dmsr.edge_th_low_arr[0] = 30;
60*437bfbebSnyanmisaka     p_api_params->param.dmsr.edge_th_low_arr[1] = 10;
61*437bfbebSnyanmisaka     p_api_params->param.dmsr.edge_th_low_arr[2] = 0;
62*437bfbebSnyanmisaka     p_api_params->param.dmsr.edge_th_low_arr[3] = 0;
63*437bfbebSnyanmisaka     p_api_params->param.dmsr.edge_th_low_arr[4] = 0;
64*437bfbebSnyanmisaka     p_api_params->param.dmsr.edge_th_low_arr[5] = 0;
65*437bfbebSnyanmisaka     p_api_params->param.dmsr.edge_th_low_arr[6] = 0;
66*437bfbebSnyanmisaka     p_api_params->param.dmsr.edge_th_high_arr[0] = 60;
67*437bfbebSnyanmisaka     p_api_params->param.dmsr.edge_th_high_arr[1] = 40;
68*437bfbebSnyanmisaka     p_api_params->param.dmsr.edge_th_high_arr[2] = 20;
69*437bfbebSnyanmisaka     p_api_params->param.dmsr.edge_th_high_arr[3] = 10;
70*437bfbebSnyanmisaka     p_api_params->param.dmsr.edge_th_high_arr[4] = 10;
71*437bfbebSnyanmisaka     p_api_params->param.dmsr.edge_th_high_arr[5] = 10;
72*437bfbebSnyanmisaka     p_api_params->param.dmsr.edge_th_high_arr[6] = 10;
73*437bfbebSnyanmisaka }
74*437bfbebSnyanmisaka 
set_es_default_config(struct vdpp_api_params * p_api_params)75*437bfbebSnyanmisaka static void set_es_default_config(struct vdpp_api_params* p_api_params)
76*437bfbebSnyanmisaka {
77*437bfbebSnyanmisaka     static RK_S32 diff2conf_lut_x_tmp[9] = {
78*437bfbebSnyanmisaka         0, 1024, 2048, 3072, 4096, 6144, 8192, 12288, 65535,
79*437bfbebSnyanmisaka     };
80*437bfbebSnyanmisaka     static RK_S32 diff2conf_lut_y_tmp[9] = {
81*437bfbebSnyanmisaka         0, 84, 141, 179, 204, 233, 246, 253, 255,
82*437bfbebSnyanmisaka     };
83*437bfbebSnyanmisaka 
84*437bfbebSnyanmisaka     p_api_params->ptype = VDPP_PARAM_TYPE_ES;
85*437bfbebSnyanmisaka     p_api_params->param.es.es_bEnabledES          = 0;
86*437bfbebSnyanmisaka     p_api_params->param.es.es_iAngleDelta         = 17;
87*437bfbebSnyanmisaka     p_api_params->param.es.es_iAngleDeltaExtra    = 5;
88*437bfbebSnyanmisaka     p_api_params->param.es.es_iGradNoDirTh        = 37;
89*437bfbebSnyanmisaka     p_api_params->param.es.es_iGradFlatTh         = 75;
90*437bfbebSnyanmisaka     p_api_params->param.es.es_iWgtGain            = 128;
91*437bfbebSnyanmisaka     p_api_params->param.es.es_iWgtDecay           = 128;
92*437bfbebSnyanmisaka     p_api_params->param.es.es_iLowConfTh          = 96;
93*437bfbebSnyanmisaka     p_api_params->param.es.es_iLowConfRatio       = 32;
94*437bfbebSnyanmisaka     p_api_params->param.es.es_iConfCntTh          = 4;
95*437bfbebSnyanmisaka     p_api_params->param.es.es_iWgtLocalTh         = 64;
96*437bfbebSnyanmisaka     p_api_params->param.es.es_iK1                 = 4096;
97*437bfbebSnyanmisaka     p_api_params->param.es.es_iK2                 = 7168;
98*437bfbebSnyanmisaka     p_api_params->param.es.es_iDeltaLimit         = 65280;
99*437bfbebSnyanmisaka     memcpy(&p_api_params->param.es.es_iDiff2conf_lut_x[0], &diff2conf_lut_x_tmp[0],
100*437bfbebSnyanmisaka            sizeof(diff2conf_lut_x_tmp));
101*437bfbebSnyanmisaka     memcpy(&p_api_params->param.es.es_iDiff2conf_lut_y[0], &diff2conf_lut_y_tmp[0],
102*437bfbebSnyanmisaka            sizeof(diff2conf_lut_y_tmp));
103*437bfbebSnyanmisaka     p_api_params->param.es.es_bEndpointCheckEnable = 1;
104*437bfbebSnyanmisaka }
105*437bfbebSnyanmisaka 
set_hist_cnt_default_config(struct vdpp_api_params * p_api_params)106*437bfbebSnyanmisaka static void set_hist_cnt_default_config(struct vdpp_api_params* p_api_params)
107*437bfbebSnyanmisaka {
108*437bfbebSnyanmisaka     p_api_params->ptype = VDPP_PARAM_TYPE_HIST;
109*437bfbebSnyanmisaka 
110*437bfbebSnyanmisaka     p_api_params->param.hist.hist_cnt_en   = 1;
111*437bfbebSnyanmisaka     p_api_params->param.hist.dci_hsd_mode  = 0;
112*437bfbebSnyanmisaka     p_api_params->param.hist.dci_vsd_mode  = 0;
113*437bfbebSnyanmisaka     p_api_params->param.hist.dci_yrgb_gather_num  = 0;
114*437bfbebSnyanmisaka     p_api_params->param.hist.dci_yrgb_gather_en  = 0;
115*437bfbebSnyanmisaka }
116*437bfbebSnyanmisaka 
set_shp_default_config(struct vdpp_api_params * p_api_params)117*437bfbebSnyanmisaka static void set_shp_default_config(struct vdpp_api_params* p_api_params)
118*437bfbebSnyanmisaka {
119*437bfbebSnyanmisaka     static RK_S32 coring_zero_tmp[7]        = {
120*437bfbebSnyanmisaka         5, 5, 8, 5, 8, 5, 5,
121*437bfbebSnyanmisaka     };
122*437bfbebSnyanmisaka     static RK_S32 coring_thr_tmp[7]         = {
123*437bfbebSnyanmisaka         40, 40, 40, 24, 26, 30, 26,
124*437bfbebSnyanmisaka     };
125*437bfbebSnyanmisaka     static RK_S32 coring_ratio_tmp[7]       = {
126*437bfbebSnyanmisaka         1479, 1188, 1024, 1422, 1024, 1024, 1024,
127*437bfbebSnyanmisaka     };
128*437bfbebSnyanmisaka     static RK_S32 gain_pos_tmp[7]           = {
129*437bfbebSnyanmisaka         128, 256, 512, 256, 512, 256, 256,
130*437bfbebSnyanmisaka     };
131*437bfbebSnyanmisaka     static RK_S32 gain_neg_tmp[7]           = {
132*437bfbebSnyanmisaka         128, 256, 512, 256, 512, 256, 256,
133*437bfbebSnyanmisaka     };
134*437bfbebSnyanmisaka     static RK_S32 limit_ctrl_pos0_tmp[7]    = {
135*437bfbebSnyanmisaka         64, 64, 64, 64, 64, 64, 64,
136*437bfbebSnyanmisaka     };
137*437bfbebSnyanmisaka     static RK_S32 limit_ctrl_pos1_tmp[7]    = {
138*437bfbebSnyanmisaka         120, 120, 120, 120, 120, 120, 120,
139*437bfbebSnyanmisaka     };
140*437bfbebSnyanmisaka     static RK_S32 limit_ctrl_neg0_tmp[7]    = {
141*437bfbebSnyanmisaka         64, 64, 64, 64, 64, 64, 64,
142*437bfbebSnyanmisaka     };
143*437bfbebSnyanmisaka     static RK_S32 limit_ctrl_neg1_tmp[7]    = {
144*437bfbebSnyanmisaka         120, 120, 120, 120, 120, 120, 120,
145*437bfbebSnyanmisaka     };
146*437bfbebSnyanmisaka     static RK_S32 limit_ctrl_ratio_tmp[7]   = {
147*437bfbebSnyanmisaka         128, 128, 128, 128, 128, 128, 128,
148*437bfbebSnyanmisaka     };
149*437bfbebSnyanmisaka     static RK_S32 limit_ctrl_bnd_pos_tmp[7] = {
150*437bfbebSnyanmisaka         81, 131, 63, 81, 63, 63, 63,
151*437bfbebSnyanmisaka     };
152*437bfbebSnyanmisaka     static RK_S32 limit_ctrl_bnd_neg_tmp[7] = {
153*437bfbebSnyanmisaka         81, 131, 63, 81, 63, 63, 63,
154*437bfbebSnyanmisaka     };
155*437bfbebSnyanmisaka     static RK_S32 lum_grd_tmp[6]            = {
156*437bfbebSnyanmisaka         0, 200, 300, 860, 960, 102,
157*437bfbebSnyanmisaka     };
158*437bfbebSnyanmisaka     static RK_S32 lum_val_tmp[6]            = {
159*437bfbebSnyanmisaka         64, 64, 64, 64, 64, 64,
160*437bfbebSnyanmisaka     };
161*437bfbebSnyanmisaka     static RK_S32 adp_grd_tmp[6]            = {
162*437bfbebSnyanmisaka         0, 4, 60, 180, 300, 1023,
163*437bfbebSnyanmisaka     };
164*437bfbebSnyanmisaka     static RK_S32 adp_val_tmp[6]            = {
165*437bfbebSnyanmisaka         64, 64, 64, 64, 64, 64,
166*437bfbebSnyanmisaka     };
167*437bfbebSnyanmisaka     static RK_S32 var_grd_tmp[6]            = {
168*437bfbebSnyanmisaka         0, 39, 102, 209, 500, 1023,
169*437bfbebSnyanmisaka     };
170*437bfbebSnyanmisaka     static RK_S32 var_val_tmp[6]            = {
171*437bfbebSnyanmisaka         64, 64, 64, 64, 64, 64,
172*437bfbebSnyanmisaka     };
173*437bfbebSnyanmisaka     static RK_S32 diag_adj_gain_tab_tmp[8]  = {
174*437bfbebSnyanmisaka         6, 7, 8, 9, 10, 11, 12, 13,
175*437bfbebSnyanmisaka     };
176*437bfbebSnyanmisaka     static RK_S32 roll_tab_pattern0[16]     = {
177*437bfbebSnyanmisaka         0, 0, 0, 1, 2, 3, 4, 6, 8, 10, 11, 12, 13, 14, 15, 15,
178*437bfbebSnyanmisaka     };
179*437bfbebSnyanmisaka     static RK_S32 roll_tab_pattern1[16]     = {
180*437bfbebSnyanmisaka         31, 31, 30, 29, 28, 27, 25, 23, 21, 19, 18, 17, 16, 16, 15, 15,
181*437bfbebSnyanmisaka     };
182*437bfbebSnyanmisaka     static RK_S32 roll_tab_pattern2[16]     = {
183*437bfbebSnyanmisaka         16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
184*437bfbebSnyanmisaka     };
185*437bfbebSnyanmisaka     static RK_S32 tex_grd_tmp[6]            = {
186*437bfbebSnyanmisaka         0, 128, 256, 400, 600, 1023,
187*437bfbebSnyanmisaka     };
188*437bfbebSnyanmisaka     static RK_S32 tex_val_tmp[6]            = {
189*437bfbebSnyanmisaka         40, 60, 80, 100, 127, 127,
190*437bfbebSnyanmisaka     };
191*437bfbebSnyanmisaka 
192*437bfbebSnyanmisaka     p_api_params->ptype = VDPP_PARAM_TYPE_SHARP;
193*437bfbebSnyanmisaka 
194*437bfbebSnyanmisaka     p_api_params->param.sharp.sharp_enable               = 1;
195*437bfbebSnyanmisaka     p_api_params->param.sharp.sharp_coloradj_bypass_en   = 1;
196*437bfbebSnyanmisaka 
197*437bfbebSnyanmisaka     p_api_params->param.sharp.lti_h_enable           = 0;
198*437bfbebSnyanmisaka     p_api_params->param.sharp.lti_h_radius           = 1;
199*437bfbebSnyanmisaka     p_api_params->param.sharp.lti_h_slope            = 100;
200*437bfbebSnyanmisaka     p_api_params->param.sharp.lti_h_thresold         = 21;
201*437bfbebSnyanmisaka     p_api_params->param.sharp.lti_h_gain             = 8;
202*437bfbebSnyanmisaka     p_api_params->param.sharp.lti_h_noise_thr_pos    = 1023;
203*437bfbebSnyanmisaka     p_api_params->param.sharp.lti_h_noise_thr_neg    = 1023;
204*437bfbebSnyanmisaka 
205*437bfbebSnyanmisaka     p_api_params->param.sharp.lti_v_enable           = 0;
206*437bfbebSnyanmisaka     p_api_params->param.sharp.lti_v_radius           = 1;
207*437bfbebSnyanmisaka     p_api_params->param.sharp.lti_v_slope            = 100;
208*437bfbebSnyanmisaka     p_api_params->param.sharp.lti_v_thresold         = 21;
209*437bfbebSnyanmisaka     p_api_params->param.sharp.lti_v_gain             = 8;
210*437bfbebSnyanmisaka     p_api_params->param.sharp.lti_v_noise_thr_pos    = 1023;
211*437bfbebSnyanmisaka     p_api_params->param.sharp.lti_v_noise_thr_neg    = 1023;
212*437bfbebSnyanmisaka 
213*437bfbebSnyanmisaka     p_api_params->param.sharp.cti_h_enable           = 0;
214*437bfbebSnyanmisaka     p_api_params->param.sharp.cti_h_radius           = 1;
215*437bfbebSnyanmisaka     p_api_params->param.sharp.cti_h_slope            = 100;
216*437bfbebSnyanmisaka     p_api_params->param.sharp.cti_h_thresold         = 21;
217*437bfbebSnyanmisaka     p_api_params->param.sharp.cti_h_gain             = 8;
218*437bfbebSnyanmisaka     p_api_params->param.sharp.cti_h_noise_thr_pos    = 1023;
219*437bfbebSnyanmisaka     p_api_params->param.sharp.cti_h_noise_thr_neg    = 1023;
220*437bfbebSnyanmisaka 
221*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_enable         = 1;
222*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_gain           = 196;
223*437bfbebSnyanmisaka 
224*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_coring_enable      = 1;
225*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_limit_ctrl_enable  = 1;
226*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_gain_enable        = 1;
227*437bfbebSnyanmisaka 
228*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.peaking_coring_zero,    coring_zero_tmp,
229*437bfbebSnyanmisaka            sizeof(coring_zero_tmp));
230*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.peaking_coring_thr,     coring_thr_tmp,
231*437bfbebSnyanmisaka            sizeof(coring_thr_tmp));
232*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.peaking_coring_ratio,   coring_ratio_tmp,
233*437bfbebSnyanmisaka            sizeof(coring_ratio_tmp));
234*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.peaking_gain_pos,   gain_pos_tmp,   sizeof(gain_pos_tmp));
235*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.peaking_gain_neg,   gain_neg_tmp,   sizeof(gain_neg_tmp));
236*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.peaking_limit_ctrl_pos0,    limit_ctrl_pos0_tmp,
237*437bfbebSnyanmisaka            sizeof(limit_ctrl_pos0_tmp));
238*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.peaking_limit_ctrl_pos1,    limit_ctrl_pos1_tmp,
239*437bfbebSnyanmisaka            sizeof(limit_ctrl_pos1_tmp));
240*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.peaking_limit_ctrl_neg0,    limit_ctrl_neg0_tmp,
241*437bfbebSnyanmisaka            sizeof(limit_ctrl_neg0_tmp));
242*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.peaking_limit_ctrl_neg1,    limit_ctrl_neg1_tmp,
243*437bfbebSnyanmisaka            sizeof(limit_ctrl_neg1_tmp));
244*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.peaking_limit_ctrl_ratio,   limit_ctrl_ratio_tmp,
245*437bfbebSnyanmisaka            sizeof(limit_ctrl_ratio_tmp));
246*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.peaking_limit_ctrl_bnd_pos, limit_ctrl_bnd_pos_tmp,
247*437bfbebSnyanmisaka            sizeof(limit_ctrl_bnd_pos_tmp));
248*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.peaking_limit_ctrl_bnd_neg, limit_ctrl_bnd_neg_tmp,
249*437bfbebSnyanmisaka            sizeof(limit_ctrl_bnd_neg_tmp));
250*437bfbebSnyanmisaka 
251*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_edge_ctrl_enable               = 1;
252*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_edge_ctrl_non_dir_thr          = 16;
253*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_edge_ctrl_dir_cmp_ratio        = 4;
254*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_edge_ctrl_non_dir_wgt_offset   = 64;
255*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_edge_ctrl_non_dir_wgt_ratio    = 16;
256*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_edge_ctrl_dir_cnt_thr          = 2;
257*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_edge_ctrl_dir_cnt_avg          = 3;
258*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_edge_ctrl_dir_cnt_offset       = 2;
259*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_edge_ctrl_diag_dir_thr         = 16;
260*437bfbebSnyanmisaka 
261*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.peaking_edge_ctrl_diag_adj_gain_tab,
262*437bfbebSnyanmisaka            diag_adj_gain_tab_tmp, sizeof(diag_adj_gain_tab_tmp));
263*437bfbebSnyanmisaka 
264*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_enable                    = 1;
265*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_delta_offset_h            = 4;
266*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_over_h              = 8;
267*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_under_h             = 16;
268*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_over_unlimit_h      = 64;
269*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_under_unlimit_h     = 112;
270*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_delta_offset_v            = 4;
271*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_over_v              = 8;
272*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_under_v             = 16;
273*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_over_unlimit_v      = 64;
274*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_under_unlimit_v     = 112;
275*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_delta_offset_d0           = 4;
276*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_over_d0             = 16;
277*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_under_d0            = 16;
278*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_over_unlimit_d0     = 96;
279*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_under_unlimit_d0    = 96;
280*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_delta_offset_d1           = 4;
281*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_over_d1             = 16;
282*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_under_d1            = 16;
283*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_over_unlimit_d1     = 96;
284*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_under_unlimit_d1    = 96;
285*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_delta_offset_non          = 4;
286*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_over_non            = 8;
287*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_under_non           = 8;
288*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_over_unlimit_non    = 112;
289*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_estc_alpha_under_unlimit_non   = 112;
290*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filter_cfg_diag_enh_coef       = 6;
291*437bfbebSnyanmisaka 
292*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_H0[0]                = 4;
293*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_H0[1]                = 16;
294*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_H0[2]                = 24;
295*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_H1[0]                = -16;
296*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_H1[1]                = 0;
297*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_H1[2]                = 32;
298*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_H2[0]                = 0;
299*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_H2[1]                = -16;
300*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_H2[2]                = 32;
301*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_V0[0]                = 1;
302*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_V0[1]                = 4;
303*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_V0[2]                = 6;
304*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_V1[0]                = -4;
305*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_V1[1]                = 0;
306*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_V1[2]                = 8;
307*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_V2[0]                = 0;
308*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_V2[1]                = -4;
309*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_V2[2]                = 8;
310*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_USM[0]               = 1;
311*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_USM[1]               = 4;
312*437bfbebSnyanmisaka     p_api_params->param.sharp.peaking_filt_core_USM[2]               = 6;
313*437bfbebSnyanmisaka 
314*437bfbebSnyanmisaka     p_api_params->param.sharp.shootctrl_enable               = 1;
315*437bfbebSnyanmisaka     p_api_params->param.sharp.shootctrl_filter_radius        = 1;
316*437bfbebSnyanmisaka     p_api_params->param.sharp.shootctrl_delta_offset         = 16;
317*437bfbebSnyanmisaka     p_api_params->param.sharp.shootctrl_alpha_over           = 8;
318*437bfbebSnyanmisaka     p_api_params->param.sharp.shootctrl_alpha_under          = 8;
319*437bfbebSnyanmisaka     p_api_params->param.sharp.shootctrl_alpha_over_unlimit   = 112;
320*437bfbebSnyanmisaka     p_api_params->param.sharp.shootctrl_alpha_under_unlimit  = 112;
321*437bfbebSnyanmisaka 
322*437bfbebSnyanmisaka     p_api_params->param.sharp.global_gain_enable             = 0;
323*437bfbebSnyanmisaka     p_api_params->param.sharp.global_gain_lum_mode           = 0;
324*437bfbebSnyanmisaka 
325*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.global_gain_lum_grd, lum_grd_tmp, sizeof(lum_grd_tmp));
326*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.global_gain_lum_val, lum_val_tmp, sizeof(lum_val_tmp));
327*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.global_gain_adp_grd, adp_grd_tmp, sizeof(adp_grd_tmp));
328*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.global_gain_adp_val, adp_val_tmp, sizeof(adp_val_tmp));
329*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.global_gain_var_grd, var_grd_tmp, sizeof(var_grd_tmp));
330*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.global_gain_var_val, var_val_tmp, sizeof(var_val_tmp));
331*437bfbebSnyanmisaka 
332*437bfbebSnyanmisaka     p_api_params->param.sharp.color_ctrl_enable              = 0;
333*437bfbebSnyanmisaka 
334*437bfbebSnyanmisaka     p_api_params->param.sharp.color_ctrl_p0_scaling_coef     = 1;
335*437bfbebSnyanmisaka     p_api_params->param.sharp.color_ctrl_p0_point_u          = 115;
336*437bfbebSnyanmisaka     p_api_params->param.sharp.color_ctrl_p0_point_v          = 155;
337*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.color_ctrl_p0_roll_tab, roll_tab_pattern0,
338*437bfbebSnyanmisaka            sizeof(roll_tab_pattern0));
339*437bfbebSnyanmisaka     p_api_params->param.sharp.color_ctrl_p1_scaling_coef     = 1;
340*437bfbebSnyanmisaka     p_api_params->param.sharp.color_ctrl_p1_point_u          = 90;
341*437bfbebSnyanmisaka     p_api_params->param.sharp.color_ctrl_p1_point_v          = 120;
342*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.color_ctrl_p1_roll_tab, roll_tab_pattern1,
343*437bfbebSnyanmisaka            sizeof(roll_tab_pattern1));
344*437bfbebSnyanmisaka     p_api_params->param.sharp.color_ctrl_p2_scaling_coef     = 1;
345*437bfbebSnyanmisaka     p_api_params->param.sharp.color_ctrl_p2_point_u          = 128;
346*437bfbebSnyanmisaka     p_api_params->param.sharp.color_ctrl_p2_point_v          = 128;
347*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.color_ctrl_p2_roll_tab, roll_tab_pattern2,
348*437bfbebSnyanmisaka            sizeof(roll_tab_pattern2));
349*437bfbebSnyanmisaka     p_api_params->param.sharp.color_ctrl_p3_scaling_coef     = 1;
350*437bfbebSnyanmisaka     p_api_params->param.sharp.color_ctrl_p3_point_u          = 128;
351*437bfbebSnyanmisaka     p_api_params->param.sharp.color_ctrl_p3_point_v          = 128;
352*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.color_ctrl_p3_roll_tab, roll_tab_pattern2,
353*437bfbebSnyanmisaka            sizeof(roll_tab_pattern2));
354*437bfbebSnyanmisaka 
355*437bfbebSnyanmisaka     p_api_params->param.sharp.tex_adj_enable                 = 0;
356*437bfbebSnyanmisaka     p_api_params->param.sharp.tex_adj_y_mode_select          = 3;
357*437bfbebSnyanmisaka     p_api_params->param.sharp.tex_adj_mode_select            = 0;
358*437bfbebSnyanmisaka 
359*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.tex_adj_grd, tex_grd_tmp, sizeof(tex_grd_tmp));
360*437bfbebSnyanmisaka     memcpy(p_api_params->param.sharp.tex_adj_val, tex_val_tmp, sizeof(tex_val_tmp));
361*437bfbebSnyanmisaka }
362*437bfbebSnyanmisaka 
vdpp_set_user_cfg(vdpp_com_ctx * vdpp,vdpp_params * p_vdpp_params,RK_U32 cfg_update_flag)363*437bfbebSnyanmisaka static RK_S32 vdpp_set_user_cfg(vdpp_com_ctx* vdpp, vdpp_params* p_vdpp_params,
364*437bfbebSnyanmisaka                                 RK_U32 cfg_update_flag)
365*437bfbebSnyanmisaka {
366*437bfbebSnyanmisaka     struct vdpp_api_params params;
367*437bfbebSnyanmisaka     RK_S32 ret = MPP_OK;
368*437bfbebSnyanmisaka 
369*437bfbebSnyanmisaka     if (cfg_update_flag == 0) {
370*437bfbebSnyanmisaka         hwpq_vdpp_info("vdpp config not changed\n");
371*437bfbebSnyanmisaka         return ret;
372*437bfbebSnyanmisaka     }
373*437bfbebSnyanmisaka 
374*437bfbebSnyanmisaka     hwpq_vdpp_info("update vdpp config\n");
375*437bfbebSnyanmisaka 
376*437bfbebSnyanmisaka     set_dmsr_default_config(&params);
377*437bfbebSnyanmisaka     params.param.dmsr.enable    = p_vdpp_params->dmsr_en;
378*437bfbebSnyanmisaka     params.param.dmsr.str_pri_y = p_vdpp_params->str_pri_y;
379*437bfbebSnyanmisaka     params.param.dmsr.str_sec_y = p_vdpp_params->str_sec_y;
380*437bfbebSnyanmisaka     params.param.dmsr.dumping_y = p_vdpp_params->dumping_y;
381*437bfbebSnyanmisaka     ret |= vdpp->ops->control(vdpp->priv, VDPP_CMD_SET_DMSR_CFG, &params);
382*437bfbebSnyanmisaka 
383*437bfbebSnyanmisaka     set_es_default_config(&params);
384*437bfbebSnyanmisaka     params.param.es.es_bEnabledES   = p_vdpp_params->es_en;
385*437bfbebSnyanmisaka     params.param.es.es_iWgtGain     = p_vdpp_params->es_iWgtGain;
386*437bfbebSnyanmisaka     ret |= vdpp->ops->control(vdpp->priv, VDPP_CMD_SET_ES, &params);
387*437bfbebSnyanmisaka 
388*437bfbebSnyanmisaka     set_hist_cnt_default_config(&params);
389*437bfbebSnyanmisaka     params.param.hist.hist_cnt_en   = p_vdpp_params->hist_cnt_en;
390*437bfbebSnyanmisaka     params.param.hist.dci_csc_range = p_vdpp_params->hist_csc_range;
391*437bfbebSnyanmisaka     ret |= vdpp->ops->control(vdpp->priv, VDPP_CMD_SET_DCI_HIST, &params);
392*437bfbebSnyanmisaka 
393*437bfbebSnyanmisaka     set_shp_default_config(&params);
394*437bfbebSnyanmisaka     params.param.sharp.sharp_enable                     = p_vdpp_params->shp_en;
395*437bfbebSnyanmisaka     params.param.sharp.peaking_gain                     = p_vdpp_params->peaking_gain;
396*437bfbebSnyanmisaka     params.param.sharp.shootctrl_enable                 = p_vdpp_params->shp_shoot_ctrl_en;
397*437bfbebSnyanmisaka     params.param.sharp.shootctrl_alpha_over             = p_vdpp_params->shp_shoot_ctrl_over;
398*437bfbebSnyanmisaka     params.param.sharp.shootctrl_alpha_over_unlimit     = p_vdpp_params->shp_shoot_ctrl_over;
399*437bfbebSnyanmisaka     params.param.sharp.shootctrl_alpha_under            = p_vdpp_params->shp_shoot_ctrl_under;
400*437bfbebSnyanmisaka     params.param.sharp.shootctrl_alpha_under_unlimit    = p_vdpp_params->shp_shoot_ctrl_under;
401*437bfbebSnyanmisaka     ret |= vdpp->ops->control(vdpp->priv, VDPP_CMD_SET_SHARP, &params);
402*437bfbebSnyanmisaka 
403*437bfbebSnyanmisaka     return ret;
404*437bfbebSnyanmisaka }
405*437bfbebSnyanmisaka 
vdpp_set_img(vdpp_com_ctx * ctx,RK_S32 fd_yrgb,RK_S32 fd_cbcr,RK_S32 cbcr_offset,VdppCmd cmd)406*437bfbebSnyanmisaka static MPP_RET vdpp_set_img(vdpp_com_ctx *ctx, RK_S32 fd_yrgb, RK_S32 fd_cbcr,
407*437bfbebSnyanmisaka                             RK_S32 cbcr_offset, VdppCmd cmd)
408*437bfbebSnyanmisaka {
409*437bfbebSnyanmisaka     VdppImg img;
410*437bfbebSnyanmisaka 
411*437bfbebSnyanmisaka     hwpq_vdpp_info("yrgb_fd=%d, cbcr_fd=%d, cbcr_offset=%d\n", fd_yrgb, fd_cbcr, cbcr_offset);
412*437bfbebSnyanmisaka     img.mem_addr = fd_yrgb;
413*437bfbebSnyanmisaka     img.uv_addr = fd_cbcr;
414*437bfbebSnyanmisaka     img.uv_off = cbcr_offset;
415*437bfbebSnyanmisaka 
416*437bfbebSnyanmisaka     return ctx->ops->control(ctx->priv, cmd, &img);
417*437bfbebSnyanmisaka }
418*437bfbebSnyanmisaka 
vdpp_map_buffer_with_fd(int fd,size_t bufSize)419*437bfbebSnyanmisaka static void* vdpp_map_buffer_with_fd(int fd, size_t bufSize)
420*437bfbebSnyanmisaka {
421*437bfbebSnyanmisaka     void* ptr = NULL;
422*437bfbebSnyanmisaka 
423*437bfbebSnyanmisaka     if (fd > 0) {
424*437bfbebSnyanmisaka         ptr = mmap(NULL, bufSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
425*437bfbebSnyanmisaka         if (ptr == MAP_FAILED) {
426*437bfbebSnyanmisaka             mpp_err_f("failed to mmap buffer, fd=%d, size=%zu\n", fd, bufSize);
427*437bfbebSnyanmisaka             return NULL;
428*437bfbebSnyanmisaka         }
429*437bfbebSnyanmisaka     } else {
430*437bfbebSnyanmisaka         mpp_err_f("failed to mmap buffer with fd! invalid fd value %d input!\n", fd);
431*437bfbebSnyanmisaka     }
432*437bfbebSnyanmisaka 
433*437bfbebSnyanmisaka     return ptr;
434*437bfbebSnyanmisaka }
435*437bfbebSnyanmisaka 
vdpp_unmap_buffer(void * ptr,size_t bufSize)436*437bfbebSnyanmisaka static inline void vdpp_unmap_buffer(void* ptr, size_t bufSize)
437*437bfbebSnyanmisaka {
438*437bfbebSnyanmisaka     if (ptr) {
439*437bfbebSnyanmisaka         munmap(ptr, bufSize);
440*437bfbebSnyanmisaka     }
441*437bfbebSnyanmisaka }
442*437bfbebSnyanmisaka 
try_env_file(const char * env,const char * path,pid_t tid,int index)443*437bfbebSnyanmisaka static FILE *try_env_file(const char *env, const char *path, pid_t tid, int index)
444*437bfbebSnyanmisaka {
445*437bfbebSnyanmisaka     const char *fname = NULL;
446*437bfbebSnyanmisaka     FILE *fp = NULL;
447*437bfbebSnyanmisaka     char name[HWPQ_VDPP_MAX_FILE_NAME_LEN];
448*437bfbebSnyanmisaka 
449*437bfbebSnyanmisaka     mpp_env_get_str(env, &fname, path);
450*437bfbebSnyanmisaka     if (fname == path) {
451*437bfbebSnyanmisaka         snprintf(name, sizeof(name) - 1, "%s_%03d-%d", path, index, tid);
452*437bfbebSnyanmisaka         fname = name;
453*437bfbebSnyanmisaka     }
454*437bfbebSnyanmisaka 
455*437bfbebSnyanmisaka     fp = fopen(fname, "w+b");
456*437bfbebSnyanmisaka     hwpq_vdpp_info("open %s %p for dump\n", fname, fp);
457*437bfbebSnyanmisaka 
458*437bfbebSnyanmisaka     return fp;
459*437bfbebSnyanmisaka }
460*437bfbebSnyanmisaka 
vdpp_dump(rk_vdpp_proc_params * p_proc_param,int index)461*437bfbebSnyanmisaka static void vdpp_dump(rk_vdpp_proc_params *p_proc_param, int index)
462*437bfbebSnyanmisaka {
463*437bfbebSnyanmisaka     FILE *fp_in = NULL;
464*437bfbebSnyanmisaka     FILE *fp_out = NULL;
465*437bfbebSnyanmisaka     pid_t tid = syscall(SYS_gettid);
466*437bfbebSnyanmisaka 
467*437bfbebSnyanmisaka     if (NULL == p_proc_param) {
468*437bfbebSnyanmisaka         mpp_err_f("found NULL proc_param %p\n", p_proc_param);
469*437bfbebSnyanmisaka         return;
470*437bfbebSnyanmisaka     }
471*437bfbebSnyanmisaka 
472*437bfbebSnyanmisaka     if (hwpq_vdpp_debug & HWPQ_VDPP_DUMP_IN) {
473*437bfbebSnyanmisaka         fp_in = try_env_file("hwpq_vdpp_dump_in", hwpq_vdpp_in_path, tid, index);
474*437bfbebSnyanmisaka         if (NULL == fp_in) {
475*437bfbebSnyanmisaka             mpp_err_f("failed to open file %p\n", fp_in);
476*437bfbebSnyanmisaka         } else {
477*437bfbebSnyanmisaka             int fd = p_proc_param->src_img_info.img_yrgb.fd;
478*437bfbebSnyanmisaka             RK_U32 src_y_buf_len = p_proc_param->src_img_info.img_yrgb.w_vir *
479*437bfbebSnyanmisaka                                    p_proc_param->src_img_info.img_yrgb.h_vir;
480*437bfbebSnyanmisaka             RK_U8 *ptr = (RK_U8*)vdpp_map_buffer_with_fd(fd, src_y_buf_len);
481*437bfbebSnyanmisaka 
482*437bfbebSnyanmisaka             if (ptr == NULL) {
483*437bfbebSnyanmisaka                 mpp_err_f("vdpp dump fd(%d) map error!\n", fd);
484*437bfbebSnyanmisaka             } else {
485*437bfbebSnyanmisaka                 fwrite(ptr, 1, src_y_buf_len, fp_in);
486*437bfbebSnyanmisaka                 fclose(fp_in);
487*437bfbebSnyanmisaka             }
488*437bfbebSnyanmisaka 
489*437bfbebSnyanmisaka             vdpp_unmap_buffer(ptr, src_y_buf_len);
490*437bfbebSnyanmisaka         }
491*437bfbebSnyanmisaka     }
492*437bfbebSnyanmisaka 
493*437bfbebSnyanmisaka     if (hwpq_vdpp_debug & HWPQ_VDPP_DUMP_OUT) {
494*437bfbebSnyanmisaka         fp_out = try_env_file("hwpq_vdpp_dump_out", hwpq_vdpp_out_path, tid, index);
495*437bfbebSnyanmisaka         if (NULL == fp_out) {
496*437bfbebSnyanmisaka             mpp_err_f("failed to open file %p\n", fp_out);
497*437bfbebSnyanmisaka         } else {
498*437bfbebSnyanmisaka             int fd = p_proc_param->src_img_info.img_yrgb.fd;
499*437bfbebSnyanmisaka             RK_U32 dst_y_buf_len = p_proc_param->dst_img_info.img_yrgb.w_vir *
500*437bfbebSnyanmisaka                                    p_proc_param->dst_img_info.img_yrgb.h_vir;
501*437bfbebSnyanmisaka             RK_U8 *ptr = (RK_U8*)vdpp_map_buffer_with_fd(fd, dst_y_buf_len);
502*437bfbebSnyanmisaka 
503*437bfbebSnyanmisaka             if (ptr == NULL) {
504*437bfbebSnyanmisaka                 mpp_err_f("vdpp dump fd(%d) map error!\n", fd);
505*437bfbebSnyanmisaka             } else {
506*437bfbebSnyanmisaka                 fwrite(ptr, 1, dst_y_buf_len, fp_out);
507*437bfbebSnyanmisaka                 fclose(fp_out);
508*437bfbebSnyanmisaka             }
509*437bfbebSnyanmisaka 
510*437bfbebSnyanmisaka             vdpp_unmap_buffer(ptr, dst_y_buf_len);
511*437bfbebSnyanmisaka         }
512*437bfbebSnyanmisaka     }
513*437bfbebSnyanmisaka 
514*437bfbebSnyanmisaka     MPP_FCLOSE(fp_in);
515*437bfbebSnyanmisaka     MPP_FCLOSE(fp_out);
516*437bfbebSnyanmisaka }
517*437bfbebSnyanmisaka 
img_format_convert(vdpp_frame_format img_fmt_in)518*437bfbebSnyanmisaka static MppFrameFormat img_format_convert(vdpp_frame_format img_fmt_in)
519*437bfbebSnyanmisaka {
520*437bfbebSnyanmisaka     MppFrameFormat img_fmt_out = MPP_FMT_YUV420SP;
521*437bfbebSnyanmisaka 
522*437bfbebSnyanmisaka     switch (img_fmt_in) {
523*437bfbebSnyanmisaka     case VDPP_FMT_NV24:
524*437bfbebSnyanmisaka         img_fmt_out = MPP_FMT_YUV444SP;
525*437bfbebSnyanmisaka         break;
526*437bfbebSnyanmisaka     case VDPP_FMT_NV16:
527*437bfbebSnyanmisaka         img_fmt_out = MPP_FMT_YUV422SP;
528*437bfbebSnyanmisaka         break;
529*437bfbebSnyanmisaka     case VDPP_FMT_NV12:
530*437bfbebSnyanmisaka         img_fmt_out = MPP_FMT_YUV420SP;
531*437bfbebSnyanmisaka         break;
532*437bfbebSnyanmisaka     case VDPP_FMT_NV15:
533*437bfbebSnyanmisaka         img_fmt_out = MPP_FMT_YUV420SP_10BIT;
534*437bfbebSnyanmisaka         break;
535*437bfbebSnyanmisaka     case VDPP_FMT_NV20:
536*437bfbebSnyanmisaka         img_fmt_out = MPP_FMT_YUV420SP_10BIT;
537*437bfbebSnyanmisaka         break;
538*437bfbebSnyanmisaka     case VDPP_FMT_NV30:
539*437bfbebSnyanmisaka         img_fmt_out = MPP_FMT_YUV420SP_10BIT;
540*437bfbebSnyanmisaka         break;
541*437bfbebSnyanmisaka 
542*437bfbebSnyanmisaka     case VDPP_FMT_RGBA:
543*437bfbebSnyanmisaka         img_fmt_out = MPP_FMT_RGBA8888;
544*437bfbebSnyanmisaka         break;
545*437bfbebSnyanmisaka     case VDPP_FMT_RG24:
546*437bfbebSnyanmisaka         img_fmt_out = MPP_FMT_RGB888;
547*437bfbebSnyanmisaka         break;
548*437bfbebSnyanmisaka     case VDPP_FMT_BG24:
549*437bfbebSnyanmisaka         img_fmt_out = MPP_FMT_BGR888;
550*437bfbebSnyanmisaka         break;
551*437bfbebSnyanmisaka 
552*437bfbebSnyanmisaka     default:
553*437bfbebSnyanmisaka         mpp_err_f("unsupport input format(%x), set NV12!", img_fmt_in);
554*437bfbebSnyanmisaka         break;
555*437bfbebSnyanmisaka     }
556*437bfbebSnyanmisaka 
557*437bfbebSnyanmisaka     return img_fmt_out;
558*437bfbebSnyanmisaka }
559*437bfbebSnyanmisaka 
get_img_format_swap(vdpp_frame_format img_fmt_in)560*437bfbebSnyanmisaka static enum VDPP_YUV_SWAP get_img_format_swap(vdpp_frame_format img_fmt_in)
561*437bfbebSnyanmisaka {
562*437bfbebSnyanmisaka     enum VDPP_YUV_SWAP img_fmt_swap = VDPP_YUV_SWAP_SP_UV;
563*437bfbebSnyanmisaka 
564*437bfbebSnyanmisaka     switch (img_fmt_in) {
565*437bfbebSnyanmisaka     case VDPP_FMT_NV24_VU:
566*437bfbebSnyanmisaka     case VDPP_FMT_NV16_VU:
567*437bfbebSnyanmisaka     case VDPP_FMT_NV12_VU:
568*437bfbebSnyanmisaka         img_fmt_swap = VDPP_YUV_SWAP_SP_VU;
569*437bfbebSnyanmisaka         break;
570*437bfbebSnyanmisaka 
571*437bfbebSnyanmisaka     default:
572*437bfbebSnyanmisaka         img_fmt_swap = VDPP_YUV_SWAP_SP_UV;
573*437bfbebSnyanmisaka         break;
574*437bfbebSnyanmisaka     }
575*437bfbebSnyanmisaka 
576*437bfbebSnyanmisaka     return img_fmt_swap;
577*437bfbebSnyanmisaka }
578*437bfbebSnyanmisaka 
hwpq_vdpp_deinit(rk_vdpp_context ctx)579*437bfbebSnyanmisaka int hwpq_vdpp_deinit(rk_vdpp_context ctx)
580*437bfbebSnyanmisaka {
581*437bfbebSnyanmisaka     VdppCtxImpl *p = (VdppCtxImpl*)ctx;
582*437bfbebSnyanmisaka     vdpp_com_ctx* vdpp = NULL;
583*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
584*437bfbebSnyanmisaka 
585*437bfbebSnyanmisaka     hwpq_vdpp_enter();
586*437bfbebSnyanmisaka 
587*437bfbebSnyanmisaka     if (NULL == ctx) {
588*437bfbebSnyanmisaka         mpp_err_f("found NULL input ctx %p\n", ctx);
589*437bfbebSnyanmisaka         ret = MPP_ERR_NULL_PTR;
590*437bfbebSnyanmisaka         goto __RET;
591*437bfbebSnyanmisaka     }
592*437bfbebSnyanmisaka 
593*437bfbebSnyanmisaka     vdpp = p->vdpp;
594*437bfbebSnyanmisaka     if (NULL == vdpp || NULL == vdpp->ops) {
595*437bfbebSnyanmisaka         mpp_err_f("found NULL vdpp\n");
596*437bfbebSnyanmisaka         ret = MPP_ERR_NULL_PTR;
597*437bfbebSnyanmisaka         goto __RET;
598*437bfbebSnyanmisaka     }
599*437bfbebSnyanmisaka 
600*437bfbebSnyanmisaka     if (vdpp->ops->deinit) {
601*437bfbebSnyanmisaka         ret = vdpp->ops->deinit(vdpp->priv);
602*437bfbebSnyanmisaka         if (ret) {
603*437bfbebSnyanmisaka             mpp_err_f("vdpp deinit failed! ret %d\n", ret);
604*437bfbebSnyanmisaka         }
605*437bfbebSnyanmisaka     }
606*437bfbebSnyanmisaka 
607*437bfbebSnyanmisaka     if (p->histbuf) {
608*437bfbebSnyanmisaka         mpp_buffer_put(p->histbuf);
609*437bfbebSnyanmisaka         p->histbuf = NULL;
610*437bfbebSnyanmisaka     }
611*437bfbebSnyanmisaka 
612*437bfbebSnyanmisaka     if (p->memGroup) {
613*437bfbebSnyanmisaka         mpp_buffer_group_put(p->memGroup);
614*437bfbebSnyanmisaka         p->memGroup = NULL;
615*437bfbebSnyanmisaka     }
616*437bfbebSnyanmisaka 
617*437bfbebSnyanmisaka     rockchip_vdpp_api_release_ctx(vdpp);
618*437bfbebSnyanmisaka     MPP_FREE(p);
619*437bfbebSnyanmisaka     hwpq_vdpp_leave();
620*437bfbebSnyanmisaka 
621*437bfbebSnyanmisaka __RET:
622*437bfbebSnyanmisaka     return ret;
623*437bfbebSnyanmisaka }
624*437bfbebSnyanmisaka 
hwpq_vdpp_init(rk_vdpp_context * p_ctx_ptr)625*437bfbebSnyanmisaka int hwpq_vdpp_init(rk_vdpp_context *p_ctx_ptr)
626*437bfbebSnyanmisaka {
627*437bfbebSnyanmisaka     VdppCtxImpl *p = NULL;
628*437bfbebSnyanmisaka     vdpp_com_ctx *vdpp = NULL;
629*437bfbebSnyanmisaka     MppBufferGroup memGroup = NULL;
630*437bfbebSnyanmisaka     MppBuffer histbuf = NULL;
631*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
632*437bfbebSnyanmisaka 
633*437bfbebSnyanmisaka     hwpq_vdpp_enter();
634*437bfbebSnyanmisaka 
635*437bfbebSnyanmisaka     if (NULL == p_ctx_ptr) {
636*437bfbebSnyanmisaka         mpp_err("found NULL vdpp ctx pointer\n");
637*437bfbebSnyanmisaka         ret = MPP_ERR_NULL_PTR;
638*437bfbebSnyanmisaka         goto __ERR;
639*437bfbebSnyanmisaka     }
640*437bfbebSnyanmisaka     /* alloc vdpp ctx impl */
641*437bfbebSnyanmisaka     p = mpp_malloc(VdppCtxImpl, 1);
642*437bfbebSnyanmisaka     if (NULL == p) {
643*437bfbebSnyanmisaka         mpp_err("alloc vdpp ctx failed!");
644*437bfbebSnyanmisaka         ret = MPP_ERR_MALLOC;
645*437bfbebSnyanmisaka         goto __ERR;
646*437bfbebSnyanmisaka     }
647*437bfbebSnyanmisaka     /* alloc vdpp */
648*437bfbebSnyanmisaka     vdpp = rockchip_vdpp_api_alloc_ctx();
649*437bfbebSnyanmisaka     if (NULL == vdpp || NULL == vdpp->ops) {
650*437bfbebSnyanmisaka         mpp_err("alloc vdpp ctx failed!");
651*437bfbebSnyanmisaka         ret = MPP_ERR_MALLOC;
652*437bfbebSnyanmisaka         goto __ERR;
653*437bfbebSnyanmisaka     }
654*437bfbebSnyanmisaka     /* alloc buffer group */
655*437bfbebSnyanmisaka     ret = mpp_buffer_group_get_internal(&memGroup, MPP_BUFFER_TYPE_DRM);
656*437bfbebSnyanmisaka     if (ret) {
657*437bfbebSnyanmisaka         mpp_err("memGroup mpp_buffer_group_get failed\n");
658*437bfbebSnyanmisaka         ret = MPP_NOK;
659*437bfbebSnyanmisaka         goto __ERR;
660*437bfbebSnyanmisaka     }
661*437bfbebSnyanmisaka 
662*437bfbebSnyanmisaka     mpp_buffer_get(memGroup, &histbuf, VDPP_HIST_LENGTH);
663*437bfbebSnyanmisaka     if (ret) {
664*437bfbebSnyanmisaka         mpp_err("alloc histbuf failed\n");
665*437bfbebSnyanmisaka         ret = MPP_NOK;
666*437bfbebSnyanmisaka         goto __ERR;
667*437bfbebSnyanmisaka     }
668*437bfbebSnyanmisaka 
669*437bfbebSnyanmisaka     /* setup env prop */
670*437bfbebSnyanmisaka     mpp_env_get_u32(HWPQ_VDPP_DEBUG_CFG_PROP, &hwpq_vdpp_debug, 0);
671*437bfbebSnyanmisaka 
672*437bfbebSnyanmisaka     if (vdpp->ops->init) {
673*437bfbebSnyanmisaka         ret = vdpp->ops->init(&vdpp->priv);
674*437bfbebSnyanmisaka         if (ret) {
675*437bfbebSnyanmisaka             mpp_err_f("vdpp init failed! ret %d\n", ret);
676*437bfbebSnyanmisaka             goto __ERR;
677*437bfbebSnyanmisaka         }
678*437bfbebSnyanmisaka     }
679*437bfbebSnyanmisaka 
680*437bfbebSnyanmisaka     p->vdpp = vdpp;
681*437bfbebSnyanmisaka     p->memGroup = memGroup;
682*437bfbebSnyanmisaka     p->histbuf = histbuf;
683*437bfbebSnyanmisaka     *p_ctx_ptr = (rk_vdpp_context)p;
684*437bfbebSnyanmisaka 
685*437bfbebSnyanmisaka     hwpq_vdpp_leave();
686*437bfbebSnyanmisaka     return ret;
687*437bfbebSnyanmisaka 
688*437bfbebSnyanmisaka __ERR:
689*437bfbebSnyanmisaka     if (histbuf) {
690*437bfbebSnyanmisaka         mpp_buffer_put(histbuf);
691*437bfbebSnyanmisaka         histbuf = NULL;
692*437bfbebSnyanmisaka     }
693*437bfbebSnyanmisaka 
694*437bfbebSnyanmisaka     if (memGroup) {
695*437bfbebSnyanmisaka         mpp_buffer_group_put(memGroup);
696*437bfbebSnyanmisaka         memGroup = NULL;
697*437bfbebSnyanmisaka     }
698*437bfbebSnyanmisaka 
699*437bfbebSnyanmisaka     rockchip_vdpp_api_release_ctx(vdpp);
700*437bfbebSnyanmisaka     MPP_FREE(p);
701*437bfbebSnyanmisaka 
702*437bfbebSnyanmisaka     return ret;
703*437bfbebSnyanmisaka }
704*437bfbebSnyanmisaka 
hwpq_vdpp_common_config(vdpp_com_ctx * vdpp,rk_vdpp_proc_params * p_proc_param)705*437bfbebSnyanmisaka static MPP_RET hwpq_vdpp_common_config(vdpp_com_ctx *vdpp, rk_vdpp_proc_params *p_proc_param)
706*437bfbebSnyanmisaka {
707*437bfbebSnyanmisaka     struct vdpp_api_params params;
708*437bfbebSnyanmisaka     RK_U32 is_vdpp2 = (mpp_get_soc_type() == ROCKCHIP_SOC_RK3576);
709*437bfbebSnyanmisaka     RK_U32 yuv_out_diff;
710*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
711*437bfbebSnyanmisaka 
712*437bfbebSnyanmisaka     yuv_out_diff = (p_proc_param->yuv_diff_flag && is_vdpp2);
713*437bfbebSnyanmisaka     hwpq_vdpp_info("is_vdpp2: %d, yuv_diff: %d\n", is_vdpp2, yuv_out_diff);
714*437bfbebSnyanmisaka 
715*437bfbebSnyanmisaka     if (is_vdpp2) {
716*437bfbebSnyanmisaka         RK_U32 hist_mode_en = p_proc_param->hist_mode_en;
717*437bfbebSnyanmisaka 
718*437bfbebSnyanmisaka         params.ptype = VDPP_PARAM_TYPE_COM2;
719*437bfbebSnyanmisaka         memset(&params.param, 0, sizeof(union vdpp_api_content));
720*437bfbebSnyanmisaka         params.param.com2.sfmt = img_format_convert(p_proc_param->src_img_info.img_fmt);
721*437bfbebSnyanmisaka         params.param.com2.src_width = p_proc_param->src_img_info.img_yrgb.w_vld;
722*437bfbebSnyanmisaka         params.param.com2.src_height = p_proc_param->src_img_info.img_yrgb.h_vld;
723*437bfbebSnyanmisaka         params.param.com2.src_width_vir = p_proc_param->src_img_info.img_yrgb.w_vir;
724*437bfbebSnyanmisaka         params.param.com2.src_height_vir = p_proc_param->src_img_info.img_yrgb.h_vir;
725*437bfbebSnyanmisaka         params.param.com2.sswap = get_img_format_swap(p_proc_param->src_img_info.img_fmt);
726*437bfbebSnyanmisaka         params.param.com2.dfmt = VDPP_FMT_YUV444; // TODO
727*437bfbebSnyanmisaka         params.param.com2.dst_width = p_proc_param->dst_img_info.img_yrgb.w_vld;
728*437bfbebSnyanmisaka         params.param.com2.dst_height = p_proc_param->dst_img_info.img_yrgb.h_vld;
729*437bfbebSnyanmisaka         params.param.com2.dst_width_vir = p_proc_param->dst_img_info.img_yrgb.w_vir;
730*437bfbebSnyanmisaka         params.param.com2.dst_height_vir = p_proc_param->dst_img_info.img_yrgb.h_vir;
731*437bfbebSnyanmisaka         if (yuv_out_diff) {
732*437bfbebSnyanmisaka             params.param.com2.yuv_out_diff = yuv_out_diff;
733*437bfbebSnyanmisaka             params.param.com2.dst_c_width = p_proc_param->dst_img_info.img_cbcr.w_vld;
734*437bfbebSnyanmisaka             params.param.com2.dst_c_height = p_proc_param->dst_img_info.img_cbcr.h_vld;
735*437bfbebSnyanmisaka             params.param.com2.dst_c_width_vir = p_proc_param->dst_img_info.img_cbcr.w_vir;
736*437bfbebSnyanmisaka             params.param.com2.dst_c_height_vir = p_proc_param->dst_img_info.img_cbcr.h_vir;
737*437bfbebSnyanmisaka         }
738*437bfbebSnyanmisaka         params.param.com2.dswap = get_img_format_swap(p_proc_param->dst_img_info.img_fmt);
739*437bfbebSnyanmisaka         params.param.com2.hist_mode_en = hist_mode_en;
740*437bfbebSnyanmisaka         hwpq_vdpp_info("hist_mode: %d\n", params.param.com2.hist_mode_en);
741*437bfbebSnyanmisaka         hwpq_vdpp_info("src-fmt: %d\n", p_proc_param->src_img_info.img_fmt);
742*437bfbebSnyanmisaka         hwpq_vdpp_info("dst-fmt: %d\n", p_proc_param->dst_img_info.img_fmt);
743*437bfbebSnyanmisaka         hwpq_vdpp_info("src-res: %d-%d  %d-%d\n", params.param.com2.src_width, params.param.com2.src_height,
744*437bfbebSnyanmisaka                        params.param.com2.src_width_vir, params.param.com2.src_height_vir);
745*437bfbebSnyanmisaka         hwpq_vdpp_info("dst-res: %d-%d  %d-%d\n", params.param.com2.dst_width, params.param.com2.dst_height,
746*437bfbebSnyanmisaka                        params.param.com2.dst_width_vir, params.param.com2.dst_height_vir);
747*437bfbebSnyanmisaka         ret = vdpp->ops->control(vdpp->priv, VDPP_CMD_SET_COM2_CFG, &params);
748*437bfbebSnyanmisaka     } else {
749*437bfbebSnyanmisaka         params.ptype = VDPP_PARAM_TYPE_COM;
750*437bfbebSnyanmisaka         memset(&params.param, 0, sizeof(union vdpp_api_content));
751*437bfbebSnyanmisaka         params.param.com.src_width = p_proc_param->src_img_info.img_yrgb.w_vld;
752*437bfbebSnyanmisaka         params.param.com.src_height = p_proc_param->src_img_info.img_yrgb.h_vld;
753*437bfbebSnyanmisaka         params.param.com.sswap = get_img_format_swap(p_proc_param->src_img_info.img_fmt);
754*437bfbebSnyanmisaka         params.param.com.dfmt = VDPP_FMT_YUV444; // TODO
755*437bfbebSnyanmisaka         params.param.com.dst_width = p_proc_param->dst_img_info.img_yrgb.w_vld;
756*437bfbebSnyanmisaka         params.param.com.dst_height = p_proc_param->dst_img_info.img_yrgb.h_vld;
757*437bfbebSnyanmisaka         params.param.com.dswap = get_img_format_swap(p_proc_param->dst_img_info.img_fmt);
758*437bfbebSnyanmisaka         ret = vdpp->ops->control(vdpp->priv, VDPP_CMD_SET_COM_CFG, &params);
759*437bfbebSnyanmisaka     }
760*437bfbebSnyanmisaka 
761*437bfbebSnyanmisaka     return ret;
762*437bfbebSnyanmisaka }
763*437bfbebSnyanmisaka 
hwpq_vdpp_proc(rk_vdpp_context ctx,rk_vdpp_proc_params * p_proc_param)764*437bfbebSnyanmisaka int hwpq_vdpp_proc(rk_vdpp_context ctx, rk_vdpp_proc_params *p_proc_param)
765*437bfbebSnyanmisaka {
766*437bfbebSnyanmisaka     VdppCtxImpl *p = (VdppCtxImpl*)ctx;
767*437bfbebSnyanmisaka     vdpp_com_ctx* vdpp = NULL;
768*437bfbebSnyanmisaka     RK_U32 is_vdpp2 = (mpp_get_soc_type() == ROCKCHIP_SOC_RK3576);
769*437bfbebSnyanmisaka     MppBuffer histbuf = NULL;
770*437bfbebSnyanmisaka     MppBufferGroup memGroup = NULL;
771*437bfbebSnyanmisaka     RK_S32 ret = MPP_OK;
772*437bfbebSnyanmisaka     void* phist;
773*437bfbebSnyanmisaka     RK_S32 fdhist;
774*437bfbebSnyanmisaka     static int frame_idx = 0;
775*437bfbebSnyanmisaka 
776*437bfbebSnyanmisaka     hwpq_vdpp_enter();
777*437bfbebSnyanmisaka 
778*437bfbebSnyanmisaka     if (NULL == ctx || NULL == p_proc_param) {
779*437bfbebSnyanmisaka         mpp_err_f("found NULL input ctx %p proc_param %p\n", ctx, p_proc_param);
780*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
781*437bfbebSnyanmisaka     }
782*437bfbebSnyanmisaka 
783*437bfbebSnyanmisaka     vdpp = p->vdpp;
784*437bfbebSnyanmisaka     if (NULL == vdpp || NULL == vdpp->ops || NULL == vdpp->ops->control) {
785*437bfbebSnyanmisaka         mpp_err_f("found NULL vdpp or vdpp ops\n");
786*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
787*437bfbebSnyanmisaka     }
788*437bfbebSnyanmisaka 
789*437bfbebSnyanmisaka     memGroup = p->memGroup;
790*437bfbebSnyanmisaka     histbuf = p->histbuf;
791*437bfbebSnyanmisaka     if (NULL == memGroup || NULL == histbuf) {
792*437bfbebSnyanmisaka         mpp_err_f("found NULL memGroup %p or histbuf %p\n", memGroup, histbuf);
793*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
794*437bfbebSnyanmisaka     }
795*437bfbebSnyanmisaka 
796*437bfbebSnyanmisaka     mpp_env_get_u32(HWPQ_VDPP_DEBUG_CFG_PROP, &hwpq_vdpp_debug, 0);
797*437bfbebSnyanmisaka 
798*437bfbebSnyanmisaka     hwpq_vdpp_info("proc frame_idx %d\n", p_proc_param->frame_idx);
799*437bfbebSnyanmisaka 
800*437bfbebSnyanmisaka     hwpq_vdpp_info("begin set image info\n");
801*437bfbebSnyanmisaka     hwpq_vdpp_info("set src img_info\n");
802*437bfbebSnyanmisaka     ret |= vdpp_set_img(vdpp, p_proc_param->src_img_info.img_yrgb.fd, p_proc_param->src_img_info.img_cbcr.fd,
803*437bfbebSnyanmisaka                         p_proc_param->src_img_info.img_cbcr.offset, VDPP_CMD_SET_SRC);
804*437bfbebSnyanmisaka     hwpq_vdpp_info("set dst img_info\n");
805*437bfbebSnyanmisaka     ret |= vdpp_set_img(vdpp, p_proc_param->dst_img_info.img_yrgb.fd, p_proc_param->dst_img_info.img_cbcr.fd,
806*437bfbebSnyanmisaka                         p_proc_param->dst_img_info.img_cbcr.offset, VDPP_CMD_SET_DST);
807*437bfbebSnyanmisaka     ret |= vdpp_set_img(vdpp, p_proc_param->dst_img_info.img_yrgb.fd, p_proc_param->dst_img_info.img_cbcr.fd,
808*437bfbebSnyanmisaka                         p_proc_param->dst_img_info.img_cbcr.offset, VDPP_CMD_SET_DST_C);
809*437bfbebSnyanmisaka 
810*437bfbebSnyanmisaka     ret |= hwpq_vdpp_common_config(vdpp, p_proc_param);
811*437bfbebSnyanmisaka     if (ret) {
812*437bfbebSnyanmisaka         mpp_err("vdpp common config failed\n");
813*437bfbebSnyanmisaka         return MPP_NOK;
814*437bfbebSnyanmisaka     }
815*437bfbebSnyanmisaka 
816*437bfbebSnyanmisaka     /* set params */
817*437bfbebSnyanmisaka     if (vdpp_set_user_cfg(vdpp, &p_proc_param->vdpp_config, p_proc_param->vdpp_config_update_flag))
818*437bfbebSnyanmisaka         mpp_err_f("warning: set user cfg failed");
819*437bfbebSnyanmisaka 
820*437bfbebSnyanmisaka     phist   = mpp_buffer_get_ptr(histbuf);
821*437bfbebSnyanmisaka     fdhist  = mpp_buffer_get_fd(histbuf);
822*437bfbebSnyanmisaka 
823*437bfbebSnyanmisaka     if (is_vdpp2) {
824*437bfbebSnyanmisaka         ret = vdpp->ops->control(vdpp->priv, VDPP_CMD_SET_HIST_FD, &fdhist);
825*437bfbebSnyanmisaka         if (ret) {
826*437bfbebSnyanmisaka             mpp_err("set hist fd failed\n");
827*437bfbebSnyanmisaka             return MPP_NOK;
828*437bfbebSnyanmisaka         }
829*437bfbebSnyanmisaka     }
830*437bfbebSnyanmisaka 
831*437bfbebSnyanmisaka     ret = vdpp->ops->control(vdpp->priv, VDPP_CMD_RUN_SYNC, NULL);
832*437bfbebSnyanmisaka     if (ret) {
833*437bfbebSnyanmisaka         mpp_err("run vdpp failed\n");
834*437bfbebSnyanmisaka         return MPP_NOK;
835*437bfbebSnyanmisaka     }
836*437bfbebSnyanmisaka 
837*437bfbebSnyanmisaka     vdpp_dump(p_proc_param, frame_idx);
838*437bfbebSnyanmisaka 
839*437bfbebSnyanmisaka     frame_idx++;
840*437bfbebSnyanmisaka 
841*437bfbebSnyanmisaka     if (is_vdpp2) {
842*437bfbebSnyanmisaka         memcpy(p_proc_param->p_hist_buf, phist, VDPP_HIST_LENGTH);
843*437bfbebSnyanmisaka     }
844*437bfbebSnyanmisaka 
845*437bfbebSnyanmisaka     p_proc_param->dci_vdpp_info.p_hist_addr     = p_proc_param->p_hist_buf;
846*437bfbebSnyanmisaka     p_proc_param->dci_vdpp_info.hist_length     = VDPP_HIST_LENGTH;
847*437bfbebSnyanmisaka     p_proc_param->dci_vdpp_info.vdpp_img_w_in   = p_proc_param->src_img_info.img_yrgb.w_vld;
848*437bfbebSnyanmisaka     p_proc_param->dci_vdpp_info.vdpp_img_h_in   = p_proc_param->src_img_info.img_yrgb.h_vld;
849*437bfbebSnyanmisaka     p_proc_param->dci_vdpp_info.vdpp_img_w_out  = p_proc_param->dst_img_info.img_yrgb.w_vld;
850*437bfbebSnyanmisaka     p_proc_param->dci_vdpp_info.vdpp_img_h_out  = p_proc_param->dst_img_info.img_yrgb.h_vld;
851*437bfbebSnyanmisaka 
852*437bfbebSnyanmisaka     p_proc_param->dci_vdpp_info.vdpp_blk_size_h = p_proc_param->src_img_info.img_yrgb.w_vld / 16;
853*437bfbebSnyanmisaka     p_proc_param->dci_vdpp_info.vdpp_blk_size_v = p_proc_param->src_img_info.img_yrgb.h_vld / 16;
854*437bfbebSnyanmisaka 
855*437bfbebSnyanmisaka     hwpq_vdpp_leave();
856*437bfbebSnyanmisaka 
857*437bfbebSnyanmisaka     return MPP_OK;
858*437bfbebSnyanmisaka }
859*437bfbebSnyanmisaka 
hwpq_vdpp_check_work_mode(rk_vdpp_context ctx,rk_vdpp_proc_params * p_proc_param)860*437bfbebSnyanmisaka int hwpq_vdpp_check_work_mode(rk_vdpp_context ctx, rk_vdpp_proc_params *p_proc_param)
861*437bfbebSnyanmisaka {
862*437bfbebSnyanmisaka     RK_S32 cap_mode = VDPP_CAP_UNSUPPORTED;
863*437bfbebSnyanmisaka     VdppCtxImpl *p = (VdppCtxImpl*)ctx;
864*437bfbebSnyanmisaka     vdpp_com_ctx* vdpp = NULL;
865*437bfbebSnyanmisaka     int run_mode = VDPP_RUN_MODE_UNSUPPORTED;
866*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
867*437bfbebSnyanmisaka 
868*437bfbebSnyanmisaka     if (NULL == ctx || NULL == p_proc_param) {
869*437bfbebSnyanmisaka         mpp_err_f("found NULL vdpp %p proc_param %p", ctx, p_proc_param);
870*437bfbebSnyanmisaka         return VDPP_RUN_MODE_UNSUPPORTED;
871*437bfbebSnyanmisaka     }
872*437bfbebSnyanmisaka 
873*437bfbebSnyanmisaka     vdpp = p->vdpp;
874*437bfbebSnyanmisaka     if (NULL == vdpp || NULL == vdpp->ops) {
875*437bfbebSnyanmisaka         mpp_err_f("found NULL vdpp or ops");
876*437bfbebSnyanmisaka         return VDPP_RUN_MODE_UNSUPPORTED;
877*437bfbebSnyanmisaka     }
878*437bfbebSnyanmisaka 
879*437bfbebSnyanmisaka     ret = hwpq_vdpp_common_config(vdpp, p_proc_param);
880*437bfbebSnyanmisaka     if (ret) {
881*437bfbebSnyanmisaka         mpp_err("vdpp common config failed\n");
882*437bfbebSnyanmisaka         return VDPP_RUN_MODE_UNSUPPORTED;
883*437bfbebSnyanmisaka     }
884*437bfbebSnyanmisaka 
885*437bfbebSnyanmisaka     if (vdpp->ops->check_cap)
886*437bfbebSnyanmisaka         cap_mode = vdpp->ops->check_cap(vdpp->priv);
887*437bfbebSnyanmisaka 
888*437bfbebSnyanmisaka     hwpq_vdpp_info("vdpp cap_mode %d", cap_mode);
889*437bfbebSnyanmisaka     /* vep first */
890*437bfbebSnyanmisaka     if (VDPP_CAP_VEP & cap_mode)
891*437bfbebSnyanmisaka         run_mode = VDPP_RUN_MODE_VEP;
892*437bfbebSnyanmisaka     else if (VDPP_CAP_HIST & cap_mode)
893*437bfbebSnyanmisaka         run_mode = VDPP_RUN_MODE_HIST;
894*437bfbebSnyanmisaka 
895*437bfbebSnyanmisaka     return run_mode;
896*437bfbebSnyanmisaka }
897