• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &params)
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