1 /*
2  * xcam_3a_result.h - 3A result interface
3  *
4  *  Copyright (c) 2014-2015 Intel Corporation
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * Author: Wind Yuan <feng.yuan@intel.com>
19  *         Zong Wei <wei.zong@intel.com>
20  */
21 
22 #ifndef C_XCAM_3A_RESULT_H
23 #define C_XCAM_3A_RESULT_H
24 
25 #include <stdlib.h>
26 #include <stdint.h>
27 #include <stddef.h>
28 #include <base/xcam_defs.h>
29 
30 XCAM_BEGIN_DECLARE
31 
32 #define XCAM_3A_MAX_RESULT_COUNT 256
33 #define xcam_3a_result_type(result)  (((XCam3aResultHead*)result)->type)
34 
35 typedef enum _ImageProcessType {
36     XCAM_IMAGE_PROCESS_ONCE,
37     XCAM_IMAGE_PROCESS_ALWAYS,
38     XCAM_IMAGE_PROCESS_POST,
39 } XCamImageProcessType;
40 
41 typedef enum _XCam3aResultType {
42     XCAM_3A_RESULT_NULL            = 0,
43     /* White Balance */
44     XCAM_3A_RESULT_WHITE_BALANCE,
45     XCAM_3A_RESULT_BLACK_LEVEL,
46     XCAM_3A_RESULT_YUV2RGB_MATRIX,
47     XCAM_3A_RESULT_RGB2YUV_MATRIX,
48 
49     /* Exposure */
50     XCAM_3A_RESULT_EXPOSURE,
51 
52     /* Focus */
53     XCAM_3A_RESULT_FOCUS,
54 
55     XCAM_3A_RESULT_DEMOSAIC,
56     //XCAM_3A_RESULT_EIGEN_COLOR_DEMOSAICING,
57     XCAM_3A_RESULT_DEFECT_PIXEL_CORRECTION,
58 
59     /* noise reduction */
60     XCAM_3A_RESULT_NOISE_REDUCTION,
61     XCAM_3A_RESULT_3D_NOISE_REDUCTION,
62     XCAM_3A_RESULT_TEMPORAL_NOISE_REDUCTION_YUV,
63     XCAM_3A_RESULT_LUMA_NOISE_REDUCTION,
64     XCAM_3A_RESULT_ADVANCED_NOISE_REDUCTION,
65     XCAM_3A_RESULT_CHROMA_NOISER_EDUCTION,
66     XCAM_3A_RESULT_BAYER_NOISE_REDUCTION,
67     XCAM_3A_RESULT_WAVELET_NOISE_REDUCTION,
68 
69     XCAM_3A_RESULT_EDGE_ENHANCEMENT,
70     //XCAM_3A_RESULT_FRIGLE_CONTROL,
71     XCAM_3A_RESULT_MACC,
72     //XCAM_3A_RESULT_MACCTABLE,
73     XCAM_3A_RESULT_CHROMA_TONE_CONTROL,
74     //XCAM_3A_RESULT_CHROMATONECONTROLTABLE,
75     XCAM_3A_RESULT_CHROMA_ENHANCEMENT,
76     XCAM_3A_RESULT_Y_GAMMA,
77     XCAM_3A_RESULT_R_GAMMA,
78     XCAM_3A_RESULT_G_GAMMA,
79     XCAM_3A_RESULT_B_GAMMA,
80     XCAM_3A_RESULT_BRIGHTNESS,
81     //XCAM_3A_RESULT_SHADING_TABLE,
82 
83     //Smart Analysis Type
84     XCAM_3A_RESULT_FACE_DETECTION = 0x4000,
85     XCAM_3A_RESULT_DVS,
86 
87     XCAM_3A_RESULT_USER_DEFINED_TYPE = 0x8000,
88 } XCam3aResultType;
89 
90 /* matrix size 3x3 */
91 #define XCAM_COLOR_MATRIX_SIZE 9
92 #define XCAM_GAMMA_TABLE_SIZE 256
93 #define XCAM_CHROMA_AXIS_SIZE 16
94 #define XCAM_CHROMA_MATRIX_SIZE 4
95 #define XCAM_BNR_TABLE_SIZE 64
96 
97 typedef struct _XCam3aResultHead XCam3aResultHead;
98 
99 struct _XCam3aResultHead {
100     XCam3aResultType      type;
101     XCamImageProcessType  process_type;
102     uint32_t              version;
103     void                  (*destroy) (XCam3aResultHead *);
104 };
105 
106 typedef struct _XCam3aResultWhiteBalance {
107     XCam3aResultHead head;
108 
109     /* data */
110     double           r_gain;
111     double           gr_gain;
112     double           gb_gain;
113     double           b_gain;
114 } XCam3aResultWhiteBalance;
115 
116 typedef struct _XCam3aResultBlackLevel {
117     XCam3aResultHead head;
118 
119     /* data */
120     double           r_level;
121     double           gr_level;
122     double           gb_level;
123     double           b_level;
124 } XCam3aResultBlackLevel;
125 
126 typedef struct _XCam3aResultColorMatrix {
127     XCam3aResultHead head;
128 
129     /* data */
130     double           matrix [XCAM_COLOR_MATRIX_SIZE];
131 } XCam3aResultColorMatrix;
132 
133 typedef struct _XCam3aResultExposure {
134     XCam3aResultHead head;
135 
136     /* data */
137     int32_t          exposure_time; //in micro seconds
138     double           analog_gain;   // multipler
139     double           digital_gain;  // multipler
140     double           aperture;      //fn
141 } XCam3aResultExposure;
142 
143 typedef struct _XCam3aResultFocus {
144     XCam3aResultHead head;
145 
146     /* data */
147     int32_t          position;
148 } XCam3aResultFocus;
149 
150 typedef struct _XCam3aResultDemosaic {
151     XCam3aResultHead head;
152 
153     /* data */
154     double           noise;
155     double           threshold_cr;
156     double           threshold_cb;
157 } XCam3aResultDemosaic;
158 
159 
160 /* DefectPixel Correction */
161 typedef struct _XCam3aResultDefectPixel {
162     XCam3aResultHead head;
163 
164     /* data */
165     double           gain;
166     double           gr_threshold;
167     double           r_threshold;
168     double           b_threshold;
169     double           gb_threshold;
170 } XCam3aResultDefectPixel;
171 
172 typedef struct _XCam3aResultNoiseReduction {
173     XCam3aResultHead head;
174 
175     /* data */
176     double           gain;
177     double           threshold1;
178     double           threshold2;
179 } XCam3aResultNoiseReduction;
180 
181 typedef struct _XCam3aResultBayerNoiseReduction {
182     XCam3aResultHead head;
183 
184     /* data */
185     double           bnr_gain;
186     double           direction;
187     double           table[XCAM_BNR_TABLE_SIZE];
188 } XCam3aResultBayerNoiseReduction;
189 
190 typedef struct _XCam3aResultEdgeEnhancement {
191     XCam3aResultHead head;
192 
193     /* data */
194     double           gain;
195     double           threshold;
196 } XCam3aResultEdgeEnhancement;
197 
198 typedef struct _XCam3aResultGammaTable {
199     XCam3aResultHead head;
200 
201     /* data */
202     double           table[XCAM_GAMMA_TABLE_SIZE];
203 } XCam3aResultGammaTable;
204 
205 typedef struct _XCam3aResultMaccMatrix {
206     XCam3aResultHead head;
207 
208     /* data */
209     double           table[XCAM_CHROMA_AXIS_SIZE * XCAM_CHROMA_MATRIX_SIZE];
210 } XCam3aResultMaccMatrix;
211 
212 typedef struct _XCam3aResultChromaToneControl {
213     XCam3aResultHead head;
214 
215     /* data */
216     double           uv_gain [XCAM_GAMMA_TABLE_SIZE]; // according to Y
217 } XCam3aResultChromaToneControl;
218 
219 typedef struct _XCam3aResultBrightness {
220     XCam3aResultHead head;
221 
222     /* data */
223     double           brightness_level; // range [-1,1], -1 is full dark , 0 is normal val, 1 is full bright
224 } XCam3aResultBrightness;
225 
226 typedef struct _XCam3aResultTemporalNoiseReduction {
227     XCam3aResultHead head;
228 
229     /* data */
230     double           gain;
231     double           threshold[3];
232 } XCam3aResultTemporalNoiseReduction;
233 
234 typedef struct _XCam3aResultWaveletNoiseReduction {
235     XCam3aResultHead head;
236 
237     /* data */
238     uint8_t          decomposition_levels;
239     double           threshold[2];  /* [0]:soft threshold / [1]:hard threshold */
240     double           analog_gain;
241 } XCam3aResultWaveletNoiseReduction;
242 
243 XCAM_END_DECLARE
244 
245 #endif
246