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(¶ms);
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, ¶ms);
382*437bfbebSnyanmisaka
383*437bfbebSnyanmisaka set_es_default_config(¶ms);
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, ¶ms);
387*437bfbebSnyanmisaka
388*437bfbebSnyanmisaka set_hist_cnt_default_config(¶ms);
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, ¶ms);
392*437bfbebSnyanmisaka
393*437bfbebSnyanmisaka set_shp_default_config(¶ms);
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, ¶ms);
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(¶ms.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, ¶ms);
748*437bfbebSnyanmisaka } else {
749*437bfbebSnyanmisaka params.ptype = VDPP_PARAM_TYPE_COM;
750*437bfbebSnyanmisaka memset(¶ms.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, ¶ms);
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