1 /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
12 * * Neither the name of The Linux Foundation nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29
30 #define LOG_TAG "QCameraParameters"
31
32 // To remove
33 #include <cutils/properties.h>
34
35 // System dependencies
36 #include <math.h>
37 #include <string.h>
38 #include <stdlib.h>
39 #include <utils/Errors.h>
40 #define SYSINFO_H <SYSTEM_HEADER_PREFIX/sysinfo.h>
41 #include SYSINFO_H
42 #include "gralloc_priv.h"
43 #include "graphics.h"
44
45 // Camera dependencies
46 #include "QCameraBufferMaps.h"
47 #include "QCamera2HWI.h"
48 #include "QCameraParameters.h"
49 #include "QCameraTrace.h"
50
51 extern "C" {
52 #include "mm_camera_dbg.h"
53 }
54
55 #define PI 3.14159265
56 #define ASPECT_TOLERANCE 0.001
57 #define CAMERA_DEFAULT_LONGSHOT_STAGES 4
58 #define CAMERA_MIN_LONGSHOT_STAGES 2
59 #define FOCUS_PERCISION 0.0000001
60
61
62 namespace qcamera {
63 // Parameter keys to communicate between camera application and driver.
64 const char QCameraParameters::KEY_QC_SUPPORTED_HFR_SIZES[] = "hfr-size-values";
65 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_MODE[] = "preview-frame-rate-mode";
66 const char QCameraParameters::KEY_QC_SUPPORTED_PREVIEW_FRAME_RATE_MODES[] = "preview-frame-rate-modes";
67 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_AUTO_MODE[] = "frame-rate-auto";
68 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_FIXED_MODE[] = "frame-rate-fixed";
69 const char QCameraParameters::KEY_QC_TOUCH_AF_AEC[] = "touch-af-aec";
70 const char QCameraParameters::KEY_QC_SUPPORTED_TOUCH_AF_AEC[] = "touch-af-aec-values";
71 const char QCameraParameters::KEY_QC_TOUCH_INDEX_AEC[] = "touch-index-aec";
72 const char QCameraParameters::KEY_QC_TOUCH_INDEX_AF[] = "touch-index-af";
73 const char QCameraParameters::KEY_QC_SCENE_DETECT[] = "scene-detect";
74 const char QCameraParameters::KEY_QC_SUPPORTED_SCENE_DETECT[] = "scene-detect-values";
75 const char QCameraParameters::KEY_QC_ISO_MODE[] = "iso";
76 const char QCameraParameters::KEY_QC_CONTINUOUS_ISO[] = "continuous-iso";
77 const char QCameraParameters::KEY_QC_MIN_ISO[] = "min-iso";
78 const char QCameraParameters::KEY_QC_MAX_ISO[] = "max-iso";
79 const char QCameraParameters::KEY_QC_SUPPORTED_ISO_MODES[] = "iso-values";
80 const char QCameraParameters::KEY_QC_EXPOSURE_TIME[] = "exposure-time";
81 const char QCameraParameters::KEY_QC_MIN_EXPOSURE_TIME[] = "min-exposure-time";
82 const char QCameraParameters::KEY_QC_MAX_EXPOSURE_TIME[] = "max-exposure-time";
83 const char QCameraParameters::KEY_QC_CURRENT_EXPOSURE_TIME[] = "cur-exposure-time";
84 const char QCameraParameters::KEY_QC_CURRENT_ISO[] = "cur-iso";
85 const char QCameraParameters::KEY_QC_LENSSHADE[] = "lensshade";
86 const char QCameraParameters::KEY_QC_SUPPORTED_LENSSHADE_MODES[] = "lensshade-values";
87 const char QCameraParameters::KEY_QC_AUTO_EXPOSURE[] = "auto-exposure";
88 const char QCameraParameters::KEY_QC_SUPPORTED_AUTO_EXPOSURE[] = "auto-exposure-values";
89 const char QCameraParameters::KEY_QC_DENOISE[] = "denoise";
90 const char QCameraParameters::KEY_QC_SUPPORTED_DENOISE[] = "denoise-values";
91 const char QCameraParameters::KEY_QC_FOCUS_ALGO[] = "selectable-zone-af";
92 const char QCameraParameters::KEY_QC_SUPPORTED_FOCUS_ALGOS[] = "selectable-zone-af-values";
93 const char QCameraParameters::KEY_QC_MANUAL_FOCUS_POSITION[] = "manual-focus-position";
94 const char QCameraParameters::KEY_QC_MANUAL_FOCUS_POS_TYPE[] = "manual-focus-pos-type";
95 const char QCameraParameters::KEY_QC_MIN_FOCUS_POS_INDEX[] = "min-focus-pos-index";
96 const char QCameraParameters::KEY_QC_MAX_FOCUS_POS_INDEX[] = "max-focus-pos-index";
97 const char QCameraParameters::KEY_QC_MIN_FOCUS_POS_DAC[] = "min-focus-pos-dac";
98 const char QCameraParameters::KEY_QC_MAX_FOCUS_POS_DAC[] = "max-focus-pos-dac";
99 const char QCameraParameters::KEY_QC_MIN_FOCUS_POS_RATIO[] = "min-focus-pos-ratio";
100 const char QCameraParameters::KEY_QC_MAX_FOCUS_POS_RATIO[] = "max-focus-pos-ratio";
101 const char QCameraParameters::KEY_QC_FOCUS_POSITION_SCALE[] = "cur-focus-scale";
102 const char QCameraParameters::KEY_QC_MIN_FOCUS_POS_DIOPTER[] = "min-focus-pos-diopter";
103 const char QCameraParameters::KEY_QC_MAX_FOCUS_POS_DIOPTER[] = "max-focus-pos-diopter";
104 const char QCameraParameters::KEY_QC_FOCUS_POSITION_DIOPTER[] = "cur-focus-diopter";
105 const char QCameraParameters::KEY_QC_FACE_DETECTION[] = "face-detection";
106 const char QCameraParameters::KEY_QC_SUPPORTED_FACE_DETECTION[] = "face-detection-values";
107 const char QCameraParameters::KEY_QC_FACE_RECOGNITION[] = "face-recognition";
108 const char QCameraParameters::KEY_QC_SUPPORTED_FACE_RECOGNITION[] = "face-recognition-values";
109 const char QCameraParameters::KEY_QC_MEMORY_COLOR_ENHANCEMENT[] = "mce";
110 const char QCameraParameters::KEY_QC_SUPPORTED_MEM_COLOR_ENHANCE_MODES[] = "mce-values";
111 const char QCameraParameters::KEY_QC_DIS[] = "dis";
112 const char QCameraParameters::KEY_QC_OIS[] = "ois";
113 const char QCameraParameters::KEY_QC_SUPPORTED_DIS_MODES[] = "dis-values";
114 const char QCameraParameters::KEY_QC_SUPPORTED_OIS_MODES[] = "ois-values";
115 const char QCameraParameters::KEY_QC_VIDEO_HIGH_FRAME_RATE[] = "video-hfr";
116 const char QCameraParameters::KEY_QC_VIDEO_HIGH_SPEED_RECORDING[] = "video-hsr";
117 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_HIGH_FRAME_RATE_MODES[] = "video-hfr-values";
118 const char QCameraParameters::KEY_QC_REDEYE_REDUCTION[] = "redeye-reduction";
119 const char QCameraParameters::KEY_QC_SUPPORTED_REDEYE_REDUCTION[] = "redeye-reduction-values";
120 const char QCameraParameters::KEY_QC_HIGH_DYNAMIC_RANGE_IMAGING[] = "hdr";
121 const char QCameraParameters::KEY_QC_SUPPORTED_HDR_IMAGING_MODES[] = "hdr-values";
122 const char QCameraParameters::KEY_QC_ZSL[] = "zsl";
123 const char QCameraParameters::KEY_QC_SUPPORTED_ZSL_MODES[] = "zsl-values";
124 const char QCameraParameters::KEY_QC_ZSL_BURST_INTERVAL[] = "capture-burst-interval";
125 const char QCameraParameters::KEY_QC_ZSL_BURST_LOOKBACK[] = "capture-burst-retroactive";
126 const char QCameraParameters::KEY_QC_ZSL_QUEUE_DEPTH[] = "capture-burst-queue-depth";
127 const char QCameraParameters::KEY_QC_CAMERA_MODE[] = "camera-mode";
128 const char QCameraParameters::KEY_QC_AE_BRACKET_HDR[] = "ae-bracket-hdr";
129 const char QCameraParameters::KEY_QC_SUPPORTED_AE_BRACKET_MODES[] = "ae-bracket-hdr-values";
130 const char QCameraParameters::KEY_QC_SUPPORTED_RAW_FORMATS[] = "raw-format-values";
131 const char QCameraParameters::KEY_QC_RAW_FORMAT[] = "raw-format";
132 const char QCameraParameters::KEY_QC_ORIENTATION[] = "orientation";
133 const char QCameraParameters::KEY_QC_SELECTABLE_ZONE_AF[] = "selectable-zone-af";
134 const char QCameraParameters::KEY_QC_CAPTURE_BURST_EXPOSURE[] = "capture-burst-exposures";
135 const char QCameraParameters::KEY_QC_NUM_SNAPSHOT_PER_SHUTTER[] = "num-snaps-per-shutter";
136 const char QCameraParameters::KEY_QC_NUM_RETRO_BURST_PER_SHUTTER[] = "num-retro-burst-per-shutter";
137 const char QCameraParameters::KEY_QC_SNAPSHOT_BURST_LED_ON_PERIOD[] = "zsl-burst-led-on-period";
138 const char QCameraParameters::KEY_QC_NO_DISPLAY_MODE[] = "no-display-mode";
139 const char QCameraParameters::KEY_QC_RAW_PICUTRE_SIZE[] = "raw-size";
140 const char QCameraParameters::KEY_QC_SUPPORTED_SKIN_TONE_ENHANCEMENT_MODES[] = "skinToneEnhancement-values";
141 const char QCameraParameters::KEY_QC_SUPPORTED_LIVESNAPSHOT_SIZES[] = "supported-live-snapshot-sizes";
142 const char QCameraParameters::KEY_QC_SUPPORTED_HDR_NEED_1X[] = "hdr-need-1x-values";
143 const char QCameraParameters::KEY_QC_HDR_NEED_1X[] = "hdr-need-1x";
144 const char QCameraParameters::KEY_QC_PREVIEW_FLIP[] = "preview-flip";
145 const char QCameraParameters::KEY_QC_VIDEO_FLIP[] = "video-flip";
146 const char QCameraParameters::KEY_QC_SNAPSHOT_PICTURE_FLIP[] = "snapshot-picture-flip";
147 const char QCameraParameters::KEY_QC_SUPPORTED_FLIP_MODES[] = "flip-mode-values";
148 const char QCameraParameters::KEY_QC_VIDEO_HDR[] = "video-hdr";
149 const char QCameraParameters::KEY_QC_SENSOR_HDR[] = "sensor-hdr";
150 const char QCameraParameters::KEY_QC_VT_ENABLE[] = "avtimer";
151 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_HDR_MODES[] = "video-hdr-values";
152 const char QCameraParameters::KEY_QC_SUPPORTED_SENSOR_HDR_MODES[] = "sensor-hdr-values";
153 const char QCameraParameters::KEY_QC_AUTO_HDR_ENABLE [] = "auto-hdr-enable";
154 const char QCameraParameters::KEY_QC_SNAPSHOT_BURST_NUM[] = "snapshot-burst-num";
155 const char QCameraParameters::KEY_QC_SNAPSHOT_FD_DATA[] = "snapshot-fd-data-enable";
156 const char QCameraParameters::KEY_QC_TINTLESS_ENABLE[] = "tintless";
157 const char QCameraParameters::KEY_QC_SCENE_SELECTION[] = "scene-selection";
158 const char QCameraParameters::KEY_QC_CDS_MODE[] = "cds-mode";
159 const char QCameraParameters::KEY_QC_VIDEO_CDS_MODE[] = "video-cds-mode";
160 const char QCameraParameters::KEY_QC_SUPPORTED_CDS_MODES[] = "cds-mode-values";
161 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_CDS_MODES[] = "video-cds-mode-values";
162 const char QCameraParameters::KEY_QC_TNR_MODE[] = "tnr-mode";
163 const char QCameraParameters::KEY_QC_VIDEO_TNR_MODE[] = "video-tnr-mode";
164 const char QCameraParameters::KEY_QC_SUPPORTED_TNR_MODES[] = "tnr-mode-values";
165 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_TNR_MODES[] = "video-tnr-mode-values";
166 const char QCameraParameters::KEY_QC_VIDEO_ROTATION[] = "video-rotation";
167 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_ROTATION_VALUES[] = "video-rotation-values";
168 const char QCameraParameters::KEY_QC_AF_BRACKET[] = "af-bracket";
169 const char QCameraParameters::KEY_QC_SUPPORTED_AF_BRACKET_MODES[] = "af-bracket-values";
170 const char QCameraParameters::KEY_QC_RE_FOCUS[] = "re-focus";
171 const char QCameraParameters::KEY_QC_SUPPORTED_RE_FOCUS_MODES[] = "re-focus-values";
172 const char QCameraParameters::KEY_QC_CHROMA_FLASH[] = "chroma-flash";
173 const char QCameraParameters::KEY_QC_SUPPORTED_CHROMA_FLASH_MODES[] = "chroma-flash-values";
174 const char QCameraParameters::KEY_QC_OPTI_ZOOM[] = "opti-zoom";
175 const char QCameraParameters::KEY_QC_SEE_MORE[] = "see-more";
176 const char QCameraParameters::KEY_QC_STILL_MORE[] = "still-more";
177 const char QCameraParameters::KEY_QC_SUPPORTED_OPTI_ZOOM_MODES[] = "opti-zoom-values";
178 const char QCameraParameters::KEY_QC_HDR_MODE[] = "hdr-mode";
179 const char QCameraParameters::KEY_QC_SUPPORTED_KEY_QC_HDR_MODES[] = "hdr-mode-values";
180 const char QCameraParameters::KEY_QC_TRUE_PORTRAIT[] = "true-portrait";
181 const char QCameraParameters::KEY_QC_SUPPORTED_TRUE_PORTRAIT_MODES[] = "true-portrait-values";
182 const char QCameraParameters::KEY_QC_SUPPORTED_SEE_MORE_MODES[] = "see-more-values";
183 const char QCameraParameters::KEY_QC_SUPPORTED_STILL_MORE_MODES[] = "still-more-values";
184 const char QCameraParameters::KEY_INTERNAL_PERVIEW_RESTART[] = "internal-restart";
185 const char QCameraParameters::KEY_QC_RDI_MODE[] = "rdi-mode";
186 const char QCameraParameters::KEY_QC_SUPPORTED_RDI_MODES[] = "rdi-mode-values";
187 const char QCameraParameters::KEY_QC_SECURE_MODE[] = "secure-mode";
188 const char QCameraParameters::KEY_QC_SUPPORTED_SECURE_MODES[] = "secure-mode-values";
189 const char QCameraParameters::ISO_HJR[] = "ISO_HJR";
190 const char QCameraParameters::KEY_QC_AUTO_HDR_SUPPORTED[] = "auto-hdr-supported";
191 const char QCameraParameters::KEY_QC_LONGSHOT_SUPPORTED[] = "longshot-supported";
192 const char QCameraParameters::KEY_QC_ZSL_HDR_SUPPORTED[] = "zsl-hdr-supported";
193 const char QCameraParameters::KEY_QC_WB_MANUAL_CCT[] = "wb-manual-cct";
194 const char QCameraParameters::KEY_QC_MIN_WB_CCT[] = "min-wb-cct";
195 const char QCameraParameters::KEY_QC_MAX_WB_CCT[] = "max-wb-cct";
196
197 const char QCameraParameters::KEY_QC_MANUAL_WB_GAINS[] = "manual-wb-gains";
198 const char QCameraParameters::KEY_QC_MIN_WB_GAIN[] = "min-wb-gain";
199 const char QCameraParameters::KEY_QC_MAX_WB_GAIN[] = "max-wb-gain";
200
201 const char QCameraParameters::KEY_QC_MANUAL_WB_TYPE[] = "manual-wb-type";
202 const char QCameraParameters::KEY_QC_MANUAL_WB_VALUE[] = "manual-wb-value";
203
204 const char QCameraParameters::WHITE_BALANCE_MANUAL[] = "manual";
205 const char QCameraParameters::FOCUS_MODE_MANUAL_POSITION[] = "manual";
206 const char QCameraParameters::KEY_QC_CACHE_VIDEO_BUFFERS[] = "cache-video-buffers";
207
208 const char QCameraParameters::KEY_QC_LONG_SHOT[] = "long-shot";
209 const char QCameraParameters::KEY_QC_INITIAL_EXPOSURE_INDEX[] = "initial-exp-index";
210 const char QCameraParameters::KEY_QC_INSTANT_AEC[] = "instant-aec";
211 const char QCameraParameters::KEY_QC_INSTANT_CAPTURE[] = "instant-capture";
212 const char QCameraParameters::KEY_QC_INSTANT_AEC_SUPPORTED_MODES[] = "instant-aec-values";
213 const char QCameraParameters::KEY_QC_INSTANT_CAPTURE_SUPPORTED_MODES[] = "instant-capture-values";
214
215 // Values for effect settings.
216 const char QCameraParameters::EFFECT_EMBOSS[] = "emboss";
217 const char QCameraParameters::EFFECT_SKETCH[] = "sketch";
218 const char QCameraParameters::EFFECT_NEON[] = "neon";
219 const char QCameraParameters::EFFECT_BEAUTY[] = "beauty";
220
221
222 // Values for auto exposure settings.
223 const char QCameraParameters::TOUCH_AF_AEC_OFF[] = "touch-off";
224 const char QCameraParameters::TOUCH_AF_AEC_ON[] = "touch-on";
225
226 // Values for scene mode settings.
227 const char QCameraParameters::SCENE_MODE_ASD[] = "asd"; // corresponds to CAMERA_BESTSHOT_AUTO in HAL
228 const char QCameraParameters::SCENE_MODE_BACKLIGHT[] = "backlight";
229 const char QCameraParameters::SCENE_MODE_FLOWERS[] = "flowers";
230 const char QCameraParameters::SCENE_MODE_AR[] = "AR";
231 const char QCameraParameters::SCENE_MODE_HDR[] = "hdr";
232
233 // Formats for setPreviewFormat and setPictureFormat.
234 const char QCameraParameters::PIXEL_FORMAT_YUV420SP_ADRENO[] = "yuv420sp-adreno";
235 const char QCameraParameters::PIXEL_FORMAT_YV12[] = "yuv420p";
236 const char QCameraParameters::PIXEL_FORMAT_NV12[] = "nv12";
237 const char QCameraParameters::QC_PIXEL_FORMAT_NV12_VENUS[] = "nv12-venus";
238
239 // Values for raw image formats
240 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_YUYV[] = "yuv-raw8-yuyv";
241 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_YVYU[] = "yuv-raw8-yvyu";
242 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_UYVY[] = "yuv-raw8-uyvy";
243 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_VYUY[] = "yuv-raw8-vyuy";
244 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GBRG[] = "bayer-qcom-8gbrg";
245 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GRBG[] = "bayer-qcom-8grbg";
246 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8RGGB[] = "bayer-qcom-8rggb";
247 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8BGGR[] = "bayer-qcom-8bggr";
248 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GBRG[] = "bayer-qcom-10gbrg";
249 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GRBG[] = "bayer-qcom-10grbg";
250 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10RGGB[] = "bayer-qcom-10rggb";
251 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10BGGR[] = "bayer-qcom-10bggr";
252 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GBRG[] = "bayer-qcom-12gbrg";
253 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GRBG[] = "bayer-qcom-12grbg";
254 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12RGGB[] = "bayer-qcom-12rggb";
255 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12BGGR[] = "bayer-qcom-12bggr";
256 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14GBRG[] = "bayer-qcom-14gbrg";
257 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14GRBG[] = "bayer-qcom-14grbg";
258 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14RGGB[] = "bayer-qcom-14rggb";
259 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14BGGR[] = "bayer-qcom-14bggr";
260 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GBRG[] = "bayer-mipi-8gbrg";
261 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GRBG[] = "bayer-mipi-8grbg";
262 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8RGGB[] = "bayer-mipi-8rggb";
263 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8BGGR[] = "bayer-mipi-8bggr";
264 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GBRG[] = "bayer-mipi-10gbrg";
265 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GRBG[] = "bayer-mipi-10grbg";
266 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10RGGB[] = "bayer-mipi-10rggb";
267 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10BGGR[] = "bayer-mipi-10bggr";
268 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GBRG[] = "bayer-mipi-12gbrg";
269 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GRBG[] = "bayer-mipi-12grbg";
270 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12RGGB[] = "bayer-mipi-12rggb";
271 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12BGGR[] = "bayer-mipi-12bggr";
272 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14GBRG[] = "bayer-mipi-14gbrg";
273 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14GRBG[] = "bayer-mipi-14grbg";
274 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14RGGB[] = "bayer-mipi-14rggb";
275 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14BGGR[] = "bayer-mipi-14bggr";
276 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GBRG[] = "bayer-ideal-qcom-8gbrg";
277 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GRBG[] = "bayer-ideal-qcom-8grbg";
278 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8RGGB[] = "bayer-ideal-qcom-8rggb";
279 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8BGGR[] = "bayer-ideal-qcom-8bggr";
280 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GBRG[] = "bayer-ideal-qcom-10gbrg";
281 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GRBG[] = "bayer-ideal-qcom-10grbg";
282 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10RGGB[] = "bayer-ideal-qcom-10rggb";
283 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10BGGR[] = "bayer-ideal-qcom-10bggr";
284 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GBRG[] = "bayer-ideal-qcom-12gbrg";
285 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GRBG[] = "bayer-ideal-qcom-12grbg";
286 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12RGGB[] = "bayer-ideal-qcom-12rggb";
287 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12BGGR[] = "bayer-ideal-qcom-12bggr";
288 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14GBRG[] = "bayer-ideal-qcom-14gbrg";
289 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14GRBG[] = "bayer-ideal-qcom-14grbg";
290 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14RGGB[] = "bayer-ideal-qcom-14rggb";
291 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14BGGR[] = "bayer-ideal-qcom-14bggr";
292 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GBRG[] = "bayer-ideal-mipi-8gbrg";
293 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GRBG[] = "bayer-ideal-mipi-8grbg";
294 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8RGGB[] = "bayer-ideal-mipi-8rggb";
295 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8BGGR[] = "bayer-ideal-mipi-8bggr";
296 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GBRG[] = "bayer-ideal-mipi-10gbrg";
297 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GRBG[] = "bayer-ideal-mipi-10grbg";
298 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10RGGB[] = "bayer-ideal-mipi-10rggb";
299 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10BGGR[] = "bayer-ideal-mipi-10bggr";
300 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GBRG[] = "bayer-ideal-mipi-12gbrg";
301 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GRBG[] = "bayer-ideal-mipi-12grbg";
302 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12RGGB[] = "bayer-ideal-mipi-12rggb";
303 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12BGGR[] = "bayer-ideal-mipi-12bggr";
304 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14GBRG[] = "bayer-ideal-mipi-14gbrg";
305 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14GRBG[] = "bayer-ideal-mipi-14grbg";
306 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14RGGB[] = "bayer-ideal-mipi-14rggb";
307 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14BGGR[] = "bayer-ideal-mipi-14bggr";
308 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GBRG[] = "bayer-ideal-plain8-8gbrg";
309 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GRBG[] = "bayer-ideal-plain8-8grbg";
310 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8RGGB[] = "bayer-ideal-plain8-8rggb";
311 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8BGGR[] = "bayer-ideal-plain8-8bggr";
312 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GBRG[] = "bayer-ideal-plain16-8gbrg";
313 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GRBG[] = "bayer-ideal-plain16-8grbg";
314 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8RGGB[] = "bayer-ideal-plain16-8rggb";
315 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8BGGR[] = "bayer-ideal-plain16-8bggr";
316 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GBRG[] = "bayer-ideal-plain16-10gbrg";
317 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GRBG[] = "bayer-ideal-plain16-10grbg";
318 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10RGGB[] = "bayer-ideal-plain16-10rggb";
319 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10BGGR[] = "bayer-ideal-plain16-10bggr";
320 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GBRG[] = "bayer-ideal-plain16-12gbrg";
321 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GRBG[] = "bayer-ideal-plain16-12grbg";
322 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12RGGB[] = "bayer-ideal-plain16-12rggb";
323 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12BGGR[] = "bayer-ideal-plain16-12bggr";
324 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14GBRG[] = "bayer-ideal-plain16-14gbrg";
325 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14GRBG[] = "bayer-ideal-plain16-14grbg";
326 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14RGGB[] = "bayer-ideal-plain16-14rggb";
327 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14BGGR[] = "bayer-ideal-plain16-14bggr";
328
329 // Values for ISO Settings
330 const char QCameraParameters::ISO_AUTO[] = "auto";
331 const char QCameraParameters::ISO_100[] = "ISO100";
332 const char QCameraParameters::ISO_200[] = "ISO200";
333 const char QCameraParameters::ISO_400[] = "ISO400";
334 const char QCameraParameters::ISO_800[] = "ISO800";
335 const char QCameraParameters::ISO_1600[] = "ISO1600";
336 const char QCameraParameters::ISO_3200[] = "ISO3200";
337 const char QCameraParameters::ISO_MANUAL[] = "manual";
338
339
340 // Values for auto exposure settings.
341 const char QCameraParameters::AUTO_EXPOSURE_FRAME_AVG[] = "frame-average";
342 const char QCameraParameters::AUTO_EXPOSURE_CENTER_WEIGHTED[] = "center-weighted";
343 const char QCameraParameters::AUTO_EXPOSURE_SPOT_METERING[] = "spot-metering";
344 const char QCameraParameters::AUTO_EXPOSURE_SMART_METERING[] = "smart-metering";
345 const char QCameraParameters::AUTO_EXPOSURE_USER_METERING[] = "user-metering";
346 const char QCameraParameters::AUTO_EXPOSURE_SPOT_METERING_ADV[] = "spot-metering-adv";
347 const char QCameraParameters::AUTO_EXPOSURE_CENTER_WEIGHTED_ADV[] = "center-weighted-adv";
348
349 // Values for instant AEC modes
350 const char QCameraParameters::KEY_QC_INSTANT_AEC_DISABLE[] = "0";
351 const char QCameraParameters::KEY_QC_INSTANT_AEC_AGGRESSIVE_AEC[] = "1";
352 const char QCameraParameters::KEY_QC_INSTANT_AEC_FAST_AEC[] = "2";
353
354 // Values for instant capture modes
355 const char QCameraParameters::KEY_QC_INSTANT_CAPTURE_DISABLE[] = "0";
356 const char QCameraParameters::KEY_QC_INSTANT_CAPTURE_AGGRESSIVE_AEC[] = "1";
357 const char QCameraParameters::KEY_QC_INSTANT_CAPTURE_FAST_AEC[] = "2";
358
359 const char QCameraParameters::KEY_QC_GPS_LATITUDE_REF[] = "gps-latitude-ref";
360 const char QCameraParameters::KEY_QC_GPS_LONGITUDE_REF[] = "gps-longitude-ref";
361 const char QCameraParameters::KEY_QC_GPS_ALTITUDE_REF[] = "gps-altitude-ref";
362 const char QCameraParameters::KEY_QC_GPS_STATUS[] = "gps-status";
363
364 const char QCameraParameters::KEY_QC_HISTOGRAM[] = "histogram";
365 const char QCameraParameters::KEY_QC_SUPPORTED_HISTOGRAM_MODES[] = "histogram-values";
366
367 const char QCameraParameters::VALUE_ENABLE[] = "enable";
368 const char QCameraParameters::VALUE_DISABLE[] = "disable";
369 const char QCameraParameters::VALUE_OFF[] = "off";
370 const char QCameraParameters::VALUE_ON[] = "on";
371 const char QCameraParameters::VALUE_TRUE[] = "true";
372 const char QCameraParameters::VALUE_FALSE[] = "false";
373
374 const char QCameraParameters::VALUE_FAST[] = "fast";
375 const char QCameraParameters::VALUE_HIGH_QUALITY[] = "high-quality";
376
377 const char QCameraParameters::KEY_QC_SHARPNESS[] = "sharpness";
378 const char QCameraParameters::KEY_QC_MIN_SHARPNESS[] = "min-sharpness";
379 const char QCameraParameters::KEY_QC_MAX_SHARPNESS[] = "max-sharpness";
380 const char QCameraParameters::KEY_QC_SHARPNESS_STEP[] = "sharpness-step";
381 const char QCameraParameters::KEY_QC_CONTRAST[] = "contrast";
382 const char QCameraParameters::KEY_QC_MIN_CONTRAST[] = "min-contrast";
383 const char QCameraParameters::KEY_QC_MAX_CONTRAST[] = "max-contrast";
384 const char QCameraParameters::KEY_QC_CONTRAST_STEP[] = "contrast-step";
385 const char QCameraParameters::KEY_QC_SATURATION[] = "saturation";
386 const char QCameraParameters::KEY_QC_MIN_SATURATION[] = "min-saturation";
387 const char QCameraParameters::KEY_QC_MAX_SATURATION[] = "max-saturation";
388 const char QCameraParameters::KEY_QC_SATURATION_STEP[] = "saturation-step";
389 const char QCameraParameters::KEY_QC_BRIGHTNESS[] = "luma-adaptation";
390 const char QCameraParameters::KEY_QC_MIN_BRIGHTNESS[] = "min-brightness";
391 const char QCameraParameters::KEY_QC_MAX_BRIGHTNESS[] = "max-brightness";
392 const char QCameraParameters::KEY_QC_BRIGHTNESS_STEP[] = "brightness-step";
393 const char QCameraParameters::KEY_QC_SCE_FACTOR[] = "skinToneEnhancement";
394 const char QCameraParameters::KEY_QC_MIN_SCE_FACTOR[] = "min-sce-factor";
395 const char QCameraParameters::KEY_QC_MAX_SCE_FACTOR[] = "max-sce-factor";
396 const char QCameraParameters::KEY_QC_SCE_FACTOR_STEP[] = "sce-factor-step";
397
398 const char QCameraParameters::KEY_QC_MAX_NUM_REQUESTED_FACES[] = "qc-max-num-requested-faces";
399
400 //Values for DENOISE
401 const char QCameraParameters::DENOISE_OFF[] = "denoise-off";
402 const char QCameraParameters::DENOISE_ON[] = "denoise-on";
403
404 // Values for selectable zone af Settings
405 const char QCameraParameters::FOCUS_ALGO_AUTO[] = "auto";
406 const char QCameraParameters::FOCUS_ALGO_SPOT_METERING[] = "spot-metering";
407 const char QCameraParameters::FOCUS_ALGO_CENTER_WEIGHTED[] = "center-weighted";
408 const char QCameraParameters::FOCUS_ALGO_FRAME_AVERAGE[] = "frame-average";
409
410 // Values for HFR settings.
411 const char QCameraParameters::VIDEO_HFR_OFF[] = "off";
412 const char QCameraParameters::VIDEO_HFR_2X[] = "60";
413 const char QCameraParameters::VIDEO_HFR_3X[] = "90";
414 const char QCameraParameters::VIDEO_HFR_4X[] = "120";
415 const char QCameraParameters::VIDEO_HFR_5X[] = "150";
416 const char QCameraParameters::VIDEO_HFR_6X[] = "180";
417 const char QCameraParameters::VIDEO_HFR_7X[] = "210";
418 const char QCameraParameters::VIDEO_HFR_8X[] = "240";
419 const char QCameraParameters::VIDEO_HFR_9X[] = "480";
420
421 // Values for HDR Bracketing settings.
422 const char QCameraParameters::AE_BRACKET_OFF[] = "Off";
423 const char QCameraParameters::AE_BRACKET[] = "AE-Bracket";
424
425 // Values for AF Bracketing setting.
426 const char QCameraParameters::AF_BRACKET_OFF[] = "af-bracket-off";
427 const char QCameraParameters::AF_BRACKET_ON[] = "af-bracket-on";
428
429 // Values for Refocus setting.
430 const char QCameraParameters::RE_FOCUS_OFF[] = "re-focus-off";
431 const char QCameraParameters::RE_FOCUS_ON[] = "re-focus-on";
432
433 // Values for Chroma Flash setting.
434 const char QCameraParameters::CHROMA_FLASH_OFF[] = "chroma-flash-off";
435 const char QCameraParameters::CHROMA_FLASH_ON[] = "chroma-flash-on";
436
437 // Values for Opti Zoom setting.
438 const char QCameraParameters::OPTI_ZOOM_OFF[] = "opti-zoom-off";
439 const char QCameraParameters::OPTI_ZOOM_ON[] = "opti-zoom-on";
440
441 // Values for Still More setting.
442 const char QCameraParameters::STILL_MORE_OFF[] = "still-more-off";
443 const char QCameraParameters::STILL_MORE_ON[] = "still-more-on";
444
445 // Values for HDR mode setting.
446 const char QCameraParameters::HDR_MODE_SENSOR[] = "hdr-mode-sensor";
447 const char QCameraParameters::HDR_MODE_MULTI_FRAME[] = "hdr-mode-multiframe";
448
449 // Values for True Portrait setting.
450 const char QCameraParameters::TRUE_PORTRAIT_OFF[] = "true-portrait-off";
451 const char QCameraParameters::TRUE_PORTRAIT_ON[] = "true-portrait-on";
452
453 // Values for FLIP settings.
454 const char QCameraParameters::FLIP_MODE_OFF[] = "off";
455 const char QCameraParameters::FLIP_MODE_V[] = "flip-v";
456 const char QCameraParameters::FLIP_MODE_H[] = "flip-h";
457 const char QCameraParameters::FLIP_MODE_VH[] = "flip-vh";
458
459 const char QCameraParameters::CDS_MODE_OFF[] = "off";
460 const char QCameraParameters::CDS_MODE_ON[] = "on";
461 const char QCameraParameters::CDS_MODE_AUTO[] = "auto";
462
463 // Values for video rotation settings.
464 const char QCameraParameters::VIDEO_ROTATION_0[] = "0";
465 const char QCameraParameters::VIDEO_ROTATION_90[] = "90";
466 const char QCameraParameters::VIDEO_ROTATION_180[] = "180";
467 const char QCameraParameters::VIDEO_ROTATION_270[] = "270";
468
469 const char QCameraParameters::KEY_QC_SUPPORTED_MANUAL_FOCUS_MODES[] = "manual-focus-modes";
470 const char QCameraParameters::KEY_QC_SUPPORTED_MANUAL_EXPOSURE_MODES[] = "manual-exposure-modes";
471 const char QCameraParameters::KEY_QC_SUPPORTED_MANUAL_WB_MODES[] = "manual-wb-modes";
472 const char QCameraParameters::KEY_QC_FOCUS_SCALE_MODE[] = "scale-mode";
473 const char QCameraParameters::KEY_QC_FOCUS_DIOPTER_MODE[] = "diopter-mode";
474 const char QCameraParameters::KEY_QC_ISO_PRIORITY[] = "iso-priority";
475 const char QCameraParameters::KEY_QC_EXP_TIME_PRIORITY[] = "exp-time-priority";
476 const char QCameraParameters::KEY_QC_USER_SETTING[] = "user-setting";
477 const char QCameraParameters::KEY_QC_WB_CCT_MODE[] = "color-temperature";
478 const char QCameraParameters::KEY_QC_WB_GAIN_MODE[] = "rbgb-gains";
479 const char QCameraParameters::KEY_QC_NOISE_REDUCTION_MODE[] = "noise-reduction-mode";
480 const char QCameraParameters::KEY_QC_NOISE_REDUCTION_MODE_VALUES[] = "noise-reduction-mode-values";
481
482 #ifdef TARGET_TS_MAKEUP
483 const char QCameraParameters::KEY_TS_MAKEUP[] = "tsmakeup";
484 const char QCameraParameters::KEY_TS_MAKEUP_WHITEN[] = "tsmakeup_whiten";
485 const char QCameraParameters::KEY_TS_MAKEUP_CLEAN[] = "tsmakeup_clean";
486 #endif
487
488 //KEY to share HFR batch size with video encoder.
489 const char QCameraParameters::KEY_QC_VIDEO_BATCH_SIZE[] = "video-batch-size";
490
491 static const char* portrait = "portrait";
492 static const char* landscape = "landscape";
493
494 const cam_dimension_t QCameraParameters::THUMBNAIL_SIZES_MAP[] = {
495 { 256, 154 }, //1.66233
496 { 240, 160 }, //1.5
497 { 320, 320 }, //1.0
498 { 320, 240 }, //1.33333
499 { 256, 144 }, //1.777778
500 { 240, 144 }, //1.666667
501 { 176, 144 }, //1.222222
502 /*Thumbnail sizes to match portrait picture size aspect ratio*/
503 { 240, 320 }, //to match 480X640 & 240X320 picture size
504 { 144, 176 }, //to match 144X176 picture size
505 { 0, 0 } // required by Android SDK
506 };
507
508 const QCameraParameters::QCameraMap<cam_auto_exposure_mode_type>
509 QCameraParameters::AUTO_EXPOSURE_MAP[] = {
510 { AUTO_EXPOSURE_FRAME_AVG, CAM_AEC_MODE_FRAME_AVERAGE },
511 { AUTO_EXPOSURE_CENTER_WEIGHTED, CAM_AEC_MODE_CENTER_WEIGHTED },
512 { AUTO_EXPOSURE_SPOT_METERING, CAM_AEC_MODE_SPOT_METERING },
513 { AUTO_EXPOSURE_SMART_METERING, CAM_AEC_MODE_SMART_METERING },
514 { AUTO_EXPOSURE_USER_METERING, CAM_AEC_MODE_USER_METERING },
515 { AUTO_EXPOSURE_SPOT_METERING_ADV, CAM_AEC_MODE_SPOT_METERING_ADV },
516 { AUTO_EXPOSURE_CENTER_WEIGHTED_ADV, CAM_AEC_MODE_CENTER_WEIGHTED_ADV },
517 };
518
519 const QCameraParameters::QCameraMap<cam_aec_convergence_type>
520 QCameraParameters::INSTANT_AEC_MODES_MAP[] = {
521 { KEY_QC_INSTANT_AEC_DISABLE, CAM_AEC_NORMAL_CONVERGENCE },
522 { KEY_QC_INSTANT_AEC_AGGRESSIVE_AEC, CAM_AEC_AGGRESSIVE_CONVERGENCE },
523 { KEY_QC_INSTANT_AEC_FAST_AEC, CAM_AEC_FAST_CONVERGENCE },
524 };
525
526 const QCameraParameters::QCameraMap<cam_aec_convergence_type>
527 QCameraParameters::INSTANT_CAPTURE_MODES_MAP[] = {
528 { KEY_QC_INSTANT_CAPTURE_DISABLE, CAM_AEC_NORMAL_CONVERGENCE },
529 { KEY_QC_INSTANT_CAPTURE_AGGRESSIVE_AEC, CAM_AEC_AGGRESSIVE_CONVERGENCE },
530 { KEY_QC_INSTANT_CAPTURE_FAST_AEC, CAM_AEC_FAST_CONVERGENCE },
531 };
532
533 const QCameraParameters::QCameraMap<cam_format_t>
534 QCameraParameters::PREVIEW_FORMATS_MAP[] = {
535 {PIXEL_FORMAT_YUV420SP, CAM_FORMAT_YUV_420_NV21},
536 {PIXEL_FORMAT_YUV420P, CAM_FORMAT_YUV_420_YV12},
537 {PIXEL_FORMAT_YUV420SP_ADRENO, CAM_FORMAT_YUV_420_NV21_ADRENO},
538 {PIXEL_FORMAT_YV12, CAM_FORMAT_YUV_420_YV12},
539 {PIXEL_FORMAT_NV12, CAM_FORMAT_YUV_420_NV12},
540 {QC_PIXEL_FORMAT_NV12_VENUS, CAM_FORMAT_YUV_420_NV12_VENUS}
541 };
542
543 const QCameraParameters::QCameraMap<cam_format_t>
544 QCameraParameters::PICTURE_TYPES_MAP[] = {
545 {PIXEL_FORMAT_JPEG, CAM_FORMAT_JPEG},
546 {PIXEL_FORMAT_YUV420SP, CAM_FORMAT_YUV_420_NV21},
547 {PIXEL_FORMAT_YUV422SP, CAM_FORMAT_YUV_422_NV16},
548 {QC_PIXEL_FORMAT_YUV_RAW_8BIT_YUYV, CAM_FORMAT_YUV_RAW_8BIT_YUYV},
549 {QC_PIXEL_FORMAT_YUV_RAW_8BIT_YVYU, CAM_FORMAT_YUV_RAW_8BIT_YVYU},
550 {QC_PIXEL_FORMAT_YUV_RAW_8BIT_UYVY, CAM_FORMAT_YUV_RAW_8BIT_UYVY},
551 {QC_PIXEL_FORMAT_YUV_RAW_8BIT_VYUY, CAM_FORMAT_YUV_RAW_8BIT_VYUY},
552 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GBRG, CAM_FORMAT_BAYER_QCOM_RAW_8BPP_GBRG},
553 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GRBG, CAM_FORMAT_BAYER_QCOM_RAW_8BPP_GRBG},
554 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8RGGB, CAM_FORMAT_BAYER_QCOM_RAW_8BPP_RGGB},
555 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8BGGR, CAM_FORMAT_BAYER_QCOM_RAW_8BPP_BGGR},
556 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GBRG, CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GBRG},
557 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GRBG, CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GRBG},
558 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10RGGB, CAM_FORMAT_BAYER_QCOM_RAW_10BPP_RGGB},
559 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10BGGR, CAM_FORMAT_BAYER_QCOM_RAW_10BPP_BGGR},
560 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GBRG, CAM_FORMAT_BAYER_QCOM_RAW_12BPP_GBRG},
561 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GRBG, CAM_FORMAT_BAYER_QCOM_RAW_12BPP_GRBG},
562 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12RGGB, CAM_FORMAT_BAYER_QCOM_RAW_12BPP_RGGB},
563 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12BGGR, CAM_FORMAT_BAYER_QCOM_RAW_12BPP_BGGR},
564 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14GBRG, CAM_FORMAT_BAYER_QCOM_RAW_14BPP_GBRG},
565 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14GRBG, CAM_FORMAT_BAYER_QCOM_RAW_14BPP_GRBG},
566 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14RGGB, CAM_FORMAT_BAYER_QCOM_RAW_14BPP_RGGB},
567 {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14BGGR, CAM_FORMAT_BAYER_QCOM_RAW_14BPP_BGGR},
568 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GBRG, CAM_FORMAT_BAYER_MIPI_RAW_8BPP_GBRG},
569 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GRBG, CAM_FORMAT_BAYER_MIPI_RAW_8BPP_GRBG},
570 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8RGGB, CAM_FORMAT_BAYER_MIPI_RAW_8BPP_RGGB},
571 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8BGGR, CAM_FORMAT_BAYER_MIPI_RAW_8BPP_BGGR},
572 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GBRG, CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG},
573 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GRBG, CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GRBG},
574 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10RGGB, CAM_FORMAT_BAYER_MIPI_RAW_10BPP_RGGB},
575 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10BGGR, CAM_FORMAT_BAYER_MIPI_RAW_10BPP_BGGR},
576 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GBRG, CAM_FORMAT_BAYER_MIPI_RAW_12BPP_GBRG},
577 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GRBG, CAM_FORMAT_BAYER_MIPI_RAW_12BPP_GRBG},
578 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12RGGB, CAM_FORMAT_BAYER_MIPI_RAW_12BPP_RGGB},
579 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12BGGR, CAM_FORMAT_BAYER_MIPI_RAW_12BPP_BGGR},
580 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14GBRG, CAM_FORMAT_BAYER_MIPI_RAW_14BPP_GBRG},
581 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14GRBG, CAM_FORMAT_BAYER_MIPI_RAW_14BPP_GRBG},
582 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14RGGB, CAM_FORMAT_BAYER_MIPI_RAW_14BPP_RGGB},
583 {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14BGGR, CAM_FORMAT_BAYER_MIPI_RAW_14BPP_BGGR},
584 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_GBRG},
585 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_GRBG},
586 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_RGGB},
587 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_BGGR},
588 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_GBRG},
589 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_GRBG},
590 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_RGGB},
591 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_BGGR},
592 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_GBRG},
593 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_GRBG},
594 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_RGGB},
595 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_BGGR},
596 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_14BPP_GBRG},
597 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_14BPP_GRBG},
598 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_14BPP_RGGB},
599 {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_14BPP_BGGR},
600 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_GBRG},
601 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_GRBG},
602 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_RGGB},
603 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_BGGR},
604 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_GBRG},
605 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_GRBG},
606 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_RGGB},
607 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_BGGR},
608 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_GBRG},
609 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_GRBG},
610 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_RGGB},
611 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_BGGR},
612 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_14BPP_GBRG},
613 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_14BPP_GRBG},
614 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_14BPP_RGGB},
615 {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_14BPP_BGGR},
616 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_GBRG},
617 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_GRBG},
618 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_RGGB},
619 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_BGGR},
620 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_GBRG},
621 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_GRBG},
622 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_RGGB},
623 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_BGGR},
624 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_GBRG},
625 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_GRBG},
626 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_RGGB},
627 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_BGGR},
628 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_GBRG},
629 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_GRBG},
630 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_RGGB},
631 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_BGGR},
632 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_14BPP_GBRG},
633 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_14BPP_GRBG},
634 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_14BPP_RGGB},
635 {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_14BPP_BGGR}
636 };
637
638 const QCameraParameters::QCameraMap<cam_focus_mode_type>
639 QCameraParameters::FOCUS_MODES_MAP[] = {
640 { FOCUS_MODE_AUTO, CAM_FOCUS_MODE_AUTO },
641 { FOCUS_MODE_INFINITY, CAM_FOCUS_MODE_INFINITY },
642 { FOCUS_MODE_MACRO, CAM_FOCUS_MODE_MACRO },
643 { FOCUS_MODE_FIXED, CAM_FOCUS_MODE_FIXED },
644 { FOCUS_MODE_EDOF, CAM_FOCUS_MODE_EDOF },
645 { FOCUS_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
646 { FOCUS_MODE_CONTINUOUS_VIDEO, CAM_FOCUS_MODE_CONTINOUS_VIDEO },
647 { FOCUS_MODE_MANUAL_POSITION, CAM_FOCUS_MODE_MANUAL},
648 };
649
650 const QCameraParameters::QCameraMap<cam_effect_mode_type>
651 QCameraParameters::EFFECT_MODES_MAP[] = {
652 { EFFECT_NONE, CAM_EFFECT_MODE_OFF },
653 { EFFECT_MONO, CAM_EFFECT_MODE_MONO },
654 { EFFECT_NEGATIVE, CAM_EFFECT_MODE_NEGATIVE },
655 { EFFECT_SOLARIZE, CAM_EFFECT_MODE_SOLARIZE },
656 { EFFECT_SEPIA, CAM_EFFECT_MODE_SEPIA },
657 { EFFECT_POSTERIZE, CAM_EFFECT_MODE_POSTERIZE },
658 { EFFECT_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
659 { EFFECT_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
660 { EFFECT_AQUA, CAM_EFFECT_MODE_AQUA },
661 { EFFECT_EMBOSS, CAM_EFFECT_MODE_EMBOSS },
662 { EFFECT_SKETCH, CAM_EFFECT_MODE_SKETCH },
663 { EFFECT_NEON, CAM_EFFECT_MODE_NEON },
664 { EFFECT_BEAUTY, CAM_EFFECT_MODE_BEAUTY }
665 };
666
667 const QCameraParameters::QCameraMap<cam_scene_mode_type>
668 QCameraParameters::SCENE_MODES_MAP[] = {
669 { SCENE_MODE_AUTO, CAM_SCENE_MODE_OFF },
670 { SCENE_MODE_ACTION, CAM_SCENE_MODE_ACTION },
671 { SCENE_MODE_PORTRAIT, CAM_SCENE_MODE_PORTRAIT },
672 { SCENE_MODE_LANDSCAPE, CAM_SCENE_MODE_LANDSCAPE },
673 { SCENE_MODE_NIGHT, CAM_SCENE_MODE_NIGHT },
674 { SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
675 { SCENE_MODE_THEATRE, CAM_SCENE_MODE_THEATRE },
676 { SCENE_MODE_BEACH, CAM_SCENE_MODE_BEACH },
677 { SCENE_MODE_SNOW, CAM_SCENE_MODE_SNOW },
678 { SCENE_MODE_SUNSET, CAM_SCENE_MODE_SUNSET },
679 { SCENE_MODE_STEADYPHOTO, CAM_SCENE_MODE_ANTISHAKE },
680 { SCENE_MODE_FIREWORKS , CAM_SCENE_MODE_FIREWORKS },
681 { SCENE_MODE_SPORTS , CAM_SCENE_MODE_SPORTS },
682 { SCENE_MODE_PARTY, CAM_SCENE_MODE_PARTY },
683 { SCENE_MODE_CANDLELIGHT, CAM_SCENE_MODE_CANDLELIGHT },
684 { SCENE_MODE_ASD, CAM_SCENE_MODE_AUTO },
685 { SCENE_MODE_BACKLIGHT, CAM_SCENE_MODE_BACKLIGHT },
686 { SCENE_MODE_FLOWERS, CAM_SCENE_MODE_FLOWERS },
687 { SCENE_MODE_AR, CAM_SCENE_MODE_AR },
688 { SCENE_MODE_HDR, CAM_SCENE_MODE_HDR },
689 };
690
691 const QCameraParameters::QCameraMap<cam_flash_mode_t>
692 QCameraParameters::FLASH_MODES_MAP[] = {
693 { FLASH_MODE_OFF, CAM_FLASH_MODE_OFF },
694 { FLASH_MODE_AUTO, CAM_FLASH_MODE_AUTO },
695 { FLASH_MODE_ON, CAM_FLASH_MODE_ON },
696 { FLASH_MODE_TORCH, CAM_FLASH_MODE_TORCH }
697 };
698
699 const QCameraParameters::QCameraMap<cam_focus_algorithm_type>
700 QCameraParameters::FOCUS_ALGO_MAP[] = {
701 { FOCUS_ALGO_AUTO, CAM_FOCUS_ALGO_AUTO },
702 { FOCUS_ALGO_SPOT_METERING, CAM_FOCUS_ALGO_SPOT },
703 { FOCUS_ALGO_CENTER_WEIGHTED, CAM_FOCUS_ALGO_CENTER_WEIGHTED },
704 { FOCUS_ALGO_FRAME_AVERAGE, CAM_FOCUS_ALGO_AVERAGE }
705 };
706
707 const QCameraParameters::QCameraMap<cam_wb_mode_type>
708 QCameraParameters::WHITE_BALANCE_MODES_MAP[] = {
709 { WHITE_BALANCE_AUTO, CAM_WB_MODE_AUTO },
710 { WHITE_BALANCE_INCANDESCENT, CAM_WB_MODE_INCANDESCENT },
711 { WHITE_BALANCE_FLUORESCENT, CAM_WB_MODE_FLUORESCENT },
712 { WHITE_BALANCE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
713 { WHITE_BALANCE_DAYLIGHT, CAM_WB_MODE_DAYLIGHT },
714 { WHITE_BALANCE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
715 { WHITE_BALANCE_TWILIGHT, CAM_WB_MODE_TWILIGHT },
716 { WHITE_BALANCE_SHADE, CAM_WB_MODE_SHADE },
717 { WHITE_BALANCE_MANUAL, CAM_WB_MODE_MANUAL},
718 };
719
720 const QCameraParameters::QCameraMap<cam_antibanding_mode_type>
721 QCameraParameters::ANTIBANDING_MODES_MAP[] = {
722 { ANTIBANDING_OFF, CAM_ANTIBANDING_MODE_OFF },
723 { ANTIBANDING_50HZ, CAM_ANTIBANDING_MODE_50HZ },
724 { ANTIBANDING_60HZ, CAM_ANTIBANDING_MODE_60HZ },
725 { ANTIBANDING_AUTO, CAM_ANTIBANDING_MODE_AUTO }
726 };
727
728 const QCameraParameters::QCameraMap<cam_iso_mode_type>
729 QCameraParameters::ISO_MODES_MAP[] = {
730 { ISO_AUTO, CAM_ISO_MODE_AUTO },
731 { ISO_HJR, CAM_ISO_MODE_DEBLUR },
732 { ISO_100, CAM_ISO_MODE_100 },
733 { ISO_200, CAM_ISO_MODE_200 },
734 { ISO_400, CAM_ISO_MODE_400 },
735 { ISO_800, CAM_ISO_MODE_800 },
736 { ISO_1600, CAM_ISO_MODE_1600 },
737 { ISO_3200, CAM_ISO_MODE_3200 }
738 };
739
740 const QCameraParameters::QCameraMap<cam_hfr_mode_t>
741 QCameraParameters::HFR_MODES_MAP[] = {
742 { VIDEO_HFR_OFF, CAM_HFR_MODE_OFF },
743 { VIDEO_HFR_2X, CAM_HFR_MODE_60FPS },
744 { VIDEO_HFR_3X, CAM_HFR_MODE_90FPS },
745 { VIDEO_HFR_4X, CAM_HFR_MODE_120FPS },
746 { VIDEO_HFR_5X, CAM_HFR_MODE_150FPS },
747 { VIDEO_HFR_6X, CAM_HFR_MODE_180FPS },
748 { VIDEO_HFR_7X, CAM_HFR_MODE_210FPS },
749 { VIDEO_HFR_8X, CAM_HFR_MODE_240FPS },
750 { VIDEO_HFR_9X, CAM_HFR_MODE_480FPS }
751 };
752
753 const QCameraParameters::QCameraMap<cam_bracket_mode>
754 QCameraParameters::BRACKETING_MODES_MAP[] = {
755 { AE_BRACKET_OFF, CAM_EXP_BRACKETING_OFF },
756 { AE_BRACKET, CAM_EXP_BRACKETING_ON }
757 };
758
759 const QCameraParameters::QCameraMap<int>
760 QCameraParameters::ON_OFF_MODES_MAP[] = {
761 { VALUE_OFF, 0 },
762 { VALUE_ON, 1 }
763 };
764
765 const QCameraParameters::QCameraMap<int>
766 QCameraParameters::TOUCH_AF_AEC_MODES_MAP[] = {
767 { QCameraParameters::TOUCH_AF_AEC_OFF, 0 },
768 { QCameraParameters::TOUCH_AF_AEC_ON, 1 }
769 };
770
771 const QCameraParameters::QCameraMap<int>
772 QCameraParameters::ENABLE_DISABLE_MODES_MAP[] = {
773 { VALUE_ENABLE, 1 },
774 { VALUE_DISABLE, 0 }
775 };
776
777 const QCameraParameters::QCameraMap<int>
778 QCameraParameters::DENOISE_ON_OFF_MODES_MAP[] = {
779 { DENOISE_OFF, 0 },
780 { DENOISE_ON, 1 }
781 };
782
783 const QCameraParameters::QCameraMap<int>
784 QCameraParameters::TRUE_FALSE_MODES_MAP[] = {
785 { VALUE_FALSE, 0},
786 { VALUE_TRUE, 1}
787 };
788
789 const QCameraParameters::QCameraMap<cam_flip_t>
790 QCameraParameters::FLIP_MODES_MAP[] = {
791 {FLIP_MODE_OFF, FLIP_NONE},
792 {FLIP_MODE_V, FLIP_V},
793 {FLIP_MODE_H, FLIP_H},
794 {FLIP_MODE_VH, FLIP_V_H}
795 };
796
797 const QCameraParameters::QCameraMap<int>
798 QCameraParameters::AF_BRACKETING_MODES_MAP[] = {
799 { AF_BRACKET_OFF, 0 },
800 { AF_BRACKET_ON, 1 }
801 };
802
803 const QCameraParameters::QCameraMap<int>
804 QCameraParameters::RE_FOCUS_MODES_MAP[] = {
805 { RE_FOCUS_OFF, 0 },
806 { RE_FOCUS_ON, 1 }
807 };
808
809 const QCameraParameters::QCameraMap<int>
810 QCameraParameters::CHROMA_FLASH_MODES_MAP[] = {
811 { CHROMA_FLASH_OFF, 0 },
812 { CHROMA_FLASH_ON, 1 }
813 };
814
815 const QCameraParameters::QCameraMap<int>
816 QCameraParameters::OPTI_ZOOM_MODES_MAP[] = {
817 { OPTI_ZOOM_OFF, 0 },
818 { OPTI_ZOOM_ON, 1 }
819 };
820
821 const QCameraParameters::QCameraMap<int>
822 QCameraParameters::TRUE_PORTRAIT_MODES_MAP[] = {
823 { TRUE_PORTRAIT_OFF, 0 },
824 { TRUE_PORTRAIT_ON, 1 }
825 };
826
827 const QCameraParameters::QCameraMap<int>
828 QCameraParameters::STILL_MORE_MODES_MAP[] = {
829 { STILL_MORE_OFF, 0 },
830 { STILL_MORE_ON, 1 }
831 };
832
833 const QCameraParameters::QCameraMap<cam_cds_mode_type_t>
834 QCameraParameters::CDS_MODES_MAP[] = {
835 { CDS_MODE_OFF, CAM_CDS_MODE_OFF },
836 { CDS_MODE_ON, CAM_CDS_MODE_ON },
837 { CDS_MODE_AUTO, CAM_CDS_MODE_AUTO}
838 };
839
840 const QCameraParameters::QCameraMap<int>
841 QCameraParameters::HDR_MODES_MAP[] = {
842 { HDR_MODE_SENSOR, 0 },
843 { HDR_MODE_MULTI_FRAME, 1 }
844 };
845
846 const QCameraParameters::QCameraMap<int>
847 QCameraParameters::VIDEO_ROTATION_MODES_MAP[] = {
848 { VIDEO_ROTATION_0, 0 },
849 { VIDEO_ROTATION_90, 90 },
850 { VIDEO_ROTATION_180, 180 },
851 { VIDEO_ROTATION_270, 270 }
852 };
853
854 const QCameraParameters::QCameraMap<int>
855 QCameraParameters::NOISE_REDUCTION_MODES_MAP[] = {
856 { VALUE_OFF, 0 },
857 { VALUE_FAST, 1 },
858 { VALUE_HIGH_QUALITY, 2 }
859 };
860
861 #define DEFAULT_CAMERA_AREA "(0, 0, 0, 0, 0)"
862 #define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
863 #define TOTAL_RAM_SIZE_512MB 536870912
864 #define PARAM_MAP_SIZE(MAP) (sizeof(MAP)/sizeof(MAP[0]))
865
866 /*===========================================================================
867 * FUNCTION : isOEMFeat1PropEnabled
868 *
869 * DESCRIPTION: inline function to check from property if custom feature
870 * is enabled
871 *
872 * PARAMETERS : none
873 *
874 * RETURN : boolean true/false
875 *==========================================================================*/
isOEMFeat1PropEnabled()876 static inline bool isOEMFeat1PropEnabled()
877 {
878 char value[PROPERTY_VALUE_MAX];
879 property_get("persist.camera.imglib.oemfeat1", value, "0");
880 return atoi(value) > 0 ? true : false;
881 }
882
883 /*===========================================================================
884 * FUNCTION : QCameraParameters
885 *
886 * DESCRIPTION: default constructor of QCameraParameters
887 *
888 * PARAMETERS : none
889 *
890 * RETURN : None
891 *==========================================================================*/
QCameraParameters()892 QCameraParameters::QCameraParameters()
893 : CameraParameters(),
894 m_reprocScaleParam(),
895 mCommon(),
896 m_pCapability(NULL),
897 m_pCamOpsTbl(NULL),
898 m_pParamHeap(NULL),
899 m_pParamBuf(NULL),
900 m_pRelCamSyncHeap(NULL),
901 m_pRelCamSyncBuf(NULL),
902 m_bFrameSyncEnabled(false),
903 mIsType(IS_TYPE_NONE),
904 m_bZslMode(false),
905 m_bZslMode_new(false),
906 m_bForceZslMode(false),
907 m_bRecordingHint(false),
908 m_bRecordingHint_new(false),
909 m_bHistogramEnabled(false),
910 m_bLongshotEnabled(false),
911 m_nFaceProcMask(0),
912 m_bFaceDetectionOn(0),
913 m_bDebugFps(false),
914 mFocusMode(CAM_FOCUS_MODE_MAX),
915 mPreviewFormat(CAM_FORMAT_YUV_420_NV21),
916 mAppPreviewFormat(CAM_FORMAT_YUV_420_NV21),
917 mPictureFormat(CAM_FORMAT_JPEG),
918 m_bNeedRestart(false),
919 m_bNoDisplayMode(false),
920 m_bWNROn(false),
921 m_bTNRPreviewOn(false),
922 m_bTNRVideoOn(false),
923 m_bTNRSnapshotOn(false),
924 m_bInited(false),
925 m_nRetroBurstNum(0),
926 m_nBurstLEDOnPeriod(100),
927 m_bUpdateEffects(false),
928 m_bSceneTransitionAuto(false),
929 m_bPreviewFlipChanged(false),
930 m_bVideoFlipChanged(false),
931 m_bSnapshotFlipChanged(false),
932 m_bFixedFrameRateSet(false),
933 m_bHDREnabled(false),
934 m_bLocalHDREnabled(false),
935 m_bAVTimerEnabled(false),
936 m_bDISEnabled(false),
937 m_MobiMask(0),
938 m_AdjustFPS(NULL),
939 m_bHDR1xFrameEnabled(false),
940 m_HDRSceneEnabled(false),
941 m_bHDRThumbnailProcessNeeded(false),
942 m_bHDR1xExtraBufferNeeded(true),
943 m_bHDROutputCropEnabled(false),
944 m_tempMap(),
945 m_bAFBracketingOn(false),
946 m_bReFocusOn(false),
947 m_bChromaFlashOn(false),
948 m_bOptiZoomOn(false),
949 m_bSceneSelection(false),
950 m_SelectedScene(CAM_SCENE_MODE_MAX),
951 m_bSeeMoreOn(false),
952 m_bStillMoreOn(false),
953 m_bHighQualityNoiseReductionMode(false),
954 m_bHfrMode(false),
955 m_bSensorHDREnabled(false),
956 m_bRdiMode(false),
957 m_bSecureMode(false),
958 m_bAeBracketingEnabled(false),
959 mFlashValue(CAM_FLASH_MODE_OFF),
960 mFlashDaemonValue(CAM_FLASH_MODE_OFF),
961 mHfrMode(CAM_HFR_MODE_OFF),
962 m_bHDRModeSensor(true),
963 mOfflineRAW(false),
964 m_bTruePortraitOn(false),
965 m_bIsLowMemoryDevice(false),
966 mCds_mode(CAM_CDS_MODE_OFF),
967 m_LLCaptureEnabled(FALSE),
968 m_LowLightLevel(CAM_LOW_LIGHT_OFF),
969 m_bLtmForSeeMoreEnabled(false),
970 m_expTime(0),
971 m_isoValue(0),
972 m_ManualCaptureMode(CAM_MANUAL_CAPTURE_TYPE_OFF),
973 m_dualLedCalibration(0),
974 m_bInstantAEC(false),
975 m_bInstantCapture(false),
976 mAecFrameBound(0),
977 mAecSkipDisplayFrameBound(0)
978 {
979 char value[PROPERTY_VALUE_MAX];
980 // TODO: may move to parameter instead of sysprop
981 property_get("persist.debug.sf.showfps", value, "0");
982 m_bDebugFps = atoi(value) > 0 ? true : false;
983
984 // For thermal mode, it should be set as system property
985 // because system property applies to all applications, while
986 // parameters only apply to specific app.
987 property_get("persist.camera.thermal.mode", value, "fps");
988 if (!strcmp(value, "frameskip")) {
989 m_ThermalMode = QCAMERA_THERMAL_ADJUST_FRAMESKIP;
990 } else {
991 if (strcmp(value, "fps"))
992 LOGW("Invalid camera thermal mode %s", value);
993 m_ThermalMode = QCAMERA_THERMAL_ADJUST_FPS;
994 }
995
996 memset(value, 0, sizeof(value));
997 // As per Power/Quality evaluation, LTM is enabled by default in SeeMore/StillMore usecase
998 // to improve the quality as there is no much impact to power
999 property_get("persist.camera.ltmforseemore", value, "1");
1000 m_bLtmForSeeMoreEnabled = atoi(value);
1001
1002 memset(&m_LiveSnapshotSize, 0, sizeof(m_LiveSnapshotSize));
1003 memset(&m_default_fps_range, 0, sizeof(m_default_fps_range));
1004 memset(&m_hfrFpsRange, 0, sizeof(m_hfrFpsRange));
1005 memset(&m_stillmore_config, 0, sizeof(cam_still_more_t));
1006 memset(&m_captureFrameConfig, 0, sizeof(cam_capture_frame_config_t));
1007 memset(&m_relCamSyncInfo, 0, sizeof(cam_sync_related_sensors_event_info_t));
1008 mTotalPPCount = 1;
1009 mZoomLevel = 0;
1010 mParmZoomLevel = 0;
1011 mCurPPCount = 0;
1012 mBufBatchCnt = 0;
1013 mRotation = 0;
1014 mJpegRotation = 0;
1015 mVideoBatchSize = 0;
1016 m_bOEMFeatEnabled = isOEMFeat1PropEnabled();
1017 }
1018
1019 /*===========================================================================
1020 * FUNCTION : QCameraParameters
1021 *
1022 * DESCRIPTION: constructor of QCameraParameters
1023 *
1024 * PARAMETERS :
1025 * @params : parameters in string
1026 *
1027 * RETURN : None
1028 *==========================================================================*/
QCameraParameters(const String8 & params)1029 QCameraParameters::QCameraParameters(const String8 ¶ms)
1030 : CameraParameters(params),
1031 m_reprocScaleParam(),
1032 m_pCapability(NULL),
1033 m_pCamOpsTbl(NULL),
1034 m_pParamHeap(NULL),
1035 m_pParamBuf(NULL),
1036 m_pRelCamSyncHeap(NULL),
1037 m_pRelCamSyncBuf(NULL),
1038 m_bFrameSyncEnabled(false),
1039 m_bZslMode(false),
1040 m_bZslMode_new(false),
1041 m_bForceZslMode(false),
1042 m_bRecordingHint(false),
1043 m_bRecordingHint_new(false),
1044 m_bHistogramEnabled(false),
1045 m_bLongshotEnabled(false),
1046 m_nFaceProcMask(0),
1047 m_bDebugFps(false),
1048 mFocusMode(CAM_FOCUS_MODE_MAX),
1049 mPreviewFormat(CAM_FORMAT_YUV_420_NV21),
1050 mAppPreviewFormat(CAM_FORMAT_YUV_420_NV21),
1051 mPictureFormat(CAM_FORMAT_JPEG),
1052 m_bNeedRestart(false),
1053 m_bNoDisplayMode(false),
1054 m_bWNROn(false),
1055 m_bTNRPreviewOn(false),
1056 m_bTNRVideoOn(false),
1057 m_bTNRSnapshotOn(false),
1058 m_bInited(false),
1059 m_nRetroBurstNum(0),
1060 m_nBurstLEDOnPeriod(100),
1061 m_bPreviewFlipChanged(false),
1062 m_bVideoFlipChanged(false),
1063 m_bSnapshotFlipChanged(false),
1064 m_bFixedFrameRateSet(false),
1065 m_bHDREnabled(false),
1066 m_bLocalHDREnabled(false),
1067 m_bAVTimerEnabled(false),
1068 m_AdjustFPS(NULL),
1069 m_bHDR1xFrameEnabled(false),
1070 m_HDRSceneEnabled(false),
1071 m_bHDRThumbnailProcessNeeded(false),
1072 m_bHDR1xExtraBufferNeeded(true),
1073 m_bHDROutputCropEnabled(false),
1074 m_tempMap(),
1075 m_bAFBracketingOn(false),
1076 m_bReFocusOn(false),
1077 m_bChromaFlashOn(false),
1078 m_bOptiZoomOn(false),
1079 m_bSceneSelection(false),
1080 m_SelectedScene(CAM_SCENE_MODE_MAX),
1081 m_bSeeMoreOn(false),
1082 m_bStillMoreOn(false),
1083 m_bHighQualityNoiseReductionMode(false),
1084 m_bHfrMode(false),
1085 m_bSensorHDREnabled(false),
1086 m_bRdiMode(false),
1087 m_bSecureMode(false),
1088 m_bAeBracketingEnabled(false),
1089 mFlashValue(CAM_FLASH_MODE_OFF),
1090 mFlashDaemonValue(CAM_FLASH_MODE_OFF),
1091 mHfrMode(CAM_HFR_MODE_OFF),
1092 m_bHDRModeSensor(true),
1093 mOfflineRAW(false),
1094 m_bTruePortraitOn(false),
1095 m_bIsLowMemoryDevice(false),
1096 mCds_mode(CAM_CDS_MODE_OFF),
1097 mParmEffect(CAM_EFFECT_MODE_OFF),
1098 m_LLCaptureEnabled(FALSE),
1099 m_LowLightLevel(CAM_LOW_LIGHT_OFF),
1100 m_bLtmForSeeMoreEnabled(false),
1101 m_expTime(0),
1102 m_isoValue(0),
1103 m_ManualCaptureMode(CAM_MANUAL_CAPTURE_TYPE_OFF),
1104 m_dualLedCalibration(0),
1105 m_bInstantAEC(false),
1106 m_bInstantCapture(false),
1107 mAecFrameBound(0),
1108 mAecSkipDisplayFrameBound(0)
1109 {
1110 memset(&m_LiveSnapshotSize, 0, sizeof(m_LiveSnapshotSize));
1111 memset(&m_default_fps_range, 0, sizeof(m_default_fps_range));
1112 memset(&m_hfrFpsRange, 0, sizeof(m_hfrFpsRange));
1113 memset(&m_stillmore_config, 0, sizeof(cam_still_more_t));
1114 memset(&m_relCamSyncInfo, 0, sizeof(cam_sync_related_sensors_event_info_t));
1115 mTotalPPCount = 0;
1116 mZoomLevel = 0;
1117 mParmZoomLevel = 0;
1118 mCurPPCount = 0;
1119 mRotation = 0;
1120 mJpegRotation = 0;
1121 mBufBatchCnt = 0;
1122 mVideoBatchSize = 0;
1123 m_bOEMFeatEnabled = isOEMFeat1PropEnabled();
1124 }
1125
1126 /*===========================================================================
1127 * FUNCTION : ~QCameraParameters
1128 *
1129 * DESCRIPTION: deconstructor of QCameraParameters
1130 *
1131 * PARAMETERS : none
1132 *
1133 * RETURN : None
1134 *==========================================================================*/
~QCameraParameters()1135 QCameraParameters::~QCameraParameters()
1136 {
1137 deinit();
1138 }
1139
1140 /*===========================================================================
1141 * FUNCTION : createSizesString
1142 *
1143 * DESCRIPTION: create string obj contains array of dimensions
1144 *
1145 * PARAMETERS :
1146 * @sizes : array of dimensions
1147 * @len : size of dimension array
1148 *
1149 * RETURN : string obj
1150 *==========================================================================*/
createSizesString(const cam_dimension_t * sizes,size_t len)1151 String8 QCameraParameters::createSizesString(const cam_dimension_t *sizes, size_t len)
1152 {
1153 String8 str;
1154 char buffer[32];
1155
1156 if (len > 0) {
1157 snprintf(buffer, sizeof(buffer), "%dx%d", sizes[0].width, sizes[0].height);
1158 str.append(buffer);
1159 }
1160 for (size_t i = 1; i < len; i++) {
1161 snprintf(buffer, sizeof(buffer), ",%dx%d",
1162 sizes[i].width, sizes[i].height);
1163 str.append(buffer);
1164 }
1165 return str;
1166 }
1167
1168 /*===========================================================================
1169 * FUNCTION : createValuesString
1170 *
1171 * DESCRIPTION: create string obj contains array of values from map when matched
1172 * from input values array
1173 *
1174 * PARAMETERS :
1175 * @values : array of values
1176 * @len : size of values array
1177 * @map : map contains the mapping between values and enums
1178 * @map_len : size of the map
1179 *
1180 * RETURN : string obj
1181 *==========================================================================*/
createValuesString(const valuesType * values,size_t len,const mapType * map,size_t map_len)1182 template <typename valuesType, class mapType> String8 createValuesString(
1183 const valuesType *values, size_t len, const mapType *map, size_t map_len)
1184 {
1185 String8 str;
1186 int count = 0;
1187
1188 for (size_t i = 0; i < len; i++ ) {
1189 for (size_t j = 0; j < map_len; j ++)
1190 if (map[j].val == values[i]) {
1191 if (NULL != map[j].desc) {
1192 if (count > 0) {
1193 str.append(",");
1194 }
1195 str.append(map[j].desc);
1196 count++;
1197 break; //loop j
1198 }
1199 }
1200 }
1201 return str;
1202 }
1203
1204 /*===========================================================================
1205 * FUNCTION : createValuesStringFromMap
1206 *
1207 * DESCRIPTION: create string obj contains array of values directly from map
1208 *
1209 * PARAMETERS :
1210 * @map : map contains the mapping between values and enums
1211 * @map_len : size of the map
1212 *
1213 * RETURN : string obj
1214 *==========================================================================*/
createValuesStringFromMap(const mapType * map,size_t map_len)1215 template <class mapType> String8 createValuesStringFromMap(
1216 const mapType *map, size_t map_len)
1217 {
1218 String8 str;
1219
1220 for (size_t i = 0; i < map_len; i++) {
1221 if (NULL != map[i].desc) {
1222 if (i > 0) {
1223 str.append(",");
1224 }
1225 str.append(map[i].desc);
1226 }
1227 }
1228 return str;
1229 }
1230
1231 /*===========================================================================
1232 * FUNCTION : createZoomRatioValuesString
1233 *
1234 * DESCRIPTION: create string obj contains array of zoom ratio values
1235 *
1236 * PARAMETERS :
1237 * @zoomRaios : array of zoom ratios
1238 * @length : size of the array
1239 *
1240 * RETURN : string obj
1241 *==========================================================================*/
createZoomRatioValuesString(uint32_t * zoomRatios,size_t length)1242 String8 QCameraParameters::createZoomRatioValuesString(uint32_t *zoomRatios,
1243 size_t length)
1244 {
1245 String8 str;
1246 char buffer[32] = {0};
1247
1248 if(length > 0){
1249 snprintf(buffer, sizeof(buffer), "%d", zoomRatios[0]);
1250 str.append(buffer);
1251 }
1252
1253 for (size_t i = 1; i < length; i++) {
1254 memset(buffer, 0, sizeof(buffer));
1255 snprintf(buffer, sizeof(buffer), ",%d", zoomRatios[i]);
1256 str.append(buffer);
1257 }
1258 return str;
1259 }
1260
1261 /*===========================================================================
1262 * FUNCTION : createHfrValuesString
1263 *
1264 * DESCRIPTION: create string obj contains array of hfr values from map when
1265 * matched from input hfr values
1266 *
1267 * PARAMETERS :
1268 * @values : array of hfr info
1269 * @len : size of the array
1270 * @map : map of hfr string value and enum
1271 * map_len : size of map
1272 *
1273 * RETURN : string obj
1274 *==========================================================================*/
createHfrValuesString(const cam_hfr_info_t * values,size_t len,const QCameraMap<cam_hfr_mode_t> * map,size_t map_len)1275 String8 QCameraParameters::createHfrValuesString(const cam_hfr_info_t *values,
1276 size_t len, const QCameraMap<cam_hfr_mode_t> *map, size_t map_len)
1277 {
1278 String8 str;
1279 int count = 0;
1280
1281 char value[PROPERTY_VALUE_MAX];
1282 int8_t batch_count = 0;
1283
1284 property_get("persist.camera.batchcount", value, "0");
1285 batch_count = atoi(value);
1286
1287 for (size_t i = 0; i < len; i++ ) {
1288 for (size_t j = 0; j < map_len; j ++) {
1289 if ((batch_count < CAMERA_MIN_BATCH_COUNT)
1290 && (map[j].val > CAM_HFR_MODE_120FPS)) {
1291 /*TODO: Work around. Need to revert when we have
1292 complete 240fps support*/
1293 break;
1294 }
1295 if (map[j].val == (int)values[i].mode) {
1296 if (NULL != map[j].desc) {
1297 if (count > 0) {
1298 str.append(",");
1299 }
1300 str.append(map[j].desc);
1301 count++;
1302 break; //loop j
1303 }
1304 }
1305 }
1306 }
1307 if (count > 0) {
1308 str.append(",");
1309 }
1310 str.append(VIDEO_HFR_OFF);
1311 return str;
1312 }
1313
1314 /*===========================================================================
1315 * FUNCTION : createHfrSizesString
1316 *
1317 * DESCRIPTION: create string obj contains array of hfr sizes
1318 *
1319 * PARAMETERS :
1320 * @values : array of hfr info
1321 * @len : size of the array
1322 *
1323 * RETURN : string obj
1324 *==========================================================================*/
createHfrSizesString(const cam_hfr_info_t * values,size_t len)1325 String8 QCameraParameters::createHfrSizesString(const cam_hfr_info_t *values, size_t len)
1326 {
1327 String8 str;
1328 char buffer[32];
1329
1330 if (len > 0) {
1331 snprintf(buffer, sizeof(buffer), "%dx%d",
1332 values[0].dim[0].width, values[0].dim[0].height);
1333 str.append(buffer);
1334 }
1335 for (size_t i = 1; i < len; i++) {
1336 snprintf(buffer, sizeof(buffer), ",%dx%d",
1337 values[i].dim[0].width, values[i].dim[0].height);
1338 str.append(buffer);
1339 }
1340 return str;
1341 }
1342
1343 /*===========================================================================
1344 * FUNCTION : createFpsString
1345 *
1346 * DESCRIPTION: create string obj contains array of FPS rates
1347 *
1348 * PARAMETERS :
1349 * @fps : default fps range
1350 *
1351 * RETURN : string obj
1352 *==========================================================================*/
createFpsString(cam_fps_range_t & fps)1353 String8 QCameraParameters::createFpsString(cam_fps_range_t &fps)
1354 {
1355 char buffer[32];
1356 String8 fpsValues;
1357
1358 int min_fps = int(fps.min_fps);
1359 int max_fps = int(fps.max_fps);
1360
1361 if (min_fps < fps.min_fps){
1362 min_fps++;
1363 }
1364 if (max_fps > fps.max_fps) {
1365 max_fps--;
1366 }
1367 if (min_fps <= max_fps) {
1368 snprintf(buffer, sizeof(buffer), "%d", min_fps);
1369 fpsValues.append(buffer);
1370 }
1371
1372 for (int i = min_fps+1; i <= max_fps; i++) {
1373 snprintf(buffer, sizeof(buffer), ",%d", i);
1374 fpsValues.append(buffer);
1375 }
1376
1377 return fpsValues;
1378 }
1379
1380 /*===========================================================================
1381 * FUNCTION : createFpsRangeString
1382 *
1383 * DESCRIPTION: create string obj contains array of FPS ranges
1384 *
1385 * PARAMETERS :
1386 * @fps : array of fps ranges
1387 * @len : size of the array
1388 * @default_fps_index : reference to index of default fps range
1389 *
1390 * RETURN : string obj
1391 *==========================================================================*/
createFpsRangeString(const cam_fps_range_t * fps,size_t len,int & default_fps_index)1392 String8 QCameraParameters::createFpsRangeString(const cam_fps_range_t* fps,
1393 size_t len, int &default_fps_index)
1394 {
1395 String8 str;
1396 char buffer[32];
1397 int max_range = 0;
1398 int min_fps, max_fps;
1399
1400 if (len > 0) {
1401 min_fps = int(fps[0].min_fps * 1000);
1402 max_fps = int(fps[0].max_fps * 1000);
1403 max_range = max_fps - min_fps;
1404 default_fps_index = 0;
1405 snprintf(buffer, sizeof(buffer), "(%d,%d)", min_fps, max_fps);
1406 str.append(buffer);
1407 }
1408 for (size_t i = 1; i < len; i++) {
1409 min_fps = int(fps[i].min_fps * 1000);
1410 max_fps = int(fps[i].max_fps * 1000);
1411 if (max_range < (max_fps - min_fps)) {
1412 max_range = max_fps - min_fps;
1413 default_fps_index = (int)i;
1414 }
1415 snprintf(buffer, sizeof(buffer), ",(%d,%d)", min_fps, max_fps);
1416 str.append(buffer);
1417 }
1418 return str;
1419 }
1420
1421 /*===========================================================================
1422 * FUNCTION : lookupAttr
1423 *
1424 * DESCRIPTION: lookup a value by its name
1425 *
1426 * PARAMETERS :
1427 * @attr : map contains <name, value>
1428 * @len : size of the map
1429 * @name : name to be looked up
1430 *
1431 * RETURN : valid value if found
1432 * NAME_NOT_FOUND if not found
1433 *==========================================================================*/
lookupAttr(const mapType * arr,size_t len,const char * name)1434 template <class mapType> int lookupAttr(const mapType *arr,
1435 size_t len, const char *name)
1436 {
1437 if (name) {
1438 for (size_t i = 0; i < len; i++) {
1439 if (!strcmp(arr[i].desc, name))
1440 return arr[i].val;
1441 }
1442 }
1443 return NAME_NOT_FOUND;
1444 }
1445
1446 /*===========================================================================
1447 * FUNCTION : lookupNameByValue
1448 *
1449 * DESCRIPTION: lookup a name by its value
1450 *
1451 * PARAMETERS :
1452 * @attr : map contains <name, value>
1453 * @len : size of the map
1454 * @value : value to be looked up
1455 *
1456 * RETURN : name str or NULL if not found
1457 *==========================================================================*/
lookupNameByValue(const mapType * arr,size_t len,int value)1458 template <class mapType> const char *lookupNameByValue(const mapType *arr,
1459 size_t len, int value)
1460 {
1461 for (size_t i = 0; i < len; i++) {
1462 if (arr[i].val == value) {
1463 return arr[i].desc;
1464 }
1465 }
1466 return NULL;
1467 }
1468
1469 /*===========================================================================
1470 * FUNCTION : setPreviewSize
1471 *
1472 * DESCRIPTION: set preview size from user setting
1473 *
1474 * PARAMETERS :
1475 * @params : user setting parameters
1476 *
1477 * RETURN : int32_t type of status
1478 * NO_ERROR -- success
1479 * none-zero failure code
1480 *==========================================================================*/
setPreviewSize(const QCameraParameters & params)1481 int32_t QCameraParameters::setPreviewSize(const QCameraParameters& params)
1482 {
1483 int width = 0, height = 0;
1484 int old_width = 0, old_height = 0;
1485 params.getPreviewSize(&width, &height);
1486 CameraParameters::getPreviewSize(&old_width, &old_height);
1487
1488 // Validate the preview size
1489 for (size_t i = 0; i < m_pCapability->preview_sizes_tbl_cnt; ++i) {
1490 if (width == m_pCapability->preview_sizes_tbl[i].width
1491 && height == m_pCapability->preview_sizes_tbl[i].height) {
1492 // check if need to restart preview in case of preview size change
1493 if (width != old_width || height != old_height) {
1494 LOGI("Requested preview size %d x %d", width, height);
1495 m_bNeedRestart = true;
1496 }
1497 // set the new value
1498 CameraParameters::setPreviewSize(width, height);
1499 return NO_ERROR;
1500 }
1501 }
1502 if (m_relCamSyncInfo.mode == CAM_MODE_SECONDARY) {
1503 char prop[PROPERTY_VALUE_MAX];
1504 // set prop to configure aux preview size
1505 property_get("persist.camera.aux.preview.size", prop, "0");
1506 parse_pair(prop, &width, &height, 'x', NULL);
1507 bool foundMatch = false;
1508 for (size_t i = 0; i < m_pCapability->preview_sizes_tbl_cnt; ++i) {
1509 if (width == m_pCapability->preview_sizes_tbl[i].width &&
1510 height == m_pCapability->preview_sizes_tbl[i].height) {
1511 foundMatch = true;
1512 }
1513 }
1514 if (!foundMatch) {
1515 width = m_pCapability->preview_sizes_tbl[0].width;
1516 height = m_pCapability->preview_sizes_tbl[0].height;
1517 }
1518 // check if need to restart preview in case of preview size change
1519 if (width != old_width || height != old_height) {
1520 m_bNeedRestart = true;
1521 }
1522 CameraParameters::setPreviewSize(width, height);
1523 LOGH("Secondary Camera: preview size %d x %d", width, height);
1524 return NO_ERROR;
1525 }
1526
1527 LOGE("Invalid preview size requested: %dx%d", width, height);
1528 return BAD_VALUE;
1529 }
1530
1531 /*===========================================================================
1532 * FUNCTION : setPictureSize
1533 *
1534 * DESCRIPTION: set picture size from user setting
1535 *
1536 * PARAMETERS :
1537 * @params : user setting parameters
1538 *
1539 * RETURN : int32_t type of status
1540 * NO_ERROR -- success
1541 * none-zero failure code
1542 *==========================================================================*/
setPictureSize(const QCameraParameters & params)1543 int32_t QCameraParameters::setPictureSize(const QCameraParameters& params)
1544 {
1545 int width, height;
1546 params.getPictureSize(&width, &height);
1547 int old_width, old_height;
1548 CameraParameters::getPictureSize(&old_width, &old_height);
1549
1550 // Validate the picture size
1551 if(!m_reprocScaleParam.isScaleEnabled()){
1552 for (size_t i = 0; i < m_pCapability->picture_sizes_tbl_cnt; ++i) {
1553 if (width == m_pCapability->picture_sizes_tbl[i].width
1554 && height == m_pCapability->picture_sizes_tbl[i].height) {
1555 // check if need to restart preview in case of picture size change
1556 if ((m_bZslMode || m_bRecordingHint) &&
1557 (width != old_width || height != old_height)) {
1558 LOGI("Requested picture size %d x %d", width, height);
1559 m_bNeedRestart = true;
1560 }
1561 // set the new value
1562 CameraParameters::setPictureSize(width, height);
1563 // Update View angles based on Picture Aspect ratio
1564 updateViewAngles();
1565 return NO_ERROR;
1566 }
1567 }
1568 }else{
1569 //should use scaled picture size table to validate
1570 if(m_reprocScaleParam.setValidatePicSize(width, height) == NO_ERROR){
1571 // check if need to restart preview in case of picture size change
1572 if ((m_bZslMode || m_bRecordingHint) &&
1573 (width != old_width || height != old_height)) {
1574 m_bNeedRestart = true;
1575 }
1576 // set the new value
1577 char val[32];
1578 snprintf(val, sizeof(val), "%dx%d", width, height);
1579 updateParamEntry(KEY_PICTURE_SIZE, val);
1580 LOGH("%s", val);
1581 // Update View angles based on Picture Aspect ratio
1582 updateViewAngles();
1583 return NO_ERROR;
1584 }
1585 }
1586 if (m_relCamSyncInfo.mode == CAM_MODE_SECONDARY) {
1587 char prop[PROPERTY_VALUE_MAX];
1588 // set prop to configure aux preview size
1589 property_get("persist.camera.aux.picture.size", prop, "0");
1590 parse_pair(prop, &width, &height, 'x', NULL);
1591 bool foundMatch = false;
1592 for (size_t i = 0; i < m_pCapability->picture_sizes_tbl_cnt; ++i) {
1593 if (width == m_pCapability->picture_sizes_tbl[i].width &&
1594 height == m_pCapability->picture_sizes_tbl[i].height) {
1595 foundMatch = true;
1596 }
1597 }
1598 if (!foundMatch) {
1599 width = m_pCapability->picture_sizes_tbl[0].width;
1600 height = m_pCapability->picture_sizes_tbl[0].height;
1601 }
1602 // check if need to restart preview in case of preview size change
1603 if (width != old_width || height != old_height) {
1604 m_bNeedRestart = true;
1605 }
1606 char val[32];
1607 snprintf(val, sizeof(val), "%dx%d", width, height);
1608 set(KEY_PICTURE_SIZE, val);
1609 LOGH("Secondary Camera: picture size %s", val);
1610 return NO_ERROR;
1611 }
1612 LOGE("Invalid picture size requested: %dx%d", width, height);
1613 return BAD_VALUE;
1614 }
1615
1616 /*===========================================================================
1617 * FUNCTION : updateViewAngles
1618 *
1619 * DESCRIPTION: Update the Horizontal & Vertical based on the Aspect ratio of Preview and
1620 * Picture aspect ratio
1621 *
1622 * PARAMETERS : none
1623 *
1624 * RETURN : none
1625 *==========================================================================*/
updateViewAngles()1626 void QCameraParameters::updateViewAngles()
1627 {
1628 double stillAspectRatio, maxPictureAspectRatio;
1629 int stillWidth, stillHeight, maxWidth, maxHeight;
1630 // The crop factors from the full sensor array to the still picture crop region
1631 double horizCropFactor = 1.f,vertCropFactor = 1.f;
1632 float horizViewAngle, vertViewAngle, maxHfov, maxVfov;
1633
1634 // Get current Picture & max Snapshot sizes
1635 getPictureSize(&stillWidth, &stillHeight);
1636 maxWidth = m_pCapability->picture_sizes_tbl[0].width;
1637 maxHeight = m_pCapability->picture_sizes_tbl[0].height;
1638
1639 // Get default maximum FOV from corresponding sensor driver
1640 maxHfov = m_pCapability->hor_view_angle;
1641 maxVfov = m_pCapability->ver_view_angle;
1642
1643 stillAspectRatio = (double)stillWidth/stillHeight;
1644 maxPictureAspectRatio = (double)maxWidth/maxHeight;
1645 LOGD("Stillwidth: %d, height: %d", stillWidth, stillHeight);
1646 LOGD("Max width: %d, height: %d", maxWidth, maxHeight);
1647 LOGD("still aspect: %f, Max Pic Aspect: %f",
1648 stillAspectRatio, maxPictureAspectRatio);
1649
1650 // crop as per the Maximum Snapshot aspect ratio
1651 if (stillAspectRatio < maxPictureAspectRatio)
1652 horizCropFactor = stillAspectRatio/maxPictureAspectRatio;
1653 else
1654 vertCropFactor = maxPictureAspectRatio/stillAspectRatio;
1655
1656 LOGD("horizCropFactor %f, vertCropFactor %f",
1657 horizCropFactor, vertCropFactor);
1658
1659 // Now derive the final FOV's based on field of view formula is i.e,
1660 // angle of view = 2 * arctangent ( d / 2f )
1661 // where d is the physical sensor dimension of interest, and f is
1662 // the focal length. This only applies to rectilinear sensors, for focusing
1663 // at distances >> f, etc.
1664 // Here d/2f is nothing but the Maximum Horizontal or Veritical FOV
1665 horizViewAngle = (180/PI)*2*atan(horizCropFactor*tan((maxHfov/2)*(PI/180)));
1666 vertViewAngle = (180/PI)*2*atan(horizCropFactor*tan((maxVfov/2)*(PI/180)));
1667
1668 setFloat(QCameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizViewAngle);
1669 setFloat(QCameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertViewAngle);
1670 LOGH("Final horizViewAngle %f, vertViewAngle %f",
1671 horizViewAngle, vertViewAngle);
1672 }
1673
1674 /*===========================================================================
1675 * FUNCTION : setVideoSize
1676 *
1677 * DESCRIPTION: set video size from user setting
1678 *
1679 * PARAMETERS :
1680 * @params : user setting parameters
1681 *
1682 * RETURN : int32_t type of status
1683 * NO_ERROR -- success
1684 * none-zero failure code
1685 *==========================================================================*/
setVideoSize(const QCameraParameters & params)1686 int32_t QCameraParameters::setVideoSize(const QCameraParameters& params)
1687 {
1688 const char *str= NULL;
1689 int width, height;
1690 str = params.get(KEY_VIDEO_SIZE);
1691 int old_width, old_height;
1692 CameraParameters::getVideoSize(&old_width, &old_height);
1693 if(!str) {
1694 //If application didn't set this parameter string, use the values from
1695 //getPreviewSize() as video dimensions.
1696 params.getPreviewSize(&width, &height);
1697 LOGW("No Record Size requested, use the preview dimensions");
1698 } else {
1699 params.getVideoSize(&width, &height);
1700 }
1701
1702 // Validate the video size
1703 for (size_t i = 0; i < m_pCapability->video_sizes_tbl_cnt; ++i) {
1704 if (width == m_pCapability->video_sizes_tbl[i].width
1705 && height == m_pCapability->video_sizes_tbl[i].height) {
1706 // check if need to restart preview in case of video size change
1707 if (m_bRecordingHint &&
1708 (width != old_width || height != old_height)) {
1709 m_bNeedRestart = true;
1710 }
1711
1712 // set the new value
1713 LOGH("Requested video size %d x %d", width, height);
1714 CameraParameters::setVideoSize(width, height);
1715 return NO_ERROR;
1716 }
1717 }
1718 if (m_relCamSyncInfo.mode == CAM_MODE_SECONDARY) {
1719 // Set the default preview size for secondary camera
1720 width = m_pCapability->video_sizes_tbl[0].width;
1721 height = m_pCapability->video_sizes_tbl[0].height;
1722 // check if need to restart preview in case of preview size change
1723 if (width != old_width || height != old_height) {
1724 m_bNeedRestart = true;
1725 }
1726
1727 CameraParameters::setVideoSize(width, height);
1728 LOGH("Secondary Camera: video size %d x %d",
1729 width, height);
1730 return NO_ERROR;
1731 }
1732
1733 LOGE("Error !! Invalid video size requested: %dx%d", width, height);
1734 return BAD_VALUE;
1735 }
1736
1737 /*===========================================================================
1738 * FUNCTION : getLiveSnapshotSize
1739 *
1740 * DESCRIPTION: get live snapshot size
1741 *
1742 * PARAMETERS : dim - Update dim with the liveshot size
1743 *
1744 *==========================================================================*/
getLiveSnapshotSize(cam_dimension_t & dim)1745 void QCameraParameters::getLiveSnapshotSize(cam_dimension_t &dim)
1746 {
1747 if(is4k2kVideoResolution()) {
1748 // We support maximum 8M liveshot @4K2K video resolution
1749 cam_dimension_t resolution = {0, 0};
1750 CameraParameters::getVideoSize(&resolution.width, &resolution.height);
1751 if((m_LiveSnapshotSize.width > resolution.width) ||
1752 (m_LiveSnapshotSize.height > resolution.height)) {
1753 m_LiveSnapshotSize.width = resolution.width;
1754 m_LiveSnapshotSize.height = resolution.height;
1755 }
1756 }
1757 dim = m_LiveSnapshotSize;
1758 LOGH("w x h: %d x %d", dim.width, dim.height);
1759 }
1760
1761 /*===========================================================================
1762 * FUNCTION : setLiveSnapshotSize
1763 *
1764 * DESCRIPTION: set live snapshot size
1765 *
1766 * PARAMETERS :
1767 * @params : user setting parameters
1768 *
1769 * RETURN : int32_t type of status
1770 * NO_ERROR -- success
1771 * none-zero failure code
1772 *==========================================================================*/
setLiveSnapshotSize(const QCameraParameters & params)1773 int32_t QCameraParameters::setLiveSnapshotSize(const QCameraParameters& params)
1774 {
1775 char value[PROPERTY_VALUE_MAX];
1776 property_get("persist.camera.opt.livepic", value, "1");
1777 bool useOptimal = atoi(value) > 0 ? true : false;
1778 bool vHdrOn;
1779 int32_t liveSnapWidth = 0, liveSnapHeight = 0;
1780 // use picture size from user setting
1781 params.getPictureSize(&m_LiveSnapshotSize.width, &m_LiveSnapshotSize.height);
1782
1783 size_t livesnapshot_sizes_tbl_cnt =
1784 m_pCapability->livesnapshot_sizes_tbl_cnt;
1785 cam_dimension_t *livesnapshot_sizes_tbl =
1786 &m_pCapability->livesnapshot_sizes_tbl[0];
1787
1788 if(is4k2kVideoResolution()) {
1789 // We support maximum 8M liveshot @4K2K video resolution
1790 cam_dimension_t resolution = {0, 0};
1791 CameraParameters::getVideoSize(&resolution.width, &resolution.height);
1792 if((m_LiveSnapshotSize.width > resolution.width) ||
1793 (m_LiveSnapshotSize.height > resolution.height)) {
1794 m_LiveSnapshotSize.width = resolution.width;
1795 m_LiveSnapshotSize.height = resolution.height;
1796 }
1797 }
1798
1799 // check if HFR is enabled
1800 const char *hfrStr = params.get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
1801 cam_hfr_mode_t hfrMode = CAM_HFR_MODE_OFF;
1802 const char *hsrStr = params.get(KEY_QC_VIDEO_HIGH_SPEED_RECORDING);
1803
1804 const char *vhdrStr = params.get(KEY_QC_VIDEO_HDR);
1805 vHdrOn = (vhdrStr != NULL && (0 == strcmp(vhdrStr,"on"))) ? true : false;
1806 if (vHdrOn) {
1807 livesnapshot_sizes_tbl_cnt = m_pCapability->vhdr_livesnapshot_sizes_tbl_cnt;
1808 livesnapshot_sizes_tbl = &m_pCapability->vhdr_livesnapshot_sizes_tbl[0];
1809 }
1810 if ((hsrStr != NULL) && strcmp(hsrStr, "off")) {
1811 int32_t hsr = lookupAttr(HFR_MODES_MAP, PARAM_MAP_SIZE(HFR_MODES_MAP), hsrStr);
1812 if ((hsr != NAME_NOT_FOUND) && (hsr > CAM_HFR_MODE_OFF)) {
1813 // if HSR is enabled, change live snapshot size
1814 for (size_t i = 0; i < m_pCapability->hfr_tbl_cnt; i++) {
1815 if (m_pCapability->hfr_tbl[i].mode == hsr) {
1816 livesnapshot_sizes_tbl_cnt =
1817 m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl_cnt;
1818 livesnapshot_sizes_tbl =
1819 &m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl[0];
1820 hfrMode = m_pCapability->hfr_tbl[i].mode;
1821 break;
1822 }
1823 }
1824 }
1825 } else if ((hfrStr != NULL) && strcmp(hfrStr, "off")) {
1826 int32_t hfr = lookupAttr(HFR_MODES_MAP, PARAM_MAP_SIZE(HFR_MODES_MAP), hfrStr);
1827 if ((hfr != NAME_NOT_FOUND) && (hfr > CAM_HFR_MODE_OFF)) {
1828 // if HFR is enabled, change live snapshot size
1829 for (size_t i = 0; i < m_pCapability->hfr_tbl_cnt; i++) {
1830 if (m_pCapability->hfr_tbl[i].mode == hfr) {
1831 livesnapshot_sizes_tbl_cnt =
1832 m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl_cnt;
1833 livesnapshot_sizes_tbl =
1834 &m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl[0];
1835 hfrMode = m_pCapability->hfr_tbl[i].mode;
1836 break;
1837 }
1838 }
1839 }
1840 }
1841
1842 if (useOptimal || hfrMode != CAM_HFR_MODE_OFF || vHdrOn) {
1843 bool found = false;
1844
1845 // first check if picture size is within the list of supported sizes
1846 for (size_t i = 0; i < livesnapshot_sizes_tbl_cnt; ++i) {
1847 if (m_LiveSnapshotSize.width == livesnapshot_sizes_tbl[i].width &&
1848 m_LiveSnapshotSize.height == livesnapshot_sizes_tbl[i].height) {
1849 found = true;
1850 break;
1851 }
1852 }
1853
1854 if (!found) {
1855 // use optimal live snapshot size from supported list,
1856 // that has same preview aspect ratio
1857 int width = 0, height = 0;
1858 params.getPreviewSize(&width, &height);
1859
1860 double previewAspectRatio = (double)width / height;
1861 for (size_t i = 0; i < livesnapshot_sizes_tbl_cnt; ++i) {
1862 double ratio = (double)livesnapshot_sizes_tbl[i].width /
1863 livesnapshot_sizes_tbl[i].height;
1864 if (fabs(previewAspectRatio - ratio) <= ASPECT_TOLERANCE) {
1865 m_LiveSnapshotSize = livesnapshot_sizes_tbl[i];
1866 found = true;
1867 break;
1868 }
1869 }
1870
1871 if (!found && ((hfrMode != CAM_HFR_MODE_OFF) || vHdrOn)) {
1872 // Cannot find matching aspect ration from supported live snapshot list
1873 // choose the max dim from preview and video size
1874 LOGD("Cannot find matching aspect ratio, choose max of preview or video size");
1875 params.getVideoSize(&m_LiveSnapshotSize.width, &m_LiveSnapshotSize.height);
1876 if (m_LiveSnapshotSize.width < width && m_LiveSnapshotSize.height < height) {
1877 m_LiveSnapshotSize.width = width;
1878 m_LiveSnapshotSize.height = height;
1879 }
1880 }
1881 }
1882 }
1883 //To read liveshot resolution from setprop instead of matching aspect ratio.
1884 //The setprop resolution format should be WxH.
1885 //e.g: adb shell setprop persist.camera.liveshot.size 1280x720
1886 memset(value, 0, PROPERTY_VALUE_MAX);
1887 property_get("persist.camera.liveshot.size", value, "");
1888 if (strlen(value) > 0) {
1889 char *saveptr = NULL;
1890 char *token = strtok_r(value, "x", &saveptr);
1891 if (token != NULL) {
1892 liveSnapWidth = atoi(token);
1893 }
1894 token = strtok_r(NULL, "x", &saveptr);
1895 if (token != NULL) {
1896 liveSnapHeight = atoi(token);
1897 }
1898 if ((liveSnapWidth!=0) && (liveSnapHeight!=0)) {
1899 for (size_t i = 0; i < m_pCapability->picture_sizes_tbl_cnt; ++i) {
1900 if (liveSnapWidth == m_pCapability->picture_sizes_tbl[i].width
1901 && liveSnapHeight == m_pCapability->picture_sizes_tbl[i].height) {
1902 m_LiveSnapshotSize.width = liveSnapWidth;
1903 m_LiveSnapshotSize.height = liveSnapHeight;
1904 break;
1905 }
1906 }
1907 }
1908 }
1909 LOGH("live snapshot size %d x %d",
1910 m_LiveSnapshotSize.width, m_LiveSnapshotSize.height);
1911
1912 return NO_ERROR;
1913 }
1914
1915
1916 /*===========================================================================
1917 * FUNCTION : setRawSize
1918 *
1919 * DESCRIPTION: set live snapshot size
1920 *
1921 * PARAMETERS :
1922 * @params : user setting parameters
1923 *
1924 * RETURN : int32_t type of status
1925 * NO_ERROR -- success
1926 * none-zero failure code
1927 *==========================================================================*/
setRawSize(cam_dimension_t & dim)1928 int32_t QCameraParameters::setRawSize(cam_dimension_t &dim)
1929 {
1930 m_rawSize = dim;
1931 return NO_ERROR;
1932 }
1933 /*===========================================================================
1934 * FUNCTION : setPreviewFormat
1935 *
1936 * DESCRIPTION: set preview format from user setting
1937 *
1938 * PARAMETERS :
1939 * @params : user setting parameters
1940 *
1941 * RETURN : int32_t type of status
1942 * NO_ERROR -- success
1943 * none-zero failure code
1944 *==========================================================================*/
setPreviewFormat(const QCameraParameters & params)1945 int32_t QCameraParameters::setPreviewFormat(const QCameraParameters& params)
1946 {
1947 const char *str = params.getPreviewFormat();
1948 int32_t previewFormat = lookupAttr(PREVIEW_FORMATS_MAP,
1949 PARAM_MAP_SIZE(PREVIEW_FORMATS_MAP), str);
1950 if (previewFormat != NAME_NOT_FOUND) {
1951 if (isUBWCEnabled()) {
1952 char prop[PROPERTY_VALUE_MAX];
1953 int pFormat;
1954 memset(prop, 0, sizeof(prop));
1955 property_get("persist.camera.preview.ubwc", prop, "1");
1956
1957 pFormat = atoi(prop);
1958 if (pFormat == 1) {
1959 mPreviewFormat = CAM_FORMAT_YUV_420_NV12_UBWC;
1960 mAppPreviewFormat = (cam_format_t)previewFormat;
1961 } else {
1962 mPreviewFormat = (cam_format_t)previewFormat;
1963 mAppPreviewFormat = (cam_format_t)previewFormat;
1964 }
1965 } else {
1966 mPreviewFormat = (cam_format_t)previewFormat;
1967 mAppPreviewFormat = (cam_format_t)previewFormat;
1968 }
1969 CameraParameters::setPreviewFormat(str);
1970 LOGH("format %d\n", mPreviewFormat);
1971 return NO_ERROR;
1972 }
1973 LOGE("Invalid preview format value: %s", (str == NULL) ? "NULL" : str);
1974 return BAD_VALUE;
1975 }
1976
1977 /*===========================================================================
1978 * FUNCTION : setPictureFormat
1979 *
1980 * DESCRIPTION: set picture format from user setting
1981 *
1982 * PARAMETERS :
1983 * @params : user setting parameters
1984 *
1985 * RETURN : int32_t type of status
1986 * NO_ERROR -- success
1987 * none-zero failure code
1988 *==========================================================================*/
setPictureFormat(const QCameraParameters & params)1989 int32_t QCameraParameters::setPictureFormat(const QCameraParameters& params)
1990 {
1991 const char *str = params.getPictureFormat();
1992 int32_t pictureFormat = lookupAttr(PICTURE_TYPES_MAP, PARAM_MAP_SIZE(PICTURE_TYPES_MAP), str);
1993 if (pictureFormat != NAME_NOT_FOUND) {
1994 mPictureFormat = pictureFormat;
1995
1996 CameraParameters::setPictureFormat(str);
1997 LOGH("format %d\n", mPictureFormat);
1998 return NO_ERROR;
1999 }
2000 LOGE("Invalid picture format value: %s", (str == NULL) ? "NULL" : str);
2001 return BAD_VALUE;
2002 }
2003
2004 /*===========================================================================
2005 * FUNCTION : setJpegThumbnailSize
2006 *
2007 * DESCRIPTION: set jpeg thumbnail size from user setting
2008 *
2009 * PARAMETERS :
2010 * @params : user setting parameters
2011 *
2012 * RETURN : int32_t type of status
2013 * NO_ERROR -- success
2014 * none-zero failure code
2015 *==========================================================================*/
setJpegThumbnailSize(const QCameraParameters & params)2016 int32_t QCameraParameters::setJpegThumbnailSize(const QCameraParameters& params)
2017 {
2018 int width = params.getInt(KEY_JPEG_THUMBNAIL_WIDTH);
2019 int height = params.getInt(KEY_JPEG_THUMBNAIL_HEIGHT);
2020
2021 LOGD("requested jpeg thumbnail size %d x %d", width, height);
2022 int sizes_cnt = sizeof(THUMBNAIL_SIZES_MAP) / sizeof(cam_dimension_t);
2023 // Validate thumbnail size
2024 for (int i = 0; i < sizes_cnt; i++) {
2025 if (width == THUMBNAIL_SIZES_MAP[i].width &&
2026 height == THUMBNAIL_SIZES_MAP[i].height) {
2027 set(KEY_JPEG_THUMBNAIL_WIDTH, width);
2028 set(KEY_JPEG_THUMBNAIL_HEIGHT, height);
2029 return NO_ERROR;
2030 }
2031 }
2032 LOGE("error: setting jpeg thumbnail size (%d, %d)", width, height);
2033 return BAD_VALUE;
2034 }
2035
2036 /*===========================================================================
2037
2038 * FUNCTION : setBurstLEDOnPeriod
2039 *
2040 * DESCRIPTION: set burst LED on period
2041 *
2042 * PARAMETERS :
2043 * @params : user setting parameters
2044 *
2045 * RETURN : int32_t type of status
2046 * NO_ERROR -- success
2047 * none-zero failure code
2048 *==========================================================================*/
setBurstLEDOnPeriod(const QCameraParameters & params)2049 int32_t QCameraParameters::setBurstLEDOnPeriod(const QCameraParameters& params)
2050 {
2051 int nBurstLEDOnPeriod = params.getInt(KEY_QC_SNAPSHOT_BURST_LED_ON_PERIOD);
2052 //Check if the LED ON period is within limits
2053 if ((nBurstLEDOnPeriod <= 0) || (nBurstLEDOnPeriod > 800)) {
2054 // if burst led on period is not set in parameters,
2055 // read from sys prop
2056 char prop[PROPERTY_VALUE_MAX];
2057 memset(prop, 0, sizeof(prop));
2058 property_get("persist.camera.led.on.period", prop, "0");
2059 nBurstLEDOnPeriod = atoi(prop);
2060 if (nBurstLEDOnPeriod <= 0) {
2061 nBurstLEDOnPeriod = 300;
2062 }
2063 }
2064
2065 set(KEY_QC_SNAPSHOT_BURST_LED_ON_PERIOD, nBurstLEDOnPeriod);
2066 m_nBurstLEDOnPeriod = nBurstLEDOnPeriod;
2067 LOGH("Burst LED on period %u", m_nBurstLEDOnPeriod);
2068 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_BURST_LED_ON_PERIOD,
2069 (uint32_t)nBurstLEDOnPeriod)) {
2070 return BAD_VALUE;
2071 }
2072
2073 return NO_ERROR;
2074 }
2075
2076
2077
2078 /*===========================================================================
2079 * FUNCTION : setRetroActiveBurstNum
2080 *
2081 * DESCRIPTION: set retro active burst num
2082 *
2083 * PARAMETERS :
2084 * @params : user setting parameters
2085 *
2086 * RETURN : int32_t type of status
2087 * NO_ERROR -- success
2088 * none-zero failure code
2089 *==========================================================================*/
setRetroActiveBurstNum(const QCameraParameters & params)2090 int32_t QCameraParameters::setRetroActiveBurstNum(
2091 const QCameraParameters& params)
2092 {
2093 int32_t nBurstNum = params.getInt(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER);
2094 LOGH("m_nRetroBurstNum = %d", m_nRetroBurstNum);
2095 if (nBurstNum <= 0) {
2096 // if burst number is not set in parameters,
2097 // read from sys prop
2098 char prop[PROPERTY_VALUE_MAX];
2099 memset(prop, 0, sizeof(prop));
2100 property_get("persist.camera.retro.number", prop, "0");
2101 nBurstNum = atoi(prop);
2102 if (nBurstNum < 0) {
2103 nBurstNum = 0;
2104 }
2105 }
2106
2107 set(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER, nBurstNum);
2108
2109 m_nRetroBurstNum = nBurstNum;
2110 LOGH("m_nRetroBurstNum = %d", m_nRetroBurstNum);
2111 return NO_ERROR;
2112 }
2113
2114 /*===========================================================================
2115 * FUNCTION : setJpegQuality
2116 *
2117 * DESCRIPTION: set jpeg encpding quality from user setting
2118 *
2119 * PARAMETERS :
2120 * @params : user setting parameters
2121 *
2122 * RETURN : int32_t type of status
2123 * NO_ERROR -- success
2124 * none-zero failure code
2125 *==========================================================================*/
setJpegQuality(const QCameraParameters & params)2126 int32_t QCameraParameters::setJpegQuality(const QCameraParameters& params)
2127 {
2128 int32_t rc = NO_ERROR;
2129 int quality = params.getInt(KEY_JPEG_QUALITY);
2130 if (quality >= 0 && quality <= 100) {
2131 set(KEY_JPEG_QUALITY, quality);
2132 } else {
2133 LOGE("Invalid jpeg quality=%d", quality);
2134 rc = BAD_VALUE;
2135 }
2136
2137 quality = params.getInt(KEY_JPEG_THUMBNAIL_QUALITY);
2138 if (quality >= 0 && quality <= 100) {
2139 set(KEY_JPEG_THUMBNAIL_QUALITY, quality);
2140 } else {
2141 LOGE("Invalid jpeg thumbnail quality=%d", quality);
2142 rc = BAD_VALUE;
2143 }
2144 return rc;
2145 }
2146
2147 /*===========================================================================
2148 * FUNCTION : setOrientaion
2149 *
2150 * DESCRIPTION: set orientaion from user setting
2151 *
2152 * PARAMETERS :
2153 * @params : user setting parameters
2154 *
2155 * RETURN : int32_t type of status
2156 * NO_ERROR -- success
2157 * none-zero failure code
2158 *==========================================================================*/
setOrientation(const QCameraParameters & params)2159 int32_t QCameraParameters::setOrientation(const QCameraParameters& params)
2160 {
2161 const char *str = params.get(KEY_QC_ORIENTATION);
2162
2163 if (str != NULL) {
2164 if (strcmp(str, portrait) == 0 || strcmp(str, landscape) == 0) {
2165 // Camera service needs this to decide if the preview frames and raw
2166 // pictures should be rotated.
2167 set(KEY_QC_ORIENTATION, str);
2168 } else {
2169 LOGE("Invalid orientation value: %s", str);
2170 return BAD_VALUE;
2171 }
2172 }
2173 return NO_ERROR;
2174 }
2175
2176 /*===========================================================================
2177 * FUNCTION : setAutoExposure
2178 *
2179 * DESCRIPTION: set auto exposure value from user setting
2180 *
2181 * PARAMETERS :
2182 * @params : user setting parameters
2183 *
2184 * RETURN : int32_t type of status
2185 * NO_ERROR -- success
2186 * none-zero failure code
2187 *==========================================================================*/
setAutoExposure(const QCameraParameters & params)2188 int32_t QCameraParameters::setAutoExposure(const QCameraParameters& params)
2189 {
2190 const char *str = params.get(KEY_QC_AUTO_EXPOSURE);
2191 const char *prev_str = get(KEY_QC_AUTO_EXPOSURE);
2192 if (str != NULL) {
2193 if (prev_str == NULL ||
2194 strcmp(str, prev_str) != 0) {
2195 return setAutoExposure(str);
2196 }
2197 }
2198 return NO_ERROR;
2199 }
2200
2201 /*===========================================================================
2202 * FUNCTION : setPreviewFpsRange
2203 *
2204 * DESCRIPTION: set preview FPS range from user setting
2205 *
2206 * PARAMETERS :
2207 * @params : user setting parameters
2208 *
2209 * RETURN : int32_t type of status
2210 * NO_ERROR -- success
2211 * none-zero failure code
2212 *==========================================================================*/
setPreviewFpsRange(const QCameraParameters & params)2213 int32_t QCameraParameters::setPreviewFpsRange(const QCameraParameters& params)
2214 {
2215 int minFps,maxFps;
2216 int prevMinFps, prevMaxFps, vidMinFps, vidMaxFps;
2217 int rc = NO_ERROR;
2218 bool found = false, updateNeeded = false;
2219
2220 CameraParameters::getPreviewFpsRange(&prevMinFps, &prevMaxFps);
2221 params.getPreviewFpsRange(&minFps, &maxFps);
2222
2223 LOGH("FpsRange Values:(%d, %d)", prevMinFps, prevMaxFps);
2224 LOGH("Requested FpsRange Values:(%d, %d)", minFps, maxFps);
2225
2226 //first check if we need to change fps because of HFR mode change
2227 updateNeeded = UpdateHFRFrameRate(params);
2228 if (updateNeeded) {
2229 m_bNeedRestart = true;
2230 rc = setHighFrameRate(mHfrMode);
2231 if (rc != NO_ERROR) goto end;
2232 }
2233 LOGH("UpdateHFRFrameRate %d", updateNeeded);
2234
2235 vidMinFps = (int)m_hfrFpsRange.video_min_fps;
2236 vidMaxFps = (int)m_hfrFpsRange.video_max_fps;
2237
2238 if(minFps == prevMinFps && maxFps == prevMaxFps) {
2239 if ( m_bFixedFrameRateSet ) {
2240 minFps = params.getPreviewFrameRate() * 1000;
2241 maxFps = params.getPreviewFrameRate() * 1000;
2242 m_bFixedFrameRateSet = false;
2243 } else if (!updateNeeded) {
2244 LOGH("No change in FpsRange");
2245 rc = NO_ERROR;
2246 goto end;
2247 }
2248 }
2249 for(size_t i = 0; i < m_pCapability->fps_ranges_tbl_cnt; i++) {
2250 // if the value is in the supported list
2251 if (minFps >= m_pCapability->fps_ranges_tbl[i].min_fps * 1000 &&
2252 maxFps <= m_pCapability->fps_ranges_tbl[i].max_fps * 1000) {
2253 found = true;
2254 LOGH("FPS i=%d : minFps = %d, maxFps = %d"
2255 " vidMinFps = %d, vidMaxFps = %d",
2256 i, minFps, maxFps,
2257 (int)m_hfrFpsRange.video_min_fps,
2258 (int)m_hfrFpsRange.video_max_fps);
2259 if ((0.0f >= m_hfrFpsRange.video_min_fps) ||
2260 (0.0f >= m_hfrFpsRange.video_max_fps)) {
2261 vidMinFps = minFps;
2262 vidMaxFps = maxFps;
2263 }
2264 else {
2265 vidMinFps = (int)m_hfrFpsRange.video_min_fps;
2266 vidMaxFps = (int)m_hfrFpsRange.video_max_fps;
2267 }
2268
2269 setPreviewFpsRange(minFps, maxFps, vidMinFps, vidMaxFps);
2270 break;
2271 }
2272 }
2273 if(found == false){
2274 LOGE("error: FPS range value not supported");
2275 rc = BAD_VALUE;
2276 }
2277 end:
2278 return rc;
2279 }
2280
2281 /*===========================================================================
2282 * FUNCTION : UpdateHFRFrameRate
2283 *
2284 * DESCRIPTION: set preview FPS range based on HFR setting
2285 *
2286 * PARAMETERS :
2287 * @params : user setting parameters
2288 *
2289 * RETURN : bool true/false
2290 * true -if HAL needs to overwrite FPS range set by app, false otherwise.
2291 *==========================================================================*/
2292
UpdateHFRFrameRate(const QCameraParameters & params)2293 bool QCameraParameters::UpdateHFRFrameRate(const QCameraParameters& params)
2294 {
2295 bool updateNeeded = false;
2296 int min_fps, max_fps;
2297 int32_t hfrMode = CAM_HFR_MODE_OFF;
2298 int32_t newHfrMode = CAM_HFR_MODE_OFF;
2299
2300 int parm_minfps,parm_maxfps;
2301 int prevMinFps, prevMaxFps;
2302 CameraParameters::getPreviewFpsRange(&prevMinFps, &prevMaxFps);
2303 params.getPreviewFpsRange(&parm_minfps, &parm_maxfps);
2304 LOGH("CameraParameters - : minFps = %d, maxFps = %d ",
2305 prevMinFps, prevMaxFps);
2306 LOGH("Requested params - : minFps = %d, maxFps = %d ",
2307 parm_minfps, parm_maxfps);
2308
2309 const char *hfrStr = params.get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
2310 const char *hsrStr = params.get(KEY_QC_VIDEO_HIGH_SPEED_RECORDING);
2311
2312 const char *prev_hfrStr = CameraParameters::get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
2313 const char *prev_hsrStr = CameraParameters::get(KEY_QC_VIDEO_HIGH_SPEED_RECORDING);
2314
2315 if ((hfrStr != NULL) && (prev_hfrStr != NULL) && strcmp(hfrStr, prev_hfrStr)) {
2316 updateParamEntry(KEY_QC_VIDEO_HIGH_FRAME_RATE, hfrStr);
2317 }
2318
2319 if ((hsrStr != NULL) && (prev_hsrStr != NULL) && strcmp(hsrStr, prev_hsrStr)) {
2320 updateParamEntry(KEY_QC_VIDEO_HIGH_SPEED_RECORDING, hsrStr);
2321
2322 }
2323
2324 // check if HFR is enabled
2325 if ((hfrStr != NULL) && strcmp(hfrStr, "off")) {
2326 hfrMode = lookupAttr(HFR_MODES_MAP, PARAM_MAP_SIZE(HFR_MODES_MAP), hfrStr);
2327 if (NAME_NOT_FOUND != hfrMode) newHfrMode = hfrMode;
2328 }
2329 // check if HSR is enabled
2330 else if ((hsrStr != NULL) && strcmp(hsrStr, "off")) {
2331 hfrMode = lookupAttr(HFR_MODES_MAP, PARAM_MAP_SIZE(HFR_MODES_MAP), hsrStr);
2332 if (NAME_NOT_FOUND != hfrMode) newHfrMode = hfrMode;
2333 }
2334 LOGH("prevHfrMode - %d, currentHfrMode = %d ",
2335 mHfrMode, newHfrMode);
2336
2337 if (mHfrMode != newHfrMode) {
2338 updateNeeded = true;
2339 mHfrMode = newHfrMode;
2340 switch (mHfrMode) {
2341 case CAM_HFR_MODE_60FPS:
2342 min_fps = 60000;
2343 max_fps = 60000;
2344 break;
2345 case CAM_HFR_MODE_90FPS:
2346 min_fps = 90000;
2347 max_fps = 90000;
2348 break;
2349 case CAM_HFR_MODE_120FPS:
2350 min_fps = 120000;
2351 max_fps = 120000;
2352 break;
2353 case CAM_HFR_MODE_150FPS:
2354 min_fps = 150000;
2355 max_fps = 150000;
2356 break;
2357 case CAM_HFR_MODE_180FPS:
2358 min_fps = 180000;
2359 max_fps = 180000;
2360 break;
2361 case CAM_HFR_MODE_210FPS:
2362 min_fps = 210000;
2363 max_fps = 210000;
2364 break;
2365 case CAM_HFR_MODE_240FPS:
2366 min_fps = 240000;
2367 max_fps = 240000;
2368 break;
2369 case CAM_HFR_MODE_480FPS:
2370 min_fps = 480000;
2371 max_fps = 480000;
2372 break;
2373 case CAM_HFR_MODE_OFF:
2374 default:
2375 // Set Video Fps to zero
2376 min_fps = 0;
2377 max_fps = 0;
2378 break;
2379 }
2380 m_hfrFpsRange.video_min_fps = (float)min_fps;
2381 m_hfrFpsRange.video_max_fps = (float)max_fps;
2382
2383 LOGH("HFR mode (%d) Set video FPS : minFps = %d, maxFps = %d ",
2384 mHfrMode, min_fps, max_fps);
2385 }
2386
2387 // Remember if HFR mode is ON
2388 if ((mHfrMode > CAM_HFR_MODE_OFF) && (mHfrMode < CAM_HFR_MODE_MAX)) {
2389 LOGH("HFR mode is ON");
2390 m_bHfrMode = true;
2391 } else {
2392 m_hfrFpsRange.video_min_fps = 0;
2393 m_hfrFpsRange.video_max_fps = 0;
2394 m_bHfrMode = false;
2395 LOGH("HFR mode is OFF");
2396 }
2397 m_hfrFpsRange.min_fps = (float)parm_minfps;
2398 m_hfrFpsRange.max_fps = (float)parm_maxfps;
2399
2400 if (m_bHfrMode && (mHfrMode > CAM_HFR_MODE_120FPS)
2401 && (parm_maxfps != 0)) {
2402 //Configure buffer batch count to use batch mode for higher fps
2403 setBufBatchCount((int8_t)(m_hfrFpsRange.video_max_fps / parm_maxfps));
2404 } else {
2405 //Reset batch count and update KEY for encoder
2406 setBufBatchCount(0);
2407 }
2408 return updateNeeded;
2409 }
2410
2411 /*===========================================================================
2412 * FUNCTION : setPreviewFrameRate
2413 *
2414 * DESCRIPTION: set preview frame rate from user setting
2415 *
2416 * PARAMETERS :
2417 * @params : user setting parameters
2418 *
2419 * RETURN : int32_t type of status
2420 * NO_ERROR -- success
2421 * none-zero failure code
2422 *==========================================================================*/
setPreviewFrameRate(const QCameraParameters & params)2423 int32_t QCameraParameters::setPreviewFrameRate(const QCameraParameters& params)
2424 {
2425 const char *str = params.get(KEY_PREVIEW_FRAME_RATE);
2426 const char *prev_str = get(KEY_PREVIEW_FRAME_RATE);
2427
2428 if ( str ) {
2429 if ( prev_str &&
2430 strcmp(str, prev_str)) {
2431 LOGD("Requested Fixed Frame Rate %s", str);
2432 updateParamEntry(KEY_PREVIEW_FRAME_RATE, str);
2433 m_bFixedFrameRateSet = true;
2434 }
2435 }
2436 return NO_ERROR;
2437 }
2438
2439 /*===========================================================================
2440 * FUNCTION : setEffect
2441 *
2442 * DESCRIPTION: set effect value from user setting
2443 *
2444 * PARAMETERS :
2445 * @params : user setting parameters
2446 *
2447 * RETURN : int32_t type of status
2448 * NO_ERROR -- success
2449 * none-zero failure code
2450 *==========================================================================*/
setEffect(const QCameraParameters & params)2451 int32_t QCameraParameters::setEffect(const QCameraParameters& params)
2452 {
2453 const char *str = params.get(KEY_EFFECT);
2454 const char *prev_str = get(KEY_EFFECT);
2455
2456 char prop[PROPERTY_VALUE_MAX];
2457 memset(prop, 0, sizeof(prop));
2458 property_get("persist.camera.effect", prop, "none");
2459
2460 if (strcmp(prop, "none")) {
2461 if ((prev_str == NULL) ||
2462 (strcmp(prop, prev_str) != 0) ||
2463 (m_bUpdateEffects == true)) {
2464 m_bUpdateEffects = false;
2465 return setEffect(prop);
2466 }
2467 } else if (str != NULL) {
2468 if ((prev_str == NULL) ||
2469 (strcmp(str, prev_str) != 0) ||
2470 (m_bUpdateEffects == true)) {
2471 m_bUpdateEffects = false;
2472 return setEffect(str);
2473 }
2474 }
2475 return NO_ERROR;
2476 }
2477
2478 /*===========================================================================
2479 * FUNCTION : setFocusMode
2480 *
2481 * DESCRIPTION: set focus mode from user setting
2482 *
2483 * PARAMETERS :
2484 * @params : user setting parameters
2485 *
2486 * RETURN : int32_t type of status
2487 * NO_ERROR -- success
2488 * none-zero failure code
2489 *==========================================================================*/
setFocusMode(const QCameraParameters & params)2490 int32_t QCameraParameters::setFocusMode(const QCameraParameters& params)
2491 {
2492 const char *str = params.get(KEY_FOCUS_MODE);
2493 const char *prev_str = get(KEY_FOCUS_MODE);
2494 if (str != NULL) {
2495 if (prev_str == NULL ||
2496 strcmp(str, prev_str) != 0) {
2497 return setFocusMode(str);
2498 }
2499 }
2500 return NO_ERROR;
2501 }
2502
2503 /*===========================================================================
2504 * FUNCTION : setFocusPosition
2505 *
2506 * DESCRIPTION: set focus position from user setting
2507 *
2508 * PARAMETERS :
2509 * @params : user setting parameters
2510 *
2511 * RETURN : int32_t type of status
2512 * NO_ERROR -- success
2513 * none-zero failure code
2514 *==========================================================================*/
setFocusPosition(const QCameraParameters & params)2515 int32_t QCameraParameters::setFocusPosition(const QCameraParameters& params)
2516 {
2517 const char *focus_str = params.get(KEY_FOCUS_MODE);
2518 const char *prev_focus_str = get(KEY_FOCUS_MODE);
2519
2520 if (NULL == focus_str) {
2521 return NO_ERROR;
2522 }
2523
2524 LOGD("current focus mode: %s", focus_str);
2525 if (strcmp(focus_str, FOCUS_MODE_MANUAL_POSITION)) {
2526 LOGH(", dont set focus pos to back-end!");
2527 return NO_ERROR;
2528 }
2529
2530 const char *pos = params.get(KEY_QC_MANUAL_FOCUS_POSITION);
2531 const char *prev_pos = get(KEY_QC_MANUAL_FOCUS_POSITION);
2532 const char *type = params.get(KEY_QC_MANUAL_FOCUS_POS_TYPE);
2533 const char *prev_type = get(KEY_QC_MANUAL_FOCUS_POS_TYPE);
2534
2535 if ((pos != NULL) && (type != NULL) && (focus_str != NULL)) {
2536 if (prev_pos == NULL || (strcmp(pos, prev_pos) != 0) ||
2537 prev_type == NULL || (strcmp(type, prev_type) != 0) ||
2538 prev_focus_str == NULL || (strcmp(focus_str, prev_focus_str) != 0)) {
2539 return setFocusPosition(type, pos);
2540 }
2541 }
2542
2543 return NO_ERROR;
2544 }
2545
2546 /*===========================================================================
2547 * FUNCTION : setBrightness
2548 *
2549 * DESCRIPTION: set brightness control value from user setting
2550 *
2551 * PARAMETERS :
2552 * @params : user setting parameters
2553 *
2554 * RETURN : int32_t type of status
2555 * NO_ERROR -- success
2556 * none-zero failure code
2557 *==========================================================================*/
setBrightness(const QCameraParameters & params)2558 int32_t QCameraParameters::setBrightness(const QCameraParameters& params)
2559 {
2560 int currentBrightness = getInt(KEY_QC_BRIGHTNESS);
2561 int brightness = params.getInt(KEY_QC_BRIGHTNESS);
2562
2563 if(params.get(KEY_QC_BRIGHTNESS) == NULL) {
2564 LOGH("Brigtness not set by App ");
2565 return NO_ERROR;
2566 }
2567 if (currentBrightness != brightness) {
2568 if (brightness >= m_pCapability->brightness_ctrl.min_value &&
2569 brightness <= m_pCapability->brightness_ctrl.max_value) {
2570 LOGD("new brightness value : %d ", brightness);
2571 return setBrightness(brightness);
2572 } else {
2573 LOGE("invalid value %d out of (%d, %d)",
2574 brightness,
2575 m_pCapability->brightness_ctrl.min_value,
2576 m_pCapability->brightness_ctrl.max_value);
2577 return BAD_VALUE;
2578 }
2579 } else {
2580 LOGD("No brightness value changed.");
2581 return NO_ERROR;
2582 }
2583 }
2584
2585 /*===========================================================================
2586 * FUNCTION : getBrightness
2587 *
2588 * DESCRIPTION: get brightness control value from user setting
2589 *
2590 * PARAMETERS :
2591 * @params : user setting parameters
2592 *
2593 * RETURN : int32_t type of status
2594 * NO_ERROR -- success
2595 * none-zero failure code
2596 *==========================================================================*/
getBrightness()2597 int QCameraParameters::getBrightness()
2598 {
2599 return getInt(KEY_QC_BRIGHTNESS);
2600 }
2601
2602 /*===========================================================================
2603 * FUNCTION : setSharpness
2604 *
2605 * DESCRIPTION: set sharpness control value from user setting
2606 *
2607 * PARAMETERS :
2608 * @params : user setting parameters
2609 *
2610 * RETURN : int32_t type of status
2611 * NO_ERROR -- success
2612 * none-zero failure code
2613 *==========================================================================*/
setSharpness(const QCameraParameters & params)2614 int32_t QCameraParameters::setSharpness(const QCameraParameters& params)
2615 {
2616 int shaprness = params.getInt(KEY_QC_SHARPNESS);
2617 int prev_sharp = getInt(KEY_QC_SHARPNESS);
2618
2619 if(params.get(KEY_QC_SHARPNESS) == NULL) {
2620 LOGH("Sharpness not set by App ");
2621 return NO_ERROR;
2622 }
2623 if (prev_sharp != shaprness) {
2624 if((shaprness >= m_pCapability->sharpness_ctrl.min_value) &&
2625 (shaprness <= m_pCapability->sharpness_ctrl.max_value)) {
2626 LOGD("new sharpness value : %d ", shaprness);
2627 return setSharpness(shaprness);
2628 } else {
2629 LOGE("invalid value %d out of (%d, %d)",
2630 shaprness,
2631 m_pCapability->sharpness_ctrl.min_value,
2632 m_pCapability->sharpness_ctrl.max_value);
2633 return BAD_VALUE;
2634 }
2635 } else {
2636 LOGD("No value change in shaprness");
2637 return NO_ERROR;
2638 }
2639 }
2640
2641 /*===========================================================================
2642 * FUNCTION : setSkintoneEnahancement
2643 *
2644 * DESCRIPTION: set skin tone enhancement factor from user setting
2645 *
2646 * PARAMETERS :
2647 * @params : user setting parameters
2648 *
2649 * RETURN : int32_t type of status
2650 * NO_ERROR -- success
2651 * none-zero failure code
2652 *==========================================================================*/
setSkinToneEnhancement(const QCameraParameters & params)2653 int32_t QCameraParameters::setSkinToneEnhancement(const QCameraParameters& params)
2654 {
2655 int sceFactor = params.getInt(KEY_QC_SCE_FACTOR);
2656 int prev_sceFactor = getInt(KEY_QC_SCE_FACTOR);
2657
2658 if(params.get(KEY_QC_SCE_FACTOR) == NULL) {
2659 LOGH("Skintone enhancement not set by App ");
2660 return NO_ERROR;
2661 }
2662 if (prev_sceFactor != sceFactor) {
2663 if((sceFactor >= m_pCapability->sce_ctrl.min_value) &&
2664 (sceFactor <= m_pCapability->sce_ctrl.max_value)) {
2665 LOGD("new Skintone Enhancement value : %d ", sceFactor);
2666 return setSkinToneEnhancement(sceFactor);
2667 } else {
2668 LOGE("invalid value %d out of (%d, %d)",
2669 sceFactor,
2670 m_pCapability->sce_ctrl.min_value,
2671 m_pCapability->sce_ctrl.max_value);
2672 return BAD_VALUE;
2673 }
2674 } else {
2675 LOGD("No value change in skintone enhancement factor");
2676 return NO_ERROR;
2677 }
2678 }
2679
2680 /*===========================================================================
2681 * FUNCTION : setSaturation
2682 *
2683 * DESCRIPTION: set saturation control value from user setting
2684 *
2685 * PARAMETERS :
2686 * @params : user setting parameters
2687 *
2688 * RETURN : int32_t type of status
2689 * NO_ERROR -- success
2690 * none-zero failure code
2691 *==========================================================================*/
setSaturation(const QCameraParameters & params)2692 int32_t QCameraParameters::setSaturation(const QCameraParameters& params)
2693 {
2694 int saturation = params.getInt(KEY_QC_SATURATION);
2695 int prev_sat = getInt(KEY_QC_SATURATION);
2696
2697 if(params.get(KEY_QC_SATURATION) == NULL) {
2698 LOGH("Saturation not set by App ");
2699 return NO_ERROR;
2700 }
2701 if (prev_sat != saturation) {
2702 if((saturation >= m_pCapability->saturation_ctrl.min_value) &&
2703 (saturation <= m_pCapability->saturation_ctrl.max_value)) {
2704 LOGD("new saturation value : %d ", saturation);
2705 return setSaturation(saturation);
2706 } else {
2707 LOGE("invalid value %d out of (%d, %d)",
2708 saturation,
2709 m_pCapability->saturation_ctrl.min_value,
2710 m_pCapability->saturation_ctrl.max_value);
2711 return BAD_VALUE;
2712 }
2713 } else {
2714 LOGD("No value change in saturation factor");
2715 return NO_ERROR;
2716 }
2717 }
2718
2719 /*===========================================================================
2720 * FUNCTION : setContrast
2721 *
2722 * DESCRIPTION: set contrast control value from user setting
2723 *
2724 * PARAMETERS :
2725 * @params : user setting parameters
2726 *
2727 * RETURN : int32_t type of status
2728 * NO_ERROR -- success
2729 * none-zero failure code
2730 *==========================================================================*/
setContrast(const QCameraParameters & params)2731 int32_t QCameraParameters::setContrast(const QCameraParameters& params)
2732 {
2733 int contrast = params.getInt(KEY_QC_CONTRAST);
2734 int prev_contrast = getInt(KEY_QC_CONTRAST);
2735
2736 if(params.get(KEY_QC_CONTRAST) == NULL) {
2737 LOGH("Contrast not set by App ");
2738 return NO_ERROR;
2739 }
2740 if (prev_contrast != contrast) {
2741 if((contrast >= m_pCapability->contrast_ctrl.min_value) &&
2742 (contrast <= m_pCapability->contrast_ctrl.max_value)) {
2743 LOGD("new contrast value : %d ", contrast);
2744 int32_t rc = setContrast(contrast);
2745 return rc;
2746 } else {
2747 LOGE("invalid value %d out of (%d, %d)",
2748 contrast,
2749 m_pCapability->contrast_ctrl.min_value,
2750 m_pCapability->contrast_ctrl.max_value);
2751 return BAD_VALUE;
2752 }
2753 } else {
2754 LOGD("No value change in contrast");
2755 return NO_ERROR;
2756 }
2757 }
2758
2759 /*===========================================================================
2760 * FUNCTION : setExposureCompensation
2761 *
2762 * DESCRIPTION: set exposure compensation value from user setting
2763 *
2764 * PARAMETERS :
2765 * @params : user setting parameters
2766 *
2767 * RETURN : int32_t type of status
2768 * NO_ERROR -- success
2769 * none-zero failure code
2770 *==========================================================================*/
setExposureCompensation(const QCameraParameters & params)2771 int32_t QCameraParameters::setExposureCompensation(const QCameraParameters & params)
2772 {
2773 int expComp = params.getInt(KEY_EXPOSURE_COMPENSATION);
2774 int prev_expComp = getInt(KEY_EXPOSURE_COMPENSATION);
2775
2776 if(params.get(KEY_EXPOSURE_COMPENSATION) == NULL) {
2777 LOGH("Exposure compensation not set by App ");
2778 return NO_ERROR;
2779 }
2780 if (prev_expComp != expComp) {
2781 if((expComp >= m_pCapability->exposure_compensation_min) &&
2782 (expComp <= m_pCapability->exposure_compensation_max)) {
2783 LOGD("new Exposure Compensation value : %d ", expComp);
2784 return setExposureCompensation(expComp);
2785 } else {
2786 LOGE("invalid value %d out of (%d, %d)",
2787 expComp,
2788 m_pCapability->exposure_compensation_min,
2789 m_pCapability->exposure_compensation_max);
2790 return BAD_VALUE;
2791 }
2792 } else {
2793 LOGD("No value change in Exposure Compensation");
2794 return NO_ERROR;
2795 }
2796 }
2797
2798 /*===========================================================================
2799 * FUNCTION : setWhiteBalance
2800 *
2801 * DESCRIPTION: set white balance value from user setting
2802 *
2803 * PARAMETERS :
2804 * @params : user setting parameters
2805 *
2806 * RETURN : int32_t type of status
2807 * NO_ERROR -- success
2808 * none-zero failure code
2809 *==========================================================================*/
setWhiteBalance(const QCameraParameters & params)2810 int32_t QCameraParameters::setWhiteBalance(const QCameraParameters& params)
2811 {
2812 const char *str = params.get(KEY_WHITE_BALANCE);
2813 const char *prev_str = get(KEY_WHITE_BALANCE);
2814 if (str != NULL) {
2815 if (prev_str == NULL ||
2816 strcmp(str, prev_str) != 0) {
2817 return setWhiteBalance(str);
2818 }
2819 }
2820 return NO_ERROR;
2821 }
2822
2823 /*===========================================================================
2824 * FUNCTION : setManualWhiteBalance
2825 *
2826 * DESCRIPTION: set manual white balance from user setting
2827 *
2828 * PARAMETERS :
2829 * @params : user setting parameters
2830 *
2831 * RETURN : int32_t type of status
2832 * NO_ERROR -- success
2833 * none-zero failure code
2834 *==========================================================================*/
setManualWhiteBalance(const QCameraParameters & params)2835 int32_t QCameraParameters::setManualWhiteBalance(const QCameraParameters& params)
2836 {
2837 int32_t rc = NO_ERROR;
2838 const char *wb_str = params.get(KEY_WHITE_BALANCE);
2839 const char *prev_wb_str = get(KEY_WHITE_BALANCE);
2840 LOGD("current wb mode: %s", wb_str);
2841
2842 if (wb_str != NULL) {
2843 if (strcmp(wb_str, WHITE_BALANCE_MANUAL)) {
2844 LOGD("dont set cct to back-end.");
2845 return NO_ERROR;
2846 }
2847 }
2848
2849 const char *value = params.get(KEY_QC_MANUAL_WB_VALUE);
2850 const char *prev_value = get(KEY_QC_MANUAL_WB_VALUE);
2851 const char *type = params.get(KEY_QC_MANUAL_WB_TYPE);
2852 const char *prev_type = get(KEY_QC_MANUAL_WB_TYPE);
2853
2854 if ((value != NULL) && (type != NULL) && (wb_str != NULL)) {
2855 if (prev_value == NULL || (strcmp(value, prev_value) != 0) ||
2856 prev_type == NULL || (strcmp(type, prev_type) != 0) ||
2857 prev_wb_str == NULL || (strcmp(wb_str, prev_wb_str) != 0)) {
2858 updateParamEntry(KEY_QC_MANUAL_WB_TYPE, type);
2859 updateParamEntry(KEY_QC_MANUAL_WB_VALUE, value);
2860 int32_t wb_type = atoi(type);
2861 if (wb_type == CAM_MANUAL_WB_MODE_CCT) {
2862 rc = setWBManualCCT(value);
2863 } else if (wb_type == CAM_MANUAL_WB_MODE_GAIN) {
2864 rc = setManualWBGains(value);
2865 } else {
2866 rc = BAD_VALUE;
2867 }
2868 }
2869 }
2870 return rc;
2871 }
2872
2873 /*===========================================================================
2874 * FUNCTION : setAntibanding
2875 *
2876 * DESCRIPTION: set antibanding value from user setting
2877 *
2878 * PARAMETERS :
2879 * @params : user setting parameters
2880 *
2881 * RETURN : int32_t type of status
2882 * NO_ERROR -- success
2883 * none-zero failure code
2884 *==========================================================================*/
setAntibanding(const QCameraParameters & params)2885 int32_t QCameraParameters::setAntibanding(const QCameraParameters& params)
2886 {
2887 const char *str = params.get(KEY_ANTIBANDING);
2888 const char *prev_str = get(KEY_ANTIBANDING);
2889 if (str != NULL) {
2890 if (prev_str == NULL ||
2891 strcmp(str, prev_str) != 0) {
2892 return setAntibanding(str);
2893 }
2894 }
2895 return NO_ERROR;
2896 }
2897
2898 /*===========================================================================
2899 * FUNCTION : setStatsDebugMask
2900 *
2901 * DESCRIPTION: get the value from persist file in Stats module that will
2902 * control funtionality in the module
2903 *
2904 * PARAMETERS : none
2905 *
2906 * RETURN : int32_t type of status
2907 * NO_ERROR -- success
2908 * none-zero failure code
2909 *==========================================================================*/
setStatsDebugMask()2910 int32_t QCameraParameters::setStatsDebugMask()
2911 {
2912 uint32_t mask = 0;
2913 char value[PROPERTY_VALUE_MAX];
2914
2915 property_get("persist.camera.stats.debug.mask", value, "0");
2916 mask = (uint32_t)atoi(value);
2917
2918 LOGH("ctrl mask :%d", mask);
2919
2920 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_STATS_DEBUG_MASK, mask)) {
2921 return BAD_VALUE;
2922 }
2923
2924 return NO_ERROR;
2925 }
2926
2927 /*===========================================================================
2928 * FUNCTION : setPAAF
2929 *
2930 * DESCRIPTION: get the value from persist file in Stats module that will
2931 * control the preview assisted AF in the module
2932 *
2933 * PARAMETERS : none
2934 *
2935 * RETURN : int32_t type of status
2936 * NO_ERROR -- success
2937 * none-zero failure code
2938 *==========================================================================*/
setPAAF()2939 int32_t QCameraParameters::setPAAF()
2940 {
2941 uint32_t paaf = 0;
2942 char value[PROPERTY_VALUE_MAX];
2943
2944 property_get("persist.camera.stats.af.paaf", value, "1");
2945 paaf = (uint32_t)atoi(value);
2946
2947 LOGH("PAAF is: %s", paaf ? "ON": "OFF");
2948
2949 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_STATS_AF_PAAF, paaf)) {
2950 return BAD_VALUE;
2951 }
2952
2953 return NO_ERROR;
2954 }
2955
2956 /*===========================================================================
2957 * FUNCTION : setSceneDetect
2958 *
2959 * DESCRIPTION: set scenen detect value from user setting
2960 *
2961 * PARAMETERS :
2962 * @params : user setting parameters
2963 *
2964 * RETURN : int32_t type of status
2965 * NO_ERROR -- success
2966 * none-zero failure code
2967 *==========================================================================*/
setSceneDetect(const QCameraParameters & params)2968 int32_t QCameraParameters::setSceneDetect(const QCameraParameters& params)
2969 {
2970 const char *str = params.get(KEY_QC_SCENE_DETECT);
2971 const char *prev_str = get(KEY_QC_SCENE_DETECT);
2972 if (str != NULL) {
2973 if (prev_str == NULL ||
2974 strcmp(str, prev_str) != 0) {
2975 return setSceneDetect(str);
2976 }
2977 }
2978 return NO_ERROR;
2979 }
2980
2981 /*===========================================================================
2982 * FUNCTION : setVideoHDR
2983 *
2984 * DESCRIPTION: set video HDR value from user setting
2985 *
2986 * PARAMETERS :
2987 * @params : user setting parameters
2988 *
2989 * RETURN : int32_t type of status
2990 * NO_ERROR -- success
2991 * none-zero failure code
2992 *==========================================================================*/
setVideoHDR(const QCameraParameters & params)2993 int32_t QCameraParameters::setVideoHDR(const QCameraParameters& params)
2994 {
2995 const char *str = params.get(KEY_QC_VIDEO_HDR);
2996 const char *prev_str = get(KEY_QC_VIDEO_HDR);
2997 if (str != NULL) {
2998 if (prev_str == NULL ||
2999 strcmp(str, prev_str) != 0) {
3000 return setVideoHDR(str);
3001 }
3002 }
3003 return NO_ERROR;
3004 }
3005
3006 /*===========================================================================
3007 * FUNCTION : setVtEnable
3008 *
3009 * DESCRIPTION: set vt Time Stamp enable from user setting
3010 *
3011 * PARAMETERS :
3012 * @params : user setting parameters
3013 *
3014 * RETURN : int32_t type of status
3015 * NO_ERROR -- success
3016 * none-zero failure code
3017 *==========================================================================*/
setVtEnable(const QCameraParameters & params)3018 int32_t QCameraParameters::setVtEnable(const QCameraParameters& params)
3019 {
3020 const char *str = params.get(KEY_QC_VT_ENABLE);
3021 const char *prev_str = get(KEY_QC_VT_ENABLE);
3022 if (str != NULL) {
3023 if (prev_str == NULL ||
3024 strcmp(str, prev_str) != 0) {
3025 return setVtEnable(str);
3026 }
3027 }
3028 return NO_ERROR;
3029 }
3030
3031 /*===========================================================================
3032 * FUNCTION : setFaceRecognition
3033 *
3034 * DESCRIPTION: set face recognition mode from user setting
3035 *
3036 * PARAMETERS :
3037 * @params : user setting parameters
3038 *
3039 * RETURN : int32_t type of status
3040 * NO_ERROR -- success
3041 * none-zero failure code
3042 *==========================================================================*/
setFaceRecognition(const QCameraParameters & params)3043 int32_t QCameraParameters::setFaceRecognition(const QCameraParameters& params)
3044 {
3045 const char *str = params.get(KEY_QC_FACE_RECOGNITION);
3046 const char *prev_str = get(KEY_QC_FACE_RECOGNITION);
3047 if (str != NULL) {
3048 if (prev_str == NULL ||
3049 strcmp(str, prev_str) != 0) {
3050 uint32_t maxFaces = (uint32_t)params.getInt(KEY_QC_MAX_NUM_REQUESTED_FACES);
3051 return setFaceRecognition(str, maxFaces);
3052 }
3053 }
3054 return NO_ERROR;
3055 }
3056
3057 /*===========================================================================
3058 * FUNCTION : setZoom
3059 *
3060 * DESCRIPTION: set zoom value from user setting
3061 *
3062 * PARAMETERS :
3063 * @params : user setting parameters
3064 *
3065 * RETURN : int32_t type of status
3066 * NO_ERROR -- success
3067 * none-zero failure code
3068 *==========================================================================*/
setZoom(const QCameraParameters & params)3069 int32_t QCameraParameters::setZoom(const QCameraParameters& params)
3070 {
3071 if ((m_pCapability->zoom_supported == 0 ||
3072 m_pCapability->zoom_ratio_tbl_cnt == 0)) {
3073 LOGH("no zoom support");
3074 return NO_ERROR;
3075 }
3076
3077 int zoomLevel = params.getInt(KEY_ZOOM);
3078 mParmZoomLevel = zoomLevel;
3079 if ((zoomLevel < 0) || (zoomLevel >= (int)m_pCapability->zoom_ratio_tbl_cnt)) {
3080 LOGE("invalid value %d out of (%d, %d)",
3081 zoomLevel,
3082 0, m_pCapability->zoom_ratio_tbl_cnt-1);
3083 return BAD_VALUE;
3084 }
3085
3086 int prevZoomLevel = getInt(KEY_ZOOM);
3087 if (prevZoomLevel == zoomLevel) {
3088 LOGD("No value change in zoom %d %d", prevZoomLevel, zoomLevel);
3089 return NO_ERROR;
3090 }
3091
3092 return setZoom(zoomLevel);
3093 }
3094
3095 /*===========================================================================
3096 * FUNCTION : setISOValue
3097 *
3098 * DESCRIPTION: set ISO value from user setting
3099 *
3100 * PARAMETERS :
3101 * @params : user setting parameters
3102 *
3103 * RETURN : int32_t type of status
3104 * NO_ERROR -- success
3105 * none-zero failure code
3106 *==========================================================================*/
setISOValue(const QCameraParameters & params)3107 int32_t QCameraParameters::setISOValue(const QCameraParameters& params)
3108 {
3109 const char *str = params.get(KEY_QC_ISO_MODE);
3110 const char *prev_str = get(KEY_QC_ISO_MODE);
3111
3112 if(getManualCaptureMode()) {
3113 char iso_val[PROPERTY_VALUE_MAX];
3114
3115 property_get("persist.camera.iso", iso_val, "");
3116 if (strlen(iso_val) > 0) {
3117 if (prev_str == NULL ||
3118 strcmp(iso_val, prev_str) != 0) {
3119 return setISOValue(iso_val);
3120 }
3121 }
3122 } else if (str != NULL) {
3123 if (prev_str == NULL ||
3124 strcmp(str, prev_str) != 0) {
3125 return setISOValue(str);
3126 }
3127 }
3128 return NO_ERROR;
3129 }
3130
3131 /*===========================================================================
3132 * FUNCTION : setContinuousISO
3133 *
3134 * DESCRIPTION: set ISO value from user setting
3135 *
3136 * PARAMETERS :
3137 * @params : user setting parameters
3138 *
3139 * RETURN : int32_t type of status
3140 * NO_ERROR -- success
3141 * none-zero failure code
3142 *==========================================================================*/
setContinuousISO(const char * isoValue)3143 int32_t QCameraParameters::setContinuousISO(const char *isoValue)
3144 {
3145 char iso[PROPERTY_VALUE_MAX];
3146 int32_t continous_iso = 0;
3147
3148 // Check if continuous ISO is set through setproperty
3149 property_get("persist.camera.continuous.iso", iso, "");
3150 if (strlen(iso) > 0) {
3151 continous_iso = atoi(iso);
3152 } else {
3153 continous_iso = atoi(isoValue);
3154 }
3155
3156 if ((continous_iso >= 0) &&
3157 (continous_iso <= m_pCapability->sensitivity_range.max_sensitivity)) {
3158 LOGH("Setting continuous ISO value %d", continous_iso);
3159 updateParamEntry(KEY_QC_CONTINUOUS_ISO, isoValue);
3160
3161 cam_intf_parm_manual_3a_t iso_settings;
3162 memset(&iso_settings, 0, sizeof(cam_intf_parm_manual_3a_t));
3163 iso_settings.previewOnly = FALSE;
3164 iso_settings.value = continous_iso;
3165 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ISO, iso_settings)) {
3166 return BAD_VALUE;
3167 }
3168 return NO_ERROR;
3169 }
3170 LOGE("Invalid iso value: %d", continous_iso);
3171 return BAD_VALUE;
3172 }
3173
3174 /*===========================================================================
3175 * FUNCTION : setExposureTime
3176 *
3177 * DESCRIPTION: set exposure time from user setting
3178 *
3179 * PARAMETERS :
3180 * @params : user setting parameters
3181 *
3182 * RETURN : int32_t type of status
3183 * NO_ERROR -- success
3184 * none-zero failure code
3185 *==========================================================================*/
setExposureTime(const QCameraParameters & params)3186 int32_t QCameraParameters::setExposureTime(const QCameraParameters& params)
3187 {
3188 const char *str = params.get(KEY_QC_EXPOSURE_TIME);
3189 const char *prev_str = get(KEY_QC_EXPOSURE_TIME);
3190 if (str != NULL) {
3191 if (prev_str == NULL ||
3192 strcmp(str, prev_str) != 0) {
3193 return setExposureTime(str);
3194 }
3195 } else if(getManualCaptureMode()) {
3196 char expTime[PROPERTY_VALUE_MAX];
3197
3198 property_get("persist.camera.exposure.time", expTime, "");
3199 if (strlen(expTime) > 0) {
3200 if (prev_str == NULL ||
3201 strcmp(expTime, prev_str) != 0) {
3202 return setExposureTime(expTime);
3203 }
3204 }
3205 }
3206
3207 return NO_ERROR;
3208 }
3209
3210 /*===========================================================================
3211 * FUNCTION : setVideoRotation
3212 *
3213 * DESCRIPTION: set rotation value from user setting
3214 *
3215 * PARAMETERS :
3216 * @params : user setting parameters
3217 *
3218 * RETURN : int32_t type of status
3219 * NO_ERROR -- success
3220 * none-zero failure code
3221 *==========================================================================*/
setVideoRotation(const QCameraParameters & params)3222 int32_t QCameraParameters::setVideoRotation(const QCameraParameters& params)
3223 {
3224 const char *str = params.get(KEY_QC_VIDEO_ROTATION);
3225 if(str != NULL) {
3226 int value = lookupAttr(VIDEO_ROTATION_MODES_MAP,
3227 PARAM_MAP_SIZE(VIDEO_ROTATION_MODES_MAP), str);
3228 if (value != NAME_NOT_FOUND) {
3229 updateParamEntry(KEY_QC_VIDEO_ROTATION, str);
3230 LOGL("setVideoRotation: %d: ", str, value);
3231 } else {
3232 LOGE("Invalid rotation value: %d", value);
3233 return BAD_VALUE;
3234 }
3235
3236 }
3237 return NO_ERROR;
3238 }
3239
3240 /*===========================================================================
3241 * FUNCTION : setRotation
3242 *
3243 * DESCRIPTION: set rotation value from user setting
3244 *
3245 * PARAMETERS :
3246 * @params : user setting parameters
3247 *
3248 * RETURN : int32_t type of status
3249 * NO_ERROR -- success
3250 * none-zero failure code
3251 *==========================================================================*/
setRotation(const QCameraParameters & params)3252 int32_t QCameraParameters::setRotation(const QCameraParameters& params)
3253 {
3254 int32_t rotation = params.getInt(KEY_ROTATION);
3255 if (rotation != -1) {
3256 if (rotation == 0 || rotation == 90 ||
3257 rotation == 180 || rotation == 270) {
3258 set(KEY_ROTATION, rotation);
3259
3260 ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_META_JPEG_ORIENTATION,
3261 rotation);
3262 mRotation = rotation;
3263 } else {
3264 LOGE("Invalid rotation value: %d", rotation);
3265 return BAD_VALUE;
3266 }
3267 }
3268 return NO_ERROR;
3269 }
3270
3271 /*===========================================================================
3272 * FUNCTION : setFlash
3273 *
3274 * DESCRIPTION: set flash mode from user setting
3275 *
3276 * PARAMETERS :
3277 * @params : user setting parameters
3278 *
3279 * RETURN : int32_t type of status
3280 * NO_ERROR -- success
3281 * none-zero failure code
3282 *==========================================================================*/
setFlash(const QCameraParameters & params)3283 int32_t QCameraParameters::setFlash(const QCameraParameters& params)
3284 {
3285 const char *str = params.get(KEY_FLASH_MODE);
3286 const char *prev_str = get(KEY_FLASH_MODE);
3287 if (str != NULL) {
3288 if (prev_str == NULL ||
3289 strcmp(str, prev_str) != 0) {
3290 return setFlash(str);
3291 }
3292 }
3293 return NO_ERROR;
3294 }
3295
3296 /*===========================================================================
3297 * FUNCTION : setAecLock
3298 *
3299 * DESCRIPTION: set AEC lock value from user setting
3300 *
3301 * PARAMETERS :
3302 * @params : user setting parameters
3303 *
3304 * RETURN : int32_t type of status
3305 * NO_ERROR -- success
3306 * none-zero failure code
3307 *==========================================================================*/
setAecLock(const QCameraParameters & params)3308 int32_t QCameraParameters::setAecLock(const QCameraParameters& params)
3309 {
3310 const char *str = params.get(KEY_AUTO_EXPOSURE_LOCK);
3311 const char *prev_str = get(KEY_AUTO_EXPOSURE_LOCK);
3312 if (str != NULL) {
3313 if (prev_str == NULL ||
3314 strcmp(str, prev_str) != 0) {
3315 return setAecLock(str);
3316 }
3317 }
3318 return NO_ERROR;
3319 }
3320
3321 /*===========================================================================
3322 * FUNCTION : setAwbLock
3323 *
3324 * DESCRIPTION: set AWB lock from user setting
3325 *
3326 * PARAMETERS :
3327 * @params : user setting parameters
3328 *
3329 * RETURN : int32_t type of status
3330 * NO_ERROR -- success
3331 * none-zero failure code
3332 *==========================================================================*/
setAwbLock(const QCameraParameters & params)3333 int32_t QCameraParameters::setAwbLock(const QCameraParameters& params)
3334 {
3335 const char *str = params.get(KEY_AUTO_WHITEBALANCE_LOCK);
3336 const char *prev_str = get(KEY_AUTO_WHITEBALANCE_LOCK);
3337 if (str != NULL) {
3338 if (prev_str == NULL ||
3339 strcmp(str, prev_str) != 0) {
3340 return setAwbLock(str);
3341 }
3342 }
3343 return NO_ERROR;
3344 }
3345
3346 /*===========================================================================
3347 * FUNCTION : setAutoHDR
3348 *
3349 * DESCRIPTION: Enable/disable auto HDR
3350 *
3351 * PARAMETERS :
3352 * @params : user setting parameters
3353 *
3354 * RETURN : int32_t type of status
3355 * NO_ERROR -- success
3356 * none-zero failure code
3357 *==========================================================================*/
setAutoHDR(const QCameraParameters & params)3358 int32_t QCameraParameters::setAutoHDR(const QCameraParameters& params)
3359 {
3360 const char *str = params.get(KEY_QC_AUTO_HDR_ENABLE);
3361 const char *prev_str = get(KEY_QC_AUTO_HDR_ENABLE);
3362 char prop[PROPERTY_VALUE_MAX];
3363
3364 memset(prop, 0, sizeof(prop));
3365 property_get("persist.camera.auto.hdr.enable", prop, VALUE_DISABLE);
3366 if (str != NULL) {
3367 if (prev_str == NULL ||
3368 strcmp(str, prev_str) != 0) {
3369 LOGH("Auto HDR set to: %s", str);
3370 return updateParamEntry(KEY_QC_AUTO_HDR_ENABLE, str);
3371 }
3372 } else {
3373 if (prev_str == NULL ||
3374 strcmp(prev_str, prop) != 0 ) {
3375 LOGH("Auto HDR set to: %s", prop);
3376 updateParamEntry(KEY_QC_AUTO_HDR_ENABLE, prop);
3377 }
3378 }
3379
3380 return NO_ERROR;
3381 }
3382
3383 /*===========================================================================
3384 * FUNCTION : isAutoHDREnabled
3385 *
3386 * DESCRIPTION: Query auto HDR status
3387 *
3388 * PARAMETERS : None
3389 *
3390 * RETURN : bool true/false
3391 *==========================================================================*/
isAutoHDREnabled()3392 bool QCameraParameters::isAutoHDREnabled()
3393 {
3394 const char *str = get(KEY_QC_AUTO_HDR_ENABLE);
3395 if (str != NULL) {
3396 int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
3397 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), str);
3398 if (value == NAME_NOT_FOUND) {
3399 LOGE("Invalid Auto HDR value %s", str);
3400 return false;
3401 }
3402
3403 LOGH("Auto HDR status is: %d", value);
3404 return value ? true : false;
3405 }
3406
3407 LOGH("Auto HDR status not set!");
3408 return false;
3409 }
3410
3411 /*===========================================================================
3412 * FUNCTION : setMCEValue
3413 *
3414 * DESCRIPTION: set memory color enhancement value from user setting
3415 *
3416 * PARAMETERS :
3417 * @params : user setting parameters
3418 *
3419 * RETURN : int32_t type of status
3420 * NO_ERROR -- success
3421 * none-zero failure code
3422 *==========================================================================*/
setMCEValue(const QCameraParameters & params)3423 int32_t QCameraParameters::setMCEValue(const QCameraParameters& params)
3424 {
3425 const char *str = params.get(KEY_QC_MEMORY_COLOR_ENHANCEMENT);
3426 const char *prev_str = get(KEY_QC_MEMORY_COLOR_ENHANCEMENT);
3427 if (str != NULL) {
3428 if (prev_str == NULL ||
3429 strcmp(str, prev_str) != 0) {
3430 return setMCEValue(str);
3431 }
3432 }
3433 return NO_ERROR;
3434 }
3435
3436 /*===========================================================================
3437 * FUNCTION : setDISValue
3438 *
3439 * DESCRIPTION: enable/disable DIS from user setting
3440 *
3441 * PARAMETERS :
3442 * @params : user setting parameters
3443 *
3444 * RETURN : int32_t type of status
3445 * NO_ERROR -- success
3446 * none-zero failure code
3447 *==========================================================================*/
setDISValue(const QCameraParameters & params)3448 int32_t QCameraParameters::setDISValue(const QCameraParameters& params)
3449 {
3450 const char *str = params.get(KEY_QC_DIS);
3451 const char *prev_str = get(KEY_QC_DIS);
3452 if (str != NULL) {
3453 if (prev_str == NULL ||
3454 strcmp(str, prev_str) != 0) {
3455 return setDISValue(str);
3456 }
3457 }
3458 return NO_ERROR;
3459 }
3460
3461 /*===========================================================================
3462 * FUNCTION : setLensShadeValue
3463 *
3464 * DESCRIPTION: set lens shade value from user setting
3465 *
3466 * PARAMETERS :
3467 * @params : user setting parameters
3468 *
3469 * RETURN : int32_t type of status
3470 * NO_ERROR -- success
3471 * none-zero failure code
3472 *==========================================================================*/
setLensShadeValue(const QCameraParameters & params)3473 int32_t QCameraParameters::setLensShadeValue(const QCameraParameters& params)
3474 {
3475 const char *str = params.get(KEY_QC_LENSSHADE);
3476 const char *prev_str = get(KEY_QC_LENSSHADE);
3477 if (str != NULL) {
3478 if (prev_str == NULL ||
3479 strcmp(str, prev_str) != 0) {
3480 return setLensShadeValue(str);
3481 }
3482 }
3483 return NO_ERROR;
3484 }
3485
3486 /*===========================================================================
3487 * FUNCTION : setFocusAreas
3488 *
3489 * DESCRIPTION: set focus areas from user setting
3490 *
3491 * PARAMETERS :
3492 * @params : user setting parameters
3493 *
3494 * RETURN : int32_t type of status
3495 * NO_ERROR -- success
3496 * none-zero failure code
3497 *==========================================================================*/
setFocusAreas(const QCameraParameters & params)3498 int32_t QCameraParameters::setFocusAreas(const QCameraParameters& params)
3499 {
3500 const char *str = params.get(KEY_FOCUS_AREAS);
3501
3502 if (getRelatedCamSyncInfo()->mode == CAM_MODE_SECONDARY) {
3503 // Ignore focus areas for secondary camera
3504 LOGH("Ignore focus areas for secondary camera!! ");
3505 return NO_ERROR;
3506 }
3507 if (str != NULL) {
3508 int max_num_af_areas = getInt(KEY_MAX_NUM_FOCUS_AREAS);
3509 if(max_num_af_areas == 0) {
3510 LOGE("max num of AF area is 0, cannot set focus areas");
3511 return BAD_VALUE;
3512 }
3513
3514 const char *prev_str = get(KEY_FOCUS_AREAS);
3515 if (prev_str == NULL ||
3516 strcmp(str, prev_str) != 0) {
3517 return setFocusAreas(str);
3518 }
3519 }
3520 return NO_ERROR;
3521 }
3522
3523 /*===========================================================================
3524 * FUNCTION : setMeteringAreas
3525 *
3526 * DESCRIPTION: set metering areas from user setting
3527 *
3528 * PARAMETERS :
3529 * @params : user setting parameters
3530 *
3531 * RETURN : int32_t type of status
3532 * NO_ERROR -- success
3533 * none-zero failure code
3534 *==========================================================================*/
setMeteringAreas(const QCameraParameters & params)3535 int32_t QCameraParameters::setMeteringAreas(const QCameraParameters& params)
3536 {
3537 const char *str = params.get(KEY_METERING_AREAS);
3538 if (str != NULL) {
3539 int max_num_mtr_areas = getInt(KEY_MAX_NUM_METERING_AREAS);
3540 if(max_num_mtr_areas == 0) {
3541 LOGE("max num of metering areas is 0, cannot set focus areas");
3542 return BAD_VALUE;
3543 }
3544
3545 const char *prev_str = get(KEY_METERING_AREAS);
3546 if (prev_str == NULL ||
3547 strcmp(str, prev_str) != 0 ||
3548 (m_bNeedRestart == true)) {
3549 return setMeteringAreas(str);
3550 }
3551 }
3552 return NO_ERROR;
3553 }
3554
3555 /*===========================================================================
3556 * FUNCTION : setSceneMode
3557 *
3558 * DESCRIPTION: set scenen mode from user setting
3559 *
3560 * PARAMETERS :
3561 * @params : user setting parameters
3562 *
3563 * RETURN : int32_t type of status
3564 * NO_ERROR -- success
3565 * none-zero failure code
3566 *==========================================================================*/
setSceneMode(const QCameraParameters & params)3567 int32_t QCameraParameters::setSceneMode(const QCameraParameters& params)
3568 {
3569 const char *str = params.get(KEY_SCENE_MODE);
3570 const char *prev_str = get(KEY_SCENE_MODE);
3571 LOGH("str - %s, prev_str - %s", str, prev_str);
3572
3573 // HDR & Recording are mutually exclusive and so disable HDR if recording hint is set
3574 if (m_bRecordingHint_new && m_bHDREnabled) {
3575 LOGH("Disable the HDR and set it to Auto");
3576 str = SCENE_MODE_AUTO;
3577 m_bLocalHDREnabled = true;
3578 } else if (!m_bRecordingHint_new && m_bLocalHDREnabled) {
3579 LOGH("Restore the HDR from Auto scene mode");
3580 str = SCENE_MODE_HDR;
3581 m_bLocalHDREnabled = false;
3582 }
3583
3584 if (str != NULL) {
3585 if (prev_str == NULL ||
3586 strcmp(str, prev_str) != 0) {
3587
3588 if(strcmp(str, SCENE_MODE_AUTO) == 0) {
3589 m_bSceneTransitionAuto = true;
3590 }
3591 if (strcmp(str, SCENE_MODE_HDR) == 0) {
3592
3593 // If HDR is set from client and the feature is not enabled in the backend, ignore it.
3594 if (m_bHDRModeSensor && isSupportedSensorHdrSize(params)) {
3595 m_bSensorHDREnabled = true;
3596 LOGH("Sensor HDR mode Enabled");
3597 } else {
3598 m_bHDREnabled = true;
3599 LOGH("S/W HDR Enabled");
3600 }
3601 } else {
3602 m_bHDREnabled = false;
3603 if (m_bSensorHDREnabled) {
3604 m_bSensorHDREnabled = false;
3605 m_bNeedRestart = true;
3606 setSensorSnapshotHDR("off");
3607 }
3608 }
3609
3610 if (m_bSensorHDREnabled) {
3611 setSensorSnapshotHDR("on");
3612 m_bNeedRestart = true;
3613 } else if ((m_bHDREnabled) ||
3614 ((prev_str != NULL) && (strcmp(prev_str, SCENE_MODE_HDR) == 0))) {
3615 LOGH("scene mode changed between HDR and non-HDR, need restart");
3616 m_bNeedRestart = true;
3617 }
3618
3619 return setSceneMode(str);
3620 }
3621 }
3622 return NO_ERROR;
3623 }
3624
3625 /*===========================================================================
3626 * FUNCTION : setSelectableZoneAf
3627 *
3628 * DESCRIPTION: set selectable zone auto focus value from user setting
3629 *
3630 * PARAMETERS :
3631 * @params : user setting parameters
3632 *
3633 * RETURN : int32_t type of status
3634 * NO_ERROR -- success
3635 * none-zero failure code
3636 *==========================================================================*/
setSelectableZoneAf(const QCameraParameters & params)3637 int32_t QCameraParameters::setSelectableZoneAf(const QCameraParameters& params)
3638 {
3639 const char *str = params.get(KEY_QC_SELECTABLE_ZONE_AF);
3640 const char *prev_str = get(KEY_QC_SELECTABLE_ZONE_AF);
3641 if (str != NULL) {
3642 if (prev_str == NULL ||
3643 strcmp(str, prev_str) != 0) {
3644 return setSelectableZoneAf(str);
3645 }
3646 }
3647 return NO_ERROR;
3648 }
3649
3650 /*===========================================================================
3651 * FUNCTION : setAEBracket
3652 *
3653 * DESCRIPTION: set AE bracket from user setting
3654 *
3655 * PARAMETERS :
3656 * @params : user setting parameters
3657 *
3658 * RETURN : int32_t type of status
3659 * NO_ERROR -- success
3660 * none-zero failure code
3661 *==========================================================================*/
setAEBracket(const QCameraParameters & params)3662 int32_t QCameraParameters::setAEBracket(const QCameraParameters& params)
3663 {
3664 if (isHDREnabled()) {
3665 LOGH("scene mode is HDR, overwrite AE bracket setting to off");
3666 return setAEBracket(AE_BRACKET_OFF);
3667 }
3668
3669 const char *expStr = params.get(KEY_QC_CAPTURE_BURST_EXPOSURE);
3670 if (NULL != expStr && strlen(expStr) > 0) {
3671 set(KEY_QC_CAPTURE_BURST_EXPOSURE, expStr);
3672 } else {
3673 char prop[PROPERTY_VALUE_MAX];
3674 memset(prop, 0, sizeof(prop));
3675 property_get("persist.capture.burst.exposures", prop, "");
3676 if (strlen(prop) > 0) {
3677 set(KEY_QC_CAPTURE_BURST_EXPOSURE, prop);
3678 } else {
3679 remove(KEY_QC_CAPTURE_BURST_EXPOSURE);
3680 }
3681 }
3682
3683 const char *str = params.get(KEY_QC_AE_BRACKET_HDR);
3684 const char *prev_str = get(KEY_QC_AE_BRACKET_HDR);
3685 if (str != NULL) {
3686 if (prev_str == NULL ||
3687 strcmp(str, prev_str) != 0) {
3688 return setAEBracket(str);
3689 }
3690 }
3691 return NO_ERROR;
3692 }
3693
3694 /*===========================================================================
3695 * FUNCTION : setAFBracket
3696 *
3697 * DESCRIPTION: set AF bracket from user setting
3698 *
3699 * PARAMETERS :
3700 * @params : user setting parameters
3701 *
3702 * RETURN : int32_t type of status
3703 * NO_ERROR -- success
3704 * none-zero failure code
3705 *==========================================================================*/
setAFBracket(const QCameraParameters & params)3706 int32_t QCameraParameters::setAFBracket(const QCameraParameters& params)
3707 {
3708 if ((m_pCapability->qcom_supported_feature_mask &
3709 (CAM_QCOM_FEATURE_REFOCUS | CAM_QCOM_FEATURE_UBIFOCUS)) == 0) {
3710 LOGH("AF Bracketing is not supported");
3711 return NO_ERROR;
3712 }
3713 const char *str = params.get(KEY_QC_AF_BRACKET);
3714 const char *prev_str = get(KEY_QC_AF_BRACKET);
3715 LOGH("str =%s & prev_str =%s", str, prev_str);
3716 if (str != NULL) {
3717 if (prev_str == NULL ||
3718 strcmp(str, prev_str) != 0) {
3719 m_bNeedRestart = true;
3720 return setAFBracket(str);
3721 }
3722 }
3723 return NO_ERROR;
3724 }
3725
3726 /*===========================================================================
3727 * FUNCTION : setReFocus
3728 *
3729 * DESCRIPTION: set refocus from user setting
3730 *
3731 * PARAMETERS :
3732 * @params : user setting parameters
3733 *
3734 * RETURN : int32_t type of status
3735 * NO_ERROR -- success
3736 * none-zero failure code
3737 *==========================================================================*/
setReFocus(const QCameraParameters & params)3738 int32_t QCameraParameters::setReFocus(const QCameraParameters& params)
3739 {
3740 if ((m_pCapability->qcom_supported_feature_mask &
3741 (CAM_QCOM_FEATURE_REFOCUS | CAM_QCOM_FEATURE_UBIFOCUS)) == 0) {
3742 LOGD("AF Bracketing is not supported");
3743 return NO_ERROR;
3744 }
3745 const char *str = params.get(KEY_QC_RE_FOCUS);
3746 const char *prev_str = get(KEY_QC_RE_FOCUS);
3747 LOGH("str =%s & prev_str =%s", str, prev_str);
3748 if (str != NULL) {
3749 if (prev_str == NULL ||
3750 strcmp(str, prev_str) != 0) {
3751 m_bNeedRestart = true;
3752 return setReFocus(str);
3753 }
3754 }
3755 return NO_ERROR;
3756 }
3757
3758 /*===========================================================================
3759 * FUNCTION : setChromaFlash
3760 *
3761 * DESCRIPTION: set chroma flash from user setting
3762 *
3763 * PARAMETERS :
3764 * @params : user setting parameters
3765 *
3766 * RETURN : int32_t type of status
3767 * NO_ERROR -- success
3768 * none-zero failure code
3769 *==========================================================================*/
setChromaFlash(const QCameraParameters & params)3770 int32_t QCameraParameters::setChromaFlash(const QCameraParameters& params)
3771 {
3772 if ((m_pCapability->qcom_supported_feature_mask &
3773 CAM_QCOM_FEATURE_CHROMA_FLASH) == 0) {
3774 LOGH("Chroma Flash is not supported");
3775 return NO_ERROR;
3776 }
3777 const char *str = params.get(KEY_QC_CHROMA_FLASH);
3778 const char *prev_str = get(KEY_QC_CHROMA_FLASH);
3779 LOGH("str =%s & prev_str =%s", str, prev_str);
3780 if (str != NULL) {
3781 if (prev_str == NULL ||
3782 strcmp(str, prev_str) != 0) {
3783 m_bNeedRestart = true;
3784 return setChromaFlash(str);
3785 }
3786 }
3787 return NO_ERROR;
3788 }
3789
3790 /*===========================================================================
3791 * FUNCTION : setOptiZoom
3792 *
3793 * DESCRIPTION: set opti zoom from user setting
3794 *
3795 * PARAMETERS :
3796 * @params : user setting parameters
3797 *
3798 * RETURN : int32_t type of status
3799 * NO_ERROR -- success
3800 * none-zero failure code
3801 *==========================================================================*/
setOptiZoom(const QCameraParameters & params)3802 int32_t QCameraParameters::setOptiZoom(const QCameraParameters& params)
3803 {
3804 if ((m_pCapability->qcom_supported_feature_mask &
3805 CAM_QCOM_FEATURE_OPTIZOOM) == 0){
3806 LOGH("Opti Zoom is not supported");
3807 return NO_ERROR;
3808 }
3809 const char *str = params.get(KEY_QC_OPTI_ZOOM);
3810 const char *prev_str = get(KEY_QC_OPTI_ZOOM);
3811 LOGH("str =%s & prev_str =%s", str, prev_str);
3812 if (str != NULL) {
3813 if (prev_str == NULL ||
3814 strcmp(str, prev_str) != 0) {
3815 m_bNeedRestart = true;
3816 return setOptiZoom(str);
3817 }
3818 }
3819 return NO_ERROR;
3820 }
3821
3822 /*===========================================================================
3823 * FUNCTION : setTruePortrait
3824 *
3825 * DESCRIPTION: set true portrait from user setting
3826 *
3827 * PARAMETERS :
3828 * @params : user setting parameters
3829 *
3830 * RETURN : int32_t type of status
3831 * NO_ERROR -- success
3832 * none-zero failure code
3833 *==========================================================================*/
setTruePortrait(const QCameraParameters & params)3834 int32_t QCameraParameters::setTruePortrait(const QCameraParameters& params)
3835 {
3836 if ((m_pCapability->qcom_supported_feature_mask &
3837 CAM_QCOM_FEATURE_TRUEPORTRAIT) == 0) {
3838 LOGD("True Portrait is not supported");
3839 return NO_ERROR;
3840 }
3841 const char *str = params.get(KEY_QC_TRUE_PORTRAIT);
3842 const char *prev_str = get(KEY_QC_TRUE_PORTRAIT);
3843 LOGH("str =%s & prev_str =%s", str, prev_str);
3844 if (str != NULL) {
3845 if (prev_str == NULL ||
3846 strcmp(str, prev_str) != 0) {
3847 return setTruePortrait(str);
3848 }
3849 }
3850 return NO_ERROR;
3851 }
3852
3853 /*===========================================================================
3854 * FUNCTION : setHDRMode
3855 *
3856 * DESCRIPTION: set HDR mode from user setting
3857 *
3858 * PARAMETERS :
3859 * @params : user setting parameters
3860 *
3861 * RETURN : int32_t type of status
3862 * NO_ERROR -- success
3863 * none-zero failure code
3864 *==========================================================================*/
setHDRMode(const QCameraParameters & params)3865 int32_t QCameraParameters::setHDRMode(const QCameraParameters& params)
3866 {
3867 const char *str = params.get(KEY_QC_HDR_MODE);
3868 const char *prev_str = get(KEY_QC_HDR_MODE);
3869 uint32_t supported_hdr_modes = m_pCapability->qcom_supported_feature_mask &
3870 (CAM_QCOM_FEATURE_SENSOR_HDR | CAM_QCOM_FEATURE_HDR);
3871
3872 LOGH("str =%s & prev_str =%s", str, prev_str);
3873 if (str != NULL) {
3874 if ((CAM_QCOM_FEATURE_SENSOR_HDR == supported_hdr_modes) &&
3875 (strncmp(str, HDR_MODE_SENSOR, strlen(HDR_MODE_SENSOR)))) {
3876 LOGH("Only sensor HDR is supported");
3877 return NO_ERROR;
3878 } else if ((CAM_QCOM_FEATURE_HDR == supported_hdr_modes) &&
3879 (strncmp(str, HDR_MODE_SENSOR, strlen(HDR_MODE_MULTI_FRAME)))) {
3880 LOGH("Only multi frame HDR is supported");
3881 return NO_ERROR;
3882 } else if (!supported_hdr_modes) {
3883 LOGH("HDR is not supported");
3884 return NO_ERROR;
3885 }
3886 if (prev_str == NULL ||
3887 strcmp(str, prev_str) != 0) {
3888 return setHDRMode(str);
3889 }
3890 }
3891
3892 return NO_ERROR;
3893 }
3894
3895 /*===========================================================================
3896 * FUNCTION : setHDRNeed1x
3897 *
3898 * DESCRIPTION: set HDR need 1x from user setting
3899 *
3900 * PARAMETERS :
3901 * @params : user setting parameters
3902 *
3903 * RETURN : int32_t type of status
3904 * NO_ERROR -- success
3905 * none-zero failure code
3906 *==========================================================================*/
setHDRNeed1x(const QCameraParameters & params)3907 int32_t QCameraParameters::setHDRNeed1x(const QCameraParameters& params)
3908 {
3909 const char *str = params.get(KEY_QC_HDR_NEED_1X);
3910 const char *prev_str = get(KEY_QC_HDR_NEED_1X);
3911
3912 LOGH("str =%s & prev_str =%s", str, prev_str);
3913 if (str != NULL) {
3914 if (m_bHDRModeSensor) {
3915 LOGH("Only multi frame HDR supports 1x frame");
3916 return NO_ERROR;
3917 }
3918 if ((prev_str == NULL) || (strcmp(str, prev_str) != 0)) {
3919 return setHDRNeed1x(str);
3920 }
3921 }
3922 return NO_ERROR;
3923 }
3924
3925 /*===========================================================================
3926 * FUNCTION : setSeeMore
3927 *
3928 * DESCRIPTION: set see more (llvd) from user setting
3929 *
3930 * PARAMETERS :
3931 * @params : user setting parameters
3932 *
3933 * RETURN : int32_t type of status
3934 * NO_ERROR -- success
3935 * none-zero failure code
3936 *==========================================================================*/
setSeeMore(const QCameraParameters & params)3937 int32_t QCameraParameters::setSeeMore(const QCameraParameters& params)
3938 {
3939 if ((m_pCapability->qcom_supported_feature_mask &
3940 CAM_QCOM_FEATURE_LLVD) == 0) {
3941 LOGD("See more is not supported");
3942 return NO_ERROR;
3943 }
3944 const char *str = params.get(KEY_QC_SEE_MORE);
3945 const char *prev_str = get(KEY_QC_SEE_MORE);
3946 LOGH("str =%s & prev_str =%s", str, prev_str);
3947 if (str != NULL) {
3948 if (prev_str == NULL || strcmp(str, prev_str) != 0) {
3949 m_bNeedRestart = true;
3950 return setSeeMore(str);
3951 }
3952 }
3953 return NO_ERROR;
3954 }
3955
3956 /*===========================================================================
3957 * FUNCTION : setNoiseReductionMode
3958 *
3959 * DESCRIPTION: set noise reduction mode from user setting
3960 *
3961 * PARAMETERS :
3962 * @params : user setting parameters
3963 *
3964 * RETURN : int32_t type of status
3965 * NO_ERROR -- success
3966 * none-zero failure code
3967 *==========================================================================*/
setNoiseReductionMode(const QCameraParameters & params)3968 int32_t QCameraParameters::setNoiseReductionMode(const QCameraParameters& params)
3969 {
3970 if ((m_pCapability->qcom_supported_feature_mask & CAM_QTI_FEATURE_SW_TNR) == 0) {
3971 LOGD("SW TNR is not supported");
3972 return NO_ERROR;
3973 }
3974 const char *str = params.get(KEY_QC_NOISE_REDUCTION_MODE);
3975 const char *prev_str = get(KEY_QC_NOISE_REDUCTION_MODE);
3976 LOGH("str =%s & prev_str =%s", str, prev_str);
3977 if (str != NULL) {
3978 if (prev_str == NULL || strcmp(str, prev_str) != 0) {
3979 m_bNeedRestart = true;
3980 return setNoiseReductionMode(str);
3981 }
3982 }
3983 return NO_ERROR;
3984 }
3985
3986 /*===========================================================================
3987 * FUNCTION : setStillMore
3988 *
3989 * DESCRIPTION: set stillmore from user setting
3990 *
3991 * PARAMETERS :
3992 * @params : user setting parameters
3993 *
3994 * RETURN : int32_t type of status
3995 * NO_ERROR -- success
3996 * none-zero failure code
3997 *==========================================================================*/
setStillMore(const QCameraParameters & params)3998 int32_t QCameraParameters::setStillMore(const QCameraParameters& params)
3999 {
4000 if ((m_pCapability->qcom_supported_feature_mask &
4001 CAM_QCOM_FEATURE_STILLMORE) == 0) {
4002 LOGD("Stillmore is not supported");
4003 return NO_ERROR;
4004 }
4005 const char *str = params.get(KEY_QC_STILL_MORE);
4006 const char *prev_str = get(KEY_QC_STILL_MORE);
4007 LOGH("str =%s & prev_str =%s", str, prev_str);
4008 if (str != NULL) {
4009 if (prev_str == NULL || strcmp(str, prev_str) != 0) {
4010 m_bNeedRestart = true;
4011 return setStillMore(str);
4012 }
4013 }
4014 return NO_ERROR;
4015 }
4016
4017 /*===========================================================================
4018 * FUNCTION : setRedeyeReduction
4019 *
4020 * DESCRIPTION: set red eye reduction setting from user setting
4021 *
4022 * PARAMETERS :
4023 * @params : user setting parameters
4024 *
4025 * RETURN : int32_t type of status
4026 * NO_ERROR -- success
4027 * none-zero failure code
4028 *==========================================================================*/
setRedeyeReduction(const QCameraParameters & params)4029 int32_t QCameraParameters::setRedeyeReduction(const QCameraParameters& params)
4030 {
4031 const char *str = params.get(KEY_QC_REDEYE_REDUCTION);
4032 const char *prev_str = get(KEY_QC_REDEYE_REDUCTION);
4033 if (str != NULL) {
4034 if (prev_str == NULL ||
4035 strcmp(str, prev_str) != 0) {
4036 return setRedeyeReduction(str);
4037 }
4038 }
4039 return NO_ERROR;
4040 }
4041
4042 /*===========================================================================
4043 * FUNCTION : setGpsLocation
4044 *
4045 * DESCRIPTION: set GPS location information from user setting
4046 *
4047 * PARAMETERS :
4048 * @params : user setting parameters
4049 *
4050 * RETURN : int32_t type of status
4051 * NO_ERROR -- success
4052 * none-zero failure code
4053 *==========================================================================*/
setGpsLocation(const QCameraParameters & params)4054 int32_t QCameraParameters::setGpsLocation(const QCameraParameters& params)
4055 {
4056 const char *method = params.get(KEY_GPS_PROCESSING_METHOD);
4057 if (method) {
4058 set(KEY_GPS_PROCESSING_METHOD, method);
4059 }else {
4060 remove(KEY_GPS_PROCESSING_METHOD);
4061 }
4062
4063 const char *latitude = params.get(KEY_GPS_LATITUDE);
4064 if (latitude) {
4065 set(KEY_GPS_LATITUDE, latitude);
4066 }else {
4067 remove(KEY_GPS_LATITUDE);
4068 }
4069
4070 const char *latitudeRef = params.get(KEY_QC_GPS_LATITUDE_REF);
4071 if (latitudeRef) {
4072 set(KEY_QC_GPS_LATITUDE_REF, latitudeRef);
4073 }else {
4074 remove(KEY_QC_GPS_LATITUDE_REF);
4075 }
4076
4077 const char *longitude = params.get(KEY_GPS_LONGITUDE);
4078 if (longitude) {
4079 set(KEY_GPS_LONGITUDE, longitude);
4080 }else {
4081 remove(KEY_GPS_LONGITUDE);
4082 }
4083
4084 const char *longitudeRef = params.get(KEY_QC_GPS_LONGITUDE_REF);
4085 if (longitudeRef) {
4086 set(KEY_QC_GPS_LONGITUDE_REF, longitudeRef);
4087 }else {
4088 remove(KEY_QC_GPS_LONGITUDE_REF);
4089 }
4090
4091 const char *altitudeRef = params.get(KEY_QC_GPS_ALTITUDE_REF);
4092 if (altitudeRef) {
4093 set(KEY_QC_GPS_ALTITUDE_REF, altitudeRef);
4094 }else {
4095 remove(KEY_QC_GPS_ALTITUDE_REF);
4096 }
4097
4098 const char *altitude = params.get(KEY_GPS_ALTITUDE);
4099 if (altitude) {
4100 set(KEY_GPS_ALTITUDE, altitude);
4101 }else {
4102 remove(KEY_GPS_ALTITUDE);
4103 }
4104
4105 const char *status = params.get(KEY_QC_GPS_STATUS);
4106 if (status) {
4107 set(KEY_QC_GPS_STATUS, status);
4108 } else {
4109 remove(KEY_QC_GPS_STATUS);
4110 }
4111
4112 const char *timestamp = params.get(KEY_GPS_TIMESTAMP);
4113 if (timestamp) {
4114 set(KEY_GPS_TIMESTAMP, timestamp);
4115 }else {
4116 remove(KEY_GPS_TIMESTAMP);
4117 }
4118 return NO_ERROR;
4119 }
4120
4121 /*===========================================================================
4122 * FUNCTION : setNumOfSnapshot
4123 *
4124 * DESCRIPTION: set number of snapshot per shutter from user setting
4125 *
4126 * PARAMETERS : none
4127 *
4128 * RETURN : int32_t type of status
4129 * NO_ERROR -- success
4130 * none-zero failure code
4131 *==========================================================================*/
setNumOfSnapshot()4132 int32_t QCameraParameters::setNumOfSnapshot()
4133 {
4134 int nBurstNum = 1;
4135 int nExpnum = 0;
4136
4137 const char *bracket_str = get(KEY_QC_AE_BRACKET_HDR);
4138 if (bracket_str != NULL && strlen(bracket_str) > 0) {
4139 int value = lookupAttr(BRACKETING_MODES_MAP, PARAM_MAP_SIZE(BRACKETING_MODES_MAP),
4140 bracket_str);
4141 switch (value) {
4142 case CAM_EXP_BRACKETING_ON:
4143 {
4144 nExpnum = 0;
4145 const char *str_val = get(KEY_QC_CAPTURE_BURST_EXPOSURE);
4146 if ((str_val != NULL) && (strlen(str_val) > 0)) {
4147 char prop[PROPERTY_VALUE_MAX];
4148 memset(prop, 0, sizeof(prop));
4149 strlcpy(prop, str_val, PROPERTY_VALUE_MAX);
4150 char *saveptr = NULL;
4151 char *token = strtok_r(prop, ",", &saveptr);
4152 while (token != NULL) {
4153 token = strtok_r(NULL, ",", &saveptr);
4154 nExpnum++;
4155 }
4156 }
4157 if (nExpnum == 0) {
4158 nExpnum = 1;
4159 }
4160 }
4161 break;
4162 default:
4163 nExpnum = 1 + getNumOfExtraHDROutBufsIfNeeded();
4164 break;
4165 }
4166 }
4167
4168 if (isUbiRefocus()) {
4169 nBurstNum = m_pCapability->refocus_af_bracketing_need.output_count + 1;
4170 }
4171
4172 LOGH("nBurstNum = %d, nExpnum = %d", nBurstNum, nExpnum);
4173 set(KEY_QC_NUM_SNAPSHOT_PER_SHUTTER, nBurstNum * nExpnum);
4174 return NO_ERROR;
4175 }
4176
4177 /*===========================================================================
4178 * FUNCTION : setRecordingHint
4179 *
4180 * DESCRIPTION: set recording hint value from user setting
4181 *
4182 * PARAMETERS :
4183 * @params : user setting parameters
4184 *
4185 * RETURN : int32_t type of status
4186 * NO_ERROR -- success
4187 * none-zero failure code
4188 *==========================================================================*/
setRecordingHint(const QCameraParameters & params)4189 int32_t QCameraParameters::setRecordingHint(const QCameraParameters& params)
4190 {
4191 const char * str = params.get(KEY_RECORDING_HINT);
4192 const char *prev_str = get(KEY_RECORDING_HINT);
4193 if (str != NULL) {
4194 if (prev_str == NULL || strcmp(str, prev_str) != 0) {
4195 int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP, PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP),
4196 str);
4197 if(value != NAME_NOT_FOUND){
4198 updateParamEntry(KEY_RECORDING_HINT, str);
4199 setRecordingHintValue(value);
4200 if (getFaceDetectionOption() == true) {
4201 if (!fdModeInVideo()) {
4202 setFaceDetection(value > 0 ? false : true, false);
4203 } else {
4204 setFaceDetection(true, false);
4205 }
4206 }
4207 if (m_bDISEnabled) {
4208 LOGH("Setting DIS value again");
4209 setDISValue(VALUE_ENABLE);
4210 }
4211 return NO_ERROR;
4212 } else {
4213 LOGE("Invalid recording hint value: %s", str);
4214 return BAD_VALUE;
4215 }
4216 }
4217 }
4218 return NO_ERROR;
4219 }
4220
4221 /*===========================================================================
4222 * FUNCTION : setNoDisplayMode
4223 *
4224 * DESCRIPTION: set no display mode from user setting
4225 *
4226 * PARAMETERS :
4227 * @params : user setting parameters
4228 *
4229 * RETURN : int32_t type of status
4230 * NO_ERROR -- success
4231 * none-zero failure code
4232 *==========================================================================*/
setNoDisplayMode(const QCameraParameters & params)4233 int32_t QCameraParameters::setNoDisplayMode(const QCameraParameters& params)
4234 {
4235 const char *str_val = params.get(KEY_QC_NO_DISPLAY_MODE);
4236 const char *prev_str = get(KEY_QC_NO_DISPLAY_MODE);
4237 char prop[PROPERTY_VALUE_MAX];
4238 LOGD("str_val: %s, prev_str: %s", str_val, prev_str);
4239
4240 // Aux Camera Mode, set no display mode
4241 if (m_relCamSyncInfo.mode == CAM_MODE_SECONDARY) {
4242 if (!m_bNoDisplayMode) {
4243 set(KEY_QC_NO_DISPLAY_MODE, 1);
4244 m_bNoDisplayMode = true;
4245 m_bNeedRestart = true;
4246 }
4247 return NO_ERROR;
4248 }
4249
4250 if(str_val && strlen(str_val) > 0) {
4251 if (prev_str == NULL || strcmp(str_val, prev_str) != 0) {
4252 m_bNoDisplayMode = atoi(str_val);
4253 set(KEY_QC_NO_DISPLAY_MODE, str_val);
4254 m_bNeedRestart = true;
4255 }
4256 } else {
4257 memset(prop, 0, sizeof(prop));
4258 property_get("persist.camera.no-display", prop, "0");
4259 m_bNoDisplayMode = atoi(prop);
4260 }
4261 LOGH("Param m_bNoDisplayMode = %d", m_bNoDisplayMode);
4262 return NO_ERROR;
4263 }
4264
4265 /*===========================================================================
4266 * FUNCTION : setZslMode
4267 *
4268 * DESCRIPTION: set ZSL mode from user setting
4269 *
4270 * PARAMETERS :
4271 * @params : user setting parameters
4272 *
4273 * RETURN : int32_t type of status
4274 * NO_ERROR -- success
4275 * none-zero failure code
4276 *==========================================================================*/
setZslMode(const QCameraParameters & params)4277 int32_t QCameraParameters::setZslMode(const QCameraParameters& params)
4278 {
4279 const char *str_val = params.get(KEY_QC_ZSL);
4280 const char *prev_val = get(KEY_QC_ZSL);
4281 int32_t rc = NO_ERROR;
4282
4283 if(m_bForceZslMode) {
4284 if (!m_bZslMode) {
4285 // Force ZSL mode to ON
4286 set(KEY_QC_ZSL, VALUE_ON);
4287 setZslMode(TRUE);
4288 LOGH("ZSL Mode forced to be enabled");
4289 }
4290 } else if (str_val != NULL) {
4291 if (prev_val == NULL || strcmp(str_val, prev_val) != 0) {
4292 int32_t value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP),
4293 str_val);
4294 if (value != NAME_NOT_FOUND) {
4295 set(KEY_QC_ZSL, str_val);
4296 rc = setZslMode(value);
4297 // ZSL mode changed, need restart preview
4298 m_bNeedRestart = true;
4299 } else {
4300 LOGE("Invalid ZSL mode value: %s", str_val);
4301 rc = BAD_VALUE;
4302 }
4303 }
4304 }
4305 return rc;
4306 }
4307
4308 /*===========================================================================
4309 * FUNCTION : setZslMode
4310 *
4311 * DESCRIPTION: set ZSL mode from user setting
4312 *
4313 * PARAMETERS :
4314 * @value : ZSL mode value
4315 *
4316 * RETURN : int32_t type of status
4317 * NO_ERROR -- success
4318 * none-zero failure code
4319 *==========================================================================*/
setZslMode(bool value)4320 int32_t QCameraParameters::setZslMode(bool value)
4321 {
4322 int32_t rc = NO_ERROR;
4323 if(m_bForceZslMode) {
4324 if (!m_bZslMode) {
4325 // Force ZSL mode to ON
4326 set(KEY_QC_ZSL, VALUE_ON);
4327 m_bZslMode_new = true;
4328 m_bZslMode = true;
4329 m_bNeedRestart = true;
4330
4331 int32_t value = m_bForceZslMode;
4332 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ZSL_MODE, value)) {
4333 rc = BAD_VALUE;
4334 }
4335
4336 LOGI("ZSL Mode forced to be enabled");
4337 }
4338 } else {
4339 LOGI("ZSL Mode -> %s", m_bZslMode_new ? "Enabled" : "Disabled");
4340 m_bZslMode_new = (value > 0)? true : false;
4341 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ZSL_MODE, value)) {
4342 rc = BAD_VALUE;
4343 }
4344 }
4345 LOGH("enabled: %d rc = %d", m_bZslMode_new, rc);
4346 return rc;
4347 }
4348
4349 /*===========================================================================
4350 * FUNCTION : updateZSLModeValue
4351 *
4352 * DESCRIPTION: update zsl mode value locally and to daemon
4353 *
4354 * PARAMETERS :
4355 * @value : zsl mode value
4356 *
4357 * RETURN : int32_t type of status
4358 * NO_ERROR -- success
4359 * none-zero failure code
4360 *==========================================================================*/
updateZSLModeValue(bool value)4361 int32_t QCameraParameters::updateZSLModeValue(bool value)
4362 {
4363 int32_t rc = NO_ERROR;
4364 if(initBatchUpdate(m_pParamBuf) < 0 ) {
4365 LOGE("Failed to initialize group update table");
4366 return BAD_TYPE;
4367 }
4368
4369 rc = setZslMode(value);
4370 if (rc != NO_ERROR) {
4371 LOGE("Failed to ZSL value");
4372 return rc;
4373 }
4374
4375 rc = commitSetBatch();
4376 if (rc != NO_ERROR) {
4377 LOGE("Failed to update recording hint");
4378 return rc;
4379 }
4380
4381 return rc;
4382 }
4383
4384 /*===========================================================================
4385 * FUNCTION : setWaveletDenoise
4386 *
4387 * DESCRIPTION: set wavelet denoise value from user setting
4388 *
4389 * PARAMETERS :
4390 * @params : user setting parameters
4391 *
4392 * RETURN : int32_t type of status
4393 * NO_ERROR -- success
4394 * none-zero failure code
4395 *==========================================================================*/
setWaveletDenoise(const QCameraParameters & params)4396 int32_t QCameraParameters::setWaveletDenoise(const QCameraParameters& params)
4397 {
4398 const char *str = params.get(KEY_QC_DENOISE);
4399 const char *prev_str = get(KEY_QC_DENOISE);
4400 if (str != NULL) {
4401 if (prev_str == NULL ||
4402 strcmp(str, prev_str) != 0) {
4403 return setWaveletDenoise(str);
4404 }
4405 }
4406 return NO_ERROR;
4407 }
4408
4409 /*===========================================================================
4410 * FUNCTION : setTemporalDenoise
4411 *
4412 * DESCRIPTION: set temporal denoise value from properties
4413 *
4414 * PARAMETERS : none
4415 *
4416 * RETURN : int32_t type of status
4417 * NO_ERROR -- success
4418 * none-zero failure code
4419 *==========================================================================*/
setTemporalDenoise(const QCameraParameters & params)4420 int32_t QCameraParameters::setTemporalDenoise(const QCameraParameters& params)
4421 {
4422 if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_CPP_TNR) == 0) {
4423 LOGH("TNR is not supported");
4424 return NO_ERROR;
4425 }
4426
4427 const char *str = params.get(KEY_QC_TNR_MODE);
4428 const char *prev_str = get(KEY_QC_TNR_MODE);
4429 const char *video_str = params.get(KEY_QC_VIDEO_TNR_MODE);
4430 const char *video_prev_str = get(KEY_QC_VIDEO_TNR_MODE);
4431 char video_value[PROPERTY_VALUE_MAX];
4432 char preview_value[PROPERTY_VALUE_MAX];
4433 bool prev_video_tnr = m_bTNRVideoOn;
4434 bool prev_preview_tnr = m_bTNRPreviewOn;
4435 bool prev_snap_tnr = m_bTNRSnapshotOn;
4436
4437 char value[PROPERTY_VALUE_MAX];
4438 memset(value, 0, sizeof(value));
4439 property_get("persist.camera.tnr_cds", value, "0");
4440 uint8_t tnr_cds = (uint8_t)atoi(value);
4441
4442 if (m_bRecordingHint_new == true) {
4443 if (video_str) {
4444 if ((video_prev_str == NULL) || (strcmp(video_str, video_prev_str) != 0)) {
4445 if (!strcmp(video_str, VALUE_ON)) {
4446 m_bTNRVideoOn = true;
4447 m_bTNRPreviewOn = true;
4448 } else {
4449 m_bTNRVideoOn = false;
4450 m_bTNRPreviewOn = false;
4451 }
4452 updateParamEntry(KEY_QC_VIDEO_TNR_MODE, video_str);
4453 } else {
4454 return NO_ERROR;
4455 }
4456 }
4457 } else {
4458 if (str) {
4459 if ((prev_str == NULL) || (strcmp(str, prev_str) != 0)) {
4460 if (!strcmp(str, VALUE_ON)) {
4461 m_bTNRPreviewOn = true;
4462 } else {
4463 m_bTNRPreviewOn = false;
4464 }
4465 updateParamEntry(KEY_QC_TNR_MODE, str);
4466 } else {
4467 return NO_ERROR;
4468 }
4469 }
4470 }
4471
4472 //Read setprops only if UI is not present or disabled.
4473 if ((m_bRecordingHint_new == true)
4474 && ((video_str == NULL)
4475 || (strcmp(video_str, VALUE_ON)))) {
4476 memset(video_value, 0, sizeof(video_value));
4477 property_get("persist.camera.tnr.video", video_value, VALUE_OFF);
4478 if (!strcmp(video_value, VALUE_ON)) {
4479 m_bTNRVideoOn = true;
4480 } else {
4481 m_bTNRVideoOn = false;
4482 }
4483 updateParamEntry(KEY_QC_VIDEO_TNR_MODE, video_value);
4484
4485 memset(preview_value, 0, sizeof(preview_value));
4486 property_get("persist.camera.tnr.preview", preview_value, VALUE_OFF);
4487 if (!strcmp(preview_value, VALUE_ON)) {
4488 m_bTNRPreviewOn = true;
4489 } else {
4490 m_bTNRPreviewOn = false;
4491 }
4492 updateParamEntry(KEY_QC_TNR_MODE, preview_value);
4493 } else if ((m_bRecordingHint_new != true)
4494 && ((str == NULL) || (strcmp(str, VALUE_ON)))) {
4495 memset(preview_value, 0, sizeof(preview_value));
4496 property_get("persist.camera.tnr.preview", preview_value, VALUE_OFF);
4497 if (!strcmp(preview_value, VALUE_ON)) {
4498 m_bTNRPreviewOn = true;
4499 } else {
4500 m_bTNRPreviewOn = false;
4501 }
4502 updateParamEntry(KEY_QC_TNR_MODE, preview_value);
4503 }
4504
4505 memset(value, 0, sizeof(value));
4506 property_get("persist.camera.tnr.snapshot", value, VALUE_OFF);
4507 if (!strcmp(value, VALUE_ON)) {
4508 m_bTNRSnapshotOn = true;
4509 LOGD("TNR enabled for SNAPSHOT stream");
4510 } else {
4511 m_bTNRSnapshotOn = false;
4512 }
4513
4514 cam_denoise_param_t temp;
4515 memset(&temp, 0, sizeof(temp));
4516 if (m_bTNRVideoOn || m_bTNRPreviewOn || m_bTNRSnapshotOn) {
4517 temp.denoise_enable = 1;
4518 temp.process_plates = getDenoiseProcessPlate(
4519 CAM_INTF_PARM_TEMPORAL_DENOISE);
4520
4521 if (!tnr_cds) {
4522 int32_t cds_mode = lookupAttr(CDS_MODES_MAP,
4523 PARAM_MAP_SIZE(CDS_MODES_MAP), CDS_MODE_OFF);
4524
4525 if (cds_mode != NAME_NOT_FOUND) {
4526 updateParamEntry(KEY_QC_VIDEO_CDS_MODE, CDS_MODE_OFF);
4527 if (m_bTNRPreviewOn) {
4528 updateParamEntry(KEY_QC_CDS_MODE, CDS_MODE_OFF);
4529 }
4530 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
4531 CAM_INTF_PARM_CDS_MODE, cds_mode)) {
4532 LOGE("Failed CDS MODE to update table");
4533 return BAD_VALUE;
4534 }
4535 LOGD("CDS is set to = %s when TNR is enabled",
4536 CDS_MODE_OFF);
4537 mCds_mode = cds_mode;
4538 } else {
4539 LOGE("Invalid argument for video CDS MODE %d",
4540 cds_mode);
4541 }
4542 } else {
4543 LOGH("Enabled TNR with CDS");
4544 }
4545 }
4546
4547 if ((m_bTNRVideoOn != prev_video_tnr)
4548 || (m_bTNRPreviewOn != prev_preview_tnr)
4549 || (prev_snap_tnr != m_bTNRSnapshotOn)) {
4550 LOGD("TNR enabled = %d, plates = %d",
4551 temp.denoise_enable, temp.process_plates);
4552 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
4553 CAM_INTF_PARM_TEMPORAL_DENOISE, temp)) {
4554 return BAD_VALUE;
4555 }
4556 }
4557
4558 return NO_ERROR;
4559 }
4560
4561 /*===========================================================================
4562 * FUNCTION : setCameraMode
4563 *
4564 * DESCRIPTION: set camera mode from user setting
4565 *
4566 * PARAMETERS :
4567 * @params : user setting parameters
4568 *
4569 * RETURN : int32_t type of status
4570 * NO_ERROR -- success
4571 * none-zero failure code
4572 *==========================================================================*/
setCameraMode(const QCameraParameters & params)4573 int32_t QCameraParameters::setCameraMode(const QCameraParameters& params)
4574 {
4575 const char *str = params.get(KEY_QC_CAMERA_MODE);
4576 if (str != NULL) {
4577 set(KEY_QC_CAMERA_MODE, str);
4578 } else {
4579 remove(KEY_QC_CAMERA_MODE);
4580 }
4581 return NO_ERROR;
4582 }
4583
4584 /*===========================================================================
4585 * FUNCTION : setSceneSelectionMode
4586 *
4587 * DESCRIPTION: set scene selection mode from user setting
4588 *
4589 * PARAMETERS :
4590 * @params : user setting parameters
4591 *
4592 * RETURN : int32_t type of status
4593 * NO_ERROR -- success
4594 * none-zero failure code
4595 *==========================================================================*/
setSceneSelectionMode(const QCameraParameters & params)4596 int32_t QCameraParameters::setSceneSelectionMode(const QCameraParameters& params)
4597 {
4598 const char *str = params.get(KEY_QC_SCENE_SELECTION);
4599 const char *prev_str = get(KEY_QC_SCENE_SELECTION);
4600 if (NULL != str) {
4601 if ((NULL == prev_str) || (strcmp(str, prev_str) != 0)) {
4602 int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
4603 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), str);
4604 if (value != NAME_NOT_FOUND) {
4605 LOGD("Setting selection value %s", str);
4606 if (value && m_bZslMode_new) {
4607 updateParamEntry(KEY_QC_SCENE_SELECTION, str);
4608 m_bNeedRestart = true;
4609 m_bSceneSelection = true;
4610 } else if (!value) {
4611 updateParamEntry(KEY_QC_SCENE_SELECTION, str);
4612 m_bNeedRestart = true;
4613 m_bSceneSelection = false;
4614 } else {
4615 LOGE("Trying to enable scene selection in non ZSL mode!!!");
4616 return BAD_VALUE;
4617 }
4618 } else {
4619 LOGE("Trying to configure invalid scene selection value: %s",
4620 str);
4621 return BAD_VALUE;
4622 }
4623 }
4624 }
4625
4626 return NO_ERROR;
4627 }
4628
4629 /*===========================================================================
4630 * FUNCTION : setSelectedScene
4631 *
4632 * DESCRIPTION: select specific scene
4633 *
4634 * PARAMETERS :
4635 * @scene : scene mode
4636 *
4637 * RETURN : int32_t type of status
4638 * NO_ERROR -- success
4639 * none-zero failure code
4640 *==========================================================================*/
setSelectedScene(cam_scene_mode_type scene)4641 int32_t QCameraParameters::setSelectedScene(cam_scene_mode_type scene)
4642 {
4643 Mutex::Autolock l(m_SceneSelectLock);
4644 m_SelectedScene = scene;
4645 return NO_ERROR;
4646 }
4647
4648 /*===========================================================================
4649 * FUNCTION : getSelectedScene
4650 *
4651 * DESCRIPTION: get selected scene
4652 *
4653 * PARAMETERS :
4654 *
4655 * RETURN : currently selected scene
4656 *==========================================================================*/
getSelectedScene()4657 cam_scene_mode_type QCameraParameters::getSelectedScene()
4658 {
4659 Mutex::Autolock l(m_SceneSelectLock);
4660 return m_SelectedScene;
4661 }
4662
4663 /*==========================================================
4664 * FUNCTION : setRdiMode
4665 *
4666 * DESCRIPTION: set Rdi mode from user setting
4667 *
4668 * PARAMETERS :
4669 * @params : user setting parameters
4670 *
4671 * RETURN : int32_t type of status
4672 * NO_ERROR -- success
4673 * none-zero failure code
4674 *===========================================================*/
setRdiMode(const QCameraParameters & params)4675 int32_t QCameraParameters::setRdiMode(const QCameraParameters& params)
4676 {
4677 const char *str = params.get(KEY_QC_RDI_MODE);
4678 const char *prev_str = get(KEY_QC_RDI_MODE);
4679 char prop[PROPERTY_VALUE_MAX];
4680 memset(prop, 0, sizeof(prop));
4681
4682 property_get("persist.camera.rdi.mode", prop, VALUE_DISABLE);
4683 if ((str != NULL) && (prev_str == NULL || strcmp(str, prev_str) != 0)) {
4684 LOGD("RDI mode set to %s", str);
4685 setRdiMode(str);
4686 } else if (prev_str == NULL || strcmp(prev_str, prop) != 0 ) {
4687 LOGD("RDI mode set to prop: %s", prop);
4688 setRdiMode(prop);
4689 }
4690 return NO_ERROR;
4691 }
4692
4693 /*==========================================================
4694 * FUNCTION : setSecureMode
4695 *
4696 * DESCRIPTION: set secure mode from user setting
4697 *
4698 * PARAMETERS :
4699 * @params : user setting parameters
4700 *
4701 * RETURN : int32_t type of status
4702 * NO_ERROR -- success
4703 * none-zero failure code
4704 *===========================================================*/
4705
setSecureMode(const QCameraParameters & params)4706 int32_t QCameraParameters::setSecureMode(const QCameraParameters& params)
4707 {
4708 const char *str = params.get(KEY_QC_SECURE_MODE);
4709 const char *prev_str = get(KEY_QC_SECURE_MODE);
4710 char prop[PROPERTY_VALUE_MAX];
4711 memset(prop, 0, sizeof(prop));
4712
4713 property_get("persist.camera.secure.mode", prop, VALUE_DISABLE);
4714 if ((str != NULL) && (prev_str == NULL || strcmp(str, prev_str) != 0)) {
4715 LOGD("Secure mode set to KEY: %s", str);
4716 setSecureMode(str);
4717 } else if (prev_str == NULL || strcmp(prev_str, prop) != 0 ) {
4718 LOGD("Secure mode set to prop: %s", prop);
4719 setSecureMode(prop);
4720 }
4721 return NO_ERROR;
4722 }
4723
4724 /*===========================================================================
4725 * FUNCTION : setZslAttributes
4726 *
4727 * DESCRIPTION: set ZSL related attributes from user setting
4728 *
4729 * PARAMETERS :
4730 * @params : user setting parameters
4731 *
4732 * RETURN : int32_t type of status
4733 * NO_ERROR -- success
4734 * none-zero failure code
4735 *==========================================================================*/
setZslAttributes(const QCameraParameters & params)4736 int32_t QCameraParameters::setZslAttributes(const QCameraParameters& params)
4737 {
4738 // TODO: may switch to pure param instead of sysprop
4739 char prop[PROPERTY_VALUE_MAX];
4740
4741 const char *str = params.get(KEY_QC_ZSL_BURST_INTERVAL);
4742 if (str != NULL) {
4743 set(KEY_QC_ZSL_BURST_INTERVAL, str);
4744 } else {
4745 memset(prop, 0, sizeof(prop));
4746 property_get("persist.camera.zsl.interval", prop, "1");
4747 set(KEY_QC_ZSL_BURST_INTERVAL, prop);
4748 LOGH("burst interval: %s", prop);
4749 }
4750
4751 str = params.get(KEY_QC_ZSL_BURST_LOOKBACK);
4752 if (str != NULL) {
4753 set(KEY_QC_ZSL_BURST_LOOKBACK, str);
4754 } else {
4755 memset(prop, 0, sizeof(prop));
4756 property_get("persist.camera.zsl.backlookcnt", prop, "2");
4757 uint32_t look_back_cnt = atoi(prop);
4758 if (m_bFrameSyncEnabled) {
4759 look_back_cnt += EXTRA_FRAME_SYNC_BUFFERS;
4760 }
4761 set(KEY_QC_ZSL_BURST_LOOKBACK, look_back_cnt);
4762 LOGH("look back count: %s", prop);
4763 }
4764
4765 str = params.get(KEY_QC_ZSL_QUEUE_DEPTH);
4766 if (str != NULL) {
4767 set(KEY_QC_ZSL_QUEUE_DEPTH, str);
4768 } else {
4769 memset(prop, 0, sizeof(prop));
4770 property_get("persist.camera.zsl.queuedepth", prop, "2");
4771 uint32_t queue_depth = atoi(prop);
4772 if (m_bFrameSyncEnabled) {
4773 queue_depth += EXTRA_FRAME_SYNC_BUFFERS;
4774 }
4775 set(KEY_QC_ZSL_QUEUE_DEPTH, queue_depth);
4776 LOGH("queue depth: %s", prop);
4777 }
4778
4779 return NO_ERROR;
4780 }
4781
4782 /*===========================================================================
4783 * FUNCTION : setFlip
4784 *
4785 * DESCRIPTION: set preview/ video/ picture flip mode from user setting
4786 *
4787 * PARAMETERS :
4788 * @params : user setting parameters
4789 *
4790 * RETURN : int32_t type of status
4791 * NO_ERROR -- success
4792 * none-zero failure code
4793 *==========================================================================*/
setFlip(const QCameraParameters & params)4794 int32_t QCameraParameters::setFlip(const QCameraParameters& params)
4795 {
4796 if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_FLIP) == 0) {
4797 LOGH("flip is not supported.");
4798 return NO_ERROR;
4799 }
4800
4801 //check preview flip setting
4802 const char *str = params.get(KEY_QC_PREVIEW_FLIP);
4803 const char *prev_val = get(KEY_QC_PREVIEW_FLIP);
4804 if(str != NULL){
4805 if (prev_val == NULL || strcmp(str, prev_val) != 0) {
4806 int32_t value = lookupAttr(FLIP_MODES_MAP, PARAM_MAP_SIZE(FLIP_MODES_MAP), str);
4807 if(value != NAME_NOT_FOUND){
4808 set(KEY_QC_PREVIEW_FLIP, str);
4809 m_bPreviewFlipChanged = true;
4810 }
4811 }
4812 }
4813
4814 // check video filp setting
4815 str = params.get(KEY_QC_VIDEO_FLIP);
4816 prev_val = get(KEY_QC_VIDEO_FLIP);
4817 if(str != NULL){
4818 if (prev_val == NULL || strcmp(str, prev_val) != 0) {
4819 int32_t value = lookupAttr(FLIP_MODES_MAP, PARAM_MAP_SIZE(FLIP_MODES_MAP), str);
4820 if(value != NAME_NOT_FOUND){
4821 set(KEY_QC_VIDEO_FLIP, str);
4822 m_bVideoFlipChanged = true;
4823 }
4824 }
4825 }
4826
4827 // check picture filp setting
4828 str = params.get(KEY_QC_SNAPSHOT_PICTURE_FLIP);
4829 prev_val = get(KEY_QC_SNAPSHOT_PICTURE_FLIP);
4830 if(str != NULL){
4831 if (prev_val == NULL || strcmp(str, prev_val) != 0) {
4832 int32_t value = lookupAttr(FLIP_MODES_MAP, PARAM_MAP_SIZE(FLIP_MODES_MAP), str);
4833 if(value != NAME_NOT_FOUND){
4834 set(KEY_QC_SNAPSHOT_PICTURE_FLIP, str);
4835 m_bSnapshotFlipChanged = true;
4836 }
4837 }
4838 }
4839
4840 return NO_ERROR;
4841 }
4842
4843 /*===========================================================================
4844 * FUNCTION : setSnapshotFDReq
4845 *
4846 * DESCRIPTION: set requirement of Face Detection Metadata in Snapshot mode.
4847 *
4848 * PARAMETERS :
4849 * @params : user setting parameters
4850 *
4851 * RETURN : int32_t type of status
4852 * NO_ERROR -- success
4853 * none-zero failure code
4854 *==========================================================================*/
setSnapshotFDReq(const QCameraParameters & params)4855 int32_t QCameraParameters::setSnapshotFDReq(const QCameraParameters& params)
4856 {
4857 char prop[PROPERTY_VALUE_MAX];
4858 const char *str = params.get(KEY_QC_SNAPSHOT_FD_DATA);
4859
4860 if(str != NULL){
4861 set(KEY_QC_SNAPSHOT_FD_DATA, str);
4862 }else{
4863 memset(prop, 0, sizeof(prop));
4864 property_get("persist.camera.snapshot.fd", prop, "0");
4865 set(KEY_QC_SNAPSHOT_FD_DATA, prop);
4866 }
4867 return NO_ERROR;
4868 }
4869
4870 /*===========================================================================
4871 * FUNCTION : setMobicat
4872 *
4873 * DESCRIPTION: set Mobicat on/off.
4874 *
4875 * PARAMETERS :
4876 * @params : user setting parameters
4877 *
4878 * RETURN : int32_t type of status
4879 * NO_ERROR -- success
4880 * none-zero failure code
4881 *==========================================================================*/
setMobicat(const QCameraParameters &)4882 int32_t QCameraParameters::setMobicat(const QCameraParameters& )
4883 {
4884 char value [PROPERTY_VALUE_MAX];
4885 property_get("persist.camera.mobicat", value, "0");
4886 int32_t ret = NO_ERROR;
4887 uint8_t enableMobi = (uint8_t)atoi(value);
4888
4889 if (enableMobi) {
4890 tune_cmd_t tune_cmd;
4891 tune_cmd.type = 2;
4892 tune_cmd.module = 0;
4893 tune_cmd.value = 1;
4894 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SET_VFE_COMMAND, tune_cmd)) {
4895 return BAD_VALUE;
4896 }
4897 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SET_PP_COMMAND, tune_cmd)) {
4898 ret = BAD_VALUE;
4899 }
4900 }
4901 m_MobiMask = enableMobi;
4902
4903 return ret;
4904 }
4905
4906 /*===========================================================================
4907 * FUNCTION : setLongshotParam
4908 *
4909 * DESCRIPTION: set Longshot on/off.
4910 *
4911 * PARAMETERS :
4912 * @params : user setting parameters
4913 *
4914 * RETURN : int32_t type of status
4915 * NO_ERROR -- success
4916 * none-zero failure code
4917 *==========================================================================*/
setLongshotParam(const QCameraParameters & params)4918 int32_t QCameraParameters::setLongshotParam(const QCameraParameters& params)
4919 {
4920 const char *str = params.get(KEY_QC_LONG_SHOT);
4921 const char *prev_str = get(KEY_QC_LONG_SHOT);
4922
4923 if (str != NULL) {
4924 if (prev_str == NULL || strcmp(str, prev_str) != 0) {
4925 set(KEY_QC_LONG_SHOT, str);
4926 if (prev_str && !strcmp(str, "off") && !strcmp(prev_str, "on")) {
4927 // We restart here, to reset the FPS and no
4928 // of buffers as per the requirement of single snapshot usecase.
4929 // Here restart happens when continuous shot is changed to off from on.
4930 // In case of continuous shot on, restart is taken care when actual
4931 // longshot command is triggered through sendCommand.
4932 m_bNeedRestart = true;
4933 }
4934 }
4935 }
4936
4937 return NO_ERROR;
4938 }
4939
4940 /*===========================================================================
4941 * FUNCTION : checkFeatureConcurrency
4942 *
4943 * DESCRIPTION: check if there is a feature concurrency issue with advanced
4944 * camera features
4945 *
4946 * PARAMETERS : None
4947 *
4948 * RETURN : int32_t type of status
4949 * NO_ERROR -- success
4950 * none-zero failure code
4951 *==========================================================================*/
checkFeatureConcurrency()4952 int32_t QCameraParameters::checkFeatureConcurrency()
4953 {
4954 int32_t rc = NO_ERROR;
4955 uint32_t advancedFeatEnableBit = 0;
4956
4957 if (isStillMoreEnabled()) {
4958 advancedFeatEnableBit |= CAM_QCOM_FEATURE_STILLMORE;
4959 }
4960 if (isHDREnabled()) {
4961 advancedFeatEnableBit |= CAM_QCOM_FEATURE_HDR;
4962 }
4963 if (isChromaFlashEnabled()) {
4964 advancedFeatEnableBit |= CAM_QCOM_FEATURE_CHROMA_FLASH;
4965 }
4966 if (isUbiFocusEnabled()) {
4967 advancedFeatEnableBit |= CAM_QCOM_FEATURE_UBIFOCUS;
4968 }
4969 if (isTruePortraitEnabled()) {
4970 advancedFeatEnableBit |= CAM_QCOM_FEATURE_TRUEPORTRAIT;
4971 }
4972 if (isOptiZoomEnabled()) {
4973 advancedFeatEnableBit |= CAM_QCOM_FEATURE_OPTIZOOM;
4974 }
4975 if (isUbiRefocus()) {
4976 advancedFeatEnableBit |= CAM_QCOM_FEATURE_REFOCUS;
4977 }
4978
4979 if (m_bLongshotEnabled && advancedFeatEnableBit) {
4980 LOGE("Failed Longshot mode bit 0x%x",
4981 advancedFeatEnableBit);
4982 rc = BAD_TYPE;
4983 return rc;
4984 }
4985
4986 if(m_bRecordingHint_new) {
4987 advancedFeatEnableBit &= ~CAM_QCOM_FEATURE_STILLMORE;
4988
4989 if (advancedFeatEnableBit) {
4990 LOGE("Failed recording mode bit 0x%x",
4991 advancedFeatEnableBit);
4992 rc = BAD_TYPE;
4993 }
4994 } else if (m_bZslMode_new) {
4995 /* ZSL mode check if 2 bits are set */
4996 if (advancedFeatEnableBit & (advancedFeatEnableBit - 1)) {
4997 LOGE("Failed ZSL mode bit 0x%x", advancedFeatEnableBit);
4998 rc = BAD_TYPE;
4999 }
5000 } else { /* non-ZSL mode */
5001 advancedFeatEnableBit &= ~CAM_QCOM_FEATURE_HDR;
5002
5003 /* non-ZSL mode check if 1 bit is set */
5004 if (advancedFeatEnableBit) {
5005 LOGE("Failed non-ZSL mode bit 0x%x", advancedFeatEnableBit);
5006 rc = BAD_TYPE;
5007 }
5008 }
5009 LOGI("Advance feature enabled 0x%x", advancedFeatEnableBit);
5010 return rc;
5011 }
5012
5013 /*===========================================================================
5014 * FUNCTION : updateParameters
5015 *
5016 * DESCRIPTION: update parameters from user setting
5017 *
5018 * PARAMETERS :
5019 * @params : user setting parameters
5020 * @needRestart : [output] if preview need restart upon setting changes
5021 *
5022 * RETURN : int32_t type of status
5023 * NO_ERROR -- success
5024 * none-zero failure code
5025 *==========================================================================*/
updateParameters(const String8 & p,bool & needRestart)5026 int32_t QCameraParameters::updateParameters(const String8& p,
5027 bool &needRestart)
5028 {
5029 int32_t final_rc = NO_ERROR;
5030 int32_t rc;
5031 m_bNeedRestart = false;
5032 QCameraParameters params(p);
5033
5034 if(initBatchUpdate(m_pParamBuf) < 0 ) {
5035 LOGE("Failed to initialize group update table");
5036 rc = BAD_TYPE;
5037 goto UPDATE_PARAM_DONE;
5038 }
5039
5040 if ((rc = setPreviewSize(params))) final_rc = rc;
5041 if ((rc = setVideoSize(params))) final_rc = rc;
5042 if ((rc = setPictureSize(params))) final_rc = rc;
5043 if ((rc = setPreviewFormat(params))) final_rc = rc;
5044 if ((rc = setPictureFormat(params))) final_rc = rc;
5045 if ((rc = setJpegQuality(params))) final_rc = rc;
5046 if ((rc = setOrientation(params))) final_rc = rc;
5047 if ((rc = setRotation(params))) final_rc = rc;
5048 if ((rc = setVideoRotation(params))) final_rc = rc;
5049 if ((rc = setNoDisplayMode(params))) final_rc = rc;
5050 if ((rc = setZslMode(params))) final_rc = rc;
5051 if ((rc = setZslAttributes(params))) final_rc = rc;
5052 if ((rc = setCameraMode(params))) final_rc = rc;
5053 if ((rc = setSceneSelectionMode(params))) final_rc = rc;
5054 if ((rc = setRecordingHint(params))) final_rc = rc;
5055 if ((rc = setRdiMode(params))) final_rc = rc;
5056 if ((rc = setSecureMode(params))) final_rc = rc;
5057 if ((rc = setPreviewFrameRate(params))) final_rc = rc;
5058 if ((rc = setPreviewFpsRange(params))) final_rc = rc;
5059 if ((rc = setAutoExposure(params))) final_rc = rc;
5060 if ((rc = setEffect(params))) final_rc = rc;
5061 if ((rc = setBrightness(params))) final_rc = rc;
5062 if ((rc = setZoom(params))) final_rc = rc;
5063 if ((rc = setSharpness(params))) final_rc = rc;
5064 if ((rc = setSaturation(params))) final_rc = rc;
5065 if ((rc = setContrast(params))) final_rc = rc;
5066 if ((rc = setFocusMode(params))) final_rc = rc;
5067 if ((rc = setISOValue(params))) final_rc = rc;
5068 if ((rc = setContinuousISO(params))) final_rc = rc;
5069 if ((rc = setExposureTime(params))) final_rc = rc;
5070 if ((rc = setSkinToneEnhancement(params))) final_rc = rc;
5071 if ((rc = setFlash(params))) final_rc = rc;
5072 if ((rc = setAecLock(params))) final_rc = rc;
5073 if ((rc = setAwbLock(params))) final_rc = rc;
5074 if ((rc = setLensShadeValue(params))) final_rc = rc;
5075 if ((rc = setMCEValue(params))) final_rc = rc;
5076 if ((rc = setDISValue(params))) final_rc = rc;
5077 if ((rc = setAntibanding(params))) final_rc = rc;
5078 if ((rc = setExposureCompensation(params))) final_rc = rc;
5079 if ((rc = setWhiteBalance(params))) final_rc = rc;
5080 if ((rc = setHDRMode(params))) final_rc = rc;
5081 if ((rc = setHDRNeed1x(params))) final_rc = rc;
5082 if ((rc = setManualWhiteBalance(params))) final_rc = rc;
5083 if ((rc = setSceneMode(params))) final_rc = rc;
5084 if ((rc = setFocusAreas(params))) final_rc = rc;
5085 if ((rc = setFocusPosition(params))) final_rc = rc;
5086 if ((rc = setMeteringAreas(params))) final_rc = rc;
5087 if ((rc = setSelectableZoneAf(params))) final_rc = rc;
5088 if ((rc = setRedeyeReduction(params))) final_rc = rc;
5089 if ((rc = setAEBracket(params))) final_rc = rc;
5090 if ((rc = setAutoHDR(params))) final_rc = rc;
5091 if ((rc = setGpsLocation(params))) final_rc = rc;
5092 if ((rc = setWaveletDenoise(params))) final_rc = rc;
5093 if ((rc = setFaceRecognition(params))) final_rc = rc;
5094 if ((rc = setFlip(params))) final_rc = rc;
5095 if ((rc = setVideoHDR(params))) final_rc = rc;
5096 if ((rc = setVtEnable(params))) final_rc = rc;
5097 if ((rc = setAFBracket(params))) final_rc = rc;
5098 if ((rc = setReFocus(params))) final_rc = rc;
5099 if ((rc = setChromaFlash(params))) final_rc = rc;
5100 if ((rc = setTruePortrait(params))) final_rc = rc;
5101 if ((rc = setOptiZoom(params))) final_rc = rc;
5102 if ((rc = setBurstLEDOnPeriod(params))) final_rc = rc;
5103 if ((rc = setRetroActiveBurstNum(params))) final_rc = rc;
5104 if ((rc = setSnapshotFDReq(params))) final_rc = rc;
5105 if ((rc = setTintlessValue(params))) final_rc = rc;
5106 if ((rc = setCDSMode(params))) final_rc = rc;
5107 if ((rc = setTemporalDenoise(params))) final_rc = rc;
5108 if ((rc = setCacheVideoBuffers(params))) final_rc = rc;
5109 if ((rc = setInitialExposureIndex(params))) final_rc = rc;
5110 if ((rc = setInstantCapture(params))) final_rc = rc;
5111 if ((rc = setInstantAEC(params))) final_rc = rc;
5112
5113 // update live snapshot size after all other parameters are set
5114 if ((rc = setLiveSnapshotSize(params))) final_rc = rc;
5115 if ((rc = setJpegThumbnailSize(params))) final_rc = rc;
5116 if ((rc = setStatsDebugMask())) final_rc = rc;
5117 if ((rc = setPAAF())) final_rc = rc;
5118 if ((rc = setMobicat(params))) final_rc = rc;
5119 if ((rc = setSeeMore(params))) final_rc = rc;
5120 if ((rc = setStillMore(params))) final_rc = rc;
5121 if ((rc = setCustomParams(params))) final_rc = rc;
5122 if ((rc = setNoiseReductionMode(params))) final_rc = rc;
5123
5124 if ((rc = setLongshotParam(params))) final_rc = rc;
5125 if ((rc = setDualLedCalibration(params))) final_rc = rc;
5126
5127 setVideoBatchSize();
5128 setLowLightCapture();
5129
5130 if ((rc = updateFlash(false))) final_rc = rc;
5131
5132 #ifdef TARGET_TS_MAKEUP
5133 if (params.get(KEY_TS_MAKEUP) != NULL) {
5134 set(KEY_TS_MAKEUP,params.get(KEY_TS_MAKEUP));
5135 final_rc = rc;
5136 }
5137 if (params.get(KEY_TS_MAKEUP_WHITEN) != NULL) {
5138 set(KEY_TS_MAKEUP_WHITEN,params.get(KEY_TS_MAKEUP_WHITEN));
5139 final_rc = rc;
5140 }
5141 if (params.get(KEY_TS_MAKEUP_CLEAN) != NULL) {
5142 set(KEY_TS_MAKEUP_CLEAN,params.get(KEY_TS_MAKEUP_CLEAN));
5143 final_rc = rc;
5144 }
5145 #endif
5146
5147 if ((rc = setAdvancedCaptureMode())) final_rc = rc;
5148 UPDATE_PARAM_DONE:
5149 needRestart = m_bNeedRestart;
5150 return final_rc;
5151 }
5152
5153 /*===========================================================================
5154 * FUNCTION : commitParameters
5155 *
5156 * DESCRIPTION: commit parameter changes to backend
5157 *
5158 * PARAMETERS : none
5159 *
5160 * RETURN : int32_t type of status
5161 * NO_ERROR -- success
5162 * none-zero failure code
5163 *==========================================================================*/
commitParameters()5164 int32_t QCameraParameters::commitParameters()
5165 {
5166 return commitSetBatch();
5167 }
5168
5169 /*===========================================================================
5170 * FUNCTION : initDefaultParameters
5171 *
5172 * DESCRIPTION: initialize default parameters for the first time
5173 *
5174 * PARAMETERS : none
5175 *
5176 * RETURN : int32_t type of status
5177 * NO_ERROR -- success
5178 * none-zero failure code
5179 *==========================================================================*/
initDefaultParameters()5180 int32_t QCameraParameters::initDefaultParameters()
5181 {
5182 if(initBatchUpdate(m_pParamBuf) < 0 ) {
5183 LOGE("Failed to initialize group update table");
5184 return BAD_TYPE;
5185 }
5186 int32_t hal_version = CAM_HAL_V1;
5187 ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HAL_VERSION, hal_version);
5188
5189 /*************************Initialize Values******************************/
5190 // Set read only parameters from camera capability
5191 set(KEY_SMOOTH_ZOOM_SUPPORTED,
5192 m_pCapability->smooth_zoom_supported? VALUE_TRUE : VALUE_FALSE);
5193 set(KEY_ZOOM_SUPPORTED,
5194 m_pCapability->zoom_supported? VALUE_TRUE : VALUE_FALSE);
5195 set(KEY_VIDEO_SNAPSHOT_SUPPORTED,
5196 m_pCapability->video_snapshot_supported? VALUE_TRUE : VALUE_FALSE);
5197 set(KEY_VIDEO_STABILIZATION_SUPPORTED,
5198 m_pCapability->video_stablization_supported? VALUE_TRUE : VALUE_FALSE);
5199 set(KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
5200 m_pCapability->auto_exposure_lock_supported? VALUE_TRUE : VALUE_FALSE);
5201 set(KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
5202 m_pCapability->auto_wb_lock_supported? VALUE_TRUE : VALUE_FALSE);
5203 set(KEY_MAX_NUM_DETECTED_FACES_HW, m_pCapability->max_num_roi);
5204 set(KEY_MAX_NUM_DETECTED_FACES_SW, m_pCapability->max_num_roi);
5205 set(KEY_QC_MAX_NUM_REQUESTED_FACES, m_pCapability->max_num_roi);
5206 // Set focal length, horizontal view angle, and vertical view angle
5207 setFloat(KEY_FOCAL_LENGTH, m_pCapability->focal_length);
5208 setFloat(KEY_HORIZONTAL_VIEW_ANGLE, m_pCapability->hor_view_angle);
5209 setFloat(KEY_VERTICAL_VIEW_ANGLE, m_pCapability->ver_view_angle);
5210 set(QCameraParameters::KEY_FOCUS_DISTANCES, "Infinity,Infinity,Infinity");
5211 set(KEY_QC_AUTO_HDR_SUPPORTED,
5212 (m_pCapability->auto_hdr_supported)? VALUE_TRUE : VALUE_FALSE);
5213 // Set supported preview sizes
5214 if (m_pCapability->preview_sizes_tbl_cnt > 0 &&
5215 m_pCapability->preview_sizes_tbl_cnt <= MAX_SIZES_CNT) {
5216 String8 previewSizeValues = createSizesString(
5217 m_pCapability->preview_sizes_tbl, m_pCapability->preview_sizes_tbl_cnt);
5218 set(KEY_SUPPORTED_PREVIEW_SIZES, previewSizeValues.string());
5219 LOGH("supported preview sizes: %s", previewSizeValues.string());
5220 // Set default preview size
5221 CameraParameters::setPreviewSize(m_pCapability->preview_sizes_tbl[0].width,
5222 m_pCapability->preview_sizes_tbl[0].height);
5223 } else {
5224 LOGW("supported preview sizes cnt is 0 or exceeds max!!!");
5225 }
5226
5227 // Set supported video sizes
5228 if (m_pCapability->video_sizes_tbl_cnt > 0 &&
5229 m_pCapability->video_sizes_tbl_cnt <= MAX_SIZES_CNT) {
5230 String8 videoSizeValues = createSizesString(
5231 m_pCapability->video_sizes_tbl, m_pCapability->video_sizes_tbl_cnt);
5232 set(KEY_SUPPORTED_VIDEO_SIZES, videoSizeValues.string());
5233 LOGH("supported video sizes: %s", videoSizeValues.string());
5234 // Set default video size
5235 CameraParameters::setVideoSize(m_pCapability->video_sizes_tbl[0].width,
5236 m_pCapability->video_sizes_tbl[0].height);
5237
5238 //Set preferred Preview size for video
5239 String8 vSize = createSizesString(&m_pCapability->preview_sizes_tbl[0], 1);
5240 set(KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, vSize.string());
5241 } else {
5242 LOGW("supported video sizes cnt is 0 or exceeds max!!!");
5243 }
5244
5245 // Set supported picture sizes
5246 if (m_pCapability->picture_sizes_tbl_cnt > 0 &&
5247 m_pCapability->picture_sizes_tbl_cnt <= MAX_SIZES_CNT) {
5248 String8 pictureSizeValues = createSizesString(
5249 m_pCapability->picture_sizes_tbl, m_pCapability->picture_sizes_tbl_cnt);
5250 set(KEY_SUPPORTED_PICTURE_SIZES, pictureSizeValues.string());
5251 LOGH("supported pic sizes: %s", pictureSizeValues.string());
5252 // Set default picture size to the smallest resolution
5253 CameraParameters::setPictureSize(
5254 m_pCapability->picture_sizes_tbl[m_pCapability->picture_sizes_tbl_cnt-1].width,
5255 m_pCapability->picture_sizes_tbl[m_pCapability->picture_sizes_tbl_cnt-1].height);
5256 } else {
5257 LOGW("supported picture sizes cnt is 0 or exceeds max!!!");
5258 }
5259
5260 // Need check if scale should be enabled
5261 if (m_pCapability->scale_picture_sizes_cnt > 0 &&
5262 m_pCapability->scale_picture_sizes_cnt <= MAX_SCALE_SIZES_CNT){
5263 //get scale size, enable scaling. And re-set picture size table with scale sizes
5264 m_reprocScaleParam.setScaleEnable(true);
5265 int rc_s = m_reprocScaleParam.setScaleSizeTbl(
5266 m_pCapability->scale_picture_sizes_cnt, m_pCapability->scale_picture_sizes,
5267 m_pCapability->picture_sizes_tbl_cnt, m_pCapability->picture_sizes_tbl);
5268 if(rc_s == NO_ERROR){
5269 cam_dimension_t *totalSizeTbl = m_reprocScaleParam.getTotalSizeTbl();
5270 size_t totalSizeCnt = m_reprocScaleParam.getTotalSizeTblCnt();
5271 String8 pictureSizeValues = createSizesString(totalSizeTbl, totalSizeCnt);
5272 set(KEY_SUPPORTED_PICTURE_SIZES, pictureSizeValues.string());
5273 LOGH("scaled supported pic sizes: %s", pictureSizeValues.string());
5274 }else{
5275 m_reprocScaleParam.setScaleEnable(false);
5276 LOGW("reset scaled picture size table failed.");
5277 }
5278 }else{
5279 m_reprocScaleParam.setScaleEnable(false);
5280 }
5281
5282 // Set supported thumbnail sizes
5283 String8 thumbnailSizeValues = createSizesString(
5284 THUMBNAIL_SIZES_MAP,
5285 PARAM_MAP_SIZE(THUMBNAIL_SIZES_MAP));
5286 set(KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, thumbnailSizeValues.string());
5287 // Set default thumnail size
5288 set(KEY_JPEG_THUMBNAIL_WIDTH, THUMBNAIL_SIZES_MAP[0].width);
5289 set(KEY_JPEG_THUMBNAIL_HEIGHT, THUMBNAIL_SIZES_MAP[0].height);
5290
5291 // Set supported livesnapshot sizes
5292 if (m_pCapability->livesnapshot_sizes_tbl_cnt > 0 &&
5293 m_pCapability->livesnapshot_sizes_tbl_cnt <= MAX_SIZES_CNT) {
5294 String8 liveSnpashotSizeValues = createSizesString(
5295 m_pCapability->livesnapshot_sizes_tbl,
5296 m_pCapability->livesnapshot_sizes_tbl_cnt);
5297 set(KEY_QC_SUPPORTED_LIVESNAPSHOT_SIZES, liveSnpashotSizeValues.string());
5298 LOGD("supported live snapshot sizes: %s", liveSnpashotSizeValues.string());
5299 m_LiveSnapshotSize =
5300 m_pCapability->livesnapshot_sizes_tbl[m_pCapability->livesnapshot_sizes_tbl_cnt-1];
5301 }
5302
5303 // Set supported preview formats
5304 String8 previewFormatValues = createValuesString(
5305 m_pCapability->supported_preview_fmts,
5306 m_pCapability->supported_preview_fmt_cnt,
5307 PREVIEW_FORMATS_MAP,
5308 PARAM_MAP_SIZE(PREVIEW_FORMATS_MAP));
5309 set(KEY_SUPPORTED_PREVIEW_FORMATS, previewFormatValues.string());
5310 // Set default preview format
5311 CameraParameters::setPreviewFormat(PIXEL_FORMAT_YUV420SP);
5312
5313 // Set default Video Format as OPAQUE
5314 // Internally both Video and Camera subsystems use NV21_VENUS
5315 set(KEY_VIDEO_FRAME_FORMAT, PIXEL_FORMAT_ANDROID_OPAQUE);
5316
5317 // Set supported picture formats
5318 String8 pictureTypeValues(PIXEL_FORMAT_JPEG);
5319 String8 str = createValuesString(
5320 m_pCapability->supported_raw_fmts,
5321 m_pCapability->supported_raw_fmt_cnt,
5322 PICTURE_TYPES_MAP,
5323 PARAM_MAP_SIZE(PICTURE_TYPES_MAP));
5324 if (str.string() != NULL) {
5325 pictureTypeValues.append(",");
5326 pictureTypeValues.append(str);
5327 }
5328
5329 set(KEY_SUPPORTED_PICTURE_FORMATS, pictureTypeValues.string());
5330 // Set default picture Format
5331 CameraParameters::setPictureFormat(PIXEL_FORMAT_JPEG);
5332 // Set raw image size
5333 char raw_size_str[32];
5334 snprintf(raw_size_str, sizeof(raw_size_str), "%dx%d",
5335 m_pCapability->raw_dim[0].width, m_pCapability->raw_dim[0].height);
5336 set(KEY_QC_RAW_PICUTRE_SIZE, raw_size_str);
5337 LOGD("KEY_QC_RAW_PICUTRE_SIZE: w: %d, h: %d ",
5338 m_pCapability->raw_dim[0].width, m_pCapability->raw_dim[0].height);
5339
5340 //set default jpeg quality and thumbnail quality
5341 set(KEY_JPEG_QUALITY, 85);
5342 set(KEY_JPEG_THUMBNAIL_QUALITY, 85);
5343
5344 // Set FPS ranges
5345 if (m_pCapability->fps_ranges_tbl_cnt > 0 &&
5346 m_pCapability->fps_ranges_tbl_cnt <= MAX_SIZES_CNT) {
5347 int default_fps_index = 0;
5348 String8 fpsRangeValues = createFpsRangeString(m_pCapability->fps_ranges_tbl,
5349 m_pCapability->fps_ranges_tbl_cnt,
5350 default_fps_index);
5351 set(KEY_SUPPORTED_PREVIEW_FPS_RANGE, fpsRangeValues.string());
5352
5353 int min_fps =
5354 int(m_pCapability->fps_ranges_tbl[default_fps_index].min_fps * 1000);
5355 int max_fps =
5356 int(m_pCapability->fps_ranges_tbl[default_fps_index].max_fps * 1000);
5357 m_default_fps_range = m_pCapability->fps_ranges_tbl[default_fps_index];
5358 //Set video fps same as preview fps
5359 setPreviewFpsRange(min_fps, max_fps, min_fps, max_fps);
5360
5361 // Set legacy preview fps
5362 String8 fpsValues = createFpsString(m_pCapability->fps_ranges_tbl[default_fps_index]);
5363 set(KEY_SUPPORTED_PREVIEW_FRAME_RATES, fpsValues.string());
5364 LOGH("supported fps rates: %s", fpsValues.string());
5365 CameraParameters::setPreviewFrameRate(int(m_pCapability->fps_ranges_tbl[default_fps_index].max_fps));
5366 } else {
5367 LOGW("supported fps ranges cnt is 0 or exceeds max!!!");
5368 }
5369
5370 // Set supported focus modes
5371 if (m_pCapability->supported_focus_modes_cnt > 0) {
5372 String8 focusModeValues = createValuesString(
5373 m_pCapability->supported_focus_modes,
5374 m_pCapability->supported_focus_modes_cnt,
5375 FOCUS_MODES_MAP,
5376 PARAM_MAP_SIZE(FOCUS_MODES_MAP));
5377 set(KEY_SUPPORTED_FOCUS_MODES, focusModeValues);
5378
5379 // Set default focus mode and update corresponding parameter buf
5380 const char *focusMode = lookupNameByValue(FOCUS_MODES_MAP,
5381 PARAM_MAP_SIZE(FOCUS_MODES_MAP),
5382 m_pCapability->supported_focus_modes[0]);
5383 if (focusMode != NULL) {
5384 setFocusMode(focusMode);
5385 } else {
5386 setFocusMode(FOCUS_MODE_FIXED);
5387 }
5388 } else {
5389 LOGW("supported focus modes cnt is 0!!!");
5390 }
5391
5392 // Set focus areas
5393 if (m_pCapability->max_num_focus_areas > MAX_ROI) {
5394 m_pCapability->max_num_focus_areas = MAX_ROI;
5395 }
5396 set(KEY_MAX_NUM_FOCUS_AREAS, m_pCapability->max_num_focus_areas);
5397 if (m_pCapability->max_num_focus_areas > 0) {
5398 setFocusAreas(DEFAULT_CAMERA_AREA);
5399 }
5400
5401 // Set metering areas
5402 if (m_pCapability->max_num_metering_areas > MAX_ROI) {
5403 m_pCapability->max_num_metering_areas = MAX_ROI;
5404 }
5405 set(KEY_MAX_NUM_METERING_AREAS, m_pCapability->max_num_metering_areas);
5406 if (m_pCapability->max_num_metering_areas > 0) {
5407 setMeteringAreas(DEFAULT_CAMERA_AREA);
5408 }
5409
5410 // set focus position, we should get them from m_pCapability
5411 m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_INDEX] = 0;
5412 m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_INDEX] = 1023;
5413 set(KEY_QC_MIN_FOCUS_POS_INDEX,
5414 (int) m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_INDEX]);
5415 set(KEY_QC_MAX_FOCUS_POS_INDEX,
5416 (int) m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_INDEX]);
5417
5418 m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_DAC_CODE] = 0;
5419 m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_DAC_CODE] = 1023;
5420 set(KEY_QC_MIN_FOCUS_POS_DAC,
5421 (int) m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_DAC_CODE]);
5422 set(KEY_QC_MAX_FOCUS_POS_DAC,
5423 (int) m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_DAC_CODE]);
5424
5425 m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_RATIO] = 0;
5426 m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_RATIO] = 100;
5427 set(KEY_QC_MIN_FOCUS_POS_RATIO,
5428 (int) m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_RATIO]);
5429 set(KEY_QC_MAX_FOCUS_POS_RATIO,
5430 (int) m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_RATIO]);
5431
5432 m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_DIOPTER] = 0;
5433 if (m_pCapability->min_focus_distance > 0) {
5434 m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_DIOPTER] =
5435 m_pCapability->min_focus_distance;
5436 } else {
5437 m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_DIOPTER] = 0;
5438 }
5439 setFloat(KEY_QC_MIN_FOCUS_POS_DIOPTER,
5440 m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_DIOPTER]);
5441 setFloat(KEY_QC_MAX_FOCUS_POS_DIOPTER,
5442 m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_DIOPTER]);
5443
5444 //set supported manual focus modes
5445 String8 manualFocusModes(VALUE_OFF);
5446 if (m_pCapability->supported_focus_modes_cnt > 1 &&
5447 m_pCapability->min_focus_distance > 0) {
5448 manualFocusModes.append(",");
5449 manualFocusModes.append(KEY_QC_FOCUS_SCALE_MODE);
5450 manualFocusModes.append(",");
5451 manualFocusModes.append(KEY_QC_FOCUS_DIOPTER_MODE);
5452 }
5453 set(KEY_QC_SUPPORTED_MANUAL_FOCUS_MODES, manualFocusModes.string());
5454
5455 // Set Saturation
5456 set(KEY_QC_MIN_SATURATION, m_pCapability->saturation_ctrl.min_value);
5457 set(KEY_QC_MAX_SATURATION, m_pCapability->saturation_ctrl.max_value);
5458 set(KEY_QC_SATURATION_STEP, m_pCapability->saturation_ctrl.step);
5459 setSaturation(m_pCapability->saturation_ctrl.def_value);
5460
5461 // Set Sharpness
5462 set(KEY_QC_MIN_SHARPNESS, m_pCapability->sharpness_ctrl.min_value);
5463 set(KEY_QC_MAX_SHARPNESS, m_pCapability->sharpness_ctrl.max_value);
5464 set(KEY_QC_SHARPNESS_STEP, m_pCapability->sharpness_ctrl.step);
5465 setSharpness(m_pCapability->sharpness_ctrl.def_value);
5466
5467 // Set Contrast
5468 set(KEY_QC_MIN_CONTRAST, m_pCapability->contrast_ctrl.min_value);
5469 set(KEY_QC_MAX_CONTRAST, m_pCapability->contrast_ctrl.max_value);
5470 set(KEY_QC_CONTRAST_STEP, m_pCapability->contrast_ctrl.step);
5471 setContrast(m_pCapability->contrast_ctrl.def_value);
5472
5473 // Set SCE factor
5474 set(KEY_QC_MIN_SCE_FACTOR, m_pCapability->sce_ctrl.min_value); // -100
5475 set(KEY_QC_MAX_SCE_FACTOR, m_pCapability->sce_ctrl.max_value); // 100
5476 set(KEY_QC_SCE_FACTOR_STEP, m_pCapability->sce_ctrl.step); // 10
5477 setSkinToneEnhancement(m_pCapability->sce_ctrl.def_value); // 0
5478
5479 // Set Brightness
5480 set(KEY_QC_MIN_BRIGHTNESS, m_pCapability->brightness_ctrl.min_value); // 0
5481 set(KEY_QC_MAX_BRIGHTNESS, m_pCapability->brightness_ctrl.max_value); // 6
5482 set(KEY_QC_BRIGHTNESS_STEP, m_pCapability->brightness_ctrl.step); // 1
5483 setBrightness(m_pCapability->brightness_ctrl.def_value);
5484
5485 // Set Auto exposure
5486 String8 autoExposureValues = createValuesString(
5487 m_pCapability->supported_aec_modes,
5488 m_pCapability->supported_aec_modes_cnt,
5489 AUTO_EXPOSURE_MAP,
5490 PARAM_MAP_SIZE(AUTO_EXPOSURE_MAP));
5491 set(KEY_QC_SUPPORTED_AUTO_EXPOSURE, autoExposureValues.string());
5492 setAutoExposure(AUTO_EXPOSURE_FRAME_AVG);
5493
5494 // Set Exposure Compensation
5495 set(KEY_MAX_EXPOSURE_COMPENSATION, m_pCapability->exposure_compensation_max); // 12
5496 set(KEY_MIN_EXPOSURE_COMPENSATION, m_pCapability->exposure_compensation_min); // -12
5497 setFloat(KEY_EXPOSURE_COMPENSATION_STEP, m_pCapability->exposure_compensation_step); // 1/6
5498 setExposureCompensation(m_pCapability->exposure_compensation_default); // 0
5499
5500 // Set Instant AEC modes
5501 String8 instantAECModes = createValuesString(
5502 m_pCapability->supported_instant_aec_modes,
5503 m_pCapability->supported_instant_aec_modes_cnt,
5504 INSTANT_AEC_MODES_MAP,
5505 PARAM_MAP_SIZE(INSTANT_AEC_MODES_MAP));
5506 set(KEY_QC_INSTANT_AEC_SUPPORTED_MODES, instantAECModes.string());
5507
5508 // Set Instant Capture modes
5509 String8 instantCaptureModes = createValuesString(
5510 m_pCapability->supported_instant_aec_modes,
5511 m_pCapability->supported_instant_aec_modes_cnt,
5512 INSTANT_CAPTURE_MODES_MAP,
5513 PARAM_MAP_SIZE(INSTANT_CAPTURE_MODES_MAP));
5514 set(KEY_QC_INSTANT_CAPTURE_SUPPORTED_MODES, instantCaptureModes.string());
5515
5516
5517 // Set Antibanding
5518 String8 antibandingValues = createValuesString(
5519 m_pCapability->supported_antibandings,
5520 m_pCapability->supported_antibandings_cnt,
5521 ANTIBANDING_MODES_MAP,
5522 PARAM_MAP_SIZE(ANTIBANDING_MODES_MAP));
5523 set(KEY_SUPPORTED_ANTIBANDING, antibandingValues);
5524 setAntibanding(ANTIBANDING_OFF);
5525
5526 // Set Effect
5527 String8 effectValues = createValuesString(
5528 m_pCapability->supported_effects,
5529 m_pCapability->supported_effects_cnt,
5530 EFFECT_MODES_MAP,
5531 PARAM_MAP_SIZE(EFFECT_MODES_MAP));
5532
5533 if (m_pCapability->supported_effects_cnt > 0) {
5534 set(KEY_SUPPORTED_EFFECTS, effectValues);
5535 } else {
5536 LOGW("Color effects are not available");
5537 set(KEY_SUPPORTED_EFFECTS, EFFECT_NONE);
5538 }
5539 setEffect(EFFECT_NONE);
5540
5541 // Set WhiteBalance
5542 String8 whitebalanceValues = createValuesString(
5543 m_pCapability->supported_white_balances,
5544 m_pCapability->supported_white_balances_cnt,
5545 WHITE_BALANCE_MODES_MAP,
5546 PARAM_MAP_SIZE(WHITE_BALANCE_MODES_MAP));
5547 set(KEY_SUPPORTED_WHITE_BALANCE, whitebalanceValues);
5548 setWhiteBalance(WHITE_BALANCE_AUTO);
5549
5550 // set supported wb cct, we should get them from m_pCapability
5551 m_pCapability->min_wb_cct = 2000;
5552 m_pCapability->max_wb_cct = 8000;
5553 set(KEY_QC_MIN_WB_CCT, m_pCapability->min_wb_cct);
5554 set(KEY_QC_MAX_WB_CCT, m_pCapability->max_wb_cct);
5555
5556 // set supported wb rgb gains, ideally we should get them from m_pCapability
5557 //but for now hardcode.
5558 m_pCapability->min_wb_gain = 1.0;
5559 m_pCapability->max_wb_gain = 4.0;
5560 setFloat(KEY_QC_MIN_WB_GAIN, m_pCapability->min_wb_gain);
5561 setFloat(KEY_QC_MAX_WB_GAIN, m_pCapability->max_wb_gain);
5562
5563 //set supported manual wb modes
5564 String8 manualWBModes(VALUE_OFF);
5565 if(m_pCapability->sensor_type.sens_type != CAM_SENSOR_YUV) {
5566 manualWBModes.append(",");
5567 manualWBModes.append(KEY_QC_WB_CCT_MODE);
5568 manualWBModes.append(",");
5569 manualWBModes.append(KEY_QC_WB_GAIN_MODE);
5570 }
5571 set(KEY_QC_SUPPORTED_MANUAL_WB_MODES, manualWBModes.string());
5572
5573 // Set Flash mode
5574 if(m_pCapability->supported_flash_modes_cnt > 0) {
5575 String8 flashValues = createValuesString(
5576 m_pCapability->supported_flash_modes,
5577 m_pCapability->supported_flash_modes_cnt,
5578 FLASH_MODES_MAP,
5579 PARAM_MAP_SIZE(FLASH_MODES_MAP));
5580 set(KEY_SUPPORTED_FLASH_MODES, flashValues);
5581 setFlash(FLASH_MODE_OFF);
5582 } else {
5583 LOGW("supported flash modes cnt is 0!!!");
5584 }
5585
5586 // Set Scene Mode
5587 String8 sceneModeValues = createValuesString(
5588 m_pCapability->supported_scene_modes,
5589 m_pCapability->supported_scene_modes_cnt,
5590 SCENE_MODES_MAP,
5591 PARAM_MAP_SIZE(SCENE_MODES_MAP));
5592 set(KEY_SUPPORTED_SCENE_MODES, sceneModeValues);
5593 setSceneMode(SCENE_MODE_AUTO);
5594
5595 // Set CDS Mode
5596 String8 cdsModeValues = createValuesStringFromMap(
5597 CDS_MODES_MAP,
5598 PARAM_MAP_SIZE(CDS_MODES_MAP));
5599 set(KEY_QC_SUPPORTED_CDS_MODES, cdsModeValues);
5600
5601 // Set video CDS Mode
5602 String8 videoCdsModeValues = createValuesStringFromMap(
5603 CDS_MODES_MAP,
5604 PARAM_MAP_SIZE(CDS_MODES_MAP));
5605 set(KEY_QC_SUPPORTED_VIDEO_CDS_MODES, videoCdsModeValues);
5606
5607 // Set TNR Mode
5608 String8 tnrModeValues = createValuesStringFromMap(
5609 ON_OFF_MODES_MAP,
5610 PARAM_MAP_SIZE(ON_OFF_MODES_MAP));
5611 set(KEY_QC_SUPPORTED_TNR_MODES, tnrModeValues);
5612
5613 // Set video TNR Mode
5614 String8 videoTnrModeValues = createValuesStringFromMap(
5615 ON_OFF_MODES_MAP,
5616 PARAM_MAP_SIZE(ON_OFF_MODES_MAP));
5617 set(KEY_QC_SUPPORTED_VIDEO_TNR_MODES, videoTnrModeValues);
5618
5619 // Set ISO Mode
5620 String8 isoValues = createValuesString(
5621 m_pCapability->supported_iso_modes,
5622 m_pCapability->supported_iso_modes_cnt,
5623 ISO_MODES_MAP,
5624 PARAM_MAP_SIZE(ISO_MODES_MAP));
5625 set(KEY_QC_SUPPORTED_ISO_MODES, isoValues);
5626 setISOValue(ISO_AUTO);
5627
5628 // Set exposure time
5629 String8 manualExpModes(VALUE_OFF);
5630 bool expTimeSupported = false;
5631 bool manualISOSupported = false;
5632 //capability values are in nano sec, convert to milli sec for upper layers
5633 char expTimeStr[20];
5634 double min_exp_time = (double) m_pCapability->exposure_time_range[0] / 1000000.0;
5635 double max_exp_time = (double) m_pCapability->exposure_time_range[1] / 1000000.0;
5636 snprintf(expTimeStr, sizeof(expTimeStr), "%f", min_exp_time);
5637 set(KEY_QC_MIN_EXPOSURE_TIME, expTimeStr);
5638 snprintf(expTimeStr, sizeof(expTimeStr), "%f", max_exp_time);
5639 set(KEY_QC_MAX_EXPOSURE_TIME, expTimeStr);
5640 if ((min_exp_time > 0) && (max_exp_time > min_exp_time)) {
5641 manualExpModes.append(",");
5642 manualExpModes.append(KEY_QC_EXP_TIME_PRIORITY);
5643 expTimeSupported = true;
5644 }
5645 LOGH(", Exposure time min %f ms, max %f ms",
5646 min_exp_time, max_exp_time);
5647
5648 // Set iso
5649 set(KEY_QC_MIN_ISO, m_pCapability->sensitivity_range.min_sensitivity);
5650 set(KEY_QC_MAX_ISO, m_pCapability->sensitivity_range.max_sensitivity);
5651 LOGH(", ISO min %d, max %d",
5652 m_pCapability->sensitivity_range.min_sensitivity,
5653 m_pCapability->sensitivity_range.max_sensitivity);
5654 if ((m_pCapability->sensitivity_range.min_sensitivity > 0) &&
5655 (m_pCapability->sensitivity_range.max_sensitivity >
5656 m_pCapability->sensitivity_range.min_sensitivity)) {
5657 manualExpModes.append(",");
5658 manualExpModes.append(KEY_QC_ISO_PRIORITY);
5659 manualISOSupported = true;
5660 }
5661 if (expTimeSupported && manualISOSupported) {
5662 manualExpModes.append(",");
5663 manualExpModes.append(KEY_QC_USER_SETTING);
5664 }
5665 //finally set supported manual exposure modes
5666 set(KEY_QC_SUPPORTED_MANUAL_EXPOSURE_MODES, manualExpModes.string());
5667
5668 // Set HFR
5669 String8 hfrValues = createHfrValuesString(
5670 m_pCapability->hfr_tbl,
5671 m_pCapability->hfr_tbl_cnt,
5672 HFR_MODES_MAP,
5673 PARAM_MAP_SIZE(HFR_MODES_MAP));
5674 set(KEY_QC_SUPPORTED_VIDEO_HIGH_FRAME_RATE_MODES, hfrValues.string());
5675 set(KEY_QC_VIDEO_HIGH_SPEED_RECORDING, "off");
5676 set(KEY_QC_VIDEO_HIGH_FRAME_RATE, "off");
5677 String8 hfrSizeValues = createHfrSizesString(
5678 m_pCapability->hfr_tbl,
5679 m_pCapability->hfr_tbl_cnt);
5680 set(KEY_QC_SUPPORTED_HFR_SIZES, hfrSizeValues.string());
5681 LOGD("HFR values = %s HFR Sizes = %s", hfrValues.string(), hfrSizeValues.string());
5682 setHighFrameRate(CAM_HFR_MODE_OFF);
5683
5684 // Set Focus algorithms
5685 String8 focusAlgoValues = createValuesString(
5686 m_pCapability->supported_focus_algos,
5687 m_pCapability->supported_focus_algos_cnt,
5688 FOCUS_ALGO_MAP,
5689 PARAM_MAP_SIZE(FOCUS_ALGO_MAP));
5690 set(KEY_QC_SUPPORTED_FOCUS_ALGOS, focusAlgoValues);
5691 setSelectableZoneAf(FOCUS_ALGO_AUTO);
5692
5693 // Set Zoom Ratios
5694 if (m_pCapability->zoom_supported > 0) {
5695 String8 zoomRatioValues = createZoomRatioValuesString(
5696 m_pCapability->zoom_ratio_tbl,
5697 m_pCapability->zoom_ratio_tbl_cnt);
5698 set(KEY_ZOOM_RATIOS, zoomRatioValues);
5699 set(KEY_MAX_ZOOM, (int)(m_pCapability->zoom_ratio_tbl_cnt - 1));
5700 setZoom(0);
5701 }
5702
5703 // Set Bracketing/HDR
5704 char prop[PROPERTY_VALUE_MAX];
5705 memset(prop, 0, sizeof(prop));
5706 property_get("persist.capture.burst.exposures", prop, "");
5707 if (strlen(prop) > 0) {
5708 set(KEY_QC_CAPTURE_BURST_EXPOSURE, prop);
5709 }
5710 String8 bracketingValues = createValuesStringFromMap(
5711 BRACKETING_MODES_MAP,
5712 PARAM_MAP_SIZE(BRACKETING_MODES_MAP));
5713 set(KEY_QC_SUPPORTED_AE_BRACKET_MODES, bracketingValues);
5714 setAEBracket(AE_BRACKET_OFF);
5715
5716 //Set AF Bracketing.
5717 for (size_t i = 0; i < m_pCapability->supported_focus_modes_cnt; i++) {
5718 if ((CAM_FOCUS_MODE_AUTO == m_pCapability->supported_focus_modes[i]) &&
5719 ((m_pCapability->qcom_supported_feature_mask &
5720 CAM_QCOM_FEATURE_UBIFOCUS) > 0)) {
5721 String8 afBracketingValues = createValuesStringFromMap(
5722 AF_BRACKETING_MODES_MAP,
5723 PARAM_MAP_SIZE(AF_BRACKETING_MODES_MAP));
5724 set(KEY_QC_SUPPORTED_AF_BRACKET_MODES, afBracketingValues);
5725 setAFBracket(AF_BRACKET_OFF);
5726 break;
5727 }
5728 }
5729
5730 //Set Refocus.
5731 //Re-use ubifocus flag for now.
5732 for (size_t i = 0; i < m_pCapability->supported_focus_modes_cnt; i++) {
5733 if ((CAM_FOCUS_MODE_AUTO == m_pCapability->supported_focus_modes[i]) &&
5734 (m_pCapability->qcom_supported_feature_mask &
5735 CAM_QCOM_FEATURE_REFOCUS) > 0) {
5736 String8 reFocusValues = createValuesStringFromMap(
5737 RE_FOCUS_MODES_MAP,
5738 PARAM_MAP_SIZE(RE_FOCUS_MODES_MAP));
5739 set(KEY_QC_SUPPORTED_RE_FOCUS_MODES, reFocusValues);
5740 setReFocus(RE_FOCUS_OFF);
5741 }
5742 }
5743
5744 //Set Chroma Flash.
5745 if ((m_pCapability->supported_flash_modes_cnt > 0) &&
5746 (m_pCapability->qcom_supported_feature_mask &
5747 CAM_QCOM_FEATURE_CHROMA_FLASH) > 0) {
5748 String8 chromaFlashValues = createValuesStringFromMap(
5749 CHROMA_FLASH_MODES_MAP,
5750 PARAM_MAP_SIZE(CHROMA_FLASH_MODES_MAP));
5751 set(KEY_QC_SUPPORTED_CHROMA_FLASH_MODES, chromaFlashValues);
5752 setChromaFlash(CHROMA_FLASH_OFF);
5753 }
5754
5755 //Set Opti Zoom.
5756 if (m_pCapability->zoom_supported &&
5757 (m_pCapability->qcom_supported_feature_mask &
5758 CAM_QCOM_FEATURE_OPTIZOOM) > 0){
5759 String8 optiZoomValues = createValuesStringFromMap(
5760 OPTI_ZOOM_MODES_MAP,
5761 PARAM_MAP_SIZE(OPTI_ZOOM_MODES_MAP));
5762 set(KEY_QC_SUPPORTED_OPTI_ZOOM_MODES, optiZoomValues);
5763 setOptiZoom(OPTI_ZOOM_OFF);
5764 }
5765
5766 //Set HDR Type
5767 uint32_t supported_hdr_modes = m_pCapability->qcom_supported_feature_mask &
5768 (CAM_QCOM_FEATURE_SENSOR_HDR | CAM_QCOM_FEATURE_HDR);
5769 if (supported_hdr_modes) {
5770 if (CAM_QCOM_FEATURE_SENSOR_HDR == supported_hdr_modes) {
5771 String8 hdrModeValues;
5772 hdrModeValues.append(HDR_MODE_SENSOR);
5773 set(KEY_QC_SUPPORTED_KEY_QC_HDR_MODES, hdrModeValues);
5774 setHDRMode(HDR_MODE_SENSOR);
5775 } else if (CAM_QCOM_FEATURE_HDR == supported_hdr_modes) {
5776 String8 hdrModeValues;
5777 hdrModeValues.append(HDR_MODE_MULTI_FRAME);
5778 set(KEY_QC_SUPPORTED_KEY_QC_HDR_MODES, hdrModeValues);
5779 setHDRMode(HDR_MODE_MULTI_FRAME);
5780 } else {
5781 String8 hdrModeValues = createValuesStringFromMap(
5782 HDR_MODES_MAP,
5783 PARAM_MAP_SIZE(HDR_MODES_MAP));
5784 set(KEY_QC_SUPPORTED_KEY_QC_HDR_MODES, hdrModeValues);
5785 setHDRMode(HDR_MODE_MULTI_FRAME);
5786 }
5787 }
5788
5789 //Set HDR need 1x
5790 String8 hdrNeed1xValues;
5791 if (!m_bHDRModeSensor) {
5792 hdrNeed1xValues = createValuesStringFromMap(TRUE_FALSE_MODES_MAP,
5793 PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP));
5794 } else {
5795 hdrNeed1xValues.append(VALUE_FALSE);
5796 }
5797 setHDRNeed1x(VALUE_FALSE);
5798 set(KEY_QC_SUPPORTED_HDR_NEED_1X, hdrNeed1xValues);
5799
5800 //Set True Portrait
5801 if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_TRUEPORTRAIT) > 0) {
5802 String8 truePortraitValues = createValuesStringFromMap(
5803 TRUE_PORTRAIT_MODES_MAP,
5804 PARAM_MAP_SIZE(TRUE_PORTRAIT_MODES_MAP));
5805 set(KEY_QC_SUPPORTED_TRUE_PORTRAIT_MODES, truePortraitValues);
5806 }
5807
5808 // Set Denoise
5809 if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_DENOISE2D) > 0){
5810 String8 denoiseValues = createValuesStringFromMap(
5811 DENOISE_ON_OFF_MODES_MAP, PARAM_MAP_SIZE(DENOISE_ON_OFF_MODES_MAP));
5812 set(KEY_QC_SUPPORTED_DENOISE, denoiseValues.string());
5813 #ifdef DEFAULT_DENOISE_MODE_ON
5814 setWaveletDenoise(DENOISE_ON);
5815 #else
5816 setWaveletDenoise(DENOISE_OFF);
5817 #endif
5818 }
5819
5820 // Set feature enable/disable
5821 String8 enableDisableValues = createValuesStringFromMap(
5822 ENABLE_DISABLE_MODES_MAP, PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP));
5823
5824 // Set Lens Shading
5825 set(KEY_QC_SUPPORTED_LENSSHADE_MODES, enableDisableValues);
5826 setLensShadeValue(VALUE_ENABLE);
5827 // Set MCE
5828 set(KEY_QC_SUPPORTED_MEM_COLOR_ENHANCE_MODES, enableDisableValues);
5829 setMCEValue(VALUE_ENABLE);
5830
5831 // Set DIS
5832 set(KEY_QC_SUPPORTED_DIS_MODES, enableDisableValues);
5833 setDISValue(VALUE_DISABLE);
5834
5835 // Set Histogram
5836 set(KEY_QC_SUPPORTED_HISTOGRAM_MODES,
5837 m_pCapability->histogram_supported ? enableDisableValues : "");
5838 set(KEY_QC_HISTOGRAM, VALUE_DISABLE);
5839
5840 //Set Red Eye Reduction
5841 set(KEY_QC_SUPPORTED_REDEYE_REDUCTION, enableDisableValues);
5842 setRedeyeReduction(VALUE_DISABLE);
5843
5844 //Set SkinTone Enhancement
5845 set(KEY_QC_SUPPORTED_SKIN_TONE_ENHANCEMENT_MODES, enableDisableValues);
5846
5847 // Enable LTM by default and disable it in HDR & SeeMore usecases
5848 setToneMapMode(true, false);
5849
5850 // Set feature on/off
5851 String8 onOffValues = createValuesStringFromMap(
5852 ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP));
5853
5854 //Set See more (LLVD)
5855 if (m_pCapability->qcom_supported_feature_mask &
5856 CAM_QCOM_FEATURE_LLVD) {
5857 set(KEY_QC_SUPPORTED_SEE_MORE_MODES, onOffValues);
5858 setSeeMore(VALUE_OFF);
5859 }
5860
5861 //Set Still more
5862 if (m_pCapability->qcom_supported_feature_mask &
5863 CAM_QCOM_FEATURE_STILLMORE) {
5864 String8 stillMoreValues = createValuesStringFromMap(
5865 STILL_MORE_MODES_MAP,
5866 PARAM_MAP_SIZE(STILL_MORE_MODES_MAP));
5867 set(KEY_QC_SUPPORTED_STILL_MORE_MODES, stillMoreValues);
5868 setStillMore(STILL_MORE_OFF);
5869 }
5870
5871 //Set Noise Reduction mode
5872 if (m_pCapability->qcom_supported_feature_mask &
5873 CAM_QTI_FEATURE_SW_TNR) {
5874 String8 noiseReductionModesValues = createValuesStringFromMap(
5875 NOISE_REDUCTION_MODES_MAP, PARAM_MAP_SIZE(NOISE_REDUCTION_MODES_MAP));
5876 set(KEY_QC_NOISE_REDUCTION_MODE_VALUES, noiseReductionModesValues);
5877 setNoiseReductionMode(VALUE_OFF);
5878 }
5879
5880 //Set Scene Detection
5881 set(KEY_QC_SUPPORTED_SCENE_DETECT, onOffValues);
5882 setSceneDetect(VALUE_OFF);
5883 m_bHDREnabled = false;
5884 m_bHDR1xFrameEnabled = false;
5885
5886 m_bHDRThumbnailProcessNeeded = false;
5887 m_bHDR1xExtraBufferNeeded = true;
5888 for (uint32_t i=0; i<m_pCapability->hdr_bracketing_setting.num_frames; i++) {
5889 if (0 == m_pCapability->hdr_bracketing_setting.exp_val.values[i]) {
5890 m_bHDR1xExtraBufferNeeded = false;
5891 break;
5892 }
5893 }
5894
5895 // Set HDR output scaling
5896 char value[PROPERTY_VALUE_MAX];
5897
5898 property_get("persist.camera.hdr.outcrop", value, VALUE_DISABLE);
5899 if (strncmp(VALUE_ENABLE, value, sizeof(VALUE_ENABLE))) {
5900 m_bHDROutputCropEnabled = false;
5901 } else {
5902 m_bHDROutputCropEnabled = true;
5903 }
5904
5905 //Set Face Detection
5906 set(KEY_QC_SUPPORTED_FACE_DETECTION, onOffValues);
5907 set(KEY_QC_FACE_DETECTION, VALUE_OFF);
5908
5909 //Set Face Recognition
5910 //set(KEY_QC_SUPPORTED_FACE_RECOGNITION, onOffValues);
5911 //set(KEY_QC_FACE_RECOGNITION, VALUE_OFF);
5912
5913 //Set ZSL
5914 set(KEY_QC_SUPPORTED_ZSL_MODES, onOffValues);
5915 #ifdef DEFAULT_ZSL_MODE_ON
5916 set(KEY_QC_ZSL, VALUE_ON);
5917 m_bZslMode = true;
5918 #else
5919 set(KEY_QC_ZSL, VALUE_OFF);
5920 m_bZslMode = false;
5921 #endif
5922
5923 // Check if zsl mode property is enabled.
5924 // If yes, force the camera to be in zsl mode
5925 // and force zsl mode to be enabled in dual camera mode.
5926 memset(value, 0x0, PROPERTY_VALUE_MAX);
5927 property_get("persist.camera.zsl.mode", value, "0");
5928 int32_t zsl_mode = atoi(value);
5929 if((zsl_mode == 1) ||
5930 (m_bZslMode == true) ||
5931 (m_relCamSyncInfo.sync_control == CAM_SYNC_RELATED_SENSORS_ON)) {
5932 LOGH("%d: Forcing Camera to ZSL mode enabled");
5933 set(KEY_QC_ZSL, VALUE_ON);
5934 m_bForceZslMode = true;
5935 m_bZslMode = true;
5936 int32_t value = m_bForceZslMode;
5937 ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ZSL_MODE, value);
5938 }
5939 m_bZslMode_new = m_bZslMode;
5940
5941 set(KEY_QC_SCENE_SELECTION, VALUE_DISABLE);
5942
5943 // Rdi mode
5944 set(KEY_QC_SUPPORTED_RDI_MODES, enableDisableValues);
5945 setRdiMode(VALUE_DISABLE);
5946
5947 // Secure mode
5948 set(KEY_QC_SUPPORTED_SECURE_MODES, enableDisableValues);
5949 setSecureMode(VALUE_DISABLE);
5950
5951 //Set video HDR
5952 if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_VIDEO_HDR) > 0) {
5953 set(KEY_QC_SUPPORTED_VIDEO_HDR_MODES, onOffValues);
5954 set(KEY_QC_VIDEO_HDR, VALUE_OFF);
5955 }
5956
5957 //Set HW Sensor Snapshot HDR
5958 if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_SENSOR_HDR)> 0) {
5959 set(KEY_QC_SUPPORTED_SENSOR_HDR_MODES, onOffValues);
5960 set(KEY_QC_SENSOR_HDR, VALUE_OFF);
5961 m_bSensorHDREnabled = false;
5962 }
5963
5964 // Set VT TimeStamp
5965 set(KEY_QC_VT_ENABLE, VALUE_DISABLE);
5966 //Set Touch AF/AEC
5967 String8 touchValues = createValuesStringFromMap(
5968 TOUCH_AF_AEC_MODES_MAP, PARAM_MAP_SIZE(TOUCH_AF_AEC_MODES_MAP));
5969
5970 set(KEY_QC_SUPPORTED_TOUCH_AF_AEC, touchValues);
5971 set(KEY_QC_TOUCH_AF_AEC, TOUCH_AF_AEC_OFF);
5972
5973 //set flip mode
5974 if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_FLIP) > 0) {
5975 String8 flipModes = createValuesStringFromMap(
5976 FLIP_MODES_MAP, PARAM_MAP_SIZE(FLIP_MODES_MAP));
5977 set(KEY_QC_SUPPORTED_FLIP_MODES, flipModes);
5978 set(KEY_QC_PREVIEW_FLIP, FLIP_MODE_OFF);
5979 set(KEY_QC_VIDEO_FLIP, FLIP_MODE_OFF);
5980 set(KEY_QC_SNAPSHOT_PICTURE_FLIP, FLIP_MODE_OFF);
5981 }
5982
5983 // Set default Auto Exposure lock value
5984 setAecLock(VALUE_FALSE);
5985
5986 // Set default AWB_LOCK lock value
5987 setAwbLock(VALUE_FALSE);
5988
5989 // Set default Camera mode
5990 set(KEY_QC_CAMERA_MODE, 0);
5991
5992 // Add support for internal preview restart
5993 set(KEY_INTERNAL_PERVIEW_RESTART, VALUE_TRUE);
5994 // Set default burst number
5995 set(KEY_QC_SNAPSHOT_BURST_NUM, 0);
5996 set(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER, 0);
5997
5998 //Get RAM size and disable features which are memory rich
5999 struct sysinfo info;
6000 sysinfo(&info);
6001
6002 LOGH("totalram = %ld, freeram = %ld ", info.totalram,
6003 info.freeram);
6004 if (info.totalram > TOTAL_RAM_SIZE_512MB) {
6005 set(KEY_QC_ZSL_HDR_SUPPORTED, VALUE_TRUE);
6006 } else {
6007 m_bIsLowMemoryDevice = true;
6008 set(KEY_QC_ZSL_HDR_SUPPORTED, VALUE_FALSE);
6009 }
6010
6011 setOfflineRAW();
6012 memset(mStreamPpMask, 0, sizeof(cam_feature_mask_t)*CAM_STREAM_TYPE_MAX);
6013 //Set video buffers as uncached by default
6014 set(KEY_QC_CACHE_VIDEO_BUFFERS, VALUE_DISABLE);
6015
6016 // Set default longshot mode
6017 set(KEY_QC_LONG_SHOT, "off");
6018 //Enable longshot by default
6019 set(KEY_QC_LONGSHOT_SUPPORTED, VALUE_TRUE);
6020
6021 int32_t rc = commitParameters();
6022 if (rc == NO_ERROR) {
6023 rc = setNumOfSnapshot();
6024 }
6025
6026 //Set Video Rotation
6027 String8 videoRotationValues = createValuesStringFromMap(VIDEO_ROTATION_MODES_MAP,
6028 PARAM_MAP_SIZE(VIDEO_ROTATION_MODES_MAP));
6029
6030 set(KEY_QC_SUPPORTED_VIDEO_ROTATION_VALUES, videoRotationValues.string());
6031 set(KEY_QC_VIDEO_ROTATION, VIDEO_ROTATION_0);
6032
6033 //Check for EZTune
6034 setEztune();
6035 //Default set for video batch size
6036 set(KEY_QC_VIDEO_BATCH_SIZE, 0);
6037
6038 //Setup dual-camera
6039 setDcrf();
6040
6041 // For Aux Camera of dual camera Mode,
6042 // by default set no display mode
6043 if (m_relCamSyncInfo.mode == CAM_MODE_SECONDARY) {
6044 set(KEY_QC_NO_DISPLAY_MODE, 1);
6045 m_bNoDisplayMode = true;
6046 }
6047
6048 cam_dimension_t pic_dim;
6049 pic_dim.width = 0;
6050 pic_dim.height = 0;
6051
6052 for(uint32_t i = 0;
6053 i < (m_pCapability->picture_sizes_tbl_cnt - 1);
6054 i++) {
6055 if ((pic_dim.width * pic_dim.height) <
6056 (int32_t)(m_pCapability->picture_sizes_tbl[i].width *
6057 m_pCapability->picture_sizes_tbl[i].height)) {
6058 pic_dim.width =
6059 m_pCapability->picture_sizes_tbl[i].width;
6060 pic_dim.height =
6061 m_pCapability->picture_sizes_tbl[i].height;
6062 }
6063 }
6064 LOGD("max pic size = %d %d", pic_dim.width,
6065 pic_dim.height);
6066 setMaxPicSize(pic_dim);
6067
6068 setManualCaptureMode(CAM_MANUAL_CAPTURE_TYPE_OFF);
6069
6070 return rc;
6071 }
6072
6073 /*===========================================================================
6074 * FUNCTION : allocate
6075 *
6076 * DESCRIPTION: Allocate buffer memory for parameter obj (if necessary)
6077 *
6078 * PARAMETERS : none
6079 *
6080 * RETURN : int32_t type of status
6081 * NO_ERROR -- success
6082 * none-zero failure code
6083 *==========================================================================*/
allocate()6084 int32_t QCameraParameters::allocate()
6085 {
6086 int32_t rc = NO_ERROR;
6087
6088 if (m_pParamHeap != NULL) {
6089 return rc;
6090 }
6091
6092 //Allocate Set Param Buffer
6093 m_pParamHeap = new QCameraHeapMemory(QCAMERA_ION_USE_CACHE);
6094 if (m_pParamHeap == NULL) {
6095 return NO_MEMORY;
6096 }
6097
6098 rc = m_pParamHeap->allocate(1, sizeof(parm_buffer_t), NON_SECURE);
6099 if(rc != OK) {
6100 rc = NO_MEMORY;
6101 LOGE("Error!! Param buffers have not been allocated");
6102 delete m_pParamHeap;
6103 m_pParamHeap = NULL;
6104 }
6105
6106 return rc;
6107 }
6108
6109 /*===========================================================================
6110 * FUNCTION : init
6111 *
6112 * DESCRIPTION: initialize parameter obj
6113 *
6114 * PARAMETERS :
6115 * @capabilities : ptr to camera capabilities
6116 * @mmops : ptr to memory ops table for mapping/unmapping
6117 * @adjustFPS : object reference for additional (possibly thermal)
6118 * framerate adjustment
6119 *
6120 * RETURN : int32_t type of status
6121 * NO_ERROR -- success
6122 * none-zero failure code
6123 *==========================================================================*/
init(cam_capability_t * capabilities,mm_camera_vtbl_t * mmOps,QCameraAdjustFPS * adjustFPS)6124 int32_t QCameraParameters::init(cam_capability_t *capabilities,
6125 mm_camera_vtbl_t *mmOps, QCameraAdjustFPS *adjustFPS)
6126 {
6127 int32_t rc = NO_ERROR;
6128
6129 m_pCapability = capabilities;
6130 m_pCamOpsTbl = mmOps;
6131 m_AdjustFPS = adjustFPS;
6132
6133 if (m_pParamHeap == NULL) {
6134 LOGE("Parameter buffers have not been allocated");
6135 rc = UNKNOWN_ERROR;
6136 goto TRANS_INIT_ERROR1;
6137 }
6138
6139 //Map memory for parameters buffer
6140 cam_buf_map_type_list bufMapList;
6141 rc = QCameraBufferMaps::makeSingletonBufMapList(
6142 CAM_MAPPING_BUF_TYPE_PARM_BUF, 0 /*stream id*/,
6143 0 /*buffer index*/, -1 /*plane index*/, 0 /*cookie*/,
6144 m_pParamHeap->getFd(0), sizeof(parm_buffer_t), bufMapList,
6145 m_pParamHeap->getPtr(0));
6146
6147 if (rc == NO_ERROR) {
6148 rc = m_pCamOpsTbl->ops->map_bufs(m_pCamOpsTbl->camera_handle,
6149 &bufMapList);
6150 }
6151
6152 if(rc < 0) {
6153 LOGE("failed to map SETPARM buffer");
6154 rc = FAILED_TRANSACTION;
6155 goto TRANS_INIT_ERROR2;
6156 }
6157 m_pParamBuf = (parm_buffer_t*) DATA_PTR(m_pParamHeap,0);
6158
6159 // Check if it is dual camera mode
6160 if(m_relCamSyncInfo.sync_control == CAM_SYNC_RELATED_SENSORS_ON) {
6161 //Allocate related cam sync buffer
6162 //this is needed for the payload that goes along with bundling cmd for related
6163 //camera use cases
6164 m_pRelCamSyncHeap = new QCameraHeapMemory(QCAMERA_ION_USE_CACHE);
6165 rc = m_pRelCamSyncHeap->allocate(1,
6166 sizeof(cam_sync_related_sensors_event_info_t), NON_SECURE);
6167 if(rc != OK) {
6168 rc = NO_MEMORY;
6169 LOGE("Failed to allocate Related cam sync Heap memory");
6170 goto TRANS_INIT_ERROR3;
6171 }
6172
6173 //Map memory for related cam sync buffer
6174 rc = m_pCamOpsTbl->ops->map_buf(m_pCamOpsTbl->camera_handle,
6175 CAM_MAPPING_BUF_TYPE_SYNC_RELATED_SENSORS_BUF,
6176 m_pRelCamSyncHeap->getFd(0),
6177 sizeof(cam_sync_related_sensors_event_info_t),
6178 (cam_sync_related_sensors_event_info_t*)DATA_PTR(m_pRelCamSyncHeap,0));
6179 if(rc < 0) {
6180 LOGE("failed to map Related cam sync buffer");
6181 rc = FAILED_TRANSACTION;
6182 goto TRANS_INIT_ERROR4;
6183 }
6184 m_pRelCamSyncBuf =
6185 (cam_sync_related_sensors_event_info_t*) DATA_PTR(m_pRelCamSyncHeap,0);
6186 }
6187 initDefaultParameters();
6188 mCommon.init(capabilities);
6189 m_bInited = true;
6190
6191 goto TRANS_INIT_DONE;
6192
6193 TRANS_INIT_ERROR4:
6194 m_pRelCamSyncHeap->deallocate();
6195
6196 TRANS_INIT_ERROR3:
6197 delete m_pRelCamSyncHeap;
6198 m_pRelCamSyncHeap = NULL;
6199
6200 TRANS_INIT_ERROR2:
6201 m_pParamHeap->deallocate();
6202 delete m_pParamHeap;
6203 m_pParamHeap = NULL;
6204
6205 TRANS_INIT_ERROR1:
6206 m_pCapability = NULL;
6207 m_pCamOpsTbl = NULL;
6208 m_AdjustFPS = NULL;
6209
6210 TRANS_INIT_DONE:
6211 return rc;
6212 }
6213
6214 /*===========================================================================
6215 * FUNCTION : deinit
6216 *
6217 * DESCRIPTION: deinitialize
6218 *
6219 * PARAMETERS : none
6220 *
6221 * RETURN : none
6222 *==========================================================================*/
deinit()6223 void QCameraParameters::deinit()
6224 {
6225 if (!m_bInited) {
6226 return;
6227 }
6228
6229 //clear all entries in the map
6230 String8 emptyStr;
6231 QCameraParameters::unflatten(emptyStr);
6232
6233 if ((NULL != m_pCamOpsTbl) && (m_pCamOpsTbl->ops != NULL)) {
6234 m_pCamOpsTbl->ops->unmap_buf(
6235 m_pCamOpsTbl->camera_handle,
6236 CAM_MAPPING_BUF_TYPE_PARM_BUF);
6237
6238 if (m_relCamSyncInfo.sync_control == CAM_SYNC_RELATED_SENSORS_ON) {
6239 m_pCamOpsTbl->ops->unmap_buf(
6240 m_pCamOpsTbl->camera_handle,
6241 CAM_MAPPING_BUF_TYPE_SYNC_RELATED_SENSORS_BUF);
6242 }
6243 }
6244
6245 m_pCapability = NULL;
6246 if (NULL != m_pParamHeap) {
6247 m_pParamHeap->deallocate();
6248 delete m_pParamHeap;
6249 m_pParamHeap = NULL;
6250 m_pParamBuf = NULL;
6251 }
6252 if (NULL != m_pRelCamSyncHeap) {
6253 m_pRelCamSyncHeap->deallocate();
6254 delete m_pRelCamSyncHeap;
6255 m_pRelCamSyncHeap = NULL;
6256 m_pRelCamSyncBuf = NULL;
6257 }
6258
6259 m_AdjustFPS = NULL;
6260 m_tempMap.clear();
6261 m_pCamOpsTbl = NULL;
6262 m_AdjustFPS = NULL;
6263
6264 m_bInited = false;
6265 }
6266
6267 /*===========================================================================
6268 * FUNCTION : parse_pair
6269 *
6270 * DESCRIPTION: helper function to parse string like "640x480" or "10000,20000"
6271 *
6272 * PARAMETERS :
6273 * @str : input string to be parse
6274 * @first : [output] first value of the pair
6275 * @second : [output] second value of the pair
6276 * @delim : [input] delimeter to seperate the pair
6277 * @endptr : [output] ptr to the end of the pair string
6278 *
6279 * RETURN : int32_t type of status
6280 * NO_ERROR -- success
6281 * none-zero failure code
6282 *==========================================================================*/
parse_pair(const char * str,int * first,int * second,char delim,char ** endptr=NULL)6283 int32_t QCameraParameters::parse_pair(const char *str,
6284 int *first,
6285 int *second,
6286 char delim,
6287 char **endptr = NULL)
6288 {
6289 // Find the first integer.
6290 char *end;
6291 int w = (int)strtol(str, &end, 10);
6292 // If a delimeter does not immediately follow, give up.
6293 if (*end != delim) {
6294 LOGE("Cannot find delimeter (%c) in str=%s", delim, str);
6295 return BAD_VALUE;
6296 }
6297
6298 // Find the second integer, immediately after the delimeter.
6299 int h = (int)strtol(end+1, &end, 10);
6300
6301 *first = w;
6302 *second = h;
6303
6304 if (endptr) {
6305 *endptr = end;
6306 }
6307
6308 return NO_ERROR;
6309 }
6310
6311 /*===========================================================================
6312 * FUNCTION : parseSizesList
6313 *
6314 * DESCRIPTION: helper function to parse string containing sizes
6315 *
6316 * PARAMETERS :
6317 * @sizesStr: [input] input string to be parse
6318 * @sizes : [output] reference to store parsed sizes
6319 *
6320 * RETURN : none
6321 *==========================================================================*/
parseSizesList(const char * sizesStr,Vector<Size> & sizes)6322 void QCameraParameters::parseSizesList(const char *sizesStr, Vector<Size> &sizes)
6323 {
6324 if (sizesStr == 0) {
6325 return;
6326 }
6327
6328 char *sizeStartPtr = (char *)sizesStr;
6329
6330 while (true) {
6331 int width, height;
6332 int success = parse_pair(sizeStartPtr, &width, &height, 'x',
6333 &sizeStartPtr);
6334 if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) {
6335 LOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
6336 return;
6337 }
6338 sizes.push(Size(width, height));
6339
6340 if (*sizeStartPtr == '\0') {
6341 return;
6342 }
6343 sizeStartPtr++;
6344 }
6345 }
6346
6347 /*===========================================================================
6348 * FUNCTION : adjustPreviewFpsRange
6349 *
6350 * DESCRIPTION: adjust preview FPS ranges
6351 * according to external events
6352 *
6353 * PARAMETERS :
6354 * @minFPS : min FPS value
6355 * @maxFPS : max FPS value
6356 *
6357 * RETURN : int32_t type of status
6358 * NO_ERROR -- success
6359 * none-zero failure code
6360 *==========================================================================*/
adjustPreviewFpsRange(cam_fps_range_t * fpsRange)6361 int32_t QCameraParameters::adjustPreviewFpsRange(cam_fps_range_t *fpsRange)
6362 {
6363 if ( fpsRange == NULL ) {
6364 return BAD_VALUE;
6365 }
6366
6367 if ( m_pParamBuf == NULL ) {
6368 return NO_INIT;
6369 }
6370
6371 int32_t rc = initBatchUpdate(m_pParamBuf);
6372 if ( rc != NO_ERROR ) {
6373 LOGE("Failed to initialize group update table");
6374 return rc;
6375 }
6376
6377 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FPS_RANGE, *fpsRange)) {
6378 LOGE("Parameters batch failed");
6379 return BAD_VALUE;
6380 }
6381
6382 rc = commitSetBatch();
6383 if ( rc != NO_ERROR ) {
6384 LOGE("Failed to commit batch parameters");
6385 return rc;
6386 }
6387
6388 return rc;
6389 }
6390
6391 /*===========================================================================
6392 * FUNCTION : setPreviewFpsRanges
6393 *
6394 * DESCRIPTION: set preview FPS ranges
6395 *
6396 * PARAMETERS :
6397 * @minFPS : min FPS value
6398 * @maxFPS : max FPS value
6399 *
6400 * RETURN : int32_t type of status
6401 * NO_ERROR -- success
6402 * none-zero failure code
6403 *==========================================================================*/
setPreviewFpsRange(int min_fps,int max_fps,int vid_min_fps,int vid_max_fps)6404 int32_t QCameraParameters::setPreviewFpsRange(int min_fps,
6405 int max_fps, int vid_min_fps,int vid_max_fps)
6406 {
6407 char str[32];
6408 char value[PROPERTY_VALUE_MAX];
6409 int fixedFpsValue;
6410 /*This property get value should be the fps that user needs*/
6411 property_get("persist.debug.set.fixedfps", value, "0");
6412 fixedFpsValue = atoi(value);
6413
6414 LOGD("E minFps = %d, maxFps = %d , vid minFps = %d, vid maxFps = %d",
6415 min_fps, max_fps, vid_min_fps, vid_max_fps);
6416
6417 if(fixedFpsValue != 0) {
6418 min_fps = max_fps = fixedFpsValue*1000;
6419 if (!isHfrMode()) {
6420 vid_min_fps = vid_max_fps = fixedFpsValue*1000;
6421 }
6422 }
6423 snprintf(str, sizeof(str), "%d,%d", min_fps, max_fps);
6424 LOGH("Setting preview fps range %s", str);
6425 updateParamEntry(KEY_PREVIEW_FPS_RANGE, str);
6426 cam_fps_range_t fps_range;
6427 memset(&fps_range, 0x00, sizeof(cam_fps_range_t));
6428 fps_range.min_fps = (float)min_fps / 1000.0f;
6429 fps_range.max_fps = (float)max_fps / 1000.0f;
6430 fps_range.video_min_fps = (float)vid_min_fps / 1000.0f;
6431 fps_range.video_max_fps = (float)vid_max_fps / 1000.0f;
6432
6433 LOGH("Updated: minFps = %d, maxFps = %d ,"
6434 " vid minFps = %d, vid maxFps = %d",
6435 min_fps, max_fps, vid_min_fps, vid_max_fps);
6436
6437 if ( NULL != m_AdjustFPS ) {
6438 if (m_ThermalMode == QCAMERA_THERMAL_ADJUST_FPS &&
6439 !m_bRecordingHint) {
6440 float minVideoFps = min_fps, maxVideoFps = max_fps;
6441 if (isHfrMode()) {
6442 minVideoFps = m_hfrFpsRange.video_min_fps;
6443 maxVideoFps = m_hfrFpsRange.video_max_fps;
6444 }
6445 m_AdjustFPS->recalcFPSRange(min_fps, max_fps, minVideoFps, maxVideoFps, fps_range);
6446 LOGH("Thermal adjusted Preview fps range %3.2f,%3.2f, %3.2f, %3.2f",
6447 fps_range.min_fps, fps_range.max_fps,
6448 fps_range.video_min_fps, fps_range.video_max_fps);
6449 }
6450 }
6451
6452 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FPS_RANGE, fps_range)) {
6453 return BAD_VALUE;
6454 }
6455
6456 return NO_ERROR;
6457 }
6458
6459
6460
6461 /*===========================================================================
6462 * FUNCTION : setAutoExposure
6463 *
6464 * DESCRIPTION: set auto exposure
6465 *
6466 * PARAMETERS :
6467 * @autoExp : auto exposure value string
6468 *
6469 * RETURN : int32_t type of status
6470 * NO_ERROR -- success
6471 * none-zero failure code
6472 *==========================================================================*/
setAutoExposure(const char * autoExp)6473 int32_t QCameraParameters::setAutoExposure(const char *autoExp)
6474 {
6475 if (autoExp != NULL) {
6476 int32_t value = lookupAttr(AUTO_EXPOSURE_MAP, PARAM_MAP_SIZE(AUTO_EXPOSURE_MAP), autoExp);
6477 if (value != NAME_NOT_FOUND) {
6478 LOGH("Setting auto exposure %s", autoExp);
6479 updateParamEntry(KEY_QC_AUTO_EXPOSURE, autoExp);
6480 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_AEC_ALGO_TYPE, value)) {
6481 return BAD_VALUE;
6482 }
6483 return NO_ERROR;
6484 }
6485 }
6486 LOGE("Invalid auto exposure value: %s", (autoExp == NULL) ? "NULL" : autoExp);
6487 return BAD_VALUE;
6488 }
6489
6490 /*===========================================================================
6491 * FUNCTION : setEffect
6492 *
6493 * DESCRIPTION: set effect
6494 *
6495 * PARAMETERS :
6496 * @effect : effect value string
6497 *
6498 * RETURN : int32_t type of status
6499 * NO_ERROR -- success
6500 * none-zero failure code
6501 *==========================================================================*/
setEffect(const char * effect)6502 int32_t QCameraParameters::setEffect(const char *effect)
6503 {
6504 if (effect != NULL) {
6505 int32_t value = lookupAttr(EFFECT_MODES_MAP, PARAM_MAP_SIZE(EFFECT_MODES_MAP), effect);
6506 if (value != NAME_NOT_FOUND) {
6507 LOGH("Setting effect %s", effect);
6508 updateParamEntry(KEY_EFFECT, effect);
6509 uint8_t prmEffect = static_cast<uint8_t>(value);
6510 mParmEffect = prmEffect;
6511 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_EFFECT, prmEffect)) {
6512 return BAD_VALUE;
6513 }
6514 return NO_ERROR;
6515 }
6516 }
6517 LOGE("Invalid effect value: %s", (effect == NULL) ? "NULL" : effect);
6518 return BAD_VALUE;
6519 }
6520
6521 /*===========================================================================
6522 * FUNCTION : setBrightness
6523 *
6524 * DESCRIPTION: set brightness control value
6525 *
6526 * PARAMETERS :
6527 * @brightness : brightness control value
6528 *
6529 * RETURN : int32_t type of status
6530 * NO_ERROR -- success
6531 * none-zero failure code
6532 *==========================================================================*/
setBrightness(int brightness)6533 int32_t QCameraParameters::setBrightness(int brightness)
6534 {
6535 char val[16];
6536 snprintf(val, sizeof(val), "%d", brightness);
6537 updateParamEntry(KEY_QC_BRIGHTNESS, val);
6538
6539 LOGH("Setting brightness %s", val);
6540 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_BRIGHTNESS, brightness)) {
6541 return BAD_VALUE;
6542 }
6543
6544 return NO_ERROR;
6545 }
6546
6547 /*===========================================================================
6548 * FUNCTION : setFocusMode
6549 *
6550 * DESCRIPTION: set focus mode
6551 *
6552 * PARAMETERS :
6553 * @focusMode : focus mode value string
6554 *
6555 * RETURN : int32_t type of status
6556 * NO_ERROR -- success
6557 * none-zero failure code
6558 *==========================================================================*/
setFocusMode(const char * focusMode)6559 int32_t QCameraParameters::setFocusMode(const char *focusMode)
6560 {
6561 if (focusMode != NULL) {
6562 int32_t value = lookupAttr(FOCUS_MODES_MAP, PARAM_MAP_SIZE(FOCUS_MODES_MAP), focusMode);
6563 if (value != NAME_NOT_FOUND) {
6564 int32_t rc = NO_ERROR;
6565 LOGH("Setting focus mode %s", focusMode);
6566 mFocusMode = (cam_focus_mode_type)value;
6567
6568 updateParamEntry(KEY_FOCUS_MODE, focusMode);
6569 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
6570 CAM_INTF_PARM_FOCUS_MODE, (uint8_t)value)) {
6571 rc = BAD_VALUE;
6572 }
6573 if (strcmp(focusMode,"infinity")==0){
6574 set(QCameraParameters::KEY_FOCUS_DISTANCES, "Infinity,Infinity,Infinity");
6575 }
6576 return rc;
6577 }
6578 }
6579 LOGE("Invalid focus mode value: %s", (focusMode == NULL) ? "NULL" : focusMode);
6580 return BAD_VALUE;
6581 }
6582
6583 /*===========================================================================
6584 * FUNCTION : setFocusPosition
6585 *
6586 * DESCRIPTION: set focus position
6587 *
6588 * PARAMETERS :
6589 * @typeStr : focus position type, index or dac_code
6590 * @posStr : focus positon.
6591 *
6592 * RETURN : int32_t type of status
6593 * NO_ERROR -- success
6594 * none-zero failure code
6595 *==========================================================================*/
setFocusPosition(const char * typeStr,const char * posStr)6596 int32_t QCameraParameters::setFocusPosition(const char *typeStr, const char *posStr)
6597 {
6598 LOGH(", type:%s, pos: %s", typeStr, posStr);
6599 int32_t type = atoi(typeStr);
6600 float pos = (float) atof(posStr);
6601
6602 if ((type >= CAM_MANUAL_FOCUS_MODE_INDEX) &&
6603 (type < CAM_MANUAL_FOCUS_MODE_MAX)) {
6604 // get max and min focus position from m_pCapability
6605 float minFocusPos = m_pCapability->min_focus_pos[type];
6606 float maxFocusPos = m_pCapability->max_focus_pos[type];
6607 LOGH(", focusPos min: %f, max: %f", minFocusPos, maxFocusPos);
6608
6609 if (pos >= minFocusPos && pos <= maxFocusPos) {
6610 updateParamEntry(KEY_QC_MANUAL_FOCUS_POS_TYPE, typeStr);
6611 updateParamEntry(KEY_QC_MANUAL_FOCUS_POSITION, posStr);
6612
6613 cam_manual_focus_parm_t manual_focus;
6614 manual_focus.flag = (cam_manual_focus_mode_type)type;
6615 if (manual_focus.flag == CAM_MANUAL_FOCUS_MODE_DIOPTER) {
6616 manual_focus.af_manual_diopter = pos;
6617 } else if (manual_focus.flag == CAM_MANUAL_FOCUS_MODE_RATIO) {
6618 manual_focus.af_manual_lens_position_ratio = (int32_t) pos;
6619 } else if (manual_focus.flag == CAM_MANUAL_FOCUS_MODE_INDEX) {
6620 manual_focus.af_manual_lens_position_index = (int32_t) pos;
6621 } else {
6622 manual_focus.af_manual_lens_position_dac = (int32_t) pos;
6623 }
6624
6625 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_MANUAL_FOCUS_POS,
6626 manual_focus)) {
6627 return BAD_VALUE;
6628 }
6629 return NO_ERROR;
6630 }
6631 }
6632
6633 LOGE("invalid params, type:%d, pos: %f", type, pos);
6634 return BAD_VALUE;
6635 }
6636
6637 /*===========================================================================
6638 * FUNCTION : updateAEInfo
6639 *
6640 * DESCRIPTION: update exposure information from metadata callback
6641 *
6642 * PARAMETERS :
6643 * @ae_params : auto exposure params
6644 *
6645 * RETURN : void
6646 *==========================================================================*/
updateAEInfo(cam_3a_params_t & ae_params)6647 void QCameraParameters::updateAEInfo(cam_3a_params_t &ae_params)
6648 {
6649 const char *prevExpTime = get(KEY_QC_CURRENT_EXPOSURE_TIME);
6650 char newExpTime[15];
6651 snprintf(newExpTime, sizeof(newExpTime), "%f", ae_params.exp_time*1000.0);
6652
6653 if (prevExpTime == NULL || strcmp(prevExpTime, newExpTime)) {
6654 LOGD("update exposure time: old: %s, new: %s", prevExpTime, newExpTime);
6655 set(KEY_QC_CURRENT_EXPOSURE_TIME, newExpTime);
6656 }
6657
6658 int32_t prevISO = getInt(KEY_QC_CURRENT_ISO);
6659 int32_t newISO = ae_params.iso_value;
6660 if (prevISO != newISO) {
6661 LOGD("update iso: old:%d, new:%d", prevISO, newISO);
6662 set(KEY_QC_CURRENT_ISO, newISO);
6663 }
6664 }
6665
6666 /*===========================================================================
6667 * FUNCTION : updateCurrentFocusPosition
6668 *
6669 * DESCRIPTION: update current focus position from metadata callback
6670 *
6671 * PARAMETERS :
6672 * @pos : current focus position
6673 *
6674 * RETURN : void
6675 *==========================================================================*/
updateCurrentFocusPosition(cam_focus_pos_info_t & cur_pos_info)6676 void QCameraParameters::updateCurrentFocusPosition(cam_focus_pos_info_t &cur_pos_info)
6677 {
6678 int prevScalePos = getInt(KEY_QC_FOCUS_POSITION_SCALE);
6679 int newScalePos = (int) cur_pos_info.scale;
6680 if (prevScalePos != newScalePos) {
6681 LOGD("update focus scale: old:%d, new:%d", prevScalePos, newScalePos);
6682 set(KEY_QC_FOCUS_POSITION_SCALE, newScalePos);
6683 }
6684
6685 float prevDiopterPos = getFloat(KEY_QC_FOCUS_POSITION_DIOPTER);
6686 float newDiopterPos = cur_pos_info.diopter;
6687 if (prevDiopterPos != newDiopterPos) {
6688 LOGD("update focus diopter: old:%f, new:%f", prevDiopterPos, newDiopterPos);
6689 setFloat(KEY_QC_FOCUS_POSITION_DIOPTER, newDiopterPos);
6690 }
6691 }
6692
6693 /*===========================================================================
6694 * FUNCTION : setSharpness
6695 *
6696 * DESCRIPTION: set sharpness control value
6697 *
6698 * PARAMETERS :
6699 * @sharpness : sharpness control value
6700 *
6701 * RETURN : int32_t type of status
6702 * NO_ERROR -- success
6703 * none-zero failure code
6704 *==========================================================================*/
setSharpness(int sharpness)6705 int32_t QCameraParameters::setSharpness(int sharpness)
6706 {
6707 char val[16];
6708 snprintf(val, sizeof(val), "%d", sharpness);
6709 updateParamEntry(KEY_QC_SHARPNESS, val);
6710 LOGH("Setting sharpness %s", val);
6711 m_nSharpness = sharpness;
6712 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SHARPNESS, m_nSharpness)) {
6713 return BAD_VALUE;
6714 }
6715
6716 return NO_ERROR;
6717 }
6718
6719 /*===========================================================================
6720 * FUNCTION : setSkinToneEnhancement
6721 *
6722 * DESCRIPTION: set skin tone enhancement value
6723 *
6724 * PARAMETERS :
6725 * @sceFactore : skin tone enhancement factor value
6726 *
6727 * RETURN : int32_t type of status
6728 * NO_ERROR -- success
6729 * none-zero failure code
6730 *==========================================================================*/
setSkinToneEnhancement(int sceFactor)6731 int32_t QCameraParameters::setSkinToneEnhancement(int sceFactor)
6732 {
6733 char val[16];
6734 snprintf(val, sizeof(val), "%d", sceFactor);
6735 updateParamEntry(KEY_QC_SCE_FACTOR, val);
6736 LOGH("Setting skintone enhancement %s", val);
6737
6738 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SCE_FACTOR, sceFactor)) {
6739 return BAD_VALUE;
6740 }
6741
6742 return NO_ERROR;
6743 }
6744
6745 /*===========================================================================
6746 * FUNCTION : setSaturation
6747 *
6748 * DESCRIPTION: set saturation control value
6749 *
6750 * PARAMETERS :
6751 * @saturation : saturation control value
6752 *
6753 * RETURN : int32_t type of status
6754 * NO_ERROR -- success
6755 * none-zero failure code
6756 *==========================================================================*/
setSaturation(int saturation)6757 int32_t QCameraParameters::setSaturation(int saturation)
6758 {
6759 char val[16];
6760 snprintf(val, sizeof(val), "%d", saturation);
6761 updateParamEntry(KEY_QC_SATURATION, val);
6762 LOGH("Setting saturation %s", val);
6763
6764 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SATURATION, saturation)) {
6765 return BAD_VALUE;
6766 }
6767
6768 return NO_ERROR;
6769 }
6770
6771 /*===========================================================================
6772 * FUNCTION : setContrast
6773 *
6774 * DESCRIPTION: set contrast control value
6775 *
6776 * PARAMETERS :
6777 * @contrast : contrast control value
6778 *
6779 * RETURN : int32_t type of status
6780 * NO_ERROR -- success
6781 * none-zero failure code
6782 *==========================================================================*/
setContrast(int contrast)6783 int32_t QCameraParameters::setContrast(int contrast)
6784 {
6785 char val[16];
6786 snprintf(val, sizeof(val), "%d", contrast);
6787 updateParamEntry(KEY_QC_CONTRAST, val);
6788 LOGH("Setting contrast %s", val);
6789
6790 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CONTRAST, contrast)) {
6791 return BAD_VALUE;
6792 }
6793
6794 return NO_ERROR;
6795 }
6796
6797 /*===========================================================================
6798 * FUNCTION : setSceneDetect
6799 *
6800 * DESCRIPTION: set scenen detect value
6801 *
6802 * PARAMETERS :
6803 * @sceneDetect : scene detect value string
6804 *
6805 * RETURN : int32_t type of status
6806 * NO_ERROR -- success
6807 * none-zero failure code
6808 *==========================================================================*/
setSceneDetect(const char * sceneDetect)6809 int32_t QCameraParameters::setSceneDetect(const char *sceneDetect)
6810 {
6811 if (sceneDetect != NULL) {
6812 int32_t value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP),
6813 sceneDetect);
6814 if (value != NAME_NOT_FOUND) {
6815 LOGH("Setting Scene Detect %s", sceneDetect);
6816 updateParamEntry(KEY_QC_SCENE_DETECT, sceneDetect);
6817 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ASD_ENABLE, value)) {
6818 return BAD_VALUE;
6819 }
6820 return NO_ERROR;
6821 }
6822 }
6823 LOGE("Invalid Scene Detect value: %s",
6824 (sceneDetect == NULL) ? "NULL" : sceneDetect);
6825 return BAD_VALUE;
6826 }
6827
6828 /*===========================================================================
6829 * FUNCTION : setSensorSnapshotHDR
6830 *
6831 * DESCRIPTION: set snapshot HDR value
6832 *
6833 * PARAMETERS :
6834 * @snapshotHDR : snapshot HDR value string
6835 *
6836 * RETURN : int32_t type of status
6837 * NO_ERROR -- success
6838 * none-zero failure code
6839 *==========================================================================*/
setSensorSnapshotHDR(const char * snapshotHDR)6840 int32_t QCameraParameters::setSensorSnapshotHDR(const char *snapshotHDR)
6841 {
6842 if (snapshotHDR != NULL) {
6843 int32_t value = (cam_sensor_hdr_type_t) lookupAttr(ON_OFF_MODES_MAP,
6844 PARAM_MAP_SIZE(ON_OFF_MODES_MAP), snapshotHDR);
6845 if (value != NAME_NOT_FOUND) {
6846 LOGH("Setting Sensor Snapshot HDR %s", snapshotHDR);
6847 updateParamEntry(KEY_QC_SENSOR_HDR, snapshotHDR);
6848
6849 char zz_prop[PROPERTY_VALUE_MAX];
6850 memset(zz_prop, 0, sizeof(zz_prop));
6851 property_get("persist.camera.zzhdr.enable", zz_prop, "0");
6852 uint8_t zzhdr_enable = (uint8_t)atoi(zz_prop);
6853
6854 if (zzhdr_enable && (value != CAM_SENSOR_HDR_OFF)) {
6855 value = CAM_SENSOR_HDR_ZIGZAG;
6856 LOGH("%s: Overriding to ZZ HDR Mode", __func__);
6857 }
6858
6859 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SENSOR_HDR, (cam_sensor_hdr_type_t)value)) {
6860 return BAD_VALUE;
6861 }
6862 return NO_ERROR;
6863 }
6864 }
6865 LOGE("Invalid Snapshot HDR value: %s",
6866 (snapshotHDR == NULL) ? "NULL" : snapshotHDR);
6867 return BAD_VALUE;
6868
6869 }
6870
6871
6872 /*===========================================================================
6873 * FUNCTION : setVideoHDR
6874 *
6875 * DESCRIPTION: set video HDR value
6876 *
6877 * PARAMETERS :
6878 * @videoHDR : svideo HDR value string
6879 *
6880 * RETURN : int32_t type of status
6881 * NO_ERROR -- success
6882 * none-zero failure code
6883 *==========================================================================*/
setVideoHDR(const char * videoHDR)6884 int32_t QCameraParameters::setVideoHDR(const char *videoHDR)
6885 {
6886 if (videoHDR != NULL) {
6887 int32_t value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP), videoHDR);
6888 if (value != NAME_NOT_FOUND) {
6889
6890 char zz_prop[PROPERTY_VALUE_MAX];
6891 memset(zz_prop, 0, sizeof(zz_prop));
6892 property_get("persist.camera.zzhdr.video", zz_prop, "0");
6893 uint8_t use_zzhdr_video = (uint8_t)atoi(zz_prop);
6894
6895 if (use_zzhdr_video) {
6896 LOGH("%s: Using ZZ HDR for video mode", __func__);
6897 if (value)
6898 value = CAM_SENSOR_HDR_ZIGZAG;
6899 else
6900 value = CAM_SENSOR_HDR_OFF;
6901 LOGH("%s: Overriding to sensor HDR Mode to:%d", __func__, value);
6902 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SENSOR_HDR, (cam_sensor_hdr_type_t) value)) {
6903 LOGE("%s: Override to sensor HDR mode for video HDR failed", __func__);
6904 return BAD_VALUE;
6905 }
6906 updateParamEntry(KEY_QC_VIDEO_HDR, videoHDR);
6907 } else {
6908 LOGH("%s: Setting Video HDR %s", __func__, videoHDR);
6909 updateParamEntry(KEY_QC_VIDEO_HDR, videoHDR);
6910 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_VIDEO_HDR, value)) {
6911 return BAD_VALUE;
6912 }
6913 }
6914
6915 return NO_ERROR;
6916 }
6917 }
6918 LOGE("Invalid Video HDR value: %s",
6919 (videoHDR == NULL) ? "NULL" : videoHDR);
6920 return BAD_VALUE;
6921 }
6922
6923
6924
6925 /*===========================================================================
6926 * FUNCTION : setVtEnable
6927 *
6928 * DESCRIPTION: set vt Enable value
6929 *
6930 * PARAMETERS :
6931 * @videoHDR : svtEnable value string
6932 *
6933 * RETURN : int32_t type of status
6934 * NO_ERROR -- success
6935 * none-zero failure code
6936 *==========================================================================*/
setVtEnable(const char * vtEnable)6937 int32_t QCameraParameters::setVtEnable(const char *vtEnable)
6938 {
6939 if (vtEnable != NULL) {
6940 int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
6941 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), vtEnable);
6942 if (value != NAME_NOT_FOUND) {
6943 LOGH("Setting Vt Enable %s", vtEnable);
6944 m_bAVTimerEnabled = true;
6945 updateParamEntry(KEY_QC_VT_ENABLE, vtEnable);
6946 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_VT, value)) {
6947 return BAD_VALUE;
6948 }
6949 return NO_ERROR;
6950 }
6951 }
6952 LOGE("Invalid Vt Enable value: %s",
6953 (vtEnable == NULL) ? "NULL" : vtEnable);
6954 m_bAVTimerEnabled = false;
6955 return BAD_VALUE;
6956 }
6957
6958 /*===========================================================================
6959 * FUNCTION : setFaceRecognition
6960 *
6961 * DESCRIPTION: set face recognition value
6962 *
6963 * PARAMETERS :
6964 * @faceRecog : face recognition value string
6965 * @maxFaces : number of max faces to be detected/recognized
6966 *
6967 * RETURN : int32_t type of status
6968 * NO_ERROR -- success
6969 * none-zero failure code
6970 *==========================================================================*/
setFaceRecognition(const char * faceRecog,uint32_t maxFaces)6971 int32_t QCameraParameters::setFaceRecognition(const char *faceRecog,
6972 uint32_t maxFaces)
6973 {
6974 if (faceRecog != NULL) {
6975 int32_t value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP), faceRecog);
6976 if (value != NAME_NOT_FOUND) {
6977 LOGH("Setting face recognition %s", faceRecog);
6978 updateParamEntry(KEY_QC_FACE_RECOGNITION, faceRecog);
6979
6980 uint32_t faceProcMask = m_nFaceProcMask;
6981 if (value > 0) {
6982 faceProcMask |= CAM_FACE_PROCESS_MASK_RECOGNITION;
6983 } else {
6984 faceProcMask &= (uint32_t)(~CAM_FACE_PROCESS_MASK_RECOGNITION);
6985 }
6986
6987 if(m_nFaceProcMask == faceProcMask) {
6988 LOGH("face process mask not changed, no ops here");
6989 return NO_ERROR;
6990 }
6991 m_nFaceProcMask = faceProcMask;
6992 LOGH("FaceProcMask -> %d", m_nFaceProcMask);
6993
6994 // set parm for face process
6995 cam_fd_set_parm_t fd_set_parm;
6996 memset(&fd_set_parm, 0, sizeof(cam_fd_set_parm_t));
6997 fd_set_parm.fd_mode = m_nFaceProcMask;
6998 fd_set_parm.num_fd = maxFaces;
6999
7000 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FD, fd_set_parm)) {
7001 return BAD_VALUE;
7002 }
7003 return NO_ERROR;
7004 }
7005 }
7006 LOGE("Invalid face recognition value: %s", (faceRecog == NULL) ? "NULL" : faceRecog);
7007 return BAD_VALUE;
7008 }
7009
7010 /*===========================================================================
7011 * FUNCTION : setZoom
7012 *
7013 * DESCRIPTION: set zoom level
7014 *
7015 * PARAMETERS :
7016 * @zoom_level : zoom level
7017 *
7018 * RETURN : int32_t type of status
7019 * NO_ERROR -- success
7020 * none-zero failure code
7021 *==========================================================================*/
setZoom(int zoom_level)7022 int32_t QCameraParameters::setZoom(int zoom_level)
7023 {
7024 char val[16];
7025 snprintf(val, sizeof(val), "%d", zoom_level);
7026 updateParamEntry(KEY_ZOOM, val);
7027 LOGH("zoom level: %d", zoom_level);
7028 mZoomLevel = zoom_level;
7029 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ZOOM, zoom_level)) {
7030 return BAD_VALUE;
7031 }
7032
7033 return NO_ERROR;
7034 }
7035
7036 /*===========================================================================
7037 * FUNCTION : setISOValue
7038 *
7039 * DESCRIPTION: set ISO value
7040 *
7041 * PARAMETERS :
7042 * @isoValue : ISO value string
7043 *
7044 * RETURN : int32_t type of status
7045 * NO_ERROR -- success
7046 * none-zero failure code
7047 *==========================================================================*/
setISOValue(const char * isoValue)7048 int32_t QCameraParameters::setISOValue(const char *isoValue)
7049 {
7050 if (isoValue != NULL) {
7051 if (!strcmp(isoValue, ISO_MANUAL)) {
7052 LOGD("iso manual mode - use continuous iso");
7053 updateParamEntry(KEY_QC_ISO_MODE, isoValue);
7054 return NO_ERROR;
7055 }
7056 int32_t value = lookupAttr(ISO_MODES_MAP, PARAM_MAP_SIZE(ISO_MODES_MAP), isoValue);
7057 if (value != NAME_NOT_FOUND) {
7058 LOGH("Setting ISO value %s", isoValue);
7059 updateParamEntry(KEY_QC_ISO_MODE, isoValue);
7060
7061 cam_intf_parm_manual_3a_t iso_settings;
7062 memset(&iso_settings, 0, sizeof(cam_intf_parm_manual_3a_t));
7063 iso_settings.previewOnly = FALSE;
7064 iso_settings.value = value;
7065 if (getManualCaptureMode() != CAM_MANUAL_CAPTURE_TYPE_OFF) {
7066 iso_settings.previewOnly = TRUE;
7067 }
7068
7069 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ISO, iso_settings)) {
7070 return BAD_VALUE;
7071 }
7072 m_isoValue = value;
7073 return NO_ERROR;
7074 }
7075 }
7076 LOGE("Invalid ISO value: %s",
7077 (isoValue == NULL) ? "NULL" : isoValue);
7078 return BAD_VALUE;
7079 }
7080
7081
7082 /*===========================================================================
7083 * FUNCTION : setContinuousISO
7084 *
7085 * DESCRIPTION: set continuous ISO value
7086 *
7087 * PARAMETERS :
7088 * @params : ISO value parameter
7089 *
7090 * RETURN : int32_t type of status
7091 * NO_ERROR -- success
7092 * none-zero failure code
7093 *==========================================================================*/
setContinuousISO(const QCameraParameters & params)7094 int32_t QCameraParameters::setContinuousISO(const QCameraParameters& params)
7095 {
7096 const char *iso = params.get(KEY_QC_ISO_MODE);
7097 LOGD("current iso mode: %s", iso);
7098
7099 if (iso != NULL) {
7100 if (strcmp(iso, ISO_MANUAL)) {
7101 LOGD("dont set iso to back-end.");
7102 return NO_ERROR;
7103 }
7104 }
7105
7106 const char *str = params.get(KEY_QC_CONTINUOUS_ISO);
7107 const char *prev_str = get(KEY_QC_CONTINUOUS_ISO);
7108 if (str != NULL) {
7109 if (prev_str == NULL ||
7110 strcmp(str, prev_str) != 0) {
7111 return setContinuousISO(str);
7112 }
7113 }
7114 return NO_ERROR;
7115 }
7116
7117 /*===========================================================================
7118 * FUNCTION : setExposureTime
7119 *
7120 * DESCRIPTION: set exposure time
7121 *
7122 * PARAMETERS :
7123 * @expTimeStr : string of exposure time in ms
7124 *
7125 * RETURN : int32_t type of status
7126 * NO_ERROR -- success
7127 * none-zero failure code
7128 *==========================================================================*/
setExposureTime(const char * expTimeStr)7129 int32_t QCameraParameters::setExposureTime(const char *expTimeStr)
7130 {
7131 if (expTimeStr != NULL) {
7132 double expTimeMs = atof(expTimeStr);
7133 //input is in milli seconds. Convert to nano sec for backend
7134 int64_t expTimeNs = (int64_t)(expTimeMs*1000000L);
7135
7136 // expTime == 0 means not to use manual exposure time.
7137 if ((0 <= expTimeNs) &&
7138 ((expTimeNs == 0) ||
7139 ((expTimeNs >= m_pCapability->exposure_time_range[0]) &&
7140 (expTimeNs <= m_pCapability->exposure_time_range[1])))) {
7141 LOGH(", exposure time: %f ms", expTimeMs);
7142 updateParamEntry(KEY_QC_EXPOSURE_TIME, expTimeStr);
7143
7144 cam_intf_parm_manual_3a_t exp_settings;
7145 memset(&exp_settings, 0, sizeof(cam_intf_parm_manual_3a_t));
7146 if (getManualCaptureMode() != CAM_MANUAL_CAPTURE_TYPE_OFF) {
7147 exp_settings.previewOnly = TRUE;
7148 if (expTimeMs < QCAMERA_MAX_EXP_TIME_LEVEL1) {
7149 exp_settings.value = expTimeNs;
7150 } else {
7151 exp_settings.value =
7152 (int64_t)(QCAMERA_MAX_EXP_TIME_LEVEL1*1000000L);
7153 }
7154 } else {
7155 exp_settings.previewOnly = FALSE;
7156 exp_settings.value = expTimeNs;
7157 }
7158
7159 //Based on exposure values we can decide the capture type here
7160 if (getManualCaptureMode() != CAM_MANUAL_CAPTURE_TYPE_OFF) {
7161 if (expTimeMs < QCAMERA_MAX_EXP_TIME_LEVEL1) {
7162 setManualCaptureMode(CAM_MANUAL_CAPTURE_TYPE_1);
7163 } else if (expTimeMs < QCAMERA_MAX_EXP_TIME_LEVEL2) {
7164 setManualCaptureMode(CAM_MANUAL_CAPTURE_TYPE_2);
7165 } else if (expTimeMs < QCAMERA_MAX_EXP_TIME_LEVEL4) {
7166 setManualCaptureMode(CAM_MANUAL_CAPTURE_TYPE_3);
7167 } else {
7168 setManualCaptureMode(CAM_MANUAL_CAPTURE_TYPE_OFF);
7169 }
7170 }
7171
7172 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_EXPOSURE_TIME,
7173 exp_settings)) {
7174 return BAD_VALUE;
7175 }
7176 m_expTime = expTimeNs;
7177
7178 return NO_ERROR;
7179 }
7180 }
7181
7182 LOGE("Invalid exposure time, value: %s",
7183 (expTimeStr == NULL) ? "NULL" : expTimeStr);
7184 return BAD_VALUE;
7185 }
7186
7187 /*===========================================================================
7188 * FUNCTION : setLongshotEnable
7189 *
7190 * DESCRIPTION: set a flag indicating longshot mode
7191 *
7192 * PARAMETERS :
7193 * @enable : true - Longshot enabled
7194 * false - Longshot disabled
7195 *
7196 * RETURN : int32_t type of status
7197 * NO_ERROR -- success
7198 * none-zero failure code
7199 *==========================================================================*/
setLongshotEnable(bool enable)7200 int32_t QCameraParameters::setLongshotEnable(bool enable)
7201 {
7202 int32_t rc = NO_ERROR;
7203 int8_t value = enable ? 1 : 0;
7204
7205 if(initBatchUpdate(m_pParamBuf) < 0 ) {
7206 LOGE("Failed to initialize group update table");
7207 return BAD_TYPE;
7208 }
7209
7210 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_LONGSHOT_ENABLE, value)) {
7211 LOGE("Failed to update table");
7212 return BAD_VALUE;
7213 }
7214
7215 rc = commitSetBatch();
7216 if (rc != NO_ERROR) {
7217 LOGE("Failed to parameter changes");
7218 return rc;
7219 }
7220
7221 m_bLongshotEnabled = enable;
7222
7223 return rc;
7224 }
7225
7226 /*===========================================================================
7227 * FUNCTION : setFlash
7228 *
7229 * DESCRIPTION: set flash mode
7230 *
7231 * PARAMETERS :
7232 * @flashStr : LED flash mode value string
7233 *
7234 * RETURN : int32_t type of status
7235 * NO_ERROR -- success
7236 * none-zero failure code
7237 *==========================================================================*/
setFlash(const char * flashStr)7238 int32_t QCameraParameters::setFlash(const char *flashStr)
7239 {
7240 if (flashStr != NULL) {
7241 int32_t value = lookupAttr(FLASH_MODES_MAP, PARAM_MAP_SIZE(FLASH_MODES_MAP), flashStr);
7242 if (value != NAME_NOT_FOUND) {
7243 LOGH("Setting Flash value %s", flashStr);
7244 updateParamEntry(KEY_FLASH_MODE, flashStr);
7245 mFlashValue = value;
7246 return NO_ERROR;
7247 }
7248 }
7249 LOGE("Invalid flash value: %s", (flashStr == NULL) ? "NULL" : flashStr);
7250 return BAD_VALUE;
7251 }
7252
7253 /*===========================================================================
7254 * FUNCTION : updateFlashMode
7255 *
7256 * DESCRIPTION: update flash mode
7257 *
7258 * PARAMETERS :
7259 * @flashStr : LED flash mode value
7260 *
7261 * RETURN : int32_t type of status
7262 * NO_ERROR -- success
7263 * none-zero failure code
7264 *==========================================================================*/
updateFlashMode(cam_flash_mode_t flash_mode)7265 int32_t QCameraParameters::updateFlashMode(cam_flash_mode_t flash_mode)
7266 {
7267 int32_t rc = NO_ERROR;
7268 if (flash_mode >= CAM_FLASH_MODE_MAX) {
7269 LOGH("Error!! Invalid flash mode (%d)", flash_mode);
7270 return BAD_VALUE;
7271 }
7272 LOGH("Setting Flash mode from EZTune %d", flash_mode);
7273
7274 const char *flash_mode_str = lookupNameByValue(FLASH_MODES_MAP,
7275 PARAM_MAP_SIZE(FLASH_MODES_MAP), flash_mode);
7276 if(initBatchUpdate(m_pParamBuf) < 0 ) {
7277 LOGE("Failed to initialize group update table");
7278 return BAD_TYPE;
7279 }
7280 rc = setFlash(flash_mode_str);
7281 if (rc != NO_ERROR) {
7282 LOGE("Failed to update Flash mode");
7283 return rc;
7284 }
7285
7286 LOGH("Setting Flash mode %d", mFlashValue);
7287 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_LED_MODE, mFlashValue)) {
7288 LOGE("Failed to set led mode");
7289 return BAD_VALUE;
7290 }
7291
7292 rc = commitSetBatch();
7293 if (rc != NO_ERROR) {
7294 LOGE("Failed to commit parameters");
7295 return rc;
7296 }
7297
7298 return NO_ERROR;
7299 }
7300
7301
7302 /*===========================================================================
7303 * FUNCTION : configureFlash
7304 *
7305 * DESCRIPTION: configure Flash Bracketing.
7306 *
7307 * PARAMETERS :
7308 * @frame_config : output configuration structure to fill in.
7309 *
7310 * RETURN : int32_t type of status
7311 * NO_ERROR -- success
7312 * none-zero failure code
7313 *==========================================================================*/
configureFlash(cam_capture_frame_config_t & frame_config)7314 int32_t QCameraParameters::configureFlash(cam_capture_frame_config_t &frame_config)
7315 {
7316 LOGH("E");
7317 int32_t rc = NO_ERROR;
7318 uint32_t i = 0;
7319
7320 if (isChromaFlashEnabled()) {
7321
7322 rc = setToneMapMode(false, false);
7323 if (rc != NO_ERROR) {
7324 LOGE("Failed to configure tone map");
7325 return rc;
7326 }
7327
7328 rc = setCDSMode(CAM_CDS_MODE_OFF, false);
7329 if (rc != NO_ERROR) {
7330 LOGE("Failed to configure csd mode");
7331 return rc;
7332 }
7333
7334 LOGH("Enable Chroma Flash capture");
7335 cam_flash_mode_t flash_mode = CAM_FLASH_MODE_OFF;
7336 frame_config.num_batch =
7337 m_pCapability->chroma_flash_settings_need.burst_count;
7338 if (frame_config.num_batch > CAM_MAX_FLASH_BRACKETING) {
7339 frame_config.num_batch = CAM_MAX_FLASH_BRACKETING;
7340 }
7341 for (i = 0; i < frame_config.num_batch; i++) {
7342 flash_mode = (m_pCapability->chroma_flash_settings_need.flash_bracketing[i]) ?
7343 CAM_FLASH_MODE_ON:CAM_FLASH_MODE_OFF;
7344 frame_config.configs[i].num_frames = 1;
7345 frame_config.configs[i].type = CAM_CAPTURE_FLASH;
7346 frame_config.configs[i].flash_mode = flash_mode;
7347 }
7348 } else if (mFlashValue != CAM_FLASH_MODE_OFF) {
7349 frame_config.num_batch = 1;
7350 for (i = 0; i < frame_config.num_batch; i++) {
7351 frame_config.configs[i].num_frames = getNumOfSnapshots();
7352 frame_config.configs[i].type = CAM_CAPTURE_FLASH;
7353 frame_config.configs[i].flash_mode =(cam_flash_mode_t)mFlashValue;
7354 }
7355 }
7356
7357 LOGD("Flash frame batch cnt = %d",frame_config.num_batch);
7358 return rc;
7359 }
7360
7361 /*===========================================================================
7362 * FUNCTION : configureHDRBracketing
7363 *
7364 * DESCRIPTION: configure HDR Bracketing.
7365 *
7366 * PARAMETERS :
7367 * @frame_config : output configuration structure to fill in.
7368 *
7369 * RETURN : int32_t type of status
7370 * NO_ERROR -- success
7371 * none-zero failure code
7372 *==========================================================================*/
configureHDRBracketing(cam_capture_frame_config_t & frame_config)7373 int32_t QCameraParameters::configureHDRBracketing(cam_capture_frame_config_t &frame_config)
7374 {
7375 LOGH("E");
7376 int32_t rc = NO_ERROR;
7377 uint32_t i = 0;
7378
7379 uint32_t hdrFrameCount = m_pCapability->hdr_bracketing_setting.num_frames;
7380 LOGH("HDR values %d, %d frame count: %u",
7381 (int8_t) m_pCapability->hdr_bracketing_setting.exp_val.values[0],
7382 (int8_t) m_pCapability->hdr_bracketing_setting.exp_val.values[1],
7383 hdrFrameCount);
7384
7385 frame_config.num_batch = hdrFrameCount;
7386
7387 cam_bracket_mode mode =
7388 m_pCapability->hdr_bracketing_setting.exp_val.mode;
7389 if (mode == CAM_EXP_BRACKETING_ON) {
7390 rc = setToneMapMode(false, true);
7391 if (rc != NO_ERROR) {
7392 LOGW("Failed to disable tone map during HDR");
7393 }
7394 }
7395 for (i = 0; i < frame_config.num_batch; i++) {
7396 frame_config.configs[i].num_frames = 1;
7397 frame_config.configs[i].type = CAM_CAPTURE_BRACKETING;
7398 frame_config.configs[i].hdr_mode.mode = mode;
7399 frame_config.configs[i].hdr_mode.values =
7400 m_pCapability->hdr_bracketing_setting.exp_val.values[i];
7401 LOGD("exp values %d",
7402 (int)frame_config.configs[i].hdr_mode.values);
7403 }
7404 return rc;
7405 }
7406
7407 /*===========================================================================
7408 * FUNCTION : configureAEBracketing
7409 *
7410 * DESCRIPTION: configure AE Bracketing.
7411 *
7412 * PARAMETERS :
7413 * @frame_config : output configuration structure to fill in.
7414 *
7415 * RETURN : int32_t type of status
7416 * NO_ERROR -- success
7417 * none-zero failure code
7418 *==========================================================================*/
configureAEBracketing(cam_capture_frame_config_t & frame_config)7419 int32_t QCameraParameters::configureAEBracketing(cam_capture_frame_config_t &frame_config)
7420 {
7421 LOGH("E");
7422 int32_t rc = NO_ERROR;
7423 uint32_t i = 0;
7424 char exp_value[MAX_EXP_BRACKETING_LENGTH];
7425
7426 rc = setToneMapMode(false, true);
7427 if (rc != NO_ERROR) {
7428 LOGH("Failed to disable tone map during AEBracketing");
7429 }
7430
7431 uint32_t burstCount = 0;
7432 const char *str_val = m_AEBracketingClient.values;
7433 if ((str_val != NULL) && (strlen(str_val) > 0)) {
7434 char prop[PROPERTY_VALUE_MAX];
7435 memset(prop, 0, sizeof(prop));
7436 strlcpy(prop, str_val, PROPERTY_VALUE_MAX);
7437 char *saveptr = NULL;
7438 char *token = strtok_r(prop, ",", &saveptr);
7439 if (token != NULL) {
7440 exp_value[burstCount++] = (char)atoi(token);
7441 while (token != NULL) {
7442 token = strtok_r(NULL, ",", &saveptr);
7443 if (token != NULL) {
7444 exp_value[burstCount++] = (char)atoi(token);
7445 }
7446 }
7447 }
7448 }
7449
7450 frame_config.num_batch = burstCount;
7451 cam_bracket_mode mode = m_AEBracketingClient.mode;
7452
7453 for (i = 0; i < frame_config.num_batch; i++) {
7454 frame_config.configs[i].num_frames = 1;
7455 frame_config.configs[i].type = CAM_CAPTURE_BRACKETING;
7456 frame_config.configs[i].hdr_mode.mode = mode;
7457 frame_config.configs[i].hdr_mode.values =
7458 m_AEBracketingClient.values[i];
7459 LOGD("exp values %d", (int)m_AEBracketingClient.values[i]);
7460 }
7461
7462 LOGH("num_frame = %d X", burstCount);
7463 return rc;
7464 }
7465
7466 /*===========================================================================
7467 * FUNCTION : configureLowLight
7468 *
7469 * DESCRIPTION: configure low light frame capture use case.
7470 *
7471 * PARAMETERS :
7472 * @frame_config : output configuration structure to fill in.
7473 *
7474 * RETURN : int32_t type of status
7475 * NO_ERROR -- success
7476 * none-zero failure code
7477 *==========================================================================*/
configureLowLight(cam_capture_frame_config_t & frame_config)7478 int32_t QCameraParameters::configureLowLight(cam_capture_frame_config_t &frame_config)
7479 {
7480 int32_t rc = NO_ERROR;
7481
7482 frame_config.num_batch = 1;
7483 frame_config.configs[0].num_frames = getNumOfSnapshots();
7484 frame_config.configs[0].type = CAM_CAPTURE_LOW_LIGHT;
7485 frame_config.configs[0].low_light_mode = CAM_LOW_LIGHT_ON;
7486 LOGH("Snapshot Count: %d", frame_config.configs[0].num_frames);
7487 return rc;
7488 }
7489
7490 /*===========================================================================
7491 * FUNCTION : configureManualCapture
7492 *
7493 * DESCRIPTION: configure manual capture.
7494 *
7495 * PARAMETERS :
7496 * @frame_config : output configaration structure to fill in.
7497 *
7498 * RETURN : int32_t type of status
7499 * NO_ERROR -- success
7500 * none-zero failure code
7501 *==========================================================================*/
configureManualCapture(cam_capture_frame_config_t & frame_config)7502 int32_t QCameraParameters::configureManualCapture(cam_capture_frame_config_t &frame_config)
7503 {
7504 int32_t rc = NO_ERROR;
7505 uint32_t i = 0;
7506
7507 LOGD("E");
7508 if (getManualCaptureMode()) {
7509 frame_config.num_batch = 1;
7510 for (i = 0; i < frame_config.num_batch; i++) {
7511 frame_config.configs[i].num_frames = getNumOfSnapshots();
7512 frame_config.configs[i].type = CAM_CAPTURE_MANUAL_3A;
7513 if (m_expTime != 0) {
7514 frame_config.configs[i].manual_3A_mode.exp_mode = CAM_SETTINGS_TYPE_ON;
7515 frame_config.configs[i].manual_3A_mode.exp_time = m_expTime;
7516 } else {
7517 frame_config.configs[i].manual_3A_mode.exp_mode = CAM_SETTINGS_TYPE_AUTO;
7518 frame_config.configs[i].manual_3A_mode.exp_time = 0;
7519 }
7520
7521 if (m_isoValue != 0) {
7522 frame_config.configs[i].manual_3A_mode.iso_mode = CAM_SETTINGS_TYPE_ON;
7523 frame_config.configs[i].manual_3A_mode.iso_value = m_isoValue;
7524 } else {
7525 frame_config.configs[i].manual_3A_mode.iso_mode = CAM_SETTINGS_TYPE_AUTO;
7526 frame_config.configs[i].manual_3A_mode.iso_value = 0;
7527 }
7528 }
7529 }
7530 LOGD("X: batch cnt = %d", frame_config.num_batch);
7531 return rc;
7532 }
7533
7534 /*===========================================================================
7535 * FUNCTION : configFrameCapture
7536 *
7537 * DESCRIPTION: configuration for ZSL special captures (FLASH/HDR etc)
7538 *
7539 * PARAMETERS :
7540 * @commitSettings : flag to enable or disable commit this this settings
7541 *
7542 * RETURN : int32_t type of status
7543 * NO_ERROR -- success
7544 * none-zero failure code
7545 *==========================================================================*/
configFrameCapture(bool commitSettings)7546 int32_t QCameraParameters::configFrameCapture(bool commitSettings)
7547 {
7548 int32_t rc = NO_ERROR;
7549 int32_t value;
7550
7551 memset(&m_captureFrameConfig, 0, sizeof(cam_capture_frame_config_t));
7552
7553 if (commitSettings) {
7554 if(initBatchUpdate(m_pParamBuf) < 0 ) {
7555 LOGE("Failed to initialize group update table");
7556 return BAD_TYPE;
7557 }
7558 }
7559
7560 if (isHDREnabled() || m_bAeBracketingEnabled || m_bAFBracketingOn ||
7561 m_bOptiZoomOn || m_bReFocusOn || m_LowLightLevel
7562 || getManualCaptureMode()) {
7563 value = CAM_FLASH_MODE_OFF;
7564 } else if (isChromaFlashEnabled()) {
7565 value = CAM_FLASH_MODE_ON;
7566 } else {
7567 value = mFlashValue;
7568 }
7569
7570 if (value != CAM_FLASH_MODE_OFF) {
7571 configureFlash(m_captureFrameConfig);
7572 } else if(isHDREnabled()) {
7573 configureHDRBracketing (m_captureFrameConfig);
7574 } else if(isAEBracketEnabled()) {
7575 configureAEBracketing (m_captureFrameConfig);
7576 } else if (m_LowLightLevel) {
7577 configureLowLight (m_captureFrameConfig);
7578
7579 //Added reset capture type as a last batch for back-end to restore settings.
7580 int32_t batch_count = m_captureFrameConfig.num_batch;
7581 m_captureFrameConfig.configs[batch_count].type = CAM_CAPTURE_RESET;
7582 m_captureFrameConfig.configs[batch_count].num_frames = 0;
7583 m_captureFrameConfig.num_batch++;
7584 } else if (getManualCaptureMode() >= CAM_MANUAL_CAPTURE_TYPE_2){
7585 rc = configureManualCapture (m_captureFrameConfig);
7586 //Added reset capture type as a last batch for back-end to restore settings.
7587 int32_t batch_count = m_captureFrameConfig.num_batch;
7588 m_captureFrameConfig.configs[batch_count].type = CAM_CAPTURE_RESET;
7589 m_captureFrameConfig.configs[batch_count].num_frames = 0;
7590 m_captureFrameConfig.num_batch++;
7591 }
7592
7593 rc = ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CAPTURE_FRAME_CONFIG,
7594 (cam_capture_frame_config_t)m_captureFrameConfig);
7595 if (rc != NO_ERROR) {
7596 rc = BAD_VALUE;
7597 LOGE("Failed to set capture settings");
7598 return rc;
7599 }
7600
7601 if (commitSettings) {
7602 rc = commitSetBatch();
7603 if (rc != NO_ERROR) {
7604 LOGE("Failed to commit parameters");
7605 return rc;
7606 }
7607 }
7608 return rc;
7609 }
7610
7611 /*===========================================================================
7612 * FUNCTION : resetFrameCapture
7613 *
7614 * DESCRIPTION: reset special captures settings(FLASH/HDR etc)
7615 *
7616 * PARAMETERS :
7617 * @commitSettings : flag to enable or disable commit this this settings
7618 *
7619 * RETURN : int32_t type of status
7620 * NO_ERROR -- success
7621 * none-zero failure code
7622 *==========================================================================*/
resetFrameCapture(bool commitSettings)7623 int32_t QCameraParameters::resetFrameCapture(bool commitSettings)
7624 {
7625 int32_t rc = NO_ERROR;
7626 memset(&m_captureFrameConfig, 0, sizeof(cam_capture_frame_config_t));
7627
7628 if (commitSettings) {
7629 if(initBatchUpdate(m_pParamBuf) < 0 ) {
7630 LOGE("Failed to initialize group update table");
7631 return BAD_TYPE;
7632 }
7633 }
7634
7635 if (isHDREnabled() || isAEBracketEnabled()) {
7636 rc = setToneMapMode(true, true);
7637 if (rc != NO_ERROR) {
7638 LOGH("Failed to enable tone map during HDR/AEBracketing");
7639 }
7640 rc = stopAEBracket();
7641 } else if ((isChromaFlashEnabled()) || (mFlashValue != CAM_FLASH_MODE_OFF)
7642 || (getLowLightLevel() != CAM_LOW_LIGHT_OFF)) {
7643 rc = setToneMapMode(true, false);
7644 if (rc != NO_ERROR) {
7645 LOGH("Failed to enable tone map during chroma flash");
7646 }
7647
7648 rc = setCDSMode(mCds_mode, false);
7649 if (rc != NO_ERROR) {
7650 LOGE("Failed to configure csd mode");
7651 return rc;
7652 }
7653 }
7654
7655 rc = ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CAPTURE_FRAME_CONFIG,
7656 (cam_capture_frame_config_t)m_captureFrameConfig);
7657 if (rc != NO_ERROR) {
7658 rc = BAD_VALUE;
7659 LOGE("Failed to set capture settings");
7660 return rc;
7661 }
7662
7663 if (commitSettings) {
7664 rc = commitSetBatch();
7665 if (rc != NO_ERROR) {
7666 LOGE("Failed to commit parameters");
7667 return rc;
7668 }
7669 }
7670 return rc;
7671 }
7672
7673 /*===========================================================================
7674 * FUNCTION : setAecLock
7675 *
7676 * DESCRIPTION: set AEC lock value
7677 *
7678 * PARAMETERS :
7679 * @aecLockStr : AEC lock value string
7680 *
7681 * RETURN : int32_t type of status
7682 * NO_ERROR -- success
7683 * none-zero failure code
7684 *==========================================================================*/
setAecLock(const char * aecLockStr)7685 int32_t QCameraParameters::setAecLock(const char *aecLockStr)
7686 {
7687 if (aecLockStr != NULL) {
7688 int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP, PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP),
7689 aecLockStr);
7690 if (value != NAME_NOT_FOUND) {
7691 LOGH("Setting AECLock value %s", aecLockStr);
7692 updateParamEntry(KEY_AUTO_EXPOSURE_LOCK, aecLockStr);
7693 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
7694 CAM_INTF_PARM_AEC_LOCK, (uint32_t)value)) {
7695 return BAD_VALUE;
7696 }
7697 return NO_ERROR;
7698 }
7699 }
7700 LOGE("Invalid AECLock value: %s",
7701 (aecLockStr == NULL) ? "NULL" : aecLockStr);
7702 return BAD_VALUE;
7703 }
7704
7705 /*===========================================================================
7706 * FUNCTION : setAwbLock
7707 *
7708 * DESCRIPTION: set AWB lock value
7709 *
7710 * PARAMETERS :
7711 * @awbLockStr : AWB lock value string
7712 *
7713 * RETURN : int32_t type of status
7714 * NO_ERROR -- success
7715 * none-zero failure code
7716 *==========================================================================*/
setAwbLock(const char * awbLockStr)7717 int32_t QCameraParameters::setAwbLock(const char *awbLockStr)
7718 {
7719 if (awbLockStr != NULL) {
7720 int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP, PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP),
7721 awbLockStr);
7722 if (value != NAME_NOT_FOUND) {
7723 LOGH("Setting AWBLock value %s", awbLockStr);
7724 updateParamEntry(KEY_AUTO_WHITEBALANCE_LOCK, awbLockStr);
7725 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
7726 CAM_INTF_PARM_AWB_LOCK, (uint32_t)value)) {
7727 return BAD_VALUE;
7728 }
7729 return NO_ERROR;
7730 }
7731 }
7732 LOGE("Invalid AWBLock value: %s", (awbLockStr == NULL) ? "NULL" : awbLockStr);
7733 return BAD_VALUE;
7734 }
7735
7736 /*===========================================================================
7737 * FUNCTION : setMCEValue
7738 *
7739 * DESCRIPTION: set memory color enhancement value
7740 *
7741 * PARAMETERS :
7742 * @mceStr : MCE value string
7743 *
7744 * RETURN : int32_t type of status
7745 * NO_ERROR -- success
7746 * none-zero failure code
7747 *==========================================================================*/
setMCEValue(const char * mceStr)7748 int32_t QCameraParameters::setMCEValue(const char *mceStr)
7749 {
7750 if (mceStr != NULL) {
7751 int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
7752 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), mceStr);
7753 if (value != NAME_NOT_FOUND) {
7754 LOGH("Setting AWBLock value %s", mceStr);
7755 updateParamEntry(KEY_QC_MEMORY_COLOR_ENHANCEMENT, mceStr);
7756 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_MCE, value)) {
7757 return BAD_VALUE;
7758 }
7759 return NO_ERROR;
7760 }
7761 }
7762 LOGE("Invalid MCE value: %s", (mceStr == NULL) ? "NULL" : mceStr);
7763 return BAD_VALUE;
7764 }
7765
7766 /*===========================================================================
7767 * FUNCTION : setTintlessValue
7768 *
7769 * DESCRIPTION: enable/disable tintless from user setting
7770 *
7771 * PARAMETERS :
7772 * @params : user setting parameters
7773 *
7774 * RETURN : int32_t type of status
7775 * NO_ERROR -- success
7776 * none-zero failure code
7777 *==========================================================================*/
setTintlessValue(const QCameraParameters & params)7778 int32_t QCameraParameters::setTintlessValue(const QCameraParameters& params)
7779 {
7780 const char *str = params.get(KEY_QC_TINTLESS_ENABLE);
7781 const char *prev_str = get(KEY_QC_TINTLESS_ENABLE);
7782 char prop[PROPERTY_VALUE_MAX];
7783
7784 memset(prop, 0, sizeof(prop));
7785 property_get("persist.camera.tintless", prop, VALUE_ENABLE);
7786 if (str != NULL) {
7787 if (prev_str == NULL ||
7788 strcmp(str, prev_str) != 0) {
7789 return setTintlessValue(str);
7790 }
7791 } else {
7792 if (prev_str == NULL ||
7793 strcmp(prev_str, prop) != 0 ) {
7794 setTintlessValue(prop);
7795 }
7796 }
7797
7798 return NO_ERROR;
7799 }
7800
7801 /*===========================================================================
7802 * FUNCTION : setTintless
7803 *
7804 * DESCRIPTION: set tintless mode
7805 *
7806 * PARAMETERS :
7807 * @enable : 1 = enable, 0 = disable
7808 *
7809 * RETURN : int32_t type of status
7810 * NO_ERROR -- success
7811 * none-zero failure code
7812 *==========================================================================*/
setTintless(bool enable)7813 void QCameraParameters::setTintless(bool enable)
7814 {
7815 if (enable) {
7816 setTintlessValue(VALUE_ENABLE);
7817 } else {
7818 setTintlessValue(VALUE_DISABLE);
7819 }
7820 }
7821
7822 /*===========================================================================
7823 * FUNCTION : setTintlessValue
7824 *
7825 * DESCRIPTION: set tintless value
7826 *
7827 * PARAMETERS :
7828 * @tintStr : Tintless value string
7829 *
7830 * RETURN : int32_t type of status
7831 * NO_ERROR -- success
7832 * none-zero failure code
7833 *==========================================================================*/
setTintlessValue(const char * tintStr)7834 int32_t QCameraParameters::setTintlessValue(const char *tintStr)
7835 {
7836 if (tintStr != NULL) {
7837 int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
7838 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), tintStr);
7839 if (value != NAME_NOT_FOUND) {
7840 LOGH("Setting Tintless value %s", tintStr);
7841 updateParamEntry(KEY_QC_TINTLESS_ENABLE, tintStr);
7842 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_TINTLESS, value)) {
7843 return BAD_VALUE;
7844 }
7845 return NO_ERROR;
7846 }
7847 }
7848 LOGE("Invalid Tintless value: %s", (tintStr == NULL) ? "NULL" : tintStr);
7849 return BAD_VALUE;
7850 }
7851
7852 /*===========================================================================
7853 * FUNCTION : setCDSMode
7854 *
7855 * DESCRIPTION: Set CDS mode
7856 *
7857 * PARAMETERS :
7858 * @params : user setting parameters
7859 *
7860 * RETURN : int32_t type of status
7861 * NO_ERROR -- success
7862 * none-zero failure code
7863 *==========================================================================*/
setCDSMode(const QCameraParameters & params)7864 int32_t QCameraParameters::setCDSMode(const QCameraParameters& params)
7865 {
7866 const char *str = params.get(KEY_QC_CDS_MODE);
7867 const char *prev_str = get(KEY_QC_CDS_MODE);
7868 const char *video_str = params.get(KEY_QC_VIDEO_CDS_MODE);
7869 const char *video_prev_str = get(KEY_QC_VIDEO_CDS_MODE);
7870 int32_t rc = NO_ERROR;
7871
7872 if (m_bRecordingHint_new == true) {
7873 if (video_str) {
7874 if ((video_prev_str == NULL) || (strcmp(video_str, video_prev_str) != 0)) {
7875 int32_t cds_mode = lookupAttr(CDS_MODES_MAP, PARAM_MAP_SIZE(CDS_MODES_MAP),
7876 video_str);
7877 if (cds_mode != NAME_NOT_FOUND) {
7878 updateParamEntry(KEY_QC_VIDEO_CDS_MODE, video_str);
7879 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
7880 LOGE("Failed CDS MODE to update table");
7881 rc = BAD_VALUE;
7882 } else {
7883 LOGD("Set CDS in video mode = %d", cds_mode);
7884 mCds_mode = cds_mode;
7885 m_bNeedRestart = true;
7886 }
7887 } else {
7888 LOGE("Invalid argument for video CDS MODE %d", cds_mode);
7889 rc = BAD_VALUE;
7890 }
7891 }
7892 } else {
7893 char video_prop[PROPERTY_VALUE_MAX];
7894 memset(video_prop, 0, sizeof(video_prop));
7895 property_get("persist.camera.video.CDS", video_prop, CDS_MODE_ON);
7896 int32_t cds_mode = lookupAttr(CDS_MODES_MAP, PARAM_MAP_SIZE(CDS_MODES_MAP),
7897 video_prop);
7898 if (cds_mode != NAME_NOT_FOUND) {
7899 updateParamEntry(KEY_QC_VIDEO_CDS_MODE, video_prop);
7900 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
7901 LOGE("Failed CDS MODE to update table");
7902 rc = BAD_VALUE;
7903 } else {
7904 LOGD("Set CDS in video mode from setprop = %d", cds_mode);
7905 mCds_mode = cds_mode;
7906 }
7907 } else {
7908 LOGE("Invalid prop for video CDS MODE %d", cds_mode);
7909 rc = BAD_VALUE;
7910 }
7911 }
7912 } else {
7913 if (str) {
7914 if ((prev_str == NULL) || (strcmp(str, prev_str) != 0)) {
7915 int32_t cds_mode = lookupAttr(CDS_MODES_MAP, PARAM_MAP_SIZE(CDS_MODES_MAP),
7916 str);
7917 if (cds_mode != NAME_NOT_FOUND) {
7918 updateParamEntry(KEY_QC_CDS_MODE, str);
7919 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
7920 LOGE("Failed CDS MODE to update table");
7921 rc = BAD_VALUE;
7922 } else {
7923 LOGD("Set CDS in capture mode = %d", cds_mode);
7924 mCds_mode = cds_mode;
7925 m_bNeedRestart = true;
7926 }
7927 } else {
7928 LOGE("Invalid argument for snapshot CDS MODE %d", cds_mode);
7929 rc = BAD_VALUE;
7930 }
7931 }
7932 } else {
7933 char prop[PROPERTY_VALUE_MAX];
7934 memset(prop, 0, sizeof(prop));
7935 property_get("persist.camera.CDS", prop, CDS_MODE_ON);
7936 int32_t cds_mode = lookupAttr(CDS_MODES_MAP, PARAM_MAP_SIZE(CDS_MODES_MAP),
7937 prop);
7938 if (cds_mode != NAME_NOT_FOUND) {
7939 updateParamEntry(KEY_QC_CDS_MODE, prop);
7940 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
7941 LOGE("Failed CDS MODE to update table");
7942 rc = BAD_VALUE;
7943 } else {
7944 LOGD("Set CDS in snapshot mode from setprop = %d", cds_mode);
7945 mCds_mode = cds_mode;
7946 }
7947 } else {
7948 LOGE("Invalid prop for snapshot CDS MODE %d", cds_mode);
7949 rc = BAD_VALUE;
7950 }
7951 }
7952 }
7953
7954 return rc;
7955 }
7956
7957 /*===========================================================================
7958 * FUNCTION : setInitialExposureIndex
7959 *
7960 * DESCRIPTION: Set initial exposure index value
7961 *
7962 * PARAMETERS :
7963 * @params : user setting parameters
7964 *
7965 * RETURN : int32_t type of status
7966 * NO_ERROR -- success
7967 * none-zero failure code
7968 *==========================================================================*/
setInitialExposureIndex(const QCameraParameters & params)7969 int32_t QCameraParameters::setInitialExposureIndex(const QCameraParameters& params)
7970 {
7971 int32_t rc = NO_ERROR;
7972 int value = -1;
7973 const char *str = params.get(KEY_QC_INITIAL_EXPOSURE_INDEX);
7974 const char *prev_str = get(KEY_QC_INITIAL_EXPOSURE_INDEX);
7975 if (str) {
7976 if ((prev_str == NULL) || (strcmp(str, prev_str) != 0)) {
7977 value = atoi(str);
7978 LOGD("Set initial exposure index value from param = %d", value);
7979 if (value >= 0) {
7980 updateParamEntry(KEY_QC_INITIAL_EXPOSURE_INDEX, str);
7981 }
7982 }
7983 } else {
7984 char prop[PROPERTY_VALUE_MAX];
7985 memset(prop, 0, sizeof(prop));
7986 property_get("persist.camera.initial.exp.val", prop, "");
7987 if ((strlen(prop) > 0) &&
7988 ( (prev_str == NULL) || (strcmp(prop, prev_str) != 0))) {
7989 value = atoi(prop);
7990 LOGD("Set initial exposure index value from setprop = %d", value);
7991 if (value >= 0) {
7992 updateParamEntry(KEY_QC_INITIAL_EXPOSURE_INDEX, prop);
7993 }
7994 }
7995 }
7996
7997 if (value >= 0) {
7998 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
7999 CAM_INTF_PARM_INITIAL_EXPOSURE_INDEX, (uint32_t)value)) {
8000 LOGE("Failed to update initial exposure index value");
8001 rc = BAD_VALUE;
8002 }
8003 } else {
8004 LOGD("Invalid value for initial exposure index value %d", value);
8005 }
8006
8007 return rc;
8008 }
8009
8010 /*===========================================================================
8011 * FUNCTION : setInstantCapture
8012 *
8013 * DESCRIPTION: Set Instant Capture related params
8014 *
8015 * PARAMETERS :
8016 * @params : user setting parameters
8017 *
8018 * RETURN : int32_t type of status
8019 * NO_ERROR -- success
8020 * none-zero failure code
8021 *==========================================================================*/
setInstantCapture(const QCameraParameters & params)8022 int32_t QCameraParameters::setInstantCapture(const QCameraParameters& params)
8023 {
8024 int32_t rc = NO_ERROR;
8025 int value = -1;
8026 // Check for instant capture, this will enable instant AEC as well.
8027 // This param will trigger the instant AEC param to backend
8028 // And also will be useful for instant capture.
8029 const char *str = params.get(KEY_QC_INSTANT_CAPTURE);
8030 const char *prev_str = get(KEY_QC_INSTANT_CAPTURE);
8031 if (str) {
8032 if ((prev_str == NULL) || (strcmp(str, prev_str) != 0)) {
8033 value = lookupAttr(INSTANT_CAPTURE_MODES_MAP,
8034 PARAM_MAP_SIZE(INSTANT_CAPTURE_MODES_MAP), str);
8035 LOGD("Set instant Capture from param = %d", value);
8036 if(value != NAME_NOT_FOUND) {
8037 updateParamEntry(KEY_QC_INSTANT_CAPTURE, str);
8038 }
8039 }
8040 } else {
8041 char prop[PROPERTY_VALUE_MAX];
8042 memset(prop, 0, sizeof(prop));
8043 property_get("persist.camera.instant.capture", prop, KEY_QC_INSTANT_CAPTURE_DISABLE);
8044 if ((prev_str == NULL) || (strcmp(prop, prev_str) != 0)) {
8045 value = lookupAttr(INSTANT_CAPTURE_MODES_MAP,
8046 PARAM_MAP_SIZE(INSTANT_CAPTURE_MODES_MAP), prop);
8047 LOGD("Set instant capture from setprop = %d", value);
8048 if (value != NAME_NOT_FOUND) {
8049 updateParamEntry(KEY_QC_INSTANT_CAPTURE, prop);
8050 }
8051 }
8052 }
8053
8054 // Set instant AEC param to the backend for either instant capture or instant AEC
8055 // 0 - disbale (normal AEC)
8056 // 1 - Aggressive AEC (algo used in backend)
8057 // 2 - Fast AEC (algo used in backend)
8058 if (value != NAME_NOT_FOUND && value != -1) {
8059 m_bInstantCapture = (value > 0)? true : false;
8060 setInstantAEC((uint8_t)value, false);
8061 }
8062
8063
8064 // get frame aec bound value from setprop.
8065 // This value indicates the number of frames, camera interface
8066 // will wait for getting the instant capture frame.
8067 // Default value set to 7.
8068 // This value also indicates the number of frames, that HAL
8069 // will not display and will not send preview frames to app
8070 // This will be applicable only if instant capture is set.
8071 if (m_bInstantCapture) {
8072 char prop[PROPERTY_VALUE_MAX];
8073 memset(prop, 0, sizeof(prop));
8074 property_get("persist.camera.ae.capture.bound", prop, "7");
8075 int32_t frame_bound = atoi(prop);
8076 if (frame_bound >= 0) {
8077 mAecFrameBound = (uint8_t)frame_bound;
8078 } else {
8079 LOGE("Invalid prop for aec frame bound %d", frame_bound);
8080 rc = BAD_VALUE;
8081 }
8082 }
8083 return rc;
8084 }
8085
8086 /*===========================================================================
8087 * FUNCTION : setInstantAEC
8088 *
8089 * DESCRIPTION: Set Instant AEC related params
8090 *
8091 * PARAMETERS :
8092 * @params : user setting parameters
8093 *
8094 * RETURN : int32_t type of status
8095 * NO_ERROR -- success
8096 * none-zero failure code
8097 *==========================================================================*/
setInstantAEC(const QCameraParameters & params)8098 int32_t QCameraParameters::setInstantAEC(const QCameraParameters& params)
8099 {
8100 int32_t rc = NO_ERROR;
8101 int value = -1;
8102
8103 // Check for instant AEC only when instant capture is not enabled.
8104 // Instant capture already takes care of the instant AEC as well.
8105 if (!m_bInstantCapture) {
8106 // Check for instant AEC. Instant AEC will only enable fast AEC.
8107 // It will not enable instant capture.
8108 // This param will trigger the instant AEC param to backend
8109 const char *str = params.get(KEY_QC_INSTANT_AEC);
8110 const char *prev_str = get(KEY_QC_INSTANT_AEC);
8111 if (str) {
8112 if ((prev_str == NULL) || (strcmp(str, prev_str) != 0)) {
8113 value = lookupAttr(INSTANT_AEC_MODES_MAP,
8114 PARAM_MAP_SIZE(INSTANT_AEC_MODES_MAP), str);
8115 LOGD("Set instant AEC from param = %d", value);
8116 }
8117 } else {
8118 char prop[PROPERTY_VALUE_MAX];
8119 memset(prop, 0, sizeof(prop));
8120 property_get("persist.camera.instant.aec", prop, KEY_QC_INSTANT_AEC_DISABLE);
8121 if ((prev_str == NULL) || (strcmp(prop, prev_str) != 0)) {
8122 value = lookupAttr(INSTANT_AEC_MODES_MAP,
8123 PARAM_MAP_SIZE(INSTANT_AEC_MODES_MAP), prop);
8124 LOGD("Set instant AEC from setprop = %d", value);
8125 }
8126 }
8127
8128 // Set instant AEC param to the backend for either instant capture or instant AEC
8129 // 0 - disbale (normal AEC)
8130 // 1 - Aggressive AEC (algo used in backend)
8131 // 2 - Fast AEC (algo used in backend)
8132 if (value != NAME_NOT_FOUND && value != -1) {
8133 setInstantAEC((uint8_t)value, false);
8134 }
8135
8136 }
8137
8138 // get frame aec preview skip count from setprop.
8139 // This value indicates the number of frames, that HAL
8140 // will not display and will not send preview frames to app
8141 // Default value set to 7.
8142 // This will be applicable only if instant aec is set.
8143 if (m_bInstantAEC) {
8144 char prop[PROPERTY_VALUE_MAX];
8145 memset(prop, 0, sizeof(prop));
8146 property_get("persist.camera.ae.instant.bound", prop, "7");
8147 int32_t aec_frame_skip_cnt = atoi(prop);
8148 if (aec_frame_skip_cnt >= 0) {
8149 mAecSkipDisplayFrameBound = (uint8_t)aec_frame_skip_cnt;
8150 } else {
8151 LOGE("Invalid prop for aec frame bound %d", aec_frame_skip_cnt);
8152 rc = BAD_VALUE;
8153 }
8154 }
8155 return rc;
8156 }
8157
8158 /*===========================================================================
8159 * FUNCTION : setDISValue
8160 *
8161 * DESCRIPTION: set DIS value
8162 *
8163 * PARAMETERS :
8164 * @disStr : DIS value string
8165 *
8166 * RETURN : int32_t type of status
8167 * NO_ERROR -- success
8168 * none-zero failure code
8169 *==========================================================================*/
setDISValue(const char * disStr)8170 int32_t QCameraParameters::setDISValue(const char *disStr)
8171 {
8172 if (disStr != NULL) {
8173 int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
8174 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), disStr);
8175 if (value != NAME_NOT_FOUND) {
8176 //For some IS types (like EIS 2.0), when DIS value is changed, we need to restart
8177 //preview because of topology change in backend. But, for now, restart preview
8178 //for all IS types.
8179 m_bNeedRestart = true;
8180 LOGH("Setting DIS value %s", disStr);
8181 updateParamEntry(KEY_QC_DIS, disStr);
8182 if (!(strcmp(disStr,"enable"))) {
8183 m_bDISEnabled = true;
8184 } else {
8185 m_bDISEnabled = false;
8186 }
8187 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_DIS_ENABLE, value)) {
8188 return BAD_VALUE;
8189 }
8190 return NO_ERROR;
8191 }
8192 }
8193 LOGE("Invalid DIS value: %s", (disStr == NULL) ? "NULL" : disStr);
8194 m_bDISEnabled = false;
8195 return BAD_VALUE;
8196 }
8197
8198 /*===========================================================================
8199 * FUNCTION : updateOisValue
8200 *
8201 * DESCRIPTION: update OIS value
8202 *
8203 * PARAMETERS :
8204 * @oisValue : OIS value TRUE/FALSE
8205 *
8206 * RETURN : int32_t type of status
8207 * NO_ERROR -- success
8208 * none-zero failure code
8209 *==========================================================================*/
updateOisValue(bool oisValue)8210 int32_t QCameraParameters::updateOisValue(bool oisValue)
8211 {
8212 uint8_t enable = 0;
8213 int32_t rc = NO_ERROR;
8214
8215 // Check for OIS disable
8216 char ois_prop[PROPERTY_VALUE_MAX];
8217 memset(ois_prop, 0, sizeof(ois_prop));
8218 property_get("persist.camera.ois.disable", ois_prop, "0");
8219 uint8_t ois_disable = (uint8_t)atoi(ois_prop);
8220
8221 //Enable OIS if it is camera mode or Camcoder 4K mode
8222 if (!m_bRecordingHint || (is4k2kVideoResolution() && m_bRecordingHint)) {
8223 enable = 1;
8224 LOGH("Valid OIS mode!! ");
8225 }
8226 // Disable OIS if setprop is set
8227 if (ois_disable || !oisValue) {
8228 //Disable OIS
8229 enable = 0;
8230 LOGH("Disable OIS mode!! ois_disable(%d) oisValue(%d)",
8231 ois_disable, oisValue);
8232
8233 }
8234 m_bOISEnabled = enable;
8235 if (m_bOISEnabled) {
8236 updateParamEntry(KEY_QC_OIS, VALUE_ENABLE);
8237 } else {
8238 updateParamEntry(KEY_QC_OIS, VALUE_DISABLE);
8239 }
8240
8241 if (initBatchUpdate(m_pParamBuf) < 0 ) {
8242 LOGE("Failed to initialize group update table");
8243 return BAD_TYPE;
8244 }
8245
8246 LOGH("Sending OIS mode (%d)", enable);
8247 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_META_LENS_OPT_STAB_MODE, enable)) {
8248 LOGE("Failed to update table");
8249 return BAD_VALUE;
8250 }
8251
8252 rc = commitSetBatch();
8253 if (rc != NO_ERROR) {
8254 LOGE("Failed to parameter changes");
8255 return rc;
8256 }
8257
8258 return rc;
8259 }
8260
8261 /*===========================================================================
8262 * FUNCTION : setHighFrameRate
8263 *
8264 * DESCRIPTION: set high frame rate
8265 *
8266 * PARAMETERS :
8267 * @hfrMode : HFR mode
8268 *
8269 * RETURN : int32_t type of status
8270 * NO_ERROR -- success
8271 * none-zero failure code
8272 *==========================================================================*/
setHighFrameRate(const int32_t hfrMode)8273 int32_t QCameraParameters::setHighFrameRate(const int32_t hfrMode)
8274 {
8275 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HFR, hfrMode)) {
8276 return BAD_VALUE;
8277 }
8278
8279 return NO_ERROR;
8280 }
8281
8282 /*===========================================================================
8283 * FUNCTION : setLensShadeValue
8284 *
8285 * DESCRIPTION: set lens shade value
8286 *
8287 * PARAMETERS :
8288 * @lensSahdeStr : lens shade value string
8289 *
8290 * RETURN : int32_t type of status
8291 * NO_ERROR -- success
8292 * none-zero failure code
8293 *==========================================================================*/
setLensShadeValue(const char * lensShadeStr)8294 int32_t QCameraParameters::setLensShadeValue(const char *lensShadeStr)
8295 {
8296 if (lensShadeStr != NULL) {
8297 int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
8298 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), lensShadeStr);
8299 if (value != NAME_NOT_FOUND) {
8300 LOGH("Setting LensShade value %s", lensShadeStr);
8301 updateParamEntry(KEY_QC_LENSSHADE, lensShadeStr);
8302 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ROLLOFF, value)) {
8303 return BAD_VALUE;
8304 }
8305 return NO_ERROR;
8306 }
8307 }
8308 LOGE("Invalid LensShade value: %s",
8309 (lensShadeStr == NULL) ? "NULL" : lensShadeStr);
8310 return BAD_VALUE;
8311 }
8312
8313 /*===========================================================================
8314 * FUNCTION : setExposureCompensation
8315 *
8316 * DESCRIPTION: set exposure compensation value
8317 *
8318 * PARAMETERS :
8319 * @expComp : exposure compensation value
8320 *
8321 * RETURN : int32_t type of status
8322 * NO_ERROR -- success
8323 * none-zero failure code
8324 *==========================================================================*/
setExposureCompensation(int expComp)8325 int32_t QCameraParameters::setExposureCompensation(int expComp)
8326 {
8327 char val[16];
8328 snprintf(val, sizeof(val), "%d", expComp);
8329 updateParamEntry(KEY_EXPOSURE_COMPENSATION, val);
8330
8331 // Don't need to pass step as part of setParameter because
8332 // camera daemon is already aware of it.
8333 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_EXPOSURE_COMPENSATION, expComp)) {
8334 return BAD_VALUE;
8335 }
8336
8337 return NO_ERROR;
8338 }
8339
8340 /*===========================================================================
8341 * FUNCTION : setWhiteBalance
8342 *
8343 * DESCRIPTION: set white balance mode
8344 *
8345 * PARAMETERS :
8346 * @wbStr : white balance mode value string
8347 *
8348 * RETURN : int32_t type of status
8349 * NO_ERROR -- success
8350 * none-zero failure code
8351 *==========================================================================*/
setWhiteBalance(const char * wbStr)8352 int32_t QCameraParameters::setWhiteBalance(const char *wbStr)
8353 {
8354 if (wbStr != NULL) {
8355 int32_t value = lookupAttr(WHITE_BALANCE_MODES_MAP,
8356 PARAM_MAP_SIZE(WHITE_BALANCE_MODES_MAP), wbStr);
8357 if (value != NAME_NOT_FOUND) {
8358 LOGH("Setting WhiteBalance value %s", wbStr);
8359 updateParamEntry(KEY_WHITE_BALANCE, wbStr);
8360 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_WHITE_BALANCE, value)) {
8361 return BAD_VALUE;
8362 }
8363 return NO_ERROR;
8364 }
8365 }
8366 LOGE("Invalid WhiteBalance value: %s", (wbStr == NULL) ? "NULL" : wbStr);
8367 return BAD_VALUE;
8368 }
8369
8370 /*===========================================================================
8371 * FUNCTION : setWBManualCCT
8372 *
8373 * DESCRIPTION: set setWBManualCCT time
8374 *
8375 * PARAMETERS :
8376 * @cctStr : string of wb cct, range (2000, 8000) in K.
8377 *
8378 * RETURN : int32_t type of status
8379 * NO_ERROR -- success
8380 * none-zero failure code
8381 *==========================================================================*/
setWBManualCCT(const char * cctStr)8382 int32_t QCameraParameters::setWBManualCCT(const char *cctStr)
8383 {
8384 if (cctStr != NULL) {
8385 int32_t cctVal = atoi(cctStr);
8386 int32_t minCct = m_pCapability->min_wb_cct; /* 2000K */
8387 int32_t maxCct = m_pCapability->max_wb_cct; /* 8000K */
8388
8389 if (cctVal >= minCct && cctVal <= maxCct) {
8390 LOGH(", cct value: %d", cctVal);
8391 updateParamEntry(KEY_QC_WB_MANUAL_CCT, cctStr);
8392 cam_manual_wb_parm_t manual_wb;
8393 manual_wb.type = CAM_MANUAL_WB_MODE_CCT;
8394 manual_wb.cct = cctVal;
8395 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_WB_MANUAL, manual_wb)) {
8396 return BAD_VALUE;
8397 }
8398 return NO_ERROR;
8399 }
8400 }
8401
8402 LOGE("Invalid cct, value: %s",
8403 (cctStr == NULL) ? "NULL" : cctStr);
8404 return BAD_VALUE;
8405 }
8406
8407 /*===========================================================================
8408 * FUNCTION : updateAWBParams
8409 *
8410 * DESCRIPTION: update CCT parameters key
8411 *
8412 * PARAMETERS :
8413 * @awb_params : WB parameters
8414 *
8415 * RETURN : int32_t type of status
8416 * NO_ERROR -- success
8417 * none-zero failure code
8418 *==========================================================================*/
updateAWBParams(cam_awb_params_t & awb_params)8419 int32_t QCameraParameters::updateAWBParams(cam_awb_params_t &awb_params)
8420 {
8421 //check and update CCT
8422 int32_t prev_cct = getInt(KEY_QC_WB_MANUAL_CCT);
8423 if (prev_cct != awb_params.cct_value) {
8424 LOGD("update current cct value. old:%d, now:%d",
8425 prev_cct, awb_params.cct_value);
8426 set(KEY_QC_WB_MANUAL_CCT, awb_params.cct_value);
8427 }
8428
8429 //check and update WB gains
8430 const char *prev_gains = get(KEY_QC_MANUAL_WB_GAINS);
8431 char gainStr[30];
8432 snprintf(gainStr, sizeof(gainStr), "%f,%f,%f", awb_params.rgb_gains.r_gain,
8433 awb_params.rgb_gains.g_gain, awb_params.rgb_gains.b_gain);
8434
8435 if (prev_gains == NULL || strcmp(prev_gains, gainStr)) {
8436 set(KEY_QC_MANUAL_WB_GAINS, gainStr);
8437 LOGD("update currernt RGB gains: old %s new %s", prev_gains, gainStr);
8438 }
8439 return NO_ERROR;
8440 }
8441
8442 /*===========================================================================
8443 * FUNCTION : parseGains
8444 *
8445 * DESCRIPTION: parse WB gains
8446 *
8447 * PARAMETERS :
8448 * @gainStr : WB result string
8449 * @r_gain : WB red gain
8450 * @g_gain : WB green gain
8451 * @b_gain : WB blue gain
8452 *
8453 * RETURN : int32_t type of status
8454 * NO_ERROR -- success
8455 * none-zero failure code
8456 *==========================================================================*/
parseGains(const char * gainStr,double & r_gain,double & g_gain,double & b_gain)8457 int32_t QCameraParameters::parseGains(const char *gainStr, double &r_gain,
8458 double &g_gain, double &b_gain)
8459 {
8460 int32_t rc = NO_ERROR;
8461 char *saveptr = NULL;
8462 size_t gains_size = strlen(gainStr) + 1;
8463 char* gains = (char*) calloc(1, gains_size);
8464 if (NULL == gains) {
8465 LOGE("No memory for gains");
8466 return NO_MEMORY;
8467 }
8468 strlcpy(gains, gainStr, gains_size);
8469 char *token = strtok_r(gains, ",", &saveptr);
8470
8471 if (NULL != token) {
8472 r_gain = (float) atof(token);
8473 token = strtok_r(NULL, ",", &saveptr);
8474 }
8475
8476 if (NULL != token) {
8477 g_gain = (float) atof(token);
8478 token = strtok_r(NULL, ",", &saveptr);
8479 }
8480
8481 if (NULL != token) {
8482 b_gain = (float) atof(token);
8483 } else {
8484 LOGE("Malformed string for gains");
8485 rc = BAD_VALUE;
8486 }
8487
8488 free(gains);
8489 return rc;
8490 }
8491
8492 /*===========================================================================
8493 * FUNCTION : setManualWBGains
8494 *
8495 * DESCRIPTION: set manual wb gains for r,g,b
8496 *
8497 * PARAMETERS :
8498 * @cctStr : string of wb gains, range (1.0, 4.0).
8499 *
8500 * RETURN : int32_t type of status
8501 * NO_ERROR -- success
8502 * none-zero failure code
8503 *==========================================================================*/
setManualWBGains(const char * gainStr)8504 int32_t QCameraParameters::setManualWBGains(const char *gainStr)
8505 {
8506 int32_t rc = NO_ERROR;
8507 if (gainStr != NULL) {
8508 double r_gain,g_gain,b_gain;
8509 rc = parseGains(gainStr, r_gain, g_gain, b_gain);
8510 if (rc != NO_ERROR) {
8511 return rc;
8512 }
8513
8514 double minGain = m_pCapability->min_wb_gain;
8515 double maxGain = m_pCapability->max_wb_gain;
8516
8517 if (r_gain >= minGain && r_gain <= maxGain &&
8518 g_gain >= minGain && g_gain <= maxGain &&
8519 b_gain >= minGain && b_gain <= maxGain) {
8520 LOGH(", setting rgb gains: r = %lf g = %lf b = %lf",
8521 r_gain, g_gain, b_gain);
8522 updateParamEntry(KEY_QC_MANUAL_WB_GAINS, gainStr);
8523 cam_manual_wb_parm_t manual_wb;
8524 manual_wb.type = CAM_MANUAL_WB_MODE_GAIN;
8525 manual_wb.gains.r_gain = r_gain;
8526 manual_wb.gains.g_gain = g_gain;
8527 manual_wb.gains.b_gain = b_gain;
8528 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_WB_MANUAL, manual_wb)) {
8529 return BAD_VALUE;
8530 }
8531 return NO_ERROR;
8532 }
8533 }
8534
8535 LOGH("Invalid manual wb gains: %s",
8536 (gainStr == NULL) ? "NULL" : gainStr);
8537 return BAD_VALUE;
8538 }
8539
getAutoFlickerMode()8540 int QCameraParameters::getAutoFlickerMode()
8541 {
8542 /* Enable Advanced Auto Antibanding where we can set
8543 any of the following option
8544 ie. CAM_ANTIBANDING_MODE_AUTO
8545 CAM_ANTIBANDING_MODE_AUTO_50HZ
8546 CAM_ANTIBANDING_MODE_AUTO_60HZ
8547 Currently setting it to default */
8548 char prop[PROPERTY_VALUE_MAX];
8549 memset(prop, 0, sizeof(prop));
8550 property_get("persist.camera.set.afd", prop, "3");
8551 return atoi(prop);
8552 }
8553
8554 /*===========================================================================
8555 * FUNCTION : setAntibanding
8556 *
8557 * DESCRIPTION: set antibanding value
8558 *
8559 * PARAMETERS :
8560 * @antiBandingStr : antibanding value string
8561 *
8562 * RETURN : int32_t type of status
8563 * NO_ERROR -- success
8564 * none-zero failure code
8565 *==========================================================================*/
setAntibanding(const char * antiBandingStr)8566 int32_t QCameraParameters::setAntibanding(const char *antiBandingStr)
8567 {
8568 if (antiBandingStr != NULL) {
8569 int32_t value = lookupAttr(ANTIBANDING_MODES_MAP, PARAM_MAP_SIZE(ANTIBANDING_MODES_MAP),
8570 antiBandingStr);
8571 if (value != NAME_NOT_FOUND) {
8572 LOGH("Setting AntiBanding value %s", antiBandingStr);
8573 updateParamEntry(KEY_ANTIBANDING, antiBandingStr);
8574 if(value == CAM_ANTIBANDING_MODE_AUTO) {
8575 value = getAutoFlickerMode();
8576 }
8577 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
8578 CAM_INTF_PARM_ANTIBANDING, (uint32_t)value)) {
8579 return BAD_VALUE;
8580 }
8581 return NO_ERROR;
8582 }
8583 }
8584 LOGE("Invalid AntiBanding value: %s",
8585 (antiBandingStr == NULL) ? "NULL" : antiBandingStr);
8586 return BAD_VALUE;
8587 }
8588
8589 /*===========================================================================
8590 * FUNCTION : setFocusAreas
8591 *
8592 * DESCRIPTION: set focus areas
8593 *
8594 * PARAMETERS :
8595 * @focusAreasStr : focus areas value string
8596 *
8597 * RETURN : int32_t type of status
8598 * NO_ERROR -- success
8599 * none-zero failure code
8600 *==========================================================================*/
setFocusAreas(const char * focusAreasStr)8601 int32_t QCameraParameters::setFocusAreas(const char *focusAreasStr)
8602 {
8603 if (m_pCapability->max_num_focus_areas == 0 ||
8604 focusAreasStr == NULL) {
8605 LOGD("Parameter string is null");
8606 return NO_ERROR;
8607 }
8608
8609 cam_area_t *areas = (cam_area_t *)malloc(sizeof(cam_area_t) * m_pCapability->max_num_focus_areas);
8610 if (NULL == areas) {
8611 LOGE("No memory for areas");
8612 return NO_MEMORY;
8613 }
8614 memset(areas, 0, sizeof(cam_area_t) * m_pCapability->max_num_focus_areas);
8615 int num_areas_found = 0;
8616 if (parseCameraAreaString(focusAreasStr,
8617 m_pCapability->max_num_focus_areas,
8618 areas,
8619 num_areas_found) != NO_ERROR) {
8620 LOGE("Failed to parse the string: %s", focusAreasStr);
8621 free(areas);
8622 return BAD_VALUE;
8623 }
8624
8625 if (validateCameraAreas(areas, num_areas_found) == false) {
8626 LOGE("invalid areas specified : %s", focusAreasStr);
8627 free(areas);
8628 return BAD_VALUE;
8629 }
8630
8631 updateParamEntry(KEY_FOCUS_AREAS, focusAreasStr);
8632
8633 //for special area string (0, 0, 0, 0, 0), set the num_areas_found to 0,
8634 //so no action is takenby the lower layer
8635 if (num_areas_found == 1 &&
8636 areas[0].rect.left == 0 &&
8637 areas[0].rect.top == 0 &&
8638 areas[0].rect.width == 0 &&
8639 areas[0].rect.height == 0 &&
8640 areas[0].weight == 0) {
8641 num_areas_found = 0;
8642 }
8643
8644 int previewWidth, previewHeight;
8645 getPreviewSize(&previewWidth, &previewHeight);
8646 cam_roi_info_t af_roi_value;
8647 memset(&af_roi_value, 0, sizeof(cam_roi_info_t));
8648 af_roi_value.num_roi = (uint8_t)num_areas_found;
8649 for (int i = 0; i < num_areas_found; i++) {
8650 LOGH("FocusArea[%d] = (%d, %d, %d, %d)",
8651 i, (areas[i].rect.top), (areas[i].rect.left),
8652 (areas[i].rect.width), (areas[i].rect.height));
8653
8654 // Transform the coords from (-1000, 1000)
8655 // to (0, previewWidth or previewHeight).
8656 af_roi_value.roi[i].left =
8657 (int32_t)(((double)areas[i].rect.left + 1000.0) *
8658 ((double)previewWidth / 2000.0));
8659 af_roi_value.roi[i].top =
8660 (int32_t)(((double)areas[i].rect.top + 1000.0) *
8661 ((double)previewHeight / 2000.0));
8662 af_roi_value.roi[i].width =
8663 (int32_t)((double)areas[i].rect.width *
8664 (double)previewWidth / 2000.0);
8665 af_roi_value.roi[i].height =
8666 (int32_t)((double)areas[i].rect.height *
8667 (double)previewHeight / 2000.0);
8668 af_roi_value.weight[i] = areas[i].weight;
8669 }
8670 free(areas);
8671 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_AF_ROI, af_roi_value)) {
8672 return BAD_VALUE;
8673 }
8674
8675 return NO_ERROR;
8676 }
8677
8678 /*===========================================================================
8679 * FUNCTION : setMeteringAreas
8680 *
8681 * DESCRIPTION: set metering areas value
8682 *
8683 * PARAMETERS :
8684 * @meteringAreasStr : metering areas value string
8685 *
8686 * RETURN : int32_t type of status
8687 * NO_ERROR -- success
8688 * none-zero failure code
8689 *==========================================================================*/
setMeteringAreas(const char * meteringAreasStr)8690 int32_t QCameraParameters::setMeteringAreas(const char *meteringAreasStr)
8691 {
8692 if (m_pCapability->max_num_metering_areas == 0 ||
8693 meteringAreasStr == NULL) {
8694 LOGD("Parameter string is null");
8695 return NO_ERROR;
8696 }
8697
8698 cam_area_t *areas = (cam_area_t *)malloc(sizeof(cam_area_t) * m_pCapability->max_num_metering_areas);
8699 if (NULL == areas) {
8700 LOGE("No memory for areas");
8701 return NO_MEMORY;
8702 }
8703 memset(areas, 0, sizeof(cam_area_t) * m_pCapability->max_num_metering_areas);
8704 int num_areas_found = 0;
8705 if (parseCameraAreaString(meteringAreasStr,
8706 m_pCapability->max_num_metering_areas,
8707 areas,
8708 num_areas_found) < 0) {
8709 LOGE("Failed to parse the string: %s", meteringAreasStr);
8710 free(areas);
8711 return BAD_VALUE;
8712 }
8713
8714 if (validateCameraAreas(areas, num_areas_found) == false) {
8715 LOGE("invalid areas specified : %s", meteringAreasStr);
8716 free(areas);
8717 return BAD_VALUE;
8718 }
8719
8720 updateParamEntry(KEY_METERING_AREAS, meteringAreasStr);
8721
8722 //for special area string (0, 0, 0, 0, 0), set the num_areas_found to 0,
8723 //so no action is takenby the lower layer
8724 if (num_areas_found == 1 &&
8725 areas[0].rect.left == 0 &&
8726 areas[0].rect.top == 0 &&
8727 areas[0].rect.width == 0 &&
8728 areas[0].rect.height == 0 &&
8729 areas[0].weight == 0) {
8730 num_areas_found = 0;
8731 }
8732 cam_set_aec_roi_t aec_roi_value;
8733 int previewWidth, previewHeight;
8734 getPreviewSize(&previewWidth, &previewHeight);
8735
8736 memset(&aec_roi_value, 0, sizeof(cam_set_aec_roi_t));
8737 if (num_areas_found > 0) {
8738 aec_roi_value.aec_roi_enable = CAM_AEC_ROI_ON;
8739 aec_roi_value.aec_roi_type = CAM_AEC_ROI_BY_COORDINATE;
8740
8741 for (int i = 0; i < num_areas_found; i++) {
8742 LOGH("MeteringArea[%d] = (%d, %d, %d, %d)",
8743 i, (areas[i].rect.top), (areas[i].rect.left),
8744 (areas[i].rect.width), (areas[i].rect.height));
8745
8746 // Transform the coords from (-1000, 1000) to
8747 // (0, previewWidth or previewHeight).
8748 aec_roi_value.cam_aec_roi_position.coordinate[i].x =
8749 (uint32_t)((((double)areas[i].rect.left +
8750 (double)areas[i].rect.width / 2.0) + 1000.0) *
8751 (double)previewWidth / 2000.0);
8752 aec_roi_value.cam_aec_roi_position.coordinate[i].y =
8753 (uint32_t)((((double)areas[i].rect.top +
8754 (double)areas[i].rect.height / 2.0) + 1000.0) *
8755 (double)previewHeight / 2000.0);
8756 }
8757 } else {
8758 aec_roi_value.aec_roi_enable = CAM_AEC_ROI_OFF;
8759 }
8760 free(areas);
8761 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_AEC_ROI, aec_roi_value)) {
8762 return BAD_VALUE;
8763 }
8764
8765 return NO_ERROR;
8766 }
8767
8768
8769 /*===========================================================================
8770 * FUNCTION : isSupportedSensorHdrSize
8771 *
8772 * DESCRIPTION: Checks if the requested snapshot size is compatible with currently
8773 * configured HDR mode, currently primary target for validation is
8774 * zzhdr however this function can be extended in the future to vet
8775 * all sensor based HDR configs
8776 *
8777 * PARAMETERS :
8778 * @params : CameraParameters object
8779 *
8780 * RETURN : boolean type
8781 * True -- indicates supported config
8782 * False -- indicated unsupported config should fallback to other
8783 * available HDR modes
8784 *==========================================================================*/
isSupportedSensorHdrSize(const QCameraParameters & params)8785 bool QCameraParameters::isSupportedSensorHdrSize(const QCameraParameters& params)
8786 {
8787 char value[PROPERTY_VALUE_MAX];
8788 memset(value, 0, sizeof(value));
8789 property_get("persist.camera.zzhdr.enable", value, "0");
8790 uint8_t zzhdr_enable = (uint8_t)atoi(value);
8791
8792 if (zzhdr_enable) {
8793
8794 int req_w, req_h;
8795 params.getPictureSize(&req_w, &req_h);
8796
8797 // Check if requested w x h is in zzhdr supported list
8798 for (size_t i = 0; i< m_pCapability->zzhdr_sizes_tbl_cnt; ++i) {
8799
8800 if (req_w == m_pCapability->zzhdr_sizes_tbl[i].width &&
8801 req_h == m_pCapability->zzhdr_sizes_tbl[i].height) {
8802 LOGD("%s: Found match for %d x %d", __func__, req_w, req_h);
8803 return true;
8804 }
8805 }
8806 LOGH("%s: %d x %d is not supported for zzhdr mode", __func__, req_w, req_h);
8807 return false;
8808 }
8809
8810 return true;
8811 }
8812
8813 /*===========================================================================
8814 * FUNCTION : setSceneMode
8815 *
8816 * DESCRIPTION: set scene mode
8817 *
8818 * PARAMETERS :
8819 * @sceneModeStr : scene mode value string
8820 *
8821 * RETURN : int32_t type of status
8822 * NO_ERROR -- success
8823 * none-zero failure code
8824 *==========================================================================*/
setSceneMode(const char * sceneModeStr)8825 int32_t QCameraParameters::setSceneMode(const char *sceneModeStr)
8826 {
8827 if (sceneModeStr != NULL) {
8828 int32_t value = lookupAttr(SCENE_MODES_MAP, PARAM_MAP_SIZE(SCENE_MODES_MAP), sceneModeStr);
8829 if (value != NAME_NOT_FOUND) {
8830 LOGD("Setting SceneMode %s", sceneModeStr);
8831 updateParamEntry(KEY_SCENE_MODE, sceneModeStr);
8832 if (m_bSensorHDREnabled) {
8833 // Incase of HW HDR mode, we do not update the same as Best shot mode.
8834 LOGH("H/W HDR mode enabled. Do not set Best Shot Mode");
8835 return NO_ERROR;
8836 }
8837 if (m_bSceneSelection) {
8838 setSelectedScene((cam_scene_mode_type) value);
8839 }
8840 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_BESTSHOT_MODE,
8841 (uint32_t)value)) {
8842 return BAD_VALUE;
8843 }
8844 return NO_ERROR;
8845 }
8846 }
8847 LOGE("Invalid Secene Mode: %s",
8848 (sceneModeStr == NULL) ? "NULL" : sceneModeStr);
8849 return BAD_VALUE;
8850 }
8851
8852 /*===========================================================================
8853 * FUNCTION : setSelectableZoneAf
8854 *
8855 * DESCRIPTION: set selectable zone AF algorithm
8856 *
8857 * PARAMETERS :
8858 * @selZoneAFStr : selectable zone AF algorithm value string
8859 *
8860 * RETURN : int32_t type of status
8861 * NO_ERROR -- success
8862 * none-zero failure code
8863 *==========================================================================*/
setSelectableZoneAf(const char * selZoneAFStr)8864 int32_t QCameraParameters::setSelectableZoneAf(const char *selZoneAFStr)
8865 {
8866 if (selZoneAFStr != NULL) {
8867 int32_t value = lookupAttr(FOCUS_ALGO_MAP, PARAM_MAP_SIZE(FOCUS_ALGO_MAP), selZoneAFStr);
8868 if (value != NAME_NOT_FOUND) {
8869 LOGD("Setting Selectable Zone AF value %s", selZoneAFStr);
8870 updateParamEntry(KEY_QC_SELECTABLE_ZONE_AF, selZoneAFStr);
8871 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FOCUS_ALGO_TYPE, value)) {
8872 return BAD_VALUE;
8873 }
8874 return NO_ERROR;
8875 }
8876 }
8877 LOGE("Invalid selectable zone af value: %s",
8878 (selZoneAFStr == NULL) ? "NULL" : selZoneAFStr);
8879 return BAD_VALUE;
8880 }
8881
8882 /*===========================================================================
8883 * FUNCTION : isAEBracketEnabled
8884 *
8885 * DESCRIPTION: checks if AE bracketing is enabled
8886 *
8887 * PARAMETERS :
8888 *
8889 * RETURN : TRUE/FALSE
8890 *==========================================================================*/
isAEBracketEnabled()8891 bool QCameraParameters::isAEBracketEnabled()
8892 {
8893 const char *str = get(KEY_QC_AE_BRACKET_HDR);
8894 if (str != NULL) {
8895 if (strcmp(str, AE_BRACKET_OFF) != 0) {
8896 return true;
8897 }
8898 }
8899 return false;
8900 }
8901
8902 /*===========================================================================
8903 * FUNCTION : setAEBracket
8904 *
8905 * DESCRIPTION: set AE bracket value
8906 *
8907 * PARAMETERS :
8908 * @aecBracketStr : AE bracket value string
8909 *
8910 * RETURN : int32_t type of status
8911 * NO_ERROR -- success
8912 * none-zero failure code
8913 *==========================================================================*/
setAEBracket(const char * aecBracketStr)8914 int32_t QCameraParameters::setAEBracket(const char *aecBracketStr)
8915 {
8916 if (aecBracketStr == NULL) {
8917 LOGD("setAEBracket with NULL value");
8918 return NO_ERROR;
8919 }
8920
8921 cam_exp_bracketing_t expBracket;
8922 memset(&expBracket, 0, sizeof(expBracket));
8923
8924 int value = lookupAttr(BRACKETING_MODES_MAP, PARAM_MAP_SIZE(BRACKETING_MODES_MAP),
8925 aecBracketStr);
8926 switch (value) {
8927 case CAM_EXP_BRACKETING_ON:
8928 {
8929 LOGD("EXP_BRACKETING_ON");
8930 const char *str_val = get(KEY_QC_CAPTURE_BURST_EXPOSURE);
8931 if ((str_val != NULL) && (strlen(str_val)>0)) {
8932 expBracket.mode = CAM_EXP_BRACKETING_ON;
8933 m_bAeBracketingEnabled = true;
8934 strlcpy(expBracket.values, str_val, MAX_EXP_BRACKETING_LENGTH);
8935 LOGD("setting Exposure Bracketing value of %s",
8936 expBracket.values);
8937 }
8938 else {
8939 /* Apps not set capture-burst-exposures, error case fall into bracketing off mode */
8940 LOGD("capture-burst-exposures not set, back to HDR OFF mode");
8941 m_bAeBracketingEnabled = false;
8942 expBracket.mode = CAM_EXP_BRACKETING_OFF;
8943 }
8944 }
8945 break;
8946 default:
8947 {
8948 m_bAeBracketingEnabled = false;
8949 LOGH(", EXP_BRACKETING_OFF");
8950 expBracket.mode = CAM_EXP_BRACKETING_OFF;
8951 }
8952 break;
8953 }
8954
8955 // Cache client AE bracketing configuration
8956 memcpy(&m_AEBracketingClient, &expBracket, sizeof(cam_exp_bracketing_t));
8957
8958 /* save the value*/
8959 updateParamEntry(KEY_QC_AE_BRACKET_HDR, aecBracketStr);
8960 return NO_ERROR;
8961 }
8962
8963 /*===========================================================================
8964 * FUNCTION : set3ALock
8965 *
8966 * DESCRIPTION: enable/disable 3A lock.
8967 *
8968 * PARAMETERS :
8969 * @lock3A : lock or unlock
8970 *
8971 * RETURN : int32_t type of status
8972 * NO_ERROR -- success
8973 * none-zero failure code
8974 *==========================================================================*/
set3ALock(bool lock3A)8975 int32_t QCameraParameters::set3ALock(bool lock3A)
8976 {
8977 int32_t rc = NO_ERROR;
8978 LOGH("Setting Lock %d", lock3A);
8979 if(initBatchUpdate(m_pParamBuf) < 0 ) {
8980 LOGE("Failed to initialize group update table");
8981 return BAD_TYPE;
8982 }
8983 uint32_t focus_mode = CAM_FOCUS_MODE_AUTO;
8984 if (lock3A) {
8985 if (isUbiFocusEnabled() || isUbiRefocus()) {
8986 //For Ubi focus move focus to infinity.
8987 focus_mode = CAM_FOCUS_MODE_INFINITY;
8988 } else if (isOptiZoomEnabled() || isStillMoreEnabled()) {
8989 //For optizoom and stillmore, set focus as fixed.
8990 focus_mode = CAM_FOCUS_MODE_FIXED;
8991 }
8992 } else {
8993 // retrieve previous focus value.
8994 const char *focus = get(KEY_FOCUS_MODE);
8995 int val = lookupAttr(FOCUS_MODES_MAP, PARAM_MAP_SIZE(FOCUS_MODES_MAP), focus);
8996 if (val != NAME_NOT_FOUND) {
8997 focus_mode = (uint32_t) val;
8998 LOGD("focus mode %s", focus);
8999 }
9000 }
9001 //Lock AWB
9002 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_AWB_LOCK, (uint32_t)lock3A)) {
9003 return BAD_VALUE;
9004 }
9005 //Lock AEC
9006 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_AEC_LOCK, (uint32_t)lock3A)) {
9007 return BAD_VALUE;
9008 }
9009 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FOCUS_MODE, focus_mode)) {
9010 return BAD_VALUE;
9011 }
9012
9013 rc = commitSetBatch();
9014 if (rc != NO_ERROR) {
9015 LOGE("Failed to commit batch");
9016 }
9017 return rc;
9018 }
9019
9020 /*===========================================================================
9021 * FUNCTION : setAndCommitZoom
9022 *
9023 * DESCRIPTION: set zoom.
9024 *
9025 * PARAMETERS :
9026 * @zoom_level : zoom level to set.
9027 *
9028 * RETURN : int32_t type of status
9029 * NO_ERROR -- success
9030 * none-zero failure code
9031 *==========================================================================*/
setAndCommitZoom(int zoom_level)9032 int32_t QCameraParameters::setAndCommitZoom(int zoom_level)
9033 {
9034 LOGH("E");
9035 int32_t rc = NO_ERROR;
9036 if (initBatchUpdate(m_pParamBuf) < 0 ) {
9037 LOGE("Failed to initialize group update table");
9038 return BAD_TYPE;
9039 }
9040
9041 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ZOOM, zoom_level)) {
9042 LOGE("Failed to update table");
9043 return BAD_VALUE;
9044 }
9045
9046 rc = commitSetBatch();
9047 if (rc != NO_ERROR) {
9048 LOGE("Failed to set Flash value");
9049 }
9050
9051 mZoomLevel = zoom_level;
9052 LOGH("X");
9053
9054 return rc;
9055 }
9056
9057 /*===========================================================================
9058 * FUNCTION : isOptiZoomEnabled
9059 *
9060 * DESCRIPTION: checks whether optizoom is enabled
9061 *
9062 * PARAMETERS :
9063 *
9064 * RETURN : true - enabled, false - disabled
9065 *
9066 *==========================================================================*/
isOptiZoomEnabled()9067 bool QCameraParameters::isOptiZoomEnabled()
9068 {
9069 if (m_bOptiZoomOn && (0 <= mParmZoomLevel)) {
9070 uint32_t zoom_level = (uint32_t) mParmZoomLevel;
9071 cam_opti_zoom_t *opti_zoom_settings_need =
9072 &(m_pCapability->opti_zoom_settings_need);
9073 uint32_t zoom_threshold = (uint32_t) opti_zoom_settings_need->zoom_threshold;
9074 LOGH("current zoom level =%u & zoom_threshold =%u",
9075 zoom_level, zoom_threshold);
9076
9077 if (zoom_level >= zoom_threshold) {
9078 return true;
9079 }
9080 }
9081
9082 return false;
9083 }
9084
9085 /*===========================================================================
9086 * FUNCTION : setNoiseReductionMode
9087 *
9088 * DESCRIPTION: set noise reduction mode
9089 *
9090 * PARAMETERS :
9091 * @noiseReductionModeStr : noise reduction mode
9092 *
9093 * RETURN : int32_t type of status
9094 * NO_ERROR -- success
9095 * none-zero failure code
9096 *==========================================================================*/
setNoiseReductionMode(const char * noiseReductionModeStr)9097 int32_t QCameraParameters::setNoiseReductionMode(const char *noiseReductionModeStr)
9098 {
9099 LOGH("noiseReductionModeStr = %s", noiseReductionModeStr);
9100 if (noiseReductionModeStr != NULL) {
9101 int value = lookupAttr(NOISE_REDUCTION_MODES_MAP, PARAM_MAP_SIZE(NOISE_REDUCTION_MODES_MAP),
9102 noiseReductionModeStr);
9103 if (value != NAME_NOT_FOUND) {
9104 m_bHighQualityNoiseReductionMode =
9105 !strncmp(VALUE_HIGH_QUALITY, noiseReductionModeStr, strlen(VALUE_HIGH_QUALITY));
9106 updateParamEntry(KEY_QC_NOISE_REDUCTION_MODE, noiseReductionModeStr);
9107 return NO_ERROR;
9108 }
9109 }
9110 LOGE("Invalid noise reduction mode value: %s",
9111 (noiseReductionModeStr == NULL) ? "NULL" : noiseReductionModeStr);
9112 return BAD_VALUE;
9113 }
9114
9115 /*===========================================================================
9116 * FUNCTION : commitAFBracket
9117 *
9118 * DESCRIPTION: commit AF Bracket.
9119 *
9120 * PARAMETERS :
9121 * @AFBracket : AF bracketing configuration
9122 *
9123 * RETURN : int32_t type of status
9124 * NO_ERROR -- success
9125 * none-zero failure code
9126 *==========================================================================*/
commitAFBracket(cam_af_bracketing_t afBracket)9127 int32_t QCameraParameters::commitAFBracket(cam_af_bracketing_t afBracket)
9128 {
9129
9130 int32_t rc = NO_ERROR;
9131 if(initBatchUpdate(m_pParamBuf) < 0 ) {
9132 LOGE("Failed to initialize group update table");
9133 return BAD_TYPE;
9134 }
9135
9136 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FOCUS_BRACKETING, afBracket)) {
9137 LOGE("Failed to update table");
9138 return BAD_VALUE;
9139 }
9140
9141 rc = commitSetBatch();
9142 if (rc != NO_ERROR) {
9143 LOGE("Failed to commit batch");
9144 return rc;
9145 }
9146
9147 return rc;
9148 }
9149
9150 /*===========================================================================
9151 * FUNCTION : setAFBracket
9152 *
9153 * DESCRIPTION: set AF bracket value
9154 *
9155 * PARAMETERS :
9156 * @afBracketStr : AF bracket value string
9157 *
9158 * RETURN : int32_t type of status
9159 * NO_ERROR -- success
9160 * none-zero failure code
9161 *==========================================================================*/
setAFBracket(const char * afBracketStr)9162 int32_t QCameraParameters::setAFBracket(const char *afBracketStr)
9163 {
9164 LOGH("afBracketStr =%s",afBracketStr);
9165
9166 if(afBracketStr != NULL) {
9167 int value = lookupAttr(AF_BRACKETING_MODES_MAP, PARAM_MAP_SIZE(AF_BRACKETING_MODES_MAP),
9168 afBracketStr);
9169 if (value != NAME_NOT_FOUND) {
9170 m_bAFBracketingOn = (value != 0);
9171 updateParamEntry(KEY_QC_AF_BRACKET, afBracketStr);
9172
9173 return NO_ERROR;
9174 }
9175 }
9176
9177 LOGE("Invalid af bracket value: %s",
9178 (afBracketStr == NULL) ? "NULL" : afBracketStr);
9179 return BAD_VALUE;
9180 }
9181
9182 /*===========================================================================
9183 * FUNCTION : setReFocus
9184 *
9185 * DESCRIPTION: set refocus value
9186 *
9187 * PARAMETERS :
9188 * @afBracketStr : refocus value string
9189 *
9190 * RETURN : int32_t type of status
9191 * NO_ERROR -- success
9192 * none-zero failure code
9193 *==========================================================================*/
setReFocus(const char * reFocusStr)9194 int32_t QCameraParameters::setReFocus(const char *reFocusStr)
9195 {
9196 LOGH("reFocusStr =%s",reFocusStr);
9197
9198 if (reFocusStr != NULL) {
9199 int value = lookupAttr(RE_FOCUS_MODES_MAP, PARAM_MAP_SIZE(RE_FOCUS_MODES_MAP),
9200 reFocusStr);
9201 if (value != NAME_NOT_FOUND) {
9202 m_bReFocusOn = (value != 0);
9203 updateParamEntry(KEY_QC_RE_FOCUS, reFocusStr);
9204 return NO_ERROR;
9205 }
9206 }
9207
9208 return NO_ERROR;
9209 }
9210
9211 /*===========================================================================
9212 * FUNCTION : setChromaFlash
9213 *
9214 * DESCRIPTION: set chroma flash value
9215 *
9216 * PARAMETERS :
9217 * @aecBracketStr : chroma flash value string
9218 *
9219 * RETURN : int32_t type of status
9220 * NO_ERROR -- success
9221 * none-zero failure code
9222 *==========================================================================*/
setChromaFlash(const char * chromaFlashStr)9223 int32_t QCameraParameters::setChromaFlash(const char *chromaFlashStr)
9224 {
9225 LOGH("chromaFlashStr =%s",chromaFlashStr);
9226 if(chromaFlashStr != NULL) {
9227 int value = lookupAttr(CHROMA_FLASH_MODES_MAP, PARAM_MAP_SIZE(CHROMA_FLASH_MODES_MAP),
9228 chromaFlashStr);
9229 if(value != NAME_NOT_FOUND) {
9230 m_bChromaFlashOn = (value != 0);
9231 updateParamEntry(KEY_QC_CHROMA_FLASH, chromaFlashStr);
9232
9233 return NO_ERROR;
9234 }
9235 }
9236
9237 LOGE("Invalid chroma flash value: %s",
9238 (chromaFlashStr == NULL) ? "NULL" : chromaFlashStr);
9239 return BAD_VALUE;
9240 }
9241
9242 /*===========================================================================
9243 * FUNCTION : setOptiZoom
9244 *
9245 * DESCRIPTION: set opti zoom value
9246 *
9247 * PARAMETERS :
9248 * @optiZoomStr : opti zoom value string
9249 *
9250 * RETURN : int32_t type of status
9251 * NO_ERROR -- success
9252 * none-zero failure code
9253 *==========================================================================*/
setOptiZoom(const char * optiZoomStr)9254 int32_t QCameraParameters::setOptiZoom(const char *optiZoomStr)
9255 {
9256 LOGH("optiZoomStr =%s",optiZoomStr);
9257 if(optiZoomStr != NULL) {
9258 int value = lookupAttr(OPTI_ZOOM_MODES_MAP, PARAM_MAP_SIZE(OPTI_ZOOM_MODES_MAP),
9259 optiZoomStr);
9260 if(value != NAME_NOT_FOUND) {
9261 m_bOptiZoomOn = (value != 0);
9262 updateParamEntry(KEY_QC_OPTI_ZOOM, optiZoomStr);
9263
9264 return NO_ERROR;
9265 }
9266 }
9267 LOGE("Invalid opti zoom value: %s",
9268 (optiZoomStr == NULL) ? "NULL" : optiZoomStr);
9269 return BAD_VALUE;
9270 }
9271
9272 /*===========================================================================
9273 * FUNCTION : setTruePortrait
9274 *
9275 * DESCRIPTION: set true portrait value
9276 *
9277 * PARAMETERS :
9278 * @optiZoomStr : true portrait value string
9279 *
9280 * RETURN : int32_t type of status
9281 * NO_ERROR -- success
9282 * none-zero failure code
9283 *==========================================================================*/
setTruePortrait(const char * truePortraitStr)9284 int32_t QCameraParameters::setTruePortrait(const char *truePortraitStr)
9285 {
9286 LOGH("truePortraitStr =%s", truePortraitStr);
9287 if (truePortraitStr != NULL) {
9288 int value = lookupAttr(TRUE_PORTRAIT_MODES_MAP,
9289 PARAM_MAP_SIZE(TRUE_PORTRAIT_MODES_MAP),
9290 truePortraitStr);
9291 if (value != NAME_NOT_FOUND) {
9292 m_bTruePortraitOn = (value != 0);
9293 updateParamEntry(KEY_QC_TRUE_PORTRAIT, truePortraitStr);
9294 setFaceDetection(m_bFaceDetectionOn, false);
9295 return NO_ERROR;
9296 }
9297 }
9298 LOGH("Invalid true portrait value: %s",
9299 (truePortraitStr == NULL) ? "NULL" : truePortraitStr);
9300 return BAD_VALUE;
9301 }
9302
9303 /*===========================================================================
9304 * FUNCTION : setHDRMode
9305 *
9306 * DESCRIPTION: set hdr mode value
9307 *
9308 * PARAMETERS :
9309 * @hdrModeStr : hdr mode value string
9310 *
9311 * RETURN : int32_t type of status
9312 * NO_ERROR -- success
9313 * none-zero failure code
9314 *==========================================================================*/
setHDRMode(const char * hdrModeStr)9315 int32_t QCameraParameters::setHDRMode(const char *hdrModeStr)
9316 {
9317 LOGH("hdrModeStr =%s", hdrModeStr);
9318 if (hdrModeStr != NULL) {
9319 int value = lookupAttr(HDR_MODES_MAP, PARAM_MAP_SIZE(HDR_MODES_MAP), hdrModeStr);
9320 if (value != NAME_NOT_FOUND) {
9321 const char *str = get(KEY_SCENE_MODE);
9322
9323 m_bHDRModeSensor = !strncmp(hdrModeStr, HDR_MODE_SENSOR, strlen(HDR_MODE_SENSOR));
9324
9325 updateParamEntry(KEY_QC_HDR_MODE, hdrModeStr);
9326
9327 // If hdr is already selected, need to deselect it in local cache
9328 // So the new hdr mode will be applied
9329 if (str && !strncmp(str, SCENE_MODE_HDR, strlen(SCENE_MODE_HDR))) {
9330 updateParamEntry(KEY_SCENE_MODE, SCENE_MODE_AUTO);
9331 m_bNeedRestart = true;
9332 }
9333
9334 return NO_ERROR;
9335 }
9336 }
9337 LOGH("Invalid hdr mode value: %s",
9338 (hdrModeStr == NULL) ? "NULL" : hdrModeStr);
9339 return BAD_VALUE;
9340 }
9341
9342 /*===========================================================================
9343 * FUNCTION : setSeeMore
9344 *
9345 * DESCRIPTION: set see more value
9346 *
9347 * PARAMETERS :
9348 * @seeMoreStr : see more value string
9349 *
9350 * RETURN : int32_t type of status
9351 * NO_ERROR -- success
9352 * none-zero failure code
9353 *==========================================================================*/
setSeeMore(const char * seeMoreStr)9354 int32_t QCameraParameters::setSeeMore(const char *seeMoreStr)
9355 {
9356 int32_t rc = NO_ERROR;
9357
9358 LOGH("seeMoreStr =%s", seeMoreStr);
9359 if (seeMoreStr != NULL) {
9360 int value = lookupAttr(ON_OFF_MODES_MAP,
9361 PARAM_MAP_SIZE(ON_OFF_MODES_MAP),
9362 seeMoreStr);
9363 if (value != NAME_NOT_FOUND) {
9364 m_bSeeMoreOn = (value != 0);
9365
9366 // If SeeMore is enabled, enable StillMore for live snapshot
9367 // and disable tone map
9368 if (m_bSeeMoreOn) {
9369 m_bStillMoreOn = TRUE;
9370 if (!m_bLtmForSeeMoreEnabled) {
9371 rc = setToneMapMode(false, false);
9372 }
9373 if (rc != NO_ERROR) {
9374 LOGH("Failed to disable tone map during SeeMore");
9375 }
9376 } else {
9377 m_bStillMoreOn = FALSE;
9378 if (!m_bLtmForSeeMoreEnabled) {
9379 rc = setToneMapMode(true, false);
9380 }
9381 if (rc != NO_ERROR) {
9382 LOGH("Failed to enable tone map during SeeMore");
9383 }
9384 }
9385 updateParamEntry(KEY_QC_SEE_MORE, seeMoreStr);
9386 return NO_ERROR;
9387 }
9388 }
9389 LOGE("Invalid see more value: %s",
9390 (seeMoreStr == NULL) ? "NULL" : seeMoreStr);
9391 return BAD_VALUE;
9392 }
9393
9394 /*===========================================================================
9395 * FUNCTION : setStillMore
9396 *
9397 * DESCRIPTION: set still more value
9398 *
9399 * PARAMETERS :
9400 * @seeMoreStr : still more value string
9401 *
9402 * RETURN : int32_t type of status
9403 * NO_ERROR -- success
9404 * none-zero failure code
9405 *==========================================================================*/
setStillMore(const char * stillMoreStr)9406 int32_t QCameraParameters::setStillMore(const char *stillMoreStr)
9407 {
9408 LOGH("stillMoreStr =%s", stillMoreStr);
9409 if (stillMoreStr != NULL) {
9410 int value = lookupAttr(STILL_MORE_MODES_MAP, PARAM_MAP_SIZE(STILL_MORE_MODES_MAP),
9411 stillMoreStr);
9412 if (value != NAME_NOT_FOUND) {
9413 m_bStillMoreOn = (value != 0);
9414 updateParamEntry(KEY_QC_STILL_MORE, stillMoreStr);
9415
9416 return NO_ERROR;
9417 }
9418 }
9419 LOGE("Invalid still more value: %s",
9420 (stillMoreStr == NULL) ? "NULL" : stillMoreStr);
9421 return BAD_VALUE;
9422 }
9423
9424 /*===========================================================================
9425 * FUNCTION : setHDRNeed1x
9426 *
9427 * DESCRIPTION: set hdr need 1x value
9428 *
9429 * PARAMETERS :
9430 * @hdrModeStr : hdr need 1x value string
9431 *
9432 * RETURN : int32_t type of status
9433 * NO_ERROR -- success
9434 * none-zero failure code
9435 *==========================================================================*/
setHDRNeed1x(const char * hdrNeed1xStr)9436 int32_t QCameraParameters::setHDRNeed1x(const char *hdrNeed1xStr)
9437 {
9438 LOGH("hdrNeed1xStr =%s", hdrNeed1xStr);
9439 if (hdrNeed1xStr != NULL) {
9440 int value = lookupAttr(TRUE_FALSE_MODES_MAP, PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP),
9441 hdrNeed1xStr);
9442 if (value != NAME_NOT_FOUND) {
9443 updateParamEntry(KEY_QC_HDR_NEED_1X, hdrNeed1xStr);
9444 m_bHDR1xFrameEnabled = !strncmp(hdrNeed1xStr, VALUE_TRUE, strlen(VALUE_TRUE));
9445 m_bNeedRestart = true;
9446
9447 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HDR_NEED_1X,
9448 m_bHDR1xFrameEnabled)) {
9449 return BAD_VALUE;
9450 }
9451 return NO_ERROR;
9452 }
9453 }
9454
9455 LOGH("Invalid hdr need 1x value: %s",
9456 (hdrNeed1xStr == NULL) ? "NULL" : hdrNeed1xStr);
9457 return BAD_VALUE;
9458 }
9459
9460 /*===========================================================================
9461 * FUNCTION : setAEBracketing
9462 *
9463 * DESCRIPTION: enables AE bracketing
9464 *
9465 * PARAMETERS :
9466 *
9467 * RETURN : int32_t type of status
9468 * NO_ERROR -- success
9469 * none-zero failure code
9470 *==========================================================================*/
setAEBracketing()9471 int32_t QCameraParameters::setAEBracketing()
9472 {
9473 int32_t rc = NO_ERROR;
9474 if(initBatchUpdate(m_pParamBuf) < 0 ) {
9475 LOGE("Failed to initialize group update table");
9476 return BAD_TYPE;
9477 }
9478
9479 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HDR, m_AEBracketingClient)) {
9480 LOGE("Failed to update AE bracketing");
9481 return BAD_VALUE;
9482 }
9483
9484 rc = commitSetBatch();
9485 if (rc != NO_ERROR) {
9486 LOGE("Failed to configure AE bracketing");
9487 return rc;
9488 }
9489
9490 return rc;
9491 }
9492
9493 /*===========================================================================
9494 * FUNCTION : setHDRAEBracket
9495 *
9496 * DESCRIPTION: enables AE bracketing for HDR
9497 *
9498 * PARAMETERS :
9499 * @hdrBracket : HDR bracketing configuration
9500 *
9501 * RETURN : int32_t type of status
9502 * NO_ERROR -- success
9503 * none-zero failure code
9504 *==========================================================================*/
setHDRAEBracket(cam_exp_bracketing_t hdrBracket)9505 int32_t QCameraParameters::setHDRAEBracket(cam_exp_bracketing_t hdrBracket)
9506 {
9507 int32_t rc = NO_ERROR;
9508 if(initBatchUpdate(m_pParamBuf) < 0 ) {
9509 LOGE("Failed to initialize group update table");
9510 return BAD_TYPE;
9511 }
9512
9513 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HDR, hdrBracket)) {
9514 LOGE("Failed to update table");
9515 return BAD_TYPE;
9516 }
9517
9518 rc = commitSetBatch();
9519 if (rc != NO_ERROR) {
9520 LOGE("Failed to configure HDR bracketing");
9521 return rc;
9522 }
9523
9524 return rc;
9525 }
9526
9527 /*===========================================================================
9528 * FUNCTION : setCacheVideoBuffers
9529 *
9530 * DESCRIPTION: set cache video buffers value
9531 *
9532 * PARAMETERS :
9533 * @cacheVideoStr : cache video buffer value string
9534 *
9535 * RETURN : int32_t type of status
9536 * NO_ERROR -- success
9537 * none-zero failure code
9538 *==========================================================================*/
setCacheVideoBuffers(const char * cacheVideoBufStr)9539 int32_t QCameraParameters::setCacheVideoBuffers(const char *cacheVideoBufStr)
9540 {
9541 if (cacheVideoBufStr != NULL) {
9542 int8_t cacheVideoBuf = lookupAttr(ENABLE_DISABLE_MODES_MAP,
9543 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), cacheVideoBufStr);
9544 char prop[PROPERTY_VALUE_MAX];
9545 memset(prop, 0, sizeof(prop));
9546 property_get("persist.camera.mem.usecache", prop, "");
9547 if (strlen(prop) > 0) {
9548 cacheVideoBuf = atoi(prop);
9549 }
9550 if (cacheVideoBuf != NAME_NOT_FOUND) {
9551 const char *cacheStr = (strlen(prop)>0) ? prop : cacheVideoBufStr;
9552 LOGD("Setting video buffer %s",
9553 (cacheVideoBuf == 0) ? "UnCached" : "Cached");
9554 return updateParamEntry(KEY_QC_CACHE_VIDEO_BUFFERS, cacheStr);
9555 }
9556 LOGE("Cache video buffers not set correctly");
9557 }
9558 return BAD_VALUE;
9559 }
9560
9561
9562 /*===========================================================================
9563 * FUNCTION : setCacheVideoBuffers
9564 *
9565 * DESCRIPTION: Set buffers as Cache/Uncache Memory
9566 *
9567 * PARAMETERS :
9568 * @params : user setting parameters
9569 *
9570 * RETURN : int32_t type of status
9571 * NO_ERROR -- success
9572 * none-zero failure code
9573 *==========================================================================*/
setCacheVideoBuffers(const QCameraParameters & params)9574 int32_t QCameraParameters::setCacheVideoBuffers(const QCameraParameters& params)
9575 {
9576 const char *str = params.get(KEY_QC_CACHE_VIDEO_BUFFERS);;
9577 const char *prev_str = get(KEY_QC_CACHE_VIDEO_BUFFERS);
9578
9579 if (str != NULL) {
9580 if (prev_str == NULL ||
9581 strcmp(str, prev_str) != 0) {
9582 return setCacheVideoBuffers(str);
9583 }
9584 }
9585 return NO_ERROR;
9586 }
9587
9588 /*===========================================================================
9589 * FUNCTION : restoreAEBracket
9590 *
9591 * DESCRIPTION: restores client AE bracketing configuration after HDR is done
9592 *
9593 * PARAMETERS :
9594 *
9595 * RETURN : int32_t type of status
9596 * NO_ERROR -- success
9597 * none-zero failure code
9598 *==========================================================================*/
stopAEBracket()9599 int32_t QCameraParameters::stopAEBracket()
9600 {
9601 cam_exp_bracketing_t bracketing;
9602
9603 bracketing.mode = CAM_EXP_BRACKETING_OFF;
9604
9605 return setHDRAEBracket(bracketing);
9606 }
9607
9608 /*===========================================================================
9609 * FUNCTION : updateFlash
9610 *
9611 * DESCRIPTION: restores client flash configuration or disables flash
9612 *
9613 * PARAMETERS :
9614 * @commitSettings : flag indicating whether settings need to be commited
9615 *
9616 * RETURN : int32_t type of status
9617 * NO_ERROR -- success
9618 * none-zero failure code
9619 *==========================================================================*/
updateFlash(bool commitSettings)9620 int32_t QCameraParameters::updateFlash(bool commitSettings)
9621 {
9622 int32_t rc = NO_ERROR;
9623 int32_t value;
9624
9625 if (commitSettings) {
9626 if(initBatchUpdate(m_pParamBuf) < 0 ) {
9627 LOGE("Failed to initialize group update table");
9628 return BAD_TYPE;
9629 }
9630 }
9631
9632 if (isHDREnabled() || m_bAeBracketingEnabled || m_bAFBracketingOn ||
9633 m_bOptiZoomOn || m_bReFocusOn || m_LowLightLevel) {
9634 value = CAM_FLASH_MODE_OFF;
9635 } else if (m_bChromaFlashOn) {
9636 value = CAM_FLASH_MODE_ON;
9637 } else {
9638 value = mFlashValue;
9639 }
9640
9641 if (value != mFlashDaemonValue) {
9642 LOGD("Setting Flash value %d", value);
9643 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_LED_MODE, value)) {
9644 LOGE("Failed to set led mode");
9645 return BAD_VALUE;
9646 }
9647 mFlashDaemonValue = value;
9648 } else {
9649 rc = NO_ERROR;
9650 }
9651
9652 if (commitSettings) {
9653 rc = commitSetBatch();
9654 if (rc != NO_ERROR) {
9655 LOGE("Failed to configure HDR bracketing");
9656 return rc;
9657 }
9658 }
9659
9660 return rc;
9661 }
9662
9663 /*===========================================================================
9664 * FUNCTION : setRedeyeReduction
9665 *
9666 * DESCRIPTION: set red eye reduction value
9667 *
9668 * PARAMETERS :
9669 * @redeyeStr : red eye reduction value string
9670 *
9671 * RETURN : int32_t type of status
9672 * NO_ERROR -- success
9673 * none-zero failure code
9674 *==========================================================================*/
setRedeyeReduction(const char * redeyeStr)9675 int32_t QCameraParameters::setRedeyeReduction(const char *redeyeStr)
9676 {
9677 if (redeyeStr != NULL) {
9678 int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
9679 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), redeyeStr);
9680 if (value != NAME_NOT_FOUND) {
9681 LOGD("Setting RedEye Reduce value %s", redeyeStr);
9682 updateParamEntry(KEY_QC_REDEYE_REDUCTION, redeyeStr);
9683 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
9684 CAM_INTF_PARM_REDEYE_REDUCTION, value)) {
9685 return BAD_VALUE;
9686 }
9687 return NO_ERROR;
9688 }
9689 }
9690 LOGE("Invalid RedEye Reduce value: %s",
9691 (redeyeStr == NULL) ? "NULL" : redeyeStr);
9692 return BAD_VALUE;
9693 }
9694
9695 /*===========================================================================
9696 * FUNCTION : getDenoiseProcessPlate
9697 *
9698 * DESCRIPTION: query denoise process plate
9699 *
9700 * PARAMETERS : None
9701 *
9702 * RETURN : NR process plate vlaue
9703 *==========================================================================*/
9704 cam_denoise_process_type_t
getDenoiseProcessPlate(cam_intf_parm_type_t type)9705 QCameraParameters::getDenoiseProcessPlate(cam_intf_parm_type_t type)
9706 {
9707 char prop[PROPERTY_VALUE_MAX];
9708 memset(prop, 0, sizeof(prop));
9709 cam_denoise_process_type_t processPlate = CAM_WAVELET_DENOISE_CBCR_ONLY;
9710 if (CAM_INTF_PARM_WAVELET_DENOISE == type) {
9711 property_get("persist.denoise.process.plates", prop, "");
9712 } else if (CAM_INTF_PARM_TEMPORAL_DENOISE == type) {
9713 property_get("persist.tnr.process.plates", prop, "");
9714 } else {
9715 LOGW("Type not supported");
9716 prop[0] = '\0';
9717 }
9718 if (strlen(prop) > 0) {
9719 switch(atoi(prop)) {
9720 case 0:
9721 processPlate = CAM_WAVELET_DENOISE_YCBCR_PLANE;
9722 break;
9723 case 1:
9724 processPlate = CAM_WAVELET_DENOISE_CBCR_ONLY;
9725 break;
9726 case 2:
9727 processPlate = CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
9728 break;
9729 case 3:
9730 processPlate = CAM_WAVELET_DENOISE_STREAMLINED_CBCR;
9731 break;
9732 default:
9733 processPlate = CAM_WAVELET_DENOISE_CBCR_ONLY;
9734 break;
9735 }
9736 }
9737 return processPlate;
9738 }
9739
9740 /*===========================================================================
9741 * FUNCTION : setWaveletDenoise
9742 *
9743 * DESCRIPTION: set wavelet denoise value
9744 *
9745 * PARAMETERS :
9746 * @wnrStr : wavelet denoise value string
9747 *
9748 * RETURN : int32_t type of status
9749 * NO_ERROR -- success
9750 * none-zero failure code
9751 *==========================================================================*/
setWaveletDenoise(const char * wnrStr)9752 int32_t QCameraParameters::setWaveletDenoise(const char *wnrStr)
9753 {
9754 if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_DENOISE2D) == 0){
9755 LOGH("WNR is not supported");
9756 return NO_ERROR;
9757 }
9758
9759 if (wnrStr != NULL) {
9760 int value = lookupAttr(DENOISE_ON_OFF_MODES_MAP,
9761 PARAM_MAP_SIZE(DENOISE_ON_OFF_MODES_MAP), wnrStr);
9762 if (value != NAME_NOT_FOUND) {
9763 updateParamEntry(KEY_QC_DENOISE, wnrStr);
9764
9765 cam_denoise_param_t temp;
9766 memset(&temp, 0, sizeof(temp));
9767 temp.denoise_enable = (uint8_t)value;
9768 m_bWNROn = (value != 0);
9769 if (m_bWNROn) {
9770 temp.process_plates = getDenoiseProcessPlate(CAM_INTF_PARM_WAVELET_DENOISE);
9771 }
9772 LOGD("Denoise enable=%d, plates=%d",
9773 temp.denoise_enable, temp.process_plates);
9774 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_WAVELET_DENOISE, temp)) {
9775 return BAD_VALUE;
9776 }
9777 return NO_ERROR;
9778 }
9779 }
9780 LOGE("Invalid Denoise value: %s", (wnrStr == NULL) ? "NULL" : wnrStr);
9781 return BAD_VALUE;
9782 }
9783
9784 /*===========================================================================
9785 * FUNCTION : setRdiMode
9786 *
9787 * DESCRIPTION: set rdi mode value
9788 *
9789 * PARAMETERS :
9790 * @str : rdi mode value string
9791 *
9792 * RETURN : int32_t type of status
9793 * NO_ERROR -- success
9794 * none-zero failure code
9795 *==========================================================================*/
setRdiMode(const char * str)9796 int32_t QCameraParameters::setRdiMode(const char *str)
9797 {
9798 LOGD("RDI_DEBUG rdi mode value: %s", str);
9799
9800 if (str != NULL) {
9801 int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
9802 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), str);
9803 if (value != NAME_NOT_FOUND) {
9804 updateParamEntry(KEY_QC_RDI_MODE, str);
9805 m_bRdiMode = (value == 0) ? false : true;
9806 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_RDI_MODE, value)) {
9807 return BAD_VALUE;
9808 }
9809 return NO_ERROR;
9810 }
9811 }
9812 LOGE("Invalid rdi mode value: %s", (str == NULL) ? "NULL" : str);
9813 return BAD_VALUE;
9814 }
9815
9816
9817 /*===========================================================================
9818 * FUNCTION : setSecureMode
9819 *
9820 * DESCRIPTION: set secure mode value
9821 *
9822 * PARAMETERS :
9823 * @str : secure mode value string
9824 *
9825 * RETURN : int32_t type of status
9826 * NO_ERROR -- success
9827 * none-zero failure code
9828 *==========================================================================*/
setSecureMode(const char * str)9829 int32_t QCameraParameters::setSecureMode(const char *str)
9830 {
9831 LOGD("Secure mode value: %s", str);
9832
9833 if (str != NULL) {
9834 int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
9835 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), str);
9836 if (value != NAME_NOT_FOUND) {
9837 updateParamEntry(KEY_QC_SECURE_MODE, str);
9838 m_bSecureMode = (value == 0)? false : true;
9839 return NO_ERROR;
9840 }
9841 }
9842 LOGE("Invalid Secure mode value: %s",
9843 (str == NULL) ? "NULL" : str);
9844 return BAD_VALUE;
9845 }
9846
9847 /*===========================================================================
9848 * FUNCTION : getStreamRotation
9849 *
9850 * DESCRIPTION: get stream rotation by its type
9851 *
9852 * PARAMETERS :
9853 * @streamType : stream type
9854 * @featureConfig : stream feature config structure
9855 * @dim : stream dimension
9856 *
9857 * RETURN : int32_t type of status
9858 * NO_ERROR -- success
9859 * none-zero failure code
9860 *==========================================================================*/
getStreamRotation(cam_stream_type_t streamType,cam_pp_feature_config_t & featureConfig,cam_dimension_t & dim)9861 int32_t QCameraParameters::getStreamRotation(cam_stream_type_t streamType,
9862 cam_pp_feature_config_t &featureConfig,
9863 cam_dimension_t &dim)
9864 {
9865 int32_t ret = NO_ERROR;
9866 const char *str = get(KEY_QC_VIDEO_ROTATION);
9867 int rotationParam = lookupAttr(VIDEO_ROTATION_MODES_MAP,
9868 PARAM_MAP_SIZE(VIDEO_ROTATION_MODES_MAP), str);
9869 featureConfig.rotation = ROTATE_0;
9870 int swapDim = 0;
9871 switch (streamType) {
9872 case CAM_STREAM_TYPE_VIDEO:
9873 switch(rotationParam) {
9874 case 90:
9875 featureConfig.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
9876 featureConfig.rotation = ROTATE_90;
9877 swapDim = 1;
9878 break;
9879 case 180:
9880 featureConfig.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
9881 featureConfig.rotation = ROTATE_180;
9882 break;
9883 case 270:
9884 featureConfig.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
9885 featureConfig.rotation = ROTATE_270;
9886 swapDim = 1;
9887 break;
9888 default:
9889 featureConfig.rotation = ROTATE_0;
9890 }
9891 break;
9892 case CAM_STREAM_TYPE_PREVIEW:
9893 case CAM_STREAM_TYPE_POSTVIEW:
9894 case CAM_STREAM_TYPE_SNAPSHOT:
9895 case CAM_STREAM_TYPE_RAW:
9896 case CAM_STREAM_TYPE_METADATA:
9897 case CAM_STREAM_TYPE_OFFLINE_PROC:
9898 case CAM_STREAM_TYPE_DEFAULT:
9899 default:
9900 break;
9901 }
9902
9903 if (swapDim > 0) {
9904 int w = 0;
9905 w = dim.width;
9906 dim.width = dim.height;
9907 dim.height = w;
9908 }
9909 return ret;
9910 }
9911
9912 /*===========================================================================
9913 * FUNCTION : getStreamFormat
9914 *
9915 * DESCRIPTION: get stream format by its type
9916 *
9917 * PARAMETERS :
9918 * @streamType : [input] stream type
9919 * @format : [output] stream format
9920 *
9921 * RETURN : int32_t type of status
9922 * NO_ERROR -- success
9923 * none-zero failure code
9924 *==========================================================================*/
getStreamFormat(cam_stream_type_t streamType,cam_format_t & format)9925 int32_t QCameraParameters::getStreamFormat(cam_stream_type_t streamType,
9926 cam_format_t &format)
9927 {
9928 int32_t ret = NO_ERROR;
9929 format = CAM_FORMAT_MAX;
9930 switch (streamType) {
9931 case CAM_STREAM_TYPE_PREVIEW:
9932 if (!isUBWCEnabled()) {
9933 #if VENUS_PRESENT
9934 cam_dimension_t preview;
9935 cam_dimension_t video;
9936 getStreamDimension(CAM_STREAM_TYPE_VIDEO , video);
9937 getStreamDimension(CAM_STREAM_TYPE_PREVIEW, preview);
9938 if (getRecordingHintValue() == true &&
9939 video.width == preview.width &&
9940 video.height == preview.height &&
9941 mPreviewFormat == CAM_FORMAT_YUV_420_NV21) {
9942 format = CAM_FORMAT_YUV_420_NV21_VENUS;
9943 } else
9944 #endif
9945 format = mPreviewFormat;
9946 } else {
9947 format = mPreviewFormat;
9948 }
9949 break;
9950 case CAM_STREAM_TYPE_POSTVIEW:
9951 case CAM_STREAM_TYPE_CALLBACK:
9952 format = mAppPreviewFormat;
9953 break;
9954 case CAM_STREAM_TYPE_ANALYSIS:
9955 cam_analysis_info_t analysisInfo;
9956 cam_feature_mask_t featureMask;
9957
9958 featureMask = 0;
9959 getStreamPpMask(CAM_STREAM_TYPE_ANALYSIS, featureMask);
9960 ret = getAnalysisInfo(
9961 ((getRecordingHintValue() == true) && fdModeInVideo()),
9962 FALSE,
9963 featureMask,
9964 &analysisInfo);
9965 if (ret != NO_ERROR) {
9966 LOGE("getAnalysisInfo failed, ret = %d", ret);
9967 return ret;
9968 }
9969
9970 if (analysisInfo.hw_analysis_supported &&
9971 analysisInfo.analysis_format == CAM_FORMAT_Y_ONLY) {
9972 format = analysisInfo.analysis_format;
9973 } else {
9974 if (analysisInfo.hw_analysis_supported) {
9975 LOGW("Invalid analysis_format %d\n",
9976 analysisInfo.analysis_format);
9977 }
9978 format = mAppPreviewFormat;
9979 }
9980 break;
9981 case CAM_STREAM_TYPE_SNAPSHOT:
9982 if ( mPictureFormat == CAM_FORMAT_YUV_422_NV16 ) {
9983 format = CAM_FORMAT_YUV_422_NV16;
9984 } else {
9985 char prop[PROPERTY_VALUE_MAX];
9986 int snapshotFormat;
9987 memset(prop, 0, sizeof(prop));
9988 property_get("persist.camera.snap.format", prop, "0");
9989 snapshotFormat = atoi(prop);
9990 if(snapshotFormat == 1) {
9991 format = CAM_FORMAT_YUV_422_NV61;
9992 } else {
9993 format = CAM_FORMAT_YUV_420_NV21;
9994 }
9995 }
9996 break;
9997 case CAM_STREAM_TYPE_VIDEO:
9998 if (isUBWCEnabled()) {
9999 char prop[PROPERTY_VALUE_MAX];
10000 int pFormat;
10001 memset(prop, 0, sizeof(prop));
10002 property_get("persist.camera.video.ubwc", prop, "1");
10003 pFormat = atoi(prop);
10004 if (pFormat == 1) {
10005 format = CAM_FORMAT_YUV_420_NV12_UBWC;
10006 } else {
10007 format = CAM_FORMAT_YUV_420_NV21_VENUS;
10008 }
10009 } else {
10010 #if VENUS_PRESENT
10011 format = CAM_FORMAT_YUV_420_NV21_VENUS;
10012 #else
10013 format = CAM_FORMAT_YUV_420_NV21;
10014 #endif
10015 }
10016 break;
10017 case CAM_STREAM_TYPE_RAW:
10018 if ((isRdiMode()) || (getofflineRAW())) {
10019 format = m_pCapability->rdi_mode_stream_fmt;
10020 } else if (mPictureFormat >= CAM_FORMAT_YUV_RAW_8BIT_YUYV) {
10021 format = (cam_format_t)mPictureFormat;
10022 } else {
10023 char raw_format[PROPERTY_VALUE_MAX];
10024 int rawFormat;
10025 memset(raw_format, 0, sizeof(raw_format));
10026 /*Default value is CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GBRG*/
10027 property_get("persist.camera.raw.format", raw_format, "17");
10028 rawFormat = atoi(raw_format);
10029 format = (cam_format_t)rawFormat;
10030 LOGH("Raw stream format %d bundled with snapshot",
10031 format);
10032 }
10033 break;
10034 case CAM_STREAM_TYPE_METADATA:
10035 case CAM_STREAM_TYPE_OFFLINE_PROC:
10036 case CAM_STREAM_TYPE_DEFAULT:
10037 default:
10038 break;
10039 }
10040
10041 LOGD("Stream type = %d Stream Format = %d", streamType, format);
10042 return ret;
10043 }
10044
10045 /*===========================================================================
10046 * FUNCTION : getFlipMode
10047 *
10048 * DESCRIPTION: get flip mode
10049 *
10050 * PARAMETERS :
10051 * @cam_intf_parm_type_t : [input] stream type
10052 *
10053 * RETURN : int type of flip mode
10054 * 0 - no filp
10055 * 1 - FLIP_H
10056 * 2 - FLIP_V
10057 * 3 - FLIP_H | FLIP_V
10058 *==========================================================================*/
getFlipMode(cam_stream_type_t type)10059 int QCameraParameters::getFlipMode(cam_stream_type_t type)
10060 {
10061 const char *str = NULL;
10062 int flipMode = 0; // no flip
10063
10064 switch(type){
10065 case CAM_STREAM_TYPE_PREVIEW:
10066 if (!isRdiMode()) {
10067 str = get(KEY_QC_PREVIEW_FLIP);
10068 }
10069 break;
10070 case CAM_STREAM_TYPE_VIDEO:
10071 str = get(KEY_QC_VIDEO_FLIP);
10072 break;
10073 case CAM_STREAM_TYPE_SNAPSHOT:
10074 case CAM_STREAM_TYPE_POSTVIEW:
10075 str = get(KEY_QC_SNAPSHOT_PICTURE_FLIP);
10076 break;
10077 default:
10078 LOGD("No flip mode for stream type %d", type);
10079 break;
10080 }
10081
10082 if(str != NULL){
10083 //Need give corresponding filp value based on flip mode strings
10084 int value = lookupAttr(FLIP_MODES_MAP, PARAM_MAP_SIZE(FLIP_MODES_MAP), str);
10085 if(value != NAME_NOT_FOUND)
10086 flipMode = value;
10087 }
10088
10089 LOGH("the filp mode of stream type %d is %d .", type, flipMode);
10090 return flipMode;
10091 }
10092
10093 /*===========================================================================
10094 * FUNCTION : isSnapshotFDNeeded
10095 *
10096 * DESCRIPTION: check whether Face Detection Metadata is needed
10097 *
10098 * PARAMETERS : none
10099 *
10100 * RETURN : bool type of status
10101 * 0 - need
10102 * 1 - not need
10103 *==========================================================================*/
isSnapshotFDNeeded()10104 bool QCameraParameters::isSnapshotFDNeeded()
10105 {
10106 return getInt(KEY_QC_SNAPSHOT_FD_DATA);
10107 }
10108
10109 /*===========================================================================
10110 * FUNCTION : getStreamDimension
10111 *
10112 * DESCRIPTION: get stream dimension by its type
10113 *
10114 * PARAMETERS :
10115 * @streamType : [input] stream type
10116 * @dim : [output] stream dimension
10117 *
10118 * RETURN : int32_t type of status
10119 * NO_ERROR -- success
10120 * none-zero failure code
10121 *==========================================================================*/
getStreamDimension(cam_stream_type_t streamType,cam_dimension_t & dim)10122 int32_t QCameraParameters::getStreamDimension(cam_stream_type_t streamType,
10123 cam_dimension_t &dim)
10124 {
10125 int32_t ret = NO_ERROR;
10126 memset(&dim, 0, sizeof(cam_dimension_t));
10127
10128 switch (streamType) {
10129 case CAM_STREAM_TYPE_PREVIEW:
10130 case CAM_STREAM_TYPE_CALLBACK:
10131 getPreviewSize(&dim.width, &dim.height);
10132 break;
10133 case CAM_STREAM_TYPE_POSTVIEW:
10134 getPreviewSize(&dim.width, &dim.height);
10135 break;
10136 case CAM_STREAM_TYPE_SNAPSHOT:
10137 if (isPostProcScaling()) {
10138 getMaxPicSize(dim);
10139 } else if (getRecordingHintValue()) {
10140 // live snapshot
10141 getLiveSnapshotSize(dim);
10142 } else {
10143 getPictureSize(&dim.width, &dim.height);
10144 }
10145 break;
10146 case CAM_STREAM_TYPE_VIDEO:
10147 getVideoSize(&dim.width, &dim.height);
10148 break;
10149 case CAM_STREAM_TYPE_RAW:
10150 //dim = m_pCapability->raw_dim;
10151 getRawSize(dim);
10152 break;
10153 case CAM_STREAM_TYPE_METADATA:
10154 dim.width = (int32_t)sizeof(metadata_buffer_t);
10155 dim.height = 1;
10156 break;
10157 case CAM_STREAM_TYPE_OFFLINE_PROC:
10158 if (isPostProcScaling()) {
10159 if (getRecordingHintValue()) {
10160 // live snapshot
10161 getLiveSnapshotSize(dim);
10162 } else {
10163 getPictureSize(&dim.width, &dim.height);
10164 }
10165 }
10166 break;
10167 case CAM_STREAM_TYPE_ANALYSIS:
10168 cam_dimension_t prv_dim, max_dim;
10169
10170 /* Analysis stream need aspect ratio as preview stream */
10171 getPreviewSize(&prv_dim.width, &prv_dim.height);
10172
10173 cam_analysis_info_t analysisInfo;
10174 cam_feature_mask_t featureMask;
10175
10176 featureMask = 0;
10177 getStreamPpMask(CAM_STREAM_TYPE_ANALYSIS, featureMask);
10178 ret = getAnalysisInfo(
10179 ((getRecordingHintValue() == true) && fdModeInVideo()),
10180 FALSE,
10181 featureMask,
10182 &analysisInfo);
10183 if (ret != NO_ERROR) {
10184 LOGE("getAnalysisInfo failed, ret = %d", ret);
10185 return ret;
10186 }
10187
10188 max_dim.width = analysisInfo.analysis_max_res.width;
10189 max_dim.height = analysisInfo.analysis_max_res.height;
10190
10191 if (prv_dim.width > max_dim.width || prv_dim.height > max_dim.height) {
10192 double max_ratio, requested_ratio;
10193
10194 max_ratio = (double)max_dim.width / (double)max_dim.height;
10195 requested_ratio = (double)prv_dim.width / (double)prv_dim.height;
10196
10197 if (max_ratio < requested_ratio) {
10198 dim.width = max_dim.width;
10199 dim.height = (int32_t)((double)dim.width / requested_ratio);
10200 } else {
10201 dim.height = max_dim.height;
10202 dim.width = (int32_t)((double)max_dim.height * requested_ratio);
10203 }
10204 dim.width &= ~0x1;
10205 dim.height &= ~0x1;
10206 } else {
10207 dim.width = prv_dim.width;
10208 dim.height = prv_dim.height;
10209 }
10210 break;
10211 case CAM_STREAM_TYPE_DEFAULT:
10212 default:
10213 LOGE("no dimension for unsupported stream type %d",
10214 streamType);
10215 ret = BAD_VALUE;
10216 break;
10217 }
10218
10219 LOGD("Stream type = %d Stream Dimension = %d X %d",
10220 streamType, dim.width, dim.height);
10221 return ret;
10222 }
10223
10224 /*===========================================================================
10225 * FUNCTION : getParameters
10226 *
10227 * DESCRIPTION: Return a C string containing the parameters
10228 *
10229 * PARAMETERS : none
10230 *
10231 * RETURN : a string containing parameter pairs
10232 *==========================================================================*/
getParameters()10233 char* QCameraParameters::getParameters()
10234 {
10235 char* strParams = NULL;
10236 String8 str;
10237
10238 int cur_width, cur_height;
10239 //Need take care Scale picture size
10240 if(m_reprocScaleParam.isScaleEnabled() &&
10241 m_reprocScaleParam.isUnderScaling()){
10242 int scale_width, scale_height;
10243
10244 m_reprocScaleParam.getPicSizeFromAPK(scale_width,scale_height);
10245 getPictureSize(&cur_width, &cur_height);
10246
10247 String8 pic_size;
10248 char buffer[32];
10249 snprintf(buffer, sizeof(buffer), "%dx%d", scale_width, scale_height);
10250 pic_size.append(buffer);
10251 set(CameraParameters::KEY_PICTURE_SIZE, pic_size);
10252 }
10253
10254 str = flatten();
10255 strParams = (char *)malloc(sizeof(char)*(str.length()+1));
10256 if(strParams != NULL){
10257 memset(strParams, 0, sizeof(char)*(str.length()+1));
10258 strlcpy(strParams, str.string(), str.length()+1);
10259 strParams[str.length()] = 0;
10260 }
10261
10262 if(m_reprocScaleParam.isScaleEnabled() &&
10263 m_reprocScaleParam.isUnderScaling()){
10264 //need set back picture size
10265 String8 pic_size;
10266 char buffer[32];
10267 snprintf(buffer, sizeof(buffer), "%dx%d", cur_width, cur_height);
10268 pic_size.append(buffer);
10269 set(CameraParameters::KEY_PICTURE_SIZE, pic_size);
10270 }
10271 return strParams;
10272 }
10273
10274 #ifdef TARGET_TS_MAKEUP
10275 /*===========================================================================
10276 * FUNCTION : getTsMakeupInfo
10277 *
10278 * DESCRIPTION: get TsMakeup info
10279 *
10280 * PARAMETERS :
10281 * @whiteLevel : [output] white level
10282 * @cleanLevel : [output] clean level
10283
10284 * RETURN : Whether makeup is enabled or not
10285 *==========================================================================*/
getTsMakeupInfo(int & whiteLevel,int & cleanLevel) const10286 bool QCameraParameters::getTsMakeupInfo(int &whiteLevel, int &cleanLevel) const
10287 {
10288 const char* pch_makeup_enable = get(QCameraParameters::KEY_TS_MAKEUP);
10289 if (pch_makeup_enable == NULL) {
10290 LOGH("pch_makeup_enable = null");
10291 return false;
10292 }
10293 bool enableMakeup =
10294 (strcmp(pch_makeup_enable,"On") == 0);
10295 if (enableMakeup) {
10296 whiteLevel = getInt(QCameraParameters::KEY_TS_MAKEUP_WHITEN);
10297 cleanLevel = getInt(QCameraParameters::KEY_TS_MAKEUP_CLEAN);
10298 }
10299 return enableMakeup;
10300 }
10301 #endif
10302
10303 /*===========================================================================
10304 * FUNCTION : getPreviewHalPixelFormat
10305 *
10306 * DESCRIPTION: get preview HAL pixel format
10307 *
10308 * PARAMETERS : none
10309 *
10310 * RETURN : HAL pixel format
10311 *==========================================================================*/
getPreviewHalPixelFormat()10312 int QCameraParameters::getPreviewHalPixelFormat()
10313 {
10314 int32_t halPixelFormat;
10315 cam_format_t fmt;
10316 getStreamFormat(CAM_STREAM_TYPE_PREVIEW,fmt);
10317
10318 switch (fmt) {
10319 case CAM_FORMAT_YUV_420_NV12:
10320 halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
10321 break;
10322 case CAM_FORMAT_YUV_420_NV21:
10323 halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
10324 break;
10325 case CAM_FORMAT_YUV_420_NV21_ADRENO:
10326 halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
10327 break;
10328 case CAM_FORMAT_YUV_420_YV12:
10329 halPixelFormat = HAL_PIXEL_FORMAT_YV12;
10330 break;
10331 case CAM_FORMAT_YUV_420_NV12_VENUS:
10332 halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS;
10333 break;
10334 case CAM_FORMAT_YUV_420_NV21_VENUS:
10335 halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS;
10336 break;
10337 case CAM_FORMAT_YUV_420_NV12_UBWC:
10338 halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC;
10339 break;
10340 case CAM_FORMAT_YUV_422_NV16:
10341 case CAM_FORMAT_YUV_422_NV61:
10342 default:
10343 halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
10344 break;
10345 }
10346 LOGH("format %d\n", halPixelFormat);
10347 return halPixelFormat;
10348 }
10349
10350 /*===========================================================================
10351 * FUNCTION : getthumbnailSize
10352 *
10353 * DESCRIPTION: get thumbnail size
10354 *
10355 * PARAMETERS :
10356 * @width, height : [output] thumbnail width and height
10357 *
10358 * RETURN : none
10359 *==========================================================================*/
getThumbnailSize(int * width,int * height) const10360 void QCameraParameters::getThumbnailSize(int *width, int *height) const
10361 {
10362 *width = getInt(KEY_JPEG_THUMBNAIL_WIDTH);
10363 *height = getInt(KEY_JPEG_THUMBNAIL_HEIGHT);
10364 }
10365
10366 /*===========================================================================
10367 * FUNCTION : getZSLBurstInterval
10368 *
10369 * DESCRIPTION: get ZSL burst interval setting
10370 *
10371 * PARAMETERS : none
10372 *
10373 * RETURN : ZSL burst interval value
10374 *==========================================================================*/
getZSLBurstInterval()10375 uint8_t QCameraParameters::getZSLBurstInterval()
10376 {
10377 int interval = getInt(KEY_QC_ZSL_BURST_INTERVAL);
10378 if (interval < 0) {
10379 interval = 1;
10380 }
10381 return (uint8_t)interval;
10382 }
10383
10384 /*===========================================================================
10385 * FUNCTION : getZSLQueueDepth
10386 *
10387 * DESCRIPTION: get ZSL queue depth
10388 *
10389 * PARAMETERS : none
10390 *
10391 * RETURN : ZSL queue depth value
10392 *==========================================================================*/
getZSLQueueDepth()10393 uint8_t QCameraParameters::getZSLQueueDepth()
10394 {
10395 int qdepth = getInt(KEY_QC_ZSL_QUEUE_DEPTH);
10396 if (qdepth < 0) {
10397 qdepth = 2;
10398 }
10399 if (isLowMemoryDevice()) {
10400 qdepth = 1;
10401 }
10402 return (uint8_t)qdepth;
10403 }
10404
10405 /*===========================================================================
10406 * FUNCTION : getZSLBackLookCount
10407 *
10408 * DESCRIPTION: get ZSL backlook count setting
10409 *
10410 * PARAMETERS : none
10411 *
10412 * RETURN : ZSL backlook count value
10413 *==========================================================================*/
getZSLBackLookCount()10414 uint8_t QCameraParameters::getZSLBackLookCount()
10415 {
10416 int look_back = getInt(KEY_QC_ZSL_BURST_LOOKBACK);
10417 if (look_back < 0) {
10418 look_back = 2;
10419 }
10420 if (isLowMemoryDevice()) {
10421 look_back = 1;
10422 }
10423 return (uint8_t)look_back;
10424 }
10425 /*===========================================================================
10426 * FUNCTION : isVideoBuffersCached
10427 *
10428 * DESCRIPTION: Query buffers are cached /un cached
10429 *
10430 * PARAMETERS : None
10431 *
10432 * RETURN : buffers are cached /un cached
10433 *==========================================================================*/
isVideoBuffersCached()10434 bool QCameraParameters::isVideoBuffersCached()
10435 {
10436 const char *cached_mem = get(KEY_QC_CACHE_VIDEO_BUFFERS);
10437 if (cached_mem != NULL) {
10438 if (strcmp(cached_mem, VALUE_DISABLE) != 0) {
10439 return true;
10440 }
10441 }
10442 return false;
10443 }
10444 /*===========================================================================
10445 * FUNCTION : getZSLMaxUnmatchedFrames
10446 *
10447 * DESCRIPTION: get allowed ZSL max unmatched frames number
10448 *
10449 * PARAMETERS : none
10450 *
10451 * RETURN : ZSL backlook count value
10452 *==========================================================================*/
getMaxUnmatchedFramesInQueue()10453 uint8_t QCameraParameters::getMaxUnmatchedFramesInQueue()
10454 {
10455 return (uint8_t)(m_pCapability->min_num_pp_bufs);
10456 }
10457
10458 /*===========================================================================
10459 * FUNCTION : setRecordingHintValue
10460 *
10461 * DESCRIPTION: set recording hint
10462 *
10463 * PARAMETERS :
10464 * @value : video hint value
10465 *
10466 * RETURN : int32_t type of status
10467 * NO_ERROR -- success
10468 * none-zero failure code
10469 *==========================================================================*/
setRecordingHintValue(int32_t value)10470 int QCameraParameters::setRecordingHintValue(int32_t value)
10471 {
10472 LOGH("VideoHint = %d", value);
10473 bool newValue = (value > 0)? true : false;
10474
10475 if ( m_bRecordingHint != newValue ) {
10476 m_bNeedRestart = true;
10477 m_bRecordingHint_new = newValue;
10478 } else {
10479 m_bRecordingHint_new = m_bRecordingHint;
10480 }
10481 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_RECORDING_HINT, value)) {
10482 return BAD_VALUE;
10483 }
10484
10485 return NO_ERROR;
10486 }
10487
10488 /*===========================================================================
10489 * FUNCTION : getNumOfSnapshots
10490 *
10491 * DESCRIPTION: get number of snapshot per shutter
10492 *
10493 * PARAMETERS : none
10494 *
10495 * RETURN : number of snapshot per shutter
10496 *==========================================================================*/
getNumOfSnapshots()10497 uint8_t QCameraParameters::getNumOfSnapshots()
10498 {
10499 uint8_t numOfSnapshot = 1;
10500 int val = getInt(KEY_QC_NUM_SNAPSHOT_PER_SHUTTER);
10501 if (0 < val) {
10502 numOfSnapshot = (uint8_t)val;
10503 }
10504
10505 return (uint8_t)numOfSnapshot;
10506 }
10507
10508 /*===========================================================================
10509 * FUNCTION : getBurstCountForAdvancedCapture
10510 *
10511 * DESCRIPTION: get burst count for advanced capture.
10512 *
10513 * PARAMETERS : none
10514 *
10515 * RETURN : number of snapshot required for advanced capture.
10516 *==========================================================================*/
getBurstCountForAdvancedCapture()10517 uint8_t QCameraParameters::getBurstCountForAdvancedCapture()
10518 {
10519 uint32_t burstCount = 0;
10520 if (isUbiFocusEnabled()) {
10521 //number of snapshots required for Ubi Focus.
10522 burstCount = m_pCapability->ubifocus_af_bracketing_need.burst_count;
10523 } else if (isUbiRefocus()) {
10524 //number of snapshots required for Opti Zoom.
10525 burstCount = m_pCapability->refocus_af_bracketing_need.burst_count;
10526 } else if (isOptiZoomEnabled()) {
10527 //number of snapshots required for Opti Zoom.
10528 burstCount = m_pCapability->opti_zoom_settings_need.burst_count;
10529 } else if (isChromaFlashEnabled()) {
10530 //number of snapshots required for Chroma Flash.
10531 burstCount = m_pCapability->chroma_flash_settings_need.burst_count;
10532 } else if (isStillMoreEnabled()) {
10533 //number of snapshots required for Still More.
10534 if (isSeeMoreEnabled()) {
10535 burstCount = 1;
10536 } else if ((m_stillmore_config.burst_count >=
10537 m_pCapability->stillmore_settings_need.min_burst_count) &&
10538 (m_stillmore_config.burst_count <=
10539 m_pCapability->stillmore_settings_need.max_burst_count)) {
10540 burstCount = m_stillmore_config.burst_count;
10541 } else {
10542 burstCount = m_pCapability->stillmore_settings_need.burst_count;
10543 }
10544 } else if (isHDREnabled()) {
10545 //number of snapshots required for HDR.
10546 burstCount = m_pCapability->hdr_bracketing_setting.num_frames;
10547 } else if (isAEBracketEnabled()) {
10548 burstCount = 0;
10549 const char *str_val = m_AEBracketingClient.values;
10550 if ((str_val != NULL) && (strlen(str_val) > 0)) {
10551 char prop[PROPERTY_VALUE_MAX];
10552 memset(prop, 0, sizeof(prop));
10553 strlcpy(prop, str_val, PROPERTY_VALUE_MAX);
10554 char *saveptr = NULL;
10555 char *token = strtok_r(prop, ",", &saveptr);
10556 while (token != NULL) {
10557 token = strtok_r(NULL, ",", &saveptr);
10558 burstCount++;
10559 }
10560 }
10561 }
10562
10563 if (burstCount <= 0) {
10564 burstCount = getNumOfSnapshots();
10565 }
10566
10567 LOGH("Snapshot burst count = %d", burstCount);
10568 return (uint8_t)burstCount;
10569 }
10570
10571 /*===========================================================================
10572 * FUNCTION : getNumOfRetroSnapshots
10573 *
10574 * DESCRIPTION: get number of retro active snapshots per shutter
10575 *
10576 * PARAMETERS : none
10577 *
10578 * RETURN : number of retro active snapshots per shutter
10579 *==========================================================================*/
getNumOfRetroSnapshots()10580 uint8_t QCameraParameters::getNumOfRetroSnapshots()
10581 {
10582 int numOfRetroSnapshots = getInt(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER);
10583 if (numOfRetroSnapshots < 0) {
10584 numOfRetroSnapshots = 0;
10585 }
10586 LOGH("numOfRetroSnaps - %d", numOfRetroSnapshots);
10587 return (uint8_t)numOfRetroSnapshots;
10588 }
10589
10590 /*===========================================================================
10591 * FUNCTION : getNumOfExtraHDRInBufsIfNeeded
10592 *
10593 * DESCRIPTION: get number of extra input buffers needed by HDR
10594 *
10595 * PARAMETERS : none
10596 *
10597 * RETURN : number of extra buffers needed by HDR; 0 if not HDR enabled
10598 *==========================================================================*/
getNumOfExtraHDRInBufsIfNeeded()10599 uint8_t QCameraParameters::getNumOfExtraHDRInBufsIfNeeded()
10600 {
10601 unsigned int numOfBufs = 0;
10602
10603 if (isHDREnabled()) {
10604 numOfBufs += m_pCapability->hdr_bracketing_setting.num_frames;
10605 if (isHDR1xFrameEnabled() && isHDR1xExtraBufferNeeded()) {
10606 numOfBufs++;
10607 }
10608 numOfBufs--; // Only additional buffers need to be returned
10609 }
10610
10611 return (uint8_t)(numOfBufs);
10612 }
10613
10614 /*===========================================================================
10615 * FUNCTION : getNumOfExtraHDROutBufsIfNeeded
10616 *
10617 * DESCRIPTION: get number of extra output buffers needed by HDR
10618 *
10619 * PARAMETERS : none
10620 *
10621 * RETURN : number of extra buffers needed by HDR; 0 if not HDR enabled
10622 *==========================================================================*/
getNumOfExtraHDROutBufsIfNeeded()10623 uint8_t QCameraParameters::getNumOfExtraHDROutBufsIfNeeded()
10624 {
10625 int numOfBufs = 0;
10626
10627 if (isHDREnabled() && isHDR1xFrameEnabled()) {
10628 numOfBufs++;
10629 }
10630
10631 return (uint8_t)(numOfBufs);
10632 }
10633
10634 /*===========================================================================
10635 * FUNCTION : getJpegQuality
10636 *
10637 * DESCRIPTION: get jpeg encoding quality
10638 *
10639 * PARAMETERS : none
10640 *
10641 * RETURN : jpeg encoding quality
10642 *==========================================================================*/
getJpegQuality()10643 uint32_t QCameraParameters::getJpegQuality()
10644 {
10645 int quality = getInt(KEY_JPEG_QUALITY);
10646 if (quality < 0) {
10647 quality = 85; // set to default quality value
10648 }
10649 return (uint32_t)quality;
10650 }
10651
10652 /*===========================================================================
10653 * FUNCTION : getRotation
10654 *
10655 * DESCRIPTION: get application configured rotation
10656 *
10657 * PARAMETERS : none
10658 *
10659 * RETURN : rotation value
10660 *==========================================================================*/
getRotation()10661 uint32_t QCameraParameters::getRotation() {
10662 int rotation = 0;
10663
10664 //If exif rotation is set, do not rotate captured image
10665 if (!useJpegExifRotation()) {
10666 rotation = mRotation;
10667 if (rotation < 0) {
10668 rotation = 0;
10669 }
10670 }
10671 return (uint32_t)rotation;
10672 }
10673
10674 /*===========================================================================
10675 * FUNCTION : setJpegRotation
10676 *
10677 * DESCRIPTION: set jpeg rotation value configured internally
10678 *
10679 * PARAMETERS : none
10680 *
10681 * RETURN : jpeg rotation value
10682 *==========================================================================*/
setJpegRotation(int rotation)10683 void QCameraParameters::setJpegRotation(int rotation) {
10684 if (rotation == 0 || rotation == 90 ||
10685 rotation == 180 || rotation == 270) {
10686 mJpegRotation = (uint32_t)rotation;
10687 }
10688 }
10689
10690 /*===========================================================================
10691 * FUNCTION : getDeviceRotation
10692 *
10693 * DESCRIPTION: get device rotation value
10694 *
10695 * PARAMETERS : none
10696 *
10697 * RETURN : device rotation value
10698 *==========================================================================*/
getDeviceRotation()10699 uint32_t QCameraParameters::getDeviceRotation() {
10700 int rotation = 0;
10701
10702 rotation = mRotation;
10703 if (rotation < 0) {
10704 rotation = 0;
10705 }
10706
10707 return (uint32_t)rotation;
10708 }
10709
10710 /*===========================================================================
10711 * FUNCTION : getJpegExifRotation
10712 *
10713 * DESCRIPTION: get exif rotation value
10714 *
10715 * PARAMETERS : none
10716 *
10717 * RETURN : rotation value
10718 *==========================================================================*/
getJpegExifRotation()10719 uint32_t QCameraParameters::getJpegExifRotation() {
10720 int rotation = 0;
10721
10722 if (useJpegExifRotation()) {
10723 rotation = mRotation;
10724 if (rotation < 0) {
10725 rotation = 0;
10726 }
10727 }
10728 return (uint32_t)rotation;
10729 }
10730
10731 /*===========================================================================
10732 * FUNCTION : useJpegExifRotation
10733 *
10734 * DESCRIPTION: Check if jpeg exif rotation need to be used
10735 *
10736 * PARAMETERS : none
10737 *
10738 * RETURN : true if jpeg exif rotation need to be used
10739 *==========================================================================*/
useJpegExifRotation()10740 bool QCameraParameters::useJpegExifRotation() {
10741 char exifRotation[PROPERTY_VALUE_MAX];
10742
10743 property_get("persist.camera.exif.rotation", exifRotation, "off");
10744
10745 if (!strcmp(exifRotation, "on")) {
10746 return true;
10747 }
10748
10749 if (!(m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION)) {
10750 return true;
10751 }
10752
10753 return false;
10754 }
10755
10756 /*===========================================================================
10757 * FUNCTION : getEffectValue
10758 *
10759 * DESCRIPTION: get effect value
10760 *
10761 * PARAMETERS : none
10762 *
10763 * RETURN : effect value
10764 *==========================================================================*/
getEffectValue()10765 int32_t QCameraParameters::getEffectValue()
10766 {
10767 uint32_t cnt = 0;
10768 const char *effect = get(KEY_EFFECT);
10769 if (effect) {
10770 while (NULL != EFFECT_MODES_MAP[cnt].desc) {
10771 if (!strcmp(EFFECT_MODES_MAP[cnt].desc, effect)) {
10772 return EFFECT_MODES_MAP[cnt].val;
10773 }
10774 cnt++;
10775 }
10776 } else {
10777 LOGW("Missing effect value");
10778 }
10779 return CAM_EFFECT_MODE_OFF;
10780 }
10781
10782 /*===========================================================================
10783 * FUNCTION : parseGPSCoordinate
10784 *
10785 * DESCRIPTION: parse GPS coordinate string
10786 *
10787 * PARAMETERS :
10788 * @coord_str : [input] coordinate string
10789 * @coord : [output] ptr to struct to store coordinate
10790 *
10791 * RETURN : int32_t type of status
10792 * NO_ERROR -- success
10793 * none-zero failure code
10794 *==========================================================================*/
parseGPSCoordinate(const char * coord_str,rat_t * coord)10795 int QCameraParameters::parseGPSCoordinate(const char *coord_str, rat_t* coord)
10796 {
10797 if(coord == NULL) {
10798 LOGE("error, invalid argument coord == NULL");
10799 return BAD_VALUE;
10800 }
10801 double degF = atof(coord_str);
10802 if (degF < 0) {
10803 degF = -degF;
10804 }
10805 double minF = (degF - (double)(int) degF) * 60.0;
10806 double secF = (minF - (double)(int) minF) * 60.0;
10807
10808 getRational(&coord[0], (int)degF, 1);
10809 getRational(&coord[1], (int)minF, 1);
10810 getRational(&coord[2], (int)(secF * 10000.0), 10000);
10811 return NO_ERROR;
10812 }
10813
10814 /*===========================================================================
10815 * FUNCTION : getExifDateTime
10816 *
10817 * DESCRIPTION: query exif date time
10818 *
10819 * PARAMETERS :
10820 * @dateTime : String to store exif date time.
10821 * Should be leaved unchanged in case of error.
10822 * @subsecTime : String to store exif time nanoseconds.
10823 * Should be leaved unchanged in case of error.
10824 *
10825 * RETURN : int32_t type of status
10826 * NO_ERROR -- success
10827 * none-zero failure code
10828 *==========================================================================*/
getExifDateTime(String8 & dateTime,String8 & subsecTime)10829 int32_t QCameraParameters::getExifDateTime(String8 &dateTime, String8 &subsecTime)
10830 {
10831 int32_t ret = NO_ERROR;
10832
10833 //get time and date from system
10834 struct timeval tv;
10835 struct tm timeinfo_data;
10836
10837 int res = gettimeofday(&tv, NULL);
10838 if (0 == res) {
10839 struct tm *timeinfo = localtime_r(&tv.tv_sec, &timeinfo_data);
10840 if (NULL != timeinfo) {
10841 //Write datetime according to EXIF Spec
10842 //"YYYY:MM:DD HH:MM:SS" (20 chars including \0)
10843 dateTime = String8::format("%04d:%02d:%02d %02d:%02d:%02d",
10844 timeinfo->tm_year + 1900, timeinfo->tm_mon + 1,
10845 timeinfo->tm_mday, timeinfo->tm_hour,
10846 timeinfo->tm_min, timeinfo->tm_sec);
10847 //Write subsec according to EXIF Sepc
10848 subsecTime = String8::format("%06ld", tv.tv_usec);
10849 } else {
10850 LOGE("localtime_r() error");
10851 ret = UNKNOWN_ERROR;
10852 }
10853 } else if (-1 == res) {
10854 LOGE("gettimeofday() error: %s", strerror(errno));
10855 ret = UNKNOWN_ERROR;
10856 } else {
10857 LOGE("gettimeofday() unexpected return code: %d", res);
10858 ret = UNKNOWN_ERROR;
10859 }
10860
10861 return ret;
10862 }
10863
10864 /*===========================================================================
10865 * FUNCTION : getRational
10866 *
10867 * DESCRIPTION: compose rational struct
10868 *
10869 * PARAMETERS :
10870 * @rat : ptr to struct to store rational info
10871 * @num :num of the rational
10872 * @denom : denom of the rational
10873 *
10874 * RETURN : int32_t type of status
10875 * NO_ERROR -- success
10876 * none-zero failure code
10877 *==========================================================================*/
getRational(rat_t * rat,int num,int denom)10878 int32_t QCameraParameters::getRational(rat_t *rat, int num, int denom)
10879 {
10880 if ((0 > num) || (0 > denom)) {
10881 LOGE("Negative values");
10882 return BAD_VALUE;
10883 }
10884 if (NULL == rat) {
10885 LOGE("NULL rat input");
10886 return BAD_VALUE;
10887 }
10888 rat->num = (uint32_t)num;
10889 rat->denom = (uint32_t)denom;
10890 return NO_ERROR;
10891 }
10892
10893 /*===========================================================================
10894 * FUNCTION : getExifFocalLength
10895 *
10896 * DESCRIPTION: get exif focal lenght
10897 *
10898 * PARAMETERS :
10899 * @focalLength : ptr to rational strcut to store focal lenght
10900 *
10901 * RETURN : int32_t type of status
10902 * NO_ERROR -- success
10903 * none-zero failure code
10904 *==========================================================================*/
getExifFocalLength(rat_t * focalLength)10905 int32_t QCameraParameters::getExifFocalLength(rat_t *focalLength)
10906 {
10907 int focalLengthValue =
10908 (int)(getFloat(QCameraParameters::KEY_FOCAL_LENGTH) * FOCAL_LENGTH_DECIMAL_PRECISION);
10909 return getRational(focalLength, focalLengthValue, FOCAL_LENGTH_DECIMAL_PRECISION);
10910 }
10911
10912 /*===========================================================================
10913 * FUNCTION : getExifIsoSpeed
10914 *
10915 * DESCRIPTION: get exif ISO speed
10916 *
10917 * PARAMETERS : none
10918 *
10919 * RETURN : ISO speed value
10920 *==========================================================================*/
getExifIsoSpeed()10921 uint16_t QCameraParameters::getExifIsoSpeed()
10922 {
10923 uint16_t isoSpeed = 0;
10924 const char *iso_str = get(QCameraParameters::KEY_QC_ISO_MODE);
10925 int iso_index = lookupAttr(ISO_MODES_MAP, PARAM_MAP_SIZE(ISO_MODES_MAP), iso_str);
10926 switch (iso_index) {
10927 case CAM_ISO_MODE_AUTO:
10928 isoSpeed = 0;
10929 break;
10930 case CAM_ISO_MODE_DEBLUR:
10931 isoSpeed = 1;
10932 break;
10933 case CAM_ISO_MODE_100:
10934 isoSpeed = 100;
10935 break;
10936 case CAM_ISO_MODE_200:
10937 isoSpeed = 200;
10938 break;
10939 case CAM_ISO_MODE_400:
10940 isoSpeed = 400;
10941 break;
10942 case CAM_ISO_MODE_800:
10943 isoSpeed = 800;
10944 break;
10945 case CAM_ISO_MODE_1600:
10946 isoSpeed = 1600;
10947 break;
10948 case CAM_ISO_MODE_3200:
10949 isoSpeed = 3200;
10950 break;
10951 }
10952 return isoSpeed;
10953 }
10954
10955 /*===========================================================================
10956 * FUNCTION : getExifGpsProcessingMethod
10957 *
10958 * DESCRIPTION: get GPS processing method
10959 *
10960 * PARAMETERS :
10961 * @gpsProcessingMethod : string to store GPS process method
10962 * @count : lenght of the string
10963 *
10964 * RETURN : int32_t type of status
10965 * NO_ERROR -- success
10966 * none-zero failure code
10967 *==========================================================================*/
getExifGpsProcessingMethod(char * gpsProcessingMethod,uint32_t & count)10968 int32_t QCameraParameters::getExifGpsProcessingMethod(char *gpsProcessingMethod,
10969 uint32_t &count)
10970 {
10971 const char *str = get(KEY_GPS_PROCESSING_METHOD);
10972 if(str != NULL) {
10973 memcpy(gpsProcessingMethod, ExifAsciiPrefix, EXIF_ASCII_PREFIX_SIZE);
10974 count = EXIF_ASCII_PREFIX_SIZE;
10975 strlcpy(gpsProcessingMethod + EXIF_ASCII_PREFIX_SIZE, str, GPS_PROCESSING_METHOD_SIZE);
10976 count += (uint32_t)strlen(str);
10977 gpsProcessingMethod[count++] = '\0'; // increase 1 for the last NULL char
10978 return NO_ERROR;
10979 } else {
10980 return BAD_VALUE;
10981 }
10982 }
10983
10984 /*===========================================================================
10985 * FUNCTION : getExifLatitude
10986 *
10987 * DESCRIPTION: get exif latitude
10988 *
10989 * PARAMETERS :
10990 * @latitude : ptr to rational struct to store latitude info
10991 * @ladRef : charater to indicate latitude reference
10992 *
10993 * RETURN : int32_t type of status
10994 * NO_ERROR -- success
10995 * none-zero failure code
10996 *==========================================================================*/
getExifLatitude(rat_t * latitude,char * latRef)10997 int32_t QCameraParameters::getExifLatitude(rat_t *latitude,
10998 char *latRef)
10999 {
11000 const char *str = get(KEY_GPS_LATITUDE);
11001 if(str != NULL) {
11002 parseGPSCoordinate(str, latitude);
11003
11004 //set Latitude Ref
11005 float latitudeValue = getFloat(KEY_GPS_LATITUDE);
11006 if(latitudeValue < 0.0f) {
11007 latRef[0] = 'S';
11008 } else {
11009 latRef[0] = 'N';
11010 }
11011 latRef[1] = '\0';
11012 return NO_ERROR;
11013 }else{
11014 return BAD_VALUE;
11015 }
11016 }
11017
11018 /*===========================================================================
11019 * FUNCTION : getExifLongitude
11020 *
11021 * DESCRIPTION: get exif longitude
11022 *
11023 * PARAMETERS :
11024 * @longitude : ptr to rational struct to store longitude info
11025 * @lonRef : charater to indicate longitude reference
11026 *
11027 * RETURN : int32_t type of status
11028 * NO_ERROR -- success
11029 * none-zero failure code
11030 *==========================================================================*/
getExifLongitude(rat_t * longitude,char * lonRef)11031 int32_t QCameraParameters::getExifLongitude(rat_t *longitude,
11032 char *lonRef)
11033 {
11034 const char *str = get(KEY_GPS_LONGITUDE);
11035 if(str != NULL) {
11036 parseGPSCoordinate(str, longitude);
11037
11038 //set Longitude Ref
11039 float longitudeValue = getFloat(KEY_GPS_LONGITUDE);
11040 if(longitudeValue < 0.0f) {
11041 lonRef[0] = 'W';
11042 } else {
11043 lonRef[0] = 'E';
11044 }
11045 lonRef[1] = '\0';
11046 return NO_ERROR;
11047 }else{
11048 return BAD_VALUE;
11049 }
11050 }
11051
11052 /*===========================================================================
11053 * FUNCTION : getExifAltitude
11054 *
11055 * DESCRIPTION: get exif altitude
11056 *
11057 * PARAMETERS :
11058 * @altitude : ptr to rational struct to store altitude info
11059 * @altRef : charater to indicate altitude reference
11060 *
11061 * RETURN : int32_t type of status
11062 * NO_ERROR -- success
11063 * none-zero failure code
11064 *==========================================================================*/
getExifAltitude(rat_t * altitude,char * altRef)11065 int32_t QCameraParameters::getExifAltitude(rat_t *altitude,
11066 char *altRef)
11067 {
11068 const char *str = get(KEY_GPS_ALTITUDE);
11069 if(str != NULL) {
11070 double value = atof(str);
11071 *altRef = 0;
11072 if(value < 0){
11073 *altRef = 1;
11074 value = -value;
11075 }
11076 return getRational(altitude, (int)(value*1000), 1000);
11077 }else{
11078 return BAD_VALUE;
11079 }
11080 }
11081
11082 /*===========================================================================
11083 * FUNCTION : getExifGpsDateTimeStamp
11084 *
11085 * DESCRIPTION: get exif GPS date time stamp
11086 *
11087 * PARAMETERS :
11088 * @gpsDateStamp : GPS date time stamp string
11089 * @bufLen : length of the string
11090 * @gpsTimeStamp : ptr to rational struct to store time stamp info
11091 *
11092 * RETURN : int32_t type of status
11093 * NO_ERROR -- success
11094 * none-zero failure code
11095 *==========================================================================*/
getExifGpsDateTimeStamp(char * gpsDateStamp,uint32_t bufLen,rat_t * gpsTimeStamp)11096 int32_t QCameraParameters::getExifGpsDateTimeStamp(char *gpsDateStamp,
11097 uint32_t bufLen,
11098 rat_t *gpsTimeStamp)
11099 {
11100 const char *str = get(KEY_GPS_TIMESTAMP);
11101 if(str != NULL) {
11102 time_t unixTime = (time_t)atol(str);
11103 struct tm *UTCTimestamp = gmtime(&unixTime);
11104
11105 if(!UTCTimestamp) {
11106 LOGE("UTCTimestamp is null\n");
11107 return BAD_VALUE;
11108 }
11109
11110 strftime(gpsDateStamp, bufLen, "%Y:%m:%d", UTCTimestamp);
11111
11112 getRational(&gpsTimeStamp[0], UTCTimestamp->tm_hour, 1);
11113 getRational(&gpsTimeStamp[1], UTCTimestamp->tm_min, 1);
11114 getRational(&gpsTimeStamp[2], UTCTimestamp->tm_sec, 1);
11115
11116 return NO_ERROR;
11117 } else {
11118 return BAD_VALUE;
11119 }
11120 }
11121
11122 /*===========================================================================
11123 * FUNCTION : updateFocusDistances
11124 *
11125 * DESCRIPTION: update focus distances
11126 *
11127 * PARAMETERS :
11128 * @focusDistances : ptr to focus distance info
11129 *
11130 * RETURN : int32_t type of status
11131 * NO_ERROR -- success
11132 * none-zero failure code
11133 *==========================================================================*/
updateFocusDistances(cam_focus_distances_info_t * focusDistances)11134 int32_t QCameraParameters::updateFocusDistances(cam_focus_distances_info_t *focusDistances)
11135 {
11136 String8 str;
11137 char buffer[32] = {0};
11138 //set all distances to infinity if focus mode is infinity
11139 if(mFocusMode == CAM_FOCUS_MODE_INFINITY) {
11140 str.append("Infinity,Infinity,Infinity");
11141 } else {
11142 if (focusDistances->focus_distance[0] < FOCUS_PERCISION) {
11143 str.append("Infinity");
11144 } else {
11145 snprintf(buffer, sizeof(buffer), "%f", 1.0/focusDistances->focus_distance[0]);
11146 str.append(buffer);
11147 }
11148 if (focusDistances->focus_distance[1] < FOCUS_PERCISION) {
11149 str.append(",Infinity");
11150 } else {
11151 snprintf(buffer, sizeof(buffer), ",%f", 1.0/focusDistances->focus_distance[1]);
11152 str.append(buffer);
11153 }
11154 if (focusDistances->focus_distance[2] < FOCUS_PERCISION) {
11155 str.append(",Infinity");
11156 } else {
11157 snprintf(buffer, sizeof(buffer), ",%f", 1.0/focusDistances->focus_distance[2]);
11158 str.append(buffer);
11159 }
11160 }
11161 LOGH("setting KEY_FOCUS_DISTANCES as %s", __FUNCTION__, str.string());
11162 set(QCameraParameters::KEY_FOCUS_DISTANCES, str.string());
11163 return NO_ERROR;
11164 }
11165
11166 /*===========================================================================
11167 * FUNCTION : updateRecordingHintValue
11168 *
11169 * DESCRIPTION: update recording hint locally and to daemon
11170 *
11171 * PARAMETERS :
11172 * @value : video hint value
11173 *
11174 * RETURN : int32_t type of status
11175 * NO_ERROR -- success
11176 * none-zero failure code
11177 *==========================================================================*/
updateRecordingHintValue(int32_t value)11178 int32_t QCameraParameters::updateRecordingHintValue(int32_t value)
11179 {
11180 int32_t rc = NO_ERROR;
11181 if(initBatchUpdate(m_pParamBuf) < 0 ) {
11182 LOGE("Failed to initialize group update table");
11183 return BAD_TYPE;
11184 }
11185
11186 rc = setRecordingHintValue(value);
11187 if (rc != NO_ERROR) {
11188 LOGE("Failed to update table");
11189 return rc;
11190 }
11191
11192 if(m_bDISEnabled && (value==1)) {
11193 LOGH("%d: Setting DIS value again!!");
11194 setDISValue(VALUE_ENABLE);
11195 }
11196
11197 rc = commitSetBatch();
11198 if (rc != NO_ERROR) {
11199 LOGE("Failed to update recording hint");
11200 return rc;
11201 }
11202
11203 return rc;
11204 }
11205
11206 /*===========================================================================
11207 * FUNCTION : setHistogram
11208 *
11209 * DESCRIPTION: set histogram
11210 *
11211 * PARAMETERS :
11212 * @enabled : if histogram is enabled
11213 *
11214 * RETURN : int32_t type of status
11215 * NO_ERROR -- success
11216 * none-zero failure code
11217 *==========================================================================*/
setHistogram(bool enabled)11218 int32_t QCameraParameters::setHistogram(bool enabled)
11219 {
11220 if(m_bHistogramEnabled == enabled) {
11221 LOGH("histogram flag not changed, no ops here");
11222 return NO_ERROR;
11223 }
11224
11225 // set parm for histogram
11226 if(initBatchUpdate(m_pParamBuf) < 0 ) {
11227 LOGE("Failed to initialize group update table");
11228 return BAD_TYPE;
11229 }
11230
11231 int32_t value = enabled ? 1 : 0;
11232 int32_t rc = NO_ERROR;
11233 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HISTOGRAM, value)) {
11234 LOGE("Failed to update table");
11235 return BAD_VALUE;
11236 }
11237
11238 rc = commitSetBatch();
11239 if (rc != NO_ERROR) {
11240 LOGE("Failed to set histogram");
11241 return rc;
11242 }
11243
11244 m_bHistogramEnabled = enabled;
11245
11246 LOGH("Histogram -> %s", m_bHistogramEnabled ? "Enabled" : "Disabled");
11247
11248 return rc;
11249 }
11250
11251 /*===========================================================================
11252 * FUNCTION : setIntEvent
11253 *
11254 * DESCRIPTION: set setIntEvent
11255 *
11256 * PARAMETERS :
11257 * @params : image size and dimensions
11258 *
11259 * RETURN : int32_t type of status
11260 * NO_ERROR -- success
11261 * none-zero failure code
11262 *==========================================================================*/
setIntEvent(cam_int_evt_params_t params)11263 int32_t QCameraParameters::setIntEvent(cam_int_evt_params_t params)
11264 {
11265 int32_t rc = NO_ERROR;
11266
11267 if ( m_pParamBuf == NULL ) {
11268 return NO_INIT;
11269 }
11270
11271 if(initBatchUpdate(m_pParamBuf) < 0 ) {
11272 LOGE("Failed to initialize group update table");
11273 return BAD_TYPE;
11274 }
11275
11276 //Sending snapshot taken notification back to Eztune"
11277 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_INT_EVT, params)) {
11278 LOGE("Failed to update table");
11279 return BAD_VALUE;
11280 }
11281
11282 rc = commitSetBatch();
11283 if (rc != NO_ERROR) {
11284 LOGE("Failed to set frameskip info parm");
11285 return rc;
11286 }
11287
11288 return rc;
11289 }
11290
11291 /*===========================================================================
11292 * FUNCTION : setFaceDetectionOption
11293 *
11294 * DESCRIPTION: set if face detection is enabled by SendCommand
11295 *
11296 * PARAMETERS :
11297 * @enabled : bool flag if face detection should be enabled
11298 *
11299 * RETURN : int32_t type of status
11300 * NO_ERROR -- success
11301 * none-zero failure code
11302 *==========================================================================*/
setFaceDetectionOption(bool enabled)11303 int32_t QCameraParameters::setFaceDetectionOption(bool enabled)
11304 {
11305 m_bFaceDetectionOn = enabled;
11306 return NO_ERROR;
11307 }
11308
11309 /*===========================================================================
11310 * FUNCTION : setFaceDetection
11311 *
11312 * DESCRIPTION: set face detection
11313 *
11314 * PARAMETERS :
11315 * @enabled : if face detection is enabled
11316 * @initCommit : if configuration list need to be initialized and commited
11317 *
11318 * RETURN : int32_t type of status
11319 * NO_ERROR -- success
11320 * none-zero failure code
11321 *==========================================================================*/
setFaceDetection(bool enabled,bool initCommit)11322 int32_t QCameraParameters::setFaceDetection(bool enabled, bool initCommit)
11323 {
11324 uint32_t faceProcMask = m_nFaceProcMask;
11325 // set face detection mask
11326 if (enabled) {
11327 faceProcMask |= CAM_FACE_PROCESS_MASK_DETECTION;
11328 if (getRecordingHintValue() > 0) {
11329 faceProcMask = 0;
11330 faceProcMask |= CAM_FACE_PROCESS_MASK_FOCUS;
11331 if (fdModeInVideo() == CAM_FACE_PROCESS_MASK_DETECTION) {
11332 faceProcMask |= CAM_FACE_PROCESS_MASK_DETECTION;
11333 }
11334 } else {
11335 faceProcMask |= CAM_FACE_PROCESS_MASK_FOCUS;
11336 faceProcMask |= CAM_FACE_PROCESS_MASK_DETECTION;
11337 }
11338 if (isTruePortraitEnabled()) {
11339 LOGL("QCameraParameters::setFaceDetection trueportrait enabled");
11340 faceProcMask |= CAM_FACE_PROCESS_MASK_GAZE;
11341 } else {
11342 LOGL("QCameraParameters::setFaceDetection trueportrait disabled");
11343 faceProcMask &= ~CAM_FACE_PROCESS_MASK_GAZE;
11344 }
11345 } else {
11346 faceProcMask &= ~(CAM_FACE_PROCESS_MASK_DETECTION
11347 | CAM_FACE_PROCESS_MASK_FOCUS
11348 | CAM_FACE_PROCESS_MASK_GAZE);
11349 }
11350
11351 if(m_nFaceProcMask == faceProcMask) {
11352 LOGH("face process mask not changed, no ops here");
11353 return NO_ERROR;
11354 }
11355
11356 m_nFaceProcMask = faceProcMask;
11357
11358 // set parm for face detection
11359 uint32_t requested_faces = (uint32_t)getInt(KEY_QC_MAX_NUM_REQUESTED_FACES);
11360 cam_fd_set_parm_t fd_set_parm;
11361 memset(&fd_set_parm, 0, sizeof(cam_fd_set_parm_t));
11362 fd_set_parm.fd_mode = faceProcMask;
11363 fd_set_parm.num_fd = requested_faces;
11364
11365 LOGH("[KPI Perf]: PROFILE_FACE_DETECTION_VALUE = %d num_fd = %d",
11366 faceProcMask,requested_faces);
11367
11368 if (initCommit) {
11369 if(initBatchUpdate(m_pParamBuf) < 0 ) {
11370 LOGE("Failed to initialize group update table");
11371 return BAD_TYPE;
11372 }
11373 }
11374
11375 int32_t rc = NO_ERROR;
11376
11377 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FD, fd_set_parm)) {
11378 LOGE("Failed to update table");
11379 return BAD_VALUE;
11380 }
11381
11382 if (initCommit) {
11383 rc = commitSetBatch();
11384 if (rc != NO_ERROR) {
11385 LOGE("Failed to set face detection parm");
11386 return rc;
11387 }
11388 }
11389
11390 LOGH("FaceProcMask -> %d", m_nFaceProcMask);
11391
11392 return rc;
11393 }
11394
11395 /*===========================================================================
11396 * FUNCTION : setFrameSkip
11397 *
11398 * DESCRIPTION: send ISP frame skip pattern to camera daemon
11399 *
11400 * PARAMETERS :
11401 * @pattern : skip pattern for ISP
11402 *
11403 * RETURN : int32_t type of status
11404 * NO_ERROR -- success
11405 * none-zero failure code
11406 *==========================================================================*/
setFrameSkip(enum msm_vfe_frame_skip_pattern pattern)11407 int32_t QCameraParameters::setFrameSkip(enum msm_vfe_frame_skip_pattern pattern)
11408 {
11409 int32_t rc = NO_ERROR;
11410
11411 if ( m_pParamBuf == NULL ) {
11412 return NO_INIT;
11413 }
11414
11415 if(initBatchUpdate(m_pParamBuf) < 0 ) {
11416 LOGE("Failed to initialize group update table");
11417 return BAD_TYPE;
11418 }
11419
11420 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FRAMESKIP, (int32_t)pattern)) {
11421 LOGE("Failed to update table");
11422 return BAD_VALUE;
11423 }
11424
11425 rc = commitSetBatch();
11426 if (rc != NO_ERROR) {
11427 LOGE("Failed to set frameskip info parm");
11428 return rc;
11429 }
11430
11431 return rc;
11432 }
11433
11434 /*===========================================================================
11435 * FUNCTION : updateRAW
11436 *
11437 * DESCRIPTION: Query sensor output size based on maximum stream dimension
11438 *
11439 * PARAMETERS :
11440 * @max_dim : maximum stream dimension
11441 *
11442 * RETURN : int32_t type of status
11443 * NO_ERROR -- success
11444 * none-zero failure code
11445 *==========================================================================*/
updateRAW(cam_dimension_t max_dim)11446 int32_t QCameraParameters::updateRAW(cam_dimension_t max_dim)
11447 {
11448 int32_t rc = NO_ERROR;
11449 cam_dimension_t raw_dim, pic_dim;
11450
11451 // If offline raw is enabled, check the dimensions from Picture size since snapshot
11452 // stream is not added but final JPEG is required of snapshot size
11453 if (getofflineRAW()) {
11454 getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT, pic_dim);
11455 if (pic_dim.width > max_dim.width) {
11456 max_dim.width = pic_dim.width;
11457 }
11458 if (pic_dim.height > max_dim.height) {
11459 max_dim.height = pic_dim.height;
11460 }
11461 }
11462
11463 if (max_dim.width == 0 || max_dim.height == 0) {
11464 max_dim = m_pCapability->raw_dim[0];
11465 }
11466
11467 if(initBatchUpdate(m_pParamBuf) < 0 ) {
11468 LOGE("Failed to initialize group update table");
11469 return BAD_TYPE;
11470 }
11471
11472 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_MAX_DIMENSION, max_dim)) {
11473 LOGE("Failed to update table for CAM_INTF_PARM_MAX_DIMENSION ");
11474 return BAD_VALUE;
11475 }
11476
11477 rc = commitSetBatch();
11478 if (rc != NO_ERROR) {
11479 LOGE("Failed to set lock CAM_INTF_PARM_MAX_DIMENSION parm");
11480 return rc;
11481 }
11482
11483 if(initBatchUpdate(m_pParamBuf) < 0 ) {
11484 LOGE("Failed to initialize group update table");
11485 return BAD_TYPE;
11486 }
11487
11488 ADD_GET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_RAW_DIMENSION);
11489
11490 rc = commitGetBatch();
11491 if (rc != NO_ERROR) {
11492 LOGE("Failed to get commit CAM_INTF_PARM_RAW_DIMENSION");
11493 return rc;
11494 }
11495
11496 READ_PARAM_ENTRY(m_pParamBuf, CAM_INTF_PARM_RAW_DIMENSION, raw_dim);
11497
11498 LOGH("RAW Dimension = %d X %d",raw_dim.width,raw_dim.height);
11499 if (raw_dim.width == 0 || raw_dim.height == 0) {
11500 LOGW("Error getting RAW size. Setting to Capability value");
11501 raw_dim = m_pCapability->raw_dim[0];
11502 }
11503 setRawSize(raw_dim);
11504 return rc;
11505 }
11506
11507 /*===========================================================================
11508 * FUNCTION : setHDRSceneEnable
11509 *
11510 * DESCRIPTION: sets hdr scene deteced flag
11511 *
11512 * PARAMETERS :
11513 * @bflag : hdr scene deteced
11514 *
11515 * RETURN : nothing
11516 *==========================================================================*/
setHDRSceneEnable(bool bflag)11517 void QCameraParameters::setHDRSceneEnable(bool bflag)
11518 {
11519 bool bupdate = false;
11520 if (m_HDRSceneEnabled != bflag) {
11521 bupdate = true;
11522 }
11523 m_HDRSceneEnabled = bflag;
11524
11525 if (bupdate) {
11526 updateFlash(true);
11527 }
11528 }
11529
11530 /*===========================================================================
11531 * FUNCTION : getASDStateString
11532 *
11533 * DESCRIPTION: get ASD result in string format
11534 *
11535 * PARAMETERS :
11536 * @scene : selected scene mode
11537 *
11538 * RETURN : int32_t type of status
11539 * NO_ERROR -- success
11540 * none-zero failure code
11541 *==========================================================================*/
getASDStateString(cam_auto_scene_t scene)11542 const char *QCameraParameters::getASDStateString(cam_auto_scene_t scene)
11543 {
11544 switch (scene) {
11545 case S_NORMAL :
11546 return "Normal";
11547 case S_SCENERY:
11548 return "Scenery";
11549 case S_PORTRAIT:
11550 return "Portrait";
11551 case S_PORTRAIT_BACKLIGHT:
11552 return "Portrait-Backlight";
11553 case S_SCENERY_BACKLIGHT:
11554 return "Scenery-Backlight";
11555 case S_BACKLIGHT:
11556 return "Backlight";
11557 default:
11558 return "<Unknown!>";
11559 }
11560 }
11561
11562 /*===========================================================================
11563 * FUNCTION : parseNDimVector
11564 *
11565 * DESCRIPTION: helper function to parse a string like "(1, 2, 3, 4, ..., N)"
11566 * into N-dimension vector
11567 *
11568 * PARAMETERS :
11569 * @str : string to be parsed
11570 * @num : output array of size N to store vector element values
11571 * @N : number of dimension
11572 * @delim : delimeter to seperete string
11573 *
11574 * RETURN : int32_t type of status
11575 * NO_ERROR -- success
11576 * none-zero failure code
11577 *==========================================================================*/
parseNDimVector(const char * str,int * num,int N,char delim=',')11578 int32_t QCameraParameters::parseNDimVector(const char *str, int *num, int N, char delim = ',')
11579 {
11580 char *start, *end;
11581 if (num == NULL) {
11582 LOGE("Invalid output array (num == NULL)");
11583 return BAD_VALUE;
11584 }
11585
11586 //check if string starts and ends with parantheses
11587 if(str[0] != '(' || str[strlen(str)-1] != ')') {
11588 LOGE("Invalid format of string %s, valid format is (n1, n2, n3, n4 ...)",
11589 str);
11590 return BAD_VALUE;
11591 }
11592 start = (char*) str;
11593 start++;
11594 for(int i=0; i<N; i++) {
11595 *(num+i) = (int) strtol(start, &end, 10);
11596 if(*end != delim && i < N-1) {
11597 LOGE("Cannot find delimeter '%c' in string \"%s\". end = %c",
11598 delim, str, *end);
11599 return -1;
11600 }
11601 start = end+1;
11602 }
11603 return NO_ERROR;
11604 }
11605
11606 /*===========================================================================
11607 * FUNCTION : parseCameraAreaString
11608 *
11609 * DESCRIPTION: helper function to parse a string of camera areas like
11610 * "(1, 2, 3, 4, 5),(1, 2, 3, 4, 5),..."
11611 *
11612 * PARAMETERS :
11613 * @str : string to be parsed
11614 * @max_num_areas : max number of areas
11615 * @pAreas : ptr to struct to store areas
11616 * @num_areas_found : number of areas found
11617 *
11618 * RETURN : int32_t type of status
11619 * NO_ERROR -- success
11620 * none-zero failure code
11621 *==========================================================================*/
parseCameraAreaString(const char * str,int max_num_areas,cam_area_t * pAreas,int & num_areas_found)11622 int32_t QCameraParameters::parseCameraAreaString(const char *str,
11623 int max_num_areas,
11624 cam_area_t *pAreas,
11625 int& num_areas_found)
11626 {
11627 char area_str[32];
11628 const char *start, *end, *p;
11629 start = str; end = NULL;
11630 int values[5], index=0;
11631 num_areas_found = 0;
11632
11633 memset(values, 0, sizeof(values));
11634 while(start != NULL) {
11635 if(*start != '(') {
11636 LOGE("error: Ill formatted area string: %s", str);
11637 return BAD_VALUE;
11638 }
11639 end = strchr(start, ')');
11640 if(end == NULL) {
11641 LOGE("error: Ill formatted area string: %s", str);
11642 return BAD_VALUE;
11643 }
11644 int i;
11645 for (i=0,p=start; p<=end; p++, i++) {
11646 area_str[i] = *p;
11647 }
11648 area_str[i] = '\0';
11649 if(parseNDimVector(area_str, values, 5) < 0){
11650 LOGE("error: Failed to parse the area string: %s", area_str);
11651 return BAD_VALUE;
11652 }
11653 // no more areas than max_num_areas are accepted.
11654 if(index >= max_num_areas) {
11655 LOGE("error: too many areas specified %s", str);
11656 return BAD_VALUE;
11657 }
11658 pAreas[index].rect.left = values[0];
11659 pAreas[index].rect.top = values[1];
11660 pAreas[index].rect.width = values[2] - values[0];
11661 pAreas[index].rect.height = values[3] - values[1];
11662 pAreas[index].weight = values[4];
11663
11664 index++;
11665 start = strchr(end, '('); // serach for next '('
11666 }
11667 num_areas_found = index;
11668 return 0;
11669 }
11670
11671 /*===========================================================================
11672 * FUNCTION : validateCameraAreas
11673 *
11674 * DESCRIPTION: helper function to validate camera areas within (-1000, 1000)
11675 *
11676 * PARAMETERS :
11677 * @areas : ptr to array of areas
11678 * @num_areas : number of areas
11679 *
11680 * RETURN : true -- area is in valid range
11681 * false -- not valid
11682 *==========================================================================*/
validateCameraAreas(cam_area_t * areas,int num_areas)11683 bool QCameraParameters::validateCameraAreas(cam_area_t *areas, int num_areas)
11684 {
11685 // special case: default area
11686 if (num_areas == 1 &&
11687 areas[0].rect.left == 0 &&
11688 areas[0].rect.top == 0 &&
11689 areas[0].rect.width == 0 &&
11690 areas[0].rect.height == 0 &&
11691 areas[0].weight == 0) {
11692 return true;
11693 }
11694
11695 for(int i = 0; i < num_areas; i++) {
11696 // left should be >= -1000
11697 if(areas[i].rect.left < -1000) {
11698 return false;
11699 }
11700
11701 // top should be >= -1000
11702 if(areas[i].rect.top < -1000) {
11703 return false;
11704 }
11705
11706 // width or height should be > 0
11707 if (areas[i].rect.width <= 0 || areas[i].rect.height <= 0) {
11708 return false;
11709 }
11710
11711 // right should be <= 1000
11712 if(areas[i].rect.left + areas[i].rect.width > 1000) {
11713 return false;
11714 }
11715
11716 // bottom should be <= 1000
11717 if(areas[i].rect.top + areas[i].rect.height > 1000) {
11718 return false;
11719 }
11720
11721 // weight should be within (1, 1000)
11722 if (areas[i].weight < 1 || areas[i].weight > 1000) {
11723 return false;
11724 }
11725 }
11726 return true;
11727 }
11728
11729 /*===========================================================================
11730 * FUNCTION : isYUVFrameInfoNeeded
11731 *
11732 * DESCRIPTION: In AE-Bracket mode, we need set yuv buffer information for up-layer
11733 *
11734 * PARAMETERS : none
11735 *
11736 * RETURN : true: needed
11737 * false: no need
11738 *==========================================================================*/
isYUVFrameInfoNeeded()11739 bool QCameraParameters::isYUVFrameInfoNeeded()
11740 {
11741 //In AE-Bracket mode, we need set raw buffer information for up-layer
11742 if(!isNV21PictureFormat() && !isNV16PictureFormat()){
11743 return false;
11744 }
11745 const char *aecBracketStr = get(KEY_QC_AE_BRACKET_HDR);
11746
11747 int value = lookupAttr(BRACKETING_MODES_MAP, PARAM_MAP_SIZE(BRACKETING_MODES_MAP),
11748 aecBracketStr);
11749 LOGH("aecBracketStr=%s, value=%d.", aecBracketStr, value);
11750 return (value == CAM_EXP_BRACKETING_ON);
11751 }
11752
11753 /*===========================================================================
11754 * FUNCTION : getFrameFmtString
11755 *
11756 * DESCRIPTION: get string name of frame format
11757 *
11758 * PARAMETERS :
11759 * @frame : frame format
11760 *
11761 * RETURN : string name of frame format
11762 *==========================================================================*/
getFrameFmtString(cam_format_t fmt)11763 const char *QCameraParameters::getFrameFmtString(cam_format_t fmt)
11764 {
11765 return lookupNameByValue(PICTURE_TYPES_MAP, PARAM_MAP_SIZE(PICTURE_TYPES_MAP), fmt);
11766 }
11767
11768 /*===========================================================================
11769 * FUNCTION : setDcrf
11770 *
11771 * DESCRIPTION: Enable/Disable DCRF (dual-camera-range-finding)
11772 *
11773 * RETURN : none
11774 *==========================================================================*/
setDcrf()11775 void QCameraParameters::setDcrf()
11776 {
11777 char prop[PROPERTY_VALUE_MAX];
11778 memset(prop, 0, sizeof(prop));
11779
11780 // Set DCRF to off by default (assuming single-camera mode)
11781 m_bDcrfEnabled = 0;
11782
11783 // In dual-cam mode, get sysprop and set it to on by default
11784 if(m_relCamSyncInfo.sync_control == CAM_SYNC_RELATED_SENSORS_ON) {
11785 property_get("persist.camera.dcrf.enable", prop, "1");
11786 m_bDcrfEnabled = atoi(prop);
11787 }
11788 }
11789
11790 /*===========================================================================
11791 * FUNCTION : setRelatedCamSyncInfo
11792 *
11793 * DESCRIPTION: set the related cam info parameters
11794 * the related cam info is cached into params to make some decisions beforehand
11795 *
11796 * PARAMETERS :
11797 * @info : ptr to related cam info parameters
11798 *
11799 * RETURN : int32_t type of status
11800 * NO_ERROR -- success
11801 * none-zero failure code
11802 *==========================================================================*/
setRelatedCamSyncInfo(cam_sync_related_sensors_event_info_t * info)11803 int32_t QCameraParameters::setRelatedCamSyncInfo(
11804 cam_sync_related_sensors_event_info_t* info)
11805 {
11806 if(info != NULL){
11807 memcpy(&m_relCamSyncInfo, info,
11808 sizeof(cam_sync_related_sensors_event_info_t));
11809 return NO_ERROR;
11810 } else {
11811 LOGE("info buffer is null");
11812 return UNKNOWN_ERROR;
11813 }
11814 }
11815
11816 /*===========================================================================
11817 * FUNCTION : getRelatedCamSyncInfo
11818 *
11819 * DESCRIPTION:returns the related cam sync info for this HWI instance
11820 *
11821 * PARAMETERS :none
11822 *
11823 * RETURN : const pointer to cam_sync_related_sensors_event_info_t
11824 *==========================================================================*/
11825 const cam_sync_related_sensors_event_info_t*
getRelatedCamSyncInfo(void)11826 QCameraParameters::getRelatedCamSyncInfo(void)
11827 {
11828 return &m_relCamSyncInfo;
11829 }
11830
11831 /*===========================================================================
11832 * FUNCTION : setFrameSyncEnabled
11833 *
11834 * DESCRIPTION: sets whether frame sync is enabled
11835 *
11836 * PARAMETERS :
11837 * @enable : flag whether to enable or disable frame sync
11838 *
11839 * RETURN : int32_t type of status
11840 * NO_ERROR -- success
11841 * none-zero failure code
11842 *==========================================================================*/
setFrameSyncEnabled(bool enable)11843 int32_t QCameraParameters::setFrameSyncEnabled(bool enable)
11844 {
11845 m_bFrameSyncEnabled = enable;
11846 return NO_ERROR;
11847 }
11848
11849 /*===========================================================================
11850 * FUNCTION : isFrameSyncEnabled
11851 *
11852 * DESCRIPTION: returns whether frame sync is enabled
11853 *
11854 * PARAMETERS :none
11855 *
11856 * RETURN : bool indicating whether frame sync is enabled
11857 *==========================================================================*/
isFrameSyncEnabled(void)11858 bool QCameraParameters::isFrameSyncEnabled(void)
11859 {
11860 return m_bFrameSyncEnabled;
11861 }
11862
11863 /*===========================================================================
11864 * FUNCTION : bundleRelatedCameras
11865 *
11866 * DESCRIPTION: send trigger for bundling related camera sessions in the server
11867 *
11868 * PARAMETERS :
11869 * @sync :indicates whether syncing is On or Off
11870 * @sessionid :session id for other camera session
11871 *
11872 * RETURN : int32_t type of status
11873 * NO_ERROR -- success
11874 * none-zero failure code
11875 *==========================================================================*/
bundleRelatedCameras(bool sync,uint32_t sessionid)11876 int32_t QCameraParameters::bundleRelatedCameras(bool sync,
11877 uint32_t sessionid)
11878 {
11879 int32_t rc = NO_ERROR;
11880
11881 if (NULL == m_pCamOpsTbl) {
11882 LOGE("Ops not initialized");
11883 return NO_INIT;
11884 }
11885
11886 LOGD("Sending Bundling cmd sync %d, SessionId %d ",
11887 sync, sessionid);
11888
11889 if(m_pRelCamSyncBuf) {
11890 if(sync) {
11891 m_pRelCamSyncBuf->sync_control = CAM_SYNC_RELATED_SENSORS_ON;
11892 }
11893 else {
11894 m_pRelCamSyncBuf->sync_control = CAM_SYNC_RELATED_SENSORS_OFF;
11895 }
11896 m_pRelCamSyncBuf->mode = m_relCamSyncInfo.mode;
11897 m_pRelCamSyncBuf->type = m_relCamSyncInfo.type;
11898 m_pRelCamSyncBuf->related_sensor_session_id = sessionid;
11899 rc = m_pCamOpsTbl->ops->sync_related_sensors(
11900 m_pCamOpsTbl->camera_handle, m_pRelCamSyncBuf);
11901 } else {
11902 LOGE("Related Cam SyncBuffer not allocated", rc);
11903 return NO_INIT;
11904 }
11905
11906 return rc;
11907 }
11908
11909 /*===========================================================================
11910 * FUNCTION : getRelatedCamCalibration
11911 *
11912 * DESCRIPTION: fetch the related camera subsystem calibration data
11913 *
11914 * PARAMETERS :
11915 * @calib : calibration data fetched
11916 *
11917 * RETURN : int32_t type of status
11918 * NO_ERROR -- success
11919 * none-zero failure code
11920 *==========================================================================*/
getRelatedCamCalibration(cam_related_system_calibration_data_t * calib)11921 int32_t QCameraParameters::getRelatedCamCalibration(
11922 cam_related_system_calibration_data_t* calib)
11923 {
11924 int32_t rc = NO_ERROR;
11925
11926 if(!calib) {
11927 return BAD_TYPE;
11928 }
11929
11930 if(initBatchUpdate(m_pParamBuf) < 0 ) {
11931 LOGE("Failed to initialize group update table");
11932 return BAD_TYPE;
11933 }
11934
11935 ADD_GET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
11936 CAM_INTF_PARM_RELATED_SENSORS_CALIBRATION);
11937
11938 rc = commitGetBatch();
11939 if (rc != NO_ERROR) {
11940 LOGE("Failed to get related cam calibration info");
11941 return rc;
11942 }
11943
11944 READ_PARAM_ENTRY(m_pParamBuf,
11945 CAM_INTF_PARM_RELATED_SENSORS_CALIBRATION, *calib);
11946
11947 LOGD("CALIB version %d ", calib->calibration_format_version);
11948 LOGD("CALIB normalized_focal_length %f ",
11949 calib->main_cam_specific_calibration.normalized_focal_length);
11950 LOGD("CALIB native_sensor_resolution_width %d ",
11951 calib->main_cam_specific_calibration.native_sensor_resolution_width);
11952 LOGD("CALIB native_sensor_resolution_height %d ",
11953 calib->main_cam_specific_calibration.native_sensor_resolution_height);
11954 LOGD("CALIB sensor_resolution_width %d ",
11955 calib->main_cam_specific_calibration.calibration_sensor_resolution_width);
11956 LOGD("CALIB sensor_resolution_height %d ",
11957 calib->main_cam_specific_calibration.calibration_sensor_resolution_height);
11958 LOGD("CALIB focal_length_ratio %f ",
11959 calib->main_cam_specific_calibration.focal_length_ratio);
11960
11961 return rc;
11962 }
11963
11964 /*===========================================================================
11965 * FUNCTION : initBatchUpdate
11966 *
11967 * DESCRIPTION: init camera parameters buf entries
11968 *
11969 * PARAMETERS :
11970 * @p_table : ptr to parameter buffer
11971 *
11972 * RETURN : int32_t type of status
11973 * NO_ERROR -- success
11974 * none-zero failure code
11975 *==========================================================================*/
initBatchUpdate(parm_buffer_t * p_table)11976 int32_t QCameraParameters::initBatchUpdate(parm_buffer_t *p_table)
11977 {
11978 m_tempMap.clear();
11979 clear_metadata_buffer(p_table);
11980 return NO_ERROR;
11981 }
11982
11983 /*===========================================================================
11984 * FUNCTION : commitSetBatch
11985 *
11986 * DESCRIPTION: commit all set parameters in the batch work to backend
11987 *
11988 * PARAMETERS : none
11989 *
11990 * RETURN : int32_t type of status
11991 * NO_ERROR -- success
11992 * none-zero failure code
11993 *==========================================================================*/
commitSetBatch()11994 int32_t QCameraParameters::commitSetBatch()
11995 {
11996 int32_t rc = NO_ERROR;
11997 int32_t i = 0;
11998
11999 if (NULL == m_pParamBuf) {
12000 LOGE("Params not initialized");
12001 return NO_INIT;
12002 }
12003
12004 /* Loop to check if atleast one entry is valid */
12005 for(i = 0; i < CAM_INTF_PARM_MAX; i++){
12006 if(m_pParamBuf->is_valid[i])
12007 break;
12008 }
12009
12010 if (NULL == m_pCamOpsTbl) {
12011 LOGE("Ops not initialized");
12012 return NO_INIT;
12013 }
12014
12015 if (i < CAM_INTF_PARM_MAX) {
12016 rc = m_pCamOpsTbl->ops->set_parms(m_pCamOpsTbl->camera_handle, m_pParamBuf);
12017 }
12018 if (rc == NO_ERROR) {
12019 // commit change from temp storage into param map
12020 rc = commitParamChanges();
12021 }
12022 return rc;
12023 }
12024
12025 /*===========================================================================
12026 * FUNCTION : commitGetBatch
12027 *
12028 * DESCRIPTION: commit all get parameters in the batch work to backend
12029 *
12030 * PARAMETERS : none
12031 *
12032 * RETURN : int32_t type of status
12033 * NO_ERROR -- success
12034 * none-zero failure code
12035 *==========================================================================*/
commitGetBatch()12036 int32_t QCameraParameters::commitGetBatch()
12037 {
12038 int32_t rc = NO_ERROR;
12039 int32_t i = 0;
12040
12041 if (NULL == m_pParamBuf) {
12042 LOGE("Params not initialized");
12043 return NO_INIT;
12044 }
12045
12046 /* Loop to check if atleast one entry is valid */
12047 for(i = 0; i < CAM_INTF_PARM_MAX; i++){
12048 if(m_pParamBuf->is_valid[i])
12049 break;
12050 }
12051
12052 if (NULL == m_pCamOpsTbl) {
12053 LOGE("Ops not initialized");
12054 return NO_INIT;
12055 }
12056
12057 if (i < CAM_INTF_PARM_MAX) {
12058 return m_pCamOpsTbl->ops->get_parms(m_pCamOpsTbl->camera_handle, m_pParamBuf);
12059 } else {
12060 return NO_ERROR;
12061 }
12062 return rc;
12063 }
12064
12065 /*===========================================================================
12066 * FUNCTION : updateParamEntry
12067 *
12068 * DESCRIPTION: update a parameter entry in the local temp map obj
12069 *
12070 * PARAMETERS :
12071 * @key : key of the entry
12072 * @value : value of the entry
12073 *
12074 * RETURN : int32_t type of status
12075 * NO_ERROR -- success
12076 * none-zero failure code
12077 *==========================================================================*/
updateParamEntry(const char * key,const char * value)12078 int32_t QCameraParameters::updateParamEntry(const char *key, const char *value)
12079 {
12080 m_tempMap.replaceValueFor(String8(key), String8(value));
12081 return NO_ERROR;
12082 }
12083
12084 /*===========================================================================
12085 * FUNCTION : commitParamChanges
12086 *
12087 * DESCRIPTION: commit all changes in local temp map obj into parameter obj
12088 *
12089 * PARAMETERS : none
12090 *
12091 * RETURN : int32_t type of status
12092 * NO_ERROR -- success
12093 * none-zero failure code
12094 *==========================================================================*/
commitParamChanges()12095 int32_t QCameraParameters::commitParamChanges()
12096 {
12097 size_t size = m_tempMap.size();
12098 for (size_t i = 0; i < size; i++) {
12099 String8 k, v;
12100 k = m_tempMap.keyAt(i);
12101 v = m_tempMap.valueAt(i);
12102 set(k, v);
12103 }
12104 m_tempMap.clear();
12105
12106 // update local changes
12107 m_bRecordingHint = m_bRecordingHint_new;
12108 m_bZslMode = m_bZslMode_new;
12109
12110 /* After applying scene mode auto,
12111 Camera effects need to be reapplied */
12112 if ( m_bSceneTransitionAuto ) {
12113 m_bUpdateEffects = true;
12114 m_bSceneTransitionAuto = false;
12115 }
12116
12117
12118 return NO_ERROR;
12119 }
12120
12121 /*===========================================================================
12122 * FUNCTION : QCameraReprocScaleParam
12123 *
12124 * DESCRIPTION: constructor of QCameraReprocScaleParam
12125 *
12126 * PARAMETERS : none
12127 *
12128 * RETURN : none
12129 *==========================================================================*/
QCameraReprocScaleParam()12130 QCameraParameters::QCameraReprocScaleParam::QCameraReprocScaleParam()
12131 : mScaleEnabled(false),
12132 mIsUnderScaling(false),
12133 mNeedScaleCnt(0),
12134 mSensorSizeTblCnt(0),
12135 mSensorSizeTbl(NULL),
12136 mTotalSizeTblCnt(0)
12137 {
12138 mPicSizeFromAPK.width = 0;
12139 mPicSizeFromAPK.height = 0;
12140 mPicSizeSetted.width = 0;
12141 mPicSizeSetted.height = 0;
12142 memset(mNeedScaledSizeTbl, 0, sizeof(mNeedScaledSizeTbl));
12143 memset(mTotalSizeTbl, 0, sizeof(mTotalSizeTbl));
12144 }
12145
12146 /*===========================================================================
12147 * FUNCTION : ~~QCameraReprocScaleParam
12148 *
12149 * DESCRIPTION: destructor of QCameraReprocScaleParam
12150 *
12151 * PARAMETERS : none
12152 *
12153 * RETURN : none
12154 *==========================================================================*/
~QCameraReprocScaleParam()12155 QCameraParameters::QCameraReprocScaleParam::~QCameraReprocScaleParam()
12156 {
12157 //do nothing now.
12158 }
12159
12160 /*===========================================================================
12161 * FUNCTION : setScaledSizeTbl
12162 *
12163 * DESCRIPTION: re-set picture size table with dimensions that need scaling if Reproc Scale is enabled
12164 *
12165 * PARAMETERS :
12166 * @scale_cnt : count of picture sizes that want scale
12167 * @scale_tbl : picture size table that want scale
12168 * @org_cnt : sensor supported picture size count
12169 * @org_tbl : sensor supported picture size table
12170 *
12171 * RETURN : int32_t type of status
12172 * NO_ERROR -- success
12173 * none-zero failure code
12174 *==========================================================================*/
setScaleSizeTbl(size_t scale_cnt,cam_dimension_t * scale_tbl,size_t org_cnt,cam_dimension_t * org_tbl)12175 int32_t QCameraParameters::QCameraReprocScaleParam::setScaleSizeTbl(size_t scale_cnt,
12176 cam_dimension_t *scale_tbl, size_t org_cnt, cam_dimension_t *org_tbl)
12177 {
12178 int32_t rc = NO_ERROR;
12179 size_t i;
12180 mNeedScaleCnt = 0;
12181
12182 if(!mScaleEnabled || scale_cnt <=0 || scale_tbl == NULL || org_cnt <=0 || org_tbl == NULL){
12183 return BAD_VALUE; // Do not need scale, so also need not reset picture size table
12184 }
12185
12186 mSensorSizeTblCnt = org_cnt;
12187 mSensorSizeTbl = org_tbl;
12188 mNeedScaleCnt = checkScaleSizeTable(scale_cnt, scale_tbl, org_cnt, org_tbl);
12189 if(mNeedScaleCnt <= 0){
12190 LOGE("do not have picture sizes need scaling.");
12191 return BAD_VALUE;
12192 }
12193
12194 if(mNeedScaleCnt + org_cnt > MAX_SIZES_CNT){
12195 LOGE("picture size list exceed the max count.");
12196 return BAD_VALUE;
12197 }
12198
12199 //get the total picture size table
12200 mTotalSizeTblCnt = mNeedScaleCnt + org_cnt;
12201
12202 if (mNeedScaleCnt > MAX_SCALE_SIZES_CNT) {
12203 LOGE("Error!! mNeedScaleCnt (%d) is more than MAX_SCALE_SIZES_CNT",
12204 mNeedScaleCnt);
12205 return BAD_VALUE;
12206 }
12207
12208 for(i = 0; i < mNeedScaleCnt; i++){
12209 mTotalSizeTbl[i].width = mNeedScaledSizeTbl[i].width;
12210 mTotalSizeTbl[i].height = mNeedScaledSizeTbl[i].height;
12211 LOGH("scale picture size: i =%d, width=%d, height=%d.",
12212 i, mTotalSizeTbl[i].width, mTotalSizeTbl[i].height);
12213 }
12214 for(; i < mTotalSizeTblCnt; i++){
12215 mTotalSizeTbl[i].width = org_tbl[i-mNeedScaleCnt].width;
12216 mTotalSizeTbl[i].height = org_tbl[i-mNeedScaleCnt].height;
12217 LOGH("sensor supportted picture size: i =%d, width=%d, height=%d.",
12218 i, mTotalSizeTbl[i].width, mTotalSizeTbl[i].height);
12219 }
12220 return rc;
12221 }
12222
12223 /*===========================================================================
12224 * FUNCTION : getScaledSizeTblCnt
12225 *
12226 * DESCRIPTION: get picture size cnt that need scale
12227 *
12228 * PARAMETERS : none
12229 *
12230 * RETURN : uint8_t type of picture size count
12231 *==========================================================================*/
getScaleSizeTblCnt()12232 size_t QCameraParameters::QCameraReprocScaleParam::getScaleSizeTblCnt()
12233 {
12234 return mNeedScaleCnt;
12235 }
12236
12237 /*===========================================================================
12238 * FUNCTION : getScaledSizeTbl
12239 *
12240 * DESCRIPTION: get picture size table that need scale
12241 *
12242 * PARAMETERS : none
12243 *
12244 * RETURN : cam_dimension_t list of picture size table
12245 *==========================================================================*/
getScaledSizeTbl()12246 cam_dimension_t *QCameraParameters::QCameraReprocScaleParam::getScaledSizeTbl()
12247 {
12248 if(!mScaleEnabled)
12249 return NULL;
12250
12251 return mNeedScaledSizeTbl;
12252 }
12253
12254 /*===========================================================================
12255 * FUNCTION : setScaleEnable
12256 *
12257 * DESCRIPTION: enable or disable Reproc Scale
12258 *
12259 * PARAMETERS :
12260 * @enabled : enable: 1; disable 0
12261 *
12262 * RETURN : none
12263 *==========================================================================*/
setScaleEnable(bool enabled)12264 void QCameraParameters::QCameraReprocScaleParam::setScaleEnable(bool enabled)
12265 {
12266 mScaleEnabled = enabled;
12267 }
12268
12269 /*===========================================================================
12270 * FUNCTION : isScaleEnabled
12271 *
12272 * DESCRIPTION: check if Reproc Scale is enabled
12273 *
12274 * PARAMETERS : none
12275 *
12276 * RETURN : bool type of status
12277 *==========================================================================*/
isScaleEnabled()12278 bool QCameraParameters::QCameraReprocScaleParam::isScaleEnabled()
12279 {
12280 return mScaleEnabled;
12281 }
12282
12283 /*===========================================================================
12284 * FUNCTION : isScalePicSize
12285 *
12286 * DESCRIPTION: check if current picture size is from Scale Table
12287 *
12288 * PARAMETERS :
12289 * @width : current picture width
12290 * @height : current picture height
12291 *
12292 * RETURN : bool type of status
12293 *==========================================================================*/
isScalePicSize(int width,int height)12294 bool QCameraParameters::QCameraReprocScaleParam::isScalePicSize(int width, int height)
12295 {
12296 //Check if the picture size is in scale table
12297 if(mNeedScaleCnt <= 0)
12298 return FALSE;
12299
12300 for (size_t i = 0; i < mNeedScaleCnt; i++) {
12301 if ((mNeedScaledSizeTbl[i].width == width) && (mNeedScaledSizeTbl[i].height == height)) {
12302 //found match
12303 return TRUE;
12304 }
12305 }
12306
12307 LOGE("Not in scale picture size table.");
12308 return FALSE;
12309 }
12310
12311 /*===========================================================================
12312 * FUNCTION : isValidatePicSize
12313 *
12314 * DESCRIPTION: check if current picture size is validate
12315 *
12316 * PARAMETERS :
12317 * @width : current picture width
12318 * @height : current picture height
12319 *
12320 * RETURN : bool type of status
12321 *==========================================================================*/
isValidatePicSize(int width,int height)12322 bool QCameraParameters::QCameraReprocScaleParam::isValidatePicSize(int width, int height)
12323 {
12324 size_t i = 0;
12325
12326 for(i = 0; i < mSensorSizeTblCnt; i++){
12327 if(mSensorSizeTbl[i].width == width
12328 && mSensorSizeTbl[i].height== height){
12329 return TRUE;
12330 }
12331 }
12332
12333 for(i = 0; i < mNeedScaleCnt; i++){
12334 if(mNeedScaledSizeTbl[i].width == width
12335 && mNeedScaledSizeTbl[i].height== height){
12336 return TRUE;
12337 }
12338 }
12339
12340 LOGE("Invalidate input picture size.");
12341 return FALSE;
12342 }
12343
12344 /*===========================================================================
12345 * FUNCTION : setSensorSupportedPicSize
12346 *
12347 * DESCRIPTION: set sensor supported picture size.
12348 * For Snapshot stream size configuration, we need use sensor supported size.
12349 * We will use CPP to do Scaling based on output Snapshot stream.
12350 *
12351 * PARAMETERS : none
12352 *
12353 * RETURN : int32_t type of status
12354 * NO_ERROR -- success
12355 * none-zero failure code
12356 *==========================================================================*/
setSensorSupportedPicSize()12357 int32_t QCameraParameters::QCameraReprocScaleParam::setSensorSupportedPicSize()
12358 {
12359 //will find a suitable picture size (here we leave a prossibility to add other scale requirement)
12360 //Currently we only focus on upscaling, and checkScaleSizeTable() has guaranteed the dimension ratio.
12361
12362 if(!mIsUnderScaling || mSensorSizeTblCnt <= 0)
12363 return BAD_VALUE;
12364
12365 //We just get the max sensor supported size here.
12366 mPicSizeSetted.width = mSensorSizeTbl[0].width;
12367 mPicSizeSetted.height = mSensorSizeTbl[0].height;
12368
12369 return NO_ERROR;
12370 }
12371
12372
12373 /*===========================================================================
12374 * FUNCTION : setValidatePicSize
12375 *
12376 * DESCRIPTION: set sensor supported size and change scale status.
12377 *
12378 * PARAMETERS :
12379 * @width : input picture width
12380 * @height : input picture height
12381 *
12382 * RETURN : int32_t type of status
12383 * NO_ERROR -- success
12384 * none-zero failure code
12385 *==========================================================================*/
setValidatePicSize(int & width,int & height)12386 int32_t QCameraParameters::QCameraReprocScaleParam::setValidatePicSize(int &width,int &height)
12387 {
12388 if(!mScaleEnabled)
12389 return BAD_VALUE;
12390
12391 mIsUnderScaling = FALSE; //default: not under scale
12392
12393 if(isScalePicSize(width, height)){
12394 // input picture size need scaling operation. Record size from APK and setted
12395 mIsUnderScaling = TRUE;
12396 mPicSizeFromAPK.width = width;
12397 mPicSizeFromAPK.height = height;
12398
12399 if(setSensorSupportedPicSize() != NO_ERROR)
12400 return BAD_VALUE;
12401
12402 //re-set picture size to sensor supported size
12403 width = mPicSizeSetted.width;
12404 height = mPicSizeSetted.height;
12405 LOGH("mPicSizeFromAPK- with=%d, height=%d, mPicSizeSetted- with =%d, height=%d.",
12406 mPicSizeFromAPK.width, mPicSizeFromAPK.height, mPicSizeSetted.width, mPicSizeSetted.height);
12407 }else{
12408 mIsUnderScaling = FALSE;
12409 //no scale is needed for input picture size
12410 if(!isValidatePicSize(width, height)){
12411 LOGE("invalidate input picture size.");
12412 return BAD_VALUE;
12413 }
12414 mPicSizeSetted.width = width;
12415 mPicSizeSetted.height = height;
12416 }
12417
12418 LOGH("X. mIsUnderScaling=%d, width=%d, height=%d.", mIsUnderScaling, width, height);
12419 return NO_ERROR;
12420 }
12421
12422 /*===========================================================================
12423 * FUNCTION : getPicSizeFromAPK
12424 *
12425 * DESCRIPTION: get picture size that get from APK
12426 *
12427 * PARAMETERS :
12428 * @width : input width
12429 * @height : input height
12430 *
12431 * RETURN : int32_t type of status
12432 * NO_ERROR -- success
12433 * none-zero failure code
12434 *==========================================================================*/
getPicSizeFromAPK(int & width,int & height)12435 int32_t QCameraParameters::QCameraReprocScaleParam::getPicSizeFromAPK(int &width, int &height)
12436 {
12437 if(!mIsUnderScaling)
12438 return BAD_VALUE;
12439
12440 width = mPicSizeFromAPK.width;
12441 height = mPicSizeFromAPK.height;
12442 return NO_ERROR;
12443 }
12444
12445 /*===========================================================================
12446 * FUNCTION : getPicSizeSetted
12447 *
12448 * DESCRIPTION: get picture size that setted into mm-camera
12449 *
12450 * PARAMETERS :
12451 * @width : input width
12452 * @height : input height
12453 *
12454 * RETURN : int32_t type of status
12455 * NO_ERROR -- success
12456 * none-zero failure code
12457 *==========================================================================*/
getPicSizeSetted(int & width,int & height)12458 int32_t QCameraParameters::QCameraReprocScaleParam::getPicSizeSetted(int &width, int &height)
12459 {
12460 width = mPicSizeSetted.width;
12461 height = mPicSizeSetted.height;
12462 return NO_ERROR;
12463 }
12464
12465 /*===========================================================================
12466 * FUNCTION : isUnderScaling
12467 *
12468 * DESCRIPTION: check if we are in Reproc Scaling requirment
12469 *
12470 * PARAMETERS : none
12471 *
12472 * RETURN : bool type of status
12473 *==========================================================================*/
isUnderScaling()12474 bool QCameraParameters::QCameraReprocScaleParam::isUnderScaling()
12475 {
12476 return mIsUnderScaling;
12477 }
12478
12479 /*===========================================================================
12480 * FUNCTION : checkScaleSizeTable
12481 *
12482 * DESCRIPTION: check PICTURE_SIZE_NEED_SCALE to choose
12483 *
12484 * PARAMETERS :
12485 * @scale_cnt : count of picture sizes that want scale
12486 * @scale_tbl : picture size table that want scale
12487 * @org_cnt : sensor supported picture size count
12488 * @org_tbl : sensor supported picture size table
12489 *
12490 * RETURN : bool type of status
12491 *==========================================================================*/
checkScaleSizeTable(size_t scale_cnt,cam_dimension_t * scale_tbl,size_t org_cnt,cam_dimension_t * org_tbl)12492 size_t QCameraParameters::QCameraReprocScaleParam::checkScaleSizeTable(size_t scale_cnt,
12493 cam_dimension_t *scale_tbl, size_t org_cnt, cam_dimension_t *org_tbl)
12494 {
12495 size_t stbl_cnt = 0;
12496 size_t temp_cnt = 0;
12497 ssize_t i = 0;
12498 if(scale_cnt <=0 || scale_tbl == NULL || org_tbl == NULL || org_cnt <= 0)
12499 return stbl_cnt;
12500
12501 //get validate scale size table. Currently we only support:
12502 // 1. upscale. The scale size must larger than max sensor supported size
12503 // 2. Scale dimension ratio must be same as the max sensor supported size.
12504 temp_cnt = scale_cnt;
12505 for (i = (ssize_t)(scale_cnt - 1); i >= 0; i--) {
12506 if (scale_tbl[i].width > org_tbl[0].width ||
12507 (scale_tbl[i].width == org_tbl[0].width &&
12508 scale_tbl[i].height > org_tbl[0].height)) {
12509 //get the smallest scale size
12510 break;
12511 }
12512 temp_cnt--;
12513 }
12514
12515 //check dimension ratio
12516 double supported_ratio = (double)org_tbl[0].width / (double)org_tbl[0].height;
12517 for (i = 0; i < (ssize_t)temp_cnt; i++) {
12518 double cur_ratio = (double)scale_tbl[i].width / (double)scale_tbl[i].height;
12519 if (fabs(supported_ratio - cur_ratio) > ASPECT_TOLERANCE) {
12520 continue;
12521 }
12522 mNeedScaledSizeTbl[stbl_cnt].width = scale_tbl[i].width;
12523 mNeedScaledSizeTbl[stbl_cnt].height= scale_tbl[i].height;
12524 stbl_cnt++;
12525 }
12526
12527 return stbl_cnt;
12528 }
12529
12530 /*===========================================================================
12531 * FUNCTION : getTotalSizeTblCnt
12532 *
12533 * DESCRIPTION: get total picture size count after adding dimensions that need scaling
12534 *
12535 * PARAMETERS : none
12536 *
12537 * RETURN : uint8_t type of picture size count
12538 *==========================================================================*/
getTotalSizeTblCnt()12539 size_t QCameraParameters::QCameraReprocScaleParam::getTotalSizeTblCnt()
12540 {
12541 return mTotalSizeTblCnt;
12542 }
12543
12544 /*===========================================================================
12545 * FUNCTION : getTotalSizeTbl
12546 *
12547 * DESCRIPTION: get picture size table after adding dimensions that need scaling
12548 *
12549 * PARAMETERS : none
12550 *
12551 * RETURN : cam_dimension_t list of picture size table
12552 *==========================================================================*/
getTotalSizeTbl()12553 cam_dimension_t *QCameraParameters::QCameraReprocScaleParam::getTotalSizeTbl()
12554 {
12555 if(!mScaleEnabled)
12556 return NULL;
12557
12558 return mTotalSizeTbl;
12559 }
12560
12561 /*===========================================================================
12562 * FUNCTION : setEztune
12563 *
12564 * DESCRIPTION: Enable/Disable EZtune
12565 *
12566 *==========================================================================*/
setEztune()12567 int32_t QCameraParameters::setEztune()
12568 {
12569 char prop[PROPERTY_VALUE_MAX];
12570 memset(prop, 0, sizeof(prop));
12571 property_get("persist.camera.eztune.enable", prop, "0");
12572 m_bEztuneEnabled = atoi(prop);
12573 return NO_ERROR;
12574 }
12575
12576 /*===========================================================================
12577 * FUNCTION : isHDREnabled
12578 *
12579 * DESCRIPTION: if HDR is enabled
12580 *
12581 * PARAMETERS : none
12582 *
12583 * RETURN : true: needed
12584 * false: no need
12585 *==========================================================================*/
isHDREnabled()12586 bool QCameraParameters::isHDREnabled()
12587 {
12588 return ((m_bHDREnabled || m_HDRSceneEnabled));
12589 }
12590
12591 /*===========================================================================
12592 * FUNCTION : isAVTimerEnabled
12593 *
12594 * DESCRIPTION: if AVTimer is enabled
12595 *
12596 * PARAMETERS : none
12597 *
12598 * RETURN : true: needed
12599 * false: no need
12600 *==========================================================================*/
isAVTimerEnabled()12601 bool QCameraParameters::isAVTimerEnabled()
12602 {
12603 return m_bAVTimerEnabled;
12604 }
12605
12606 /*===========================================================================
12607 * FUNCTION : isDISEnabled
12608 *
12609 * DESCRIPTION: if DIS is enabled
12610 *
12611 * PARAMETERS : none
12612 *
12613 * RETURN : true: needed
12614 * false: no need
12615 *==========================================================================*/
isDISEnabled()12616 bool QCameraParameters::isDISEnabled()
12617 {
12618 return m_bDISEnabled;
12619 }
12620
12621 /*===========================================================================
12622 * FUNCTION : getISType
12623 *
12624 * DESCRIPTION: returns IS type
12625 *
12626 * PARAMETERS : none
12627 *
12628 * RETURN : IS type
12629 *
12630 *==========================================================================*/
getISType()12631 cam_is_type_t QCameraParameters::getISType()
12632 {
12633 return mIsType;
12634 }
12635
12636 /*===========================================================================
12637 * FUNCTION : MobicatMask
12638 *
12639 * DESCRIPTION: returns mobicat mask
12640 *
12641 * PARAMETERS : none
12642 *
12643 * RETURN : mobicat mask
12644 *
12645 *==========================================================================*/
getMobicatMask()12646 uint8_t QCameraParameters::getMobicatMask()
12647 {
12648 return m_MobiMask;
12649 }
12650
12651 /*===========================================================================
12652 * FUNCTION : sendStreamConfigInfo
12653 *
12654 * DESCRIPTION: send Stream config info.
12655 *
12656 * PARAMETERS :
12657 * @stream_config_info: Stream config information
12658 *
12659 * RETURN : int32_t type of status
12660 * NO_ERROR -- success
12661 * none-zero failure code
12662 *==========================================================================*/
sendStreamConfigInfo(cam_stream_size_info_t & stream_config_info)12663 bool QCameraParameters::sendStreamConfigInfo(cam_stream_size_info_t &stream_config_info) {
12664 int32_t rc = NO_ERROR;
12665 if(initBatchUpdate(m_pParamBuf) < 0 ) {
12666 LOGE("Failed to initialize group update table");
12667 return BAD_TYPE;
12668 }
12669
12670 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
12671 CAM_INTF_META_STREAM_INFO, stream_config_info)) {
12672 LOGE("Failed to update table");
12673 return BAD_VALUE;
12674 }
12675
12676 rc = commitSetBatch();
12677 if (rc != NO_ERROR) {
12678 LOGE("Failed to set stream info parm");
12679 return rc;
12680 }
12681
12682 return rc;
12683 }
12684
12685 /*===========================================================================
12686 * FUNCTION : setStreamConfigure
12687 *
12688 * DESCRIPTION: set stream type, stream dimension for all configured streams.
12689 *
12690 * PARAMETERS :
12691 * @isCapture: Whether this configureation is for an image capture
12692 * @previewAsPostview: Use preview as postview
12693 *
12694 * RETURN : int32_t type of status
12695 * NO_ERROR -- success
12696 * none-zero failure code
12697 *==========================================================================*/
setStreamConfigure(bool isCapture,bool previewAsPostview,bool resetConfig)12698 bool QCameraParameters::setStreamConfigure(bool isCapture,
12699 bool previewAsPostview, bool resetConfig) {
12700
12701 int32_t rc = NO_ERROR;
12702 cam_stream_size_info_t stream_config_info;
12703 char value[PROPERTY_VALUE_MAX];
12704 bool raw_yuv = false;
12705 bool raw_capture = false;
12706
12707 if ( m_pParamBuf == NULL ) {
12708 return NO_INIT;
12709 }
12710
12711 memset(&stream_config_info, 0, sizeof(stream_config_info));
12712 stream_config_info.num_streams = 0;
12713
12714 if (resetConfig) {
12715 LOGH("Reset stream config!!");
12716 rc = sendStreamConfigInfo(stream_config_info);
12717 LOGH("Done Resetting stream config!!");
12718 return rc;
12719 }
12720
12721 stream_config_info.hfr_mode = static_cast<cam_hfr_mode_t>(mHfrMode);
12722 stream_config_info.buf_alignment = m_pCapability->buf_alignment;
12723 stream_config_info.min_stride = m_pCapability->min_stride;
12724 stream_config_info.min_scanline = m_pCapability->min_scanline;
12725 stream_config_info.batch_size = getBufBatchCount();
12726
12727 property_get("persist.camera.raw_yuv", value, "0");
12728 raw_yuv = atoi(value) > 0 ? true : false;
12729
12730 if (isZSLMode() && getRecordingHintValue() != true) {
12731 stream_config_info.type[stream_config_info.num_streams] =
12732 CAM_STREAM_TYPE_PREVIEW;
12733 getStreamDimension(CAM_STREAM_TYPE_PREVIEW,
12734 stream_config_info.stream_sizes[stream_config_info.num_streams]);
12735 updatePpFeatureMask(CAM_STREAM_TYPE_PREVIEW);
12736 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
12737 mStreamPpMask[CAM_STREAM_TYPE_PREVIEW];
12738 getStreamFormat(CAM_STREAM_TYPE_PREVIEW,
12739 stream_config_info.format[stream_config_info.num_streams]);
12740 stream_config_info.num_streams++;
12741
12742 stream_config_info.type[stream_config_info.num_streams] =
12743 CAM_STREAM_TYPE_ANALYSIS;
12744 getStreamDimension(CAM_STREAM_TYPE_ANALYSIS,
12745 stream_config_info.stream_sizes[stream_config_info.num_streams]);
12746 updatePpFeatureMask(CAM_STREAM_TYPE_ANALYSIS);
12747 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
12748 mStreamPpMask[CAM_STREAM_TYPE_ANALYSIS];
12749 getStreamFormat(CAM_STREAM_TYPE_ANALYSIS,
12750 stream_config_info.format[stream_config_info.num_streams]);
12751 stream_config_info.num_streams++;
12752
12753 stream_config_info.type[stream_config_info.num_streams] =
12754 CAM_STREAM_TYPE_SNAPSHOT;
12755 getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,
12756 stream_config_info.stream_sizes[stream_config_info.num_streams]);
12757 updatePpFeatureMask(CAM_STREAM_TYPE_SNAPSHOT);
12758 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
12759 mStreamPpMask[CAM_STREAM_TYPE_SNAPSHOT];
12760 getStreamFormat(CAM_STREAM_TYPE_SNAPSHOT,
12761 stream_config_info.format[stream_config_info.num_streams]);
12762 stream_config_info.num_streams++;
12763
12764 if (isUBWCEnabled() && getRecordingHintValue() != true) {
12765 cam_format_t fmt;
12766 getStreamFormat(CAM_STREAM_TYPE_PREVIEW,fmt);
12767 if (fmt == CAM_FORMAT_YUV_420_NV12_UBWC) {
12768 stream_config_info.type[stream_config_info.num_streams] =
12769 CAM_STREAM_TYPE_CALLBACK;
12770 getStreamDimension(CAM_STREAM_TYPE_CALLBACK,
12771 stream_config_info.stream_sizes[stream_config_info.num_streams]);
12772 updatePpFeatureMask(CAM_STREAM_TYPE_CALLBACK);
12773 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
12774 mStreamPpMask[CAM_STREAM_TYPE_CALLBACK];
12775 getStreamFormat(CAM_STREAM_TYPE_CALLBACK,
12776 stream_config_info.format[stream_config_info.num_streams]);
12777 stream_config_info.num_streams++;
12778 }
12779 }
12780
12781 } else if (!isCapture) {
12782 if (m_bRecordingHint) {
12783 if (m_bDISEnabled) {
12784 char value[PROPERTY_VALUE_MAX];
12785 // Make default value for IS_TYPE as IS_TYPE_EIS_2_0
12786 property_get("persist.camera.is_type", value, "4");
12787 mIsType = static_cast<cam_is_type_t>(atoi(value));
12788 } else {
12789 mIsType = IS_TYPE_NONE;
12790 }
12791 stream_config_info.is_type = mIsType;
12792 stream_config_info.type[stream_config_info.num_streams] =
12793 CAM_STREAM_TYPE_SNAPSHOT;
12794 getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,
12795 stream_config_info.stream_sizes[stream_config_info.num_streams]);
12796 updatePpFeatureMask(CAM_STREAM_TYPE_SNAPSHOT);
12797 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
12798 mStreamPpMask[CAM_STREAM_TYPE_SNAPSHOT];
12799 getStreamFormat(CAM_STREAM_TYPE_SNAPSHOT,
12800 stream_config_info.format[stream_config_info.num_streams]);
12801 stream_config_info.num_streams++;
12802
12803 stream_config_info.type[stream_config_info.num_streams] =
12804 CAM_STREAM_TYPE_VIDEO;
12805 getStreamDimension(CAM_STREAM_TYPE_VIDEO,
12806 stream_config_info.stream_sizes[stream_config_info.num_streams]);
12807 updatePpFeatureMask(CAM_STREAM_TYPE_VIDEO);
12808 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
12809 mStreamPpMask[CAM_STREAM_TYPE_VIDEO];
12810 getStreamFormat(CAM_STREAM_TYPE_VIDEO,
12811 stream_config_info.format[stream_config_info.num_streams]);
12812 stream_config_info.num_streams++;
12813 }
12814
12815 /* Analysis stream is needed by DCRF regardless of recording hint */
12816 if ((getDcrf() == true) ||
12817 (getRecordingHintValue() != true) ||
12818 (fdModeInVideo())) {
12819 stream_config_info.type[stream_config_info.num_streams] =
12820 CAM_STREAM_TYPE_ANALYSIS;
12821 getStreamDimension(CAM_STREAM_TYPE_ANALYSIS,
12822 stream_config_info.stream_sizes[stream_config_info.num_streams]);
12823 updatePpFeatureMask(CAM_STREAM_TYPE_ANALYSIS);
12824 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
12825 mStreamPpMask[CAM_STREAM_TYPE_ANALYSIS];
12826 getStreamFormat(CAM_STREAM_TYPE_ANALYSIS,
12827 stream_config_info.format[stream_config_info.num_streams]);
12828 stream_config_info.num_streams++;
12829 }
12830
12831 stream_config_info.type[stream_config_info.num_streams] =
12832 CAM_STREAM_TYPE_PREVIEW;
12833 getStreamDimension(CAM_STREAM_TYPE_PREVIEW,
12834 stream_config_info.stream_sizes[stream_config_info.num_streams]);
12835 updatePpFeatureMask(CAM_STREAM_TYPE_PREVIEW);
12836 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
12837 mStreamPpMask[CAM_STREAM_TYPE_PREVIEW];
12838 getStreamFormat(CAM_STREAM_TYPE_PREVIEW,
12839 stream_config_info.format[stream_config_info.num_streams]);
12840 stream_config_info.num_streams++;
12841
12842 if (isUBWCEnabled() && getRecordingHintValue() != true) {
12843 cam_format_t fmt;
12844 getStreamFormat(CAM_STREAM_TYPE_PREVIEW,fmt);
12845 if (fmt == CAM_FORMAT_YUV_420_NV12_UBWC) {
12846 stream_config_info.type[stream_config_info.num_streams] =
12847 CAM_STREAM_TYPE_CALLBACK;
12848 getStreamDimension(CAM_STREAM_TYPE_CALLBACK,
12849 stream_config_info.stream_sizes[stream_config_info.num_streams]);
12850 updatePpFeatureMask(CAM_STREAM_TYPE_CALLBACK);
12851 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
12852 mStreamPpMask[CAM_STREAM_TYPE_CALLBACK];
12853 getStreamFormat(CAM_STREAM_TYPE_CALLBACK,
12854 stream_config_info.format[stream_config_info.num_streams]);
12855 stream_config_info.num_streams++;
12856 }
12857 }
12858
12859 } else {
12860 if (isJpegPictureFormat() || isNV16PictureFormat() || isNV21PictureFormat()) {
12861 if (!getofflineRAW()) {
12862 stream_config_info.type[stream_config_info.num_streams] =
12863 CAM_STREAM_TYPE_SNAPSHOT;
12864 getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,
12865 stream_config_info.stream_sizes[stream_config_info.num_streams]);
12866 updatePpFeatureMask(CAM_STREAM_TYPE_SNAPSHOT);
12867 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
12868 mStreamPpMask[CAM_STREAM_TYPE_SNAPSHOT];
12869 getStreamFormat(CAM_STREAM_TYPE_SNAPSHOT,
12870 stream_config_info.format[stream_config_info.num_streams]);
12871 stream_config_info.num_streams++;
12872 }
12873
12874 if (previewAsPostview) {
12875 stream_config_info.type[stream_config_info.num_streams] =
12876 CAM_STREAM_TYPE_PREVIEW;
12877 getStreamDimension(CAM_STREAM_TYPE_PREVIEW,
12878 stream_config_info.stream_sizes[stream_config_info.num_streams]);
12879 updatePpFeatureMask(CAM_STREAM_TYPE_PREVIEW);
12880 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
12881 mStreamPpMask[CAM_STREAM_TYPE_PREVIEW];
12882 getStreamFormat(CAM_STREAM_TYPE_PREVIEW,
12883 stream_config_info.format[stream_config_info.num_streams]);
12884 stream_config_info.num_streams++;
12885 } else {
12886 stream_config_info.type[stream_config_info.num_streams] =
12887 CAM_STREAM_TYPE_POSTVIEW;
12888 getStreamDimension(CAM_STREAM_TYPE_POSTVIEW,
12889 stream_config_info.stream_sizes[stream_config_info.num_streams]);
12890 updatePpFeatureMask(CAM_STREAM_TYPE_POSTVIEW);
12891 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
12892 mStreamPpMask[CAM_STREAM_TYPE_POSTVIEW];
12893 getStreamFormat(CAM_STREAM_TYPE_POSTVIEW,
12894 stream_config_info.format[stream_config_info.num_streams]);
12895 stream_config_info.num_streams++;
12896 }
12897 } else {
12898 raw_capture = true;
12899 stream_config_info.type[stream_config_info.num_streams] =
12900 CAM_STREAM_TYPE_RAW;
12901 getStreamDimension(CAM_STREAM_TYPE_RAW,
12902 stream_config_info.stream_sizes[stream_config_info.num_streams]);
12903 updatePpFeatureMask(CAM_STREAM_TYPE_RAW);
12904 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
12905 mStreamPpMask[CAM_STREAM_TYPE_RAW];
12906 getStreamFormat(CAM_STREAM_TYPE_RAW,
12907 stream_config_info.format[stream_config_info.num_streams]);
12908 stream_config_info.num_streams++;
12909 }
12910 }
12911
12912 if ((!raw_capture) && ((getofflineRAW() && !getRecordingHintValue())
12913 || (raw_yuv))) {
12914 cam_dimension_t max_dim = {0,0};
12915 // Find the Maximum dimension admong all the streams
12916 for (uint32_t j = 0; j < stream_config_info.num_streams; j++) {
12917 if (stream_config_info.stream_sizes[j].width > max_dim.width) {
12918 max_dim.width = stream_config_info.stream_sizes[j].width;
12919 }
12920 if (stream_config_info.stream_sizes[j].height > max_dim.height) {
12921 max_dim.height = stream_config_info.stream_sizes[j].height;
12922 }
12923 }
12924 LOGH("Max Dimension = %d X %d", max_dim.width, max_dim.height);
12925 updateRAW(max_dim);
12926 stream_config_info.type[stream_config_info.num_streams] =
12927 CAM_STREAM_TYPE_RAW;
12928 getStreamDimension(CAM_STREAM_TYPE_RAW,
12929 stream_config_info.stream_sizes[stream_config_info.num_streams]);
12930 updatePpFeatureMask(CAM_STREAM_TYPE_RAW);
12931 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
12932 mStreamPpMask[CAM_STREAM_TYPE_RAW];
12933 getStreamFormat(CAM_STREAM_TYPE_RAW,
12934 stream_config_info.format[stream_config_info.num_streams]);
12935 stream_config_info.num_streams++;
12936 }
12937 for (uint32_t k = 0; k < stream_config_info.num_streams; k++) {
12938 LOGI("STREAM INFO : type %d, wxh: %d x %d, pp_mask: 0x%llx Format = %d",
12939 stream_config_info.type[k],
12940 stream_config_info.stream_sizes[k].width,
12941 stream_config_info.stream_sizes[k].height,
12942 stream_config_info.postprocess_mask[k],
12943 stream_config_info.format[k]);
12944 }
12945
12946 rc = sendStreamConfigInfo(stream_config_info);
12947 return rc;
12948 }
12949
12950 /*===========================================================================
12951 * FUNCTION : addOnlineRotation
12952 *
12953 * DESCRIPTION: send additional rotation information for specific stream
12954 *
12955 * PARAMETERS :
12956 * @rotation: rotation
12957 * @streamId: internal stream id
12958 * @device_rotation: device rotation
12959 *
12960 * RETURN : int32_t type of status
12961 * NO_ERROR -- success
12962 * none-zero failure code
12963 *==========================================================================*/
addOnlineRotation(uint32_t rotation,uint32_t streamId,int32_t device_rotation)12964 int32_t QCameraParameters::addOnlineRotation(uint32_t rotation, uint32_t streamId,
12965 int32_t device_rotation)
12966 {
12967 int32_t rc = NO_ERROR;
12968 cam_rotation_info_t rotation_info;
12969 memset(&rotation_info, 0, sizeof(cam_rotation_info_t));
12970
12971 /* Add jpeg rotation information */
12972 if (rotation == 0) {
12973 rotation_info.rotation = ROTATE_0;
12974 } else if (rotation == 90) {
12975 rotation_info.rotation = ROTATE_90;
12976 } else if (rotation == 180) {
12977 rotation_info.rotation = ROTATE_180;
12978 } else if (rotation == 270) {
12979 rotation_info.rotation = ROTATE_270;
12980 } else {
12981 rotation_info.rotation = ROTATE_0;
12982 }
12983 rotation_info.streamId = streamId;
12984
12985 /* Add device rotation information */
12986 if (device_rotation == 0) {
12987 rotation_info.device_rotation = ROTATE_0;
12988 } else if (device_rotation == 90) {
12989 rotation_info.device_rotation = ROTATE_90;
12990 } else if (device_rotation == 180) {
12991 rotation_info.device_rotation = ROTATE_180;
12992 } else if (device_rotation == 270) {
12993 rotation_info.device_rotation = ROTATE_270;
12994 } else {
12995 rotation_info.device_rotation = ROTATE_0;
12996 }
12997
12998 if(initBatchUpdate(m_pParamBuf) < 0 ) {
12999 LOGE("Failed to initialize group update table");
13000 return BAD_TYPE;
13001 }
13002
13003 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ROTATION, rotation_info)) {
13004 LOGE("Failed to update table");
13005 return BAD_VALUE;
13006 }
13007
13008 rc = commitSetBatch();
13009 if (rc != NO_ERROR) {
13010 LOGE("Failed to set stream info parm");
13011 return rc;
13012 }
13013
13014 return rc;
13015 }
13016
13017 /*===========================================================================
13018 * FUNCTION : needThumbnailReprocess
13019 *
13020 * DESCRIPTION: Check if thumbnail reprocessing is needed
13021 *
13022 * PARAMETERS : @pFeatureMask - feature mask
13023 *
13024 * RETURN : true: needed
13025 * false: no need
13026 *==========================================================================*/
needThumbnailReprocess(cam_feature_mask_t * pFeatureMask)13027 bool QCameraParameters::needThumbnailReprocess(cam_feature_mask_t *pFeatureMask)
13028 {
13029 if (isUbiFocusEnabled() || isChromaFlashEnabled() ||
13030 isOptiZoomEnabled() || isUbiRefocus() ||
13031 isStillMoreEnabled() ||
13032 (isHDREnabled() && !isHDRThumbnailProcessNeeded())
13033 || isUBWCEnabled()) {
13034 *pFeatureMask &= ~CAM_QCOM_FEATURE_CHROMA_FLASH;
13035 *pFeatureMask &= ~CAM_QCOM_FEATURE_UBIFOCUS;
13036 *pFeatureMask &= ~CAM_QCOM_FEATURE_REFOCUS;
13037 *pFeatureMask &= ~CAM_QCOM_FEATURE_OPTIZOOM;
13038 *pFeatureMask &= ~CAM_QCOM_FEATURE_STILLMORE;
13039 *pFeatureMask &= ~CAM_QCOM_FEATURE_HDR;
13040 return false;
13041 } else {
13042 cam_dimension_t thumb_dim;
13043 getThumbnailSize(&(thumb_dim.width), &(thumb_dim.height));
13044 if (thumb_dim.width == 0 || thumb_dim.height == 0) {
13045 return false;
13046 }
13047 else {
13048 return true;
13049 }
13050 }
13051 }
13052
13053 /*===========================================================================
13054 * FUNCTION : getNumOfExtraBuffersForImageProc
13055 *
13056 * DESCRIPTION: get number of extra input buffers needed by image processing
13057 *
13058 * PARAMETERS : none
13059 *
13060 * RETURN : number of extra buffers needed by ImageProc;
13061 * 0 if not ImageProc enabled
13062 *==========================================================================*/
getNumOfExtraBuffersForImageProc()13063 uint8_t QCameraParameters::getNumOfExtraBuffersForImageProc()
13064 {
13065 int numOfBufs = 0;
13066
13067 if (isUbiRefocus()) {
13068 return (uint8_t)(m_pCapability->refocus_af_bracketing_need.burst_count - 1);
13069 } else if (isUbiFocusEnabled()) {
13070 numOfBufs += m_pCapability->ubifocus_af_bracketing_need.burst_count - 1;
13071 } else if (m_bOptiZoomOn) {
13072 numOfBufs += m_pCapability->opti_zoom_settings_need.burst_count - 1;
13073 } else if (isChromaFlashEnabled()) {
13074 numOfBufs += m_pCapability->chroma_flash_settings_need.burst_count - 1;
13075 } else if (isStillMoreEnabled()) {
13076 if (isSeeMoreEnabled()) {
13077 m_stillmore_config.burst_count = 1;
13078 } else if ((m_stillmore_config.burst_count >=
13079 m_pCapability->stillmore_settings_need.min_burst_count) &&
13080 (m_stillmore_config.burst_count <=
13081 m_pCapability->stillmore_settings_need.max_burst_count)) {
13082 numOfBufs += m_stillmore_config.burst_count - 1;
13083 } else {
13084 numOfBufs += m_pCapability->stillmore_settings_need.burst_count - 1;
13085 }
13086 } else if (isOEMFeatEnabled()) {
13087 numOfBufs += 1;
13088 }
13089
13090 return (uint8_t)(numOfBufs);
13091 }
13092
13093 /*===========================================================================
13094 * FUNCTION : getExifBufIndex
13095 *
13096 * DESCRIPTION: get index of metadata to be used for EXIF
13097 *
13098 * PARAMETERS : @captureIndex - index of current captured frame
13099 *
13100 * RETURN : index of metadata to be used for EXIF
13101 *==========================================================================*/
getExifBufIndex(uint32_t captureIndex)13102 uint32_t QCameraParameters::getExifBufIndex(uint32_t captureIndex)
13103 {
13104 uint32_t index = captureIndex;
13105
13106 if (isUbiRefocus()) {
13107 if (captureIndex < m_pCapability->refocus_af_bracketing_need.burst_count) {
13108 index = captureIndex;
13109 } else {
13110 index = 0;
13111 }
13112 } else if (isChromaFlashEnabled()) {
13113 index = m_pCapability->chroma_flash_settings_need.metadata_index;
13114 } else if (isHDREnabled()) {
13115 if (isHDR1xFrameEnabled() && isHDR1xExtraBufferNeeded()) {
13116 index = m_pCapability->hdr_bracketing_setting.num_frames;
13117 } else {
13118 for (index = 0; index < m_pCapability->hdr_bracketing_setting.num_frames; index++) {
13119 if (0 == m_pCapability->hdr_bracketing_setting.exp_val.values[index]) {
13120 break;
13121 }
13122 }
13123 if (index == m_pCapability->hdr_bracketing_setting.num_frames) {
13124 index = captureIndex;
13125 }
13126 }
13127 }
13128
13129 return index;
13130 }
13131
13132 /*===========================================================================
13133 * FUNCTION : getNumberInBufsForSingleShot
13134 *
13135 * DESCRIPTION: get number of input buffers for single shot
13136 *
13137 * PARAMETERS : none
13138 *
13139 * RETURN : number of input buffers for single shot
13140 *==========================================================================*/
getNumberInBufsForSingleShot()13141 uint32_t QCameraParameters::getNumberInBufsForSingleShot()
13142 {
13143 uint32_t numOfBufs = 1;
13144
13145 if (isUbiRefocus()) {
13146 numOfBufs = m_pCapability->refocus_af_bracketing_need.burst_count;
13147 } else if (isUbiFocusEnabled()) {
13148 numOfBufs = m_pCapability->ubifocus_af_bracketing_need.burst_count;
13149 } else if (m_bOptiZoomOn) {
13150 numOfBufs = m_pCapability->opti_zoom_settings_need.burst_count;
13151 } else if (isChromaFlashEnabled()) {
13152 numOfBufs = m_pCapability->chroma_flash_settings_need.burst_count;
13153 } else if (isHDREnabled()) {
13154 numOfBufs = m_pCapability->hdr_bracketing_setting.num_frames;
13155 if (isHDR1xFrameEnabled() && isHDR1xExtraBufferNeeded()) {
13156 numOfBufs++;
13157 }
13158 } else if (isStillMoreEnabled()) {
13159 if (isSeeMoreEnabled()) {
13160 m_stillmore_config.burst_count = 1;
13161 numOfBufs = m_stillmore_config.burst_count;
13162 } else if ((m_stillmore_config.burst_count >=
13163 m_pCapability->stillmore_settings_need.min_burst_count) &&
13164 (m_stillmore_config.burst_count <=
13165 m_pCapability->stillmore_settings_need.max_burst_count)) {
13166 numOfBufs = m_stillmore_config.burst_count;
13167 } else {
13168 numOfBufs = m_pCapability->stillmore_settings_need.burst_count;
13169 }
13170 }
13171
13172 return numOfBufs;
13173 }
13174
13175 /*===========================================================================
13176 * FUNCTION : getNumberOutBufsForSingleShot
13177 *
13178 * DESCRIPTION: get number of output buffers for single shot
13179 *
13180 * PARAMETERS : none
13181 *
13182 * RETURN : number of output buffers for single shot
13183 *==========================================================================*/
getNumberOutBufsForSingleShot()13184 uint32_t QCameraParameters::getNumberOutBufsForSingleShot()
13185 {
13186 uint32_t numOfBufs = 1;
13187
13188 if (isUbiRefocus()) {
13189 numOfBufs = m_pCapability->refocus_af_bracketing_need.output_count;
13190 } else if (isHDREnabled()) {
13191 if (isHDR1xFrameEnabled()) {
13192 numOfBufs++;
13193 }
13194 }
13195
13196 return numOfBufs;
13197 }
13198
13199 /*===========================================================================
13200 * FUNCTION : is4k2kVideoResolution
13201 *
13202 * DESCRIPTION: if resolution is 4k x 2k or true 4k x 2k
13203 *
13204 * PARAMETERS : none
13205 *
13206 * RETURN : true: video resolution is 4k x 2k
13207 * false: video resolution is not 4k x 2k
13208 *==========================================================================*/
is4k2kVideoResolution()13209 bool QCameraParameters::is4k2kVideoResolution()
13210 {
13211 bool enabled = false;
13212 cam_dimension_t resolution;
13213 getVideoSize(&resolution.width, &resolution.height);
13214 if (!(resolution.width < 3840 && resolution.height < 2160)) {
13215 enabled = true;
13216 }
13217
13218 return enabled;
13219 }
13220
13221 /*===========================================================================
13222 * FUNCTION : isPreviewSeeMoreRequired
13223 *
13224 * DESCRIPTION: This function checks whether SeeMmore(SW TNR) needs to be applied for
13225 * preview stream depending on video resoluion and setprop
13226 *
13227 * PARAMETERS : none
13228 *
13229 * RETURN : true: If SeeMore needs to apply
13230 * false: No need to apply
13231 *==========================================================================*/
isPreviewSeeMoreRequired()13232 bool QCameraParameters::isPreviewSeeMoreRequired()
13233 {
13234 cam_dimension_t dim;
13235 char prop[PROPERTY_VALUE_MAX];
13236
13237 getVideoSize(&dim.width, &dim.height);
13238 memset(prop, 0, sizeof(prop));
13239 property_get("persist.camera.preview.seemore", prop, "0");
13240 int enable = atoi(prop);
13241
13242 // Enable SeeMore for preview stream if :
13243 // 1. Video resolution <= (1920x1080) (or)
13244 // 2. persist.camera.preview.seemore is set
13245 LOGD("width=%d, height=%d, enable=%d", dim.width, dim.height, enable);
13246 return (((dim.width * dim.height) <= (1920 * 1080)) || enable);
13247 }
13248
13249 /*===========================================================================
13250 * FUNCTION : updateDebugLevel
13251 *
13252 * DESCRIPTION: send CAM_INTF_PARM_UPDATE_DEBUG_LEVEL to backend
13253 *
13254 * PARAMETERS : none
13255 *
13256 * RETURN : NO_ERROR --success
13257 * int32_t type of status
13258 *==========================================================================*/
updateDebugLevel()13259 int32_t QCameraParameters::updateDebugLevel()
13260 {
13261 if ( m_pParamBuf == NULL ) {
13262 return NO_INIT;
13263 }
13264
13265 int32_t rc = initBatchUpdate(m_pParamBuf);
13266 if ( rc != NO_ERROR ) {
13267 LOGE("Failed to initialize group update table");
13268 return rc;
13269 }
13270
13271 uint32_t dummyDebugLevel = 0;
13272 /* The value of dummyDebugLevel is irrelavent. On
13273 * CAM_INTF_PARM_UPDATE_DEBUG_LEVEL, read debug property */
13274 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_UPDATE_DEBUG_LEVEL, dummyDebugLevel)) {
13275 LOGE("Parameters batch failed");
13276 return BAD_VALUE;
13277 }
13278
13279 rc = commitSetBatch();
13280 if ( rc != NO_ERROR ) {
13281 LOGE("Failed to commit batch parameters");
13282 return rc;
13283 }
13284
13285 return NO_ERROR;
13286 }
13287
13288 /*===========================================================================
13289 * FUNCTION : setOfflineRAW
13290 *
13291 * DESCRIPTION: Function to decide Offline RAW feature.
13292 *
13293 * PARAMETERS :
13294 * @raw_value: offline raw value to set.
13295 *
13296 * RETURN : none
13297 *==========================================================================*/
setOfflineRAW(bool raw_value)13298 void QCameraParameters::setOfflineRAW(bool raw_value)
13299 {
13300 char value[PROPERTY_VALUE_MAX];
13301 bool raw_yuv = false;
13302 bool offlineRaw = false;
13303
13304 if (raw_value) {
13305 mOfflineRAW = true;
13306 LOGH("Offline Raw %d", mOfflineRAW);
13307 return;
13308 }
13309
13310 property_get("persist.camera.raw_yuv", value, "0");
13311 raw_yuv = atoi(value) > 0 ? true : false;
13312 property_get("persist.camera.offlineraw", value, "0");
13313 offlineRaw = atoi(value) > 0 ? true : false;
13314 if ((raw_yuv || isRdiMode()) && offlineRaw) {
13315 mOfflineRAW = true;
13316 } else {
13317 mOfflineRAW = false;
13318 }
13319 LOGH("Offline Raw %d", mOfflineRAW);
13320 }
13321
13322 /*===========================================================================
13323 * FUNCTION : updatePpFeatureMask
13324 *
13325 * DESCRIPTION: Updates the feature mask for a particular stream depending
13326 * on current client configuration.
13327 *
13328 * PARAMETERS :
13329 * @stream_type: Camera stream type
13330 *
13331 * RETURN : NO_ERROR --success
13332 * int32_t type of status
13333 *==========================================================================*/
updatePpFeatureMask(cam_stream_type_t stream_type)13334 int32_t QCameraParameters::updatePpFeatureMask(cam_stream_type_t stream_type) {
13335
13336 cam_feature_mask_t feature_mask = 0;
13337
13338 if (stream_type >= CAM_STREAM_TYPE_MAX) {
13339 LOGE("Error!! stream type: %d not valid", stream_type);
13340 return -1;
13341 }
13342
13343 // Update feature mask for SeeMore in video and video preview
13344 if (isSeeMoreEnabled() && ((stream_type == CAM_STREAM_TYPE_VIDEO) ||
13345 (stream_type == CAM_STREAM_TYPE_PREVIEW && getRecordingHintValue() &&
13346 isPreviewSeeMoreRequired()))) {
13347 feature_mask |= CAM_QCOM_FEATURE_LLVD;
13348 }
13349
13350 if (isHighQualityNoiseReductionMode() &&
13351 ((stream_type == CAM_STREAM_TYPE_VIDEO) ||
13352 (stream_type == CAM_STREAM_TYPE_PREVIEW && getRecordingHintValue() &&
13353 isPreviewSeeMoreRequired()))) {
13354 feature_mask |= CAM_QTI_FEATURE_SW_TNR;
13355 }
13356
13357 // Do not enable feature mask for ZSL/non-ZSL/liveshot snapshot except for 4K2k case
13358 if ((getRecordingHintValue() &&
13359 (stream_type == CAM_STREAM_TYPE_SNAPSHOT) && is4k2kVideoResolution()) ||
13360 (stream_type != CAM_STREAM_TYPE_SNAPSHOT)) {
13361 if ((m_nMinRequiredPpMask & CAM_QCOM_FEATURE_SHARPNESS) &&
13362 !isOptiZoomEnabled()) {
13363 feature_mask |= CAM_QCOM_FEATURE_SHARPNESS;
13364 }
13365
13366 if (m_nMinRequiredPpMask & CAM_QCOM_FEATURE_EFFECT) {
13367 feature_mask |= CAM_QCOM_FEATURE_EFFECT;
13368 }
13369 if (isWNREnabled()) {
13370 feature_mask |= CAM_QCOM_FEATURE_DENOISE2D;
13371 }
13372
13373 //Set flip mode based on Stream type;
13374 int flipMode = getFlipMode(stream_type);
13375 if (flipMode > 0) {
13376 feature_mask |= CAM_QCOM_FEATURE_FLIP;
13377 }
13378 }
13379
13380 if ((isTNRVideoEnabled() && (CAM_STREAM_TYPE_VIDEO == stream_type))
13381 || (isTNRPreviewEnabled() && (CAM_STREAM_TYPE_PREVIEW == stream_type))) {
13382 feature_mask |= CAM_QCOM_FEATURE_CPP_TNR;
13383 }
13384 if (isEztuneEnabled() &&
13385 ((CAM_STREAM_TYPE_PREVIEW == stream_type) ||
13386 (CAM_STREAM_TYPE_SNAPSHOT == stream_type))) {
13387 feature_mask |= CAM_QCOM_FEATURE_EZTUNE;
13388 }
13389
13390 if ((getCDSMode() != CAM_CDS_MODE_OFF) &&
13391 ((CAM_STREAM_TYPE_PREVIEW == stream_type) ||
13392 (CAM_STREAM_TYPE_VIDEO == stream_type) ||
13393 (CAM_STREAM_TYPE_CALLBACK == stream_type) ||
13394 ((CAM_STREAM_TYPE_SNAPSHOT == stream_type) &&
13395 getRecordingHintValue() && is4k2kVideoResolution()))) {
13396 if (m_nMinRequiredPpMask & CAM_QCOM_FEATURE_DSDN) {
13397 feature_mask |= CAM_QCOM_FEATURE_DSDN;
13398 } else {
13399 feature_mask |= CAM_QCOM_FEATURE_CDS;
13400 }
13401 }
13402
13403 if (isTNRSnapshotEnabled() && (CAM_STREAM_TYPE_SNAPSHOT == stream_type)
13404 && (isZSLMode() || getRecordingHintValue())) {
13405 feature_mask |= CAM_QCOM_FEATURE_CPP_TNR;
13406 }
13407
13408 //Rotation could also have an effect on pp feature mask
13409 cam_pp_feature_config_t config;
13410 cam_dimension_t dim;
13411 memset(&config, 0, sizeof(cam_pp_feature_config_t));
13412 getStreamRotation(stream_type, config, dim);
13413 feature_mask |= config.feature_mask;
13414
13415 // Dual Camera scenarios
13416 // all feature masks are disabled for preview and analysis streams for aux session
13417 // all required feature masks for aux session preview and analysis streams need
13418 // to be enabled explicitly here
13419 ///@note When aux camera is of bayer type, keep pp mask as is or we'd run
13420 /// into stream mapping problems. YUV sensor is marked as interleaved and has
13421 /// preferred mapping setup so we don't see any mapping issues.
13422 if (m_relCamSyncInfo.sync_control == CAM_SYNC_RELATED_SENSORS_ON) {
13423 if (((CAM_STREAM_TYPE_ANALYSIS == stream_type) ||
13424 (CAM_STREAM_TYPE_PREVIEW == stream_type)) &&
13425 (m_relCamSyncInfo.mode == CAM_MODE_SECONDARY) &&
13426 (m_pCapability->sensor_type.sens_type == CAM_SENSOR_YUV)) {
13427 LOGH("Disabling all pp feature masks for aux preview and "
13428 "analysis streams");
13429 feature_mask = 0;
13430 }
13431
13432 // all feature masks need to be enabled here
13433 // enable DCRF feature mask on analysis stream in case of dual camera
13434 if (m_bDcrfEnabled && (CAM_STREAM_TYPE_ANALYSIS == stream_type)) {
13435 feature_mask |= CAM_QCOM_FEATURE_DCRF;
13436 } else {
13437 feature_mask &= ~CAM_QCOM_FEATURE_DCRF;
13438 }
13439 }
13440
13441 // Preview assisted autofocus needs to be supported for
13442 // callback, preview, or video streams
13443 switch (stream_type) {
13444 case CAM_STREAM_TYPE_CALLBACK:
13445 case CAM_STREAM_TYPE_PREVIEW:
13446 case CAM_STREAM_TYPE_VIDEO:
13447 feature_mask |= CAM_QCOM_FEATURE_PAAF;
13448 break;
13449 default:
13450 break;
13451 }
13452
13453 // Store stream feature mask
13454 setStreamPpMask(stream_type, feature_mask);
13455 LOGH("stream type: %d, pp_mask: 0x%llx", stream_type, feature_mask);
13456
13457 return NO_ERROR;
13458 }
13459
13460 /*===========================================================================
13461 * FUNCTION : setStreamPpMask
13462 *
13463 * DESCRIPTION: Stores a particular feature mask for a given camera stream
13464 *
13465 * PARAMETERS :
13466 * @stream_type: Camera stream type
13467 * @pp_mask : Feature mask
13468 *
13469 * RETURN : NO_ERROR --success
13470 * int32_t type of status
13471 *==========================================================================*/
setStreamPpMask(cam_stream_type_t stream_type,cam_feature_mask_t pp_mask)13472 int32_t QCameraParameters::setStreamPpMask(cam_stream_type_t stream_type,
13473 cam_feature_mask_t pp_mask) {
13474
13475 if(stream_type >= CAM_STREAM_TYPE_MAX) {
13476 return BAD_TYPE;
13477 }
13478
13479 mStreamPpMask[stream_type] = pp_mask;
13480 return NO_ERROR;
13481 }
13482
13483 /*===========================================================================
13484 * FUNCTION : getStreamPpMask
13485 *
13486 * DESCRIPTION: Retrieves the feature mask for a given camera stream
13487 *
13488 * PARAMETERS :
13489 * @stream_type: Camera stream type
13490 * @pp_mask : Feature mask
13491 *
13492 * RETURN : NO_ERROR --success
13493 * int32_t type of status
13494 *==========================================================================*/
getStreamPpMask(cam_stream_type_t stream_type,cam_feature_mask_t & pp_mask)13495 int32_t QCameraParameters::getStreamPpMask(cam_stream_type_t stream_type,
13496 cam_feature_mask_t &pp_mask) {
13497
13498 if(stream_type >= CAM_STREAM_TYPE_MAX) {
13499 return BAD_TYPE;
13500 }
13501
13502 pp_mask = mStreamPpMask[stream_type];
13503 return NO_ERROR;
13504 }
13505
13506 /*===========================================================================
13507 * FUNCTION : isMultiPassReprocessing
13508 *
13509 * DESCRIPTION: Read setprop to enable/disable multipass
13510 *
13511 * PARAMETERS : none
13512 *
13513 * RETURN : TRUE -- If enabled
13514 * FALSE -- disabled
13515 *==========================================================================*/
isMultiPassReprocessing()13516 bool QCameraParameters::isMultiPassReprocessing()
13517 {
13518 char value[PROPERTY_VALUE_MAX];
13519 int multpass = 0;
13520
13521 property_get("persist.camera.multi_pass", value, "0");
13522 multpass = atoi(value);
13523
13524 return (multpass == 0)? FALSE : TRUE;
13525 }
13526
13527 /*===========================================================================
13528 * FUNCTION : setReprocCount
13529 *
13530 * DESCRIPTION: Set total reprocessing pass count
13531 *
13532 * PARAMETERS : none
13533 *
13534 * RETURN : None
13535 *==========================================================================*/
setReprocCount()13536 void QCameraParameters::setReprocCount()
13537 {
13538 mTotalPPCount = 1; //Default reprocessing Pass count
13539
13540 if (getManualCaptureMode() >=
13541 CAM_MANUAL_CAPTURE_TYPE_3) {
13542 LOGD("Additional post processing enabled for manual capture");
13543 mTotalPPCount++;
13544 }
13545
13546 if (!isMultiPassReprocessing()) {
13547 return;
13548 }
13549
13550 if ((getZoomLevel() != 0)
13551 && (getBurstCountForAdvancedCapture()
13552 == getNumOfSnapshots())) {
13553 LOGD("2 Pass postprocessing enabled");
13554 mTotalPPCount++;
13555 }
13556 }
13557
13558 /*===========================================================================
13559 * FUNCTION : isUBWCEnabled
13560 *
13561 * DESCRIPTION: Function to get UBWC hardware support.
13562 *
13563 * PARAMETERS : None
13564 *
13565 * RETURN : TRUE -- UBWC format supported
13566 * FALSE -- UBWC is not supported.
13567 *==========================================================================*/
isUBWCEnabled()13568 bool QCameraParameters::isUBWCEnabled()
13569 {
13570 #ifdef UBWC_PRESENT
13571 char value[PROPERTY_VALUE_MAX];
13572 int prop_value = 0;
13573 memset(value, 0, sizeof(value));
13574 property_get("debug.gralloc.gfx_ubwc_disable", value, "0");
13575 prop_value = atoi(value);
13576 if (prop_value) {
13577 return FALSE;
13578 }
13579
13580 //Disable UBWC if it is YUV sensor.
13581 if ((m_pCapability != NULL) &&
13582 (m_pCapability->sensor_type.sens_type == CAM_SENSOR_YUV)) {
13583 return FALSE;
13584 }
13585
13586 //Disable UBWC if Eztune is enabled
13587 // Eztune works on CPP output and cannot understand UBWC buffer.
13588 memset(value, 0, sizeof(value));
13589 property_get("persist.camera.eztune.enable", value, "0");
13590 prop_value = atoi(value);
13591 if (prop_value) {
13592 return FALSE;
13593 }
13594 return TRUE;
13595 #else
13596 return FALSE;
13597 #endif
13598 }
13599
13600 /*===========================================================================
13601 * FUNCTION : isPostProcScaling
13602 *
13603 * DESCRIPTION: is scaling to be done by CPP?
13604 *
13605 * PARAMETERS : none
13606 *
13607 * RETURN : TRUE : If CPP scaling enabled
13608 * FALSE : If VFE scaling enabled
13609 *==========================================================================*/
isPostProcScaling()13610 bool QCameraParameters::isPostProcScaling()
13611 {
13612 char value[PROPERTY_VALUE_MAX];
13613 bool cpp_scaling = FALSE;
13614
13615 if (getRecordingHintValue()) {
13616 return FALSE;
13617 }
13618
13619 property_get("persist.camera.pp_scaling", value, "0");
13620 cpp_scaling = atoi(value) > 0 ? TRUE : FALSE;
13621
13622 LOGH("Post proc scaling enabled : %d",
13623 cpp_scaling);
13624 return cpp_scaling;
13625 }
13626
13627 /*===========================================================================
13628 * FUNCTION : isLLNoiseEnabled
13629 *
13630 * DESCRIPTION: Low light noise change
13631 *
13632 * PARAMETERS : none
13633 *
13634 * RETURN : TRUE : If low light noise enabled
13635 * FALSE : If low light noise disabled
13636 *==========================================================================*/
isLLNoiseEnabled()13637 bool QCameraParameters::isLLNoiseEnabled()
13638 {
13639 char value[PROPERTY_VALUE_MAX];
13640 bool llnoise = FALSE;
13641
13642 if (!isWNREnabled()) {
13643 return FALSE;
13644 }
13645
13646 property_get("persist.camera.llnoise", value, "0");
13647 llnoise = atoi(value) > 0 ? TRUE : FALSE;
13648
13649 LOGH("Low light noise enabled : %d",
13650 llnoise);
13651 return llnoise;
13652 }
13653
13654 /*===========================================================================
13655 * FUNCTION : setBufBatchCount
13656 *
13657 * DESCRIPTION: Function to configure batch buffer
13658 *
13659 * PARAMETERS : int8_t buf_cnt
13660 * Buffer batch count
13661 *
13662 * RETURN : None
13663 *==========================================================================*/
setBufBatchCount(int8_t buf_cnt)13664 void QCameraParameters::setBufBatchCount(int8_t buf_cnt)
13665 {
13666 mBufBatchCnt = 0;
13667 char value[PROPERTY_VALUE_MAX];
13668 int8_t count = 0;
13669
13670 property_get("persist.camera.batchcount", value, "0");
13671 count = atoi(value);
13672
13673 if (!(count != 0 || buf_cnt > CAMERA_MIN_BATCH_COUNT)) {
13674 LOGH("Buffer batch count = %d", mBufBatchCnt);
13675 set(KEY_QC_VIDEO_BATCH_SIZE, mBufBatchCnt);
13676 return;
13677 }
13678
13679 while((m_pCapability->max_batch_bufs_supported != 0)
13680 && (m_pCapability->max_batch_bufs_supported < buf_cnt)) {
13681 buf_cnt = buf_cnt / 2;
13682 }
13683
13684 if (count > 0) {
13685 mBufBatchCnt = count;
13686 LOGH("Buffer batch count = %d", mBufBatchCnt);
13687 set(KEY_QC_VIDEO_BATCH_SIZE, mBufBatchCnt);
13688 return;
13689 }
13690
13691 if (buf_cnt > CAMERA_MIN_BATCH_COUNT) {
13692 mBufBatchCnt = buf_cnt;
13693 LOGH("Buffer batch count = %d", mBufBatchCnt);
13694 set(KEY_QC_VIDEO_BATCH_SIZE, mBufBatchCnt);
13695 return;
13696 }
13697 }
13698
13699 /*===========================================================================
13700 * FUNCTION : setVideoBatch()
13701 *
13702 * DESCRIPTION: Function to batching for video.
13703 *
13704 * PARAMETERS : none
13705 *
13706 * RETURN : None
13707 *==========================================================================*/
setVideoBatchSize()13708 void QCameraParameters::setVideoBatchSize()
13709 {
13710 char value[PROPERTY_VALUE_MAX];
13711 int8_t minBatchcnt = 2; //Batching enabled only if batch size if greater than 2;
13712 int32_t width = 0, height = 0;
13713 mVideoBatchSize = 0;
13714
13715 if (getBufBatchCount()) {
13716 //We don't need HAL to HAL batching if camera batching enabled.
13717 return;
13718 }
13719
13720 getVideoSize(&width, &height);
13721 if ((width > 1920) || (height > 1080)) {
13722 //Cannot enable batch mode for video size bigger than 1080p
13723 return;
13724 }
13725
13726 //Batch size "6" is the recommended and gives optimal power saving.
13727 property_get("persist.camera.video.batchsize", value, "0");
13728 mVideoBatchSize = atoi(value);
13729
13730 if (mVideoBatchSize > CAMERA_MAX_CONSUMER_BATCH_BUFFER_SIZE) {
13731 mVideoBatchSize = CAMERA_MAX_CONSUMER_BATCH_BUFFER_SIZE;
13732 } else if (mVideoBatchSize <= minBatchcnt) {
13733 //Batching enabled only if batch size is greater than 2.
13734 mVideoBatchSize = 0;
13735 }
13736 LOGD("mVideoBatchSize = %d", mVideoBatchSize);
13737 set(KEY_QC_VIDEO_BATCH_SIZE, mVideoBatchSize);
13738 }
13739
13740 /*===========================================================================
13741 * FUNCTION : setCustomParams
13742 *
13743 * DESCRIPTION: Function to update OEM specific custom parameter
13744 *
13745 * PARAMETERS : params: Input Parameter object
13746 *
13747 * RETURN : error value
13748 *==========================================================================*/
setCustomParams(__unused const QCameraParameters & params)13749 int32_t QCameraParameters::setCustomParams(__unused const QCameraParameters& params)
13750 {
13751 int32_t rc = NO_ERROR;
13752
13753 /* Application specific parameter can be read from "params" and update m_pParamBuf
13754 We can also update internal OEM custom parameters in this funcion.
13755 "CAM_CUSTOM_PARM_EXAMPLE" is used as a example */
13756
13757 /*Get the pointer of shared buffer for custom parameter*/
13758 custom_parm_buffer_t *customParam =
13759 (custom_parm_buffer_t *)POINTER_OF_META(CAM_INTF_PARM_CUSTOM, m_pParamBuf);
13760
13761
13762 /*start updating custom parameter values*/
13763 if (ADD_SET_PARAM_ENTRY_TO_BATCH(customParam, CAM_CUSTOM_PARM_EXAMPLE, 1)) {
13764 LOGE("Failed to update CAM_CUSTOM_PARM_DUMMY");
13765 return BAD_VALUE;
13766 }
13767
13768 /*set custom parameter values to main parameter buffer. Update isvalid flag*/
13769 ADD_GET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CUSTOM);
13770
13771 return rc;
13772 }
13773
13774 /*===========================================================================
13775 * FUNCTION : dump
13776 *
13777 * DESCRIPTION: Composes a string based on current configuration
13778 *
13779 * PARAMETERS : none
13780 *
13781 * RETURN : Formatted string
13782 *==========================================================================*/
dump()13783 String8 QCameraParameters::dump()
13784 {
13785 String8 str("\n");
13786 char s[128];
13787
13788 snprintf(s, 128, "Preview Pixel Fmt: %d\n", getPreviewHalPixelFormat());
13789 str += s;
13790
13791 snprintf(s, 128, "ZSL Burst Interval: %d\n", getZSLBurstInterval());
13792 str += s;
13793
13794 snprintf(s, 128, "ZSL Queue Depth: %d\n", getZSLQueueDepth());
13795 str += s;
13796
13797 snprintf(s, 128, "ZSL Back Look Count %d\n", getZSLBackLookCount());
13798 str += s;
13799
13800 snprintf(s, 128, "Max Unmatched Frames In Queue: %d\n",
13801 getMaxUnmatchedFramesInQueue());
13802 str += s;
13803
13804 snprintf(s, 128, "Is ZSL Mode: %d\n", isZSLMode());
13805 str += s;
13806
13807 snprintf(s, 128, "Is No Display Mode: %d\n", isNoDisplayMode());
13808 str += s;
13809
13810 snprintf(s, 128, "Is WNR Enabled: %d\n", isWNREnabled());
13811 str += s;
13812
13813 snprintf(s, 128, "isHfrMode: %d\n", isHfrMode());
13814 str += s;
13815
13816 snprintf(s, 128, "getNumOfSnapshots: %d\n", getNumOfSnapshots());
13817 str += s;
13818
13819 snprintf(s, 128, "getNumOfExtraHDRInBufsIfNeeded: %d\n",
13820 getNumOfExtraHDRInBufsIfNeeded());
13821 str += s;
13822
13823 snprintf(s, 128, "getNumOfExtraHDROutBufsIfNeeded: %d\n",
13824 getNumOfExtraHDROutBufsIfNeeded());
13825 str += s;
13826
13827 snprintf(s, 128, "getRecordingHintValue: %d\n", getRecordingHintValue());
13828 str += s;
13829
13830 snprintf(s, 128, "getJpegQuality: %u\n", getJpegQuality());
13831 str += s;
13832
13833 snprintf(s, 128, "getJpegRotation: %u\n", getJpegRotation());
13834 str += s;
13835
13836 snprintf(s, 128, "isHistogramEnabled: %d\n", isHistogramEnabled());
13837 str += s;
13838
13839 snprintf(s, 128, "isFaceDetectionEnabled: %d\n", isFaceDetectionEnabled());
13840 str += s;
13841
13842 snprintf(s, 128, "isHDREnabled: %d\n", isHDREnabled());
13843 str += s;
13844
13845 snprintf(s, 128, "isAutoHDREnabled: %d\n", isAutoHDREnabled());
13846 str += s;
13847
13848 snprintf(s, 128, "isAVTimerEnabled: %d\n", isAVTimerEnabled());
13849 str += s;
13850
13851 snprintf(s, 128, "getFocusMode: %d\n", getFocusMode());
13852 str += s;
13853
13854 snprintf(s, 128, "isJpegPictureFormat: %d\n", isJpegPictureFormat());
13855 str += s;
13856
13857 snprintf(s, 128, "isNV16PictureFormat: %d\n", isNV16PictureFormat());
13858 str += s;
13859
13860 snprintf(s, 128, "isNV21PictureFormat: %d\n", isNV21PictureFormat());
13861 str += s;
13862
13863 snprintf(s, 128, "isSnapshotFDNeeded: %d\n", isSnapshotFDNeeded());
13864 str += s;
13865
13866 snprintf(s, 128, "isHDR1xFrameEnabled: %d\n", isHDR1xFrameEnabled());
13867 str += s;
13868
13869 snprintf(s, 128, "isYUVFrameInfoNeeded: %d\n", isYUVFrameInfoNeeded());
13870 str += s;
13871
13872 snprintf(s, 128, "isHDR1xExtraBufferNeeded: %d\n",
13873 isHDR1xExtraBufferNeeded());
13874 str += s;
13875
13876 snprintf(s, 128, "isHDROutputCropEnabled: %d\n", isHDROutputCropEnabled());
13877 str += s;
13878
13879 snprintf(s, 128, "isPreviewFlipChanged: %d\n", isPreviewFlipChanged());
13880 str += s;
13881
13882 snprintf(s, 128, "isVideoFlipChanged: %d\n", isVideoFlipChanged());
13883 str += s;
13884
13885 snprintf(s, 128, "isSnapshotFlipChanged: %d\n", isSnapshotFlipChanged());
13886 str += s;
13887
13888 snprintf(s, 128, "isHDRThumbnailProcessNeeded: %d\n",
13889 isHDRThumbnailProcessNeeded());
13890 str += s;
13891
13892 snprintf(s, 128, "getAutoFlickerMode: %d\n", getAutoFlickerMode());
13893 str += s;
13894
13895 snprintf(s, 128, "getNumOfExtraBuffersForImageProc: %d\n",
13896 getNumOfExtraBuffersForImageProc());
13897 str += s;
13898
13899 snprintf(s, 128, "isUbiFocusEnabled: %d\n", isUbiFocusEnabled());
13900 str += s;
13901
13902 snprintf(s, 128, "isChromaFlashEnabled: %d\n", isChromaFlashEnabled());
13903 str += s;
13904
13905 snprintf(s, 128, "isOptiZoomEnabled: %d\n", isOptiZoomEnabled());
13906 str += s;
13907
13908 snprintf(s, 128, "isStillMoreEnabled: %d\n", isStillMoreEnabled());
13909 str += s;
13910
13911 snprintf(s, 128, "getBurstCountForAdvancedCapture: %d\n",
13912 getBurstCountForAdvancedCapture());
13913 str += s;
13914
13915 return str;
13916 }
13917
13918 /*===========================================================================
13919 * FUNCTION : getNumOfExtraBuffersForVideo
13920 *
13921 * DESCRIPTION: get number of extra buffers needed by image processing
13922 *
13923 * PARAMETERS : none
13924 *
13925 * RETURN : number of extra buffers needed by ImageProc;
13926 * 0 if not ImageProc enabled
13927 *==========================================================================*/
getNumOfExtraBuffersForVideo()13928 uint8_t QCameraParameters::getNumOfExtraBuffersForVideo()
13929 {
13930 uint8_t numOfBufs = 0;
13931
13932 if (isSeeMoreEnabled() || isHighQualityNoiseReductionMode()) {
13933 numOfBufs = 1;
13934 }
13935
13936 return numOfBufs;
13937 }
13938
13939 /*===========================================================================
13940 * FUNCTION : getNumOfExtraBuffersForPreview
13941 *
13942 * DESCRIPTION: get number of extra buffers needed by image processing
13943 *
13944 * PARAMETERS : none
13945 *
13946 * RETURN : number of extra buffers needed by ImageProc;
13947 * 0 if not ImageProc enabled
13948 *==========================================================================*/
getNumOfExtraBuffersForPreview()13949 uint8_t QCameraParameters::getNumOfExtraBuffersForPreview()
13950 {
13951 uint8_t numOfBufs = 0;
13952
13953 if ((isSeeMoreEnabled() || isHighQualityNoiseReductionMode())
13954 && !isZSLMode() && getRecordingHintValue()) {
13955 numOfBufs = 1;
13956 }
13957
13958 return numOfBufs;
13959 }
13960
13961 /*===========================================================================
13962 * FUNCTION : setToneMapMode
13963 *
13964 * DESCRIPTION: enable or disable tone map
13965 *
13966 * PARAMETERS :
13967 * @enable : enable: 1; disable 0
13968 * @initCommit: if configuration list needs to be initialized and commited
13969 *
13970 * RETURN : int32_t type of status
13971 * NO_ERROR -- success
13972 * none-zero failure code
13973 *==========================================================================*/
setToneMapMode(uint32_t enable,bool initCommit)13974 int32_t QCameraParameters::setToneMapMode(uint32_t enable, bool initCommit)
13975 {
13976 int32_t rc = NO_ERROR;
13977 LOGH("tone map mode %d ", enable);
13978
13979 if (initCommit) {
13980 if (initBatchUpdate(m_pParamBuf) < 0) {
13981 LOGE("Failed to initialize group update table");
13982 return FAILED_TRANSACTION;
13983 }
13984 }
13985
13986 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_TONE_MAP_MODE, enable)) {
13987 LOGE("Failed to update tone map mode");
13988 return BAD_VALUE;
13989 }
13990
13991 if (initCommit) {
13992 rc = commitSetBatch();
13993 if (rc != NO_ERROR) {
13994 LOGE("Failed to commit tone map mode");
13995 return rc;
13996 }
13997 }
13998
13999 return rc;
14000 }
14001
14002 /*===========================================================================
14003 * FUNCTION : getLongshotStages
14004 *
14005 * DESCRIPTION: get number of stages for longshot
14006 *
14007 * PARAMETERS : none
14008 *
14009 * RETURN : number of stages
14010 *==========================================================================*/
getLongshotStages()14011 uint8_t QCameraParameters::getLongshotStages()
14012 {
14013 uint8_t numStages =
14014 isLowMemoryDevice() ? CAMERA_MIN_LONGSHOT_STAGES : CAMERA_DEFAULT_LONGSHOT_STAGES;
14015
14016 char prop[PROPERTY_VALUE_MAX];
14017 memset(prop, 0, sizeof(prop));
14018 property_get("persist.camera.longshot.stages", prop, "0");
14019 uint8_t propStages = atoi(prop);
14020 if (propStages > 0 && propStages <= CAMERA_DEFAULT_LONGSHOT_STAGES) {
14021 numStages = propStages;
14022 }
14023 return numStages;
14024 }
14025
14026 /*===========================================================================
14027 * FUNCTION : setCDSMode
14028 *
14029 * DESCRIPTION: set CDS mode
14030 *
14031 * PARAMETERS :
14032 * @cds_mode : cds mode
14033 * @initCommit: if configuration list needs to be initialized and commited
14034 *
14035 * RETURN : int32_t type of status
14036 * NO_ERROR -- success
14037 * none-zero failure code
14038 *==========================================================================*/
setCDSMode(int32_t cds_mode,bool initCommit)14039 int32_t QCameraParameters::setCDSMode(int32_t cds_mode, bool initCommit)
14040 {
14041 if (initCommit) {
14042 if (initBatchUpdate(m_pParamBuf) < 0) {
14043 LOGE("Failed to initialize group update table");
14044 return FAILED_TRANSACTION;
14045 }
14046 }
14047
14048 int32_t rc = NO_ERROR;
14049 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
14050 LOGE("Failed to update cds mode");
14051 return BAD_VALUE;
14052 }
14053
14054 if (initCommit) {
14055 rc = commitSetBatch();
14056 if (NO_ERROR != rc) {
14057 LOGE("Failed to set cds mode");
14058 return rc;
14059 }
14060 }
14061
14062 LOGH("cds mode -> %d", cds_mode);
14063
14064 return rc;
14065 }
14066
14067 /*===========================================================================
14068 * FUNCTION : setLowLightCapture
14069 *
14070 * DESCRIPTION: Function to enable low light capture
14071 *==========================================================================*/
setLowLightCapture()14072 void QCameraParameters::setLowLightCapture()
14073 {
14074 char prop[PROPERTY_VALUE_MAX];
14075 memset(prop, 0, sizeof(prop));
14076 property_get("persist.camera.llc", prop, "0");
14077 m_LLCaptureEnabled = (atoi(prop) > 0) ? TRUE : FALSE;
14078
14079 if (!m_LLCaptureEnabled) {
14080 m_LowLightLevel = CAM_LOW_LIGHT_OFF;
14081 }
14082 }
14083
14084 /*===========================================================================
14085 * FUNCTION : fdModeInVideo
14086 *
14087 * DESCRIPTION: FD in Video change
14088 *
14089 * PARAMETERS : none
14090 *
14091 * RETURN : FD Mode in Video
14092 * 0 : If FD in Video disabled
14093 * 1 : If FD in Video enabled for Detection, focus
14094 * 2 : If FD in Video enabled only for focus
14095 *==========================================================================*/
fdModeInVideo()14096 uint8_t QCameraParameters::fdModeInVideo()
14097 {
14098 char value[PROPERTY_VALUE_MAX];
14099 uint8_t fdvideo = 0;
14100
14101 cam_analysis_info_t *pAnalysisInfo =
14102 &m_pCapability->analysis_info[CAM_ANALYSIS_INFO_FD_VIDEO];
14103
14104 if (!pAnalysisInfo->hw_analysis_supported) {
14105 return 0;
14106 }
14107
14108 property_get("persist.camera.fdvideo", value, "0");
14109 fdvideo = (atoi(value) > 0) ? atoi(value) : 0;
14110
14111 LOGD("FD mode in Video : %d", fdvideo);
14112 return fdvideo;
14113 }
14114
14115 /*===========================================================================
14116 * FUNCTION : setManualCaptureMode
14117 *
14118 * DESCRIPTION: Function to set Manual capture modes
14119 *
14120 * PARAMETERS :
14121 * @mode : Capture mode configured
14122 *
14123 * RETURN : int32_t type of status
14124 * NO_ERROR -- success
14125 * none-zero failure code
14126 *==========================================================================*/
setManualCaptureMode(QCameraManualCaptureModes mode)14127 int32_t QCameraParameters::setManualCaptureMode(QCameraManualCaptureModes mode)
14128 {
14129 int32_t rc = NO_ERROR;
14130 char value[PROPERTY_VALUE_MAX];
14131 int8_t count = 0;
14132
14133 property_get("persist.camera.manual.capture", value, "0");
14134 count = atoi(value);
14135
14136 if (count) {
14137 if (mode == CAM_MANUAL_CAPTURE_TYPE_OFF) {
14138 m_ManualCaptureMode = CAM_MANUAL_CAPTURE_TYPE_1;
14139 } else {
14140 m_ManualCaptureMode = mode;
14141 }
14142 } else {
14143 m_ManualCaptureMode = CAM_MANUAL_CAPTURE_TYPE_OFF;
14144 }
14145
14146 if (m_ManualCaptureMode == CAM_MANUAL_CAPTURE_TYPE_2) {
14147 setOfflineRAW(FALSE);
14148 } else if (m_ManualCaptureMode >= CAM_MANUAL_CAPTURE_TYPE_3) {
14149 setOfflineRAW(TRUE);
14150 } else {
14151 setOfflineRAW(FALSE);
14152 }
14153 setReprocCount();
14154 LOGH("Manual capture mode - %d", m_ManualCaptureMode);
14155 return rc;
14156 }
14157
14158 /*===========================================================================
14159 * FUNCTION : isReprocScaleEnabled
14160 *
14161 * DESCRIPTION: Whether reprocess scale is enabled or not
14162 *
14163 * PARAMETERS : none
14164 *
14165 * RETURN : TRUE : Reprocess scale is enabled
14166 * FALSE : Reprocess scale is not enabled
14167 *==========================================================================*/
isReprocScaleEnabled()14168 bool QCameraParameters::isReprocScaleEnabled()
14169 {
14170 return m_reprocScaleParam.isScaleEnabled();
14171 }
14172
14173 /*===========================================================================
14174 * FUNCTION : isUnderReprocScaling
14175 *
14176 * DESCRIPTION: Whether image is under reprocess scaling
14177 *
14178 * PARAMETERS : none
14179 *
14180 * RETURN : TRUE : Image is under reprocess scaling
14181 * FALSE : Image is not under reprocess scaling
14182 *==========================================================================*/
isUnderReprocScaling()14183 bool QCameraParameters::isUnderReprocScaling()
14184 {
14185 return m_reprocScaleParam.isUnderScaling();
14186 }
14187
14188 /*===========================================================================
14189 * FUNCTION : getPicSizeFromAPK
14190 *
14191 * DESCRIPTION: Get picture size set from application.
14192 *
14193 * PARAMETERS :
14194 * @width : with set by application
14195 * @height : height set by application
14196 *
14197 * RETURN : int32_t type of status
14198 * NO_ERROR -- success
14199 * none-zero failure code
14200 *==========================================================================*/
getPicSizeFromAPK(int & width,int & height)14201 int32_t QCameraParameters::getPicSizeFromAPK(int &width, int &height)
14202 {
14203 return m_reprocScaleParam.getPicSizeFromAPK(width, height);
14204 }
14205
14206
14207
14208 /*===========================================================================
14209 * FUNCTION : setDualLedCalibration
14210 *
14211 * DESCRIPTION: set dual led calibration
14212 *
14213 * PARAMETERS :
14214 * @params : user setting parameters
14215 *
14216 * RETURN : int32_t type of status
14217 * NO_ERROR -- success
14218 * none-zero failure code
14219 *==========================================================================*/
setDualLedCalibration(__unused const QCameraParameters & params)14220 int32_t QCameraParameters::setDualLedCalibration(
14221 __unused const QCameraParameters& params)
14222 {
14223 char value[PROPERTY_VALUE_MAX];
14224 int32_t calibration = 0;
14225
14226 memset(value, 0, sizeof(value));
14227 property_get("persist.camera.dual_led_calib", value, "0");
14228 calibration = atoi(value);
14229 if (calibration != m_dualLedCalibration) {
14230 m_dualLedCalibration = calibration;
14231 LOGD("%s:updating calibration=%d m_dualLedCalibration=%d",
14232 __func__, calibration, m_dualLedCalibration);
14233
14234 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
14235 CAM_INTF_PARM_DUAL_LED_CALIBRATION,
14236 m_dualLedCalibration)) {
14237 LOGE("%s:Failed to update dual led calibration param", __func__);
14238 return BAD_VALUE;
14239 }
14240 }
14241 return NO_ERROR;
14242 }
14243
14244 /*===========================================================================
14245 * FUNCTION : setinstantAEC
14246 *
14247 * DESCRIPTION: set instant AEC value to backend
14248 *
14249 * PARAMETERS :
14250 * @value : instant aec enabled or not.
14251 * 0 - disable
14252 * 1 - Enable and set agressive AEC algo to the backend
14253 * 2 - Enable and set fast AEC algo to the backend
14254 *
14255 * RETURN : int32_t type of status
14256 * NO_ERROR -- success
14257 * none-zero failure code
14258 *==========================================================================*/
setInstantAEC(uint8_t value,bool initCommit)14259 int32_t QCameraParameters::setInstantAEC(uint8_t value, bool initCommit)
14260 {
14261 if (initCommit) {
14262 if (initBatchUpdate(m_pParamBuf) < 0) {
14263 LOGE("Failed to initialize group update table");
14264 return FAILED_TRANSACTION;
14265 }
14266 }
14267
14268 int32_t rc = NO_ERROR;
14269 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_INSTANT_AEC, value)) {
14270 LOGE("Failed to instant aec value");
14271 return BAD_VALUE;
14272 }
14273
14274 // set the new value
14275 char val[8];
14276 snprintf(val, sizeof(val), "%d", value);
14277 updateParamEntry(KEY_QC_INSTANT_AEC, val);
14278
14279 if (initCommit) {
14280 rc = commitSetBatch();
14281 if (NO_ERROR != rc) {
14282 LOGE("Failed to instant aec value");
14283 return rc;
14284 }
14285 }
14286
14287 LOGD(" Instant AEC value set to backend %d", value);
14288 m_bInstantAEC = value;
14289 return rc;
14290 }
14291
14292 /*===========================================================================
14293 * FUNCTION : setAdvancedCaptureMode
14294 *
14295 * DESCRIPTION: set advanced capture mode
14296 *
14297 * PARAMETERS : none
14298 *
14299 * RETURN : int32_t type of status
14300 * NO_ERROR -- success
14301 * none-zero failure code
14302 *==========================================================================*/
setAdvancedCaptureMode()14303 int32_t QCameraParameters::setAdvancedCaptureMode()
14304 {
14305 uint8_t value = isAdvCamFeaturesEnabled();
14306 LOGD("updating advanced capture mode value to %d",value);
14307 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
14308 CAM_INTF_PARM_ADV_CAPTURE_MODE, value)) {
14309 LOGE("Failed to set advanced capture mode param");
14310 return BAD_VALUE;
14311 }
14312 return NO_ERROR;
14313 }
14314
14315 /*===========================================================================
14316 * FUNCTION : getAnalysisInfo
14317 *
14318 * DESCRIPTION: Get the Analysis information based on
14319 * current mode and feature mask
14320 *
14321 * PARAMETERS :
14322 * @fdVideoEnabled : Whether fdVideo enabled currently
14323 * @videoEnabled : Whether hal3 or hal1
14324 * @featureMask : Feature mask
14325 * @analysis_info : Analysis info to be filled
14326 *
14327 * RETURN : int32_t type of status
14328 * NO_ERROR -- success
14329 * none-zero failure code
14330 *==========================================================================*/
getAnalysisInfo(bool fdVideoEnabled,bool hal3,uint32_t featureMask,cam_analysis_info_t * pAnalysisInfo)14331 int32_t QCameraParameters::getAnalysisInfo(
14332 bool fdVideoEnabled,
14333 bool hal3,
14334 uint32_t featureMask,
14335 cam_analysis_info_t *pAnalysisInfo)
14336 {
14337 return mCommon.getAnalysisInfo(fdVideoEnabled, hal3, featureMask, pAnalysisInfo);
14338 }
14339
14340 }; // namespace qcamera
14341