1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
|
/*
* Copyright (C) 2015 - 2017 Intel Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "ia_aiq_types.h"
#include "ia_isp_types.h"
#include "InterpMachine.h"
#include "Pipe.h"
#include "cpffData.h"
#include <vector>
#include "ia_dpc.h"
#include <memory>
#include "dpc_public.h"
#include "bds_public.h"
#include "obgrid_public.h"
#include "ia_css_lin_types.h"
#include "shd_public.h"
#include "bnr_public.h"
#include "anr_public.h"
#include "dm_public.h"
#include "ia_css_tnr3_types.h"
#include "yuvp1_b0_public.h"
#include "yuvp1_c0_public.h"
#include "yuvp2_public.h"
#include "rgbpp_public.h"
#include "ia_css_xnr3_types.h"
#ifdef MACRO_KBL_AIC
#include "ia_css_rgbir_types.h"
#endif
#define BypassPowerSaveMode 1
#define OBG_TILE_SIZE 16
#define __AIC_UNUSED(x) (void)(x)
typedef struct ia_aiq_output_frame_parameters{
//output_resolution resolution;
unsigned short width;
unsigned short height;
bool fix_flip_x; // fix the x flipping if was done in sensor
bool fix_flip_y; // fix the y flipping if was done in sensor
} ia_aiq_output_frame_parameters_t;
typedef struct aic_input_frame_parameters{
ia_aiq_frame_params sensor_frame_params; /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
bool fix_flip_x; // fix the x flipping if was done in sensor
bool fix_flip_y; // fix the y flipping if was done in sensor
} aic_input_frame_parameters_t;
typedef struct aic_resolution_config_parameters{
uint16_t horizontal_IF_crop;
uint16_t vertical_IF_crop;
uint16_t BDSin_img_width;
uint16_t BDSin_img_height;
uint16_t BDSout_img_width; //without padding
uint16_t BDSout_img_height; //without padding
//float horizontal_BDS_scale;=BDSout_img_width/BDSin_img_width
//float vertical_BDS_scale;=BDSout_img_height/BDSin_img_height
uint16_t BDS_horizontal_padding;
} aic_resolution_config_parameters_t;
//Note that effective_img_width+horizontal_padding= image_output_resolution_width
//Note that effective_img_height+vertical_padding= image_output_resolution_height
class Array2DInterpMachine {
size_t m_size;
int m_frameNum, m_modeNum;
std::vector<InterpMachine *> m_data;
public:
Array2DInterpMachine() :
m_size(0), m_frameNum(2), m_modeNum(0), m_data(1)
{}
Array2DInterpMachine(int frames, int modes) :
m_size(0), m_frameNum(frames), m_modeNum(modes), m_data((frames + 1)*(modes + 1)) {
__AIC_UNUSED(m_modeNum);
}
void Set(InterpMachine* intMach, int frame_index, int mode_index) {
if ((mode_index*m_frameNum + frame_index) >= (int)m_data.size())
m_data.resize(mode_index*m_frameNum + m_frameNum);
m_data.at(mode_index*m_frameNum + frame_index) = intMach;
m_size++;
//std::vector<InterpMachine *>::pointer ptr = &m_data[0];
}
void Push(InterpMachine* intMach) {
m_data.push_back(intMach);
m_size++;
}
size_t GetSize() {
return m_size;
}
void Clear() {
for(unsigned i=0;i<m_data.size();i++) {
if(m_data[i]) {delete[] m_data[i];m_data[i]=NULL;}
}
m_data.clear();
m_size = 0;
}
InterpMachine* operator()(int frame_index, int mode_index) {
if ((0 != m_data.size()) && ((int)m_data.size() > (mode_index*m_frameNum + frame_index)))
return m_data.at(mode_index*m_frameNum + frame_index);
return 0;
}
const InterpMachine* const operator()(const int frame_index, const int mode_index) const {
if ((0 != m_data.size()) && ((int)m_data.size() > (mode_index*m_frameNum + frame_index)))
return m_data.at(mode_index*m_frameNum + frame_index);
return 0;
}
};
class Array2DInt {
size_t m_size;
size_t m_width, m_height;
std::vector<int> m_data;
public:
Array2DInt() :
m_size(0), m_width(2), m_height(0), m_data(10)
{}
Array2DInt(size_t x, size_t y, int init = 0) :
m_size(0), m_width(x), m_height(y), m_data(x*y, init) {
__AIC_UNUSED(m_height);
}
void Set(int domNum, int x, int y) {
if ((int)m_data.size() <= (int)(y*m_width + x))
m_data.resize(y*m_width + m_width);
m_data.at(y*m_width + x) = domNum;
m_size++;
}
void Push(int domNum) {
m_data.push_back(domNum);
m_size++;
}
size_t GetSize() {
return m_size;
}
};
//////////////////////////////
// IPU3AICRuntimeParams - gathers all the IPU3 AIC runtime parameters together
// (former IPU3AICRuntimeParams)
struct IPU3AICRuntimeParams
{
long long time_stamp;
ia_aiq_frame_use frame_use;
int mode_index;
const aic_input_frame_parameters_t *input_frame_params; /*!< Mandatory. Inputr frame parameters. Describe frame scaling/cropping done in sensor. */
const aic_resolution_config_parameters_t *frame_resolution_parameters;
const ia_aiq_output_frame_parameters_t *output_frame_params; /*!< Mandatory. Output frame parameters. */
const ia_aiq_exposure_parameters *exposure_results; /*!< Mandatory. Exposure parameters which are to be used to calculate next ISP parameters. */
const ia_aiq_hist_weight_grid *weight_grid;
const ia_aiq_awb_results *awb_results; /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
const ia_aiq_gbce_results *gbce_results; /*!< Mandatory. GBCE Gamma tables which are to be used to calculate next ISP parameters.
If NULL pointer is passed, AIC will use static gamma table from the CPF. */
const ia_aiq_pa_results *pa_results; /*!< Mandatory. Parameter adaptor results from AIQ. */
const ia_aiq_sa_results *sa_results; /*!< Mandatory. Shading adaptor results from AIQ. */
uint32_t isp_vamem_type; /*!< Mandatory. ISP vamem type. */
char manual_brightness; /*!< Optional. Manual brightness value range [-128,127]. */
char manual_contrast; /*!< Optional. Manual contrast value range [-128,127]. */
char manual_hue; /*!< Optional. Manual hue value range [-128,127]. */
char manual_saturation; /*!< Optional. Manual saturation value range [-128,127]. */
char manual_sharpness; /*!< Optional. Manual setting for sharpness [-128,127]. */
ia_isp_effect effects; /*!< Optional. Manual setting for special effects. Combination of ia_aiq_effect enums.*/
ia_rectangle *focus_rect;
sd_dpc_output *scdpc_data;
bool disable_gamma; /*!< Optional. disable gamma for VHDR.*/
bool preserve_color; /*!< Optional. use previous calibration for color processing blocks for VHDR.*/
bool ull_on; /*!< Optional. Flag that is true in the system will run ULL2 after the ISP */
}; /* IPU3AICRuntimeParams owns all pointer variables */
typedef struct aic_inputs {
const ia_cmc_t *CMCParsed;
ISPPipe *SkyCamPipe;
std::vector<CPFF*> cpf_in;
} aic_inputs_t;
#ifdef MACRO_KBL_AIC
typedef struct ISP_adjustment {
bool adjust_denoise_sharpening;
float denoise_power;
float sharpening_power;
} ISP_adjustment_t;
#endif
typedef struct aic_parameters {
aic_inputs_t inputs;
Array2DInterpMachine domain_interp_list;
Array2DInt domain_num;
unsigned int dump_aic_parameters;
bool rgbs_af_grid_valid;
bool awbfr_grid_valid;
bool ae_grid_valid;
#ifdef MACRO_KBL_AIC
ISP_adjustment_t isp_adjustment;
#endif
} aic_parameters_t;
typedef struct aic_config {
struct ia_css_2500_lin_kernel_config lin_2500_config; /**< Skylake: Linearization config */
struct ia_css_2500_obgrid_kernel_config obgrid_2500_config; /**< Skylake: OBGRID config */
struct ia_css_2500_bnr_kernel_config bnr_2500_config; /**< Skylake: bayer denoise config */
struct ia_css_2500_shd_kernel_config shd_2500_config; /**< Skylake: shading config */
struct ia_css_2500_dm_kernel_config dm_2500_config; /**< Skylake: demosaic config */
struct ia_css_2500_rgbpp_kernel_config rgbpp_2500_config; /**< Skylake: RGBPP config */
struct ia_css_2500_yuvp1_b0_kernel_config yuvp1_2500_config; /**< Skylake: yuvp1 config */
struct ia_css_2500_yuvp1_c0_kernel_config yuvp1_c0_2500_config; /**< Skylake: yuvp1_c0 config */
struct ia_css_2500_yuvp2_kernel_config yuvp2_2500_config; /**< Skylake: yuvp2 config */
struct ia_css_tnr3_kernel_config tnr3_2500_config; /**< Skylake: TNR3 config */
struct ia_css_2500_dpc_kernel_config dpc_2500_config; /**< Skylake: DPC config */
struct ia_css_2500_awb_kernel_config awb_2500_config; /**< Skylake: auto white balance config */
struct ia_css_2500_awb_fr_kernel_config awb_fr_2500_config; /**< Skylake: auto white balance filter response config */
struct ia_css_2500_anr_kernel_config anr_2500_config; /**< Skylake: ANR config */
struct ia_css_2500_af_kernel_config af_2500_config; /**< Skylake: auto focus config */
struct ia_css_2500_ae_kernel_config ae_2500_config; /**< Skylake: auto exposure config */
struct ia_css_2500_bds_kernel_config bds_2500_config; /**< Skylake: bayer downscaler config */
struct ia_css_xnr3_config xnr_2500_config; /**< Skylake: XNR3 config */
#ifdef MACRO_KBL_AIC
struct ia_css_2500_rgbir_kernel_config rgbir_2500_config; /**< Skylake: rgbir config */
#endif
} aic_config_t;
#ifdef MACRO_KBL_AIC
struct ia_cp_config {
ia_vhdr_config vhdr_config; /**< KBL: vHDR config */
};
#endif
|