QCameraParameters.cpp revision 3f92cbaa5bde0dba1e4a9a67e5aa60fc0af2dfa0
1/* Copyright (c) 2012-2013, 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#include <cutils/properties.h>
33#include <math.h>
34#include <utils/Errors.h>
35#include <string.h>
36#include <stdlib.h>
37#include <gralloc_priv.h>
38#include "QCamera2HWI.h"
39#include "QCameraParameters.h"
40
41#define ASPECT_TOLERANCE 0.001
42#define FLIP_V_H (FLIP_H | FLIP_V)
43
44namespace qcamera {
45// Parameter keys to communicate between camera application and driver.
46const char QCameraParameters::KEY_QC_SUPPORTED_HFR_SIZES[] = "hfr-size-values";
47const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_MODE[] = "preview-frame-rate-mode";
48const char QCameraParameters::KEY_QC_SUPPORTED_PREVIEW_FRAME_RATE_MODES[] = "preview-frame-rate-modes";
49const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_AUTO_MODE[] = "frame-rate-auto";
50const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_FIXED_MODE[] = "frame-rate-fixed";
51const char QCameraParameters::KEY_QC_TOUCH_AF_AEC[] = "touch-af-aec";
52const char QCameraParameters::KEY_QC_SUPPORTED_TOUCH_AF_AEC[] = "touch-af-aec-values";
53const char QCameraParameters::KEY_QC_TOUCH_INDEX_AEC[] = "touch-index-aec";
54const char QCameraParameters::KEY_QC_TOUCH_INDEX_AF[] = "touch-index-af";
55const char QCameraParameters::KEY_QC_SCENE_DETECT[] = "scene-detect";
56const char QCameraParameters::KEY_QC_SUPPORTED_SCENE_DETECT[] = "scene-detect-values";
57const char QCameraParameters::KEY_QC_ISO_MODE[] = "iso";
58const char QCameraParameters::KEY_QC_SUPPORTED_ISO_MODES[] = "iso-values";
59const char QCameraParameters::KEY_QC_LENSSHADE[] = "lensshade";
60const char QCameraParameters::KEY_QC_SUPPORTED_LENSSHADE_MODES[] = "lensshade-values";
61const char QCameraParameters::KEY_QC_AUTO_EXPOSURE[] = "auto-exposure";
62const char QCameraParameters::KEY_QC_SUPPORTED_AUTO_EXPOSURE[] = "auto-exposure-values";
63const char QCameraParameters::KEY_QC_DENOISE[] = "denoise";
64const char QCameraParameters::KEY_QC_SUPPORTED_DENOISE[] = "denoise-values";
65const char QCameraParameters::KEY_QC_FOCUS_ALGO[] = "selectable-zone-af";
66const char QCameraParameters::KEY_QC_SUPPORTED_FOCUS_ALGOS[] = "selectable-zone-af-values";
67const char QCameraParameters::KEY_QC_FACE_DETECTION[] = "face-detection";
68const char QCameraParameters::KEY_QC_SUPPORTED_FACE_DETECTION[] = "face-detection-values";
69const char QCameraParameters::KEY_QC_FACE_RECOGNITION[] = "face-recognition";
70const char QCameraParameters::KEY_QC_SUPPORTED_FACE_RECOGNITION[] = "face-recognition-values";
71const char QCameraParameters::KEY_QC_MEMORY_COLOR_ENHANCEMENT[] = "mce";
72const char QCameraParameters::KEY_QC_SUPPORTED_MEM_COLOR_ENHANCE_MODES[] = "mce-values";
73const char QCameraParameters::KEY_QC_DIS[] = "dis";
74const char QCameraParameters::KEY_QC_SUPPORTED_DIS_MODES[] = "dis-values";
75const char QCameraParameters::KEY_QC_VIDEO_HIGH_FRAME_RATE[] = "video-hfr";
76const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_HIGH_FRAME_RATE_MODES[] = "video-hfr-values";
77const char QCameraParameters::KEY_QC_REDEYE_REDUCTION[] = "redeye-reduction";
78const char QCameraParameters::KEY_QC_SUPPORTED_REDEYE_REDUCTION[] = "redeye-reduction-values";
79const char QCameraParameters::KEY_QC_HIGH_DYNAMIC_RANGE_IMAGING[] = "hdr";
80const char QCameraParameters::KEY_QC_SUPPORTED_HDR_IMAGING_MODES[] = "hdr-values";
81const char QCameraParameters::KEY_QC_ZSL[] = "zsl";
82const char QCameraParameters::KEY_QC_SUPPORTED_ZSL_MODES[] = "zsl-values";
83const char QCameraParameters::KEY_QC_ZSL_BURST_INTERVAL[] = "capture-burst-interval";
84const char QCameraParameters::KEY_QC_ZSL_BURST_LOOKBACK[] = "capture-burst-retroactive";
85const char QCameraParameters::KEY_QC_ZSL_QUEUE_DEPTH[] = "capture-burst-queue-depth";
86const char QCameraParameters::KEY_QC_CAMERA_MODE[] = "camera-mode";
87const char QCameraParameters::KEY_QC_AE_BRACKET_HDR[] = "ae-bracket-hdr";
88const char QCameraParameters::KEY_QC_SUPPORTED_AE_BRACKET_MODES[] = "ae-bracket-hdr-values";
89const char QCameraParameters::KEY_QC_SUPPORTED_RAW_FORMATS[] = "raw-format-values";
90const char QCameraParameters::KEY_QC_RAW_FORMAT[] = "raw-format";
91const char QCameraParameters::KEY_QC_ORIENTATION[] = "orientation";
92const char QCameraParameters::KEY_QC_SELECTABLE_ZONE_AF[] = "selectable-zone-af";
93const char QCameraParameters::KEY_QC_CAPTURE_BURST_EXPOSURE[] = "capture-burst-exposures";
94const char QCameraParameters::KEY_QC_NUM_SNAPSHOT_PER_SHUTTER[] = "num-snaps-per-shutter";
95const char QCameraParameters::KEY_QC_NO_DISPLAY_MODE[] = "no-display-mode";
96const char QCameraParameters::KEY_QC_RAW_PICUTRE_SIZE[] = "raw-size";
97const char QCameraParameters::KEY_QC_SUPPORTED_SKIN_TONE_ENHANCEMENT_MODES[] = "skinToneEnhancement-values";
98const char QCameraParameters::KEY_QC_SUPPORTED_LIVESNAPSHOT_SIZES[] = "supported-live-snapshot-sizes";
99const char QCameraParameters::KEY_QC_HDR_NEED_1X[] = "hdr-need-1x";
100const char QCameraParameters::KEY_QC_PREVIEW_FLIP[] = "preview-flip";
101const char QCameraParameters::KEY_QC_VIDEO_FLIP[] = "video-flip";
102const char QCameraParameters::KEY_QC_SNAPSHOT_PICTURE_FLIP[] = "snapshot-picture-flip";
103const char QCameraParameters::KEY_QC_SUPPORTED_FLIP_MODES[] = "flip-mode-values";
104const char QCameraParameters::KEY_QC_VIDEO_HDR[] = "video-hdr";
105const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_HDR_MODES[] = "video-hdr-values";
106
107// Values for effect settings.
108const char QCameraParameters::EFFECT_EMBOSS[] = "emboss";
109const char QCameraParameters::EFFECT_SKETCH[] = "sketch";
110const char QCameraParameters::EFFECT_NEON[] = "neon";
111
112// Values for auto exposure settings.
113const char QCameraParameters::TOUCH_AF_AEC_OFF[] = "touch-off";
114const char QCameraParameters::TOUCH_AF_AEC_ON[] = "touch-on";
115
116// Values for scene mode settings.
117const char QCameraParameters::SCENE_MODE_ASD[] = "asd";   // corresponds to CAMERA_BESTSHOT_AUTO in HAL
118const char QCameraParameters::SCENE_MODE_BACKLIGHT[] = "backlight";
119const char QCameraParameters::SCENE_MODE_FLOWERS[] = "flowers";
120const char QCameraParameters::SCENE_MODE_AR[] = "AR";
121const char QCameraParameters::SCENE_MODE_HDR[] = "hdr";
122
123// Formats for setPreviewFormat and setPictureFormat.
124const char QCameraParameters::PIXEL_FORMAT_YUV420SP_ADRENO[] = "yuv420sp-adreno";
125const char QCameraParameters::PIXEL_FORMAT_YV12[] = "yuv420p";
126const char QCameraParameters::PIXEL_FORMAT_NV12[] = "nv12";
127
128// Values for raw image formats
129const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_YUYV[] = "yuv-raw8-yuyv";
130const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_YVYU[] = "yuv-raw8-yvyu";
131const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_UYVY[] = "yuv-raw8-uyvy";
132const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_VYUY[] = "yuv-raw8-vyuy";
133const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GBRG[] = "bayer-qcom-8gbrg";
134const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GRBG[] = "bayer-qcom-8grbg";
135const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8RGGB[] = "bayer-qcom-8rggb";
136const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8BGGR[] = "bayer-qcom-8bggr";
137const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GBRG[] = "bayer-qcom-10gbrg";
138const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GRBG[] = "bayer-qcom-10grbg";
139const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10RGGB[] = "bayer-qcom-10rggb";
140const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10BGGR[] = "bayer-qcom-10bggr";
141const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GBRG[] = "bayer-qcom-12gbrg";
142const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GRBG[] = "bayer-qcom-12grbg";
143const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12RGGB[] = "bayer-qcom-12rggb";
144const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12BGGR[] = "bayer-qcom-12bggr";
145const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GBRG[] = "bayer-mipi-8gbrg";
146const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GRBG[] = "bayer-mipi-8grbg";
147const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8RGGB[] = "bayer-mipi-8rggb";
148const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8BGGR[] = "bayer-mipi-8bggr";
149const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GBRG[] = "bayer-mipi-10gbrg";
150const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GRBG[] = "bayer-mipi-10grbg";
151const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10RGGB[] = "bayer-mipi-10rggb";
152const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10BGGR[] = "bayer-mipi-10bggr";
153const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GBRG[] = "bayer-mipi-12gbrg";
154const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GRBG[] = "bayer-mipi-12grbg";
155const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12RGGB[] = "bayer-mipi-12rggb";
156const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12BGGR[] = "bayer-mipi-12bggr";
157const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GBRG[] = "bayer-ideal-qcom-8gbrg";
158const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GRBG[] = "bayer-ideal-qcom-8grbg";
159const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8RGGB[] = "bayer-ideal-qcom-8rggb";
160const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8BGGR[] = "bayer-ideal-qcom-8bggr";
161const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GBRG[] = "bayer-ideal-qcom-10gbrg";
162const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GRBG[] = "bayer-ideal-qcom-10grbg";
163const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10RGGB[] = "bayer-ideal-qcom-10rggb";
164const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10BGGR[] = "bayer-ideal-qcom-10bggr";
165const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GBRG[] = "bayer-ideal-qcom-12gbrg";
166const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GRBG[] = "bayer-ideal-qcom-12grbg";
167const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12RGGB[] = "bayer-ideal-qcom-12rggb";
168const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12BGGR[] = "bayer-ideal-qcom-12bggr";
169const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GBRG[] = "bayer-ideal-mipi-8gbrg";
170const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GRBG[] = "bayer-ideal-mipi-8grbg";
171const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8RGGB[] = "bayer-ideal-mipi-8rggb";
172const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8BGGR[] = "bayer-ideal-mipi-8bggr";
173const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GBRG[] = "bayer-ideal-mipi-10gbrg";
174const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GRBG[] = "bayer-ideal-mipi-10grbg";
175const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10RGGB[] = "bayer-ideal-mipi-10rggb";
176const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10BGGR[] = "bayer-ideal-mipi-10bggr";
177const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GBRG[] = "bayer-ideal-mipi-12gbrg";
178const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GRBG[] = "bayer-ideal-mipi-12grbg";
179const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12RGGB[] = "bayer-ideal-mipi-12rggb";
180const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12BGGR[] = "bayer-ideal-mipi-12bggr";
181const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GBRG[] = "bayer-ideal-plain8-8gbrg";
182const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GRBG[] = "bayer-ideal-plain8-8grbg";
183const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8RGGB[] = "bayer-ideal-plain8-8rggb";
184const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8BGGR[] = "bayer-ideal-plain8-8bggr";
185const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GBRG[] = "bayer-ideal-plain16-8gbrg";
186const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GRBG[] = "bayer-ideal-plain16-8grbg";
187const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8RGGB[] = "bayer-ideal-plain16-8rggb";
188const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8BGGR[] = "bayer-ideal-plain16-8bggr";
189const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GBRG[] = "bayer-ideal-plain16-10gbrg";
190const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GRBG[] = "bayer-ideal-plain16-10grbg";
191const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10RGGB[] = "bayer-ideal-plain16-10rggb";
192const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10BGGR[] = "bayer-ideal-plain16-10bggr";
193const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GBRG[] = "bayer-ideal-plain16-12gbrg";
194const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GRBG[] = "bayer-ideal-plain16-12grbg";
195const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12RGGB[] = "bayer-ideal-plain16-12rggb";
196const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12BGGR[] = "bayer-ideal-plain16-12bggr";
197
198// Values for ISO Settings
199const char QCameraParameters::ISO_AUTO[] = "auto";
200const char QCameraParameters::ISO_HJR[] = "ISO_HJR";
201const char QCameraParameters::ISO_100[] = "ISO100";
202const char QCameraParameters::ISO_200[] = "ISO200";
203const char QCameraParameters::ISO_400[] = "ISO400";
204const char QCameraParameters::ISO_800[] = "ISO800";
205const char QCameraParameters::ISO_1600[] = "ISO1600";
206
207// Values for auto exposure settings.
208const char QCameraParameters::AUTO_EXPOSURE_FRAME_AVG[] = "frame-average";
209const char QCameraParameters::AUTO_EXPOSURE_CENTER_WEIGHTED[] = "center-weighted";
210const char QCameraParameters::AUTO_EXPOSURE_SPOT_METERING[] = "spot-metering";
211const char QCameraParameters::AUTO_EXPOSURE_SMART_METERING[] = "smart-metering";
212const char QCameraParameters::AUTO_EXPOSURE_USER_METERING[] = "user-metering";
213const char QCameraParameters::AUTO_EXPOSURE_SPOT_METERING_ADV[] = "spot-metering-adv";
214const char QCameraParameters::AUTO_EXPOSURE_CENTER_WEIGHTED_ADV[] = "center-weighted-adv";
215
216const char QCameraParameters::KEY_QC_GPS_LATITUDE_REF[] = "gps-latitude-ref";
217const char QCameraParameters::KEY_QC_GPS_LONGITUDE_REF[] = "gps-longitude-ref";
218const char QCameraParameters::KEY_QC_GPS_ALTITUDE_REF[] = "gps-altitude-ref";
219const char QCameraParameters::KEY_QC_GPS_STATUS[] = "gps-status";
220
221const char QCameraParameters::KEY_QC_HISTOGRAM[] = "histogram";
222const char QCameraParameters::KEY_QC_SUPPORTED_HISTOGRAM_MODES[] = "histogram-values";
223
224const char QCameraParameters::VALUE_ENABLE[] = "enable";
225const char QCameraParameters::VALUE_DISABLE[] = "disable";
226const char QCameraParameters::VALUE_OFF[] = "off";
227const char QCameraParameters::VALUE_ON[] = "on";
228const char QCameraParameters::VALUE_TRUE[] = "true";
229const char QCameraParameters::VALUE_FALSE[] = "false";
230
231const char QCameraParameters::KEY_QC_SHARPNESS[] = "sharpness";
232const char QCameraParameters::KEY_QC_MIN_SHARPNESS[] = "min-sharpness";
233const char QCameraParameters::KEY_QC_MAX_SHARPNESS[] = "max-sharpness";
234const char QCameraParameters::KEY_QC_SHARPNESS_STEP[] = "sharpness-step";
235const char QCameraParameters::KEY_QC_CONTRAST[] = "contrast";
236const char QCameraParameters::KEY_QC_MIN_CONTRAST[] = "min-contrast";
237const char QCameraParameters::KEY_QC_MAX_CONTRAST[] = "max-contrast";
238const char QCameraParameters::KEY_QC_CONTRAST_STEP[] = "contrast-step";
239const char QCameraParameters::KEY_QC_SATURATION[] = "saturation";
240const char QCameraParameters::KEY_QC_MIN_SATURATION[] = "min-saturation";
241const char QCameraParameters::KEY_QC_MAX_SATURATION[] = "max-saturation";
242const char QCameraParameters::KEY_QC_SATURATION_STEP[] = "saturation-step";
243const char QCameraParameters::KEY_QC_BRIGHTNESS[] = "luma-adaptation";
244const char QCameraParameters::KEY_QC_MIN_BRIGHTNESS[] = "min-brightness";
245const char QCameraParameters::KEY_QC_MAX_BRIGHTNESS[] = "max-brightness";
246const char QCameraParameters::KEY_QC_BRIGHTNESS_STEP[] = "brightness-step";
247const char QCameraParameters::KEY_QC_SCE_FACTOR[] = "skinToneEnhancement";
248const char QCameraParameters::KEY_QC_MIN_SCE_FACTOR[] = "min-sce-factor";
249const char QCameraParameters::KEY_QC_MAX_SCE_FACTOR[] = "max-sce-factor";
250const char QCameraParameters::KEY_QC_SCE_FACTOR_STEP[] = "sce-factor-step";
251
252const char QCameraParameters::KEY_QC_SUPPORTED_CAMERA_FEATURES[] = "qc-camera-features";
253const char QCameraParameters::KEY_QC_MAX_NUM_REQUESTED_FACES[] = "qc-max-num-requested-faces";
254
255//Values for DENOISE
256const char QCameraParameters::DENOISE_OFF[] = "denoise-off";
257const char QCameraParameters::DENOISE_ON[] = "denoise-on";
258
259// Values for selectable zone af Settings
260const char QCameraParameters::FOCUS_ALGO_AUTO[] = "auto";
261const char QCameraParameters::FOCUS_ALGO_SPOT_METERING[] = "spot-metering";
262const char QCameraParameters::FOCUS_ALGO_CENTER_WEIGHTED[] = "center-weighted";
263const char QCameraParameters::FOCUS_ALGO_FRAME_AVERAGE[] = "frame-average";
264
265// Values for HFR settings.
266const char QCameraParameters::VIDEO_HFR_OFF[] = "off";
267const char QCameraParameters::VIDEO_HFR_2X[] = "60";
268const char QCameraParameters::VIDEO_HFR_3X[] = "90";
269const char QCameraParameters::VIDEO_HFR_4X[] = "120";
270const char QCameraParameters::VIDEO_HFR_5X[] = "150";
271
272// Values for HDR Bracketing settings.
273const char QCameraParameters::AE_BRACKET_OFF[] = "Off";
274const char QCameraParameters::AE_BRACKET[] = "AE-Bracket";
275
276// Values for FLIP settings.
277const char QCameraParameters::FLIP_MODE_OFF[] = "off";
278const char QCameraParameters::FLIP_MODE_V[] = "flip-v";
279const char QCameraParameters::FLIP_MODE_H[] = "flip-h";
280const char QCameraParameters::FLIP_MODE_VH[] = "flip-vh";
281
282static const char* portrait = "portrait";
283static const char* landscape = "landscape";
284
285const cam_dimension_t QCameraParameters::THUMBNAIL_SIZES_MAP[] = {
286    { 512, 288 }, //1.777778
287    { 480, 288 }, //1.666667
288    { 256, 154 }, //1.66233
289    { 432, 288 }, //1.5
290    { 320, 240 }, //1.33333
291    { 176, 144 }, //1.222222
292    { 0, 0 }      // required by Android SDK
293};
294
295const QCameraParameters::QCameraMap QCameraParameters::AUTO_EXPOSURE_MAP[] = {
296    { AUTO_EXPOSURE_FRAME_AVG,           CAM_AEC_MODE_FRAME_AVERAGE },
297    { AUTO_EXPOSURE_CENTER_WEIGHTED,     CAM_AEC_MODE_CENTER_WEIGHTED },
298    { AUTO_EXPOSURE_SPOT_METERING,       CAM_AEC_MODE_SPOT_METERING },
299    { AUTO_EXPOSURE_SMART_METERING,      CAM_AEC_MODE_SMART_METERING },
300    { AUTO_EXPOSURE_USER_METERING,       CAM_AEC_MODE_USER_METERING },
301    { AUTO_EXPOSURE_SPOT_METERING_ADV,   CAM_AEC_MODE_SPOT_METERING_ADV },
302    { AUTO_EXPOSURE_CENTER_WEIGHTED_ADV, CAM_AEC_MODE_CENTER_WEIGHTED_ADV },
303};
304
305const QCameraParameters::QCameraMap QCameraParameters::PREVIEW_FORMATS_MAP[] = {
306    {PIXEL_FORMAT_YUV420SP,        CAM_FORMAT_YUV_420_NV21},
307    {PIXEL_FORMAT_YUV420P,         CAM_FORMAT_YUV_420_YV12},
308    {PIXEL_FORMAT_YUV420SP_ADRENO, CAM_FORMAT_YUV_420_NV21_ADRENO},
309    {PIXEL_FORMAT_YV12,            CAM_FORMAT_YUV_420_YV12},
310    {PIXEL_FORMAT_NV12,            CAM_FORMAT_YUV_420_NV12}
311};
312
313const QCameraParameters::QCameraMap QCameraParameters::PICTURE_TYPES_MAP[] = {
314    {PIXEL_FORMAT_JPEG,                          CAM_FORMAT_JPEG},
315    {QC_PIXEL_FORMAT_YUV_RAW_8BIT_YUYV,          CAM_FORMAT_YUV_RAW_8BIT_YUYV},
316    {QC_PIXEL_FORMAT_YUV_RAW_8BIT_YVYU,          CAM_FORMAT_YUV_RAW_8BIT_YVYU},
317    {QC_PIXEL_FORMAT_YUV_RAW_8BIT_UYVY,          CAM_FORMAT_YUV_RAW_8BIT_UYVY},
318    {QC_PIXEL_FORMAT_YUV_RAW_8BIT_VYUY,          CAM_FORMAT_YUV_RAW_8BIT_VYUY},
319    {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GBRG,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_GBRG},
320    {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GRBG,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_GRBG},
321    {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8RGGB,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_RGGB},
322    {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8BGGR,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_BGGR},
323    {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GBRG,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GBRG},
324    {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GRBG,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GRBG},
325    {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10RGGB,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_RGGB},
326    {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10BGGR,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_BGGR},
327    {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GBRG,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_GBRG},
328    {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GRBG,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_GRBG},
329    {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12RGGB,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_RGGB},
330    {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12BGGR,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_BGGR},
331    {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GBRG,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_GBRG},
332    {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GRBG,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_GRBG},
333    {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8RGGB,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_RGGB},
334    {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8BGGR,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_BGGR},
335    {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GBRG,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG},
336    {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GRBG,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GRBG},
337    {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10RGGB,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_RGGB},
338    {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10BGGR,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_BGGR},
339    {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GBRG,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_GBRG},
340    {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GRBG,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_GRBG},
341    {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12RGGB,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_RGGB},
342    {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12BGGR,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_BGGR},
343    {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GBRG,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_GBRG},
344    {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GRBG,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_GRBG},
345    {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8RGGB,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_RGGB},
346    {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8BGGR,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_BGGR},
347    {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_GBRG},
348    {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_GRBG},
349    {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_RGGB},
350    {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_BGGR},
351    {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_GBRG},
352    {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_GRBG},
353    {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_RGGB},
354    {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_BGGR},
355    {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GBRG,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_GBRG},
356    {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GRBG,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_GRBG},
357    {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8RGGB,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_RGGB},
358    {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8BGGR,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_BGGR},
359    {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_GBRG},
360    {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_GRBG},
361    {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_RGGB},
362    {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_BGGR},
363    {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_GBRG},
364    {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_GRBG},
365    {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_RGGB},
366    {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_BGGR},
367    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GBRG,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_GBRG},
368    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GRBG,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_GRBG},
369    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8RGGB,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_RGGB},
370    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8BGGR,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_BGGR},
371    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GBRG,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_GBRG},
372    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GRBG,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_GRBG},
373    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8RGGB,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_RGGB},
374    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8BGGR,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_BGGR},
375    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_GBRG},
376    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_GRBG},
377    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_RGGB},
378    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_BGGR},
379    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_GBRG},
380    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_GRBG},
381    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_RGGB},
382    {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_BGGR}
383};
384
385const QCameraParameters::QCameraMap QCameraParameters::RAW_FORMATS_MAP[] = {
386};
387
388const QCameraParameters::QCameraMap QCameraParameters::FOCUS_MODES_MAP[] = {
389    { FOCUS_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
390    { FOCUS_MODE_INFINITY,           CAM_FOCUS_MODE_INFINITY },
391    { FOCUS_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
392    { FOCUS_MODE_FIXED,              CAM_FOCUS_MODE_FIXED },
393    { FOCUS_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
394    { FOCUS_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
395    { FOCUS_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO }
396};
397
398const QCameraParameters::QCameraMap QCameraParameters::EFFECT_MODES_MAP[] = {
399    { EFFECT_NONE,       CAM_EFFECT_MODE_OFF },
400    { EFFECT_MONO,       CAM_EFFECT_MODE_MONO },
401    { EFFECT_NEGATIVE,   CAM_EFFECT_MODE_NEGATIVE },
402    { EFFECT_SOLARIZE,   CAM_EFFECT_MODE_SOLARIZE },
403    { EFFECT_SEPIA,      CAM_EFFECT_MODE_SEPIA },
404    { EFFECT_POSTERIZE,  CAM_EFFECT_MODE_POSTERIZE },
405    { EFFECT_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
406    { EFFECT_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
407    { EFFECT_AQUA,       CAM_EFFECT_MODE_AQUA },
408    { EFFECT_EMBOSS,     CAM_EFFECT_MODE_EMBOSS },
409    { EFFECT_SKETCH,     CAM_EFFECT_MODE_SKETCH },
410    { EFFECT_NEON,       CAM_EFFECT_MODE_NEON }
411};
412
413const QCameraParameters::QCameraMap QCameraParameters::SCENE_MODES_MAP[] = {
414    { SCENE_MODE_AUTO,           CAM_SCENE_MODE_OFF },
415    { SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
416    { SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
417    { SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
418    { SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
419    { SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
420    { SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
421    { SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
422    { SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
423    { SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
424    { SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
425    { SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
426    { SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
427    { SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
428    { SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
429    { SCENE_MODE_ASD,            CAM_SCENE_MODE_AUTO },
430    { SCENE_MODE_BACKLIGHT,      CAM_SCENE_MODE_BACKLIGHT },
431    { SCENE_MODE_FLOWERS,        CAM_SCENE_MODE_FLOWERS },
432    { SCENE_MODE_AR,             CAM_SCENE_MODE_AR },
433    { SCENE_MODE_HDR,            CAM_SCENE_MODE_OFF },
434};
435
436const QCameraParameters::QCameraMap QCameraParameters::FLASH_MODES_MAP[] = {
437    { FLASH_MODE_OFF,   CAM_FLASH_MODE_OFF },
438    { FLASH_MODE_AUTO,  CAM_FLASH_MODE_AUTO },
439    { FLASH_MODE_ON,    CAM_FLASH_MODE_ON },
440    { FLASH_MODE_TORCH, CAM_FLASH_MODE_TORCH }
441};
442
443const QCameraParameters::QCameraMap QCameraParameters::FOCUS_ALGO_MAP[] = {
444    { FOCUS_ALGO_AUTO,            CAM_FOCUS_ALGO_AUTO },
445    { FOCUS_ALGO_SPOT_METERING,   CAM_FOCUS_ALGO_SPOT },
446    { FOCUS_ALGO_CENTER_WEIGHTED, CAM_FOCUS_ALGO_CENTER_WEIGHTED },
447    { FOCUS_ALGO_FRAME_AVERAGE,   CAM_FOCUS_ALGO_AVERAGE }
448};
449
450const QCameraParameters::QCameraMap QCameraParameters::WHITE_BALANCE_MODES_MAP[] = {
451    { WHITE_BALANCE_AUTO,            CAM_WB_MODE_AUTO },
452    { WHITE_BALANCE_INCANDESCENT,    CAM_WB_MODE_INCANDESCENT },
453    { WHITE_BALANCE_FLUORESCENT,     CAM_WB_MODE_FLUORESCENT },
454    { WHITE_BALANCE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
455    { WHITE_BALANCE_DAYLIGHT,        CAM_WB_MODE_DAYLIGHT },
456    { WHITE_BALANCE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
457    { WHITE_BALANCE_TWILIGHT,        CAM_WB_MODE_TWILIGHT },
458    { WHITE_BALANCE_SHADE,           CAM_WB_MODE_SHADE }
459};
460
461const QCameraParameters::QCameraMap QCameraParameters::ANTIBANDING_MODES_MAP[] = {
462    { ANTIBANDING_OFF,  CAM_ANTIBANDING_MODE_OFF },
463    { ANTIBANDING_50HZ, CAM_ANTIBANDING_MODE_50HZ },
464    { ANTIBANDING_60HZ, CAM_ANTIBANDING_MODE_60HZ },
465    { ANTIBANDING_AUTO, CAM_ANTIBANDING_MODE_AUTO }
466};
467
468const QCameraParameters::QCameraMap QCameraParameters::ISO_MODES_MAP[] = {
469    { ISO_AUTO,  CAM_ISO_MODE_AUTO },
470    { ISO_HJR,   CAM_ISO_MODE_DEBLUR },
471    { ISO_100,   CAM_ISO_MODE_100 },
472    { ISO_200,   CAM_ISO_MODE_200 },
473    { ISO_400,   CAM_ISO_MODE_400 },
474    { ISO_800,   CAM_ISO_MODE_800 },
475    { ISO_1600,  CAM_ISO_MODE_1600 }
476};
477
478const QCameraParameters::QCameraMap QCameraParameters::HFR_MODES_MAP[] = {
479    { VIDEO_HFR_OFF, CAM_HFR_MODE_OFF },
480    { VIDEO_HFR_2X,  CAM_HFR_MODE_60FPS },
481    { VIDEO_HFR_3X,  CAM_HFR_MODE_90FPS },
482    { VIDEO_HFR_4X,  CAM_HFR_MODE_120FPS },
483    { VIDEO_HFR_5X,  CAM_HFR_MODE_150FPS }
484};
485
486const QCameraParameters::QCameraMap QCameraParameters::BRACKETING_MODES_MAP[] = {
487    { AE_BRACKET_OFF, CAM_EXP_BRACKETING_OFF },
488    { AE_BRACKET,         CAM_EXP_BRACKETING_ON }
489};
490
491const QCameraParameters::QCameraMap QCameraParameters::ON_OFF_MODES_MAP[] = {
492    { VALUE_OFF, 0 },
493    { VALUE_ON,  1 }
494};
495
496const QCameraParameters::QCameraMap QCameraParameters::TOUCH_AF_AEC_MODES_MAP[] = {
497    { QCameraParameters::TOUCH_AF_AEC_OFF, 0 },
498    { QCameraParameters::TOUCH_AF_AEC_ON, 1 }
499};
500
501const QCameraParameters::QCameraMap QCameraParameters::ENABLE_DISABLE_MODES_MAP[] = {
502    { VALUE_ENABLE,  1 },
503    { VALUE_DISABLE, 0 }
504};
505
506const QCameraParameters::QCameraMap QCameraParameters::DENOISE_ON_OFF_MODES_MAP[] = {
507    { DENOISE_OFF, 0 },
508    { DENOISE_ON,  1 }
509};
510
511const QCameraParameters::QCameraMap QCameraParameters::TRUE_FALSE_MODES_MAP[] = {
512    { VALUE_FALSE, 0},
513    { VALUE_TRUE,  1}
514};
515
516const QCameraParameters::QCameraMap QCameraParameters::FLIP_MODES_MAP[] = {
517    {FLIP_MODE_OFF, 0},
518    {FLIP_MODE_V, FLIP_V},
519    {FLIP_MODE_H, FLIP_H},
520    {FLIP_MODE_VH, FLIP_V_H}
521};
522
523#define DEFAULT_CAMERA_AREA "(0, 0, 0, 0, 0)"
524#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
525
526/*===========================================================================
527 * FUNCTION   : QCameraParameters
528 *
529 * DESCRIPTION: default constructor of QCameraParameters
530 *
531 * PARAMETERS : none
532 *
533 * RETURN     : None
534 *==========================================================================*/
535QCameraParameters::QCameraParameters()
536    : CameraParameters(),
537      m_pCapability(NULL),
538      m_pCamOpsTbl(NULL),
539      m_pParamHeap(NULL),
540      m_pParamBuf(NULL),
541      m_bZslMode(false),
542      m_bRecordingHint(false),
543      m_bHistogramEnabled(false),
544      m_nFaceProcMask(0),
545      m_bDebugFps(false),
546      mFocusMode(CAM_FOCUS_MODE_MAX),
547      mPreviewFormat(CAM_FORMAT_YUV_420_NV21),
548      mPictureFormat(CAM_FORMAT_JPEG),
549      m_bNeedRestart(false),
550      m_bNoDisplayMode(false),
551      m_bWNROn(false),
552      m_bNeedLockCAF(false),
553      m_bCAFLocked(false),
554      m_bAFRunning(false),
555      m_tempMap()
556{
557    char value[32];
558    // TODO: may move to parameter instead of sysprop
559    property_get("persist.debug.sf.showfps", value, "0");
560    m_bDebugFps = atoi(value) > 0 ? true : false;
561
562    // For thermal mode, it should be set as system property
563    // because system property applies to all applications, while
564    // parameters only apply to specific app.
565    property_get("persist.camera.thermal.mode", value, "fps");
566    if (!strcmp(value, "frameskip")) {
567        m_ThermalMode = QCAMERA_THERMAL_ADJUST_FRAMESKIP;
568    } else {
569        if (strcmp(value, "fps"))
570            ALOGE("%s: Invalid camera thermal mode %s", __func__, value);
571        m_ThermalMode = QCAMERA_THERMAL_ADJUST_FPS;
572    }
573
574    memset(&m_LiveSnapshotSize, 0, sizeof(m_LiveSnapshotSize));
575}
576
577/*===========================================================================
578 * FUNCTION   : QCameraParameters
579 *
580 * DESCRIPTION: constructor of QCameraParameters
581 *
582 * PARAMETERS :
583 *   @params  : parameters in string
584 *
585 * RETURN     : None
586 *==========================================================================*/
587QCameraParameters::QCameraParameters(const String8 &params)
588    : CameraParameters(params),
589    m_pCapability(NULL),
590    m_pCamOpsTbl(NULL),
591    m_pParamHeap(NULL),
592    m_pParamBuf(NULL),
593    m_bZslMode(false),
594    m_bRecordingHint(false),
595    m_bHistogramEnabled(false),
596    m_nFaceProcMask(0),
597    m_bDebugFps(false),
598    mFocusMode(CAM_FOCUS_MODE_MAX),
599    mPreviewFormat(CAM_FORMAT_YUV_420_NV21),
600    mPictureFormat(CAM_FORMAT_JPEG),
601    m_bNeedRestart(false),
602    m_bNoDisplayMode(false),
603    m_bWNROn(false),
604    m_bNeedLockCAF(false),
605    m_bCAFLocked(false),
606    m_bAFRunning(false),
607    m_tempMap()
608{
609    memset(&m_LiveSnapshotSize, 0, sizeof(m_LiveSnapshotSize));
610}
611
612/*===========================================================================
613 * FUNCTION   : ~QCameraParameters
614 *
615 * DESCRIPTION: deconstructor of QCameraParameters
616 *
617 * PARAMETERS : none
618 *
619 * RETURN     : None
620 *==========================================================================*/
621QCameraParameters::~QCameraParameters()
622{
623    deinit();
624}
625
626/*===========================================================================
627 * FUNCTION   : createSizesString
628 *
629 * DESCRIPTION: create string obj contains array of dimensions
630 *
631 * PARAMETERS :
632 *   @sizes   : array of dimensions
633 *   @len     : size of dimension array
634 *
635 * RETURN     : string obj
636 *==========================================================================*/
637String8 QCameraParameters::createSizesString(const cam_dimension_t *sizes, int len)
638{
639    String8 str;
640    char buffer[32];
641
642    if (len > 0) {
643        snprintf(buffer, sizeof(buffer), "%dx%d", sizes[0].width, sizes[0].height);
644        str.append(buffer);
645    }
646    for (int i = 1; i < len; i++) {
647        snprintf(buffer, sizeof(buffer), ",%dx%d", sizes[i].width, sizes[i].height);
648        str.append(buffer);
649    }
650    return str;
651}
652
653/*===========================================================================
654 * FUNCTION   : createValuesString
655 *
656 * DESCRIPTION: create string obj contains array of values from map when matched
657 *              from input values array
658 *
659 * PARAMETERS :
660 *   @values  : array of values
661 *   @len     : size of values array
662 *   @map     : map contains the mapping between values and enums
663 *   @map_len : size of the map
664 *
665 * RETURN     : string obj
666 *==========================================================================*/
667String8 QCameraParameters::createValuesString(const int *values,
668                                              int len,
669                                              const QCameraMap* map,
670                                              int map_len)
671{
672    String8 str;
673    int count = 0;
674
675    for (int i = 0; i < len; i++ ) {
676        for (int j = 0; j < map_len; j ++)
677            if (map[j].val == values[i]) {
678                if (NULL != map[j].desc) {
679                    if (count > 0) {
680                        str.append(",");
681                    }
682                    str.append(map[j].desc);
683                    count++;
684                    break; //loop j
685                }
686            }
687    }
688    return str;
689}
690
691/*===========================================================================
692 * FUNCTION   : createValuesStringFromMap
693 *
694 * DESCRIPTION: create string obj contains array of values directly from map
695 *
696 * PARAMETERS :
697 *   @map     : map contains the mapping between values and enums
698 *   @map_len : size of the map
699 *
700 * RETURN     : string obj
701 *==========================================================================*/
702String8 QCameraParameters::createValuesStringFromMap(const QCameraMap* map,
703                                                     int map_len)
704{
705    String8 str;
706
707    for (int i = 0; i < map_len; i++) {
708        if (NULL != map[i].desc) {
709            if (i > 0) {
710                str.append(",");
711            }
712            str.append(map[i].desc);
713        }
714    }
715    return str;
716}
717
718/*===========================================================================
719 * FUNCTION   : createZoomRatioValuesString
720 *
721 * DESCRIPTION: create string obj contains array of zoom ratio values
722 *
723 * PARAMETERS :
724 *   @zoomRaios  : array of zoom ratios
725 *   @length     : size of the array
726 *
727 * RETURN     : string obj
728 *==========================================================================*/
729String8 QCameraParameters::createZoomRatioValuesString(int *zoomRatios, int length)
730{
731    String8 str;
732    char buffer[32] = {0};
733
734    if(length > 0){
735        snprintf(buffer, sizeof(buffer), "%d", zoomRatios[0]);
736        str.append(buffer);
737    }
738
739    for (int i =1;i<length;i++){
740        memset(buffer, 0, sizeof(buffer));
741        snprintf(buffer, sizeof(buffer), ",%d", zoomRatios[i]);
742        str.append(buffer);
743    }
744    return str;
745}
746
747/*===========================================================================
748 * FUNCTION   : createHfrValuesString
749 *
750 * DESCRIPTION: create string obj contains array of hfr values from map when
751 *              matched from input hfr values
752 *
753 * PARAMETERS :
754 *   @values  : array of hfr info
755 *   @len     : size of the array
756 *   @map     : map of hfr string value and enum
757 *   map_len  : size of map
758 *
759 * RETURN     : string obj
760 *==========================================================================*/
761String8 QCameraParameters::createHfrValuesString(
762                                const cam_hfr_info_t *values,
763                                int len,
764                                const QCameraMap* map,
765                                int map_len)
766{
767    String8 str;
768    int count = 0;
769
770    for (int i = 0; i < len; i++ ) {
771        for (int j = 0; j < map_len; j ++)
772            if (map[j].val == (int)values[i].mode) {
773                if (NULL != map[j].desc) {
774                    if (count > 0) {
775                        str.append(",");
776                    }
777                     str.append(map[j].desc);
778                     count++;
779                     break; //loop j
780                }
781            }
782    }
783    return str;
784}
785
786/*===========================================================================
787 * FUNCTION   : createHfrSizesString
788 *
789 * DESCRIPTION: create string obj contains array of hfr sizes
790 *
791 * PARAMETERS :
792 *   @values  : array of hfr info
793 *   @len     : size of the array
794 *
795 * RETURN     : string obj
796 *==========================================================================*/
797String8 QCameraParameters::createHfrSizesString(
798                                const cam_hfr_info_t *values,
799                                int len)
800{
801    String8 str;
802    char buffer[32];
803
804    if (len > 0) {
805        snprintf(buffer, sizeof(buffer), "%dx%d",
806                 values[0].dim.width, values[0].dim.height);
807        str.append(buffer);
808    }
809    for (int i = 1; i < len; i++) {
810        snprintf(buffer, sizeof(buffer), ",%dx%d",
811                 values[i].dim.width, values[i].dim.height);
812        str.append(buffer);
813    }
814    return str;
815}
816
817/*===========================================================================
818 * FUNCTION   : createFpsString
819 *
820 * DESCRIPTION: create string obj contains array of FPS rates
821 *
822 * PARAMETERS :
823 *   @fps     : array of fps ranges
824 *   @len     : size of the array
825 *
826 * RETURN     : string obj
827 *==========================================================================*/
828String8 QCameraParameters::createFpsString(const cam_fps_range_t *fps, int len)
829{
830    String8 str;
831    char buffer[32];
832
833    for (int i = 0; i < len; i++ ) {
834        snprintf(buffer, sizeof(buffer), "%d", int(fps[i].max_fps * 1000));
835        str.append(buffer);
836        if (i < len-1)
837            str.append(",");
838    }
839    return str;
840}
841
842/*===========================================================================
843 * FUNCTION   : createFpsRangeString
844 *
845 * DESCRIPTION: create string obj contains array of FPS ranges
846 *
847 * PARAMETERS :
848 *   @fps     : array of fps ranges
849 *   @len     : size of the array
850 *   @default_fps_index : reference to index of default fps range
851 *
852 * RETURN     : string obj
853 *==========================================================================*/
854String8 QCameraParameters::createFpsRangeString(const cam_fps_range_t* fps,
855                                                int len,
856                                                int &default_fps_index)
857{
858    String8 str;
859    char buffer[32];
860    int max_range = 0;
861    int min_fps, max_fps;
862
863    if (len > 0) {
864        min_fps = int(fps[0].min_fps * 1000);
865        max_fps = int(fps[0].max_fps * 1000);
866        max_range = max_fps - min_fps;
867        default_fps_index = 0;
868        snprintf(buffer, sizeof(buffer), "(%d,%d)", min_fps, max_fps);
869        str.append(buffer);
870    }
871    for (int i = 1; i < len; i++) {
872        min_fps = int(fps[i].min_fps * 1000);
873        max_fps = int(fps[i].max_fps * 1000);
874        if (max_range < (max_fps - min_fps)) {
875            max_range = max_fps - min_fps;
876            default_fps_index = i;
877        }
878        snprintf(buffer, sizeof(buffer), ",(%d,%d)", min_fps, max_fps);
879        str.append(buffer);
880    }
881    return str;
882}
883
884/*===========================================================================
885 * FUNCTION   : lookupAttr
886 *
887 * DESCRIPTION: lookup a value by its name
888 *
889 * PARAMETERS :
890 *   @attr    : map contains <name, value>
891 *   @len     : size of the map
892 *   @name    : name to be looked up
893 *
894 * RETURN     : valid value if found
895 *              NAME_NOT_FOUND if not found
896 *==========================================================================*/
897int QCameraParameters::lookupAttr(const QCameraMap arr[], int len, const char *name)
898{
899    if (name) {
900        for (int i = 0; i < len; i++) {
901            if (!strcmp(arr[i].desc, name))
902                return arr[i].val;
903        }
904    }
905    return NAME_NOT_FOUND;
906}
907
908/*===========================================================================
909 * FUNCTION   : lookupNameByValue
910 *
911 * DESCRIPTION: lookup a name by its value
912 *
913 * PARAMETERS :
914 *   @attr    : map contains <name, value>
915 *   @len     : size of the map
916 *   @value   : value to be looked up
917 *
918 * RETURN     : name str or NULL if not found
919 *==========================================================================*/
920const char *QCameraParameters::lookupNameByValue(const QCameraMap arr[], int len, int value)
921{
922    for (int i = 0; i < len; i++) {
923        if (arr[i].val == value) {
924            return arr[i].desc;
925        }
926    }
927    return NULL;
928}
929
930/*===========================================================================
931 * FUNCTION   : setPreviewSize
932 *
933 * DESCRIPTION: set preview size from user setting
934 *
935 * PARAMETERS :
936 *   @params  : user setting parameters
937 *
938 * RETURN     : int32_t type of status
939 *              NO_ERROR  -- success
940 *              none-zero failure code
941 *==========================================================================*/
942int32_t QCameraParameters::setPreviewSize(const QCameraParameters& params)
943{
944    int width, height;
945    params.getPreviewSize(&width, &height);
946    ALOGV("Requested preview size %d x %d", width, height);
947
948    // Validate the preview size
949    for (size_t i = 0; i < m_pCapability->preview_sizes_tbl_cnt; ++i) {
950        if (width ==  m_pCapability->preview_sizes_tbl[i].width
951           && height ==  m_pCapability->preview_sizes_tbl[i].height) {
952            // check if need to restart preview in case of preview size change
953            int old_width, old_height;
954            CameraParameters::getPreviewSize(&old_width, &old_height);
955            if (width != old_width || height != old_height) {
956                m_bNeedRestart = true;
957            }
958
959            // set the new value
960            char val[32];
961            sprintf(val, "%dx%d", width, height);
962            updateParamEntry(KEY_PREVIEW_SIZE, val);
963            ALOGV("%s: %s", __func__, val);
964            return NO_ERROR;
965        }
966    }
967    ALOGE("Invalid preview size requested: %dx%d", width, height);
968    return BAD_VALUE;
969}
970
971/*===========================================================================
972 * FUNCTION   : setPictureSize
973 *
974 * DESCRIPTION: set picture size from user setting
975 *
976 * PARAMETERS :
977 *   @params  : user setting parameters
978 *
979 * RETURN     : int32_t type of status
980 *              NO_ERROR  -- success
981 *              none-zero failure code
982 *==========================================================================*/
983int32_t QCameraParameters::setPictureSize(const QCameraParameters& params)
984{
985    int width, height;
986    params.getPictureSize(&width, &height);
987    ALOGV("Requested picture size %d x %d", width, height);
988
989    // Validate the picture size
990    for (size_t i = 0; i < m_pCapability->picture_sizes_tbl_cnt; ++i) {
991        if (width ==  m_pCapability->picture_sizes_tbl[i].width
992           && height ==  m_pCapability->picture_sizes_tbl[i].height) {
993            // check if need to restart preview in case of picture size change
994            int old_width, old_height;
995            CameraParameters::getPictureSize(&old_width, &old_height);
996            if ((m_bZslMode || m_bRecordingHint) &&
997                (width != old_width || height != old_height)) {
998                m_bNeedRestart = true;
999            }
1000
1001            // set the new value
1002            char val[32];
1003            sprintf(val, "%dx%d", width, height);
1004            updateParamEntry(KEY_PICTURE_SIZE, val);
1005            ALOGV("%s: %s", __func__, val);
1006            return NO_ERROR;
1007        }
1008    }
1009    ALOGE("Invalid picture size requested: %dx%d", width, height);
1010    return BAD_VALUE;
1011}
1012
1013/*===========================================================================
1014 * FUNCTION   : setVideoSize
1015 *
1016 * DESCRIPTION: set video size from user setting
1017 *
1018 * PARAMETERS :
1019 *   @params  : user setting parameters
1020 *
1021 * RETURN     : int32_t type of status
1022 *              NO_ERROR  -- success
1023 *              none-zero failure code
1024 *==========================================================================*/
1025int32_t QCameraParameters::setVideoSize(const QCameraParameters& params)
1026{
1027    const char *str= NULL;
1028    int width, height;
1029    str = params.get(KEY_VIDEO_SIZE);
1030    if(!str) {
1031        //If application didn't set this parameter string, use the values from
1032        //getPreviewSize() as video dimensions.
1033        params.getPreviewSize(&width, &height);
1034        ALOGE("No Record Size requested, use the preview dimensions");
1035    } else {
1036        params.getVideoSize(&width, &height);
1037    }
1038
1039    // Validate the video size
1040    for (size_t i = 0; i < m_pCapability->video_sizes_tbl_cnt; ++i) {
1041        if (width ==  m_pCapability->video_sizes_tbl[i].width
1042                && height ==  m_pCapability->video_sizes_tbl[i].height) {
1043            // check if need to restart preview in case of video size change
1044            int old_width, old_height;
1045            CameraParameters::getVideoSize(&old_width, &old_height);
1046            if (m_bRecordingHint &&
1047               (width != old_width || height != old_height)) {
1048                m_bNeedRestart = true;
1049            }
1050
1051            // set the new value
1052            char val[32];
1053            sprintf(val, "%dx%d", width, height);
1054            updateParamEntry(KEY_VIDEO_SIZE, val);
1055            ALOGV("%s: %s", __func__, val);
1056            return NO_ERROR;
1057        }
1058    }
1059
1060    ALOGE("Invalid video size requested: %dx%d", width, height);
1061    return BAD_VALUE;
1062}
1063
1064/*===========================================================================
1065 * FUNCTION   : setLiveSnapshotSize
1066 *
1067 * DESCRIPTION: set live snapshot size
1068 *
1069 * PARAMETERS :
1070 *   @params  : user setting parameters
1071 *
1072 * RETURN     : int32_t type of status
1073 *              NO_ERROR  -- success
1074 *              none-zero failure code
1075 *==========================================================================*/
1076int32_t QCameraParameters::setLiveSnapshotSize(const QCameraParameters& params)
1077{
1078    char value[32];
1079    property_get("persist.camera.opt.livepic", value, "1");
1080    bool useOptimal = atoi(value) > 0 ? true : false;
1081
1082    // use picture size from user setting
1083    params.getPictureSize(&m_LiveSnapshotSize.width, &m_LiveSnapshotSize.height);
1084
1085    uint8_t livesnapshot_sizes_tbl_cnt = m_pCapability->livesnapshot_sizes_tbl_cnt;
1086    cam_dimension_t *livesnapshot_sizes_tbl = &m_pCapability->livesnapshot_sizes_tbl[0];
1087
1088    // check if HFR is enabled
1089    const char *hfrStr = params.get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
1090    cam_hfr_mode_t hfrMode = CAM_HFR_MODE_OFF;
1091    if (hfrStr != NULL) {
1092        int32_t value = lookupAttr(HFR_MODES_MAP,
1093                                   sizeof(HFR_MODES_MAP)/sizeof(QCameraMap),
1094                                   hfrStr);
1095        if (value != NAME_NOT_FOUND) {
1096            // if HFR is enabled, change live snapshot size
1097            if (value > CAM_HFR_MODE_OFF) {
1098                for (int i = 0; i < m_pCapability->hfr_tbl_cnt; i++) {
1099                    if (m_pCapability->hfr_tbl[i].mode == value) {
1100                        livesnapshot_sizes_tbl_cnt =
1101                            m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl_cnt;
1102                        livesnapshot_sizes_tbl =
1103                            &m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl[0];
1104                        hfrMode = m_pCapability->hfr_tbl[i].mode;
1105                        break;
1106                    }
1107                }
1108            }
1109        }
1110    }
1111
1112    if (useOptimal || hfrMode != CAM_HFR_MODE_OFF) {
1113        bool found = false;
1114
1115        // first check if picture size is within the list of supported sizes
1116        for (int i = 0; i < livesnapshot_sizes_tbl_cnt; ++i) {
1117            if (m_LiveSnapshotSize.width == livesnapshot_sizes_tbl[i].width &&
1118                m_LiveSnapshotSize.height == livesnapshot_sizes_tbl[i].height) {
1119                found = true;
1120                break;
1121            }
1122        }
1123
1124        if (!found) {
1125            // use optimal live snapshot size from supported list,
1126            // that has same preview aspect ratio
1127            int width = 0, height = 0;
1128            params.getPreviewSize(&width, &height);
1129
1130            double previewAspectRatio = (double)width / height;
1131            for (int i = 0; i < livesnapshot_sizes_tbl_cnt; ++i) {
1132                double ratio = (double)livesnapshot_sizes_tbl[i].width /
1133                                livesnapshot_sizes_tbl[i].height;
1134                if (fabs(previewAspectRatio - ratio) <= ASPECT_TOLERANCE) {
1135                    m_LiveSnapshotSize = livesnapshot_sizes_tbl[i];
1136                    found = true;
1137                    break;
1138                }
1139            }
1140
1141            if (!found && hfrMode != CAM_HFR_MODE_OFF) {
1142                // Cannot find matching aspect ration from supported live snapshot list
1143                // choose the max dim from preview and video size
1144                ALOGI("%s: Cannot find matching aspect ratio, choose max of preview or video size", __func__);
1145                params.getVideoSize(&m_LiveSnapshotSize.width, &m_LiveSnapshotSize.height);
1146                if (m_LiveSnapshotSize.width < width && m_LiveSnapshotSize.height < height) {
1147                    m_LiveSnapshotSize.width = width;
1148                    m_LiveSnapshotSize.height = height;
1149                }
1150            }
1151        }
1152    }
1153    ALOGI("%s: live snapshot size %d x %d", __func__,
1154          m_LiveSnapshotSize.width, m_LiveSnapshotSize.height);
1155
1156    return NO_ERROR;
1157}
1158
1159/*===========================================================================
1160 * FUNCTION   : setPreviewFormat
1161 *
1162 * DESCRIPTION: set preview format from user setting
1163 *
1164 * PARAMETERS :
1165 *   @params  : user setting parameters
1166 *
1167 * RETURN     : int32_t type of status
1168 *              NO_ERROR  -- success
1169 *              none-zero failure code
1170 *==========================================================================*/
1171int32_t QCameraParameters::setPreviewFormat(const QCameraParameters& params)
1172{
1173    const char *str = params.getPreviewFormat();
1174    int32_t previewFormat =
1175        lookupAttr(PREVIEW_FORMATS_MAP,
1176                   sizeof(PREVIEW_FORMATS_MAP) / sizeof(QCameraMap),
1177                   str);
1178    if (previewFormat != NAME_NOT_FOUND) {
1179        mPreviewFormat = (cam_format_t)previewFormat;
1180
1181        updateParamEntry(KEY_PREVIEW_FORMAT, str);
1182        ALOGV("%s: format %d\n", __func__, mPreviewFormat);
1183        return NO_ERROR;
1184    }
1185    ALOGE("Invalid preview format value: %s", (str == NULL) ? "NULL" : str);
1186    return BAD_VALUE;
1187}
1188
1189/*===========================================================================
1190 * FUNCTION   : setPictureFormat
1191 *
1192 * DESCRIPTION: set picture format from user setting
1193 *
1194 * PARAMETERS :
1195 *   @params  : user setting parameters
1196 *
1197 * RETURN     : int32_t type of status
1198 *              NO_ERROR  -- success
1199 *              none-zero failure code
1200 *==========================================================================*/
1201int32_t QCameraParameters::setPictureFormat(const QCameraParameters& params)
1202{
1203    const char *str = params.getPictureFormat();
1204    int32_t pictureFormat =
1205        lookupAttr(PICTURE_TYPES_MAP,
1206                   sizeof(PICTURE_TYPES_MAP) / sizeof(QCameraMap),
1207                   str);
1208    if (pictureFormat != NAME_NOT_FOUND) {
1209        mPictureFormat = pictureFormat;
1210
1211        updateParamEntry(KEY_PICTURE_FORMAT, str);
1212        ALOGE("%s: format %d\n", __func__, mPictureFormat);
1213        return NO_ERROR;
1214    }
1215    ALOGE("Invalid picture format value: %s", (str == NULL) ? "NULL" : str);
1216    return BAD_VALUE;
1217}
1218
1219/*===========================================================================
1220 * FUNCTION   : setJpegThumbnailSize
1221 *
1222 * DESCRIPTION: set jpeg thumbnail size from user setting
1223 *
1224 * PARAMETERS :
1225 *   @params  : user setting parameters
1226 *
1227 * RETURN     : int32_t type of status
1228 *              NO_ERROR  -- success
1229 *              none-zero failure code
1230 *==========================================================================*/
1231int32_t QCameraParameters::setJpegThumbnailSize(const QCameraParameters& params)
1232{
1233    int width = params.getInt(KEY_JPEG_THUMBNAIL_WIDTH);
1234    int height = params.getInt(KEY_JPEG_THUMBNAIL_HEIGHT);
1235
1236    ALOGV("requested jpeg thumbnail size %d x %d", width, height);
1237
1238    int sizes_cnt = sizeof(THUMBNAIL_SIZES_MAP) / sizeof(cam_dimension_t);
1239
1240    int pic_width = 0, pic_height = 0;
1241    params.getPictureSize(&pic_width, &pic_height);
1242    if (pic_height == 0) {
1243        ALOGE("%s: picture size is invalid (%d x %d)", __func__, pic_width, pic_height);
1244        return BAD_VALUE;
1245    }
1246    double picAspectRatio = (double)pic_width / pic_height;
1247
1248    int optimalWidth = 0, optimalHeight = 0;
1249    if (width != 0 || height != 0) {
1250        // If input jpeg thumnmail size is (0,0), meaning no thumbnail needed
1251        // hornor this setting.
1252        // Otherwise, find optimal jpeg thumbnail size that has same aspect ration
1253        // as picture size
1254
1255        // Try to find a size matches aspect ratio and has the largest width
1256        for (int i = 0; i < sizes_cnt; i++) {
1257            if (THUMBNAIL_SIZES_MAP[i].height == 0) {
1258                // No thumbnail case, just skip
1259                continue;
1260            }
1261            double ratio =
1262                (double)THUMBNAIL_SIZES_MAP[i].width / THUMBNAIL_SIZES_MAP[i].height;
1263            if (fabs(ratio - picAspectRatio) > ASPECT_TOLERANCE)  {
1264                continue;
1265            }
1266            if (THUMBNAIL_SIZES_MAP[i].width > optimalWidth) {
1267                optimalWidth = THUMBNAIL_SIZES_MAP[i].width;
1268                optimalHeight = THUMBNAIL_SIZES_MAP[i].height;
1269            }
1270        }
1271    }
1272
1273    char val[16];
1274    sprintf(val, "%d", optimalWidth);
1275    updateParamEntry(KEY_JPEG_THUMBNAIL_WIDTH, val);
1276    sprintf(val, "%d", optimalHeight);
1277    updateParamEntry(KEY_JPEG_THUMBNAIL_HEIGHT, val);
1278    return NO_ERROR;
1279}
1280
1281/*===========================================================================
1282 * FUNCTION   : setJpegQuality
1283 *
1284 * DESCRIPTION: set jpeg encpding quality from user setting
1285 *
1286 * PARAMETERS :
1287 *   @params  : user setting parameters
1288 *
1289 * RETURN     : int32_t type of status
1290 *              NO_ERROR  -- success
1291 *              none-zero failure code
1292 *==========================================================================*/
1293int32_t QCameraParameters::setJpegQuality(const QCameraParameters& params)
1294{
1295    int32_t rc = NO_ERROR;
1296    int quality = params.getInt(KEY_JPEG_QUALITY);
1297    if (quality >= 0 && quality <= 100) {
1298        set(KEY_JPEG_QUALITY, quality);
1299    } else {
1300        ALOGE("%s: Invalid jpeg quality=%d", __func__, quality);
1301        rc = BAD_VALUE;
1302    }
1303
1304    quality = params.getInt(KEY_JPEG_THUMBNAIL_QUALITY);
1305    if (quality >= 0 && quality <= 100) {
1306        char val[16];
1307        sprintf(val, "%d", quality);
1308        updateParamEntry(KEY_JPEG_THUMBNAIL_QUALITY, val);
1309    } else {
1310        ALOGE("%s: Invalid jpeg thumbnail quality=%d", __func__, quality);
1311        rc = BAD_VALUE;
1312    }
1313    return rc;
1314}
1315
1316/*===========================================================================
1317 * FUNCTION   : setOrientaion
1318 *
1319 * DESCRIPTION: set orientaion from user setting
1320 *
1321 * PARAMETERS :
1322 *   @params  : user setting parameters
1323 *
1324 * RETURN     : int32_t type of status
1325 *              NO_ERROR  -- success
1326 *              none-zero failure code
1327 *==========================================================================*/
1328int32_t QCameraParameters::setOrientation(const QCameraParameters& params)
1329{
1330    const char *str = params.get(KEY_QC_ORIENTATION);
1331
1332    if (str != NULL) {
1333        if (strcmp(str, portrait) == 0 || strcmp(str, landscape) == 0) {
1334            // Camera service needs this to decide if the preview frames and raw
1335            // pictures should be rotated.
1336            updateParamEntry(KEY_QC_ORIENTATION, str);
1337        } else {
1338            ALOGE("%s: Invalid orientation value: %s", __func__, str);
1339            return BAD_VALUE;
1340        }
1341    }
1342    return NO_ERROR;
1343}
1344
1345/*===========================================================================
1346 * FUNCTION   : setAutoExposure
1347 *
1348 * DESCRIPTION: set auto exposure value from user setting
1349 *
1350 * PARAMETERS :
1351 *   @params  : user setting parameters
1352 *
1353 * RETURN     : int32_t type of status
1354 *              NO_ERROR  -- success
1355 *              none-zero failure code
1356 *==========================================================================*/
1357int32_t QCameraParameters::setAutoExposure(const QCameraParameters& params)
1358{
1359    const char *str = params.get(KEY_QC_AUTO_EXPOSURE);
1360    const char *prev_str = get(KEY_QC_AUTO_EXPOSURE);
1361    if (str != NULL) {
1362        if (prev_str == NULL ||
1363            strcmp(str, prev_str) != 0) {
1364            return setAutoExposure(str);
1365        }
1366    }
1367    return NO_ERROR;
1368}
1369
1370/*===========================================================================
1371 * FUNCTION   : setPreviewFpsRange
1372 *
1373 * DESCRIPTION: set preview FPS range from user setting
1374 *
1375 * PARAMETERS :
1376 *   @params  : user setting parameters
1377 *
1378 * RETURN     : int32_t type of status
1379 *              NO_ERROR  -- success
1380 *              none-zero failure code
1381 *==========================================================================*/
1382int32_t QCameraParameters::setPreviewFpsRange(const QCameraParameters& params)
1383{
1384    int minFps,maxFps;
1385    int prevMinFps, prevMaxFps;
1386    int rc = NO_ERROR;
1387    bool found = false;
1388
1389    CameraParameters::getPreviewFpsRange(&prevMinFps, &prevMaxFps);
1390    ALOGV("%s: Existing FpsRange Values:(%d, %d)", __func__, prevMinFps, prevMaxFps);
1391    params.getPreviewFpsRange(&minFps, &maxFps);
1392    ALOGV("%s: Requested FpsRange Values:(%d, %d)", __func__, minFps, maxFps);
1393
1394    if(minFps == prevMinFps && maxFps == prevMaxFps) {
1395        ALOGV("%s: No change in FpsRange", __func__);
1396        rc = NO_ERROR;
1397        goto end;
1398    }
1399    for(int i = 0; i < m_pCapability->fps_ranges_tbl_cnt; i++) {
1400        // if the value is in the supported list
1401        if(minFps >= m_pCapability->fps_ranges_tbl[i].min_fps * 1000 &&
1402           maxFps <= m_pCapability->fps_ranges_tbl[i].max_fps * 1000) {
1403            found = true;
1404            ALOGV("%s: FPS i=%d : minFps = %d, maxFps = %d ", __func__, i, minFps, maxFps);
1405            setPreviewFpsRange(minFps, maxFps);
1406            break;
1407        }
1408    }
1409    if(found == false){
1410        ALOGE("%s: error: FPS range value not supported", __func__);
1411        rc = BAD_VALUE;
1412    }
1413end:
1414    return rc;
1415}
1416
1417/*===========================================================================
1418 * FUNCTION   : setPreviewFrameRate
1419 *
1420 * DESCRIPTION: set preview frame rate from user setting
1421 *
1422 * PARAMETERS :
1423 *   @params  : user setting parameters
1424 *
1425 * RETURN     : int32_t type of status
1426 *              NO_ERROR  -- success
1427 *              none-zero failure code
1428 *==========================================================================*/
1429int32_t QCameraParameters::setPreviewFrameRate(const QCameraParameters& params)
1430{
1431    uint16_t fps = (uint16_t)params.getPreviewFrameRate();
1432    ALOGV("%s: requested preview frame rate is %d", __func__, fps);
1433    CameraParameters::setPreviewFrameRate(fps);
1434    return NO_ERROR;
1435}
1436
1437/*===========================================================================
1438 * FUNCTION   : setEffect
1439 *
1440 * DESCRIPTION: set effect value from user setting
1441 *
1442 * PARAMETERS :
1443 *   @params  : user setting parameters
1444 *
1445 * RETURN     : int32_t type of status
1446 *              NO_ERROR  -- success
1447 *              none-zero failure code
1448 *==========================================================================*/
1449int32_t QCameraParameters::setEffect(const QCameraParameters& params)
1450{
1451    const char *str = params.get(KEY_EFFECT);
1452    const char *prev_str = get(KEY_EFFECT);
1453    if (str != NULL) {
1454        if (prev_str == NULL ||
1455            strcmp(str, prev_str) != 0) {
1456            return setEffect(str);
1457        }
1458    }
1459    return NO_ERROR;
1460}
1461
1462/*===========================================================================
1463 * FUNCTION   : setFocusMode
1464 *
1465 * DESCRIPTION: set focus mode from user setting
1466 *
1467 * PARAMETERS :
1468 *   @params  : user setting parameters
1469 *
1470 * RETURN     : int32_t type of status
1471 *              NO_ERROR  -- success
1472 *              none-zero failure code
1473 *==========================================================================*/
1474int32_t QCameraParameters::setFocusMode(const QCameraParameters& params)
1475{
1476    const char *str = params.get(KEY_FOCUS_MODE);
1477    const char *prev_str = get(KEY_FOCUS_MODE);
1478    if (str != NULL) {
1479        if (prev_str == NULL ||
1480            strcmp(str, prev_str) != 0) {
1481            return setFocusMode(str);
1482        }
1483    }
1484    return NO_ERROR;
1485}
1486
1487/*===========================================================================
1488 * FUNCTION   : setBrightness
1489 *
1490 * DESCRIPTION: set brightness control value from user setting
1491 *
1492 * PARAMETERS :
1493 *   @params  : user setting parameters
1494 *
1495 * RETURN     : int32_t type of status
1496 *              NO_ERROR  -- success
1497 *              none-zero failure code
1498 *==========================================================================*/
1499int32_t QCameraParameters::setBrightness(const QCameraParameters& params)
1500{
1501    int currentBrightness = getInt(KEY_QC_BRIGHTNESS);
1502    int brightness = params.getInt(KEY_QC_BRIGHTNESS);
1503    if (currentBrightness !=  brightness) {
1504        if (brightness >= m_pCapability->brightness_ctrl.min_value &&
1505            brightness <= m_pCapability->brightness_ctrl.max_value) {
1506            ALOGV(" new brightness value : %d ", brightness);
1507            return setBrightness(brightness);
1508        } else {
1509            ALOGE("%s: invalid value %d out of (%d, %d)",
1510                  __func__, brightness,
1511                  m_pCapability->brightness_ctrl.min_value,
1512                  m_pCapability->brightness_ctrl.max_value);
1513            return BAD_VALUE;
1514        }
1515    } else {
1516        ALOGV("%s: No brightness value changed.", __func__);
1517        return NO_ERROR;
1518    }
1519}
1520
1521/*===========================================================================
1522 * FUNCTION   : setSharpness
1523 *
1524 * DESCRIPTION: set sharpness control value from user setting
1525 *
1526 * PARAMETERS :
1527 *   @params  : user setting parameters
1528 *
1529 * RETURN     : int32_t type of status
1530 *              NO_ERROR  -- success
1531 *              none-zero failure code
1532 *==========================================================================*/
1533int32_t QCameraParameters::setSharpness(const QCameraParameters& params)
1534{
1535    int shaprness = params.getInt(KEY_QC_SHARPNESS);
1536    int prev_sharp = getInt(KEY_QC_SHARPNESS);
1537    if (prev_sharp !=  shaprness) {
1538        if((shaprness >= m_pCapability->sharpness_ctrl.min_value) &&
1539           (shaprness <= m_pCapability->sharpness_ctrl.max_value)) {
1540            ALOGV(" new sharpness value : %d ", shaprness);
1541            return setSharpness(shaprness);
1542        } else {
1543            ALOGE("%s: invalid value %d out of (%d, %d)",
1544                  __func__, shaprness,
1545                  m_pCapability->sharpness_ctrl.min_value,
1546                  m_pCapability->sharpness_ctrl.max_value);
1547            return BAD_VALUE;
1548        }
1549    } else {
1550        ALOGV("%s: No value change in shaprness", __func__);
1551        return NO_ERROR;
1552    }
1553}
1554
1555/*===========================================================================
1556 * FUNCTION   : setSkintoneEnahancement
1557 *
1558 * DESCRIPTION: set skin tone enhancement factor from user setting
1559 *
1560 * PARAMETERS :
1561 *   @params  : user setting parameters
1562 *
1563 * RETURN     : int32_t type of status
1564 *              NO_ERROR  -- success
1565 *              none-zero failure code
1566 *==========================================================================*/
1567int32_t QCameraParameters::setSkinToneEnhancement(const QCameraParameters& params)
1568{
1569    int sceFactor = params.getInt(KEY_QC_SCE_FACTOR);
1570    int prev_sceFactor = getInt(KEY_QC_SCE_FACTOR);
1571    if (prev_sceFactor !=  sceFactor) {
1572        if((sceFactor >= m_pCapability->sce_ctrl.min_value) &&
1573           (sceFactor <= m_pCapability->sce_ctrl.max_value)) {
1574            ALOGV(" new Skintone Enhancement value : %d ", sceFactor);
1575            return setSkinToneEnhancement(sceFactor);
1576        } else {
1577            ALOGE("%s: invalid value %d out of (%d, %d)",
1578                  __func__, sceFactor,
1579                  m_pCapability->sce_ctrl.min_value,
1580                  m_pCapability->sce_ctrl.max_value);
1581            return BAD_VALUE;
1582        }
1583    } else {
1584        ALOGV("%s: No value change in skintone enhancement factor", __func__);
1585        return NO_ERROR;
1586    }
1587}
1588
1589/*===========================================================================
1590 * FUNCTION   : setSaturation
1591 *
1592 * DESCRIPTION: set saturation control value from user setting
1593 *
1594 * PARAMETERS :
1595 *   @params  : user setting parameters
1596 *
1597 * RETURN     : int32_t type of status
1598 *              NO_ERROR  -- success
1599 *              none-zero failure code
1600 *==========================================================================*/
1601int32_t QCameraParameters::setSaturation(const QCameraParameters& params)
1602{
1603    int saturation = params.getInt(KEY_QC_SATURATION);
1604    int prev_sat = getInt(KEY_QC_SATURATION);
1605    if (prev_sat !=  saturation) {
1606        if((saturation >= m_pCapability->saturation_ctrl.min_value) &&
1607           (saturation <= m_pCapability->saturation_ctrl.max_value)) {
1608            ALOGV(" new saturation value : %d ", saturation);
1609            return setSaturation(saturation);
1610        } else {
1611            ALOGE("%s: invalid value %d out of (%d, %d)",
1612                  __func__, saturation,
1613                  m_pCapability->saturation_ctrl.min_value,
1614                  m_pCapability->saturation_ctrl.max_value);
1615            return BAD_VALUE;
1616        }
1617    } else {
1618        ALOGV("%s: No value change in saturation factor", __func__);
1619        return NO_ERROR;
1620    }
1621}
1622
1623/*===========================================================================
1624 * FUNCTION   : setContrast
1625 *
1626 * DESCRIPTION: set contrast control value from user setting
1627 *
1628 * PARAMETERS :
1629 *   @params  : user setting parameters
1630 *
1631 * RETURN     : int32_t type of status
1632 *              NO_ERROR  -- success
1633 *              none-zero failure code
1634 *==========================================================================*/
1635int32_t QCameraParameters::setContrast(const QCameraParameters& params)
1636{
1637    int contrast = params.getInt(KEY_QC_CONTRAST);
1638    int prev_contrast = getInt(KEY_QC_CONTRAST);
1639    if (prev_contrast !=  contrast) {
1640        if((contrast >= m_pCapability->contrast_ctrl.min_value) &&
1641           (contrast <= m_pCapability->contrast_ctrl.max_value)) {
1642            ALOGV(" new contrast value : %d ", contrast);
1643            int32_t rc = setContrast(contrast);
1644            return rc;
1645        } else {
1646            ALOGE("%s: invalid value %d out of (%d, %d)",
1647                  __func__, contrast,
1648                  m_pCapability->contrast_ctrl.min_value,
1649                  m_pCapability->contrast_ctrl.max_value);
1650            return BAD_VALUE;
1651        }
1652    } else {
1653        ALOGV("%s: No value change in contrast", __func__);
1654        return NO_ERROR;
1655    }
1656}
1657
1658/*===========================================================================
1659 * FUNCTION   : setExposureCompensation
1660 *
1661 * DESCRIPTION: set exposure compensation value from user setting
1662 *
1663 * PARAMETERS :
1664 *   @params  : user setting parameters
1665 *
1666 * RETURN     : int32_t type of status
1667 *              NO_ERROR  -- success
1668 *              none-zero failure code
1669 *==========================================================================*/
1670int32_t QCameraParameters::setExposureCompensation(const QCameraParameters & params)
1671{
1672    int expComp = params.getInt(KEY_EXPOSURE_COMPENSATION);
1673    int prev_expComp = getInt(KEY_EXPOSURE_COMPENSATION);
1674    if (prev_expComp !=  expComp) {
1675        if((expComp >= m_pCapability->exposure_compensation_min) &&
1676           (expComp <= m_pCapability->exposure_compensation_max)) {
1677            ALOGV(" new Exposure Compensation value : %d ", expComp);
1678            return setExposureCompensation(expComp);
1679        } else {
1680            ALOGE("%s: invalid value %d out of (%d, %d)",
1681                  __func__, expComp,
1682                  m_pCapability->exposure_compensation_min,
1683                  m_pCapability->exposure_compensation_max);
1684            return BAD_VALUE;
1685        }
1686    } else {
1687        ALOGV("%s: No value change in Exposure Compensation", __func__);
1688        return NO_ERROR;
1689    }
1690}
1691
1692/*===========================================================================
1693 * FUNCTION   : setWhiteBalance
1694 *
1695 * DESCRIPTION: set white balance value from user setting
1696 *
1697 * PARAMETERS :
1698 *   @params  : user setting parameters
1699 *
1700 * RETURN     : int32_t type of status
1701 *              NO_ERROR  -- success
1702 *              none-zero failure code
1703 *==========================================================================*/
1704int32_t QCameraParameters::setWhiteBalance(const QCameraParameters& params)
1705{
1706    const char *str = params.get(KEY_WHITE_BALANCE);
1707    const char *prev_str = get(KEY_WHITE_BALANCE);
1708    if (str != NULL) {
1709        if (prev_str == NULL ||
1710            strcmp(str, prev_str) != 0) {
1711            return setWhiteBalance(str);
1712        }
1713    }
1714    return NO_ERROR;
1715}
1716
1717/*===========================================================================
1718 * FUNCTION   : setAntibanding
1719 *
1720 * DESCRIPTION: set antibanding value from user setting
1721 *
1722 * PARAMETERS :
1723 *   @params  : user setting parameters
1724 *
1725 * RETURN     : int32_t type of status
1726 *              NO_ERROR  -- success
1727 *              none-zero failure code
1728 *==========================================================================*/
1729int32_t QCameraParameters::setAntibanding(const QCameraParameters& params)
1730{
1731    const char *str = params.get(KEY_ANTIBANDING);
1732    const char *prev_str = get(KEY_ANTIBANDING);
1733    if (str != NULL) {
1734        if (prev_str == NULL ||
1735            strcmp(str, prev_str) != 0) {
1736            return setAntibanding(str);
1737        }
1738    }
1739    return NO_ERROR;
1740}
1741
1742/*===========================================================================
1743 * FUNCTION   : setSceneDetect
1744 *
1745 * DESCRIPTION: set scenen detect value from user setting
1746 *
1747 * PARAMETERS :
1748 *   @params  : user setting parameters
1749 *
1750 * RETURN     : int32_t type of status
1751 *              NO_ERROR  -- success
1752 *              none-zero failure code
1753 *==========================================================================*/
1754int32_t QCameraParameters::setSceneDetect(const QCameraParameters& params)
1755{
1756    const char *str = params.get(KEY_QC_SCENE_DETECT);
1757    const char *prev_str = get(KEY_QC_SCENE_DETECT);
1758    if (str != NULL) {
1759        if (prev_str == NULL ||
1760            strcmp(str, prev_str) != 0) {
1761            return setSceneDetect(str);
1762        }
1763    }
1764    return NO_ERROR;
1765}
1766
1767/*===========================================================================
1768 * FUNCTION   : setVideoHDR
1769 *
1770 * DESCRIPTION: set video HDR value from user setting
1771 *
1772 * PARAMETERS :
1773 *   @params  : user setting parameters
1774 *
1775 * RETURN     : int32_t type of status
1776 *              NO_ERROR  -- success
1777 *              none-zero failure code
1778 *==========================================================================*/
1779int32_t QCameraParameters::setVideoHDR(const QCameraParameters& params)
1780{
1781    const char *str = params.get(KEY_QC_VIDEO_HDR);
1782    const char *prev_str = get(KEY_QC_VIDEO_HDR);
1783    if (str != NULL) {
1784        if (prev_str == NULL ||
1785            strcmp(str, prev_str) != 0) {
1786            return setVideoHDR(str);
1787        }
1788    }
1789    return NO_ERROR;
1790}
1791
1792/*===========================================================================
1793 * FUNCTION   : setFaceRecognition
1794 *
1795 * DESCRIPTION: set face recognition mode from user setting
1796 *
1797 * PARAMETERS :
1798 *   @params  : user setting parameters
1799 *
1800 * RETURN     : int32_t type of status
1801 *              NO_ERROR  -- success
1802 *              none-zero failure code
1803 *==========================================================================*/
1804int32_t QCameraParameters::setFaceRecognition(const QCameraParameters& params)
1805{
1806    const char *str = params.get(KEY_QC_FACE_RECOGNITION);
1807    const char *prev_str = get(KEY_QC_FACE_RECOGNITION);
1808    if (str != NULL) {
1809        if (prev_str == NULL ||
1810            strcmp(str, prev_str) != 0) {
1811            int maxFaces = params.getInt(KEY_QC_MAX_NUM_REQUESTED_FACES);
1812            return setFaceRecognition(str, maxFaces);
1813        }
1814    }
1815    return NO_ERROR;
1816}
1817
1818/*===========================================================================
1819 * FUNCTION   : setZoom
1820 *
1821 * DESCRIPTION: set zoom value from user setting
1822 *
1823 * PARAMETERS :
1824 *   @params  : user setting parameters
1825 *
1826 * RETURN     : int32_t type of status
1827 *              NO_ERROR  -- success
1828 *              none-zero failure code
1829 *==========================================================================*/
1830int32_t QCameraParameters::setZoom(const QCameraParameters& params)
1831{
1832    if ((m_pCapability->zoom_supported == 0 ||
1833         m_pCapability->zoom_ratio_tbl_cnt == 0)) {
1834        ALOGD("%s: no zoom support", __func__);
1835        return NO_ERROR;
1836    }
1837
1838    int zoomLevel = params.getInt(KEY_ZOOM);
1839    if((zoomLevel < 0) ||
1840       (zoomLevel >= m_pCapability->zoom_ratio_tbl_cnt)) {
1841        ALOGE("%s: invalid value %d out of (%d, %d)",
1842              __func__, zoomLevel,
1843              0, m_pCapability->zoom_ratio_tbl_cnt-1);
1844        return BAD_VALUE;
1845    }
1846
1847    int prevZoomLevel = getInt(KEY_ZOOM);
1848    if (prevZoomLevel == zoomLevel) {
1849        ALOGV("%s: No value change in contrast", __func__);
1850        return NO_ERROR;
1851    }
1852
1853    return setZoom(zoomLevel);
1854}
1855
1856/*===========================================================================
1857 * FUNCTION   : setISOValue
1858 *
1859 * DESCRIPTION: set ISO value from user setting
1860 *
1861 * PARAMETERS :
1862 *   @params  : user setting parameters
1863 *
1864 * RETURN     : int32_t type of status
1865 *              NO_ERROR  -- success
1866 *              none-zero failure code
1867 *==========================================================================*/
1868int32_t  QCameraParameters::setISOValue(const QCameraParameters& params)
1869{
1870    const char *str = params.get(KEY_QC_ISO_MODE);
1871    const char *prev_str = get(KEY_QC_ISO_MODE);
1872    if (str != NULL) {
1873        if (prev_str == NULL ||
1874            strcmp(str, prev_str) != 0) {
1875            return setISOValue(str);
1876        }
1877    }
1878    return NO_ERROR;
1879}
1880
1881/*===========================================================================
1882 * FUNCTION   : setRotation
1883 *
1884 * DESCRIPTION: set rotation value from user setting
1885 *
1886 * PARAMETERS :
1887 *   @params  : user setting parameters
1888 *
1889 * RETURN     : int32_t type of status
1890 *              NO_ERROR  -- success
1891 *              none-zero failure code
1892 *==========================================================================*/
1893int32_t QCameraParameters::setRotation(const QCameraParameters& params)
1894{
1895    int rotation = params.getInt(KEY_ROTATION);
1896    if (rotation != -1) {
1897        if (rotation == 0 || rotation == 90 ||
1898            rotation == 180 || rotation == 270) {
1899            set(KEY_ROTATION, rotation);
1900        } else {
1901            ALOGE("Invalid rotation value: %d", rotation);
1902            return BAD_VALUE;
1903        }
1904    }
1905    return NO_ERROR;
1906}
1907
1908/*===========================================================================
1909 * FUNCTION   : setFlash
1910 *
1911 * DESCRIPTION: set flash mode from user setting
1912 *
1913 * PARAMETERS :
1914 *   @params  : user setting parameters
1915 *
1916 * RETURN     : int32_t type of status
1917 *              NO_ERROR  -- success
1918 *              none-zero failure code
1919 *==========================================================================*/
1920int32_t QCameraParameters::setFlash(const QCameraParameters& params)
1921{
1922    const char *str = params.get(KEY_FLASH_MODE);
1923    const char *prev_str = get(KEY_FLASH_MODE);
1924    if (str != NULL) {
1925        if (prev_str == NULL ||
1926            strcmp(str, prev_str) != 0) {
1927            return setFlash(str);
1928        }
1929    }
1930    return NO_ERROR;
1931}
1932
1933/*===========================================================================
1934 * FUNCTION   : setAecLock
1935 *
1936 * DESCRIPTION: set AEC lock value 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 *==========================================================================*/
1945int32_t QCameraParameters::setAecLock(const QCameraParameters& params)
1946{
1947    const char *str = params.get(KEY_AUTO_EXPOSURE_LOCK);
1948    const char *prev_str = get(KEY_AUTO_EXPOSURE_LOCK);
1949    if (str != NULL) {
1950        if (prev_str == NULL ||
1951            strcmp(str, prev_str) != 0) {
1952            return setAecLock(str);
1953        }
1954    }
1955    return NO_ERROR;
1956}
1957
1958/*===========================================================================
1959 * FUNCTION   : setAwbLock
1960 *
1961 * DESCRIPTION: set AWB lock from user setting
1962 *
1963 * PARAMETERS :
1964 *   @params  : user setting parameters
1965 *
1966 * RETURN     : int32_t type of status
1967 *              NO_ERROR  -- success
1968 *              none-zero failure code
1969 *==========================================================================*/
1970int32_t QCameraParameters::setAwbLock(const QCameraParameters& params)
1971{
1972    const char *str = params.get(KEY_AUTO_WHITEBALANCE_LOCK);
1973    const char *prev_str = get(KEY_AUTO_WHITEBALANCE_LOCK);
1974    if (str != NULL) {
1975        if (prev_str == NULL ||
1976            strcmp(str, prev_str) != 0) {
1977            return setAwbLock(str);
1978        }
1979    }
1980    return NO_ERROR;
1981}
1982
1983/*===========================================================================
1984 * FUNCTION   : setMCEValue
1985 *
1986 * DESCRIPTION: set memory color enhancement value from user setting
1987 *
1988 * PARAMETERS :
1989 *   @params  : user setting parameters
1990 *
1991 * RETURN     : int32_t type of status
1992 *              NO_ERROR  -- success
1993 *              none-zero failure code
1994 *==========================================================================*/
1995int32_t QCameraParameters::setMCEValue(const QCameraParameters& params)
1996{
1997    const char *str = params.get(KEY_QC_MEMORY_COLOR_ENHANCEMENT);
1998    const char *prev_str = get(KEY_QC_MEMORY_COLOR_ENHANCEMENT);
1999    if (str != NULL) {
2000        if (prev_str == NULL ||
2001            strcmp(str, prev_str) != 0) {
2002            return setMCEValue(str);
2003        }
2004    }
2005    return NO_ERROR;
2006}
2007
2008/*===========================================================================
2009 * FUNCTION   : setDISValue
2010 *
2011 * DESCRIPTION: enable/disable DIS from user setting
2012 *
2013 * PARAMETERS :
2014 *   @params  : user setting parameters
2015 *
2016 * RETURN     : int32_t type of status
2017 *              NO_ERROR  -- success
2018 *              none-zero failure code
2019 *==========================================================================*/
2020int32_t QCameraParameters::setDISValue(const QCameraParameters& params)
2021{
2022    const char *str = params.get(KEY_QC_DIS);
2023    const char *prev_str = get(KEY_QC_DIS);
2024    if (str != NULL) {
2025        if (prev_str == NULL ||
2026            strcmp(str, prev_str) != 0) {
2027            return setDISValue(str);
2028        }
2029    }
2030    return NO_ERROR;
2031}
2032
2033/*===========================================================================
2034 * FUNCTION   : setHighFrameRate
2035 *
2036 * DESCRIPTION: set hight frame rate value from user setting
2037 *
2038 * PARAMETERS :
2039 *   @params  : user setting parameters
2040 *
2041 * RETURN     : int32_t type of status
2042 *              NO_ERROR  -- success
2043 *              none-zero failure code
2044 *==========================================================================*/
2045int32_t QCameraParameters::setHighFrameRate(const QCameraParameters& params)
2046{
2047    const char *str = params.get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
2048    const char *prev_str = get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
2049    if (str != NULL) {
2050        if (prev_str == NULL ||
2051            strcmp(str, prev_str) != 0) {
2052            return setHighFrameRate(str);
2053        }
2054    }
2055    return NO_ERROR;
2056}
2057
2058/*===========================================================================
2059 * FUNCTION   : setLensShadeValue
2060 *
2061 * DESCRIPTION: set lens shade value from user setting
2062 *
2063 * PARAMETERS :
2064 *   @params  : user setting parameters
2065 *
2066 * RETURN     : int32_t type of status
2067 *              NO_ERROR  -- success
2068 *              none-zero failure code
2069 *==========================================================================*/
2070int32_t QCameraParameters::setLensShadeValue(const QCameraParameters& params)
2071{
2072    const char *str = params.get(KEY_QC_LENSSHADE);
2073    const char *prev_str = get(KEY_QC_LENSSHADE);
2074    if (str != NULL) {
2075        if (prev_str == NULL ||
2076            strcmp(str, prev_str) != 0) {
2077            return setLensShadeValue(str);
2078        }
2079    }
2080    return NO_ERROR;
2081}
2082
2083/*===========================================================================
2084 * FUNCTION   : setFocusAreas
2085 *
2086 * DESCRIPTION: set focus areas from user setting
2087 *
2088 * PARAMETERS :
2089 *   @params  : user setting parameters
2090 *
2091 * RETURN     : int32_t type of status
2092 *              NO_ERROR  -- success
2093 *              none-zero failure code
2094 *==========================================================================*/
2095int32_t QCameraParameters::setFocusAreas(const QCameraParameters& params)
2096{
2097    const char *str = params.get(KEY_FOCUS_AREAS);
2098    if (str != NULL) {
2099        int max_num_af_areas = getInt(KEY_MAX_NUM_FOCUS_AREAS);
2100        if(max_num_af_areas == 0) {
2101            ALOGE("%s: max num of AF area is 0, cannot set focus areas", __func__);
2102            return BAD_VALUE;
2103        }
2104
2105        const char *prev_str = get(KEY_FOCUS_AREAS);
2106        if (prev_str == NULL ||
2107            strcmp(str, prev_str) != 0) {
2108            return setFocusAreas(str);
2109        }
2110    }
2111    return NO_ERROR;
2112}
2113
2114/*===========================================================================
2115 * FUNCTION   : setMeteringAreas
2116 *
2117 * DESCRIPTION: set metering areas 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 *==========================================================================*/
2126int32_t QCameraParameters::setMeteringAreas(const QCameraParameters& params)
2127{
2128    const char *str = params.get(KEY_METERING_AREAS);
2129    if (str != NULL) {
2130        int max_num_mtr_areas = getInt(KEY_MAX_NUM_METERING_AREAS);
2131        if(max_num_mtr_areas == 0) {
2132            ALOGE("%s: max num of metering areas is 0, cannot set focus areas", __func__);
2133            return BAD_VALUE;
2134        }
2135
2136        const char *prev_str = get(KEY_METERING_AREAS);
2137        if (prev_str == NULL ||
2138            strcmp(str, prev_str) != 0) {
2139            return setMeteringAreas(str);
2140        }
2141    }
2142    return NO_ERROR;
2143}
2144
2145/*===========================================================================
2146 * FUNCTION   : setSceneMode
2147 *
2148 * DESCRIPTION: set scenen mode from user setting
2149 *
2150 * PARAMETERS :
2151 *   @params  : user setting parameters
2152 *
2153 * RETURN     : int32_t type of status
2154 *              NO_ERROR  -- success
2155 *              none-zero failure code
2156 *==========================================================================*/
2157int32_t QCameraParameters::setSceneMode(const QCameraParameters& params)
2158{
2159    const char *str = params.get(KEY_SCENE_MODE);
2160    const char *prev_str = get(KEY_SCENE_MODE);
2161    if (str != NULL) {
2162        if (prev_str == NULL ||
2163            strcmp(str, prev_str) != 0) {
2164            if ((strcmp(str, SCENE_MODE_HDR) == 0) ||
2165                ((prev_str != NULL) && (strcmp(prev_str, SCENE_MODE_HDR) == 0))) {
2166                ALOGD("%s: scene mode changed between HDR and non-HDR, need restart", __func__);
2167                m_bNeedRestart = true;
2168
2169                // set if hdr 1x image is needed
2170                const char *need_hdr_1x = params.get(KEY_QC_HDR_NEED_1X);
2171                int32_t value = 0;
2172                if (need_hdr_1x != NULL && strcmp(need_hdr_1x, VALUE_TRUE) == 0) {
2173                    value = 1;
2174                    updateParamEntry(KEY_QC_HDR_NEED_1X, need_hdr_1x);
2175                    AddSetParmEntryToBatch(m_pParamBuf,
2176                                           CAM_INTF_PARM_HDR_NEED_1X,
2177                                           sizeof(value),
2178                                           &value);
2179                }
2180            }
2181            return setSceneMode(str);
2182        }
2183    }
2184    return NO_ERROR;
2185}
2186
2187/*===========================================================================
2188 * FUNCTION   : setSelectableZoneAf
2189 *
2190 * DESCRIPTION: set selectable zone auto focus value from user setting
2191 *
2192 * PARAMETERS :
2193 *   @params  : user setting parameters
2194 *
2195 * RETURN     : int32_t type of status
2196 *              NO_ERROR  -- success
2197 *              none-zero failure code
2198 *==========================================================================*/
2199int32_t QCameraParameters::setSelectableZoneAf(const QCameraParameters& params)
2200{
2201    const char *str = params.get(KEY_QC_SELECTABLE_ZONE_AF);
2202    const char *prev_str = get(KEY_QC_SELECTABLE_ZONE_AF);
2203    if (str != NULL) {
2204        if (prev_str == NULL ||
2205            strcmp(str, prev_str) != 0) {
2206            return setSelectableZoneAf(str);
2207        }
2208    }
2209    return NO_ERROR;
2210}
2211
2212/*===========================================================================
2213 * FUNCTION   : setAEBracket
2214 *
2215 * DESCRIPTION: set AE bracket from user setting
2216 *
2217 * PARAMETERS :
2218 *   @params  : user setting parameters
2219 *
2220 * RETURN     : int32_t type of status
2221 *              NO_ERROR  -- success
2222 *              none-zero failure code
2223 *==========================================================================*/
2224int32_t QCameraParameters::setAEBracket(const QCameraParameters& params)
2225{
2226    const char *scene_mode = params.get(KEY_SCENE_MODE);
2227    if (scene_mode != NULL && strcmp(scene_mode, SCENE_MODE_HDR) == 0) {
2228        ALOGE("%s: scene mode is HDR, overwrite AE bracket setting to off", __func__);
2229        return setAEBracket(AE_BRACKET_OFF);
2230    }
2231
2232    const char *expStr = params.get(KEY_QC_CAPTURE_BURST_EXPOSURE);
2233    if (NULL != expStr && strlen(expStr) > 0) {
2234        set(KEY_QC_CAPTURE_BURST_EXPOSURE, expStr);
2235    } else {
2236        char prop[PROPERTY_VALUE_MAX];
2237        memset(prop, 0, sizeof(prop));
2238        property_get("persist.capture.burst.exposures", prop, "");
2239        if (strlen(prop) > 0) {
2240            set(KEY_QC_CAPTURE_BURST_EXPOSURE, prop);
2241        } else {
2242            remove(KEY_QC_CAPTURE_BURST_EXPOSURE);
2243        }
2244    }
2245
2246    const char *str = params.get(KEY_QC_AE_BRACKET_HDR);
2247    const char *prev_str = get(KEY_QC_AE_BRACKET_HDR);
2248    if (str != NULL) {
2249        if (prev_str == NULL ||
2250            strcmp(str, prev_str) != 0) {
2251            return setAEBracket(str);
2252        }
2253    }
2254    return NO_ERROR;
2255}
2256
2257/*===========================================================================
2258 * FUNCTION   : setRedeyeReduction
2259 *
2260 * DESCRIPTION: set red eye reduction setting from user setting
2261 *
2262 * PARAMETERS :
2263 *   @params  : user setting parameters
2264 *
2265 * RETURN     : int32_t type of status
2266 *              NO_ERROR  -- success
2267 *              none-zero failure code
2268 *==========================================================================*/
2269int32_t QCameraParameters::setRedeyeReduction(const QCameraParameters& params)
2270{
2271    const char *str = params.get(KEY_QC_REDEYE_REDUCTION);
2272    const char *prev_str = get(KEY_QC_REDEYE_REDUCTION);
2273    if (str != NULL) {
2274        if (prev_str == NULL ||
2275            strcmp(str, prev_str) != 0) {
2276            return setRedeyeReduction(str);
2277        }
2278    }
2279    return NO_ERROR;
2280}
2281
2282/*===========================================================================
2283 * FUNCTION   : setGpsLocation
2284 *
2285 * DESCRIPTION: set GPS location information from user setting
2286 *
2287 * PARAMETERS :
2288 *   @params  : user setting parameters
2289 *
2290 * RETURN     : int32_t type of status
2291 *              NO_ERROR  -- success
2292 *              none-zero failure code
2293 *==========================================================================*/
2294int32_t QCameraParameters::setGpsLocation(const QCameraParameters& params)
2295{
2296    const char *method = params.get(KEY_GPS_PROCESSING_METHOD);
2297    if (method) {
2298        set(KEY_GPS_PROCESSING_METHOD, method);
2299    }else {
2300        remove(KEY_GPS_PROCESSING_METHOD);
2301    }
2302
2303    const char *latitude = params.get(KEY_GPS_LATITUDE);
2304    if (latitude) {
2305        set(KEY_GPS_LATITUDE, latitude);
2306    }else {
2307        remove(KEY_GPS_LATITUDE);
2308    }
2309
2310    const char *latitudeRef = params.get(KEY_QC_GPS_LATITUDE_REF);
2311    if (latitudeRef) {
2312        set(KEY_QC_GPS_LATITUDE_REF, latitudeRef);
2313    }else {
2314        remove(KEY_QC_GPS_LATITUDE_REF);
2315    }
2316
2317    const char *longitude = params.get(KEY_GPS_LONGITUDE);
2318    if (longitude) {
2319        set(KEY_GPS_LONGITUDE, longitude);
2320    }else {
2321        remove(KEY_GPS_LONGITUDE);
2322    }
2323
2324    const char *longitudeRef = params.get(KEY_QC_GPS_LONGITUDE_REF);
2325    if (longitudeRef) {
2326        set(KEY_QC_GPS_LONGITUDE_REF, longitudeRef);
2327    }else {
2328        remove(KEY_QC_GPS_LONGITUDE_REF);
2329    }
2330
2331    const char *altitudeRef = params.get(KEY_QC_GPS_ALTITUDE_REF);
2332    if (altitudeRef) {
2333        set(KEY_QC_GPS_ALTITUDE_REF, altitudeRef);
2334    }else {
2335        remove(KEY_QC_GPS_ALTITUDE_REF);
2336    }
2337
2338    const char *altitude = params.get(KEY_GPS_ALTITUDE);
2339    if (altitude) {
2340        set(KEY_GPS_ALTITUDE, altitude);
2341    }else {
2342        remove(KEY_GPS_ALTITUDE);
2343    }
2344
2345    const char *status = params.get(KEY_QC_GPS_STATUS);
2346    if (status) {
2347        set(KEY_QC_GPS_STATUS, status);
2348    } else {
2349        remove(KEY_QC_GPS_STATUS);
2350    }
2351
2352    const char *timestamp = params.get(KEY_GPS_TIMESTAMP);
2353    if (timestamp) {
2354        set(KEY_GPS_TIMESTAMP, timestamp);
2355    }else {
2356        remove(KEY_GPS_TIMESTAMP);
2357    }
2358    return NO_ERROR;
2359}
2360
2361/*===========================================================================
2362 * FUNCTION   : setNumOfSnapshot
2363 *
2364 * DESCRIPTION: set number of snapshot per shutter from user setting
2365 *
2366 * PARAMETERS : none
2367 *
2368 * RETURN     : int32_t type of status
2369 *              NO_ERROR  -- success
2370 *              none-zero failure code
2371 *==========================================================================*/
2372int32_t QCameraParameters::setNumOfSnapshot()
2373{
2374    int nBurstNum = getBurstNum();
2375    uint8_t nExpnum = 0;
2376
2377    const char *scene_mode = get(KEY_SCENE_MODE);
2378    if (scene_mode != NULL && strcmp(scene_mode, SCENE_MODE_HDR) == 0) {
2379        /* According to Android SDK, only one snapshot,
2380         * but OEM might have different requirement */
2381        const char *need_hdr_1x = get(KEY_QC_HDR_NEED_1X);
2382        if (need_hdr_1x != NULL && strcmp(need_hdr_1x, VALUE_TRUE) == 0) {
2383            nExpnum = 2; // HDR needs both 1X and processed img
2384        } else {
2385            nExpnum = 1; // HDR only needs processed img
2386        }
2387    } else {
2388        const char *bracket_str = get(KEY_QC_AE_BRACKET_HDR);
2389        if (bracket_str != NULL && strlen(bracket_str) > 0) {
2390            int value = lookupAttr(BRACKETING_MODES_MAP,
2391                                   sizeof(BRACKETING_MODES_MAP)/sizeof(QCameraMap),
2392                                   bracket_str);
2393            switch (value) {
2394            case CAM_EXP_BRACKETING_ON:
2395                {
2396                    nExpnum = 0;
2397                    const char *str_val = get(KEY_QC_CAPTURE_BURST_EXPOSURE);
2398                    if ((str_val != NULL) && (strlen(str_val) > 0)) {
2399                        char prop[PROPERTY_VALUE_MAX];
2400                        memset(prop, 0, sizeof(prop));
2401                        strcpy(prop, str_val);
2402                        char *saveptr = NULL;
2403                        char *token = strtok_r(prop, ",", &saveptr);
2404                        while (token != NULL) {
2405                            token = strtok_r(NULL, ",", &saveptr);
2406                            nExpnum++;
2407                        }
2408                    }
2409                    if (nExpnum == 0) {
2410                        nExpnum = 1;
2411                    }
2412                }
2413                break;
2414            default:
2415                nExpnum = 1;
2416                break;
2417            }
2418        }
2419    }
2420
2421    ALOGD("%s: nBurstNum = %d, nExpnum = %d", __func__, nBurstNum, nExpnum);
2422    set(KEY_QC_NUM_SNAPSHOT_PER_SHUTTER, nBurstNum * nExpnum);
2423    return NO_ERROR;
2424}
2425
2426/*===========================================================================
2427 * FUNCTION   : setRecordingHint
2428 *
2429 * DESCRIPTION: set recording hint value from user setting
2430 *
2431 * PARAMETERS :
2432 *   @params  : user setting parameters
2433 *
2434 * RETURN     : int32_t type of status
2435 *              NO_ERROR  -- success
2436 *              none-zero failure code
2437 *==========================================================================*/
2438int32_t QCameraParameters::setRecordingHint(const QCameraParameters& params)
2439{
2440    const char * str = params.get(KEY_RECORDING_HINT);
2441    const char *prev_str = get(KEY_RECORDING_HINT);
2442    if (str != NULL) {
2443        if (prev_str == NULL || strcmp(str, prev_str) != 0) {
2444            int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP,
2445                                       sizeof(TRUE_FALSE_MODES_MAP)/sizeof(QCameraMap),
2446                                       str);
2447            if(value != NAME_NOT_FOUND){
2448                updateParamEntry(KEY_RECORDING_HINT, str);
2449                setRecordingHintValue(value);
2450                return NO_ERROR;
2451            } else {
2452                ALOGE("Invalid recording hint value: %s", str);
2453                return BAD_VALUE;
2454            }
2455        }
2456    }
2457    return NO_ERROR;
2458}
2459
2460/*===========================================================================
2461 * FUNCTION   : setNoDisplayMode
2462 *
2463 * DESCRIPTION: set no display mode from user setting
2464 *
2465 * PARAMETERS :
2466 *   @params  : user setting parameters
2467 *
2468 * RETURN     : int32_t type of status
2469 *              NO_ERROR  -- success
2470 *              none-zero failure code
2471 *==========================================================================*/
2472int32_t QCameraParameters::setNoDisplayMode(const QCameraParameters& params)
2473{
2474    const char *str_val  = params.get(KEY_QC_NO_DISPLAY_MODE);
2475    const char *prev_str = get(KEY_QC_NO_DISPLAY_MODE);
2476    if(str_val && strlen(str_val) > 0) {
2477        if (prev_str == NULL || strcmp(str_val, prev_str) != 0) {
2478            m_bNoDisplayMode = atoi(str_val);
2479            updateParamEntry(KEY_QC_NO_DISPLAY_MODE, str_val);
2480            m_bNeedRestart = true;
2481        }
2482    } else {
2483        m_bNoDisplayMode = false;
2484    }
2485    ALOGD("Param m_bNoDisplayMode = %d", m_bNoDisplayMode);
2486    return NO_ERROR;
2487}
2488
2489/*===========================================================================
2490 * FUNCTION   : setZslMode
2491 *
2492 * DESCRIPTION: set ZSL mode from user setting
2493 *
2494 * PARAMETERS :
2495 *   @params  : user setting parameters
2496 *
2497 * RETURN     : int32_t type of status
2498 *              NO_ERROR  -- success
2499 *              none-zero failure code
2500 *==========================================================================*/
2501int32_t QCameraParameters::setZslMode(const QCameraParameters& params)
2502{
2503    const char *str_val  = params.get(KEY_QC_ZSL);
2504    const char *prev_val  = get(KEY_QC_ZSL);
2505
2506    if (str_val != NULL) {
2507        if (prev_val == NULL || strcmp(str_val, prev_val) != 0) {
2508            int32_t value = lookupAttr(ON_OFF_MODES_MAP,
2509                                       sizeof(ON_OFF_MODES_MAP)/sizeof(QCameraMap),
2510                                       str_val);
2511            if (value != NAME_NOT_FOUND) {
2512                updateParamEntry(KEY_QC_ZSL, str_val);
2513                m_bZslMode = (value > 0)? true : false;
2514
2515                // ZSL mode changed, need restart preview
2516                m_bNeedRestart = true;
2517
2518                return AddSetParmEntryToBatch(m_pParamBuf,
2519                                              CAM_INTF_PARM_ZSL_MODE,
2520                                              sizeof(value),
2521                                              &value);
2522            } else {
2523                ALOGE("Invalid ZSL mode value: %s", str_val);
2524                return BAD_VALUE;
2525            }
2526        }
2527    }
2528    return NO_ERROR;
2529}
2530
2531/*===========================================================================
2532 * FUNCTION   : setWaveletDenoise
2533 *
2534 * DESCRIPTION: set wavelet denoise value from user setting
2535 *
2536 * PARAMETERS :
2537 *   @params  : user setting parameters
2538 *
2539 * RETURN     : int32_t type of status
2540 *              NO_ERROR  -- success
2541 *              none-zero failure code
2542 *==========================================================================*/
2543int32_t QCameraParameters::setWaveletDenoise(const QCameraParameters& params)
2544{
2545    const char *str = params.get(KEY_QC_DENOISE);
2546    const char *prev_str = get(KEY_QC_DENOISE);
2547    if (str != NULL) {
2548        if (prev_str == NULL ||
2549            strcmp(str, prev_str) != 0) {
2550            return setWaveletDenoise(str);
2551        }
2552    }
2553    return NO_ERROR;
2554}
2555
2556/*===========================================================================
2557 * FUNCTION   : setCameraMode
2558 *
2559 * DESCRIPTION: set camera mode from user setting
2560 *
2561 * PARAMETERS :
2562 *   @params  : user setting parameters
2563 *
2564 * RETURN     : int32_t type of status
2565 *              NO_ERROR  -- success
2566 *              none-zero failure code
2567 *==========================================================================*/
2568int32_t QCameraParameters::setCameraMode(const QCameraParameters& params)
2569{
2570    const char *str = params.get(KEY_QC_CAMERA_MODE);
2571    if (str != NULL) {
2572        set(KEY_QC_CAMERA_MODE, str);
2573    } else {
2574        remove(KEY_QC_CAMERA_MODE);
2575    }
2576    return NO_ERROR;
2577}
2578
2579/*===========================================================================
2580 * FUNCTION   : setZslAttributes
2581 *
2582 * DESCRIPTION: set ZSL related attributes from user setting
2583 *
2584 * PARAMETERS :
2585 *   @params  : user setting parameters
2586 *
2587 * RETURN     : int32_t type of status
2588 *              NO_ERROR  -- success
2589 *              none-zero failure code
2590 *==========================================================================*/
2591int32_t QCameraParameters::setZslAttributes(const QCameraParameters& params)
2592{
2593    // TODO: may switch to pure param instead of sysprop
2594    char prop[32];
2595
2596    const char *str = params.get(KEY_QC_ZSL_BURST_INTERVAL);
2597    if (str != NULL) {
2598        set(KEY_QC_ZSL_BURST_INTERVAL, str);
2599    } else {
2600        memset(prop, 0, sizeof(prop));
2601        property_get("persist.camera.zsl.interval", prop, "1");
2602        set(KEY_QC_ZSL_BURST_INTERVAL, prop);
2603    }
2604
2605    str = params.get(KEY_QC_ZSL_BURST_LOOKBACK);
2606    if (str != NULL) {
2607        set(KEY_QC_ZSL_BURST_LOOKBACK, str);
2608    } else {
2609        memset(prop, 0, sizeof(prop));
2610        property_get("persist.camera.zsl.backlookcnt", prop, "2");
2611        set(KEY_QC_ZSL_BURST_LOOKBACK, prop);
2612    }
2613
2614    str = params.get(KEY_QC_ZSL_QUEUE_DEPTH);
2615    if (str != NULL) {
2616        set(KEY_QC_ZSL_QUEUE_DEPTH, str);
2617    } else {
2618        memset(prop, 0, sizeof(prop));
2619        property_get("persist.camera.zsl.queuedepth", prop, "2");
2620        set(KEY_QC_ZSL_QUEUE_DEPTH, prop);
2621    }
2622
2623    return NO_ERROR;
2624}
2625
2626/*===========================================================================
2627 * FUNCTION   : setFlip
2628 *
2629 * DESCRIPTION: set preview/ video/ picture flip mode from user setting
2630 *
2631 * PARAMETERS :
2632 *   @params  : user setting parameters
2633 *
2634 * RETURN     : int32_t type of status
2635 *              NO_ERROR  -- success
2636 *              none-zero failure code
2637 *==========================================================================*/
2638int32_t QCameraParameters::setFlip(const QCameraParameters& params)
2639{
2640    if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_FLIP) == 0) {
2641        ALOGD("%s: flip is not supported.", __func__);
2642        return NO_ERROR;
2643    }
2644
2645    //check preview flip setting
2646    const char *str = params.get(KEY_QC_PREVIEW_FLIP);
2647    if(str != NULL){
2648        int32_t value = lookupAttr(FLIP_MODES_MAP,
2649                                   sizeof(FLIP_MODES_MAP)/sizeof(QCameraMap),
2650                                   str);
2651        if(value != NAME_NOT_FOUND){
2652            set(KEY_QC_PREVIEW_FLIP, str);
2653        }
2654    }
2655
2656    // check video filp setting
2657    str = params.get(KEY_QC_VIDEO_FLIP);
2658    if(str != NULL){
2659        int32_t value = lookupAttr(FLIP_MODES_MAP,
2660                                   sizeof(FLIP_MODES_MAP)/sizeof(QCameraMap),
2661                                   str);
2662        if(value != NAME_NOT_FOUND){
2663            set(KEY_QC_VIDEO_FLIP, str);
2664        }
2665    }
2666
2667    // check picture filp setting
2668    str = params.get(KEY_QC_SNAPSHOT_PICTURE_FLIP);
2669    if(str != NULL){
2670        int32_t value = lookupAttr(FLIP_MODES_MAP,
2671                                   sizeof(FLIP_MODES_MAP)/sizeof(QCameraMap),
2672                                   str);
2673        if(value != NAME_NOT_FOUND){
2674            set(KEY_QC_SNAPSHOT_PICTURE_FLIP, str);
2675        }
2676    }
2677
2678    return NO_ERROR;
2679}
2680
2681/*===========================================================================
2682 * FUNCTION   : updateParameters
2683 *
2684 * DESCRIPTION: update parameters from user setting
2685 *
2686 * PARAMETERS :
2687 *   @params  : user setting parameters
2688 *   @needRestart : [output] if preview need restart upon setting changes
2689 *
2690 * RETURN     : int32_t type of status
2691 *              NO_ERROR  -- success
2692 *              none-zero failure code
2693 *==========================================================================*/
2694int32_t QCameraParameters::updateParameters(QCameraParameters& params,
2695                                            bool &needRestart)
2696{
2697    int32_t final_rc = NO_ERROR;
2698    int32_t rc;
2699    m_bNeedRestart = false;
2700
2701    if(initBatchUpdate(m_pParamBuf) < 0 ) {
2702        ALOGE("%s:Failed to initialize group update table",__func__);
2703        rc = BAD_TYPE;
2704        goto UPDATE_PARAM_DONE;
2705    }
2706
2707    if ((rc = setPreviewSize(params)))                  final_rc = rc;
2708    if ((rc = setVideoSize(params)))                    final_rc = rc;
2709    if ((rc = setPictureSize(params)))                  final_rc = rc;
2710    if ((rc = setPreviewFormat(params)))                final_rc = rc;
2711    if ((rc = setPictureFormat(params)))                final_rc = rc;
2712    if ((rc = setJpegThumbnailSize(params)))            final_rc = rc;
2713    if ((rc = setJpegQuality(params)))                  final_rc = rc;
2714    if ((rc = setOrientation(params)))                  final_rc = rc;
2715    if ((rc = setRotation(params)))                     final_rc = rc;
2716    if ((rc = setNoDisplayMode(params)))                final_rc = rc;
2717    if ((rc = setZslMode(params)))                      final_rc = rc;
2718    if ((rc = setZslAttributes(params)))                final_rc = rc;
2719    if ((rc = setCameraMode(params)))                   final_rc = rc;
2720    if ((rc = setRecordingHint(params)))                final_rc = rc;
2721
2722    if ((rc = setPreviewFpsRange(params)))              final_rc = rc;
2723    if ((rc = setPreviewFrameRate(params)))             final_rc = rc;
2724    if ((rc = setAutoExposure(params)))                 final_rc = rc;
2725    if ((rc = setEffect(params)))                       final_rc = rc;
2726    if ((rc = setBrightness(params)))                   final_rc = rc;
2727    if ((rc = setZoom(params)))                         final_rc = rc;
2728    if ((rc = setSharpness(params)))                    final_rc = rc;
2729    if ((rc = setSaturation(params)))                   final_rc = rc;
2730    if ((rc = setContrast(params)))                     final_rc = rc;
2731    if ((rc = setFocusMode(params)))                    final_rc = rc;
2732    if ((rc = setISOValue(params)))                     final_rc = rc;
2733    if ((rc = setSkinToneEnhancement(params)))          final_rc = rc;
2734    if ((rc = setFlash(params)))                        final_rc = rc;
2735    if ((rc = setAecLock(params)))                      final_rc = rc;
2736    if ((rc = setAwbLock(params)))                      final_rc = rc;
2737    if ((rc = setLensShadeValue(params)))               final_rc = rc;
2738    if ((rc = setMCEValue(params)))                     final_rc = rc;
2739    if ((rc = setDISValue(params)))                     final_rc = rc;
2740    if ((rc = setHighFrameRate(params)))                final_rc = rc;
2741    if ((rc = setAntibanding(params)))                  final_rc = rc;
2742    if ((rc = setExposureCompensation(params)))         final_rc = rc;
2743    if ((rc = setWhiteBalance(params)))                 final_rc = rc;
2744    if ((rc = setSceneMode(params)))                    final_rc = rc;
2745    if ((rc = setFocusAreas(params)))                   final_rc = rc;
2746    if ((rc = setMeteringAreas(params)))                final_rc = rc;
2747    if ((rc = setSelectableZoneAf(params)))             final_rc = rc;
2748    if ((rc = setRedeyeReduction(params)))              final_rc = rc;
2749    if ((rc = setAEBracket(params)))                    final_rc = rc;
2750    if ((rc = setGpsLocation(params)))                  final_rc = rc;
2751    if ((rc = setWaveletDenoise(params)))               final_rc = rc;
2752    if ((rc = setFaceRecognition(params)))              final_rc = rc;
2753    if ((rc = setFlip(params)))                         final_rc = rc;
2754    if ((rc = setVideoHDR(params)))                     final_rc = rc;
2755
2756    // update live snapshot size after all other parameters are set
2757    if ((rc = setLiveSnapshotSize(params)))             final_rc = rc;
2758
2759UPDATE_PARAM_DONE:
2760    needRestart = m_bNeedRestart;
2761    return final_rc;
2762}
2763
2764/*===========================================================================
2765 * FUNCTION   : commitParameters
2766 *
2767 * DESCRIPTION: commit parameter changes to backend
2768 *
2769 * PARAMETERS : none
2770 *
2771 * RETURN     : int32_t type of status
2772 *              NO_ERROR  -- success
2773 *              none-zero failure code
2774 *==========================================================================*/
2775int32_t QCameraParameters::commitParameters()
2776{
2777    return commitSetBatch();
2778}
2779
2780/*===========================================================================
2781 * FUNCTION   : initDefaultParameters
2782 *
2783 * DESCRIPTION: initialize default parameters for the first time
2784 *
2785 * PARAMETERS : none
2786 *
2787 * RETURN     : int32_t type of status
2788 *              NO_ERROR  -- success
2789 *              none-zero failure code
2790 *==========================================================================*/
2791int32_t QCameraParameters::initDefaultParameters()
2792{
2793    if(initBatchUpdate(m_pParamBuf) < 0 ) {
2794        ALOGE("%s:Failed to initialize group update table", __func__);
2795        return BAD_TYPE;
2796    }
2797
2798    /*************************Initialize Values******************************/
2799    // Set read only parameters from camera capability
2800    set(KEY_SMOOTH_ZOOM_SUPPORTED,
2801        m_pCapability->smooth_zoom_supported? VALUE_TRUE : VALUE_FALSE);
2802    set(KEY_ZOOM_SUPPORTED,
2803        m_pCapability->zoom_supported? VALUE_TRUE : VALUE_FALSE);
2804    set(KEY_VIDEO_SNAPSHOT_SUPPORTED,
2805        m_pCapability->video_snapshot_supported? VALUE_TRUE : VALUE_FALSE);
2806    set(KEY_VIDEO_STABILIZATION_SUPPORTED,
2807        m_pCapability->video_stablization_supported? VALUE_TRUE : VALUE_FALSE);
2808    set(KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
2809        m_pCapability->auto_exposure_lock_supported? VALUE_TRUE : VALUE_FALSE);
2810    set(KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
2811        m_pCapability->auto_wb_lock_supported? VALUE_TRUE : VALUE_FALSE);
2812    set(KEY_QC_SUPPORTED_CAMERA_FEATURES,
2813        m_pCapability->qcom_supported_feature_mask);
2814    set(KEY_MAX_NUM_DETECTED_FACES_HW, m_pCapability->max_num_roi);
2815    set(KEY_MAX_NUM_DETECTED_FACES_SW, m_pCapability->max_num_roi);
2816    set(KEY_QC_MAX_NUM_REQUESTED_FACES, m_pCapability->max_num_roi);
2817    // Set focal length, horizontal view angle, and vertical view angle
2818    setFloat(KEY_FOCAL_LENGTH, m_pCapability->focal_length);
2819    setFloat(KEY_HORIZONTAL_VIEW_ANGLE, m_pCapability->hor_view_angle);
2820    setFloat(KEY_VERTICAL_VIEW_ANGLE, m_pCapability->ver_view_angle);
2821
2822    // Set supported preview sizes
2823    if (m_pCapability->preview_sizes_tbl_cnt > 0 &&
2824        m_pCapability->preview_sizes_tbl_cnt <= MAX_SIZES_CNT) {
2825        String8 previewSizeValues = createSizesString(
2826                m_pCapability->preview_sizes_tbl, m_pCapability->preview_sizes_tbl_cnt);
2827        set(KEY_SUPPORTED_PREVIEW_SIZES, previewSizeValues.string());
2828        ALOGD("%s: supported preview sizes: %s", __func__, previewSizeValues.string());
2829        // Set default preview size
2830        CameraParameters::setPreviewSize(m_pCapability->preview_sizes_tbl[0].width,
2831                                         m_pCapability->preview_sizes_tbl[0].height);
2832    } else {
2833        ALOGE("%s: supported preview sizes cnt is 0 or exceeds max!!!", __func__);
2834    }
2835
2836    // Set supported video sizes
2837    if (m_pCapability->video_sizes_tbl_cnt > 0 &&
2838        m_pCapability->video_sizes_tbl_cnt <= MAX_SIZES_CNT) {
2839        String8 videoSizeValues = createSizesString(
2840                m_pCapability->video_sizes_tbl, m_pCapability->video_sizes_tbl_cnt);
2841        set(KEY_SUPPORTED_VIDEO_SIZES, videoSizeValues.string());
2842        ALOGD("%s: supported video sizes: %s", __func__, videoSizeValues.string());
2843        // Set default video size
2844        CameraParameters::setVideoSize(m_pCapability->video_sizes_tbl[0].width,
2845                                       m_pCapability->video_sizes_tbl[0].height);
2846
2847        //Set preferred Preview size for video
2848        String8 vSize = createSizesString(&m_pCapability->video_sizes_tbl[0], 1);
2849        set(KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, vSize.string());
2850    } else {
2851        ALOGE("%s: supported video sizes cnt is 0 or exceeds max!!!", __func__);
2852    }
2853
2854    // Set supported picture sizes
2855    if (m_pCapability->picture_sizes_tbl_cnt > 0 &&
2856        m_pCapability->picture_sizes_tbl_cnt <= MAX_SIZES_CNT) {
2857        String8 pictureSizeValues = createSizesString(
2858                m_pCapability->picture_sizes_tbl, m_pCapability->picture_sizes_tbl_cnt);
2859        set(KEY_SUPPORTED_PICTURE_SIZES, pictureSizeValues.string());
2860        ALOGD("%s: supported pic sizes: %s", __func__, pictureSizeValues.string());
2861        // Set default picture size to the smallest resolution
2862        CameraParameters::setPictureSize(
2863           m_pCapability->picture_sizes_tbl[m_pCapability->picture_sizes_tbl_cnt-1].width,
2864           m_pCapability->picture_sizes_tbl[m_pCapability->picture_sizes_tbl_cnt-1].height);
2865    } else {
2866        ALOGE("%s: supported picture sizes cnt is 0 or exceeds max!!!", __func__);
2867    }
2868
2869    // Set supported thumbnail sizes
2870    String8 thumbnailSizeValues = createSizesString(
2871            THUMBNAIL_SIZES_MAP,
2872            sizeof(THUMBNAIL_SIZES_MAP)/sizeof(cam_dimension_t));
2873    set(KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, thumbnailSizeValues.string());
2874    // Set default thumnail size
2875    set(KEY_JPEG_THUMBNAIL_WIDTH, THUMBNAIL_SIZES_MAP[0].width);
2876    set(KEY_JPEG_THUMBNAIL_HEIGHT, THUMBNAIL_SIZES_MAP[0].height);
2877
2878    // Set supported livesnapshot sizes
2879    if (m_pCapability->livesnapshot_sizes_tbl_cnt > 0 &&
2880        m_pCapability->livesnapshot_sizes_tbl_cnt <= MAX_SIZES_CNT) {
2881        String8 liveSnpashotSizeValues = createSizesString(
2882                m_pCapability->livesnapshot_sizes_tbl,
2883                m_pCapability->livesnapshot_sizes_tbl_cnt);
2884        set(KEY_QC_SUPPORTED_LIVESNAPSHOT_SIZES, liveSnpashotSizeValues.string());
2885        ALOGI("%s: supported live snapshot sizes: %s", __func__, liveSnpashotSizeValues.string());
2886        m_LiveSnapshotSize =
2887            m_pCapability->livesnapshot_sizes_tbl[m_pCapability->livesnapshot_sizes_tbl_cnt-1];
2888    }
2889
2890    // Set supported preview formats
2891    String8 previewFormatValues = createValuesString(
2892            (int *)m_pCapability->supported_preview_fmts,
2893            m_pCapability->supported_preview_fmt_cnt,
2894            PREVIEW_FORMATS_MAP,
2895            sizeof(PREVIEW_FORMATS_MAP)/sizeof(QCameraMap));
2896    set(KEY_SUPPORTED_PREVIEW_FORMATS, previewFormatValues.string());
2897    // Set default preview format
2898    CameraParameters::setPreviewFormat(PIXEL_FORMAT_YUV420SP);
2899
2900    // Set default Video Format
2901    set(KEY_VIDEO_FRAME_FORMAT, PIXEL_FORMAT_YUV420SP);
2902
2903    // Set supported picture formats
2904    String8 pictureTypeValues(PIXEL_FORMAT_JPEG);
2905    String8 str = createValuesString(
2906            (int *)m_pCapability->supported_raw_fmts,
2907            m_pCapability->supported_raw_fmt_cnt,
2908            PICTURE_TYPES_MAP,
2909            sizeof(PICTURE_TYPES_MAP)/sizeof(QCameraMap));
2910    if (str.string() != NULL) {
2911        pictureTypeValues.append(",");
2912        pictureTypeValues.append(str);
2913    }
2914
2915    set(KEY_SUPPORTED_PICTURE_FORMATS, pictureTypeValues.string());
2916    // Set default picture Format
2917    CameraParameters::setPictureFormat(PIXEL_FORMAT_JPEG);
2918    // Set raw image size
2919    char raw_size_str[32];
2920    snprintf(raw_size_str, sizeof(raw_size_str), "%dx%d",
2921             m_pCapability->raw_dim.width, m_pCapability->raw_dim.height);
2922    set(KEY_QC_RAW_PICUTRE_SIZE, raw_size_str);
2923
2924    //set default jpeg quality and thumbnail quality
2925    set(KEY_JPEG_QUALITY, 85);
2926    set(KEY_JPEG_THUMBNAIL_QUALITY, 85);
2927
2928    // Set FPS ranges
2929    if (m_pCapability->fps_ranges_tbl_cnt > 0 &&
2930        m_pCapability->fps_ranges_tbl_cnt <= MAX_SIZES_CNT) {
2931        int default_fps_index = 0;
2932        String8 fpsRangeValues = createFpsRangeString(m_pCapability->fps_ranges_tbl,
2933                                                      m_pCapability->fps_ranges_tbl_cnt,
2934                                                      default_fps_index);
2935        set(KEY_SUPPORTED_PREVIEW_FPS_RANGE, fpsRangeValues.string());
2936
2937        int min_fps =
2938            int(m_pCapability->fps_ranges_tbl[default_fps_index].min_fps * 1000);
2939        int max_fps =
2940            int(m_pCapability->fps_ranges_tbl[default_fps_index].max_fps * 1000);
2941        setPreviewFpsRange(min_fps, max_fps);
2942
2943        // Set legacy preview fps
2944        String8 fpsValues = createFpsString(m_pCapability->fps_ranges_tbl,
2945                                            m_pCapability->fps_ranges_tbl_cnt);
2946        set(KEY_SUPPORTED_PREVIEW_FRAME_RATES, fpsValues.string());
2947        CameraParameters::setPreviewFrameRate(max_fps);
2948    } else {
2949        ALOGE("%s: supported fps ranges cnt is 0 or exceeds max!!!", __func__);
2950    }
2951
2952    // Set supported focus modes
2953    if (m_pCapability->supported_focus_modes_cnt > 0) {
2954        String8 focusModeValues = createValuesString(
2955                (int *)m_pCapability->supported_focus_modes,
2956                m_pCapability->supported_focus_modes_cnt,
2957                FOCUS_MODES_MAP,
2958                sizeof(FOCUS_MODES_MAP)/sizeof(QCameraMap));
2959        set(KEY_SUPPORTED_FOCUS_MODES, focusModeValues);
2960
2961        // Set default focus mode and update corresponding parameter buf
2962        const char *focusMode = lookupNameByValue(FOCUS_MODES_MAP,
2963                                             sizeof(FOCUS_MODES_MAP)/sizeof(QCameraMap),
2964                                             m_pCapability->supported_focus_modes[0]);
2965        if (focusMode != NULL) {
2966            setFocusMode(focusMode);
2967        } else {
2968            setFocusMode(FOCUS_MODE_FIXED);
2969        }
2970    } else {
2971        ALOGE("%s: supported focus modes cnt is 0!!!", __func__);
2972    }
2973
2974    // Set focus areas
2975    if (m_pCapability->max_num_focus_areas > MAX_ROI) {
2976        m_pCapability->max_num_focus_areas = MAX_ROI;
2977    }
2978    set(KEY_MAX_NUM_FOCUS_AREAS, m_pCapability->max_num_focus_areas);
2979    if (m_pCapability->max_num_focus_areas > 0) {
2980        setFocusAreas(DEFAULT_CAMERA_AREA);
2981    }
2982
2983    // Set metering areas
2984    if (m_pCapability->max_num_metering_areas > MAX_ROI) {
2985        m_pCapability->max_num_metering_areas = MAX_ROI;
2986    }
2987    set(KEY_MAX_NUM_METERING_AREAS, m_pCapability->max_num_metering_areas);
2988    if (m_pCapability->max_num_metering_areas > 0) {
2989        setMeteringAreas(DEFAULT_CAMERA_AREA);
2990    }
2991
2992    // Set Saturation
2993    set(KEY_QC_MIN_SATURATION, m_pCapability->saturation_ctrl.min_value);
2994    set(KEY_QC_MAX_SATURATION, m_pCapability->saturation_ctrl.max_value);
2995    set(KEY_QC_SATURATION_STEP, m_pCapability->saturation_ctrl.step);
2996    setSaturation(m_pCapability->saturation_ctrl.def_value);
2997
2998    // Set Sharpness
2999    set(KEY_QC_MIN_SHARPNESS, m_pCapability->sharpness_ctrl.min_value);
3000    set(KEY_QC_MAX_SHARPNESS, m_pCapability->sharpness_ctrl.max_value);
3001    set(KEY_QC_SHARPNESS_STEP, m_pCapability->sharpness_ctrl.step);
3002    setSharpness(m_pCapability->sharpness_ctrl.def_value);
3003
3004    // Set Contrast
3005    set(KEY_QC_MIN_CONTRAST, m_pCapability->contrast_ctrl.min_value);
3006    set(KEY_QC_MAX_CONTRAST, m_pCapability->contrast_ctrl.max_value);
3007    set(KEY_QC_CONTRAST_STEP, m_pCapability->contrast_ctrl.step);
3008    setContrast(m_pCapability->contrast_ctrl.def_value);
3009
3010    // Set SCE factor
3011    set(KEY_QC_MIN_SCE_FACTOR, m_pCapability->sce_ctrl.min_value); // -100
3012    set(KEY_QC_MAX_SCE_FACTOR, m_pCapability->sce_ctrl.max_value); // 100
3013    set(KEY_QC_SCE_FACTOR_STEP, m_pCapability->sce_ctrl.step);     // 10
3014    setSkinToneEnhancement(m_pCapability->sce_ctrl.def_value);     // 0
3015
3016    // Set Brightness
3017    set(KEY_QC_MIN_BRIGHTNESS, m_pCapability->brightness_ctrl.min_value); // 0
3018    set(KEY_QC_MAX_BRIGHTNESS, m_pCapability->brightness_ctrl.max_value); // 6
3019    set(KEY_QC_BRIGHTNESS_STEP, m_pCapability->brightness_ctrl.step);     // 1
3020    setBrightness(m_pCapability->brightness_ctrl.def_value);
3021
3022    // Set Auto exposure
3023    String8 autoExposureValues = createValuesString(
3024            (int *)m_pCapability->supported_aec_modes,
3025            m_pCapability->supported_aec_modes_cnt,
3026            AUTO_EXPOSURE_MAP,
3027            sizeof(AUTO_EXPOSURE_MAP) / sizeof(QCameraMap));
3028    set(KEY_QC_SUPPORTED_AUTO_EXPOSURE, autoExposureValues.string());
3029    setAutoExposure(AUTO_EXPOSURE_FRAME_AVG);
3030
3031    // Set Exposure Compensation
3032    set(KEY_MAX_EXPOSURE_COMPENSATION, m_pCapability->exposure_compensation_max); // 12
3033    set(KEY_MIN_EXPOSURE_COMPENSATION, m_pCapability->exposure_compensation_min); // -12
3034    setFloat(KEY_EXPOSURE_COMPENSATION_STEP, m_pCapability->exposure_compensation_step); // 1/6
3035    setExposureCompensation(m_pCapability->exposure_compensation_default); // 0
3036
3037    // Set Antibanding
3038    String8 antibandingValues = createValuesString(
3039            (int *)m_pCapability->supported_antibandings,
3040            m_pCapability->supported_antibandings_cnt,
3041            ANTIBANDING_MODES_MAP,
3042            sizeof(ANTIBANDING_MODES_MAP) / sizeof(QCameraMap));
3043    set(KEY_SUPPORTED_ANTIBANDING, antibandingValues);
3044    setAntibanding(ANTIBANDING_OFF);
3045
3046    // Set Effect
3047    String8 effectValues = createValuesString(
3048            (int *)m_pCapability->supported_effects,
3049            m_pCapability->supported_effects_cnt,
3050            EFFECT_MODES_MAP,
3051            sizeof(EFFECT_MODES_MAP) / sizeof(QCameraMap));
3052    set(KEY_SUPPORTED_EFFECTS, effectValues);
3053    setEffect(EFFECT_NONE);
3054
3055    // Set WhiteBalance
3056    String8 whitebalanceValues = createValuesString(
3057            (int *)m_pCapability->supported_white_balances,
3058            m_pCapability->supported_white_balances_cnt,
3059            WHITE_BALANCE_MODES_MAP,
3060            sizeof(WHITE_BALANCE_MODES_MAP) / sizeof(QCameraMap));
3061    set(KEY_SUPPORTED_WHITE_BALANCE, whitebalanceValues);
3062    setWhiteBalance(WHITE_BALANCE_AUTO);
3063
3064    // Set Flash mode
3065    String8 flashValues = createValuesString(
3066            (int *)m_pCapability->supported_flash_modes,
3067            m_pCapability->supported_flash_modes_cnt,
3068            FLASH_MODES_MAP,
3069            sizeof(FLASH_MODES_MAP) / sizeof(QCameraMap));
3070    set(KEY_SUPPORTED_FLASH_MODES, flashValues);
3071    setFlash(FLASH_MODE_OFF);
3072
3073    // Set Scene Mode
3074    String8 sceneModeValues = createValuesString(
3075            (int *)m_pCapability->supported_scene_modes,
3076            m_pCapability->supported_scene_modes_cnt,
3077            SCENE_MODES_MAP,
3078            sizeof(SCENE_MODES_MAP) / sizeof(QCameraMap));
3079    set(KEY_SUPPORTED_SCENE_MODES, sceneModeValues);
3080    setSceneMode(SCENE_MODE_AUTO);
3081
3082    // Set ISO Mode
3083    String8 isoValues = createValuesString(
3084            (int *)m_pCapability->supported_iso_modes,
3085            m_pCapability->supported_iso_modes_cnt,
3086            ISO_MODES_MAP,
3087            sizeof(ISO_MODES_MAP) / sizeof(QCameraMap));
3088    set(KEY_QC_SUPPORTED_ISO_MODES, isoValues);
3089    setISOValue(ISO_AUTO);
3090
3091    // Set HFR
3092    String8 hfrValues = createHfrValuesString(
3093            m_pCapability->hfr_tbl,
3094            m_pCapability->hfr_tbl_cnt,
3095            HFR_MODES_MAP,
3096            sizeof(HFR_MODES_MAP) / sizeof(QCameraMap));
3097    set(KEY_QC_SUPPORTED_VIDEO_HIGH_FRAME_RATE_MODES, hfrValues.string());
3098    String8 hfrSizeValues = createHfrSizesString(
3099            m_pCapability->hfr_tbl,
3100            m_pCapability->hfr_tbl_cnt);
3101    set(KEY_QC_SUPPORTED_HFR_SIZES, hfrSizeValues.string());
3102    setHighFrameRate(VIDEO_HFR_OFF);
3103
3104    // Set Focus algorithms
3105    String8 focusAlgoValues = createValuesString(
3106            (int *)m_pCapability->supported_focus_algos,
3107            m_pCapability->supported_focus_algos_cnt,
3108            FOCUS_ALGO_MAP,
3109            sizeof(FOCUS_ALGO_MAP) / sizeof(QCameraMap));
3110    set(KEY_QC_SUPPORTED_FOCUS_ALGOS, focusAlgoValues);
3111    setSelectableZoneAf(FOCUS_ALGO_AUTO);
3112
3113    // Set Zoom Ratios
3114    if (m_pCapability->zoom_supported > 0) {
3115        String8 zoomRatioValues = createZoomRatioValuesString(
3116                m_pCapability->zoom_ratio_tbl,
3117                m_pCapability->zoom_ratio_tbl_cnt);
3118        set(KEY_ZOOM_RATIOS, zoomRatioValues);
3119        set(KEY_MAX_ZOOM, m_pCapability->zoom_ratio_tbl_cnt - 1);
3120        setZoom(0);
3121    }
3122
3123    // Set Bracketing/HDR
3124    char prop[PROPERTY_VALUE_MAX];
3125    memset(prop, 0, sizeof(prop));
3126    property_get("persist.capture.burst.exposures", prop, "");
3127    if (strlen(prop) > 0) {
3128        set(KEY_QC_CAPTURE_BURST_EXPOSURE, prop);
3129    }
3130    String8 bracketingValues = createValuesStringFromMap(
3131            BRACKETING_MODES_MAP,
3132            sizeof(BRACKETING_MODES_MAP) / sizeof(QCameraMap));
3133    set(KEY_QC_SUPPORTED_AE_BRACKET_MODES, bracketingValues);
3134    setAEBracket(AE_BRACKET_OFF);
3135
3136    // Set Denoise
3137    String8 denoiseValues = createValuesStringFromMap(
3138       DENOISE_ON_OFF_MODES_MAP, sizeof(DENOISE_ON_OFF_MODES_MAP) / sizeof(QCameraMap));
3139    set(KEY_QC_SUPPORTED_DENOISE, denoiseValues.string());
3140    setWaveletDenoise(DENOISE_OFF);
3141
3142    // Set feature enable/disable
3143    String8 enableDisableValues = createValuesStringFromMap(
3144        ENABLE_DISABLE_MODES_MAP, sizeof(ENABLE_DISABLE_MODES_MAP) / sizeof(QCameraMap));
3145
3146    // Set Lens Shading
3147    set(KEY_QC_SUPPORTED_LENSSHADE_MODES, enableDisableValues);
3148    setLensShadeValue(VALUE_ENABLE);
3149
3150    // Set MCE
3151    set(KEY_QC_SUPPORTED_MEM_COLOR_ENHANCE_MODES, enableDisableValues);
3152    setMCEValue(VALUE_ENABLE);
3153
3154    // Set DIS
3155    set(KEY_QC_SUPPORTED_DIS_MODES, enableDisableValues);
3156    setDISValue(VALUE_DISABLE);
3157
3158    // Set Histogram
3159    set(KEY_QC_SUPPORTED_HISTOGRAM_MODES, enableDisableValues);
3160    set(KEY_QC_HISTOGRAM, VALUE_DISABLE);
3161
3162    //Set Red Eye Reduction
3163    set(KEY_QC_SUPPORTED_REDEYE_REDUCTION, enableDisableValues);
3164    setRedeyeReduction(VALUE_DISABLE);
3165
3166    //Set SkinTone Enhancement
3167    set(KEY_QC_SUPPORTED_SKIN_TONE_ENHANCEMENT_MODES, enableDisableValues);
3168
3169    // Set feature on/off
3170    String8 onOffValues = createValuesStringFromMap(
3171        ON_OFF_MODES_MAP, sizeof(ON_OFF_MODES_MAP) / sizeof(QCameraMap));
3172
3173    //Set Scene Detection
3174    set(KEY_QC_SUPPORTED_SCENE_DETECT, onOffValues);
3175    setSceneDetect(VALUE_OFF);
3176
3177    //Set Face Detection
3178    set(KEY_QC_SUPPORTED_FACE_DETECTION, onOffValues);
3179    set(KEY_QC_FACE_DETECTION, VALUE_OFF);
3180
3181    //Set Face Recognition
3182    set(KEY_QC_SUPPORTED_FACE_RECOGNITION, onOffValues);
3183    set(KEY_QC_FACE_RECOGNITION, VALUE_OFF);
3184
3185    //Set ZSL
3186    set(KEY_QC_SUPPORTED_ZSL_MODES, onOffValues);
3187    set(KEY_QC_ZSL, VALUE_OFF);
3188    m_bZslMode =true;
3189
3190    //Set video HDR
3191    if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_VIDEO_HDR) > 0) {
3192        set(KEY_QC_SUPPORTED_VIDEO_HDR_MODES, onOffValues);
3193        set(KEY_QC_VIDEO_HDR, VALUE_OFF);
3194    }
3195
3196    //Set Touch AF/AEC
3197    String8 touchValues = createValuesStringFromMap(
3198       TOUCH_AF_AEC_MODES_MAP, sizeof(TOUCH_AF_AEC_MODES_MAP) / sizeof(QCameraMap));
3199
3200    set(KEY_QC_SUPPORTED_TOUCH_AF_AEC, touchValues);
3201    set(KEY_QC_TOUCH_AF_AEC, TOUCH_AF_AEC_OFF);
3202
3203    //set flip mode
3204    if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_FLIP) > 0) {
3205        String8 flipModes = createValuesStringFromMap(
3206           FLIP_MODES_MAP, sizeof(FLIP_MODES_MAP) / sizeof(QCameraMap));
3207        set(KEY_QC_SUPPORTED_FLIP_MODES, flipModes);
3208        set(KEY_QC_PREVIEW_FLIP, FLIP_MODE_OFF);
3209        set(KEY_QC_VIDEO_FLIP, FLIP_MODE_OFF);
3210        set(KEY_QC_SNAPSHOT_PICTURE_FLIP, FLIP_MODE_OFF);
3211    }
3212
3213    // Set default Auto Exposure lock value
3214    setAecLock(VALUE_FALSE);
3215
3216    // Set default AWB_LOCK lock value
3217    setAwbLock(VALUE_FALSE);
3218
3219    // Set default Camera mode
3220    set(KEY_QC_CAMERA_MODE, 0);
3221
3222    // TODO: hardcode for now until mctl add support for min_num_pp_bufs
3223    m_pCapability->min_num_pp_bufs = 3;
3224
3225    int32_t rc = commitParameters();
3226    if (rc == NO_ERROR) {
3227        rc = setNumOfSnapshot();
3228    }
3229    return rc;
3230}
3231
3232/*===========================================================================
3233 * FUNCTION   : init
3234 *
3235 * DESCRIPTION: initialize parameter obj
3236 *
3237 * PARAMETERS :
3238 *   @capabilities  : ptr to camera capabilities
3239 *   @mmops         : ptr to memory ops table for mapping/unmapping
3240 *
3241 * RETURN     : int32_t type of status
3242 *              NO_ERROR  -- success
3243 *              none-zero failure code
3244 *==========================================================================*/
3245int32_t QCameraParameters::init(cam_capability_t *capabilities, mm_camera_vtbl_t *mmOps)
3246{
3247    int32_t rc = NO_ERROR;
3248
3249    m_pCapability = capabilities;
3250    m_pCamOpsTbl = mmOps;
3251
3252    //Allocate Set Param Buffer
3253    m_pParamHeap = new QCameraHeapMemory();
3254    rc = m_pParamHeap->allocate(1, sizeof(parm_buffer_t));
3255    if(rc != OK) {
3256        rc = NO_MEMORY;
3257        ALOGE("Failed to allocate SETPARM Heap memory");
3258        goto TRANS_INIT_ERROR1;
3259    }
3260
3261    //Map memory for parameters buffer
3262    rc = m_pCamOpsTbl->ops->map_buf(m_pCamOpsTbl->camera_handle,
3263                             CAM_MAPPING_BUF_TYPE_PARM_BUF,
3264                             m_pParamHeap->getFd(0),
3265                             sizeof(parm_buffer_t));
3266    if(rc < 0) {
3267        ALOGE("%s:failed to map SETPARM buffer",__func__);
3268        rc = FAILED_TRANSACTION;
3269        goto TRANS_INIT_ERROR2;
3270    }
3271    m_pParamBuf = (parm_buffer_t*) DATA_PTR(m_pParamHeap,0);
3272
3273    initDefaultParameters();
3274
3275    goto TRANS_INIT_DONE;
3276
3277TRANS_INIT_ERROR2:
3278    m_pParamHeap->deallocate();
3279
3280TRANS_INIT_ERROR1:
3281    delete m_pParamHeap;
3282    m_pParamHeap = NULL;
3283
3284TRANS_INIT_DONE:
3285    return rc;
3286}
3287
3288/*===========================================================================
3289 * FUNCTION   : deinit
3290 *
3291 * DESCRIPTION: deinitialize
3292 *
3293 * PARAMETERS : none
3294 *
3295 * RETURN     : none
3296 *==========================================================================*/
3297void QCameraParameters::deinit()
3298{
3299    //clear all entries in the map
3300    String8 emptyStr;
3301    QCameraParameters::unflatten(emptyStr);
3302
3303    if (NULL != m_pCamOpsTbl) {
3304        m_pCamOpsTbl->ops->unmap_buf(
3305                             m_pCamOpsTbl->camera_handle,
3306                             CAM_MAPPING_BUF_TYPE_PARM_BUF);
3307        m_pCamOpsTbl = NULL;
3308    }
3309    m_pCapability = NULL;
3310    if (NULL != m_pParamHeap) {
3311        m_pParamHeap->deallocate();
3312        delete m_pParamHeap;
3313        m_pParamHeap = NULL;
3314        m_pParamBuf = NULL;
3315    }
3316
3317    m_tempMap.clear();
3318}
3319
3320/*===========================================================================
3321 * FUNCTION   : parse_pair
3322 *
3323 * DESCRIPTION: helper function to parse string like "640x480" or "10000,20000"
3324 *
3325 * PARAMETERS :
3326 *   @str     : input string to be parse
3327 *   @first   : [output] first value of the pair
3328 *   @second  : [output]  second value of the pair
3329 *   @delim   : [input] delimeter to seperate the pair
3330 *   @endptr  : [output] ptr to the end of the pair string
3331 *
3332 * RETURN     : int32_t type of status
3333 *              NO_ERROR  -- success
3334 *              none-zero failure code
3335 *==========================================================================*/
3336int32_t QCameraParameters::parse_pair(const char *str,
3337                                      int *first,
3338                                      int *second,
3339                                      char delim,
3340                                      char **endptr = NULL)
3341{
3342    // Find the first integer.
3343    char *end;
3344    int w = (int)strtol(str, &end, 10);
3345    // If a delimeter does not immediately follow, give up.
3346    if (*end != delim) {
3347        ALOGE("Cannot find delimeter (%c) in str=%s", delim, str);
3348        return BAD_VALUE;
3349    }
3350
3351    // Find the second integer, immediately after the delimeter.
3352    int h = (int)strtol(end+1, &end, 10);
3353
3354    *first = w;
3355    *second = h;
3356
3357    if (endptr) {
3358        *endptr = end;
3359    }
3360
3361    return NO_ERROR;
3362}
3363
3364/*===========================================================================
3365 * FUNCTION   : parseSizesList
3366 *
3367 * DESCRIPTION: helper function to parse string containing sizes
3368 *
3369 * PARAMETERS :
3370 *   @sizesStr: [input] input string to be parse
3371 *   @sizes   : [output] reference to store parsed sizes
3372 *
3373 * RETURN     : none
3374 *==========================================================================*/
3375void QCameraParameters::parseSizesList(const char *sizesStr, Vector<Size> &sizes)
3376{
3377    if (sizesStr == 0) {
3378        return;
3379    }
3380
3381    char *sizeStartPtr = (char *)sizesStr;
3382
3383    while (true) {
3384        int width, height;
3385        int success = parse_pair(sizeStartPtr, &width, &height, 'x',
3386                                 &sizeStartPtr);
3387        if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) {
3388            ALOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
3389            return;
3390        }
3391        sizes.push(Size(width, height));
3392
3393        if (*sizeStartPtr == '\0') {
3394            return;
3395        }
3396        sizeStartPtr++;
3397    }
3398}
3399
3400/*===========================================================================
3401 * FUNCTION   : getSupportedHfrSizes
3402 *
3403 * DESCRIPTION: return supported HFR sizes
3404 *
3405 * PARAMETERS :
3406 *   @sizes  : [output] reference to a vector storing supported HFR sizes
3407 *
3408 * RETURN     : none
3409 *==========================================================================*/
3410void QCameraParameters::getSupportedHfrSizes(Vector<Size> &sizes)
3411{
3412    const char *hfrSizesStr = get(KEY_QC_SUPPORTED_HFR_SIZES);
3413    parseSizesList(hfrSizesStr, sizes);
3414}
3415
3416/*===========================================================================
3417 * FUNCTION   : adjustPreviewFpsRanges
3418 *
3419 * DESCRIPTION: adjust preview FPS ranges
3420 *              according to external events
3421 *
3422 * PARAMETERS :
3423 *   @minFPS  : min FPS value
3424 *   @maxFPS  : max FPS value
3425 *
3426 * RETURN     : int32_t type of status
3427 *              NO_ERROR  -- success
3428 *              none-zero failure code
3429 *==========================================================================*/
3430int32_t QCameraParameters::adjustPreviewFpsRange(cam_fps_range_t *fpsRange)
3431{
3432    if ( fpsRange == NULL ) {
3433        return BAD_VALUE;
3434    }
3435
3436    int32_t rc = initBatchUpdate(m_pParamBuf);
3437    if ( rc != NO_ERROR ) {
3438        ALOGE("%s:Failed to initialize group update table", __func__);
3439        return rc;
3440    }
3441
3442    rc = AddSetParmEntryToBatch(m_pParamBuf,
3443                                  CAM_INTF_PARM_FPS_RANGE,
3444                                  sizeof(cam_fps_range_t),
3445                                  fpsRange);
3446    if ( rc != NO_ERROR ) {
3447        ALOGE("%s: Parameters batch failed",__func__);
3448        return rc;
3449    }
3450
3451    rc = commitSetBatch();
3452    if ( rc != NO_ERROR ) {
3453        ALOGE("%s:Failed to commit batch parameters", __func__);
3454        return rc;
3455    }
3456
3457    return rc;
3458}
3459
3460/*===========================================================================
3461 * FUNCTION   : setPreviewFpsRanges
3462 *
3463 * DESCRIPTION: set preview FPS ranges
3464 *
3465 * PARAMETERS :
3466 *   @minFPS  : min FPS value
3467 *   @maxFPS  : max FPS value
3468 *
3469 * RETURN     : int32_t type of status
3470 *              NO_ERROR  -- success
3471 *              none-zero failure code
3472 *==========================================================================*/
3473int32_t QCameraParameters::setPreviewFpsRange(int minFPS, int maxFPS)
3474{
3475    char str[32];
3476    snprintf(str, sizeof(str), "%d,%d", minFPS, maxFPS);
3477    ALOGD("%s: Setting preview fps range %s", __func__, str);
3478    updateParamEntry(KEY_PREVIEW_FPS_RANGE, str);
3479    cam_fps_range_t fps_range = {(float)(minFPS / 1000.0), (float)(maxFPS / 1000.0)};
3480    return AddSetParmEntryToBatch(m_pParamBuf,
3481                                  CAM_INTF_PARM_FPS_RANGE,
3482                                  sizeof(cam_fps_range_t),
3483                                  &fps_range);
3484}
3485
3486/*===========================================================================
3487 * FUNCTION   : setAutoExposure
3488 *
3489 * DESCRIPTION: set auto exposure
3490 *
3491 * PARAMETERS :
3492 *   @autoExp : auto exposure value string
3493 *
3494 * RETURN     : int32_t type of status
3495 *              NO_ERROR  -- success
3496 *              none-zero failure code
3497 *==========================================================================*/
3498int32_t QCameraParameters::setAutoExposure(const char *autoExp)
3499{
3500    if (autoExp != NULL) {
3501        int32_t value = lookupAttr(AUTO_EXPOSURE_MAP,
3502                                   sizeof(AUTO_EXPOSURE_MAP)/sizeof(AUTO_EXPOSURE_MAP[0]),
3503                                   autoExp);
3504        if (value != NAME_NOT_FOUND) {
3505            ALOGD("%s: Setting auto exposure %s", __func__, autoExp);
3506            updateParamEntry(KEY_QC_AUTO_EXPOSURE, autoExp);
3507            return AddSetParmEntryToBatch(m_pParamBuf,
3508                                          CAM_INTF_PARM_AEC_ALGO_TYPE,
3509                                          sizeof(value),
3510                                          &value);
3511        }
3512    }
3513    ALOGE("Invalid auto exposure value: %s", (autoExp == NULL) ? "NULL" : autoExp);
3514    return BAD_VALUE;
3515}
3516
3517/*===========================================================================
3518 * FUNCTION   : setEffect
3519 *
3520 * DESCRIPTION: set effect
3521 *
3522 * PARAMETERS :
3523 *   @effect  : effect value string
3524 *
3525 * RETURN     : int32_t type of status
3526 *              NO_ERROR  -- success
3527 *              none-zero failure code
3528 *==========================================================================*/
3529int32_t QCameraParameters::setEffect(const char *effect)
3530{
3531    if (effect != NULL) {
3532        int32_t value = lookupAttr(EFFECT_MODES_MAP,
3533                                   sizeof(EFFECT_MODES_MAP)/sizeof(QCameraMap),
3534                                   effect);
3535        if (value != NAME_NOT_FOUND) {
3536            ALOGD("%s: Setting effect %s", __func__, effect);
3537            updateParamEntry(KEY_EFFECT, effect);
3538            return AddSetParmEntryToBatch(m_pParamBuf,
3539                                          CAM_INTF_PARM_EFFECT,
3540                                          sizeof(value),
3541                                          &value);
3542        }
3543    }
3544    ALOGE("Invalid effect value: %s", (effect == NULL) ? "NULL" : effect);
3545    return BAD_VALUE;
3546}
3547
3548/*===========================================================================
3549 * FUNCTION   : setBrightness
3550 *
3551 * DESCRIPTION: set brightness control value
3552 *
3553 * PARAMETERS :
3554 *   @brightness  : brightness control value
3555 *
3556 * RETURN     : int32_t type of status
3557 *              NO_ERROR  -- success
3558 *              none-zero failure code
3559 *==========================================================================*/
3560int32_t QCameraParameters::setBrightness(int brightness)
3561{
3562    char val[16];
3563    sprintf(val, "%d", brightness);
3564    updateParamEntry(KEY_QC_BRIGHTNESS, val);
3565
3566    int32_t value = brightness;
3567    ALOGD("%s: Setting brightness %s", __func__, val);
3568    return AddSetParmEntryToBatch(m_pParamBuf,
3569                                  CAM_INTF_PARM_BRIGHTNESS,
3570                                  sizeof(value),
3571                                  &value);
3572}
3573
3574/*===========================================================================
3575 * FUNCTION   : setFocusMode
3576 *
3577 * DESCRIPTION: set focus mode
3578 *
3579 * PARAMETERS :
3580 *   @focusMode  : focus mode value string
3581 *
3582 * RETURN     : int32_t type of status
3583 *              NO_ERROR  -- success
3584 *              none-zero failure code
3585 *==========================================================================*/
3586int32_t QCameraParameters::setFocusMode(const char *focusMode)
3587{
3588    if (focusMode != NULL) {
3589        int32_t value = lookupAttr(FOCUS_MODES_MAP,
3590                                   sizeof(FOCUS_MODES_MAP)/sizeof(QCameraMap),
3591                                   focusMode);
3592        if (value != NAME_NOT_FOUND) {
3593            ALOGD("%s: Setting focus mode %s", __func__, focusMode);
3594            mFocusMode = (cam_focus_mode_type)value;
3595
3596            // reset need lock CAF flag
3597            m_bNeedLockCAF = false;
3598            m_bCAFLocked = false;
3599            m_bAFRunning = false;
3600
3601            updateParamEntry(KEY_FOCUS_MODE, focusMode);
3602            return AddSetParmEntryToBatch(m_pParamBuf,
3603                                          CAM_INTF_PARM_FOCUS_MODE,
3604                                          sizeof(value),
3605                                          &value);
3606        }
3607    }
3608    ALOGE("Invalid focus mode value: %s", (focusMode == NULL) ? "NULL" : focusMode);
3609    return BAD_VALUE;
3610}
3611
3612/*===========================================================================
3613 * FUNCTION   : setSharpness
3614 *
3615 * DESCRIPTION: set sharpness control value
3616 *
3617 * PARAMETERS :
3618 *   @sharpness  : sharpness control value
3619 *
3620 * RETURN     : int32_t type of status
3621 *              NO_ERROR  -- success
3622 *              none-zero failure code
3623 *==========================================================================*/
3624int32_t QCameraParameters::setSharpness(int sharpness)
3625{
3626    char val[16];
3627    sprintf(val, "%d", sharpness);
3628    updateParamEntry(KEY_QC_SHARPNESS, val);
3629    ALOGD("%s: Setting sharpness %s", __func__, val);
3630
3631    int32_t value = sharpness;
3632    return AddSetParmEntryToBatch(m_pParamBuf,
3633                                  CAM_INTF_PARM_SHARPNESS,
3634                                  sizeof(value),
3635                                  &value);
3636}
3637
3638/*===========================================================================
3639 * FUNCTION   : setSkinToneEnhancement
3640 *
3641 * DESCRIPTION: set skin tone enhancement value
3642 *
3643 * PARAMETERS :
3644 *   @sceFactore  : skin tone enhancement factor value
3645 *
3646 * RETURN     : int32_t type of status
3647 *              NO_ERROR  -- success
3648 *              none-zero failure code
3649 *==========================================================================*/
3650int32_t QCameraParameters::setSkinToneEnhancement(int sceFactor)
3651{
3652    char val[16];
3653    sprintf(val, "%d", sceFactor);
3654    updateParamEntry(KEY_QC_SCE_FACTOR, val);
3655    ALOGD("%s: Setting skintone enhancement %s", __func__, val);
3656
3657    int32_t value = sceFactor;
3658    return AddSetParmEntryToBatch(m_pParamBuf,
3659                                  CAM_INTF_PARM_SCE_FACTOR,
3660                                  sizeof(value),
3661                                  &value);
3662}
3663
3664/*===========================================================================
3665 * FUNCTION   : setSaturation
3666 *
3667 * DESCRIPTION: set saturation control value
3668 *
3669 * PARAMETERS :
3670 *   @saturation : saturation control value
3671 *
3672 * RETURN     : int32_t type of status
3673 *              NO_ERROR  -- success
3674 *              none-zero failure code
3675 *==========================================================================*/
3676int32_t QCameraParameters::setSaturation(int saturation)
3677{
3678    char val[16];
3679    sprintf(val, "%d", saturation);
3680    updateParamEntry(KEY_QC_SATURATION, val);
3681    ALOGD("%s: Setting saturation %s", __func__, val);
3682
3683    int32_t value = saturation;
3684    return AddSetParmEntryToBatch(m_pParamBuf,
3685                                  CAM_INTF_PARM_SATURATION,
3686                                  sizeof(value),
3687                                  &value);
3688}
3689
3690/*===========================================================================
3691 * FUNCTION   : setContrast
3692 *
3693 * DESCRIPTION: set contrast control value
3694 *
3695 * PARAMETERS :
3696 *   @contrast : contrast control value
3697 *
3698 * RETURN     : int32_t type of status
3699 *              NO_ERROR  -- success
3700 *              none-zero failure code
3701 *==========================================================================*/
3702int32_t QCameraParameters::setContrast(int contrast)
3703{
3704    char val[16];
3705    sprintf(val, "%d", contrast);
3706    updateParamEntry(KEY_QC_CONTRAST, val);
3707    ALOGD("%s: Setting contrast %s", __func__, val);
3708
3709    int32_t value = contrast;
3710    return AddSetParmEntryToBatch(m_pParamBuf,
3711                                  CAM_INTF_PARM_CONTRAST,
3712                                  sizeof(value),
3713                                  &value);
3714}
3715
3716/*===========================================================================
3717 * FUNCTION   : setSceneDetect
3718 *
3719 * DESCRIPTION: set scenen detect value
3720 *
3721 * PARAMETERS :
3722 *   @sceneDetect  : scene detect value string
3723 *
3724 * RETURN     : int32_t type of status
3725 *              NO_ERROR  -- success
3726 *              none-zero failure code
3727 *==========================================================================*/
3728int32_t QCameraParameters::setSceneDetect(const char *sceneDetect)
3729{
3730    if (sceneDetect != NULL) {
3731        int32_t value = lookupAttr(ON_OFF_MODES_MAP,
3732                                   sizeof(ON_OFF_MODES_MAP)/sizeof(QCameraMap),
3733                                   sceneDetect);
3734        if (value != NAME_NOT_FOUND) {
3735            ALOGD("%s: Setting Scene Detect %s", __func__, sceneDetect);
3736            updateParamEntry(KEY_QC_SCENE_DETECT, sceneDetect);
3737            return AddSetParmEntryToBatch(m_pParamBuf,
3738                                          CAM_INTF_PARM_ASD_ENABLE,
3739                                          sizeof(value),
3740                                          &value);
3741        }
3742    }
3743    ALOGE("Invalid Scene Detect value: %s",
3744          (sceneDetect == NULL) ? "NULL" : sceneDetect);
3745    return BAD_VALUE;
3746}
3747
3748/*===========================================================================
3749 * FUNCTION   : setVideoHDR
3750 *
3751 * DESCRIPTION: set video HDR value
3752 *
3753 * PARAMETERS :
3754 *   @videoHDR  : svideo HDR value string
3755 *
3756 * RETURN     : int32_t type of status
3757 *              NO_ERROR  -- success
3758 *              none-zero failure code
3759 *==========================================================================*/
3760int32_t QCameraParameters::setVideoHDR(const char *videoHDR)
3761{
3762    if (videoHDR != NULL) {
3763        int32_t value = lookupAttr(ON_OFF_MODES_MAP,
3764                                   sizeof(ON_OFF_MODES_MAP)/sizeof(QCameraMap),
3765                                   videoHDR);
3766        if (value != NAME_NOT_FOUND) {
3767            ALOGD("%s: Setting Video HDR %s", __func__, videoHDR);
3768            updateParamEntry(KEY_QC_VIDEO_HDR, videoHDR);
3769            return AddSetParmEntryToBatch(m_pParamBuf,
3770                                          CAM_INTF_PARM_VIDEO_HDR,
3771                                          sizeof(value),
3772                                          &value);
3773        }
3774    }
3775    ALOGE("Invalid Video HDR value: %s",
3776          (videoHDR == NULL) ? "NULL" : videoHDR);
3777    return BAD_VALUE;
3778}
3779
3780/*===========================================================================
3781 * FUNCTION   : setFaceRecognition
3782 *
3783 * DESCRIPTION: set face recognition value
3784 *
3785 * PARAMETERS :
3786 *   @faceRecog  : face recognition value string
3787 *   @maxFaces   : number of max faces to be detected/recognized
3788 *
3789 * RETURN     : int32_t type of status
3790 *              NO_ERROR  -- success
3791 *              none-zero failure code
3792 *==========================================================================*/
3793int32_t QCameraParameters::setFaceRecognition(const char *faceRecog, int maxFaces)
3794{
3795    if (faceRecog != NULL) {
3796        int32_t value = lookupAttr(ON_OFF_MODES_MAP,
3797                                   sizeof(ON_OFF_MODES_MAP)/sizeof(QCameraMap),
3798                                   faceRecog);
3799        if (value != NAME_NOT_FOUND) {
3800            ALOGD("%s: Setting face recognition %s", __func__, faceRecog);
3801            updateParamEntry(KEY_QC_FACE_RECOGNITION, faceRecog);
3802
3803            int faceProcMask = m_nFaceProcMask;
3804            if (value > 0) {
3805                faceProcMask |= CAM_FACE_PROCESS_MASK_RECOGNITION;
3806            } else {
3807                faceProcMask &= ~CAM_FACE_PROCESS_MASK_RECOGNITION;
3808            }
3809
3810            if(m_nFaceProcMask == faceProcMask) {
3811                ALOGD("%s: face process mask not changed, no ops here", __func__);
3812                return NO_ERROR;
3813            }
3814            m_nFaceProcMask = faceProcMask;
3815            ALOGD("%s: FaceProcMask -> %d", __func__, m_nFaceProcMask);
3816
3817            // set parm for face process
3818            cam_fd_set_parm_t fd_set_parm;
3819            memset(&fd_set_parm, 0, sizeof(cam_fd_set_parm_t));
3820            fd_set_parm.fd_mode = m_nFaceProcMask;
3821            fd_set_parm.num_fd = maxFaces;
3822
3823            return AddSetParmEntryToBatch(m_pParamBuf,
3824                                        CAM_INTF_PARM_FD,
3825                                        sizeof(fd_set_parm),
3826                                        &fd_set_parm);
3827        }
3828    }
3829    ALOGE("Invalid face recognition value: %s", (faceRecog == NULL) ? "NULL" : faceRecog);
3830    return BAD_VALUE;
3831}
3832
3833/*===========================================================================
3834 * FUNCTION   : setZoom
3835 *
3836 * DESCRIPTION: set zoom level
3837 *
3838 * PARAMETERS :
3839 *   @zoom_level : zoom level
3840 *
3841 * RETURN     : int32_t type of status
3842 *              NO_ERROR  -- success
3843 *              none-zero failure code
3844 *==========================================================================*/
3845int32_t QCameraParameters::setZoom(int zoom_level)
3846{
3847    char val[16];
3848    sprintf(val, "%d", zoom_level);
3849    updateParamEntry(KEY_ZOOM, val);
3850
3851    return AddSetParmEntryToBatch(m_pParamBuf,
3852                                  CAM_INTF_PARM_ZOOM,
3853                                  sizeof(zoom_level),
3854                                  &zoom_level);
3855}
3856
3857/*===========================================================================
3858 * FUNCTION   : setISOValue
3859 *
3860 * DESCRIPTION: set ISO value
3861 *
3862 * PARAMETERS :
3863 *   @isoValue : ISO value string
3864 *
3865 * RETURN     : int32_t type of status
3866 *              NO_ERROR  -- success
3867 *              none-zero failure code
3868 *==========================================================================*/
3869int32_t  QCameraParameters::setISOValue(const char *isoValue)
3870{
3871    if (isoValue != NULL) {
3872        int32_t value = lookupAttr(ISO_MODES_MAP,
3873                                   sizeof(ISO_MODES_MAP)/sizeof(QCameraMap),
3874                                   isoValue);
3875        if (value != NAME_NOT_FOUND) {
3876            ALOGD("%s: Setting ISO value %s", __func__, isoValue);
3877            updateParamEntry(KEY_QC_ISO_MODE, isoValue);
3878            return AddSetParmEntryToBatch(m_pParamBuf,
3879                                          CAM_INTF_PARM_ISO,
3880                                          sizeof(value),
3881                                          &value);
3882        }
3883    }
3884    ALOGE("Invalid ISO value: %s",
3885          (isoValue == NULL) ? "NULL" : isoValue);
3886    return BAD_VALUE;
3887}
3888
3889/*===========================================================================
3890 * FUNCTION   : setFlash
3891 *
3892 * DESCRIPTION: set f;ash mode
3893 *
3894 * PARAMETERS :
3895 *   @flashStr : LED flash mode value string
3896 *
3897 * RETURN     : int32_t type of status
3898 *              NO_ERROR  -- success
3899 *              none-zero failure code
3900 *==========================================================================*/
3901int32_t QCameraParameters::setFlash(const char *flashStr)
3902{
3903    if (flashStr != NULL) {
3904        int32_t value = lookupAttr(FLASH_MODES_MAP,
3905                                   sizeof(FLASH_MODES_MAP)/sizeof(QCameraMap),
3906                                   flashStr);
3907        if (value != NAME_NOT_FOUND) {
3908            ALOGD("%s: Setting Flash value %s", __func__, flashStr);
3909            updateParamEntry(KEY_FLASH_MODE, flashStr);
3910            return AddSetParmEntryToBatch(m_pParamBuf,
3911                                          CAM_INTF_PARM_LED_MODE,
3912                                          sizeof(value),
3913                                          &value);
3914        }
3915    }
3916    ALOGE("Invalid flash value: %s", (flashStr == NULL) ? "NULL" : flashStr);
3917    return BAD_VALUE;
3918}
3919
3920/*===========================================================================
3921 * FUNCTION   : setAecLock
3922 *
3923 * DESCRIPTION: set AEC lock value
3924 *
3925 * PARAMETERS :
3926 *   @aecLockStr : AEC lock value string
3927 *
3928 * RETURN     : int32_t type of status
3929 *              NO_ERROR  -- success
3930 *              none-zero failure code
3931 *==========================================================================*/
3932int32_t QCameraParameters::setAecLock(const char *aecLockStr)
3933{
3934    if (aecLockStr != NULL) {
3935        int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP,
3936                                   sizeof(TRUE_FALSE_MODES_MAP)/sizeof(QCameraMap),
3937                                   aecLockStr);
3938        if (value != NAME_NOT_FOUND) {
3939            ALOGD("%s: Setting AECLock value %s", __func__, aecLockStr);
3940            updateParamEntry(KEY_AUTO_EXPOSURE_LOCK, aecLockStr);
3941            return AddSetParmEntryToBatch(m_pParamBuf,
3942                                          CAM_INTF_PARM_AEC_LOCK,
3943                                          sizeof(value),
3944                                          &value);
3945        }
3946    }
3947    ALOGE("Invalid AECLock value: %s", (aecLockStr == NULL) ? "NULL" : aecLockStr);
3948    return BAD_VALUE;
3949}
3950
3951/*===========================================================================
3952 * FUNCTION   : setAwbLock
3953 *
3954 * DESCRIPTION: set AWB lock value
3955 *
3956 * PARAMETERS :
3957 *   @awbLockStr : AWB lock value string
3958 *
3959 * RETURN     : int32_t type of status
3960 *              NO_ERROR  -- success
3961 *              none-zero failure code
3962 *==========================================================================*/
3963int32_t QCameraParameters::setAwbLock(const char *awbLockStr)
3964{
3965    if (awbLockStr != NULL) {
3966        int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP,
3967                                   sizeof(TRUE_FALSE_MODES_MAP)/sizeof(QCameraMap),
3968                                   awbLockStr);
3969        if (value != NAME_NOT_FOUND) {
3970            ALOGD("%s: Setting AWBLock value %s", __func__, awbLockStr);
3971            updateParamEntry(KEY_AUTO_WHITEBALANCE_LOCK, awbLockStr);
3972            return AddSetParmEntryToBatch(m_pParamBuf,
3973                                          CAM_INTF_PARM_AWB_LOCK,
3974                                          sizeof(value),
3975                                          &value);
3976        }
3977    }
3978    ALOGE("Invalid AWBLock value: %s", (awbLockStr == NULL) ? "NULL" : awbLockStr);
3979    return BAD_VALUE;
3980}
3981
3982/*===========================================================================
3983 * FUNCTION   : setMCEValue
3984 *
3985 * DESCRIPTION: set memory color enhancement value
3986 *
3987 * PARAMETERS :
3988 *   @mceStr : MCE value string
3989 *
3990 * RETURN     : int32_t type of status
3991 *              NO_ERROR  -- success
3992 *              none-zero failure code
3993 *==========================================================================*/
3994int32_t QCameraParameters::setMCEValue(const char *mceStr)
3995{
3996    if (mceStr != NULL) {
3997        int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
3998                                   sizeof(ENABLE_DISABLE_MODES_MAP)/sizeof(QCameraMap),
3999                                   mceStr);
4000        if (value != NAME_NOT_FOUND) {
4001            ALOGD("%s: Setting AWBLock value %s", __func__, mceStr);
4002            updateParamEntry(KEY_QC_MEMORY_COLOR_ENHANCEMENT, mceStr);
4003            return AddSetParmEntryToBatch(m_pParamBuf,
4004                                          CAM_INTF_PARM_MCE,
4005                                          sizeof(value),
4006                                          &value);
4007        }
4008    }
4009    ALOGE("Invalid MCE value: %s", (mceStr == NULL) ? "NULL" : mceStr);
4010    return BAD_VALUE;
4011}
4012
4013/*===========================================================================
4014 * FUNCTION   : setDISValue
4015 *
4016 * DESCRIPTION: set DIS value
4017 *
4018 * PARAMETERS :
4019 *   @disStr : DIS value string
4020 *
4021 * RETURN     : int32_t type of status
4022 *              NO_ERROR  -- success
4023 *              none-zero failure code
4024 *==========================================================================*/
4025int32_t QCameraParameters::setDISValue(const char *disStr)
4026{
4027    if (disStr != NULL) {
4028        int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
4029                                   sizeof(ENABLE_DISABLE_MODES_MAP)/sizeof(QCameraMap),
4030                                   disStr);
4031        if (value != NAME_NOT_FOUND) {
4032            ALOGD("%s: Setting DIS value %s", __func__, disStr);
4033            updateParamEntry(KEY_QC_DIS, disStr);
4034            return AddSetParmEntryToBatch(m_pParamBuf,
4035                                          CAM_INTF_PARM_DIS_ENABLE,
4036                                          sizeof(value),
4037                                          &value);
4038        }
4039    }
4040    ALOGE("Invalid DIS value: %s", (disStr == NULL) ? "NULL" : disStr);
4041    return BAD_VALUE;
4042}
4043
4044/*===========================================================================
4045 * FUNCTION   : setHighFrameRate
4046 *
4047 * DESCRIPTION: set high frame rate
4048 *
4049 * PARAMETERS :
4050 *   @hfrStr : HFR value string
4051 *
4052 * RETURN     : int32_t type of status
4053 *              NO_ERROR  -- success
4054 *              none-zero failure code
4055 *==========================================================================*/
4056int32_t QCameraParameters::setHighFrameRate(const char *hfrStr)
4057{
4058    if (hfrStr != NULL) {
4059        int32_t value = lookupAttr(HFR_MODES_MAP,
4060                                   sizeof(HFR_MODES_MAP)/sizeof(QCameraMap),
4061                                   hfrStr);
4062        if (value != NAME_NOT_FOUND) {
4063            // HFR value changed, need to restart preview
4064            m_bNeedRestart = true;
4065            // Set HFR value
4066            ALOGD("%s: Setting HFR value %s", __func__, hfrStr);
4067            updateParamEntry(KEY_QC_VIDEO_HIGH_FRAME_RATE, hfrStr);
4068            return AddSetParmEntryToBatch(m_pParamBuf,
4069                                          CAM_INTF_PARM_HFR,
4070                                          sizeof(value),
4071                                          &value);
4072        }
4073    }
4074    ALOGE("Invalid HFR value: %s", (hfrStr == NULL) ? "NULL" : hfrStr);
4075    return BAD_VALUE;
4076}
4077
4078/*===========================================================================
4079 * FUNCTION   : setLensShadeValue
4080 *
4081 * DESCRIPTION: set lens shade value
4082 *
4083 * PARAMETERS :
4084 *   @lensSahdeStr : lens shade value string
4085 *
4086 * RETURN     : int32_t type of status
4087 *              NO_ERROR  -- success
4088 *              none-zero failure code
4089 *==========================================================================*/
4090int32_t QCameraParameters::setLensShadeValue(const char *lensShadeStr)
4091{
4092    if (lensShadeStr != NULL) {
4093        int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
4094                                   sizeof(ENABLE_DISABLE_MODES_MAP)/sizeof(QCameraMap),
4095                                   lensShadeStr);
4096        if (value != NAME_NOT_FOUND) {
4097            ALOGD("%s: Setting LensShade value %s", __func__, lensShadeStr);
4098            updateParamEntry(KEY_QC_LENSSHADE, lensShadeStr);
4099            return AddSetParmEntryToBatch(m_pParamBuf,
4100                                          CAM_INTF_PARM_ROLLOFF,
4101                                          sizeof(value),
4102                                          &value);
4103        }
4104    }
4105    ALOGE("Invalid LensShade value: %s",
4106          (lensShadeStr == NULL) ? "NULL" : lensShadeStr);
4107    return BAD_VALUE;
4108}
4109
4110/*===========================================================================
4111 * FUNCTION   : setExposureCompensation
4112 *
4113 * DESCRIPTION: set exposure compensation value
4114 *
4115 * PARAMETERS :
4116 *   @expComp : exposure compensation value
4117 *
4118 * RETURN     : int32_t type of status
4119 *              NO_ERROR  -- success
4120 *              none-zero failure code
4121 *==========================================================================*/
4122int32_t QCameraParameters::setExposureCompensation(int expComp)
4123{
4124    char val[16];
4125    sprintf(val, "%d", expComp);
4126    updateParamEntry(KEY_EXPOSURE_COMPENSATION, val);
4127
4128    // Don't need to pass step as part of setParameter because
4129    // camera daemon is already aware of it.
4130    return AddSetParmEntryToBatch(m_pParamBuf,
4131                                  CAM_INTF_PARM_EXPOSURE_COMPENSATION,
4132                                  sizeof(expComp),
4133                                  &expComp);
4134}
4135
4136/*===========================================================================
4137 * FUNCTION   : setWhiteBalance
4138 *
4139 * DESCRIPTION: set white balance mode
4140 *
4141 * PARAMETERS :
4142 *   @wbStr   : white balance mode value string
4143 *
4144 * RETURN     : int32_t type of status
4145 *              NO_ERROR  -- success
4146 *              none-zero failure code
4147 *==========================================================================*/
4148int32_t QCameraParameters::setWhiteBalance(const char *wbStr)
4149{
4150    if (wbStr != NULL) {
4151        int32_t value = lookupAttr(WHITE_BALANCE_MODES_MAP,
4152                                   sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(QCameraMap),
4153                                   wbStr);
4154        if (value != NAME_NOT_FOUND) {
4155            ALOGD("%s: Setting WhiteBalance value %s", __func__, wbStr);
4156            updateParamEntry(KEY_WHITE_BALANCE, wbStr);
4157            return AddSetParmEntryToBatch(m_pParamBuf,
4158                                          CAM_INTF_PARM_WHITE_BALANCE,
4159                                          sizeof(value),
4160                                          &value);
4161        }
4162    }
4163    ALOGE("Invalid WhiteBalance value: %s", (wbStr == NULL) ? "NULL" : wbStr);
4164    return BAD_VALUE;
4165}
4166
4167/*===========================================================================
4168 * FUNCTION   : setAntibanding
4169 *
4170 * DESCRIPTION: set antibanding value
4171 *
4172 * PARAMETERS :
4173 *   @antiBandingStr : antibanding value string
4174 *
4175 * RETURN     : int32_t type of status
4176 *              NO_ERROR  -- success
4177 *              none-zero failure code
4178 *==========================================================================*/
4179int32_t QCameraParameters::setAntibanding(const char *antiBandingStr)
4180{
4181    if (antiBandingStr != NULL) {
4182        int32_t value = lookupAttr(ANTIBANDING_MODES_MAP,
4183                                   sizeof(ANTIBANDING_MODES_MAP)/sizeof(QCameraMap),
4184                                   antiBandingStr);
4185        if (value != NAME_NOT_FOUND) {
4186            ALOGD("%s: Setting AntiBanding value %s", __func__, antiBandingStr);
4187            updateParamEntry(KEY_ANTIBANDING, antiBandingStr);
4188            return AddSetParmEntryToBatch(m_pParamBuf,
4189                                          CAM_INTF_PARM_ANTIBANDING,
4190                                          sizeof(value),
4191                                          &value);
4192        }
4193    }
4194    ALOGE("Invalid AntiBanding value: %s",
4195          (antiBandingStr == NULL) ? "NULL" : antiBandingStr);
4196    return BAD_VALUE;
4197}
4198
4199/*===========================================================================
4200 * FUNCTION   : setFocusAreas
4201 *
4202 * DESCRIPTION: set focus areas
4203 *
4204 * PARAMETERS :
4205 *   @focusAreasStr : focus areas value string
4206 *
4207 * RETURN     : int32_t type of status
4208 *              NO_ERROR  -- success
4209 *              none-zero failure code
4210 *==========================================================================*/
4211int32_t QCameraParameters::setFocusAreas(const char *focusAreasStr)
4212{
4213    if (m_pCapability->max_num_focus_areas == 0 ||
4214        focusAreasStr == NULL) {
4215        ALOGI("%s: Parameter string is null", __func__);
4216        return NO_ERROR;
4217    }
4218
4219    cam_area_t *areas = (cam_area_t *)malloc(sizeof(cam_area_t) * m_pCapability->max_num_focus_areas);
4220    if (NULL == areas) {
4221        ALOGE("%s: No memory for areas", __func__);
4222        return NO_MEMORY;
4223    }
4224    memset(areas, 0, sizeof(cam_area_t) * m_pCapability->max_num_focus_areas);
4225    int num_areas_found = 0;
4226    if (parseCameraAreaString(focusAreasStr,
4227                              m_pCapability->max_num_focus_areas,
4228                              areas,
4229                              num_areas_found) != NO_ERROR) {
4230        ALOGE("%s: Failed to parse the string: %s", __func__, focusAreasStr);
4231        free(areas);
4232        return BAD_VALUE;
4233    }
4234
4235    if (validateCameraAreas(areas, num_areas_found) == false) {
4236        ALOGE("%s: invalid areas specified : %s", __func__, focusAreasStr);
4237        free(areas);
4238        return BAD_VALUE;
4239    }
4240
4241    updateParamEntry(KEY_FOCUS_AREAS, focusAreasStr);
4242
4243    //for special area string (0, 0, 0, 0, 0), set the num_areas_found to 0,
4244    //so no action is takenby the lower layer
4245    if (num_areas_found == 1 &&
4246        areas[0].rect.left == 0 &&
4247        areas[0].rect.top == 0 &&
4248        areas[0].rect.width == 0 &&
4249        areas[0].rect.height == 0 &&
4250        areas[0].weight == 0) {
4251        num_areas_found = 0;
4252    }
4253
4254    int previewWidth, previewHeight;
4255    getPreviewSize(&previewWidth, &previewHeight);
4256    cam_roi_info_t af_roi_value;
4257    memset(&af_roi_value, 0, sizeof(cam_roi_info_t));
4258    af_roi_value.num_roi = num_areas_found;
4259    for (int i = 0; i < num_areas_found; i++) {
4260        ALOGD("%s: FocusArea[%d] = (%d, %d, %d, %d)",
4261              __func__, i, (areas[i].rect.top), (areas[i].rect.left),
4262              (areas[i].rect.width), (areas[i].rect.height));
4263
4264        //transform the coords from (-1000, 1000) to (0, previewWidth or previewHeight)
4265        af_roi_value.roi[i].left = (int32_t)((areas[i].rect.left + 1000.0f) * (previewWidth / 2000.0f));
4266        af_roi_value.roi[i].top = (int32_t)((areas[i].rect.top + 1000.0f) * (previewHeight / 2000.0f));
4267        af_roi_value.roi[i].width = (int32_t)(areas[i].rect.width * previewWidth / 2000.0f);
4268        af_roi_value.roi[i].height = (int32_t)(areas[i].rect.height * previewHeight / 2000.0f);
4269        af_roi_value.weight[i] = areas[i].weight;
4270    }
4271    free(areas);
4272    return AddSetParmEntryToBatch(m_pParamBuf,
4273                                  CAM_INTF_PARM_AF_ROI,
4274                                  sizeof(af_roi_value),
4275                                  &af_roi_value);
4276}
4277
4278/*===========================================================================
4279 * FUNCTION   : setMeteringAreas
4280 *
4281 * DESCRIPTION: set metering areas value
4282 *
4283 * PARAMETERS :
4284 *   @meteringAreasStr : metering areas value string
4285 *
4286 * RETURN     : int32_t type of status
4287 *              NO_ERROR  -- success
4288 *              none-zero failure code
4289 *==========================================================================*/
4290int32_t QCameraParameters::setMeteringAreas(const char *meteringAreasStr)
4291{
4292    if (m_pCapability->max_num_metering_areas == 0 ||
4293        meteringAreasStr == NULL) {
4294        ALOGI("%s: Parameter string is null", __func__);
4295        return NO_ERROR;
4296    }
4297
4298    cam_area_t *areas = (cam_area_t *)malloc(sizeof(cam_area_t) * m_pCapability->max_num_metering_areas);
4299    if (NULL == areas) {
4300        ALOGE("%s: No memory for areas", __func__);
4301        return NO_MEMORY;
4302    }
4303    memset(areas, 0, sizeof(cam_area_t) * m_pCapability->max_num_metering_areas);
4304    int num_areas_found = 0;
4305    if (parseCameraAreaString(meteringAreasStr,
4306                              m_pCapability->max_num_metering_areas,
4307                              areas,
4308                              num_areas_found) < 0) {
4309        ALOGE("%s: Failed to parse the string: %s", __func__, meteringAreasStr);
4310        free(areas);
4311        return BAD_VALUE;
4312    }
4313
4314    if (validateCameraAreas(areas, num_areas_found) == false) {
4315        ALOGE("%s: invalid areas specified : %s", __func__, meteringAreasStr);
4316        free(areas);
4317        return BAD_VALUE;
4318    }
4319
4320    updateParamEntry(KEY_METERING_AREAS, meteringAreasStr);
4321
4322    //for special area string (0, 0, 0, 0, 0), set the num_areas_found to 0,
4323    //so no action is takenby the lower layer
4324    if (num_areas_found == 1 &&
4325        areas[0].rect.left == 0 &&
4326        areas[0].rect.top == 0 &&
4327        areas[0].rect.width == 0 &&
4328        areas[0].rect.height == 0 &&
4329        areas[0].weight == 0) {
4330        num_areas_found = 0;
4331    }
4332    cam_set_aec_roi_t aec_roi_value;
4333    int previewWidth, previewHeight;
4334    getPreviewSize(&previewWidth, &previewHeight);
4335
4336    memset(&aec_roi_value, 0, sizeof(cam_set_aec_roi_t));
4337    if (num_areas_found > 0) {
4338        aec_roi_value.aec_roi_enable = CAM_AEC_ROI_ON;
4339        aec_roi_value.aec_roi_type = CAM_AEC_ROI_BY_COORDINATE;
4340
4341        for (int i = 0; i < num_areas_found; i++) {
4342            ALOGD("%s: MeteringArea[%d] = (%d, %d, %d, %d)",
4343                  __func__, i, (areas[i].rect.top), (areas[i].rect.left),
4344                  (areas[i].rect.width), (areas[i].rect.height));
4345
4346            //transform the coords from (-1000, 1000) to (0, previewWidth or previewHeight)
4347            aec_roi_value.cam_aec_roi_position.coordinate[i].x =
4348                (uint32_t)(((areas[i].rect.left + areas[i].rect.width / 2) + 1000.0f) * previewWidth / 2000.0f) ;
4349            aec_roi_value.cam_aec_roi_position.coordinate[i].y =
4350                (uint32_t)(((areas[i].rect.top + areas[i].rect.height / 2) + 1000.0f) * previewHeight / 2000.0f) ;
4351        }
4352    } else {
4353        aec_roi_value.aec_roi_enable = CAM_AEC_ROI_OFF;
4354    }
4355    free(areas);
4356    return AddSetParmEntryToBatch(m_pParamBuf,
4357                                  CAM_INTF_PARM_AEC_ROI,
4358                                  sizeof(aec_roi_value),
4359                                  &aec_roi_value);
4360}
4361
4362/*===========================================================================
4363 * FUNCTION   : setSceneMode
4364 *
4365 * DESCRIPTION: set scene mode
4366 *
4367 * PARAMETERS :
4368 *   @sceneModeStr : scene mode value string
4369 *
4370 * RETURN     : int32_t type of status
4371 *              NO_ERROR  -- success
4372 *              none-zero failure code
4373 *==========================================================================*/
4374int32_t QCameraParameters::setSceneMode(const char *sceneModeStr)
4375{
4376    if (sceneModeStr != NULL) {
4377        int32_t value = lookupAttr(SCENE_MODES_MAP,
4378                                   sizeof(SCENE_MODES_MAP)/sizeof(QCameraMap),
4379                                   sceneModeStr);
4380        if (value != NAME_NOT_FOUND) {
4381            ALOGV("%s: Setting SceneMode %s", __func__, sceneModeStr);
4382            updateParamEntry(KEY_SCENE_MODE, sceneModeStr);
4383            int32_t rc = AddSetParmEntryToBatch(m_pParamBuf,
4384                                                CAM_INTF_PARM_BESTSHOT_MODE,
4385                                                sizeof(value),
4386                                                &value);
4387            return rc;
4388        }
4389    }
4390    ALOGE("%s: Invalid Secene Mode: %s",
4391          __func__, (sceneModeStr == NULL) ? "NULL" : sceneModeStr);
4392    return BAD_VALUE;
4393}
4394
4395/*===========================================================================
4396 * FUNCTION   : setSelectableZoneAf
4397 *
4398 * DESCRIPTION: set selectable zone AF algorithm
4399 *
4400 * PARAMETERS :
4401 *   @selZoneAFStr : selectable zone AF algorithm value string
4402 *
4403 * RETURN     : int32_t type of status
4404 *              NO_ERROR  -- success
4405 *              none-zero failure code
4406 *==========================================================================*/
4407int32_t QCameraParameters::setSelectableZoneAf(const char *selZoneAFStr)
4408{
4409    if (selZoneAFStr != NULL) {
4410        int32_t value = lookupAttr(FOCUS_ALGO_MAP,
4411                                   sizeof(FOCUS_ALGO_MAP)/sizeof(QCameraMap),
4412                                   selZoneAFStr);
4413        if (value != NAME_NOT_FOUND) {
4414            ALOGV("%s: Setting Selectable Zone AF value %s", __func__, selZoneAFStr);
4415            updateParamEntry(KEY_QC_SELECTABLE_ZONE_AF, selZoneAFStr);
4416            return AddSetParmEntryToBatch(m_pParamBuf,
4417                                          CAM_INTF_PARM_FOCUS_ALGO_TYPE,
4418                                          sizeof(value),
4419                                          &value);
4420        }
4421    }
4422    ALOGE("%s: Invalid selectable zone af value: %s",
4423          __func__, (selZoneAFStr == NULL) ? "NULL" : selZoneAFStr);
4424    return BAD_VALUE;
4425}
4426
4427/*===========================================================================
4428 * FUNCTION   : setAEBracket
4429 *
4430 * DESCRIPTION: set AE bracket value
4431 *
4432 * PARAMETERS :
4433 *   @aecBracketStr : AE bracket value string
4434 *
4435 * RETURN     : int32_t type of status
4436 *              NO_ERROR  -- success
4437 *              none-zero failure code
4438 *==========================================================================*/
4439int32_t QCameraParameters::setAEBracket(const char *aecBracketStr)
4440{
4441    if (aecBracketStr == NULL) {
4442        ALOGI("%s: setAEBracket with NULL value", __func__);
4443        return NO_ERROR;
4444    }
4445
4446    cam_exp_bracketing_t expBracket;
4447    memset(&expBracket, 0, sizeof(expBracket));
4448
4449    int value = lookupAttr(BRACKETING_MODES_MAP,
4450                           sizeof(BRACKETING_MODES_MAP)/sizeof(QCameraMap),
4451                           aecBracketStr);
4452    switch (value) {
4453    case CAM_EXP_BRACKETING_ON:
4454        {
4455            ALOGV("%s, EXP_BRACKETING_ON", __func__);
4456            const char *str_val = get(KEY_QC_CAPTURE_BURST_EXPOSURE);
4457            if ((str_val != NULL) && (strlen(str_val)>0)) {
4458                expBracket.mode = CAM_EXP_BRACKETING_ON;
4459                strlcpy(expBracket.values, str_val, MAX_EXP_BRACKETING_LENGTH);
4460                ALOGI("%s: setting Exposure Bracketing value of %s",
4461                      __func__, expBracket.values);
4462            }
4463            else {
4464                /* Apps not set capture-burst-exposures, error case fall into bracketing off mode */
4465                ALOGI("%s: capture-burst-exposures not set, back to HDR OFF mode", __func__);
4466                expBracket.mode = CAM_EXP_BRACKETING_OFF;
4467            }
4468        }
4469        break;
4470    default:
4471        {
4472            ALOGD("%s, EXP_BRACKETING_OFF", __func__);
4473            expBracket.mode = CAM_EXP_BRACKETING_OFF;
4474        }
4475        break;
4476    }
4477
4478    /* save the value*/
4479    updateParamEntry(KEY_QC_AE_BRACKET_HDR, aecBracketStr);
4480    return AddSetParmEntryToBatch(m_pParamBuf,
4481                                  CAM_INTF_PARM_HDR,
4482                                  sizeof(expBracket),
4483                                  &expBracket);
4484}
4485
4486/*===========================================================================
4487 * FUNCTION   : setRedeyeReduction
4488 *
4489 * DESCRIPTION: set red eye reduction value
4490 *
4491 * PARAMETERS :
4492 *   @redeyeStr : red eye reduction value string
4493 *
4494 * RETURN     : int32_t type of status
4495 *              NO_ERROR  -- success
4496 *              none-zero failure code
4497 *==========================================================================*/
4498int32_t QCameraParameters::setRedeyeReduction(const char *redeyeStr)
4499{
4500    if (redeyeStr != NULL) {
4501        int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
4502                                   sizeof(ENABLE_DISABLE_MODES_MAP)/sizeof(QCameraMap),
4503                                   redeyeStr);
4504        if (value != NAME_NOT_FOUND) {
4505            ALOGV("%s: Setting RedEye Reduce value %s", __func__, redeyeStr);
4506            updateParamEntry(KEY_QC_REDEYE_REDUCTION, redeyeStr);
4507            return AddSetParmEntryToBatch(m_pParamBuf,
4508                                          CAM_INTF_PARM_REDEYE_REDUCTION,
4509                                          sizeof(value),
4510                                          &value);
4511        }
4512    }
4513    ALOGE("%s: Invalid RedEye Reduce value: %s",
4514          __func__, (redeyeStr == NULL) ? "NULL" : redeyeStr);
4515    return BAD_VALUE;
4516}
4517
4518/*===========================================================================
4519 * FUNCTION   : getWaveletDenoiseProcessPlate
4520 *
4521 * DESCRIPTION: query wavelet denoise process plate
4522 *
4523 * PARAMETERS : None
4524 *
4525 * RETURN     : WNR prcocess plate vlaue
4526 *==========================================================================*/
4527cam_denoise_process_type_t QCameraParameters::getWaveletDenoiseProcessPlate()
4528{
4529    char prop[PROPERTY_VALUE_MAX];
4530    memset(prop, 0, sizeof(prop));
4531    property_get("persist.denoise.process.plates", prop, "0");
4532    int processPlate = atoi(prop);
4533    switch(processPlate) {
4534    case 0:
4535        return CAM_WAVELET_DENOISE_YCBCR_PLANE;
4536    case 1:
4537        return CAM_WAVELET_DENOISE_CBCR_ONLY;
4538    case 2:
4539        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
4540    case 3:
4541        return CAM_WAVELET_DENOISE_STREAMLINED_CBCR;
4542    default:
4543        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
4544    }
4545}
4546
4547/*===========================================================================
4548 * FUNCTION   : setWaveletDenoise
4549 *
4550 * DESCRIPTION: set wavelet denoise value
4551 *
4552 * PARAMETERS :
4553 *   @wnrStr : wavelet denoise value string
4554 *
4555 * RETURN     : int32_t type of status
4556 *              NO_ERROR  -- success
4557 *              none-zero failure code
4558 *==========================================================================*/
4559int32_t QCameraParameters::setWaveletDenoise(const char *wnrStr)
4560{
4561    if (wnrStr != NULL) {
4562        int value = lookupAttr(DENOISE_ON_OFF_MODES_MAP,
4563                               sizeof(DENOISE_ON_OFF_MODES_MAP)/sizeof(QCameraMap),
4564                               wnrStr);
4565        if (value != NAME_NOT_FOUND) {
4566            updateParamEntry(KEY_QC_DENOISE, wnrStr);
4567
4568            cam_denoise_param_t temp;
4569            memset(&temp, 0, sizeof(temp));
4570            temp.denoise_enable = value;
4571            m_bWNROn = (value != 0);
4572            if (m_bWNROn) {
4573                temp.process_plates = getWaveletDenoiseProcessPlate();
4574            }
4575            ALOGI("%s: Denoise enable=%d, plates=%d",
4576                  __func__, temp.denoise_enable, temp.process_plates);
4577            return AddSetParmEntryToBatch(m_pParamBuf,
4578                                          CAM_INTF_PARM_WAVELET_DENOISE,
4579                                          sizeof(temp),
4580                                          &temp);
4581        }
4582    }
4583    ALOGE("%s: Invalid Denoise value: %s", __func__, (wnrStr == NULL) ? "NULL" : wnrStr);
4584    return BAD_VALUE;
4585}
4586
4587/*===========================================================================
4588 * FUNCTION   : setPreviewFrameRateMode
4589 *
4590 * DESCRIPTION: set preview frame rate mode
4591 *
4592 * PARAMETERS :
4593 *   @mode    : preview frame rate mode
4594 *
4595 * RETURN     : none
4596 *==========================================================================*/
4597void QCameraParameters::setPreviewFrameRateMode(const char *mode)
4598{
4599    set(KEY_QC_PREVIEW_FRAME_RATE_MODE, mode);
4600}
4601
4602/*===========================================================================
4603 * FUNCTION   : getPreviewFrameRateMode
4604 *
4605 * DESCRIPTION: get preview frame rate mode
4606 *
4607 * PARAMETERS : none
4608 *
4609 * RETURN     : preview frame rate mode string
4610 *==========================================================================*/
4611const char *QCameraParameters::getPreviewFrameRateMode() const
4612{
4613    return get(KEY_QC_PREVIEW_FRAME_RATE_MODE);
4614}
4615
4616/*===========================================================================
4617 * FUNCTION   : setTouchIndexAec
4618 *
4619 * DESCRIPTION: set touch index AEC
4620 *
4621 * PARAMETERS :
4622 *   @x,y     :
4623 *
4624 * RETURN     : none
4625 *==========================================================================*/
4626void QCameraParameters::setTouchIndexAec(int x, int y)
4627{
4628    char str[32];
4629    snprintf(str, sizeof(str), "%dx%d", x, y);
4630    set(KEY_QC_TOUCH_INDEX_AEC, str);
4631}
4632
4633/*===========================================================================
4634 * FUNCTION   : getTouchIndexAec
4635 *
4636 * DESCRIPTION: get touch index AEC
4637 *
4638 * PARAMETERS :
4639 *   @x,y     :
4640 *
4641 * RETURN     : none
4642 *==========================================================================*/
4643void QCameraParameters::getTouchIndexAec(int *x, int *y)
4644{
4645    *x = -1;
4646    *y = -1;
4647
4648    // Get the current string, if it doesn't exist, leave the -1x-1
4649    const char *p = get(KEY_QC_TOUCH_INDEX_AEC);
4650    if (p == 0)
4651        return;
4652
4653    int tempX, tempY;
4654    if (parse_pair(p, &tempX, &tempY, 'x') == 0) {
4655        *x = tempX;
4656        *y = tempY;
4657    }
4658}
4659
4660/*===========================================================================
4661 * FUNCTION   : setTouchIndexAf
4662 *
4663 * DESCRIPTION: set touch index AF
4664 *
4665 * PARAMETERS :
4666 *   @x,y     :
4667 *
4668 * RETURN     : none
4669 *==========================================================================*/
4670void QCameraParameters::setTouchIndexAf(int x, int y)
4671{
4672    char str[32];
4673    snprintf(str, sizeof(str), "%dx%d", x, y);
4674    set(KEY_QC_TOUCH_INDEX_AF, str);
4675}
4676
4677/*===========================================================================
4678 * FUNCTION   : getTouchIndexAf
4679 *
4680 * DESCRIPTION: get touch index AF
4681 *
4682 * PARAMETERS :
4683 *   @x,y     :
4684 *
4685 * RETURN     : none
4686 *==========================================================================*/
4687void QCameraParameters::getTouchIndexAf(int *x, int *y)
4688{
4689    *x = -1;
4690    *y = -1;
4691
4692    // Get the current string, if it doesn't exist, leave the -1x-1
4693    const char *p = get(KEY_QC_TOUCH_INDEX_AF);
4694    if (p == 0)
4695        return;
4696
4697    int tempX, tempY;
4698    if (parse_pair(p, &tempX, &tempY, 'x') == 0) {
4699        *x = tempX;
4700        *y = tempY;
4701	}
4702}
4703
4704/*===========================================================================
4705 * FUNCTION   : getStreamFormat
4706 *
4707 * DESCRIPTION: get stream format by its type
4708 *
4709 * PARAMETERS :
4710 *   @streamType : [input] stream type
4711 *   @format     : [output] stream format
4712 *
4713 * RETURN     : int32_t type of status
4714 *              NO_ERROR  -- success
4715 *              none-zero failure code
4716 *==========================================================================*/
4717int32_t QCameraParameters::getStreamFormat(cam_stream_type_t streamType,
4718                                            cam_format_t &format)
4719{
4720    int32_t ret = NO_ERROR;
4721
4722    format = CAM_FORMAT_MAX;
4723    switch (streamType) {
4724    case CAM_STREAM_TYPE_PREVIEW:
4725    case CAM_STREAM_TYPE_POSTVIEW:
4726        format = mPreviewFormat;
4727        break;
4728    case CAM_STREAM_TYPE_SNAPSHOT:
4729        format = CAM_FORMAT_YUV_420_NV21;
4730        break;
4731    case CAM_STREAM_TYPE_VIDEO:
4732        format = CAM_FORMAT_YUV_420_NV12;
4733        break;
4734    case CAM_STREAM_TYPE_RAW:
4735        if (mPictureFormat >= CAM_FORMAT_YUV_RAW_8BIT_YUYV) {
4736            format = (cam_format_t)mPictureFormat;
4737        } else {
4738            ALOGE("%s: invalid raw picture format: %d", __func__, mPictureFormat);
4739            ret = BAD_VALUE;
4740        }
4741        break;
4742    case CAM_STREAM_TYPE_METADATA:
4743    case CAM_STREAM_TYPE_OFFLINE_PROC:
4744    case CAM_STREAM_TYPE_DEFAULT:
4745    default:
4746        break;
4747    }
4748
4749    return ret;
4750}
4751
4752/*===========================================================================
4753 * FUNCTION   : getFlipMode
4754 *
4755 * DESCRIPTION: get flip mode
4756 *
4757 * PARAMETERS :
4758 *   @cam_intf_parm_type_t : [input] stream type
4759 *
4760 * RETURN     : int type of flip mode
4761 *              0 - no filp
4762 *              1 - FLIP_H
4763 *              2 - FLIP_V
4764 *              3 - FLIP_H | FLIP_V
4765 *==========================================================================*/
4766int QCameraParameters::getFlipMode(cam_stream_type_t type)
4767{
4768    const char *str = NULL;
4769    int flipMode = 0; // no flip
4770
4771    switch(type){
4772    case CAM_STREAM_TYPE_PREVIEW:
4773        str = get(KEY_QC_PREVIEW_FLIP);
4774        break;
4775    case CAM_STREAM_TYPE_VIDEO:
4776        str = get(KEY_QC_VIDEO_FLIP);
4777        break;
4778    case CAM_STREAM_TYPE_SNAPSHOT:
4779        str = get(KEY_QC_SNAPSHOT_PICTURE_FLIP);
4780        break;
4781    default:
4782        ALOGI("%s: No flip mode for stream type %d", __func__, type);
4783        break;
4784    }
4785
4786    if(str != NULL){
4787        //Need give corresponding filp value based on flip mode strings
4788        int value = lookupAttr(FLIP_MODES_MAP,
4789                sizeof(FLIP_MODES_MAP)/sizeof(QCameraMap), str);
4790        if(value != NAME_NOT_FOUND)
4791            flipMode = value;
4792        }
4793
4794    ALOGD("%s: the filp mode of stream type %d is %d .", __func__, type, flipMode);
4795    return flipMode;
4796}
4797
4798/*===========================================================================
4799 * FUNCTION   : getStreamDimension
4800 *
4801 * DESCRIPTION: get stream dimension by its type
4802 *
4803 * PARAMETERS :
4804 *   @streamType : [input] stream type
4805 *   @dim        : [output] stream dimension
4806 *
4807 * RETURN     : int32_t type of status
4808 *              NO_ERROR  -- success
4809 *              none-zero failure code
4810 *==========================================================================*/
4811int32_t QCameraParameters::getStreamDimension(cam_stream_type_t streamType,
4812                                               cam_dimension_t &dim)
4813{
4814    int32_t ret = NO_ERROR;
4815
4816    memset(&dim, 0, sizeof(cam_dimension_t));
4817
4818    switch (streamType) {
4819    case CAM_STREAM_TYPE_PREVIEW:
4820        getPreviewSize(&dim.width, &dim.height);
4821        break;
4822    case CAM_STREAM_TYPE_POSTVIEW:
4823        getPreviewSize(&dim.width, &dim.height);
4824        break;
4825    case CAM_STREAM_TYPE_SNAPSHOT:
4826        if (getRecordingHintValue() == true) {
4827            // live snapshot
4828            getLiveSnapshotSize(dim);
4829        } else {
4830            getPictureSize(&dim.width, &dim.height);
4831        }
4832        break;
4833    case CAM_STREAM_TYPE_VIDEO:
4834        getVideoSize(&dim.width, &dim.height);
4835        break;
4836    case CAM_STREAM_TYPE_RAW:
4837        dim = m_pCapability->raw_dim;
4838        break;
4839    case CAM_STREAM_TYPE_METADATA:
4840        dim.width = sizeof(cam_metadata_info_t);
4841        dim.height = 1;
4842        break;
4843    case CAM_STREAM_TYPE_OFFLINE_PROC:
4844        break;
4845    case CAM_STREAM_TYPE_DEFAULT:
4846    default:
4847        ALOGE("%s: no dimension for unsupported stream type %d",
4848              __func__, streamType);
4849        ret = BAD_VALUE;
4850        break;
4851    }
4852    return ret;
4853}
4854
4855/*===========================================================================
4856 * FUNCTION   : getPreviewHalPixelFormat
4857 *
4858 * DESCRIPTION: get preview HAL pixel format
4859 *
4860 * PARAMETERS : none
4861 *
4862 * RETURN     : HAL pixel format
4863 *==========================================================================*/
4864int QCameraParameters::getPreviewHalPixelFormat() const
4865{
4866    int32_t halPixelFormat;
4867
4868    switch (mPreviewFormat) {
4869    case CAM_FORMAT_YUV_420_NV12:
4870        halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
4871        break;
4872    case CAM_FORMAT_YUV_420_NV21:
4873        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
4874        break;
4875    case CAM_FORMAT_YUV_420_NV21_ADRENO:
4876        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
4877        break;
4878    case CAM_FORMAT_YUV_420_YV12:
4879        halPixelFormat = HAL_PIXEL_FORMAT_YV12;
4880        break;
4881    case CAM_FORMAT_YUV_422_NV16:
4882    case CAM_FORMAT_YUV_422_NV61:
4883    default:
4884        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
4885        break;
4886    }
4887    ALOGE("%s: format %d\n", __func__, halPixelFormat);
4888    return halPixelFormat;
4889}
4890
4891/*===========================================================================
4892 * FUNCTION   : getthumbnailSize
4893 *
4894 * DESCRIPTION: get thumbnail size
4895 *
4896 * PARAMETERS :
4897 *   @width, height : [output] thumbnail width and height
4898 *
4899 * RETURN     : none
4900 *==========================================================================*/
4901void QCameraParameters::getThumbnailSize(int *width, int *height) const
4902{
4903    *width = getInt(KEY_JPEG_THUMBNAIL_WIDTH);
4904    *height = getInt(KEY_JPEG_THUMBNAIL_HEIGHT);
4905}
4906
4907/*===========================================================================
4908 * FUNCTION   : getZSLBurstInterval
4909 *
4910 * DESCRIPTION: get ZSL burst interval setting
4911 *
4912 * PARAMETERS : none
4913 *
4914 * RETURN     : ZSL burst interval value
4915 *==========================================================================*/
4916int QCameraParameters::getZSLBurstInterval()
4917{
4918    int interval = getInt(KEY_QC_ZSL_BURST_INTERVAL);
4919    if (interval < 0) {
4920        interval = 1;
4921    }
4922    return interval;
4923}
4924
4925/*===========================================================================
4926 * FUNCTION   : getZSLQueueDepth
4927 *
4928 * DESCRIPTION: get ZSL queue depth
4929 *
4930 * PARAMETERS : none
4931 *
4932 * RETURN     : ZSL queue depth value
4933 *==========================================================================*/
4934int QCameraParameters::getZSLQueueDepth()
4935{
4936    int qdepth = getInt(KEY_QC_ZSL_QUEUE_DEPTH);
4937    if (qdepth < 0) {
4938        qdepth = 2;
4939    }
4940    return qdepth;
4941}
4942
4943/*===========================================================================
4944 * FUNCTION   : getZSLBackLookCount
4945 *
4946 * DESCRIPTION: get ZSL backlook count setting
4947 *
4948 * PARAMETERS : none
4949 *
4950 * RETURN     : ZSL backlook count value
4951 *==========================================================================*/
4952int QCameraParameters::getZSLBackLookCount()
4953{
4954    int look_back = getInt(KEY_QC_ZSL_BURST_LOOKBACK);
4955    if (look_back < 0) {
4956        look_back = 2;
4957    }
4958    return look_back;
4959}
4960
4961/*===========================================================================
4962 * FUNCTION   : getZSLMaxUnmatchedFrames
4963 *
4964 * DESCRIPTION: get allowed ZSL max unmatched frames number
4965 *
4966 * PARAMETERS : none
4967 *
4968 * RETURN     : ZSL backlook count value
4969 *==========================================================================*/
4970int QCameraParameters::getMaxUnmatchedFramesInQueue()
4971{
4972    return m_pCapability->min_num_pp_bufs;
4973}
4974
4975/*===========================================================================
4976 * FUNCTION   : setRecordingHintValue
4977 *
4978 * DESCRIPTION: set recording hint
4979 *
4980 * PARAMETERS :
4981 *   @value   : video hint value
4982 *
4983 * RETURN     : int32_t type of status
4984 *              NO_ERROR  -- success
4985 *              none-zero failure code
4986 *==========================================================================*/
4987int QCameraParameters::setRecordingHintValue(int32_t value)
4988{
4989    ALOGD("%s: VideoHint = %d", __func__, value);
4990    m_bRecordingHint = (value > 0)? true : false;
4991    return AddSetParmEntryToBatch(m_pParamBuf,
4992                                  CAM_INTF_PARM_RECORDING_HINT,
4993                                  sizeof(value),
4994                                  &value);
4995}
4996
4997/*===========================================================================
4998 * FUNCTION   : getNumOfSnapshots
4999 *
5000 * DESCRIPTION: get number of snapshot per shutter
5001 *
5002 * PARAMETERS : none
5003 *
5004 * RETURN     : number of snapshot per shutter
5005 *==========================================================================*/
5006uint8_t QCameraParameters::getNumOfSnapshots()
5007{
5008    int numOfSnapshot = getInt(KEY_QC_NUM_SNAPSHOT_PER_SHUTTER);
5009    if (numOfSnapshot <= 0) {
5010        numOfSnapshot = 1; // set to default value
5011    }
5012    return (uint8_t)numOfSnapshot;
5013}
5014
5015/*===========================================================================
5016 * FUNCTION   : getNumOfExtraHDRBufsIfNeeded
5017 *
5018 * DESCRIPTION: get number of extra buffers needed by HDR if HDR is enabled
5019 *
5020 * PARAMETERS : none
5021 *
5022 * RETURN     : number of extra buffer needed by HDR; 0 if not HDR enabled
5023 *==========================================================================*/
5024uint8_t QCameraParameters::getNumOfExtraHDRBufsIfNeeded()
5025{
5026    uint8_t numOfBufs = 0;
5027    const char *scene_mode = get(KEY_SCENE_MODE);
5028    if (scene_mode != NULL && strcmp(scene_mode, SCENE_MODE_HDR) == 0) {
5029        // HDR mode
5030        numOfBufs = getBurstNum() * m_pCapability->min_num_hdr_bufs;
5031    }
5032    return numOfBufs;
5033}
5034
5035/*===========================================================================
5036 * FUNCTION   : getNumOfHDRBufsIfNeeded
5037 *
5038 * DESCRIPTION: get number of buffers needed by HDR if HDR is enabled
5039 *
5040 * PARAMETERS : none
5041 *
5042 * RETURN     : number of buffer needed by HDR; 0 if not HDR enabled
5043 *==========================================================================*/
5044uint8_t QCameraParameters::getNumOfHDRBufsIfNeeded()
5045{
5046    uint8_t numOfBufs = 0;
5047    const char *scene_mode = get(KEY_SCENE_MODE);
5048    if (scene_mode != NULL && strcmp(scene_mode, SCENE_MODE_HDR) == 0) {
5049        // HDR mode
5050        const char *need_hdr_1x = get(KEY_QC_HDR_NEED_1X);
5051        if (need_hdr_1x != NULL && strcmp(need_hdr_1x, VALUE_TRUE) == 0) {
5052            numOfBufs = 2; // HDR needs both 1X and processed img
5053        } else {
5054            numOfBufs = 1; // HDR only needs processed img
5055        }
5056
5057        numOfBufs += m_pCapability->min_num_hdr_bufs;
5058    }
5059    return numOfBufs;
5060}
5061
5062/*===========================================================================
5063 * FUNCTION   : getBurstNum
5064 *
5065 * DESCRIPTION: get burst number of snapshot
5066 *
5067 * PARAMETERS : none
5068 *
5069 * RETURN     : number of burst
5070 *==========================================================================*/
5071int QCameraParameters::getBurstNum()
5072{
5073    char prop[PROPERTY_VALUE_MAX];
5074    memset(prop, 0, sizeof(prop));
5075    property_get("persist.camera.snapshot.number", prop, "0");
5076    int nBurstNum = atoi(prop);
5077    if (nBurstNum > 0) {
5078        ALOGD("%s: Reading burst number = %d from properties",
5079              __func__, nBurstNum);
5080    } else {
5081        nBurstNum = 1;
5082    }
5083    return nBurstNum;
5084}
5085
5086/*===========================================================================
5087 * FUNCTION   : getJpegQuality
5088 *
5089 * DESCRIPTION: get jpeg encoding quality
5090 *
5091 * PARAMETERS : none
5092 *
5093 * RETURN     : jpeg encoding quality
5094 *==========================================================================*/
5095int QCameraParameters::getJpegQuality()
5096{
5097    int quality = getInt(KEY_JPEG_QUALITY);
5098    if (quality < 0) {
5099        quality = 85; // set to default quality value
5100    }
5101    return quality;
5102}
5103
5104/*===========================================================================
5105 * FUNCTION   : getJpegRotation
5106 *
5107 * DESCRIPTION: get rotation value
5108 *
5109 * PARAMETERS : none
5110 *
5111 * RETURN     : rotation value
5112 *==========================================================================*/
5113int QCameraParameters::getJpegRotation() {
5114    int rotation = getInt(KEY_ROTATION);
5115    if (rotation < 0) {
5116        rotation = 0;
5117    }
5118    return rotation;
5119}
5120
5121/*===========================================================================
5122 * FUNCTION   : parseGPSCoordinate
5123 *
5124 * DESCRIPTION: parse GPS coordinate string
5125 *
5126 * PARAMETERS :
5127 *   @coord_str : [input] coordinate string
5128 *   @coord     : [output]  ptr to struct to store coordinate
5129 *
5130 * RETURN     : int32_t type of status
5131 *              NO_ERROR  -- success
5132 *              none-zero failure code
5133 *==========================================================================*/
5134int QCameraParameters::parseGPSCoordinate(const char *coord_str, rat_t* coord)
5135{
5136    if(coord == NULL) {
5137        ALOGE("%s: error, invalid argument coord == NULL", __func__);
5138        return BAD_VALUE;
5139    }
5140    float degF = atof(coord_str);
5141    if (degF < 0) {
5142        degF = -degF;
5143    }
5144    float minF = (degF - (int) degF) * 60;
5145    float secF = (minF - (int) minF) * 60;
5146
5147    getRational(&coord[0], (int)degF, 1);
5148    getRational(&coord[1], (int)minF, 1);
5149    getRational(&coord[2], (int)(secF * 10000), 10000);
5150    return NO_ERROR;
5151}
5152
5153/*===========================================================================
5154 * FUNCTION   : getExifDateTime
5155 *
5156 * DESCRIPTION: query exif date time
5157 *
5158 * PARAMETERS :
5159 *   @dateTime : string to store exif date time
5160 *   @count    : lenght of the dateTime string
5161 *
5162 * RETURN     : int32_t type of status
5163 *              NO_ERROR  -- success
5164 *              none-zero failure code
5165 *==========================================================================*/
5166int32_t QCameraParameters::getExifDateTime(char *dateTime, uint32_t &count)
5167{
5168    //get time and date from system
5169    time_t rawtime;
5170    struct tm * timeinfo;
5171    time(&rawtime);
5172    timeinfo = localtime (&rawtime);
5173    //Write datetime according to EXIF Spec
5174    //"YYYY:MM:DD HH:MM:SS" (20 chars including \0)
5175    snprintf(dateTime, 20, "%04d:%02d:%02d %02d:%02d:%02d",
5176             timeinfo->tm_year + 1900, timeinfo->tm_mon + 1,
5177             timeinfo->tm_mday, timeinfo->tm_hour,
5178             timeinfo->tm_min, timeinfo->tm_sec);
5179    count = 20;
5180
5181    return NO_ERROR;
5182}
5183
5184/*===========================================================================
5185 * FUNCTION   : getRational
5186 *
5187 * DESCRIPTION: compose rational struct
5188 *
5189 * PARAMETERS :
5190 *   @rat     : ptr to struct to store rational info
5191 *   @num     :num of the rational
5192 *   @denom   : denom of the rational
5193 *
5194 * RETURN     : int32_t type of status
5195 *              NO_ERROR  -- success
5196 *              none-zero failure code
5197 *==========================================================================*/
5198int32_t QCameraParameters::getRational(rat_t *rat, int num, int denom)
5199{
5200    if (NULL == rat) {
5201        ALOGE("%s: NULL rat input", __func__);
5202        return BAD_VALUE;
5203    }
5204    rat->num = num;
5205    rat->denom = denom;
5206    return NO_ERROR;
5207}
5208
5209/*===========================================================================
5210 * FUNCTION   : getExifFocalLength
5211 *
5212 * DESCRIPTION: get exif focal lenght
5213 *
5214 * PARAMETERS :
5215 *   @focalLength : ptr to rational strcut to store focal lenght
5216 *
5217 * RETURN     : int32_t type of status
5218 *              NO_ERROR  -- success
5219 *              none-zero failure code
5220 *==========================================================================*/
5221int32_t QCameraParameters::getExifFocalLength(rat_t *focalLength)
5222{
5223    int focalLengthValue =
5224        (int)(getFloat(QCameraParameters::KEY_FOCAL_LENGTH) * FOCAL_LENGTH_DECIMAL_PRECISION);
5225    return getRational(focalLength, focalLengthValue, FOCAL_LENGTH_DECIMAL_PRECISION);
5226}
5227
5228/*===========================================================================
5229 * FUNCTION   : getExifIsoSpeed
5230 *
5231 * DESCRIPTION: get exif ISO speed
5232 *
5233 * PARAMETERS : none
5234 *
5235 * RETURN     : ISO speed value
5236 *==========================================================================*/
5237uint16_t QCameraParameters::getExifIsoSpeed()
5238{
5239    uint16_t isoSpeed = 0;
5240    const char *iso_str = get(QCameraParameters::KEY_QC_ISO_MODE);
5241    int iso_index = lookupAttr(ISO_MODES_MAP,
5242        sizeof(ISO_MODES_MAP)/sizeof(ISO_MODES_MAP[0]), iso_str);
5243    switch (iso_index) {
5244    case CAM_ISO_MODE_AUTO:
5245        isoSpeed = 0;
5246        break;
5247    case CAM_ISO_MODE_DEBLUR:
5248        isoSpeed = 1;
5249        break;
5250    case CAM_ISO_MODE_100:
5251        isoSpeed = 100;
5252        break;
5253    case CAM_ISO_MODE_200:
5254        isoSpeed = 200;
5255        break;
5256    case CAM_ISO_MODE_400:
5257        isoSpeed = 400;
5258        break;
5259    case CAM_ISO_MODE_800:
5260        isoSpeed = 800;
5261        break;
5262    case CAM_ISO_MODE_1600:
5263        isoSpeed = 1600;
5264        break;
5265    }
5266    return isoSpeed;
5267}
5268
5269/*===========================================================================
5270 * FUNCTION   : getExifGpsProcessingMethod
5271 *
5272 * DESCRIPTION: get GPS processing method
5273 *
5274 * PARAMETERS :
5275 *   @gpsProcessingMethod : string to store GPS process method
5276 *   @count               : lenght of the string
5277 *
5278 * RETURN     : int32_t type of status
5279 *              NO_ERROR  -- success
5280 *              none-zero failure code
5281 *==========================================================================*/
5282int32_t QCameraParameters::getExifGpsProcessingMethod(char *gpsProcessingMethod,
5283                                                      uint32_t &count)
5284{
5285    const char *str = get(KEY_GPS_PROCESSING_METHOD);
5286    if(str != NULL) {
5287        memcpy(gpsProcessingMethod, ExifAsciiPrefix, EXIF_ASCII_PREFIX_SIZE);
5288        count = EXIF_ASCII_PREFIX_SIZE;
5289        strncpy(gpsProcessingMethod + EXIF_ASCII_PREFIX_SIZE, str, strlen(str));
5290        count += strlen(str);
5291        gpsProcessingMethod[count++] = '\0'; // increase 1 for the last NULL char
5292        return NO_ERROR;
5293    } else {
5294        return BAD_VALUE;
5295    }
5296}
5297
5298/*===========================================================================
5299 * FUNCTION   : getExifLatitude
5300 *
5301 * DESCRIPTION: get exif latitude
5302 *
5303 * PARAMETERS :
5304 *   @latitude : ptr to rational struct to store latitude info
5305 *   @ladRef   : charater to indicate latitude reference
5306 *
5307 * RETURN     : int32_t type of status
5308 *              NO_ERROR  -- success
5309 *              none-zero failure code
5310 *==========================================================================*/
5311int32_t QCameraParameters::getExifLatitude(rat_t *latitude,
5312                                           char *latRef)
5313{
5314    const char *str = get(KEY_GPS_LATITUDE);
5315    if(str != NULL) {
5316        parseGPSCoordinate(str, latitude);
5317
5318        //set Latitude Ref
5319        float latitudeValue = getFloat(KEY_GPS_LATITUDE);
5320        if(latitudeValue < 0.0f) {
5321            latRef[0] = 'S';
5322        } else {
5323            latRef[0] = 'N';
5324        }
5325        latRef[1] = '\0';
5326        return NO_ERROR;
5327    }else{
5328        return BAD_VALUE;
5329    }
5330}
5331
5332/*===========================================================================
5333 * FUNCTION   : getExifLongitude
5334 *
5335 * DESCRIPTION: get exif longitude
5336 *
5337 * PARAMETERS :
5338 *   @longitude : ptr to rational struct to store longitude info
5339 *   @lonRef    : charater to indicate longitude reference
5340 *
5341 * RETURN     : int32_t type of status
5342 *              NO_ERROR  -- success
5343 *              none-zero failure code
5344 *==========================================================================*/
5345int32_t QCameraParameters::getExifLongitude(rat_t *longitude,
5346                                            char *lonRef)
5347{
5348    const char *str = get(KEY_GPS_LONGITUDE);
5349    if(str != NULL) {
5350        parseGPSCoordinate(str, longitude);
5351
5352        //set Longitude Ref
5353        float longitudeValue = getFloat(KEY_GPS_LONGITUDE);
5354        if(longitudeValue < 0.0f) {
5355            lonRef[0] = 'W';
5356        } else {
5357            lonRef[0] = 'E';
5358        }
5359        lonRef[1] = '\0';
5360        return NO_ERROR;
5361    }else{
5362        return BAD_VALUE;
5363    }
5364}
5365
5366/*===========================================================================
5367 * FUNCTION   : getExifAltitude
5368 *
5369 * DESCRIPTION: get exif altitude
5370 *
5371 * PARAMETERS :
5372 *   @altitude : ptr to rational struct to store altitude info
5373 *   @altRef   : charater to indicate altitude reference
5374 *
5375 * RETURN     : int32_t type of status
5376 *              NO_ERROR  -- success
5377 *              none-zero failure code
5378 *==========================================================================*/
5379int32_t QCameraParameters::getExifAltitude(rat_t *altitude,
5380                                           char *altRef)
5381{
5382    const char *str = get(KEY_GPS_ALTITUDE);
5383    if(str != NULL) {
5384        double value = atof(str);
5385        *altRef = 0;
5386        if(value < 0){
5387            *altRef = 1;
5388            value = -value;
5389        }
5390        return getRational(altitude, value*1000, 1000);
5391    }else{
5392        return BAD_VALUE;
5393    }
5394}
5395
5396/*===========================================================================
5397 * FUNCTION   : getExifGpsDateTimeStamp
5398 *
5399 * DESCRIPTION: get exif GPS date time stamp
5400 *
5401 * PARAMETERS :
5402 *   @gpsDateStamp : GPS date time stamp string
5403 *   @bufLen       : length of the string
5404 *   @gpsTimeStamp : ptr to rational struct to store time stamp info
5405 *
5406 * RETURN     : int32_t type of status
5407 *              NO_ERROR  -- success
5408 *              none-zero failure code
5409 *==========================================================================*/
5410int32_t QCameraParameters::getExifGpsDateTimeStamp(char *gpsDateStamp,
5411                                                   uint32_t bufLen,
5412                                                   rat_t *gpsTimeStamp)
5413{
5414    const char *str = get(KEY_GPS_TIMESTAMP);
5415    if(str != NULL) {
5416        time_t unixTime = (time_t)atol(str);
5417        struct tm *UTCTimestamp = gmtime(&unixTime);
5418
5419        strftime(gpsDateStamp, bufLen, "%Y:%m:%d", UTCTimestamp);
5420
5421        getRational(&gpsTimeStamp[0], UTCTimestamp->tm_hour, 1);
5422        getRational(&gpsTimeStamp[1], UTCTimestamp->tm_min, 1);
5423        getRational(&gpsTimeStamp[2], UTCTimestamp->tm_sec, 1);
5424
5425        return NO_ERROR;
5426    } else {
5427        return BAD_VALUE;
5428    }
5429}
5430
5431/*===========================================================================
5432 * FUNCTION   : updateFocusDistances
5433 *
5434 * DESCRIPTION: update focus distances
5435 *
5436 * PARAMETERS :
5437 *   @focusDistances : ptr to focus distance info
5438 *
5439 * RETURN     : int32_t type of status
5440 *              NO_ERROR  -- success
5441 *              none-zero failure code
5442 *==========================================================================*/
5443int32_t QCameraParameters::updateFocusDistances(cam_focus_distances_info_t *focusDistances)
5444{
5445    String8 str;
5446    char buffer[32] = {0};
5447    //set all distances to infinity if focus mode is infinity
5448    if(mFocusMode == CAM_FOCUS_MODE_INFINITY) {
5449        str.append("Infinity,Infinity,Infinity");
5450    } else {
5451        snprintf(buffer, sizeof(buffer), "%f", focusDistances->focus_distance[0]);
5452        str.append(buffer);
5453        snprintf(buffer, sizeof(buffer), ",%f", focusDistances->focus_distance[1]);
5454        str.append(buffer);
5455        snprintf(buffer, sizeof(buffer), ",%f", focusDistances->focus_distance[2]);
5456        str.append(buffer);
5457    }
5458    ALOGD("%s: setting KEY_FOCUS_DISTANCES as %s", __FUNCTION__, str.string());
5459    set(QCameraParameters::KEY_FOCUS_DISTANCES, str.string());
5460    return NO_ERROR;
5461}
5462
5463/*===========================================================================
5464 * FUNCTION   : setHistogram
5465 *
5466 * DESCRIPTION: set histogram
5467 *
5468 * PARAMETERS :
5469 *   @enabled : if histogram is enabled
5470 *
5471 * RETURN     : int32_t type of status
5472 *              NO_ERROR  -- success
5473 *              none-zero failure code
5474 *==========================================================================*/
5475int32_t QCameraParameters::setHistogram(bool enabled)
5476{
5477    if(m_bHistogramEnabled == enabled) {
5478        ALOGD("%s: histogram flag not changed, no ops here", __func__);
5479        return NO_ERROR;
5480    }
5481
5482    // set parm for histogram
5483    if(initBatchUpdate(m_pParamBuf) < 0 ) {
5484        ALOGE("%s:Failed to initialize group update table", __func__);
5485        return BAD_TYPE;
5486    }
5487
5488    int32_t value = enabled;
5489    int32_t rc = NO_ERROR;
5490    rc = AddSetParmEntryToBatch(m_pParamBuf,
5491                                CAM_INTF_PARM_HISTOGRAM,
5492                                sizeof(value),
5493                                &value);
5494    if (rc != NO_ERROR) {
5495        ALOGE("%s:Failed to update table", __func__);
5496        return rc;
5497    }
5498
5499    rc = commitSetBatch();
5500    if (rc != NO_ERROR) {
5501        ALOGE("%s:Failed to set histogram", __func__);
5502        return rc;
5503    }
5504
5505    m_bHistogramEnabled = enabled;
5506
5507    ALOGD(" Histogram -> %s", m_bHistogramEnabled ? "Enabled" : "Disabled");
5508
5509    return rc;
5510}
5511
5512/*===========================================================================
5513 * FUNCTION   : setFaceDetection
5514 *
5515 * DESCRIPTION: set face detection
5516 *
5517 * PARAMETERS :
5518 *   @enabled : if face detection is enabled
5519 *
5520 * RETURN     : int32_t type of status
5521 *              NO_ERROR  -- success
5522 *              none-zero failure code
5523 *==========================================================================*/
5524int32_t QCameraParameters::setFaceDetection(bool enabled)
5525{
5526    int faceProcMask = m_nFaceProcMask;
5527    // set face detection mask
5528    if (enabled) {
5529        faceProcMask |= CAM_FACE_PROCESS_MASK_DETECTION;
5530    } else {
5531        faceProcMask &= ~CAM_FACE_PROCESS_MASK_DETECTION;
5532    }
5533
5534    if(m_nFaceProcMask == faceProcMask) {
5535        ALOGD("%s: face process mask not changed, no ops here", __func__);
5536        return NO_ERROR;
5537    }
5538
5539    // set parm for face detection
5540    int requested_faces = getInt(KEY_QC_MAX_NUM_REQUESTED_FACES);
5541    cam_fd_set_parm_t fd_set_parm;
5542    memset(&fd_set_parm, 0, sizeof(cam_fd_set_parm_t));
5543    fd_set_parm.fd_mode = faceProcMask;
5544    fd_set_parm.num_fd = requested_faces;
5545
5546    if(initBatchUpdate(m_pParamBuf) < 0 ) {
5547        ALOGE("%s:Failed to initialize group update table", __func__);
5548        return BAD_TYPE;
5549    }
5550    int32_t rc = NO_ERROR;
5551
5552    rc = AddSetParmEntryToBatch(m_pParamBuf,
5553                                CAM_INTF_PARM_FD,
5554                                sizeof(fd_set_parm),
5555                                &fd_set_parm);
5556    if (rc != NO_ERROR) {
5557        ALOGE("%s:Failed to update table", __func__);
5558        return rc;
5559    }
5560
5561    rc = commitSetBatch();
5562    if (rc != NO_ERROR) {
5563        ALOGE("%s:Failed to set face detection parm", __func__);
5564        return rc;
5565    }
5566
5567    m_nFaceProcMask = faceProcMask;
5568    ALOGD("%s: FaceProcMask -> %d", __func__, m_nFaceProcMask);
5569
5570    return rc;
5571}
5572
5573/*===========================================================================
5574 * FUNCTION   : setLockCAF
5575 *
5576 * DESCRIPTION: Lock CAF
5577 *
5578 * PARAMETERS :
5579 *   @bLock : if CAF needs to be locked
5580 *
5581 * RETURN     : int32_t type of status
5582 *              NO_ERROR  -- success
5583 *              none-zero failure code
5584 *==========================================================================*/
5585int32_t QCameraParameters::setLockCAF(bool bLock)
5586{
5587    if(initBatchUpdate(m_pParamBuf) < 0 ) {
5588        ALOGE("%s:Failed to initialize group update table", __func__);
5589        return BAD_TYPE;
5590    }
5591    int32_t rc = NO_ERROR;
5592    int32_t value = bLock;
5593
5594    rc = AddSetParmEntryToBatch(m_pParamBuf,
5595                                CAM_INTF_PARM_LOCK_CAF,
5596                                sizeof(value),
5597                                &value);
5598    if (rc != NO_ERROR) {
5599        ALOGE("%s:Failed to update table", __func__);
5600        return rc;
5601    }
5602
5603    rc = commitSetBatch();
5604    if (rc != NO_ERROR) {
5605        ALOGE("%s:Failed to set lock CAF parm", __func__);
5606        return rc;
5607    } else {
5608        m_bCAFLocked = bLock;
5609        return NO_ERROR;
5610    }
5611}
5612
5613/*===========================================================================
5614 * FUNCTION   : setBundleInfo
5615 *
5616 * DESCRIPTION: send bundle info of a channel to backend
5617 *
5618 * PARAMETERS :
5619 *   @bundle_info : reference to bundle info struct
5620 *
5621 * RETURN     : int32_t type of status
5622 *              NO_ERROR  -- success
5623 *              none-zero failure code
5624 *==========================================================================*/
5625int32_t QCameraParameters::setBundleInfo(cam_bundle_config_t &bundle_info)
5626{
5627    int32_t rc = NO_ERROR;
5628
5629    if(initBatchUpdate(m_pParamBuf) < 0 ) {
5630        ALOGE("%s:Failed to initialize group update table", __func__);
5631        return BAD_TYPE;
5632    }
5633
5634    rc = AddSetParmEntryToBatch(m_pParamBuf,
5635                                CAM_INTF_PARM_SET_BUNDLE,
5636                                sizeof(cam_bundle_config_t),
5637                                &bundle_info);
5638    if (rc != NO_ERROR) {
5639        ALOGE("%s:Failed to update table", __func__);
5640        return rc;
5641    }
5642
5643    rc = commitSetBatch();
5644    if (rc != NO_ERROR) {
5645        ALOGE("%s:Failed to set bundle info parm", __func__);
5646        return rc;
5647    }
5648
5649    return rc;
5650}
5651
5652/*===========================================================================
5653 * FUNCTION   : setFrameSkip
5654 *
5655 * DESCRIPTION: send ISP frame skip pattern to camera daemon
5656 *
5657 * PARAMETERS :
5658 *   @pattern : skip pattern for ISP
5659 *
5660 * RETURN     : int32_t type of status
5661 *              NO_ERROR  -- success
5662 *              none-zero failure code
5663 *==========================================================================*/
5664int32_t QCameraParameters::setFrameSkip(enum msm_vfe_frame_skip_pattern pattern)
5665{
5666    int32_t rc = NO_ERROR;
5667    int32_t value = (int32_t)pattern;
5668
5669    if(initBatchUpdate(m_pParamBuf) < 0 ) {
5670        ALOGE("%s:Failed to initialize group update table", __func__);
5671        return BAD_TYPE;
5672    }
5673
5674    rc = AddSetParmEntryToBatch(m_pParamBuf,
5675                                CAM_INTF_PARM_FRAMESKIP,
5676                                sizeof(value),
5677                                &value);
5678    if (rc != NO_ERROR) {
5679        ALOGE("%s:Failed to update table", __func__);
5680        return rc;
5681    }
5682
5683    rc = commitSetBatch();
5684    if (rc != NO_ERROR) {
5685        ALOGE("%s:Failed to set frameskip info parm", __func__);
5686        return rc;
5687    }
5688
5689    return rc;
5690}
5691
5692/*===========================================================================
5693 * FUNCTION   : parseNDimVector
5694 *
5695 * DESCRIPTION: helper function to parse a string like "(1, 2, 3, 4, ..., N)"
5696 *              into N-dimension vector
5697 *
5698 * PARAMETERS :
5699 *   @str     : string to be parsed
5700 *   @num     : output array of size N to store vector element values
5701 *   @N       : number of dimension
5702 *   @delim   : delimeter to seperete string
5703 *
5704 * RETURN     : int32_t type of status
5705 *              NO_ERROR  -- success
5706 *              none-zero failure code
5707 *==========================================================================*/
5708int32_t QCameraParameters::parseNDimVector(const char *str, int *num, int N, char delim = ',')
5709{
5710    char *start, *end;
5711    if (num == NULL) {
5712        ALOGE("%s: Invalid output array (num == NULL)", __func__);
5713        return BAD_VALUE;
5714    }
5715
5716    //check if string starts and ends with parantheses
5717    if(str[0] != '(' || str[strlen(str)-1] != ')') {
5718        ALOGE("%s: Invalid format of string %s, valid format is (n1, n2, n3, n4 ...)",
5719              __func__, str);
5720        return BAD_VALUE;
5721    }
5722    start = (char*) str;
5723    start++;
5724    for(int i=0; i<N; i++) {
5725        *(num+i) = (int) strtol(start, &end, 10);
5726        if(*end != delim && i < N-1) {
5727            ALOGE("%s: Cannot find delimeter '%c' in string \"%s\". end = %c",
5728                  __func__, delim, str, *end);
5729            return -1;
5730        }
5731        start = end+1;
5732    }
5733    return NO_ERROR;
5734}
5735
5736/*===========================================================================
5737 * FUNCTION   : parseCameraAreaString
5738 *
5739 * DESCRIPTION: helper function to parse a string of camera areas like
5740 *              "(1, 2, 3, 4, 5),(1, 2, 3, 4, 5),..."
5741 *
5742 * PARAMETERS :
5743 *   @str             : string to be parsed
5744 *   @max_num_areas   : max number of areas
5745 *   @pAreas          : ptr to struct to store areas
5746 *   @num_areas_found : number of areas found
5747 *
5748 * RETURN     : int32_t type of status
5749 *              NO_ERROR  -- success
5750 *              none-zero failure code
5751 *==========================================================================*/
5752int32_t QCameraParameters::parseCameraAreaString(const char *str,
5753                                                 int max_num_areas,
5754                                                 cam_area_t *pAreas,
5755                                                 int& num_areas_found)
5756{
5757    char area_str[32];
5758    const char *start, *end, *p;
5759    start = str; end = NULL;
5760    int values[5], index=0;
5761    num_areas_found = 0;
5762
5763    memset(values, 0, sizeof(values));
5764    while(start != NULL) {
5765       if(*start != '(') {
5766            ALOGE("%s: error: Ill formatted area string: %s", __func__, str);
5767            return BAD_VALUE;
5768       }
5769       end = strchr(start, ')');
5770       if(end == NULL) {
5771            ALOGE("%s: error: Ill formatted area string: %s", __func__, str);
5772            return BAD_VALUE;
5773       }
5774       int i;
5775       for (i=0,p=start; p<=end; p++, i++) {
5776           area_str[i] = *p;
5777       }
5778       area_str[i] = '\0';
5779       if(parseNDimVector(area_str, values, 5) < 0){
5780            ALOGE("%s: error: Failed to parse the area string: %s", __func__, area_str);
5781            return BAD_VALUE;
5782       }
5783       // no more areas than max_num_areas are accepted.
5784       if(index >= max_num_areas) {
5785            ALOGE("%s: error: too many areas specified %s", __func__, str);
5786            return BAD_VALUE;
5787       }
5788       pAreas[index].rect.left = values[0];
5789       pAreas[index].rect.top = values[1];
5790       pAreas[index].rect.width = values[2] - values[0];
5791       pAreas[index].rect.height = values[3] - values[1];
5792       pAreas[index].weight = values[4];
5793
5794       index++;
5795       start = strchr(end, '('); // serach for next '('
5796    }
5797    num_areas_found = index;
5798    return 0;
5799}
5800
5801/*===========================================================================
5802 * FUNCTION   : validateCameraAreas
5803 *
5804 * DESCRIPTION: helper function to validate camera areas within (-1000, 1000)
5805 *
5806 * PARAMETERS :
5807 *   @areas     : ptr to array of areas
5808 *   @num_areas : number of areas
5809 *
5810 * RETURN     : true --  area is in valid range
5811 *              false -- not valid
5812 *==========================================================================*/
5813bool QCameraParameters::validateCameraAreas(cam_area_t *areas, int num_areas)
5814{
5815    // special case: default area
5816    if (num_areas == 1 &&
5817        areas[0].rect.left == 0 &&
5818        areas[0].rect.top == 0 &&
5819        areas[0].rect.width == 0 &&
5820        areas[0].rect.height == 0 &&
5821        areas[0].weight == 0) {
5822        return true;
5823    }
5824
5825    for(int i = 0; i < num_areas; i++) {
5826        // left should be >= -1000
5827        if(areas[i].rect.left < -1000) {
5828            return false;
5829        }
5830
5831        // top  should be >= -1000
5832        if(areas[i].rect.top < -1000) {
5833            return false;
5834        }
5835
5836        // width or height should be > 0
5837        if (areas[i].rect.width <= 0 || areas[i].rect.height <= 0) {
5838            return false;
5839        }
5840
5841        // right  should be <= 1000
5842        if(areas[i].rect.left + areas[i].rect.width > 1000) {
5843            return false;
5844        }
5845
5846        // bottom should be <= 1000
5847        if(areas[i].rect.top + areas[i].rect.height > 1000) {
5848            return false;
5849        }
5850
5851        // weight should be within (1, 1000)
5852        if (areas[i].weight < 1 || areas[i].weight > 1000) {
5853            return false;
5854        }
5855    }
5856    return true;
5857}
5858
5859/*===========================================================================
5860 * FUNCTION   : initBatchUpdate
5861 *
5862 * DESCRIPTION: init camera parameters buf entries
5863 *
5864 * PARAMETERS :
5865 *   @p_table : ptr to parameter buffer
5866 *
5867 * RETURN     : int32_t type of status
5868 *              NO_ERROR  -- success
5869 *              none-zero failure code
5870 *==========================================================================*/
5871int32_t QCameraParameters::initBatchUpdate(parm_buffer_t *p_table)
5872{
5873    m_tempMap.clear();
5874
5875    memset(p_table, 0, sizeof(parm_buffer_t));
5876    p_table->first_flagged_entry = CAM_INTF_PARM_MAX;
5877    return NO_ERROR;
5878}
5879
5880/*===========================================================================
5881 * FUNCTION   : AddSetParmEntryToBatch
5882 *
5883 * DESCRIPTION: add set parameter entry into batch
5884 *
5885 * PARAMETERS :
5886 *   @p_table     : ptr to parameter buffer
5887 *   @paramType   : parameter type
5888 *   @paramLength : length of parameter value
5889 *   @paramValue  : ptr to parameter value
5890 *
5891 * RETURN     : int32_t type of status
5892 *              NO_ERROR  -- success
5893 *              none-zero failure code
5894 *==========================================================================*/
5895int32_t QCameraParameters::AddSetParmEntryToBatch(parm_buffer_t *p_table,
5896                                                  cam_intf_parm_type_t paramType,
5897                                                  uint32_t paramLength,
5898                                                  void *paramValue)
5899{
5900    int position = paramType;
5901    int current, next;
5902
5903    /*************************************************************************
5904    *                 Code to take care of linking next flags                *
5905    *************************************************************************/
5906    current = GET_FIRST_PARAM_ID(p_table);
5907    if (position == current){
5908        //DO NOTHING
5909    } else if (position < current){
5910        SET_NEXT_PARAM_ID(position, p_table, current);
5911        SET_FIRST_PARAM_ID(p_table, position);
5912    } else {
5913        /* Search for the position in the linked list where we need to slot in*/
5914        while (position > GET_NEXT_PARAM_ID(current, p_table))
5915            current = GET_NEXT_PARAM_ID(current, p_table);
5916
5917        /*If node already exists no need to alter linking*/
5918        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
5919            next = GET_NEXT_PARAM_ID(current, p_table);
5920            SET_NEXT_PARAM_ID(current, p_table, position);
5921            SET_NEXT_PARAM_ID(position, p_table, next);
5922        }
5923    }
5924
5925    /*************************************************************************
5926    *                   Copy contents into entry                             *
5927    *************************************************************************/
5928
5929    if (paramLength > sizeof(parm_type_t)) {
5930        ALOGE("%s:Size of input larger than max entry size",__func__);
5931        return BAD_VALUE;
5932    }
5933    memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength);
5934    return NO_ERROR;
5935}
5936
5937/*===========================================================================
5938 * FUNCTION   : AddGetParmEntryToBatch
5939 *
5940 * DESCRIPTION: add get parameter entry into batch
5941 *
5942 * PARAMETERS :
5943 *   @p_table     : ptr to parameter buffer
5944 *   @paramType   : parameter type
5945 *
5946 * RETURN     : int32_t type of status
5947 *              NO_ERROR  -- success
5948 *              none-zero failure code
5949 *==========================================================================*/
5950int32_t QCameraParameters::AddGetParmEntryToBatch(parm_buffer_t *p_table,
5951                                                  cam_intf_parm_type_t paramType)
5952{
5953    int position = paramType;
5954    int current, next;
5955
5956    /*************************************************************************
5957    *                 Code to take care of linking next flags                *
5958    *************************************************************************/
5959    current = GET_FIRST_PARAM_ID(p_table);
5960    if (position == current){
5961        //DO NOTHING
5962    } else if (position < current){
5963        SET_NEXT_PARAM_ID(position, p_table, current);
5964        SET_FIRST_PARAM_ID(p_table, position);
5965    } else {
5966        /* Search for the position in the linked list where we need to slot in*/
5967        while (position > GET_NEXT_PARAM_ID(current, p_table))
5968            current = GET_NEXT_PARAM_ID(current, p_table);
5969
5970        /*If node already exists no need to alter linking*/
5971        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
5972            next=GET_NEXT_PARAM_ID(current, p_table);
5973            SET_NEXT_PARAM_ID(current, p_table, position);
5974            SET_NEXT_PARAM_ID(position, p_table, next);
5975        }
5976    }
5977
5978    return NO_ERROR;
5979}
5980
5981/*===========================================================================
5982 * FUNCTION   : commitSetBatch
5983 *
5984 * DESCRIPTION: commit all set parameters in the batch work to backend
5985 *
5986 * PARAMETERS : none
5987 *
5988 * RETURN     : int32_t type of status
5989 *              NO_ERROR  -- success
5990 *              none-zero failure code
5991 *==========================================================================*/
5992int32_t QCameraParameters::commitSetBatch()
5993{
5994    int32_t rc = NO_ERROR;
5995    if (m_pParamBuf->first_flagged_entry < CAM_INTF_PARM_MAX) {
5996        rc = m_pCamOpsTbl->ops->set_parms(m_pCamOpsTbl->camera_handle, m_pParamBuf);
5997    }
5998    if (rc == NO_ERROR) {
5999        // commit change from temp storage into param map
6000        rc = commitParamChanges();
6001    }
6002    return rc;
6003}
6004
6005/*===========================================================================
6006 * FUNCTION   : commitGetBatch
6007 *
6008 * DESCRIPTION: commit all get parameters in the batch work to backend
6009 *
6010 * PARAMETERS : none
6011 *
6012 * RETURN     : int32_t type of status
6013 *              NO_ERROR  -- success
6014 *              none-zero failure code
6015 *==========================================================================*/
6016int32_t QCameraParameters::commitGetBatch()
6017{
6018    if (m_pParamBuf->first_flagged_entry < CAM_INTF_PARM_MAX) {
6019        return m_pCamOpsTbl->ops->get_parms(m_pCamOpsTbl->camera_handle, m_pParamBuf);
6020    } else {
6021        return NO_ERROR;
6022    }
6023}
6024
6025/*===========================================================================
6026 * FUNCTION   : updateParamEntry
6027 *
6028 * DESCRIPTION: update a parameter entry in the local temp map obj
6029 *
6030 * PARAMETERS :
6031 *   @key     : key of the entry
6032 *   @value   : value of the entry
6033 *
6034 * RETURN     : int32_t type of status
6035 *              NO_ERROR  -- success
6036 *              none-zero failure code
6037 *==========================================================================*/
6038int32_t QCameraParameters::updateParamEntry(const char *key, const char *value)
6039{
6040    m_tempMap.replaceValueFor(String8(key), String8(value));
6041    return NO_ERROR;
6042}
6043
6044/*===========================================================================
6045 * FUNCTION   : commitParamChanges
6046 *
6047 * DESCRIPTION: commit all changes in local temp map obj into parameter obj
6048 *
6049 * PARAMETERS : none
6050 *
6051 * RETURN     : int32_t type of status
6052 *              NO_ERROR  -- success
6053 *              none-zero failure code
6054 *==========================================================================*/
6055int32_t QCameraParameters::commitParamChanges()
6056{
6057    size_t size = m_tempMap.size();
6058    for (size_t i = 0; i < size; i++) {
6059        String8 k, v;
6060        k = m_tempMap.keyAt(i);
6061        v = m_tempMap.valueAt(i);
6062        set(k, v);
6063    }
6064    m_tempMap.clear();
6065    return NO_ERROR;
6066}
6067
6068}; // namespace qcamera
6069