summaryrefslogtreecommitdiff
path: root/include/ia_imaging/ia_exc.h
blob: 4bd453f44d8d0423024c400d4d919f0a81707481 (plain)
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
/*
 * 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.
 */

/*!
 * \file ia_exc.h
 * \brief Definitions of exposure parameters conversions between generic and sensor units.
*/


#ifndef IA_EXC_H_
#define IA_EXC_H_

#include "ia_types.h"
#include "ia_aiq_types.h"
#include "ia_cmc_types.h"

#ifdef __cplusplus
extern "C" {
#endif


/*!
 * \brief Convert exposure time from generic units to sensor units (line & pixel values).
 * AEC will use default formula for conversion, if not given
 * \param[in]  exposure_range          Structure containing coarse and fine integration sensor register ranges. Can be set to NULL if not available.
 * \param[in]  sensor_descriptor       Structure containing coarse and fine integration time limits and step size.
 * \param[in]  exposure_time_us        Exposure time to convert.
 * \param[out] coarse_integration_time Coarse (rows of integration) for rolling shutter cameras.
 * \param[out] fine_integration_time   Fine (pixels of integration remaining after coarse quantization) for rolling shutter cameras.
 * \return                             Error code.
 */
LIBEXPORT ia_err
ia_exc_exposure_time_to_sensor_units(
    const cmc_exposure_range_t *exposure_range,
    const ia_aiq_exposure_sensor_descriptor *sensor_descriptor,
    const int exposure_time_us,
    unsigned short *coarse_integration_time,
    unsigned short *fine_integration_time);

/*!
 * \brief Convert analog gain from generic units to sensor units.
 * Calculate analog gain code from analog gain, limiting it to the sensor specific values.
 * \param[in]  gain_conversion   Structure containing analog gain to gain code conversion tables.
 * \param[in]  analog_gain       Analog gain value to convert to sensor unit.
 * \param[out] analog_gain_code  Calculated analog gain code.
 * \return                       Error code.
 */
LIBEXPORT ia_err
ia_exc_analog_gain_to_sensor_units(
    const cmc_parsed_analog_gain_conversion_t *gain_conversion,
    const float analog_gain,
    unsigned short *analog_gain_code);

/*!
 * \brief Converts digital gain from generic units to sensor units.
 * AEC will use default formulae for conversion, if not given
 * Converts digital gain value to sensor units, limiting the value according to sensor specific limits.
 * \param[in]  gain_conversion   Structure containing digital gain to code mapping information.
 * \param[in]  digital_gain      Digital gain in generic units.
 * \param[out] digital_gain_code Calculated digital gain code.
 * \return                       Error code.
 */
LIBEXPORT ia_err
ia_exc_digital_gain_to_sensor_units(
    const cmc_parsed_digital_gain_t *gain_conversion,
    const float digital_gain,
    unsigned short *digital_gain_code);

/*!
 * \brief Convert exposure time from sensor units to generic units.
 * AEC will use default formula for conversion, if not given
 * \param[in]  sensor_descriptor       Structure containing pixel clock frequency needed in exposure conversion.
 * \param[in]  coarse_integration_time Coarse (rows of integration) for rolling shutter cameras.
 * \param[in]  fine_integration_time   Fine (pixels of integration remaining after coarse quantization) for rolling shutter cameras.
 * \param[out] exposure_time           Calculated exposure value in microseconds.
 * \return                             Error code.
 */
LIBEXPORT ia_err
ia_exc_sensor_units_to_exposure_time(
    const ia_aiq_exposure_sensor_descriptor *sensor_descriptor,
    const unsigned short coarse_integration_time,
    const unsigned short fine_integration_time,
    int *exposure_time);

/*!
 * \brief Convert analog gain from sensor units to generic units.
 * Using the sensor characteristics info, calculate analog gain from sensor register values.
 * \param[in]  gain_conversion   Structure containing analog gain to gain code conversion tables.
 * \param[in]  gain_code         Analog gain code in sensor specific units.
 * \param[out] analog_gain       Calculated analog gain.
 * \return                       Error code.
 */
LIBEXPORT ia_err
ia_exc_sensor_units_to_analog_gain(
    const cmc_parsed_analog_gain_conversion_t *gain_conversion,
    const unsigned short gain_code,
    float *analog_gain);

/*!
 * \brief Converts digital gain from sensor units to generic units.
 * AEC will use default formula for conversion, if not given
 * \param[in]  gain_conversion   Structure containing digital gain to code mapping information.
 * \param[in]  gain_code         Digital gain code in sensor specific units.
 * \param[out] digital_gain      Calculated digital gain.
 * \return                       Error code.
 */
LIBEXPORT ia_err
ia_exc_sensor_units_to_digital_gain(
    const cmc_parsed_digital_gain_t *gain_conversion,
    const unsigned short code,
    float *digital_gain);

/*!
 * \brief Gets analog gain and code based on current code.
 * Offset is used to retrieve previous or next analog gain code pairs from the CMC analog gain conversion tables.
 * \param[in]  gain_conversion   Structure containing analog gain to gain code conversion tables.
 * \param[in]  gain_code         Analog gain code in sensor specific units.
 * \param[in]  gain_code_offset  Offset of code to resolve (-1 or 1).
 * \param[out] indexed_gain_code Analog gain code matching the offset.
 * \return                       Error code.
 */
LIBEXPORT ia_err
ia_exc_get_analog_gain_code(
    const cmc_parsed_analog_gain_conversion_t *gain_conversion,
    const unsigned short gain_code,
    const int gain_code_offset,
    unsigned short *indexed_gain_code);

/*!
 * \brief Converts ISO to analog gain and digital gain and codes.
 * Gains are round down except if given ISO is smaller than corresponding gain 1.0.
 * \param[in]  analog_gain_conversion   Structure containing analog gain to gain code conversion tables.  Can be NULL, if sensor doesn't support analog gain.
 * \param[in]  digital_gain_conversion  Structure containing digital gain to code mapping information. Can be NULL, if sensor doesn't support digital gain.
 * \param[in]  sensitivity              Structure containing sensor sensitivity information.
 * \param[in]  iso                      ISO value to be converted into gains.
 * \param[out] analog_gain              Calculated analog gain.-1.0 if not available.
 * \param[out] analog_gain_code         Calculated analog gain code. -1 if not available.
 * \param[out] digital_gain             Calculated digital gain. -1.0 if not available.
 * \param[out] digital_gain_code        Calculated digital gain code. -1 if not available.
 * \return                              Error code.
 */
LIBEXPORT ia_err
ia_exc_convert_iso_to_gains(
    const cmc_parsed_analog_gain_conversion_t *analog_gain_conversion,
    const cmc_parsed_digital_gain_t *digital_gain_conversion,
    const cmc_sensitivity_t *sensitivity,
    const int iso,
    float *analog_gain,
    int *analog_gain_code,
    float *digital_gain,
    int *digital_gain_code);

/*!
 * \brief Converts analog gain and digital gain codes to ISO.
 * \param[in]  analog_gain_conversion   Structure containing analog gain to gain code conversion tables. Can be NULL, if sensor doesn't support analog gain.
 * \param[in]  digital_gain_conversion  Structure containing digital gain to code mapping information. Can be NULL, if sensor doesn't support digital gain.
 * \param[in]  sensitivity              Structure containing sensor sensitivity information.
 * \param[in]  analog_gain_code         Analog gain code. -1 if not available.
 * \param[in]  digital_gain_code        Digital gain code. -1 if not available.
 * \param[out] iso                      Analog and digital gain codes converted into ISO value. -1 if not available.
 * \return                              Error code.
 */
LIBEXPORT ia_err
ia_exc_convert_gain_codes_to_iso(
    const cmc_parsed_analog_gain_conversion_t *analog_gain_conversion,
    const cmc_parsed_digital_gain_t *digital_gain_conversion,
    const cmc_sensitivity_t *sensitivity,
    const int analog_gain_code,
    const int digital_gain_code,
    int *iso);

#ifdef __cplusplus
}
#endif

#endif /* IA_EXC_H_ */