1 /*
2 Copyright (c) 2012, The Linux Foundation. All rights reserved.
3
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are
6 met:
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above
10 copyright notice, this list of conditions and the following
11 disclaimer in the documentation and/or other materials provided
12 with the distribution.
13 * Neither the name of The Linux Foundation nor the names of its
14 contributors may be used to endorse or promote products derived
15 from this software without specific prior written permission.
16
17 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30
31 #define LOG_TAG "QCameraParams"
32 #include <utils/Log.h>
33 #include <string.h>
34 #include <stdlib.h>
35 #include <camera/QCameraParameters.h>
36
37 namespace android {
38 // Parameter keys to communicate between camera application and driver.
39 const char QCameraParameters::KEY_QC_SUPPORTED_HFR_SIZES[] = "hfr-size-values";
40 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_MODE[] = "preview-frame-rate-mode";
41 const char QCameraParameters::KEY_QC_SUPPORTED_PREVIEW_FRAME_RATE_MODES[] = "preview-frame-rate-modes";
42 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_AUTO_MODE[] = "frame-rate-auto";
43 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_FIXED_MODE[] = "frame-rate-fixed";
44 const char QCameraParameters::KEY_QC_TOUCH_AF_AEC[] = "touch-af-aec";
45 const char QCameraParameters::KEY_QC_SUPPORTED_TOUCH_AF_AEC[] = "touch-af-aec-values";
46 const char QCameraParameters::KEY_QC_TOUCH_INDEX_AEC[] = "touch-index-aec";
47 const char QCameraParameters::KEY_QC_TOUCH_INDEX_AF[] = "touch-index-af";
48 const char QCameraParameters::KEY_QC_SCENE_DETECT[] = "scene-detect";
49 const char QCameraParameters::KEY_QC_SUPPORTED_SCENE_DETECT[] = "scene-detect-values";
50 const char QCameraParameters::KEY_QC_ISO_MODE[] = "iso";
51 const char QCameraParameters::KEY_QC_SUPPORTED_ISO_MODES[] = "iso-values";
52 const char QCameraParameters::KEY_QC_LENSSHADE[] = "lensshade";
53 const char QCameraParameters::KEY_QC_SUPPORTED_LENSSHADE_MODES[] = "lensshade-values";
54 const char QCameraParameters::KEY_QC_AUTO_EXPOSURE[] = "auto-exposure";
55 const char QCameraParameters::KEY_QC_SUPPORTED_AUTO_EXPOSURE[] = "auto-exposure-values";
56 const char QCameraParameters::KEY_QC_DENOISE[] = "denoise";
57 const char QCameraParameters::KEY_QC_SUPPORTED_DENOISE[] = "denoise-values";
58 const char QCameraParameters::KEY_QC_SELECTABLE_ZONE_AF[] = "selectable-zone-af";
59 const char QCameraParameters::KEY_QC_SUPPORTED_SELECTABLE_ZONE_AF[] = "selectable-zone-af-values";
60 const char QCameraParameters::KEY_QC_FACE_DETECTION[] = "face-detection";
61 const char QCameraParameters::KEY_QC_SUPPORTED_FACE_DETECTION[] = "face-detection-values";
62 const char QCameraParameters::KEY_QC_MEMORY_COLOR_ENHANCEMENT[] = "mce";
63 const char QCameraParameters::KEY_QC_SUPPORTED_MEM_COLOR_ENHANCE_MODES[] = "mce-values";
64 const char QCameraParameters::KEY_QC_VIDEO_HIGH_FRAME_RATE[] = "video-hfr";
65 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_HIGH_FRAME_RATE_MODES[] = "video-hfr-values";
66 const char QCameraParameters::KEY_QC_REDEYE_REDUCTION[] = "redeye-reduction";
67 const char QCameraParameters::KEY_QC_SUPPORTED_REDEYE_REDUCTION[] = "redeye-reduction-values";
68 const char QCameraParameters::KEY_QC_HIGH_DYNAMIC_RANGE_IMAGING[] = "hdr";
69 const char QCameraParameters::KEY_QC_SUPPORTED_HDR_IMAGING_MODES[] = "hdr-values";
70 const char QCameraParameters::KEY_QC_POWER_MODE_SUPPORTED[] = "power-mode-supported";
71 const char QCameraParameters::KEY_QC_ZSL[] = "zsl";
72 const char QCameraParameters::KEY_QC_SUPPORTED_ZSL_MODES[] = "zsl-values";
73 const char QCameraParameters::KEY_QC_CAMERA_MODE[] = "camera-mode";
74 const char QCameraParameters::KEY_QC_AE_BRACKET_HDR[] = "ae-bracket-hdr";
75 const char QCameraParameters::KEY_QC_POWER_MODE[] = "power-mode";
76 /*only effective when KEY_QC_AE_BRACKET_HDR set to ae_bracketing*/
77 //const char QCameraParameters::KEY_QC_AE_BRACKET_SETTING_KEY[] = "ae-bracket-setting";
78
79 // Values for effect settings.
80 const char QCameraParameters::EFFECT_EMBOSS[] = "emboss";
81 const char QCameraParameters::EFFECT_SKETCH[] = "sketch";
82 const char QCameraParameters::EFFECT_NEON[] = "neon";
83
84 // Values for auto exposure settings.
85 const char QCameraParameters::TOUCH_AF_AEC_OFF[] = "touch-off";
86 const char QCameraParameters::TOUCH_AF_AEC_ON[] = "touch-on";
87
88 // Values for scene mode settings.
89 const char QCameraParameters::SCENE_MODE_ASD[] = "asd"; // corresponds to CAMERA_BESTSHOT_AUTO in HAL
90 const char QCameraParameters::SCENE_MODE_BACKLIGHT[] = "backlight";
91 const char QCameraParameters::SCENE_MODE_FLOWERS[] = "flowers";
92 const char QCameraParameters::SCENE_MODE_AR[] = "AR";
93
94 // Values for auto scene detection settings.
95 const char QCameraParameters::SCENE_DETECT_OFF[] = "off";
96 const char QCameraParameters::SCENE_DETECT_ON[] = "on";
97
98 // Formats for setPreviewFormat and setPictureFormat.
99 const char QCameraParameters::PIXEL_FORMAT_YUV420SP_ADRENO[] = "yuv420sp-adreno";
100 const char QCameraParameters::PIXEL_FORMAT_RAW[] = "raw";
101 const char QCameraParameters::PIXEL_FORMAT_YV12[] = "yuv420p";
102 const char QCameraParameters::PIXEL_FORMAT_NV12[] = "nv12";
103
104 // Values for focus mode settings.
105 const char QCameraParameters::FOCUS_MODE_NORMAL[] = "normal";
106 const char QCameraParameters::KEY_QC_SKIN_TONE_ENHANCEMENT[] = "skinToneEnhancement";
107 const char QCameraParameters::KEY_QC_SUPPORTED_SKIN_TONE_ENHANCEMENT_MODES[] = "skinToneEnhancement-values";
108
109 // Values for ISO Settings
110 const char QCameraParameters::ISO_AUTO[] = "auto";
111 const char QCameraParameters::ISO_HJR[] = "ISO_HJR";
112 const char QCameraParameters::ISO_100[] = "ISO100";
113 const char QCameraParameters::ISO_200[] = "ISO200";
114 const char QCameraParameters::ISO_400[] = "ISO400";
115 const char QCameraParameters::ISO_800[] = "ISO800";
116 const char QCameraParameters::ISO_1600[] = "ISO1600";
117
118 //Values for Lens Shading
119 const char QCameraParameters::LENSSHADE_ENABLE[] = "enable";
120 const char QCameraParameters::LENSSHADE_DISABLE[] = "disable";
121
122 // Values for auto exposure settings.
123 const char QCameraParameters::AUTO_EXPOSURE_FRAME_AVG[] = "frame-average";
124 const char QCameraParameters::AUTO_EXPOSURE_CENTER_WEIGHTED[] = "center-weighted";
125 const char QCameraParameters::AUTO_EXPOSURE_SPOT_METERING[] = "spot-metering";
126
127 const char QCameraParameters::KEY_QC_GPS_LATITUDE_REF[] = "gps-latitude-ref";
128 const char QCameraParameters::KEY_QC_GPS_LONGITUDE_REF[] = "gps-longitude-ref";
129 const char QCameraParameters::KEY_QC_GPS_ALTITUDE_REF[] = "gps-altitude-ref";
130 const char QCameraParameters::KEY_QC_GPS_STATUS[] = "gps-status";
131 const char QCameraParameters::KEY_QC_EXIF_DATETIME[] = "exif-datetime";
132
133 const char QCameraParameters::KEY_QC_HISTOGRAM[] = "histogram";
134 const char QCameraParameters::KEY_QC_SUPPORTED_HISTOGRAM_MODES[] = "histogram-values";
135
136 //Values for Histogram Shading
137 const char QCameraParameters::HISTOGRAM_ENABLE[] = "enable";
138 const char QCameraParameters::HISTOGRAM_DISABLE[] = "disable";
139
140 //Values for Skin Tone Enhancement Modes
141 const char QCameraParameters::SKIN_TONE_ENHANCEMENT_ENABLE[] = "enable";
142 const char QCameraParameters::SKIN_TONE_ENHANCEMENT_DISABLE[] = "disable";
143
144 const char QCameraParameters::KEY_QC_SHARPNESS[] = "sharpness";
145 const char QCameraParameters::KEY_QC_MAX_SHARPNESS[] = "max-sharpness";
146 const char QCameraParameters::KEY_QC_CONTRAST[] = "contrast";
147 const char QCameraParameters::KEY_QC_MAX_CONTRAST[] = "max-contrast";
148 const char QCameraParameters::KEY_QC_SATURATION[] = "saturation";
149 const char QCameraParameters::KEY_QC_MAX_SATURATION[] = "max-saturation";
150
151 const char QCameraParameters::KEY_QC_SINGLE_ISP_OUTPUT_ENABLED[] = "single-isp-output-enabled";
152 const char QCameraParameters::KEY_QC_SUPPORTED_CAMERA_FEATURES[] = "qc-camera-features";
153 const char QCameraParameters::KEY_QC_MAX_NUM_REQUESTED_FACES[] = "qc-max-num-requested-faces";
154
155 //Values for DENOISE
156 const char QCameraParameters::DENOISE_OFF[] = "denoise-off";
157 const char QCameraParameters::DENOISE_ON[] = "denoise-on";
158
159 // Values for selectable zone af Settings
160 const char QCameraParameters::SELECTABLE_ZONE_AF_AUTO[] = "auto";
161 const char QCameraParameters::SELECTABLE_ZONE_AF_SPOT_METERING[] = "spot-metering";
162 const char QCameraParameters::SELECTABLE_ZONE_AF_CENTER_WEIGHTED[] = "center-weighted";
163 const char QCameraParameters::SELECTABLE_ZONE_AF_FRAME_AVERAGE[] = "frame-average";
164
165 // Values for Face Detection settings.
166 const char QCameraParameters::FACE_DETECTION_OFF[] = "off";
167 const char QCameraParameters::FACE_DETECTION_ON[] = "on";
168
169 // Values for MCE settings.
170 const char QCameraParameters::MCE_ENABLE[] = "enable";
171 const char QCameraParameters::MCE_DISABLE[] = "disable";
172
173 // Values for HFR settings.
174 const char QCameraParameters::VIDEO_HFR_OFF[] = "off";
175 const char QCameraParameters::VIDEO_HFR_2X[] = "60";
176 const char QCameraParameters::VIDEO_HFR_3X[] = "90";
177 const char QCameraParameters::VIDEO_HFR_4X[] = "120";
178
179 // Values for Redeye Reduction settings.
180 const char QCameraParameters::REDEYE_REDUCTION_ENABLE[] = "enable";
181 const char QCameraParameters::REDEYE_REDUCTION_DISABLE[] = "disable";
182
183 // Values for HDR settings.
184 const char QCameraParameters::HDR_ENABLE[] = "enable";
185 const char QCameraParameters::HDR_DISABLE[] = "disable";
186
187 // Values for ZSL settings.
188 const char QCameraParameters::ZSL_OFF[] = "off";
189 const char QCameraParameters::ZSL_ON[] = "on";
190
191 // Values for HDR Bracketing settings.
192 const char QCameraParameters::AE_BRACKET_HDR_OFF[] = "Off";
193 const char QCameraParameters::AE_BRACKET_HDR[] = "HDR";
194 const char QCameraParameters::AE_BRACKET[] = "AE-Bracket";
195
196 const char QCameraParameters::LOW_POWER[] = "Low_Power";
197 const char QCameraParameters::NORMAL_POWER[] = "Normal_Power";
198
199 static const char* portrait = "portrait";
200 static const char* landscape = "landscape";
201
202 //QCameraParameters::QCameraParameters()
203 // : mMap()
204 //{
205 //}
206
~QCameraParameters()207 QCameraParameters::~QCameraParameters()
208 {
209 }
210
getOrientation() const211 int QCameraParameters::getOrientation() const
212 {
213 const char* orientation = get("orientation");
214 if (orientation && !strcmp(orientation, portrait))
215 return CAMERA_ORIENTATION_PORTRAIT;
216 return CAMERA_ORIENTATION_LANDSCAPE;
217 }
setOrientation(int orientation)218 void QCameraParameters::setOrientation(int orientation)
219 {
220 if (orientation == CAMERA_ORIENTATION_PORTRAIT) {
221 set("orientation", portrait);
222 } else {
223 set("orientation", landscape);
224 }
225 }
226
227 //XXX ALOGE("Key \"%s\"contains invalid character (= or ;)", key);
228 //XXX ALOGE("Value \"%s\"contains invalid character (= or ;)", value);
229 //snprintf(str, sizeof(str), "%d", value);
230 //ALOGE("Cannot find delimeter (%c) in str=%s", delim, str);
231
232
233 // Parse string like "(1, 2, 3, 4, ..., N)"
234 // num is pointer to an allocated array of size N
parseNDimVector(const char * str,int * num,int N,char delim=',')235 static int parseNDimVector(const char *str, int *num, int N, char delim = ',')
236 {
237 char *start, *end;
238 if(num == NULL) {
239 ALOGE("Invalid output array (num == NULL)");
240 return -1;
241 }
242 //check if string starts and ends with parantheses
243 if(str[0] != '(' || str[strlen(str)-1] != ')') {
244 ALOGE("Invalid format of string %s, valid format is (n1, n2, n3, n4 ...)", str);
245 return -1;
246 }
247 start = (char*) str;
248 start++;
249 for(int i=0; i<N; i++) {
250 *(num+i) = (int) strtol(start, &end, 10);
251 if(*end != delim && i < N-1) {
252 ALOGE("Cannot find delimeter '%c' in string \"%s\". end = %c", delim, str, *end);
253 return -1;
254 }
255 start = end+1;
256 }
257 return 0;
258 }
259
260
261 //ALOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
262 //snprintf(str, sizeof(str), "%dx%d", width, height);
263
264
265
266 // Parse string like "640x480" or "10000,20000"
parse_pair(const char * str,int * first,int * second,char delim,char ** endptr=NULL)267 static int parse_pair(const char *str, int *first, int *second, char delim,
268 char **endptr = NULL)
269 {
270 // Find the first integer.
271 char *end;
272 int w = (int)strtol(str, &end, 10);
273 // If a delimeter does not immediately follow, give up.
274 if (*end != delim) {
275 ALOGE("Cannot find delimeter (%c) in str=%s", delim, str);
276 return -1;
277 }
278
279 // Find the second integer, immediately after the delimeter.
280 int h = (int)strtol(end+1, &end, 10);
281
282 *first = w;
283 *second = h;
284
285 if (endptr) {
286 *endptr = end;
287 }
288
289 return 0;
290 }
291
parseSizesList(const char * sizesStr,Vector<Size> & sizes)292 static void parseSizesList(const char *sizesStr, Vector<Size> &sizes)
293 {
294 if (sizesStr == 0) {
295 return;
296 }
297
298 char *sizeStartPtr = (char *)sizesStr;
299
300 while (true) {
301 int width, height;
302 int success = parse_pair(sizeStartPtr, &width, &height, 'x',
303 &sizeStartPtr);
304 if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) {
305 ALOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
306 return;
307 }
308 sizes.push(Size(width, height));
309
310 if (*sizeStartPtr == '\0') {
311 return;
312 }
313 sizeStartPtr++;
314 }
315 }
316
317
getSupportedHfrSizes(Vector<Size> & sizes) const318 void QCameraParameters::getSupportedHfrSizes(Vector<Size> &sizes) const
319 {
320 const char *hfrSizesStr = get(KEY_QC_SUPPORTED_HFR_SIZES);
321 parseSizesList(hfrSizesStr, sizes);
322 }
323
setPreviewFpsRange(int minFPS,int maxFPS)324 void QCameraParameters::setPreviewFpsRange(int minFPS, int maxFPS)
325 {
326 char str[32];
327 snprintf(str, sizeof(str), "%d,%d",minFPS,maxFPS);
328 set(KEY_PREVIEW_FPS_RANGE,str);
329 }
330
setPreviewFrameRateMode(const char * mode)331 void QCameraParameters::setPreviewFrameRateMode(const char *mode)
332 {
333 set(KEY_QC_PREVIEW_FRAME_RATE_MODE, mode);
334 }
335
getPreviewFrameRateMode() const336 const char *QCameraParameters::getPreviewFrameRateMode() const
337 {
338 return get(KEY_QC_PREVIEW_FRAME_RATE_MODE);
339 }
340
341 //ALOGD("dump: mMap.size = %d", mMap.size());
342 //ALOGD("%s: %s\n", k.string(), v.string());
setTouchIndexAec(int x,int y)343 void QCameraParameters::setTouchIndexAec(int x, int y)
344 {
345 char str[32];
346 snprintf(str, sizeof(str), "%dx%d", x, y);
347 set(KEY_QC_TOUCH_INDEX_AEC, str);
348 }
349
getTouchIndexAec(int * x,int * y) const350 void QCameraParameters::getTouchIndexAec(int *x, int *y) const
351 {
352 *x = -1;
353 *y = -1;
354
355 // Get the current string, if it doesn't exist, leave the -1x-1
356 const char *p = get(KEY_QC_TOUCH_INDEX_AEC);
357 if (p == 0)
358 return;
359
360 int tempX, tempY;
361 if (parse_pair(p, &tempX, &tempY, 'x') == 0) {
362 *x = tempX;
363 *y = tempY;
364 }
365 }
366
setTouchIndexAf(int x,int y)367 void QCameraParameters::setTouchIndexAf(int x, int y)
368 {
369 char str[32];
370 snprintf(str, sizeof(str), "%dx%d", x, y);
371 set(KEY_QC_TOUCH_INDEX_AF, str);
372 }
373
getTouchIndexAf(int * x,int * y) const374 void QCameraParameters::getTouchIndexAf(int *x, int *y) const
375 {
376 *x = -1;
377 *y = -1;
378
379 // Get the current string, if it doesn't exist, leave the -1x-1
380 const char *p = get(KEY_QC_TOUCH_INDEX_AF);
381 if (p == 0)
382 return;
383
384 int tempX, tempY;
385 if (parse_pair(p, &tempX, &tempY, 'x') == 0) {
386 *x = tempX;
387 *y = tempY;
388 }
389 }
390
getMeteringAreaCenter(int * x,int * y) const391 void QCameraParameters::getMeteringAreaCenter(int *x, int *y) const
392 {
393 //Default invalid values
394 *x = -2000;
395 *y = -2000;
396
397 const char *p = get(KEY_METERING_AREAS);
398 if(p != NULL) {
399 int arr[5] = {-2000, -2000, -2000, -2000, 0};
400 parseNDimVector(p, arr, 5); //p = "(x1, y1, x2, y2, weight)"
401 *x = (arr[0] + arr[2])/2; //center_x = (x1+x2)/2
402 *y = (arr[1] + arr[3])/2; //center_y = (y1+y2)/2
403 }
404 }
405
406
407 }; // namespace android
408
409