1 /*
2 ** Copyright (c) 2012 The Linux Foundation. All rights reserved.
3 **
4 ** Not a Contribution, Apache license notifications and license are retained
5 ** for attribution purposes only.
6 **
7 ** Licensed under the Apache License, Version 2.0 (the "License");
8 ** you may not use this file except in compliance with the License.
9 ** You may obtain a copy of the License at
10 **
11 ** http://www.apache.org/licenses/LICENSE-2.0
12 **
13 ** Unless required by applicable law or agreed to in writing, software
14 ** distributed under the License is distributed on an "AS IS" BASIS,
15 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 ** See the License for the specific language governing permissions and
17 ** limitations under the License.
18 */
19
20 //#define ALOG_NDEBUG 0
21 #define ALOG_NIDEBUG 0
22 #define LOG_TAG "QCameraHWI_Parm"
23 #include <utils/Log.h>
24
25 #include <utils/Errors.h>
26 #include <utils/threads.h>
27 #include <utils/String16.h>
28 #include <sys/types.h>
29 #include <sys/stat.h>
30 #include <unistd.h>
31 #include <fcntl.h>
32 #include <cutils/properties.h>
33 #include <math.h>
34 #if __ANDROID__
35 #include <linux/android_pmem.h>
36 #endif
37 #include <linux/ioctl.h>
38 #include <camera/QCameraParameters.h>
39 #include <media/mediarecorder.h>
40 #include <gralloc_priv.h>
41
42 #include "linux/msm_mdp.h"
43 #include <linux/fb.h>
44 #include <limits.h>
45
46
47 extern "C" {
48 #include <fcntl.h>
49 #include <time.h>
50 #include <pthread.h>
51 #include <stdio.h>
52 #include <string.h>
53 #include <unistd.h>
54 #include <termios.h>
55 #include <assert.h>
56 #include <stdlib.h>
57 #include <ctype.h>
58 #include <signal.h>
59 #include <errno.h>
60 #include <sys/mman.h>
61 #include <sys/system_properties.h>
62 #include <sys/time.h>
63 #include <stdlib.h>
64 #include <linux/msm_ion.h>
65 #include <camera.h>
66 #include <cam_fifo.h>
67 #include <jpege.h>
68
69 } // extern "C"
70
71 #include "QCameraHWI.h"
72
73 /* QCameraHardwareInterface class implementation goes here*/
74 /* following code implements the parameter logic of this class*/
75 #define EXPOSURE_COMPENSATION_MAXIMUM_NUMERATOR 12
76 #define EXPOSURE_COMPENSATION_MINIMUM_NUMERATOR -12
77 #define EXPOSURE_COMPENSATION_DEFAULT_NUMERATOR 0
78 #define EXPOSURE_COMPENSATION_DENOMINATOR 6
79 #define EXPOSURE_COMPENSATION_STEP ((float (1))/EXPOSURE_COMPENSATION_DENOMINATOR)
80 #define DEFAULT_CAMERA_AREA "(0, 0, 0, 0, 0)"
81
82 #define HDR_HAL_FRAME 2
83
84 #define BURST_INTREVAL_MIN 1
85 #define BURST_INTREVAL_MAX 10
86 #define BURST_INTREVAL_DEFAULT 1
87
88 //Default FPS
89 #define MINIMUM_FPS 5
90 #define MAXIMUM_FPS 120
91 #define DEFAULT_FIXED_FPS 30
92 #define DEFAULT_FPS MAXIMUM_FPS
93
94 //Default Picture Width
95 #define DEFAULT_PICTURE_WIDTH 640
96 #define DEFAULT_PICTURE_HEIGHT 480
97
98 //Default Video Width
99 #define DEFAULT_VIDEO_WIDTH 1920
100 #define DEFAULT_VIDEO_HEIGHT 1080
101
102 #define THUMBNAIL_SIZE_COUNT (sizeof(thumbnail_sizes)/sizeof(thumbnail_size_type))
103 #define DEFAULT_THUMBNAIL_SETTING 4
104 #define THUMBNAIL_WIDTH_STR "512"
105 #define THUMBNAIL_HEIGHT_STR "384"
106 #define THUMBNAIL_SMALL_HEIGHT 144
107
108 #define DONT_CARE_COORDINATE -1
109
110 // All fps ranges which can be supported. This list will be filtered according
111 // to the min and max fps supported by hardware
112 // this list must be sorted first by max_fps and then min_fps
113 // fps values are multiplied by 1000
114 static android::FPSRange allFpsRanges[] = {
115 android::FPSRange(7500, 7500),
116 android::FPSRange(10000, 10000),
117 android::FPSRange(7500, 15000),
118 android::FPSRange(15000, 15000),
119 android::FPSRange(7500, 20000),
120 android::FPSRange(20000, 20000),
121 android::FPSRange(7500, 30000),
122 android::FPSRange(10000, 30000),
123 android::FPSRange(15000, 30000),
124 android::FPSRange(30000, 30000)
125 };
126 #define ALL_FPS_RANGES_COUNT (sizeof(allFpsRanges)/sizeof(android::FPSRange))
127
128 typedef struct {
129 uint32_t aspect_ratio;
130 uint32_t width;
131 uint32_t height;
132 } thumbnail_size_type;
133
134 static thumbnail_size_type thumbnail_sizes[] = {
135 { 7281, 512, 288 }, //1.777778
136 { 6826, 480, 288 }, //1.666667
137 { 6808, 256, 154 }, //1.66233
138 { 6144, 432, 288 }, //1.5
139 { 5461, 512, 384 }, //1.333333
140 { 5006, 352, 288 }, //1.222222
141 { 5461, 320, 240 }, //1.33333
142 { 5006, 176, 144 }, //1.222222
143
144 };
145
146 static struct camera_size_type zsl_picture_sizes[] = {
147 { 1024, 768}, // 1MP XGA
148 { 800, 600}, //SVGA
149 { 800, 480}, // WVGA
150 { 640, 480}, // VGA
151 { 352, 288}, //CIF
152 { 320, 240}, // QVGA
153 { 176, 144} // QCIF
154 };
155
156 static camera_size_type default_picture_sizes[] = {
157 { 4000, 3000}, // 12MP
158 { 3200, 2400}, // 8MP
159 { 2592, 1944}, // 5MP
160 { 2048, 1536}, // 3MP QXGA
161 { 1920, 1080}, //HD1080
162 { 1600, 1200}, // 2MP UXGA
163 { 1280, 768}, //WXGA
164 { 1280, 720}, //HD720
165 { 1024, 768}, // 1MP XGA
166 { 800, 600}, //SVGA
167 { 800, 480}, // WVGA
168 { 720, 480},
169 { 640, 480}, // VGA
170 { 352, 288}, //CIF
171 { 320, 240}, // QVGA
172 { 176, 144} // QCIF
173 };
174
175 static int iso_speed_values[] = {
176 0, 1, 100, 200, 400, 800, 1600
177 };
178
179 extern int HAL_numOfCameras;
180 extern camera_info_t HAL_cameraInfo[MSM_MAX_CAMERA_SENSORS];
181 extern mm_camera_info_t * HAL_camerahandle[MSM_MAX_CAMERA_SENSORS];
182
183 namespace android {
184
185 static uint32_t HFR_SIZE_COUNT=2;
186 static const int PICTURE_FORMAT_JPEG = 1;
187 static const int PICTURE_FORMAT_RAW = 2;
188
189 /********************************************************************/
190 static const str_map effects[] = {
191 { QCameraParameters::EFFECT_NONE, CAMERA_EFFECT_OFF },
192 { QCameraParameters::EFFECT_MONO, CAMERA_EFFECT_MONO },
193 { QCameraParameters::EFFECT_NEGATIVE, CAMERA_EFFECT_NEGATIVE },
194 { QCameraParameters::EFFECT_SOLARIZE, CAMERA_EFFECT_SOLARIZE },
195 { QCameraParameters::EFFECT_SEPIA, CAMERA_EFFECT_SEPIA },
196 { QCameraParameters::EFFECT_POSTERIZE, CAMERA_EFFECT_POSTERIZE },
197 { QCameraParameters::EFFECT_WHITEBOARD, CAMERA_EFFECT_WHITEBOARD },
198 { QCameraParameters::EFFECT_BLACKBOARD, CAMERA_EFFECT_BLACKBOARD },
199 { QCameraParameters::EFFECT_AQUA, CAMERA_EFFECT_AQUA },
200 { QCameraParameters::EFFECT_EMBOSS, CAMERA_EFFECT_EMBOSS },
201 { QCameraParameters::EFFECT_SKETCH, CAMERA_EFFECT_SKETCH },
202 { QCameraParameters::EFFECT_NEON, CAMERA_EFFECT_NEON }
203 };
204
205 static const str_map iso[] = {
206 { QCameraParameters::ISO_AUTO, CAMERA_ISO_AUTO},
207 { QCameraParameters::ISO_HJR, CAMERA_ISO_DEBLUR},
208 { QCameraParameters::ISO_100, CAMERA_ISO_100},
209 { QCameraParameters::ISO_200, CAMERA_ISO_200},
210 { QCameraParameters::ISO_400, CAMERA_ISO_400},
211 { QCameraParameters::ISO_800, CAMERA_ISO_800 },
212 { QCameraParameters::ISO_1600, CAMERA_ISO_1600 }
213 };
214
215 static const str_map scenemode[] = {
216 { QCameraParameters::SCENE_MODE_AUTO, CAMERA_BESTSHOT_OFF },
217 { QCameraParameters::SCENE_MODE_ASD, CAMERA_BESTSHOT_AUTO },
218 { QCameraParameters::SCENE_MODE_ACTION, CAMERA_BESTSHOT_ACTION },
219 { QCameraParameters::SCENE_MODE_PORTRAIT, CAMERA_BESTSHOT_PORTRAIT },
220 { QCameraParameters::SCENE_MODE_LANDSCAPE, CAMERA_BESTSHOT_LANDSCAPE },
221 { QCameraParameters::SCENE_MODE_NIGHT, CAMERA_BESTSHOT_NIGHT },
222 { QCameraParameters::SCENE_MODE_NIGHT_PORTRAIT, CAMERA_BESTSHOT_NIGHT_PORTRAIT },
223 { QCameraParameters::SCENE_MODE_THEATRE, CAMERA_BESTSHOT_THEATRE },
224 { QCameraParameters::SCENE_MODE_BEACH, CAMERA_BESTSHOT_BEACH },
225 { QCameraParameters::SCENE_MODE_SNOW, CAMERA_BESTSHOT_SNOW },
226 { QCameraParameters::SCENE_MODE_SUNSET, CAMERA_BESTSHOT_SUNSET },
227 { QCameraParameters::SCENE_MODE_STEADYPHOTO, CAMERA_BESTSHOT_ANTISHAKE },
228 { QCameraParameters::SCENE_MODE_FIREWORKS , CAMERA_BESTSHOT_FIREWORKS },
229 { QCameraParameters::SCENE_MODE_SPORTS , CAMERA_BESTSHOT_SPORTS },
230 { QCameraParameters::SCENE_MODE_PARTY, CAMERA_BESTSHOT_PARTY },
231 { QCameraParameters::SCENE_MODE_CANDLELIGHT, CAMERA_BESTSHOT_CANDLELIGHT },
232 { QCameraParameters::SCENE_MODE_BACKLIGHT, CAMERA_BESTSHOT_BACKLIGHT },
233 { QCameraParameters::SCENE_MODE_FLOWERS, CAMERA_BESTSHOT_FLOWERS },
234 { QCameraParameters::SCENE_MODE_AR, CAMERA_BESTSHOT_AR },
235 };
236
237 static const str_map scenedetect[] = {
238 { QCameraParameters::SCENE_DETECT_OFF, FALSE },
239 { QCameraParameters::SCENE_DETECT_ON, TRUE },
240 };
241
242 #define DONT_CARE AF_MODE_MAX
243 static const str_map focus_modes[] = {
244 { QCameraParameters::FOCUS_MODE_AUTO, AF_MODE_AUTO},
245 { QCameraParameters::FOCUS_MODE_INFINITY, AF_MODE_INFINITY },
246 { QCameraParameters::FOCUS_MODE_NORMAL, AF_MODE_NORMAL },
247 { QCameraParameters::FOCUS_MODE_MACRO, AF_MODE_MACRO },
248 { QCameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE, AF_MODE_CAF},
249 { QCameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO, AF_MODE_CAF }
250 };
251
252 static const str_map selectable_zone_af[] = {
253 { QCameraParameters::SELECTABLE_ZONE_AF_AUTO, AUTO },
254 { QCameraParameters::SELECTABLE_ZONE_AF_SPOT_METERING, SPOT },
255 { QCameraParameters::SELECTABLE_ZONE_AF_CENTER_WEIGHTED, CENTER_WEIGHTED },
256 { QCameraParameters::SELECTABLE_ZONE_AF_FRAME_AVERAGE, AVERAGE }
257 };
258
259 // from qcamera/common/camera.h
260 static const str_map autoexposure[] = {
261 { QCameraParameters::AUTO_EXPOSURE_FRAME_AVG, CAMERA_AEC_FRAME_AVERAGE },
262 { QCameraParameters::AUTO_EXPOSURE_CENTER_WEIGHTED, CAMERA_AEC_CENTER_WEIGHTED },
263 { QCameraParameters::AUTO_EXPOSURE_SPOT_METERING, CAMERA_AEC_SPOT_METERING }
264 };
265
266 // from aeecamera.h
267 static const str_map whitebalance[] = {
268 { QCameraParameters::WHITE_BALANCE_AUTO, CAMERA_WB_AUTO },
269 { QCameraParameters::WHITE_BALANCE_INCANDESCENT, CAMERA_WB_INCANDESCENT },
270 { QCameraParameters::WHITE_BALANCE_FLUORESCENT, CAMERA_WB_FLUORESCENT },
271 { QCameraParameters::WHITE_BALANCE_DAYLIGHT, CAMERA_WB_DAYLIGHT },
272 { QCameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT, CAMERA_WB_CLOUDY_DAYLIGHT }
273 };
274
275 static const str_map antibanding[] = {
276 { QCameraParameters::ANTIBANDING_OFF, CAMERA_ANTIBANDING_OFF },
277 { QCameraParameters::ANTIBANDING_50HZ, CAMERA_ANTIBANDING_50HZ },
278 { QCameraParameters::ANTIBANDING_60HZ, CAMERA_ANTIBANDING_60HZ },
279 { QCameraParameters::ANTIBANDING_AUTO, CAMERA_ANTIBANDING_AUTO }
280 };
281
282 static const str_map frame_rate_modes[] = {
283 {QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_AUTO_MODE, FPS_MODE_AUTO},
284 {QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_FIXED_MODE, FPS_MODE_FIXED}
285 };
286
287 static const str_map touchafaec[] = {
288 { QCameraParameters::TOUCH_AF_AEC_OFF, FALSE },
289 { QCameraParameters::TOUCH_AF_AEC_ON, TRUE }
290 };
291
292 static const str_map hfr[] = {
293 { QCameraParameters::VIDEO_HFR_OFF, CAMERA_HFR_MODE_OFF },
294 { QCameraParameters::VIDEO_HFR_2X, CAMERA_HFR_MODE_60FPS },
295 { QCameraParameters::VIDEO_HFR_3X, CAMERA_HFR_MODE_90FPS },
296 { QCameraParameters::VIDEO_HFR_4X, CAMERA_HFR_MODE_120FPS },
297 };
298 static const int HFR_VALUES_COUNT = (sizeof(hfr)/sizeof(str_map));
299
300 static const str_map flash[] = {
301 { QCameraParameters::FLASH_MODE_OFF, LED_MODE_OFF },
302 { QCameraParameters::FLASH_MODE_AUTO, LED_MODE_AUTO },
303 { QCameraParameters::FLASH_MODE_ON, LED_MODE_ON },
304 { QCameraParameters::FLASH_MODE_TORCH, LED_MODE_TORCH}
305 };
306
307 static const str_map lensshade[] = {
308 { QCameraParameters::LENSSHADE_ENABLE, TRUE },
309 { QCameraParameters::LENSSHADE_DISABLE, FALSE }
310 };
311
312 static const str_map mce[] = {
313 { QCameraParameters::MCE_ENABLE, TRUE },
314 { QCameraParameters::MCE_DISABLE, FALSE }
315 };
316
317 static const str_map histogram[] = {
318 { QCameraParameters::HISTOGRAM_ENABLE, TRUE },
319 { QCameraParameters::HISTOGRAM_DISABLE, FALSE }
320 };
321
322 static const str_map skinToneEnhancement[] = {
323 { QCameraParameters::SKIN_TONE_ENHANCEMENT_ENABLE, TRUE },
324 { QCameraParameters::SKIN_TONE_ENHANCEMENT_DISABLE, FALSE }
325 };
326
327 static const str_map denoise[] = {
328 { QCameraParameters::DENOISE_OFF, FALSE },
329 { QCameraParameters::DENOISE_ON, TRUE }
330 };
331
332 static const str_map facedetection[] = {
333 { QCameraParameters::FACE_DETECTION_OFF, FALSE },
334 { QCameraParameters::FACE_DETECTION_ON, TRUE }
335 };
336
337 static const str_map redeye_reduction[] = {
338 { QCameraParameters::REDEYE_REDUCTION_ENABLE, TRUE },
339 { QCameraParameters::REDEYE_REDUCTION_DISABLE, FALSE }
340 };
341
342 static const str_map picture_formats[] = {
343 {QCameraParameters::PIXEL_FORMAT_JPEG, PICTURE_FORMAT_JPEG},
344 {QCameraParameters::PIXEL_FORMAT_RAW, PICTURE_FORMAT_RAW}
345 };
346
347 static const str_map recording_Hints[] = {
348 {"false", FALSE},
349 {"true", TRUE}
350 };
351
352 static const str_map preview_formats[] = {
353 {QCameraParameters::PIXEL_FORMAT_YUV420SP, HAL_PIXEL_FORMAT_YCrCb_420_SP},
354 {QCameraParameters::PIXEL_FORMAT_YUV420SP_ADRENO, HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO},
355 {QCameraParameters::PIXEL_FORMAT_YV12, HAL_PIXEL_FORMAT_YV12},
356 {QCameraParameters::PIXEL_FORMAT_YUV420P,HAL_PIXEL_FORMAT_YV12},
357 {QCameraParameters::PIXEL_FORMAT_NV12, HAL_PIXEL_FORMAT_YCbCr_420_SP}
358 };
359
360 static const preview_format_info_t preview_format_info_list[] = {
361 {HAL_PIXEL_FORMAT_YCrCb_420_SP, CAMERA_YUV_420_NV21, CAMERA_PAD_TO_WORD, 2},
362 {HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO, CAMERA_YUV_420_NV21, CAMERA_PAD_TO_4K, 2},
363 {HAL_PIXEL_FORMAT_YCbCr_420_SP, CAMERA_YUV_420_NV12, CAMERA_PAD_TO_WORD, 2},
364 {HAL_PIXEL_FORMAT_YV12, CAMERA_YUV_420_YV12, CAMERA_PAD_TO_WORD, 3}
365 };
366
367 static const str_map zsl_modes[] = {
368 { QCameraParameters::ZSL_OFF, FALSE },
369 { QCameraParameters::ZSL_ON, TRUE },
370 };
371
372
373 static const str_map hdr_bracket[] = {
374 { QCameraParameters::AE_BRACKET_HDR_OFF,HDR_BRACKETING_OFF},
375 { QCameraParameters::AE_BRACKET_HDR,HDR_MODE },
376 { QCameraParameters::AE_BRACKET,EXP_BRACKETING_MODE }
377 };
378
379 typedef enum {
380 NORMAL_POWER,
381 LOW_POWER
382 } power_mode;
383
384 static const str_map power_modes[] = {
385 { QCameraParameters::NORMAL_POWER,NORMAL_POWER },
386 { QCameraParameters::LOW_POWER,LOW_POWER }
387 };
388
389 /**************************************************************************/
attr_lookup(const str_map arr[],int len,const char * name)390 static int attr_lookup(const str_map arr[], int len, const char *name)
391 {
392 if (name) {
393 for (int i = 0; i < len; i++) {
394 if (!strcmp(arr[i].desc, name))
395 return arr[i].val;
396 }
397 }
398 return NOT_FOUND;
399 }
400
native_set_parms(mm_camera_parm_type_t type,uint16_t length,void * value)401 bool QCameraHardwareInterface::native_set_parms(
402 mm_camera_parm_type_t type, uint16_t length, void *value)
403 {
404 ALOGV("%s : type : %d Value : %d",__func__,type,*((int *)value));
405 if(mCameraHandle->ops->set_parm(mCameraHandle->camera_handle, type,value ) < 0) {
406 ALOGE("native_set_parms failed: type %d length %d error %s",
407 type, length, strerror(errno));
408 return false;
409 }
410
411 return true;
412
413 }
414
native_set_parms(mm_camera_parm_type_t type,uint16_t length,void * value,int * result)415 bool QCameraHardwareInterface::native_set_parms(
416 mm_camera_parm_type_t type, uint16_t length, void *value, int *result)
417 {
418 *result= mCameraHandle->ops->set_parm(mCameraHandle->camera_handle, type,value );
419 if( *result >=0 ) {
420 ALOGE("native_set_parms: succeeded : %d", *result);
421 return true;
422 }
423
424 ALOGV("native_set_parms failed: type %d length %d error str %s error# %d",
425 type, length, strerror(errno), errno);
426 return false;
427 }
428
429 //Filter Picture sizes based on max width and height
430 /* TBD: do we still need this - except for ZSL? */
filterPictureSizes()431 void QCameraHardwareInterface::filterPictureSizes(){
432 unsigned int i;
433 if(mPictureSizeCount <= 0)
434 return;
435 maxSnapshotWidth = mPictureSizes[0].width;
436 maxSnapshotHeight = mPictureSizes[0].height;
437 // Iterate through all the width and height to find the max value
438 for(i =0; i<mPictureSizeCount;i++){
439 if(((maxSnapshotWidth < mPictureSizes[i].width) &&
440 (maxSnapshotHeight <= mPictureSizes[i].height))){
441 maxSnapshotWidth = mPictureSizes[i].width;
442 maxSnapshotHeight = mPictureSizes[i].height;
443 }
444 }
445 if(myMode & CAMERA_ZSL_MODE){
446 // due to lack of PMEM we restrict to lower resolution
447 mPictureSizesPtr = zsl_picture_sizes;
448 mSupportedPictureSizesCount = 7;
449 }else{
450 mPictureSizesPtr = mPictureSizes;
451 mSupportedPictureSizesCount = mPictureSizeCount;
452 }
453 }
454
create_sizes_str(const camera_size_type * sizes,int len)455 static String8 create_sizes_str(const camera_size_type *sizes, int len) {
456 String8 str;
457 char buffer[32];
458
459 if (len > 0) {
460 snprintf(buffer, sizeof(buffer), "%dx%d", sizes[0].width, sizes[0].height);
461 str.append(buffer);
462 }
463 for (int i = 1; i < len; i++) {
464 snprintf(buffer, sizeof(buffer), ",%dx%d", sizes[i].width, sizes[i].height);
465 str.append(buffer);
466 }
467 return str;
468 }
469
create_values_str(const str_map * values,int len)470 String8 QCameraHardwareInterface::create_values_str(const str_map *values, int len) {
471 String8 str;
472
473 if (len > 0) {
474 str.append(values[0].desc);
475 }
476 for (int i = 1; i < len; i++) {
477 str.append(",");
478 str.append(values[i].desc);
479 }
480 return str;
481 }
482
create_fps_str(const android::FPSRange * fps,int len)483 static String8 create_fps_str(const android:: FPSRange* fps, int len) {
484 String8 str;
485 char buffer[32];
486
487 if (len > 0) {
488 snprintf(buffer, sizeof(buffer), "(%d,%d)", fps[0].minFPS, fps[0].maxFPS);
489 str.append(buffer);
490 }
491 for (int i = 1; i < len; i++) {
492 snprintf(buffer, sizeof(buffer), ",(%d,%d)", fps[i].minFPS, fps[i].maxFPS);
493 str.append(buffer);
494 }
495 return str;
496 }
497
create_values_range_str(int min,int max)498 static String8 create_values_range_str(int min, int max){
499 String8 str;
500 char buffer[32];
501
502 if(min <= max){
503 snprintf(buffer, sizeof(buffer), "%d", min);
504 str.append(buffer);
505
506 for (int i = min + 1; i <= max; i++) {
507 snprintf(buffer, sizeof(buffer), ",%d", i);
508 str.append(buffer);
509 }
510 }
511 return str;
512 }
513
parse_size(const char * str,int & width,int & height)514 static int parse_size(const char *str, int &width, int &height)
515 {
516 // Find the width.
517 char *end;
518 int w = (int)strtol(str, &end, 10);
519 // If an 'x' or 'X' does not immediately follow, give up.
520 if ( (*end != 'x') && (*end != 'X') )
521 return -1;
522
523 // Find the height, immediately after the 'x'.
524 int h = (int)strtol(end+1, 0, 10);
525
526 width = w;
527 height = h;
528
529 return 0;
530 }
531
isValidDimension(int width,int height)532 bool QCameraHardwareInterface::isValidDimension(int width, int height) {
533 bool retVal = FALSE;
534 /* This function checks if a given resolution is valid or not.
535 * A particular resolution is considered valid if it satisfies
536 * the following conditions:
537 * 1. width & height should be multiple of 16.
538 * 2. width & height should be less than/equal to the dimensions
539 * supported by the camera sensor.
540 * 3. the aspect ratio is a valid aspect ratio and is among the
541 * commonly used aspect ratio as determined by the thumbnail_sizes
542 * data structure.
543 */
544
545 if( (width == CEILING16(width)) && (height == CEILING16(height))
546 && (width <= maxSnapshotWidth)
547 && (height <= maxSnapshotHeight) )
548 {
549 uint32_t pictureAspectRatio = (uint32_t)((width * Q12)/height);
550 for(uint32_t i = 0; i < THUMBNAIL_SIZE_COUNT; i++ ) {
551 if(thumbnail_sizes[i].aspect_ratio == pictureAspectRatio) {
552 retVal = TRUE;
553 break;
554 }
555 }
556 }
557 return retVal;
558 }
559
hasAutoFocusSupport()560 void QCameraHardwareInterface::hasAutoFocusSupport(){
561
562 ALOGV("%s",__func__);
563 mHasAutoFocusSupport = false;
564
565 if(isZSLMode()){
566 mHasAutoFocusSupport = false;
567 return;
568 }
569
570 if(mCameraHandle->ops->is_op_supported(mCameraHandle->camera_handle, MM_CAMERA_OPS_FOCUS)) {
571 mHasAutoFocusSupport = true;
572 }
573 else {
574 ALOGE("AutoFocus is not supported");
575 mHasAutoFocusSupport = false;
576 }
577 ALOGV("%s:rc= %d",__func__, mHasAutoFocusSupport);
578
579 }
580
supportsSceneDetection()581 bool QCameraHardwareInterface::supportsSceneDetection() {
582 bool rc ;
583 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,MM_CAMERA_PARM_ASD_ENABLE,(uint8_t*)&rc,(uint8_t*)&rc);
584 return rc;
585 }
586
supportsFaceDetection()587 bool QCameraHardwareInterface::supportsFaceDetection() {
588 bool rc ;
589 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,MM_CAMERA_PARM_FD,(uint8_t*)&rc,(uint8_t*)&rc);
590 return rc;
591 }
592
supportsSelectableZoneAf()593 bool QCameraHardwareInterface::supportsSelectableZoneAf() {
594 bool rc ;
595 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,MM_CAMERA_PARM_FOCUS_RECT,(uint8_t*)&rc,(uint8_t*)&rc);
596 return rc;
597 }
598
supportsRedEyeReduction()599 bool QCameraHardwareInterface::supportsRedEyeReduction() {
600 bool rc ;
601 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,MM_CAMERA_PARM_REDEYE_REDUCTION,(uint8_t*)&rc,(uint8_t*)&rc);
602 return rc;
603 }
604
create_str(int16_t * arr,int length)605 static String8 create_str(int16_t *arr, int length){
606 String8 str;
607 char buffer[32] = {0};
608
609 if(length > 0){
610 snprintf(buffer, sizeof(buffer), "%d", arr[0]);
611 str.append(buffer);
612 }
613
614 for (int i =1;i<length;i++){
615 snprintf(buffer, sizeof(buffer), ",%d",arr[i]);
616 str.append(buffer);
617 }
618 return str;
619 }
620
getMaxPictureDimension(mm_camera_dimension_t * maxDim)621 bool QCameraHardwareInterface::getMaxPictureDimension(mm_camera_dimension_t *maxDim)
622 {
623 bool ret = NO_ERROR;
624 mm_camera_dimension_t dim;
625
626 ret = mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
627 MM_CAMERA_PARM_MAX_PICTURE_SIZE, &dim);
628 if (ret != NO_ERROR)
629 return ret;
630
631 /* Find the first dimension in the mPictureSizes
632 * array which is smaller than the max dimension.
633 * This will be the valid max picture resolution */
634 for (unsigned int i = 0; i < mPictureSizeCount; i++) {
635 if ((mPictureSizes[i].width <= dim.width) &&
636 (mPictureSizes[i].height <= dim.height)) {
637 maxDim->height = mPictureSizes[i].height;
638 maxDim->width = mPictureSizes[i].width;
639 break;
640 }
641 }
642 ALOGD("%s: Found Max Picture dimension: %d x %d", __func__,
643 maxDim->width, maxDim->height);
644 return ret;
645 }
loadTables()646 void QCameraHardwareInterface::loadTables()
647 {
648
649 bool ret = NO_ERROR;
650 ALOGV("%s: E", __func__);
651
652 ret = mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
653 MM_CAMERA_PARM_PREVIEW_SIZES_CNT, &preview_sizes_count);
654
655 default_sizes_tbl_t preview_sizes_tbl;
656 preview_sizes_tbl.tbl_size=preview_sizes_count;
657 preview_sizes_tbl.sizes_tbl=&default_preview_sizes[0];
658 if(mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
659 MM_CAMERA_PARM_DEF_PREVIEW_SIZES, &preview_sizes_tbl)<0){
660 ALOGE("%s:Failed to get default preview sizes",__func__);
661 }
662 ret = mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
663 MM_CAMERA_PARM_VIDEO_SIZES_CNT, &video_sizes_count);
664
665 default_sizes_tbl_t video_sizes_tbl;
666 video_sizes_tbl.tbl_size=video_sizes_count;
667 video_sizes_tbl.sizes_tbl=&default_video_sizes[0];
668 if(mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
669 MM_CAMERA_PARM_DEF_VIDEO_SIZES, &video_sizes_tbl)<0){
670 ALOGE("%s:Failed to get default video sizes",__func__);
671 }
672
673 ret = mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
674 MM_CAMERA_PARM_THUMB_SIZES_CNT, &thumbnail_sizes_count);
675
676 default_sizes_tbl_t thumbnail_sizes_tbl;
677 thumbnail_sizes_tbl.tbl_size=thumbnail_sizes_count;
678 thumbnail_sizes_tbl.sizes_tbl=&default_thumbnail_sizes[0];
679 if(mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
680 MM_CAMERA_PARM_DEF_THUMB_SIZES, &thumbnail_sizes_tbl)<0){
681 ALOGE("%s:Failed to get default thumbnail sizes",__func__);
682 }
683
684 ret = mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
685 MM_CAMERA_PARM_HFR_SIZES_CNT, &hfr_sizes_count);
686
687 default_sizes_tbl_t hfr_sizes_tbl;
688 hfr_sizes_tbl.tbl_size=hfr_sizes_count;
689 hfr_sizes_tbl.sizes_tbl=&default_hfr_sizes[0];
690 if(mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
691 MM_CAMERA_PARM_DEF_HFR_SIZES, &hfr_sizes_tbl)<0){
692 ALOGE("%s:Failed to get default HFR sizes",__func__);
693 }
694 ALOGE("%s: X", __func__);
695 }
initDefaultParameters()696 void QCameraHardwareInterface::initDefaultParameters()
697 {
698 bool ret;
699 char prop[PROPERTY_VALUE_MAX];
700 mm_camera_dimension_t maxDim;
701 int rc = 0;
702 ALOGI("%s: E", __func__);
703 uint8_t supported;
704
705 memset(&maxDim, 0, sizeof(mm_camera_dimension_t));
706 ret = getMaxPictureDimension(&maxDim);
707
708 if (ret != NO_ERROR) {
709 ALOGE("%s: Cannot get Max picture size supported", __func__);
710 return;
711 }
712 if (!maxDim.width || !maxDim.height) {
713 maxDim.width = DEFAULT_LIVESHOT_WIDTH;
714 maxDim.height = DEFAULT_LIVESHOT_HEIGHT;
715 }
716
717 memset(prop, 0, sizeof(prop));
718 property_get("persist.camera.snap.format", prop, "0");
719 mSnapshotFormat = atoi(prop);
720 ALOGV("%s: prop =(%s), snap_format=%d", __func__, prop, mSnapshotFormat);
721
722 //cam_ctrl_dimension_t dim;
723 mHFRLevel = 0;
724 memset(&mDimension, 0, sizeof(cam_ctrl_dimension_t));
725 memset(&mPreviewFormatInfo, 0, sizeof(preview_format_info_t));
726 mDimension.video_width = DEFAULT_VIDEO_WIDTH;
727 mDimension.video_height = DEFAULT_VIDEO_HEIGHT;
728 mDimension.picture_width = maxDim.width;
729 mDimension.picture_height = maxDim.height;
730 mDimension.display_width = DEFAULT_STREAM_WIDTH;
731 mDimension.display_height = DEFAULT_STREAM_HEIGHT;
732 mDimension.orig_picture_dx = mDimension.picture_width;
733 mDimension.orig_picture_dy = mDimension.picture_height;
734 mDimension.ui_thumbnail_width = DEFAULT_STREAM_WIDTH;
735 mDimension.ui_thumbnail_height = DEFAULT_STREAM_HEIGHT;
736 mDimension.orig_video_width = DEFAULT_STREAM_WIDTH;
737 mDimension.orig_video_height = DEFAULT_STREAM_HEIGHT;
738
739 mDimension.prev_format = CAMERA_YUV_420_NV21;
740 mDimension.enc_format = CAMERA_YUV_420_NV12;
741 if (mSnapshotFormat == 1) {
742 mDimension.main_img_format = CAMERA_YUV_422_NV61;
743 } else {
744 mDimension.main_img_format = CAMERA_YUV_420_NV21;
745 }
746 mDimension.thumb_format = CAMERA_YUV_420_NV21;
747 ALOGV("%s: main_img_format =%d, thumb_format=%d", __func__,
748 mDimension.main_img_format, mDimension.thumb_format);
749 mDimension.prev_padding_format = CAMERA_PAD_TO_WORD;
750
751 ret = native_set_parms(MM_CAMERA_PARM_DIMENSION,
752 sizeof(cam_ctrl_dimension_t), (void *) &mDimension);
753 if(!ret) {
754 ALOGE("MM_CAMERA_PARM_DIMENSION Failed.");
755 return;
756 }
757
758 hasAutoFocusSupport();
759
760 // Initialize constant parameter strings. This will happen only once in the
761 // lifetime of the mediaserver process.
762 if (true/*!mParamStringInitialized*/) {
763 //filter picture sizes
764 filterPictureSizes();
765 mPictureSizeValues = create_sizes_str(
766 mPictureSizesPtr, mSupportedPictureSizesCount);
767 mPreviewSizeValues = create_sizes_str(
768 mPreviewSizes, mPreviewSizeCount);
769 mVideoSizeValues = create_sizes_str(
770 mVideoSizes, mVideoSizeCount);
771
772 //Query for max HFR value
773 camera_hfr_mode_t maxHFR;
774 mCameraHandle->ops->get_parm(mCameraHandle->camera_handle, MM_CAMERA_PARM_MAX_HFR_MODE, (void *)&maxHFR);
775 //Filter HFR values and build parameter string
776 String8 str;
777 for(int i=0; i<HFR_VALUES_COUNT; i++){
778 if(hfr[i].val <= maxHFR){
779 if(i>0) str.append(",");
780 str.append(hfr[i].desc);
781 }
782 }
783 mHfrValues = str;
784 mHfrSizeValues = create_sizes_str(
785 default_hfr_sizes, hfr_sizes_count);
786
787 //Query for min and max fps values from lower layer
788 if(MM_CAMERA_OK != mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
789 MM_CAMERA_PARM_FPS_RANGE, (void *)&mSensorFpsRange)){
790 ALOGE("error: failed to get fps range from sensor");
791 return;
792 } else {
793 ALOGD("sensor fps range = (%f, %f)", mSensorFpsRange.min_fps,
794 mSensorFpsRange.max_fps);
795
796 mSupportedFpsRanges = new android::FPSRange[ALL_FPS_RANGES_COUNT+1];
797
798 //min and max fps in android format
799 int minFps = (int)(mSensorFpsRange.min_fps * 1000);
800 int maxFps = (int)(mSensorFpsRange.max_fps * 1000);
801 int idx=0;
802 //filter supported fps ranges according to sensor fps range
803 for(int i=0; i<(int)ALL_FPS_RANGES_COUNT; i++) {
804 if(allFpsRanges[i].maxFPS <= maxFps && allFpsRanges[i].minFPS >= minFps) {
805 memcpy(&mSupportedFpsRanges[idx], &allFpsRanges[i], sizeof(android::FPSRange));
806 idx++;
807 }
808 }
809 mSupportedFpsRangesCount = idx;
810 //insert sensor absolute fps range as one entry, if
811 //its not already there in table
812 //find insertion point
813 int insertIndex = mSupportedFpsRangesCount;
814 for(int i=0; i<mSupportedFpsRangesCount; i++) {
815 if(mSupportedFpsRanges[i].maxFPS < maxFps) {
816 continue;
817 } else if (mSupportedFpsRanges[i].maxFPS == maxFps) {
818 if(mSupportedFpsRanges[i].minFPS > minFps) {
819 insertIndex = i;
820 break;
821 } else if (mSupportedFpsRanges[i].minFPS == minFps) {
822 //entry already exists, no need to insert
823 insertIndex = -1;
824 break;
825 }
826 }
827 }
828 if(insertIndex != -1) {
829 for(int i=mSupportedFpsRangesCount; i>=0; i--) {
830 if(insertIndex == i) {
831 mSupportedFpsRanges[i].maxFPS = maxFps;
832 mSupportedFpsRanges[i].minFPS = minFps;
833 mSupportedFpsRangesCount++;
834 break;
835 }
836 mSupportedFpsRanges[i].maxFPS = mSupportedFpsRanges[i-1].maxFPS;
837 mSupportedFpsRanges[i].minFPS = mSupportedFpsRanges[i-1].minFPS;
838 }
839 }
840 mFpsRangesSupportedValues = create_fps_str(mSupportedFpsRanges, mSupportedFpsRangesCount);
841
842 ALOGD("supported fps ranges = %s", mFpsRangesSupportedValues.string());
843 mParameters.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
844 mFpsRangesSupportedValues);
845 mParameters.setPreviewFpsRange(minFps, maxFps);
846 }
847
848 mFlashValues = create_values_str(
849 flash, sizeof(flash) / sizeof(str_map));
850 mLensShadeValues = create_values_str(
851 lensshade,sizeof(lensshade)/sizeof(str_map));
852 mMceValues = create_values_str(
853 mce,sizeof(mce)/sizeof(str_map));
854 mEffectValues = create_values_str(effects, sizeof(effects) / sizeof(str_map));
855 mAntibandingValues = create_values_str(
856 antibanding, sizeof(antibanding) / sizeof(str_map));
857 mIsoValues = create_values_str(iso,sizeof(iso)/sizeof(str_map));
858 mAutoExposureValues = create_values_str(
859 autoexposure, sizeof(autoexposure) / sizeof(str_map));
860 mWhitebalanceValues = create_values_str(
861 whitebalance, sizeof(whitebalance) / sizeof(str_map));
862
863 if(mHasAutoFocusSupport){
864 mFocusModeValues = create_values_str(
865 focus_modes, sizeof(focus_modes) / sizeof(str_map));
866 }
867
868 mSceneModeValues = create_values_str(scenemode, sizeof(scenemode) / sizeof(str_map));
869
870 if(mHasAutoFocusSupport){
871 mTouchAfAecValues = create_values_str(
872 touchafaec,sizeof(touchafaec)/sizeof(str_map));
873 }
874 //Currently Enabling Histogram for 8x60
875 mHistogramValues = create_values_str(
876 histogram,sizeof(histogram)/sizeof(str_map));
877
878 mSkinToneEnhancementValues = create_values_str(
879 skinToneEnhancement,sizeof(skinToneEnhancement)/sizeof(str_map));
880
881 mPictureFormatValues = create_values_str(
882 picture_formats, sizeof(picture_formats)/sizeof(str_map));
883
884 mZoomSupported=false;
885 mMaxZoom=0;
886 mm_camera_zoom_tbl_t zmt;
887 if( mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
888 MM_CAMERA_PARM_MAXZOOM, &mMaxZoom)<0){
889 ALOGE("%s:Failed to get max zoom",__func__);
890 }else{
891
892 ALOGE("Max Zoom:%d",mMaxZoom);
893 /* Kernel driver limits the max amount of data that can be retreived through a control
894 command to 260 bytes hence we conservatively limit to 110 zoom ratios */
895 if(mMaxZoom>MAX_ZOOM_RATIOS) {
896 ALOGE("%s:max zoom is larger than sizeof zoomRatios table",__func__);
897 mMaxZoom=MAX_ZOOM_RATIOS-1;
898 }
899 zmt.size=mMaxZoom;
900 zmt.zoom_ratio_tbl=&zoomRatios[0];
901 if( mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
902 MM_CAMERA_PARM_ZOOM_RATIO, &zmt)<0){
903 ALOGE("%s:Failed to get max zoom ratios",__func__);
904 }else{
905 mZoomSupported=true;
906 mZoomRatioValues = create_str(zoomRatios, mMaxZoom);
907 }
908 }
909
910 ALOGE("Zoom supported:%d",mZoomSupported);
911
912 denoise_value = create_values_str(
913 denoise, sizeof(denoise) / sizeof(str_map));
914
915 if(supportsFaceDetection()) {
916 mFaceDetectionValues = create_values_str(
917 facedetection, sizeof(facedetection) / sizeof(str_map));
918 }
919
920 if(mHasAutoFocusSupport){
921 mSelectableZoneAfValues = create_values_str(
922 selectable_zone_af, sizeof(selectable_zone_af) / sizeof(str_map));
923 }
924
925 mSceneDetectValues = create_values_str(scenedetect, sizeof(scenedetect) / sizeof(str_map));
926
927 mRedeyeReductionValues = create_values_str(
928 redeye_reduction, sizeof(redeye_reduction) / sizeof(str_map));
929
930 mZslValues = create_values_str(
931 zsl_modes,sizeof(zsl_modes)/sizeof(str_map));
932
933 mParamStringInitialized = true;
934 }
935
936 //set supported video sizes
937 mParameters.set(QCameraParameters::KEY_SUPPORTED_VIDEO_SIZES, mVideoSizeValues.string());
938
939 //set default video size to first one in supported table
940 String8 vSize = create_sizes_str(&mVideoSizes[0], 1);
941 mParameters.set(QCameraParameters::KEY_VIDEO_SIZE, vSize.string());
942
943 //Set Preview size
944 int default_preview_width, default_preview_height;
945 mCameraHandle->ops->get_parm(mCameraHandle->camera_handle, MM_CAMERA_PARM_DEFAULT_PREVIEW_WIDTH,
946 &default_preview_width);
947 mCameraHandle->ops->get_parm(mCameraHandle->camera_handle, MM_CAMERA_PARM_DEFAULT_PREVIEW_HEIGHT,
948 &default_preview_height);
949 mParameters.setPreviewSize(default_preview_width, default_preview_height);
950 mParameters.set(QCameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
951 mPreviewSizeValues.string());
952 mDimension.display_width = default_preview_width;
953 mDimension.display_height = default_preview_height;
954
955 mPreviewFrameRateValues = create_values_range_str(
956 MINIMUM_FPS, MAXIMUM_FPS);
957
958
959 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle, MM_CAMERA_PARM_FPS,&supported,&supported);
960 if (supported) {
961 mParameters.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
962 mPreviewFrameRateValues.string());
963 } else {
964 mParameters.set(
965 QCameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
966 DEFAULT_FIXED_FPS);
967 }
968 //Set Preview Format
969 //mParameters.setPreviewFormat("yuv420sp"); // informative
970 mParameters.setPreviewFormat(QCameraParameters::PIXEL_FORMAT_YUV420SP);
971
972 mPreviewFormatValues = create_values_str(
973 preview_formats, sizeof(preview_formats) / sizeof(str_map));
974 mParameters.set(QCameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
975 mPreviewFormatValues.string());
976
977 //Set Overlay Format
978 mParameters.set("overlay-format", HAL_PIXEL_FORMAT_YCbCr_420_SP);
979 mParameters.set("max-num-detected-faces-hw", "2");
980
981 // Set supported max faces
982 int maxNumFaces = 0;
983 if (supportsFaceDetection()) {
984 //Query the maximum number of faces supported by hardware.
985 if(MM_CAMERA_OK != mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
986 MM_CAMERA_PARM_MAX_NUM_FACES_DECT, &maxNumFaces)){
987 ALOGE("%s:Failed to get max number of faces supported",__func__);
988 }
989 }
990 mParameters.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, maxNumFaces);
991 //This paramtere is set to default here. This will be changed by application
992 //if it needs to support specific number of faces. See also setParameters.
993 mParameters.set(QCameraParameters::KEY_QC_MAX_NUM_REQUESTED_FACES, 2);
994
995 // Set camera features supported flag
996 int32_t featureFlag = 0;
997 if (supportsFaceDetection()) {
998 featureFlag |= 0x00000001; // bit 0 indicate faciral feature
999 }
1000 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_CAMERA_FEATURES, featureFlag);
1001
1002 //Set Picture Size
1003 mParameters.setPictureSize(DEFAULT_PICTURE_WIDTH, DEFAULT_PICTURE_HEIGHT);
1004 mParameters.set(QCameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
1005 mPictureSizeValues.string());
1006
1007 //Set Preview Frame Rate
1008 if(mFps >= MINIMUM_FPS && mFps <= MAXIMUM_FPS) {
1009 mParameters.setPreviewFrameRate(mFps);
1010 }else{
1011 mParameters.setPreviewFrameRate(DEFAULT_FIXED_FPS);
1012 }
1013
1014 //Set Picture Format
1015 mParameters.setPictureFormat("jpeg"); // informative
1016 mParameters.set(QCameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
1017 mPictureFormatValues);
1018
1019 mParameters.set(QCameraParameters::KEY_JPEG_QUALITY, "85"); // max quality
1020 mJpegQuality = 85;
1021 //Set Video Format
1022 mParameters.set(QCameraParameters::KEY_VIDEO_FRAME_FORMAT, "yuv420sp");
1023
1024 //Set Thumbnail parameters
1025 mParameters.set(QCameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
1026 THUMBNAIL_WIDTH_STR); // informative
1027 mParameters.set(QCameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
1028 THUMBNAIL_HEIGHT_STR); // informative
1029 mDimension.ui_thumbnail_width =
1030 thumbnail_sizes[DEFAULT_THUMBNAIL_SETTING].width;
1031 mDimension.ui_thumbnail_height =
1032 thumbnail_sizes[DEFAULT_THUMBNAIL_SETTING].height;
1033 mParameters.set(QCameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, "90");
1034 String8 valuesStr = create_sizes_str(default_thumbnail_sizes, thumbnail_sizes_count);
1035 mParameters.set(QCameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
1036 valuesStr.string());
1037 // Define CAMERA_SMOOTH_ZOOM in Android.mk file , to enable smoothzoom
1038 #ifdef CAMERA_SMOOTH_ZOOM
1039 mParameters.set(QCameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "true");
1040 #endif
1041 if(mZoomSupported){
1042 mParameters.set(QCameraParameters::KEY_ZOOM_SUPPORTED, "true");
1043 ALOGE("max zoom is %d", mMaxZoom-1);
1044 /* mMaxZoom value that the query interface returns is the size
1045 ALOGV("max zoom is %d", mMaxZoom-1);
1046 * mMaxZoom value that the query interface returns is the size
1047 * of zoom table. So the actual max zoom value will be one
1048 * less than that value. */
1049
1050 mParameters.set("max-zoom",mMaxZoom-1);
1051 mParameters.set(QCameraParameters::KEY_ZOOM_RATIOS,
1052 mZoomRatioValues);
1053 } else
1054 {
1055 mParameters.set(QCameraParameters::KEY_ZOOM_SUPPORTED, "false");
1056 }
1057
1058 /* Enable zoom support for video application if VPE enabled */
1059 if(mZoomSupported) {
1060 mParameters.set("video-zoom-support", "true");
1061 } else {
1062 mParameters.set("video-zoom-support", "false");
1063 }
1064
1065 //8960 supports Power modes : Low power, Normal Power.
1066 mParameters.set("power-mode-supported", "true");
1067 //Set Live shot support
1068 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
1069 MM_CAMERA_PARM_LIVESHOT_MAIN,
1070 &supported,&supported);
1071 if(!supported) {
1072 ALOGE("%s:LIVESHOT is not supported", __func__);
1073 mParameters.set("video-snapshot-supported", "false");
1074 mFullLiveshotEnabled = rc;
1075 } else {
1076 mParameters.set("video-snapshot-supported", "true");
1077 }
1078
1079 //Set default power mode
1080 mParameters.set(QCameraParameters::KEY_QC_POWER_MODE,"Normal_Power");
1081
1082 //Set Camera Mode
1083 mParameters.set(QCameraParameters::KEY_QC_CAMERA_MODE,0);
1084 mParameters.set(QCameraParameters::KEY_QC_AE_BRACKET_HDR,"Off");
1085
1086 //Set Antibanding
1087 mParameters.set(QCameraParameters::KEY_ANTIBANDING,
1088 QCameraParameters::ANTIBANDING_OFF);
1089 mParameters.set(QCameraParameters::KEY_SUPPORTED_ANTIBANDING,
1090 mAntibandingValues);
1091
1092 //Set Effect
1093 mParameters.set(QCameraParameters::KEY_EFFECT,
1094 QCameraParameters::EFFECT_NONE);
1095 mParameters.set(QCameraParameters::KEY_SUPPORTED_EFFECTS, mEffectValues);
1096
1097 //Set Auto Exposure
1098 mParameters.set(QCameraParameters::KEY_QC_AUTO_EXPOSURE,
1099 QCameraParameters::AUTO_EXPOSURE_FRAME_AVG);
1100 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_AUTO_EXPOSURE, mAutoExposureValues);
1101
1102 //Set WhiteBalance
1103 mParameters.set(QCameraParameters::KEY_WHITE_BALANCE,
1104 QCameraParameters::WHITE_BALANCE_AUTO);
1105 mParameters.set(QCameraParameters::KEY_SUPPORTED_WHITE_BALANCE,mWhitebalanceValues);
1106
1107 //Set AEC_LOCK
1108 mParameters.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, "false");
1109 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
1110 MM_CAMERA_PARM_AEC_LOCK,&supported,&supported);
1111 if(supported){
1112 mParameters.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, "true");
1113 } else {
1114 mParameters.set(QCameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, "false");
1115 }
1116 //Set AWB_LOCK
1117 mParameters.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, "false");
1118 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
1119 MM_CAMERA_PARM_AWB_LOCK,&supported,&supported);
1120 if(supported)
1121 mParameters.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, "true");
1122 else
1123 mParameters.set(QCameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, "false");
1124
1125 //Set Focus Mode
1126 if(mHasAutoFocusSupport){
1127 mParameters.set(QCameraParameters::KEY_FOCUS_MODE,
1128 QCameraParameters::FOCUS_MODE_AUTO);
1129 mFocusMode = AF_MODE_AUTO;
1130 mParameters.set(QCameraParameters::KEY_SUPPORTED_FOCUS_MODES,
1131 mFocusModeValues);
1132 mParameters.set(QCameraParameters::KEY_MAX_NUM_FOCUS_AREAS, "1");
1133 mParameters.set(QCameraParameters::KEY_MAX_NUM_METERING_AREAS, "1");
1134 } else {
1135 mParameters.set(QCameraParameters::KEY_FOCUS_MODE,
1136 QCameraParameters::FOCUS_MODE_INFINITY);
1137 mFocusMode = DONT_CARE;
1138 mParameters.set(QCameraParameters::KEY_SUPPORTED_FOCUS_MODES,
1139 QCameraParameters::FOCUS_MODE_INFINITY);
1140 mParameters.set(QCameraParameters::KEY_MAX_NUM_FOCUS_AREAS, "0");
1141 mParameters.set(QCameraParameters::KEY_MAX_NUM_METERING_AREAS, "0");
1142 }
1143
1144 mParameters.set(QCameraParameters::KEY_FOCUS_AREAS, DEFAULT_CAMERA_AREA);
1145 mParameters.set(QCameraParameters::KEY_METERING_AREAS, DEFAULT_CAMERA_AREA);
1146
1147 //Set Flash
1148 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
1149 MM_CAMERA_PARM_LED_MODE,&supported,&supported);
1150 if(supported){
1151 mParameters.set(CameraParameters::KEY_FLASH_MODE,
1152 CameraParameters::FLASH_MODE_OFF);
1153 mParameters.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
1154 mFlashValues);
1155 }
1156
1157 //Set Sharpness
1158 mParameters.set(QCameraParameters::KEY_QC_MAX_SHARPNESS,
1159 CAMERA_MAX_SHARPNESS);
1160 mParameters.set(QCameraParameters::KEY_QC_SHARPNESS,
1161 CAMERA_DEF_SHARPNESS);
1162
1163 //Set Contrast
1164 mParameters.set(QCameraParameters::KEY_QC_MAX_CONTRAST,
1165 CAMERA_MAX_CONTRAST);
1166 mParameters.set(QCameraParameters::KEY_QC_CONTRAST,
1167 CAMERA_DEF_CONTRAST);
1168
1169 //Set Saturation
1170 mParameters.set(QCameraParameters::KEY_QC_MAX_SATURATION,
1171 CAMERA_MAX_SATURATION);
1172 mParameters.set(QCameraParameters::KEY_QC_SATURATION,
1173 CAMERA_DEF_SATURATION);
1174
1175 //Set Brightness/luma-adaptaion
1176 mParameters.set("luma-adaptation", "3");
1177
1178 mParameters.set(QCameraParameters::KEY_PICTURE_FORMAT,
1179 QCameraParameters::PIXEL_FORMAT_JPEG);
1180
1181 //Set Lensshading
1182 mParameters.set(QCameraParameters::KEY_QC_LENSSHADE,
1183 QCameraParameters::LENSSHADE_ENABLE);
1184 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_LENSSHADE_MODES,
1185 mLensShadeValues);
1186
1187 //Set ISO Mode
1188 mParameters.set(QCameraParameters::KEY_QC_ISO_MODE,
1189 QCameraParameters::ISO_AUTO);
1190 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_ISO_MODES,
1191 mIsoValues);
1192
1193 //Set MCE
1194 mParameters.set(QCameraParameters::KEY_QC_MEMORY_COLOR_ENHANCEMENT,
1195 QCameraParameters::MCE_ENABLE);
1196 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_MEM_COLOR_ENHANCE_MODES,
1197 mMceValues);
1198
1199 //Set HFR
1200 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
1201 MM_CAMERA_PARM_HFR,&supported,&supported);
1202 if(supported){
1203 mParameters.set(QCameraParameters::KEY_QC_VIDEO_HIGH_FRAME_RATE,
1204 QCameraParameters::VIDEO_HFR_OFF);
1205 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_HFR_SIZES,
1206 mHfrSizeValues.string());
1207 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_VIDEO_HIGH_FRAME_RATE_MODES,
1208 mHfrValues);
1209 } else{
1210 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_HFR_SIZES,"");
1211 }
1212
1213 //Set Histogram
1214 mParameters.set(QCameraParameters::KEY_QC_HISTOGRAM,
1215 QCameraParameters::HISTOGRAM_DISABLE);
1216 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_HISTOGRAM_MODES,
1217 mHistogramValues);
1218
1219 //Set SkinTone Enhancement
1220 mParameters.set(QCameraParameters::KEY_QC_SKIN_TONE_ENHANCEMENT,
1221 QCameraParameters::SKIN_TONE_ENHANCEMENT_DISABLE);
1222 mParameters.set("skinToneEnhancement", "0");
1223 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_SKIN_TONE_ENHANCEMENT_MODES,
1224 mSkinToneEnhancementValues);
1225
1226 //Set Scene Mode
1227 mParameters.set(QCameraParameters::KEY_SCENE_MODE,
1228 QCameraParameters::SCENE_MODE_AUTO);
1229 mParameters.set(QCameraParameters::KEY_SUPPORTED_SCENE_MODES,
1230 mSceneModeValues);
1231
1232 //Set Streaming Textures
1233 mParameters.set("strtextures", "OFF");
1234
1235 //Set Denoise
1236 mParameters.set(QCameraParameters::KEY_QC_DENOISE,
1237 QCameraParameters::DENOISE_OFF);
1238 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_DENOISE,
1239 denoise_value);
1240 //Set Touch AF/AEC
1241 mParameters.set(QCameraParameters::KEY_QC_TOUCH_AF_AEC,
1242 QCameraParameters::TOUCH_AF_AEC_OFF);
1243 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_TOUCH_AF_AEC,
1244 mTouchAfAecValues);
1245 mParameters.set("touchAfAec-dx","100");
1246 mParameters.set("touchAfAec-dy","100");
1247
1248 //Set Scene Detection
1249 mParameters.set(QCameraParameters::KEY_QC_SCENE_DETECT,
1250 QCameraParameters::SCENE_DETECT_OFF);
1251 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_SCENE_DETECT,
1252 mSceneDetectValues);
1253
1254 //Set Selectable Zone AF
1255 mParameters.set(QCameraParameters::KEY_QC_SELECTABLE_ZONE_AF,
1256 QCameraParameters::SELECTABLE_ZONE_AF_AUTO);
1257 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_SELECTABLE_ZONE_AF,
1258 mSelectableZoneAfValues);
1259
1260 //Set Face Detection
1261 mParameters.set(QCameraParameters::KEY_QC_FACE_DETECTION,
1262 QCameraParameters::FACE_DETECTION_OFF);
1263 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_FACE_DETECTION,
1264 mFaceDetectionValues);
1265
1266 //Set Red Eye Reduction
1267 mParameters.set(QCameraParameters::KEY_QC_REDEYE_REDUCTION,
1268 QCameraParameters::REDEYE_REDUCTION_DISABLE);
1269 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_REDEYE_REDUCTION,
1270 mRedeyeReductionValues);
1271
1272 //Set ZSL
1273 mParameters.set(QCameraParameters::KEY_QC_ZSL,
1274 QCameraParameters::ZSL_OFF);
1275 mParameters.set(QCameraParameters::KEY_QC_SUPPORTED_ZSL_MODES,
1276 mZslValues);
1277
1278 //Set Focal length, horizontal and vertical view angles
1279 float focalLength = 0.0f;
1280 float horizontalViewAngle = 0.0f;
1281 float verticalViewAngle = 0.0f;
1282 mCameraHandle->ops->get_parm(mCameraHandle->camera_handle, MM_CAMERA_PARM_FOCAL_LENGTH,
1283 (void *)&focalLength);
1284 mParameters.setFloat(QCameraParameters::KEY_FOCAL_LENGTH,
1285 focalLength);
1286 mCameraHandle->ops->get_parm(mCameraHandle->camera_handle, MM_CAMERA_PARM_HORIZONTAL_VIEW_ANGLE,
1287 (void *)&horizontalViewAngle);
1288 mParameters.setFloat(QCameraParameters::KEY_HORIZONTAL_VIEW_ANGLE,
1289 horizontalViewAngle);
1290 mCameraHandle->ops->get_parm(mCameraHandle->camera_handle, MM_CAMERA_PARM_VERTICAL_VIEW_ANGLE,
1291 (void *)&verticalViewAngle);
1292 mParameters.setFloat(QCameraParameters::KEY_VERTICAL_VIEW_ANGLE,
1293 verticalViewAngle);
1294
1295 //Set Exposure Compensation
1296 mParameters.set(
1297 QCameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
1298 EXPOSURE_COMPENSATION_MAXIMUM_NUMERATOR);
1299 mParameters.set(
1300 QCameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
1301 EXPOSURE_COMPENSATION_MINIMUM_NUMERATOR);
1302 mParameters.set(
1303 QCameraParameters::KEY_EXPOSURE_COMPENSATION,
1304 EXPOSURE_COMPENSATION_DEFAULT_NUMERATOR);
1305 mParameters.setFloat(
1306 QCameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
1307 EXPOSURE_COMPENSATION_STEP);
1308
1309 mParameters.set("num-snaps-per-shutter", 1);
1310
1311 mParameters.set("capture-burst-captures-values", getZSLQueueDepth());
1312 mParameters.set("capture-burst-interval-supported", "true");
1313 mParameters.set("capture-burst-interval-max", BURST_INTREVAL_MAX); /*skip frames*/
1314 mParameters.set("capture-burst-interval-min", BURST_INTREVAL_MIN); /*skip frames*/
1315 mParameters.set("capture-burst-interval", BURST_INTREVAL_DEFAULT); /*skip frames*/
1316 mParameters.set("capture-burst-retroactive", 0);
1317 mParameters.set("capture-burst-retroactive-max", getZSLQueueDepth());
1318 mParameters.set("capture-burst-exposures", "");
1319 mParameters.set("capture-burst-exposures-values",
1320 "-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12");
1321 {
1322 String8 CamModeStr;
1323 char buffer[32];
1324 int flag = 0;
1325
1326 for (int i = 0; i < HAL_CAM_MODE_MAX; i++) {
1327 if ( 0 ) { /*exclude some conflicting case*/
1328 } else {
1329 if (flag == 0) { /*first item*/
1330 snprintf(buffer, sizeof(buffer), "%d", i);
1331 } else {
1332 snprintf(buffer, sizeof(buffer), ",%d", i);
1333 }
1334 flag = 1;
1335 CamModeStr.append(buffer);
1336 }
1337 }
1338 mParameters.set("camera-mode-values", CamModeStr);
1339 }
1340
1341 mParameters.set("ae-bracket-hdr-values",
1342 create_values_str(hdr_bracket, sizeof(hdr_bracket)/sizeof(str_map) ));
1343
1344 mParameters.set("no-display-mode", 0);
1345 mParameters.set("zoom", 0);
1346
1347 int mNuberOfVFEOutputs;
1348 ret = mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
1349 MM_CAMERA_PARM_VFE_OUTPUT_ENABLE, &mNuberOfVFEOutputs);
1350 if(ret < 0) {
1351 ALOGE("get parm MM_CAMERA_PARM_VFE_OUTPUT_ENABLE failed");
1352 ret = BAD_VALUE;
1353 }
1354 if(mNuberOfVFEOutputs == 1)
1355 {
1356 mParameters.set(QCameraParameters::KEY_QC_SINGLE_ISP_OUTPUT_ENABLED, "true");
1357 } else {
1358 mParameters.set(QCameraParameters::KEY_QC_SINGLE_ISP_OUTPUT_ENABLED, "false");
1359 }
1360
1361 if (setParameters(mParameters) != NO_ERROR) {
1362 ALOGE("Failed to set default parameters?!");
1363 }
1364 mInitialized = true;
1365 strTexturesOn = false;
1366
1367 ALOGI("%s: X", __func__);
1368 return;
1369 }
1370
1371 /**
1372 * Set the camera parameters. This returns BAD_VALUE if any parameter is
1373 * invalid or not supported.
1374 */
1375
setParameters(const char * parms)1376 int QCameraHardwareInterface::setParameters(const char *parms)
1377 {
1378 QCameraParameters param;
1379 String8 str = String8(parms);
1380 param.unflatten(str);
1381 status_t ret = setParameters(param);
1382 if(ret == NO_ERROR)
1383 return 0;
1384 else
1385 return -1;
1386 }
1387
1388 /**
1389 * Set the camera parameters. This returns BAD_VALUE if any parameter is
1390 * invalid or not supported. */
setParameters(const QCameraParameters & params)1391 status_t QCameraHardwareInterface::setParameters(const QCameraParameters& params)
1392 {
1393 status_t ret = NO_ERROR;
1394
1395 ALOGI("%s: E", __func__);
1396 // Mutex::Autolock l(&mLock);
1397 status_t rc, final_rc = NO_ERROR;
1398 mRestartPreview = false;
1399
1400 if ((rc = setCameraMode(params))) final_rc = rc;
1401 // if ((rc = setChannelInterfaceMask(params))) final_rc = rc;
1402 if ((rc = setPowerMode(params))) final_rc = rc;
1403 if ((rc = setPreviewSize(params))) final_rc = rc;
1404 if ((rc = setVideoSize(params))) final_rc = rc;
1405 if ((rc = setPictureSize(params))) final_rc = rc;
1406 if ((rc = setJpegThumbnailSize(params))) final_rc = rc;
1407 if ((rc = setJpegQuality(params))) final_rc = rc;
1408 if ((rc = setEffect(params))) final_rc = rc;
1409 if ((rc = setGpsLocation(params))) final_rc = rc;
1410 if ((rc = setRotation(params))) final_rc = rc;
1411 if ((rc = setZoom(params))) final_rc = rc;
1412 if ((rc = setOrientation(params))) final_rc = rc;
1413 if ((rc = setLensshadeValue(params))) final_rc = rc;
1414 if ((rc = setMCEValue(params))) final_rc = rc;
1415 if ((rc = setPictureFormat(params))) final_rc = rc;
1416 if ((rc = setSharpness(params))) final_rc = rc;
1417 if ((rc = setSaturation(params))) final_rc = rc;
1418 if ((rc = setSceneMode(params))) final_rc = rc;
1419 if ((rc = setContrast(params))) final_rc = rc;
1420 if ((rc = setFaceDetect(params))) final_rc = rc;
1421 if ((rc = setStrTextures(params))) final_rc = rc;
1422 if ((rc = setPreviewFormat(params))) final_rc = rc;
1423 if ((rc = setSkinToneEnhancement(params))) final_rc = rc;
1424 if ((rc = setWaveletDenoise(params))) final_rc = rc;
1425 if ((rc = setAntibanding(params))) final_rc = rc;
1426 // if ((rc = setOverlayFormats(params))) final_rc = rc;
1427 if ((rc = setRedeyeReduction(params))) final_rc = rc;
1428 if ((rc = setCaptureBurstExp())) final_rc = rc;
1429 if ((rc = setRDIMode(params))) final_rc = rc;
1430
1431 const char *str_val = params.get("capture-burst-exposures");
1432 if ( str_val == NULL || strlen(str_val)==0 ) {
1433 char burst_exp[PROPERTY_VALUE_MAX];
1434 memset(burst_exp, 0, sizeof(burst_exp));
1435 property_get("persist.capture.burst.exposures", burst_exp, "");
1436 if ( strlen(burst_exp)>0 ) {
1437 mParameters.set("capture-burst-exposures", burst_exp);
1438 }
1439 } else {
1440 mParameters.set("capture-burst-exposures", str_val);
1441 }
1442 mParameters.set("num-snaps-per-shutter", params.get("num-snaps-per-shutter"));
1443
1444 if ((rc = setAEBracket(params))) final_rc = rc;
1445 // if ((rc = setDenoise(params))) final_rc = rc;
1446 if ((rc = setPreviewFpsRange(params))) final_rc = rc;
1447 if((rc = setRecordingHint(params))) final_rc = rc;
1448 if ((rc = setNumOfSnapshot(params))) final_rc = rc;
1449 if ((rc = setAecAwbLock(params))) final_rc = rc;
1450
1451 const char *str = params.get(QCameraParameters::KEY_SCENE_MODE);
1452 int32_t value = attr_lookup(scenemode, sizeof(scenemode) / sizeof(str_map), str);
1453
1454 if((value != NOT_FOUND) && (value == CAMERA_BESTSHOT_OFF )) {
1455 //if ((rc = setPreviewFrameRateMode(params))) final_rc = rc;
1456 if ((rc = setPreviewFrameRate(params))) final_rc = rc;
1457 if ((rc = setAutoExposure(params))) final_rc = rc;
1458 if ((rc = setExposureCompensation(params))) final_rc = rc;
1459 if ((rc = setWhiteBalance(params))) final_rc = rc;
1460 if ((rc = setFlash(params))) final_rc = rc;
1461 if ((rc = setFocusMode(params))) final_rc = rc;
1462 if ((rc = setBrightness(params))) final_rc = rc;
1463 if ((rc = setISOValue(params))) final_rc = rc;
1464 if ((rc = setFocusAreas(params))) final_rc = rc;
1465 if ((rc = setMeteringAreas(params))) final_rc = rc;
1466 }
1467 //selectableZoneAF needs to be invoked after continuous AF
1468 if ((rc = setSelectableZoneAf(params))) final_rc = rc;
1469 // setHighFrameRate needs to be done at end, as there can
1470 // be a preview restart, and need to use the updated parameters
1471 if ((rc = setHighFrameRate(params))) final_rc = rc;
1472 if ((rc = setZSLBurstLookBack(params))) final_rc = rc;
1473 if ((rc = setZSLBurstInterval(params))) final_rc = rc;
1474 if ((rc = setNoDisplayMode(params))) final_rc = rc;
1475 if ((rc = setMobiCat(params))) final_rc = rc;
1476
1477 //Update Exiftag values.
1478 setExifTags();
1479
1480 if (mRestartPreview) {
1481 ALOGI("%s: need to restart preview", __func__);
1482 restartPreview();
1483 mRestartPreview = false;
1484 }
1485
1486 ALOGI("%s: X", __func__);
1487 return final_rc;
1488 }
1489
1490 /** Retrieve the camera parameters. The buffer returned by the camera HAL
1491 must be returned back to it with put_parameters, if put_parameters
1492 is not NULL.
1493 */
getParameters(char ** parms)1494 int QCameraHardwareInterface::getParameters(char **parms)
1495 {
1496 char* rc = NULL;
1497 String8 str;
1498 QCameraParameters param = getParameters();
1499 //param.dump();
1500 str = param.flatten( );
1501 rc = (char *)malloc(sizeof(char)*(str.length()+1));
1502 if(rc != NULL){
1503 memset(rc, 0, sizeof(char)*(str.length()+1));
1504 strncpy(rc, str.string(), str.length());
1505 rc[str.length()] = 0;
1506 *parms = rc;
1507 }
1508 return 0;
1509 }
1510
1511 /** The camera HAL uses its own memory to pass us the parameters when we
1512 call get_parameters. Use this function to return the memory back to
1513 the camera HAL, if put_parameters is not NULL. If put_parameters
1514 is NULL, then you have to use free() to release the memory.
1515 */
putParameters(char * rc)1516 void QCameraHardwareInterface::putParameters(char *rc)
1517 {
1518 free(rc);
1519 rc = NULL;
1520 }
1521
getParameters()1522 QCameraParameters& QCameraHardwareInterface::getParameters()
1523 {
1524 Mutex::Autolock lock(mLock);
1525 mParameters.set(QCameraParameters::KEY_FOCUS_DISTANCES, mFocusDistance.string());
1526 return mParameters;
1527 }
1528
runFaceDetection()1529 status_t QCameraHardwareInterface::runFaceDetection()
1530 {
1531 bool ret = true;
1532
1533 const char *str = mParameters.get(QCameraParameters::KEY_QC_FACE_DETECTION);
1534 if (str != NULL) {
1535 int value = attr_lookup(facedetection,
1536 sizeof(facedetection) / sizeof(str_map), str);
1537 fd_set_parm_t fd_set_parm;
1538 int requested_faces = mParameters.getInt(QCameraParameters::KEY_QC_MAX_NUM_REQUESTED_FACES);
1539 fd_set_parm.fd_mode = value;
1540 fd_set_parm.num_fd = requested_faces;
1541 ret = native_set_parms(MM_CAMERA_PARM_FD, sizeof(int8_t), (void *)&value);
1542 return ret ? NO_ERROR : UNKNOWN_ERROR;
1543 }
1544 ALOGE("Invalid Face Detection value: %s", (str == NULL) ? "NULL" : str);
1545 return BAD_VALUE;
1546 }
1547
setSharpness(const QCameraParameters & params)1548 status_t QCameraHardwareInterface::setSharpness(const QCameraParameters& params)
1549 {
1550 bool ret = false;
1551 int rc = MM_CAMERA_OK;
1552 ALOGV("%s",__func__);
1553 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
1554 MM_CAMERA_PARM_SHARPNESS,(uint8_t*)&rc,(uint8_t*)&rc);
1555 if(!rc) {
1556 ALOGE("%s:CONTRAST not supported", __func__);
1557 return NO_ERROR;
1558 }
1559 int sharpness = params.getInt(QCameraParameters::KEY_QC_SHARPNESS);
1560 if((sharpness < CAMERA_MIN_SHARPNESS
1561 || sharpness > CAMERA_MAX_SHARPNESS))
1562 return UNKNOWN_ERROR;
1563
1564 ALOGV("setting sharpness %d", sharpness);
1565 mParameters.set(QCameraParameters::KEY_QC_SHARPNESS, sharpness);
1566 ret = native_set_parms(MM_CAMERA_PARM_SHARPNESS, sizeof(sharpness),
1567 (void *)&sharpness);
1568 return ret ? NO_ERROR : UNKNOWN_ERROR;
1569 }
1570
setSaturation(const QCameraParameters & params)1571 status_t QCameraHardwareInterface::setSaturation(const QCameraParameters& params)
1572 {
1573 bool ret = false;
1574 int rc = MM_CAMERA_OK;
1575 ALOGV("%s",__func__);
1576 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
1577 MM_CAMERA_PARM_SATURATION,(uint8_t*)&rc,(uint8_t*)&rc);
1578 if(!rc) {
1579 ALOGE("%s:MM_CAMERA_PARM_SATURATION not supported", __func__);
1580 return NO_ERROR;
1581 }
1582 int result;
1583 int saturation = params.getInt(QCameraParameters::KEY_QC_SATURATION);
1584
1585 if((saturation < CAMERA_MIN_SATURATION)
1586 || (saturation > CAMERA_MAX_SATURATION))
1587 return UNKNOWN_ERROR;
1588
1589 ALOGV("Setting saturation %d", saturation);
1590 mParameters.set(QCameraParameters::KEY_QC_SATURATION, saturation);
1591 ret = native_set_parms(MM_CAMERA_PARM_SATURATION, sizeof(saturation),
1592 (void *)&saturation, (int *)&result);
1593 if(result != MM_CAMERA_OK)
1594 ALOGI("Saturation Value: %d is not set as the selected value is not supported", saturation);
1595 return ret ? NO_ERROR : UNKNOWN_ERROR;
1596 }
1597
setContrast(const QCameraParameters & params)1598 status_t QCameraHardwareInterface::setContrast(const QCameraParameters& params)
1599 {
1600 ALOGV("%s E", __func__ );
1601 int rc = MM_CAMERA_OK;
1602 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
1603 MM_CAMERA_PARM_CONTRAST,(uint8_t*)&rc,(uint8_t*)&rc);
1604 if(!rc) {
1605 ALOGE("%s:CONTRAST not supported", __func__);
1606 return NO_ERROR;
1607 }
1608 const char *str = params.get(QCameraParameters::KEY_SCENE_MODE);
1609 ALOGE("Contrast : %s",str);
1610 int32_t value = attr_lookup(scenemode, sizeof(scenemode) / sizeof(str_map), str);
1611 if(value == CAMERA_BESTSHOT_OFF) {
1612 int contrast = params.getInt(QCameraParameters::KEY_QC_CONTRAST);
1613 if((contrast < CAMERA_MIN_CONTRAST)
1614 || (contrast > CAMERA_MAX_CONTRAST))
1615 {
1616 ALOGE("Contrast Value not matching");
1617 return UNKNOWN_ERROR;
1618 }
1619 ALOGV("setting contrast %d", contrast);
1620 mParameters.set(QCameraParameters::KEY_QC_CONTRAST, contrast);
1621 ALOGE("Calling Contrast set on Lower layer");
1622 bool ret = native_set_parms(MM_CAMERA_PARM_CONTRAST, sizeof(contrast),
1623 (void *)&contrast);
1624 ALOGE("Lower layer returned %d", ret);
1625 int bestshot_reconfigure;
1626 mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
1627 MM_CAMERA_PARM_BESTSHOT_RECONFIGURE,
1628 &bestshot_reconfigure);
1629 if(bestshot_reconfigure) {
1630 if (mContrast != contrast) {
1631 mContrast = contrast;
1632 if (mPreviewState == QCAMERA_HAL_PREVIEW_STARTED && ret) {
1633 mRestartPreview = true;
1634 }
1635 }
1636 }
1637 return ret ? NO_ERROR : UNKNOWN_ERROR;
1638 } else {
1639 ALOGI(" Contrast value will not be set " \
1640 "when the scenemode selected is %s", str);
1641 return NO_ERROR;
1642 }
1643 return BAD_VALUE;
1644 }
1645
setSceneDetect(const QCameraParameters & params)1646 status_t QCameraHardwareInterface::setSceneDetect(const QCameraParameters& params)
1647 {
1648 ALOGV("%s",__func__);
1649 bool retParm;
1650 int rc = 0;
1651
1652 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
1653 MM_CAMERA_PARM_ASD_ENABLE,(uint8_t*)&rc,(uint8_t*)&rc);
1654 if(!rc) {
1655 ALOGE("%s:MM_CAMERA_PARM_ASD_ENABLE not supported", __func__);
1656 return NO_ERROR;
1657 }
1658
1659 const char *str = params.get(QCameraParameters::KEY_QC_SCENE_DETECT);
1660 ALOGE("Scene Detect string : %s",str);
1661 if (str != NULL) {
1662 int32_t value = attr_lookup(scenedetect, sizeof(scenedetect) / sizeof(str_map), str);
1663 ALOGE("Scenedetect Value : %d",value);
1664 if (value != NOT_FOUND) {
1665 mParameters.set(QCameraParameters::KEY_QC_SCENE_DETECT, str);
1666
1667 retParm = native_set_parms(MM_CAMERA_PARM_ASD_ENABLE, sizeof(value),
1668 (void *)&value);
1669
1670 return retParm ? NO_ERROR : UNKNOWN_ERROR;
1671 }
1672 }
1673 return BAD_VALUE;
1674 }
1675
setZoom(const QCameraParameters & params)1676 status_t QCameraHardwareInterface::setZoom(const QCameraParameters& params)
1677 {
1678 status_t rc = NO_ERROR;
1679
1680 ALOGV("%s: E",__func__);
1681 uint8_t supported;
1682
1683 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
1684 MM_CAMERA_PARM_ZOOM,&supported,&supported);
1685 if(!supported){
1686 ALOGE("%s:MM_CAMERA_PARM_ZOOM not supported", __func__);
1687 return NO_ERROR;
1688 }
1689 // No matter how many different zoom values the driver can provide, HAL
1690 // provides applictations the same number of zoom levels. The maximum driver
1691 // zoom value depends on sensor output (VFE input) and preview size (VFE
1692 // output) because VFE can only crop and cannot upscale. If the preview size
1693 // is bigger, the maximum zoom ratio is smaller. However, we want the
1694 // zoom ratio of each zoom level is always the same whatever the preview
1695 // size is. Ex: zoom level 1 is always 1.2x, zoom level 2 is 1.44x, etc. So,
1696 // we need to have a fixed maximum zoom value and do read it from the
1697 // driver.
1698 static const int ZOOM_STEP = 1;
1699 int32_t zoom_level = params.getInt("zoom");
1700 if(zoom_level >= 0 && zoom_level <= mMaxZoom-1) {
1701 mParameters.set("zoom", zoom_level);
1702 int32_t zoom_value = ZOOM_STEP * zoom_level;
1703 bool ret = native_set_parms(MM_CAMERA_PARM_ZOOM,
1704 sizeof(zoom_value), (void *)&zoom_value);
1705 if(ret) {
1706 mCurrentZoom=zoom_level;
1707 }
1708 rc = ret ? NO_ERROR : UNKNOWN_ERROR;
1709 } else {
1710 rc = BAD_VALUE;
1711 }
1712 ALOGV("%s X",__func__);
1713 return rc;
1714
1715 }
1716
setISOValue(const QCameraParameters & params)1717 status_t QCameraHardwareInterface::setISOValue(const QCameraParameters& params) {
1718
1719 ALOGV("%s",__func__);
1720 uint8_t supported;
1721 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
1722 MM_CAMERA_PARM_ISO,&supported,&supported);
1723 if(!supported) {
1724 ALOGE("%s:MM_CAMERA_PARM_ISO not supported", __func__);
1725 return NO_ERROR;
1726 }
1727 const char *str = params.get(QCameraParameters::KEY_QC_ISO_MODE);
1728 ALOGV("ISO string : %s",str);
1729 int8_t temp_hjr;
1730 if (str != NULL) {
1731 int value = (camera_iso_mode_type)attr_lookup(
1732 iso, sizeof(iso) / sizeof(str_map), str);
1733 ALOGE("ISO Value : %d",value);
1734 if (value != NOT_FOUND) {
1735 camera_iso_mode_type temp = (camera_iso_mode_type) value;
1736 if (value == CAMERA_ISO_DEBLUR) {
1737 temp_hjr = true;
1738 native_set_parms(MM_CAMERA_PARM_HJR, sizeof(int8_t), (void*)&temp_hjr);
1739 mHJR = value;
1740 }
1741 else {
1742 if (mHJR == CAMERA_ISO_DEBLUR) {
1743 temp_hjr = false;
1744 native_set_parms(MM_CAMERA_PARM_HJR, sizeof(int8_t), (void*)&temp_hjr);
1745 mHJR = value;
1746 }
1747 }
1748
1749 mParameters.set(QCameraParameters::KEY_QC_ISO_MODE, str);
1750 native_set_parms(MM_CAMERA_PARM_ISO, sizeof(camera_iso_mode_type), (void *)&temp);
1751 return NO_ERROR;
1752 }
1753 }
1754 return BAD_VALUE;
1755 }
1756
updateFocusDistances()1757 status_t QCameraHardwareInterface::updateFocusDistances()
1758 {
1759 ALOGV("%s: IN", __FUNCTION__);
1760 focus_distances_info_t focusDistances;
1761 if(mCameraHandle->ops->get_parm(mCameraHandle->camera_handle, MM_CAMERA_PARM_FOCUS_DISTANCES,
1762 &focusDistances) >= 0) {
1763 String8 str;
1764 char buffer[32] = {0};
1765 //set all distances to infinity if focus mode is infinity
1766 if(mFocusMode == AF_MODE_INFINITY) {
1767 snprintf(buffer, sizeof(buffer), "Infinity,");
1768 str.append(buffer);
1769 snprintf(buffer, sizeof(buffer), "Infinity,");
1770 str.append(buffer);
1771 snprintf(buffer, sizeof(buffer), "Infinity");
1772 str.append(buffer);
1773 } else {
1774 snprintf(buffer, sizeof(buffer), "%f", focusDistances.focus_distance[0]);
1775 str.append(buffer);
1776 snprintf(buffer, sizeof(buffer), ",%f", focusDistances.focus_distance[1]);
1777 str.append(buffer);
1778 snprintf(buffer, sizeof(buffer), ",%f", focusDistances.focus_distance[2]);
1779 str.append(buffer);
1780 }
1781 ALOGE("%s: setting KEY_FOCUS_DISTANCES as %s", __FUNCTION__, str.string());
1782 mFocusDistance = str;
1783 return NO_ERROR;
1784 }
1785 ALOGV("%s: get CAMERA_PARM_FOCUS_DISTANCES failed!!!", __FUNCTION__);
1786 return BAD_VALUE;
1787 }
1788
1789 // Parse string like "(1, 2, 3, 4, ..., N)"
1790 // num is pointer to an allocated array of size N
parseNDimVector(const char * str,int * num,int N,char delim=',')1791 static int parseNDimVector(const char *str, int *num, int N, char delim = ',')
1792 {
1793 char *start, *end;
1794 if(num == NULL) {
1795 ALOGE("Invalid output array (num == NULL)");
1796 return -1;
1797 }
1798 //check if string starts and ends with parantheses
1799 if(str[0] != '(' || str[strlen(str)-1] != ')') {
1800 ALOGE("Invalid format of string %s, valid format is (n1, n2, n3, n4 ...)", str);
1801 return -1;
1802 }
1803 start = (char*) str;
1804 start++;
1805 for(int i=0; i<N; i++) {
1806 *(num+i) = (int) strtol(start, &end, 10);
1807 if(*end != delim && i < N-1) {
1808 ALOGE("Cannot find delimeter '%c' in string \"%s\". end = %c", delim, str, *end);
1809 return -1;
1810 }
1811 start = end+1;
1812 }
1813 return 0;
1814 }
1815
1816 // parse string like "(1, 2, 3, 4, 5),(1, 2, 3, 4, 5),..."
parseCameraAreaString(const char * str,int max_num_areas,camera_area_t * pAreas,int * num_areas_found)1817 static int parseCameraAreaString(const char* str, int max_num_areas,
1818 camera_area_t *pAreas, int *num_areas_found)
1819 {
1820 char area_str[32];
1821 const char *start, *end, *p;
1822 start = str; end = NULL;
1823 int values[5], index=0;
1824 *num_areas_found = 0;
1825
1826 while(start != NULL) {
1827 if(*start != '(') {
1828 ALOGE("%s: error: Ill formatted area string: %s", __func__, str);
1829 return -1;
1830 }
1831 end = strchr(start, ')');
1832 if(end == NULL) {
1833 ALOGE("%s: error: Ill formatted area string: %s", __func__, str);
1834 return -1;
1835 }
1836 int i;
1837 for (i=0,p=start; p<=end; p++, i++) {
1838 area_str[i] = *p;
1839 }
1840 area_str[i] = '\0';
1841 if(parseNDimVector(area_str, values, 5) < 0){
1842 ALOGE("%s: error: Failed to parse the area string: %s", __func__, area_str);
1843 return -1;
1844 }
1845 // no more areas than max_num_areas are accepted.
1846 if(index >= max_num_areas) {
1847 ALOGE("%s: error: too many areas specified %s", __func__, str);
1848 return -1;
1849 }
1850 pAreas[index].x1 = values[0];
1851 pAreas[index].y1 = values[1];
1852 pAreas[index].x2 = values[2];
1853 pAreas[index].y2 = values[3];
1854 pAreas[index].weight = values[4];
1855
1856 index++;
1857 start = strchr(end, '('); // serach for next '('
1858 }
1859 (*num_areas_found) = index;
1860 return 0;
1861 }
validateCameraAreas(camera_area_t * areas,int num_areas)1862 static bool validateCameraAreas(camera_area_t *areas, int num_areas)
1863 {
1864 for(int i=0; i<num_areas; i++) {
1865
1866 // handle special case (0, 0, 0, 0, 0)
1867 if((areas[i].x1 == 0) && (areas[i].y1 == 0)
1868 && (areas[i].x2 == 0) && (areas[i].y2 == 0) && (areas[i].weight == 0)) {
1869 continue;
1870 }
1871 if(areas[i].x1 < -1000) return false; // left should be >= -1000
1872 if(areas[i].y1 < -1000) return false; // top should be >= -1000
1873 if(areas[i].x2 > 1000) return false; // right should be <= 1000
1874 if(areas[i].y2 > 1000) return false; // bottom should be <= 1000
1875 if(areas[i].weight <= 0 || areas[i].weight > 1000) // weight should be in [1, 1000]
1876 return false;
1877 if(areas[i].x1 >= areas[i].x2) { // left should be < right
1878 return false;
1879 }
1880 if(areas[i].y1 >= areas[i].y2) // top should be < bottom
1881 return false;
1882 }
1883 return true;
1884 }
1885
setFocusAreas(const QCameraParameters & params)1886 status_t QCameraHardwareInterface::setFocusAreas(const QCameraParameters& params)
1887 {
1888 ALOGV("%s: E", __func__);
1889 status_t rc;
1890 int max_num_af_areas = mParameters.getInt(QCameraParameters::KEY_MAX_NUM_FOCUS_AREAS);
1891 if(max_num_af_areas == 0) {
1892 return NO_ERROR;
1893 }
1894 const char *str = params.get(QCameraParameters::KEY_FOCUS_AREAS);
1895 if (str == NULL) {
1896 ALOGE("%s: Parameter string is null", __func__);
1897 rc = NO_ERROR;
1898 } else {
1899 camera_area_t *areas = new camera_area_t[max_num_af_areas];
1900 int num_areas_found=0;
1901 if(parseCameraAreaString(str, max_num_af_areas, areas, &num_areas_found) < 0) {
1902 ALOGE("%s: Failed to parse the string: %s", __func__, str);
1903 delete areas;
1904 return BAD_VALUE;
1905 }
1906 for(int i=0; i<num_areas_found; i++) {
1907 ALOGD("FocusArea[%d] = (%d, %d, %d, %d, %d)", i, (areas[i].x1), (areas[i].y1),
1908 (areas[i].x2), (areas[i].y2), (areas[i].weight));
1909 }
1910 if(validateCameraAreas(areas, num_areas_found) == false) {
1911 ALOGE("%s: invalid areas specified : %s", __func__, str);
1912 delete areas;
1913 return BAD_VALUE;
1914 }
1915 mParameters.set(QCameraParameters::KEY_FOCUS_AREAS, str);
1916 num_areas_found = 1; //temp; need to change after the multi-roi is enabled
1917
1918 //if the native_set_parms is called when preview is not started, it
1919 //crashes in lower layer, so return of preview is not started
1920 if(mPreviewState == QCAMERA_HAL_PREVIEW_STOPPED) {
1921 delete areas;
1922 return NO_ERROR;
1923 }
1924
1925 //for special area string (0, 0, 0, 0, 0), set the num_areas_found to 0,
1926 //so no action is takenby the lower layer
1927 if(num_areas_found == 1 && (areas[0].x1 == 0) && (areas[0].y1 == 0)
1928 && (areas[0].x2 == 0) && (areas[0].y2 == 0) && (areas[0].weight == 0)) {
1929 num_areas_found = 0;
1930 }
1931 roi_info_t af_roi_value;
1932 memset(&af_roi_value, 0, sizeof(roi_info_t));
1933 uint16_t x1, x2, y1, y2, dx, dy;
1934 int previewWidth, previewHeight;
1935 this->getPreviewSize(&previewWidth, &previewHeight);
1936 //transform the coords from (-1000, 1000) to (0, previewWidth or previewHeight)
1937 x1 = (uint16_t)((areas[0].x1 + 1000.0f)*(previewWidth/2000.0f));
1938 y1 = (uint16_t)((areas[0].y1 + 1000.0f)*(previewHeight/2000.0f));
1939 x2 = (uint16_t)((areas[0].x2 + 1000.0f)*(previewWidth/2000.0f));
1940 y2 = (uint16_t)((areas[0].y2 + 1000.0f)*(previewHeight/2000.0f));
1941 dx = x2 - x1;
1942 dy = y2 - y1;
1943
1944 af_roi_value.num_roi = num_areas_found;
1945 af_roi_value.roi[0].x = x1;
1946 af_roi_value.roi[0].y = y1;
1947 af_roi_value.roi[0].dx = dx;
1948 af_roi_value.roi[0].dy = dy;
1949 af_roi_value.is_multiwindow = 0;
1950 if (native_set_parms(MM_CAMERA_PARM_AF_ROI, sizeof(roi_info_t), (void*)&af_roi_value))
1951 rc = NO_ERROR;
1952 else
1953 rc = BAD_VALUE;
1954 delete areas;
1955 }
1956 ALOGE("%s: X", __func__);
1957 return rc;
1958 }
1959
setMeteringAreas(const QCameraParameters & params)1960 status_t QCameraHardwareInterface::setMeteringAreas(const QCameraParameters& params)
1961 {
1962 ALOGV("%s: E", __func__);
1963 status_t rc;
1964 int max_num_mtr_areas = mParameters.getInt(QCameraParameters::KEY_MAX_NUM_METERING_AREAS);
1965 if(max_num_mtr_areas == 0) {
1966 return NO_ERROR;
1967 }
1968
1969 const char *str = params.get(QCameraParameters::KEY_METERING_AREAS);
1970 if (str == NULL) {
1971 ALOGE("%s: Parameter string is null", __func__);
1972 rc = NO_ERROR;
1973 } else {
1974 camera_area_t *areas = new camera_area_t[max_num_mtr_areas];
1975 int num_areas_found=0;
1976 if(parseCameraAreaString(str, max_num_mtr_areas, areas, &num_areas_found) < 0) {
1977 ALOGE("%s: Failed to parse the string: %s", __func__, str);
1978 delete areas;
1979 return BAD_VALUE;
1980 }
1981 for(int i=0; i<num_areas_found; i++) {
1982 ALOGD("MeteringArea[%d] = (%d, %d, %d, %d, %d)", i, (areas[i].x1), (areas[i].y1),
1983 (areas[i].x2), (areas[i].y2), (areas[i].weight));
1984 }
1985 if(validateCameraAreas(areas, num_areas_found) == false) {
1986 ALOGE("%s: invalid areas specified : %s", __func__, str);
1987 delete areas;
1988 return BAD_VALUE;
1989 }
1990 mParameters.set(QCameraParameters::KEY_METERING_AREAS, str);
1991
1992 //if the native_set_parms is called when preview is not started, it
1993 //crashes in lower layer, so return of preview is not started
1994 if(mPreviewState == QCAMERA_HAL_PREVIEW_STOPPED) {
1995 delete areas;
1996 return NO_ERROR;
1997 }
1998
1999 num_areas_found = 1; //temp; need to change after the multi-roi is enabled
2000
2001 //for special area string (0, 0, 0, 0, 0), set the num_areas_found to 0,
2002 //so no action is takenby the lower layer
2003 if(num_areas_found == 1 && (areas[0].x1 == 0) && (areas[0].y1 == 0)
2004 && (areas[0].x2 == 0) && (areas[0].y2 == 0) && (areas[0].weight == 0)) {
2005 num_areas_found = 0;
2006 }
2007 cam_set_aec_roi_t aec_roi_value;
2008 uint16_t x1, x2, y1, y2;
2009 int previewWidth, previewHeight;
2010 this->getPreviewSize(&previewWidth, &previewHeight);
2011 //transform the coords from (-1000, 1000) to (0, previewWidth or previewHeight)
2012 x1 = (uint16_t)((areas[0].x1 + 1000.0f)*(previewWidth/2000.0f));
2013 y1 = (uint16_t)((areas[0].y1 + 1000.0f)*(previewHeight/2000.0f));
2014 x2 = (uint16_t)((areas[0].x2 + 1000.0f)*(previewWidth/2000.0f));
2015 y2 = (uint16_t)((areas[0].y2 + 1000.0f)*(previewHeight/2000.0f));
2016 delete areas;
2017
2018 if(num_areas_found == 1) {
2019 aec_roi_value.aec_roi_enable = AEC_ROI_ON;
2020 aec_roi_value.aec_roi_type = AEC_ROI_BY_COORDINATE;
2021 aec_roi_value.aec_roi_position.coordinate.x = (x1+x2)/2;
2022 aec_roi_value.aec_roi_position.coordinate.y = (y1+y2)/2;
2023 } else {
2024 aec_roi_value.aec_roi_enable = AEC_ROI_OFF;
2025 aec_roi_value.aec_roi_type = AEC_ROI_BY_COORDINATE;
2026 aec_roi_value.aec_roi_position.coordinate.x = DONT_CARE_COORDINATE;
2027 aec_roi_value.aec_roi_position.coordinate.y = DONT_CARE_COORDINATE;
2028 }
2029
2030 if(native_set_parms(MM_CAMERA_PARM_AEC_ROI, sizeof(cam_set_aec_roi_t), (void *)&aec_roi_value))
2031 rc = NO_ERROR;
2032 else
2033 rc = BAD_VALUE;
2034 }
2035 ALOGV("%s: X", __func__);
2036 return rc;
2037 }
2038
setFocusMode(const QCameraParameters & params)2039 status_t QCameraHardwareInterface::setFocusMode(const QCameraParameters& params)
2040 {
2041 const char *str = params.get(QCameraParameters::KEY_FOCUS_MODE);
2042 const char *prev_str = mParameters.get(QCameraParameters::KEY_FOCUS_MODE);
2043 ALOGV("%s",__func__);
2044 if (str != NULL) {
2045 ALOGE("Focus mode %s",str);
2046 int32_t value = attr_lookup(focus_modes,
2047 sizeof(focus_modes) / sizeof(str_map), str);
2048 if (value != NOT_FOUND) {
2049 mParameters.set(QCameraParameters::KEY_FOCUS_MODE, str);
2050 mFocusMode = value;
2051
2052 if(updateFocusDistances() != NO_ERROR) {
2053 ALOGE("%s: updateFocusDistances failed for %s", __FUNCTION__, str);
2054 return UNKNOWN_ERROR;
2055 }
2056 mParameters.set(QCameraParameters::KEY_FOCUS_DISTANCES, mFocusDistance.string());
2057 if(mHasAutoFocusSupport){
2058 bool ret = native_set_parms(MM_CAMERA_PARM_FOCUS_MODE,
2059 sizeof(value),
2060 (void *)&value);
2061
2062 int cafSupport = FALSE;
2063 if(!strcmp(str, QCameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ||
2064 !strcmp(str, QCameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE)){
2065 cafSupport = TRUE;
2066 }
2067 ALOGE("Continuous Auto Focus %d", cafSupport);
2068 ret = native_set_parms(MM_CAMERA_PARM_CONTINUOUS_AF, sizeof(cafSupport),
2069 (void *)&cafSupport);
2070 }
2071
2072 return NO_ERROR;
2073 }
2074 ALOGE("%s:Could not look up str value",__func__);
2075 }
2076 ALOGE("Invalid focus mode value: %s", (str == NULL) ? "NULL" : str);
2077 return BAD_VALUE;
2078 }
2079
setSceneMode(const QCameraParameters & params)2080 status_t QCameraHardwareInterface::setSceneMode(const QCameraParameters& params)
2081 {
2082 ALOGV("%s",__func__);
2083 uint8_t supported;
2084 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2085 MM_CAMERA_PARM_BESTSHOT_MODE,&supported,&supported);
2086 if(!supported) {
2087 ALOGE("%s:Parameter Scenemode is not supported for this sensor", __func__);
2088 return NO_ERROR;
2089 }
2090 const char *str = params.get(QCameraParameters::KEY_SCENE_MODE);
2091 ALOGE("Scene Mode string : %s",str);
2092
2093 if (str != NULL) {
2094 int32_t value = attr_lookup(scenemode, sizeof(scenemode) / sizeof(str_map), str);
2095 ALOGE("Setting Scenemode value = %d",value );
2096 if (value != NOT_FOUND) {
2097 if((value != CAMERA_BESTSHOT_OFF ) && (mColorEffects != CAMERA_EFFECT_OFF )) {
2098 int result;
2099 mColorEffects = CAMERA_EFFECT_OFF;
2100 native_set_parms(MM_CAMERA_PARM_EFFECT, sizeof(mColorEffects),
2101 (void *)&mColorEffects,(int *)&result);
2102 if(result != MM_CAMERA_OK) {
2103 ALOGI("Camera Effect is not set as the EFFECT_NONE and result is not OK");
2104 }
2105 }
2106 mParameters.set(QCameraParameters::KEY_SCENE_MODE, str);
2107 bool ret = native_set_parms(MM_CAMERA_PARM_BESTSHOT_MODE, sizeof(value),
2108 (void *)&value);
2109 int bestshot_reconfigure;
2110 mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
2111 MM_CAMERA_PARM_BESTSHOT_RECONFIGURE,
2112 &bestshot_reconfigure);
2113 if(bestshot_reconfigure) {
2114 if (mBestShotMode != value) {
2115 mBestShotMode = value;
2116 if (mPreviewState == QCAMERA_HAL_PREVIEW_STARTED && ret) {
2117 mRestartPreview = true;
2118 }
2119 }
2120 }
2121 return ret ? NO_ERROR : UNKNOWN_ERROR;
2122 }
2123 }
2124 ALOGE("Invalid scenemode value: %s", (str == NULL) ? "NULL" : str);
2125 return BAD_VALUE;
2126 }
2127
setSelectableZoneAf(const QCameraParameters & params)2128 status_t QCameraHardwareInterface::setSelectableZoneAf(const QCameraParameters& params)
2129 {
2130 ALOGV("%s",__func__);
2131 uint8_t supported;
2132 if(mHasAutoFocusSupport) {
2133 const char *str = params.get(QCameraParameters::KEY_QC_SELECTABLE_ZONE_AF);
2134 if (str != NULL) {
2135 int32_t value = attr_lookup(selectable_zone_af, sizeof(selectable_zone_af) / sizeof(str_map), str);
2136 if (value != NOT_FOUND) {
2137 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2138 MM_CAMERA_PARM_FOCUS_RECT,&supported,&supported);
2139 if(!supported) {
2140 ALOGE("SelectableZoneAF is not supported for this sensor");
2141 return NO_ERROR;
2142 }else {
2143 mParameters.set(QCameraParameters::KEY_QC_SELECTABLE_ZONE_AF, str);
2144 bool ret = native_set_parms(MM_CAMERA_PARM_FOCUS_RECT, sizeof(value),
2145 (void *)&value);
2146 return ret ? NO_ERROR : UNKNOWN_ERROR;
2147 }
2148 }
2149 }
2150 ALOGE("Invalid selectable zone af value: %s", (str == NULL) ? "NULL" : str);
2151 return BAD_VALUE;
2152
2153 }
2154 return NO_ERROR;
2155 }
2156
setEffect(const QCameraParameters & params)2157 status_t QCameraHardwareInterface::setEffect(const QCameraParameters& params)
2158 {
2159 ALOGV("%s",__func__);
2160 uint8_t supported;
2161 const char *str = params.get(CameraParameters::KEY_EFFECT);
2162 int result;
2163 mColorEffects = CAMERA_EFFECT_OFF;
2164 if (str != NULL) {
2165 ALOGE("Setting effect %s",str);
2166 int32_t value = attr_lookup(effects, sizeof(effects) / sizeof(str_map), str);
2167 if (value != NOT_FOUND) {
2168 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2169 MM_CAMERA_PARM_EFFECT,&supported,&supported);
2170 if(!supported) {
2171 ALOGE("Camera Effect - %s mode is not supported for this sensor",str);
2172 return NO_ERROR;
2173 }else {
2174 mParameters.set(QCameraParameters::KEY_EFFECT, str);
2175 ALOGE("Setting effect to lower HAL : %d",value);
2176 mColorEffects = value;
2177 bool ret = native_set_parms(MM_CAMERA_PARM_EFFECT, sizeof(value),
2178 (void *)&value,(int *)&result);
2179 if(result != 0) {
2180 ALOGI("Camera Effect: %s is not set as the selected value is not supported ", str);
2181 }
2182 int bestshot_reconfigure;
2183 mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
2184 MM_CAMERA_PARM_BESTSHOT_RECONFIGURE,
2185 &bestshot_reconfigure);
2186 if(bestshot_reconfigure) {
2187 if (mEffects != value) {
2188 mEffects = value;
2189 if (mPreviewState == QCAMERA_HAL_PREVIEW_STARTED && ret) {
2190 mRestartPreview = true;
2191 }
2192 }
2193 }
2194 return ret ? NO_ERROR : UNKNOWN_ERROR;
2195 }
2196 }
2197 }
2198 ALOGE("Invalid effect value: %s", (str == NULL) ? "NULL" : str);
2199 ALOGV("setEffect X");
2200 return BAD_VALUE;
2201 }
2202
setBrightness(const QCameraParameters & params)2203 status_t QCameraHardwareInterface::setBrightness(const QCameraParameters& params) {
2204
2205 ALOGV("%s",__func__);
2206 uint8_t supported;
2207 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2208 MM_CAMERA_PARM_BRIGHTNESS,&supported,&supported);
2209 if(!supported) {
2210 ALOGE("MM_CAMERA_PARM_BRIGHTNESS mode is not supported for this sensor");
2211 return NO_ERROR;
2212 }
2213 int brightness = params.getInt("luma-adaptation");
2214 if (mBrightness != brightness) {
2215 ALOGV(" new brightness value : %d ", brightness);
2216 mBrightness = brightness;
2217 mParameters.set("luma-adaptation", brightness);
2218 bool ret = native_set_parms(MM_CAMERA_PARM_BRIGHTNESS, sizeof(mBrightness),
2219 (void *)&mBrightness);
2220 return ret ? NO_ERROR : UNKNOWN_ERROR;
2221 }
2222
2223 return NO_ERROR;
2224 }
2225
setAutoExposure(const QCameraParameters & params)2226 status_t QCameraHardwareInterface::setAutoExposure(const QCameraParameters& params)
2227 {
2228
2229 ALOGV("%s",__func__);
2230 uint8_t supported;
2231 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2232 MM_CAMERA_PARM_EXPOSURE,&supported,&supported);
2233 if(!supported) {
2234 ALOGE("MM_CAMERA_PARM_EXPOSURE mode is not supported for this sensor");
2235 return NO_ERROR;
2236 }
2237 const char *str = params.get(QCameraParameters::KEY_QC_AUTO_EXPOSURE);
2238 if (str != NULL) {
2239 int32_t value = attr_lookup(autoexposure, sizeof(autoexposure) / sizeof(str_map), str);
2240 if (value != NOT_FOUND) {
2241 mParameters.set(QCameraParameters::KEY_QC_AUTO_EXPOSURE, str);
2242 bool ret = native_set_parms(MM_CAMERA_PARM_EXPOSURE, sizeof(value),
2243 (void *)&value);
2244 return ret ? NO_ERROR : UNKNOWN_ERROR;
2245 }
2246 }
2247 ALOGE("Invalid auto exposure value: %s", (str == NULL) ? "NULL" : str);
2248 return BAD_VALUE;
2249 }
2250
setExposureCompensation(const QCameraParameters & params)2251 status_t QCameraHardwareInterface::setExposureCompensation(
2252 const QCameraParameters & params){
2253 ALOGV("%s",__func__);
2254 uint8_t supported;
2255 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2256 MM_CAMERA_PARM_EXPOSURE_COMPENSATION,&supported,&supported);
2257 if(!supported) {
2258 ALOGE("MM_CAMERA_PARM_EXPOSURE_COMPENSATION mode is not supported for this sensor");
2259 return NO_ERROR;
2260 }
2261 int numerator = params.getInt(QCameraParameters::KEY_EXPOSURE_COMPENSATION);
2262 if(EXPOSURE_COMPENSATION_MINIMUM_NUMERATOR <= numerator &&
2263 numerator <= EXPOSURE_COMPENSATION_MAXIMUM_NUMERATOR){
2264 int16_t numerator16 = (int16_t)(numerator & 0x0000ffff);
2265 uint16_t denominator16 = EXPOSURE_COMPENSATION_DENOMINATOR;
2266 uint32_t value = 0;
2267 value = numerator16 << 16 | denominator16;
2268
2269 mParameters.set(QCameraParameters::KEY_EXPOSURE_COMPENSATION,
2270 numerator);
2271 bool ret = native_set_parms(MM_CAMERA_PARM_EXPOSURE_COMPENSATION,
2272 sizeof(value), (void *)&value);
2273 return ret ? NO_ERROR : UNKNOWN_ERROR;
2274 }
2275 ALOGE("Invalid Exposure Compensation");
2276 return BAD_VALUE;
2277 }
2278
setWhiteBalance(const QCameraParameters & params)2279 status_t QCameraHardwareInterface::setWhiteBalance(const QCameraParameters& params)
2280 {
2281
2282 ALOGV("%s",__func__);
2283 status_t rc = NO_ERROR;
2284 uint8_t supported;
2285 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2286 MM_CAMERA_PARM_WHITE_BALANCE,&supported,&supported);
2287 if(!supported) {
2288 ALOGE("MM_CAMERA_PARM_WHITE_BALANCE mode is not supported for this sensor");
2289 return NO_ERROR;
2290 }
2291 int result;
2292
2293 const char *str = params.get(QCameraParameters::KEY_WHITE_BALANCE);
2294 if (str != NULL) {
2295 int32_t value = attr_lookup(whitebalance, sizeof(whitebalance) / sizeof(str_map), str);
2296 if (value != NOT_FOUND) {
2297 mParameters.set(QCameraParameters::KEY_WHITE_BALANCE, str);
2298 bool ret = native_set_parms(MM_CAMERA_PARM_WHITE_BALANCE, sizeof(value),
2299 (void *)&value, (int *)&result);
2300 if(result != MM_CAMERA_OK) {
2301 ALOGI("WhiteBalance Value: %s is not set as the selected value is not supported ", str);
2302 }
2303 return ret ? NO_ERROR : UNKNOWN_ERROR;
2304 }
2305 }
2306 ALOGE("Invalid whitebalance value: %s", (str == NULL) ? "NULL" : str);
2307 return BAD_VALUE;
2308 }
2309
getAutoFlickerMode()2310 int QCameraHardwareInterface::getAutoFlickerMode()
2311 {
2312 /* Enable Advanced Auto Antibanding where we can set
2313 any of the following option
2314 ie. CAMERA_ANTIBANDING_AUTO
2315 CAMERA_ANTIBANDING_AUTO_50HZ
2316 CAMERA_ANTIBANDING_AUTO_60HZ
2317 Currently setting it to default */
2318 return CAMERA_ANTIBANDING_AUTO;
2319 }
2320
setAntibanding(const QCameraParameters & params)2321 status_t QCameraHardwareInterface::setAntibanding(const QCameraParameters& params)
2322 {
2323 int result;
2324
2325 ALOGV("%s",__func__);
2326 status_t rc = NO_ERROR;
2327 uint8_t supported;
2328 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2329 MM_CAMERA_PARM_ANTIBANDING,&supported,&supported);
2330 if(!supported) {
2331 ALOGE("ANTIBANDING mode is not supported for this sensor");
2332 return NO_ERROR;
2333 }
2334 const char *str = params.get(QCameraParameters::KEY_ANTIBANDING);
2335 if (str != NULL) {
2336 int value = (camera_antibanding_type)attr_lookup(
2337 antibanding, sizeof(antibanding) / sizeof(str_map), str);
2338 if (value != NOT_FOUND) {
2339 camera_antibanding_type temp = (camera_antibanding_type) value;
2340 ALOGE("Antibanding Value : %d",value);
2341 mParameters.set(QCameraParameters::KEY_ANTIBANDING, str);
2342 if(value == CAMERA_ANTIBANDING_AUTO) {
2343 value = getAutoFlickerMode();
2344 }
2345 bool ret = native_set_parms(MM_CAMERA_PARM_ANTIBANDING,
2346 sizeof(camera_antibanding_type), (void *)&value ,(int *)&result);
2347 if(result != MM_CAMERA_OK) {
2348 ALOGI("AntiBanding Value: %s is not supported for the given BestShot Mode", str);
2349 }
2350 return ret ? NO_ERROR : UNKNOWN_ERROR;
2351 }
2352 }
2353 ALOGE("Invalid antibanding value: %s", (str == NULL) ? "NULL" : str);
2354
2355 return BAD_VALUE;
2356 }
2357
setPreviewFrameRate(const QCameraParameters & params)2358 status_t QCameraHardwareInterface::setPreviewFrameRate(const QCameraParameters& params)
2359 {
2360 ALOGV("%s: E",__func__);
2361 status_t rc = NO_ERROR;
2362 uint16_t fps = (uint16_t)params.getPreviewFrameRate();
2363 ALOGV("%s: requested preview frame rate is %d", __func__, fps);
2364
2365 mParameters.setPreviewFrameRate(fps);
2366 ALOGV("%s: X",__func__);
2367 return NO_ERROR;
2368 }
2369
setPreviewFrameRateMode(const QCameraParameters & params)2370 status_t QCameraHardwareInterface::setPreviewFrameRateMode(const QCameraParameters& params) {
2371
2372 ALOGV("%s",__func__);
2373 uint8_t supported;
2374 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2375 MM_CAMERA_PARM_FPS,&supported,&supported);
2376 if(!supported) {
2377 ALOGE(" CAMERA FPS mode is not supported for this sensor");
2378 return NO_ERROR;
2379 }
2380 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2381 MM_CAMERA_PARM_FPS_MODE,&supported,&supported);
2382 if(!supported) {
2383 ALOGE("CAMERA FPS MODE mode is not supported for this sensor");
2384 return NO_ERROR;
2385 }
2386
2387 const char *previousMode = mParameters.getPreviewFrameRateMode();
2388 const char *str = params.getPreviewFrameRateMode();
2389 if (NULL == previousMode) {
2390 ALOGE("Preview Frame Rate Mode is NULL\n");
2391 return NO_ERROR;
2392 }
2393 if (NULL == str) {
2394 ALOGE("Preview Frame Rate Mode is NULL\n");
2395 return NO_ERROR;
2396 }
2397 if( mInitialized && !strcmp(previousMode, str)) {
2398 ALOGE("frame rate mode same as previous mode %s", previousMode);
2399 return NO_ERROR;
2400 }
2401 int32_t frameRateMode = attr_lookup(frame_rate_modes, sizeof(frame_rate_modes) / sizeof(str_map),str);
2402 if(frameRateMode != NOT_FOUND) {
2403 ALOGV("setPreviewFrameRateMode: %s ", str);
2404 mParameters.setPreviewFrameRateMode(str);
2405 bool ret = native_set_parms(MM_CAMERA_PARM_FPS_MODE, sizeof(frameRateMode), (void *)&frameRateMode);
2406 if(!ret) return ret;
2407 //set the fps value when chaging modes
2408 int16_t fps = (uint16_t)params.getPreviewFrameRate();
2409 if(MINIMUM_FPS <= fps && fps <=MAXIMUM_FPS){
2410 mParameters.setPreviewFrameRate(fps);
2411 ret = native_set_parms(MM_CAMERA_PARM_FPS,
2412 sizeof(fps), (void *)&fps);
2413 return ret ? NO_ERROR : UNKNOWN_ERROR;
2414 }
2415 ALOGE("Invalid preview frame rate value: %d", fps);
2416 return BAD_VALUE;
2417 }
2418 ALOGE("Invalid preview frame rate mode value: %s", (str == NULL) ? "NULL" : str);
2419
2420 return BAD_VALUE;
2421 }
2422
setSkinToneEnhancement(const QCameraParameters & params)2423 status_t QCameraHardwareInterface::setSkinToneEnhancement(const QCameraParameters& params) {
2424 ALOGV("%s",__func__);
2425 uint8_t supported;
2426 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2427 MM_CAMERA_PARM_SCE_FACTOR,&supported,&supported);
2428 if(!supported) {
2429 ALOGE("SkinToneEnhancement is not supported for this sensor");
2430 return NO_ERROR;
2431 }
2432 int skinToneValue = params.getInt("skinToneEnhancement");
2433 if (mSkinToneEnhancement != skinToneValue) {
2434 ALOGV(" new skinTone correction value : %d ", skinToneValue);
2435 mSkinToneEnhancement = skinToneValue;
2436 mParameters.set("skinToneEnhancement", skinToneValue);
2437 bool ret = native_set_parms(MM_CAMERA_PARM_SCE_FACTOR, sizeof(mSkinToneEnhancement),
2438 (void *)&mSkinToneEnhancement);
2439 return ret ? NO_ERROR : UNKNOWN_ERROR;
2440 }
2441 return NO_ERROR;
2442 }
2443
setWaveletDenoise(const QCameraParameters & params)2444 status_t QCameraHardwareInterface::setWaveletDenoise(const QCameraParameters& params) {
2445 ALOGV("%s",__func__);
2446 uint8_t supported;
2447 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2448 MM_CAMERA_PARM_WAVELET_DENOISE,&supported,&supported);
2449 if( !supported ) {
2450 ALOGE("Wavelet Denoise is not supported for this sensor");
2451 /* TO DO */
2452 // return NO_ERROR;
2453 }
2454 const char *str = params.get(QCameraParameters::KEY_QC_DENOISE);
2455 if (str != NULL) {
2456 int value = attr_lookup(denoise,
2457 sizeof(denoise) / sizeof(str_map), str);
2458 if ((value != NOT_FOUND) && (mDenoiseValue != value)) {
2459 mDenoiseValue = value;
2460 mParameters.set(QCameraParameters::KEY_QC_DENOISE, str);
2461
2462 char prop[PROPERTY_VALUE_MAX];
2463 memset(prop, 0, sizeof(prop));
2464 property_get("persist.denoise.process.plates", prop, "0");
2465
2466 denoise_param_t temp;
2467 memset(&temp, 0, sizeof(denoise_param_t));
2468 temp.denoise_enable = value;
2469 switch(atoi(prop)) {
2470 case 0:
2471 temp.process_plates = WAVELET_DENOISE_YCBCR_PLANE;
2472 break;
2473 case 1:
2474 temp.process_plates = WAVELET_DENOISE_CBCR_ONLY;
2475 break;
2476 case 2:
2477 temp.process_plates = WAVELET_DENOISE_STREAMLINE_YCBCR;
2478 break;
2479 case 3:
2480 temp.process_plates = WAVELET_DENOISE_STREAMLINED_CBCR;
2481 break;
2482 default:
2483 temp.process_plates = WAVELET_DENOISE_STREAMLINE_YCBCR;
2484 break;
2485 }
2486 ALOGE("Denoise enable=%d, plates=%d", temp.denoise_enable, temp.process_plates);
2487 bool ret = native_set_parms(MM_CAMERA_PARM_WAVELET_DENOISE, sizeof(temp),
2488 (void *)&temp);
2489 return ret ? NO_ERROR : UNKNOWN_ERROR;
2490 }
2491 return NO_ERROR;
2492 }
2493 ALOGE("Invalid Denoise value: %s", (str == NULL) ? "NULL" : str);
2494 return BAD_VALUE;
2495 }
2496
setVideoSize(const QCameraParameters & params)2497 status_t QCameraHardwareInterface::setVideoSize(const QCameraParameters& params)
2498 {
2499 const char *str= NULL;
2500 const char *str_t= NULL;
2501 int old_vid_w = 0, old_vid_h = 0;
2502 ALOGV("%s: E", __func__);
2503 str = params.get(QCameraParameters::KEY_VIDEO_SIZE);
2504 str_t = mParameters.get(CameraParameters::KEY_VIDEO_SIZE);
2505 if(!str) {
2506 mParameters.set(QCameraParameters::KEY_VIDEO_SIZE, "");
2507 //If application didn't set this parameter string, use the values from
2508 //getPreviewSize() as video dimensions.
2509 ALOGE("No Record Size requested, use the preview dimensions");
2510 videoWidth = mPreviewWidth;
2511 videoHeight = mPreviewHeight;
2512 } else {
2513 //Extract the record witdh and height that application requested.
2514 ALOGI("%s: requested record size %s", __func__, str);
2515 if(!parse_size(str, videoWidth, videoHeight)) {
2516 parse_size(str_t, old_vid_w, old_vid_h);
2517 mParameters.set(QCameraParameters::KEY_VIDEO_SIZE, str);
2518 if((QCAMERA_HAL_PREVIEW_STARTED == mPreviewState) &&
2519 (old_vid_w != videoWidth || old_vid_h != videoHeight)) {
2520 ALOGE("%s: Video sizes changes to %s, Restart preview...", __func__, str);
2521 mRestartPreview = true;
2522 }
2523 } else {
2524 mParameters.set(QCameraParameters::KEY_VIDEO_SIZE, "");
2525 ALOGE("%s: error :failed to parse parameter record-size (%s)", __func__, str);
2526 return BAD_VALUE;
2527 }
2528 }
2529 ALOGV("%s: preview dimensions: %dx%d", __func__, mPreviewWidth, mPreviewHeight);
2530 ALOGV("%s: video dimensions: %dx%d", __func__, videoWidth, videoHeight);
2531 mDimension.orig_video_width = videoWidth;
2532 mDimension.orig_video_height = videoHeight;
2533 mDimension.video_width = videoWidth;
2534 mDimension.video_height = videoHeight;
2535
2536 ALOGV("%s: X", __func__);
2537 return NO_ERROR;
2538 }
2539
setCameraMode(const QCameraParameters & params)2540 status_t QCameraHardwareInterface::setCameraMode(const QCameraParameters& params) {
2541 int32_t value = params.getInt(QCameraParameters::KEY_QC_CAMERA_MODE);
2542 mParameters.set(QCameraParameters::KEY_QC_CAMERA_MODE,value);
2543
2544 ALOGI("ZSL is enabled %d", value);
2545 if (value == 1) {
2546 myMode = (camera_mode_t)(myMode | CAMERA_ZSL_MODE);
2547 } else {
2548 myMode = (camera_mode_t)(myMode & ~CAMERA_ZSL_MODE);
2549 }
2550 return NO_ERROR;
2551 }
2552
setPowerMode(const QCameraParameters & params)2553 status_t QCameraHardwareInterface::setPowerMode(const QCameraParameters& params) {
2554 uint32_t value = NORMAL_POWER;
2555 const char *powermode = NULL;
2556
2557 powermode = params.get(QCameraParameters::KEY_QC_POWER_MODE);
2558 if (powermode != NULL) {
2559 value = attr_lookup(power_modes,
2560 sizeof(power_modes) / sizeof(str_map), powermode);
2561 if((value == LOW_POWER) || mHFRLevel > 1) {
2562 ALOGI("Enable Low Power Mode");
2563 value = LOW_POWER;
2564 mPowerMode = value;
2565 mParameters.set(QCameraParameters::KEY_QC_POWER_MODE,"Low_Power");
2566 } else {
2567 ALOGE("Enable Normal Power Mode");
2568 mPowerMode = value;
2569 mParameters.set(QCameraParameters::KEY_QC_POWER_MODE,"Normal_Power");
2570 }
2571 }
2572
2573 ALOGI("%s Low power mode %s value = %d", __func__,
2574 value ? "Enabled" : "Disabled", value);
2575 native_set_parms(MM_CAMERA_PARM_LOW_POWER_MODE, sizeof(value),
2576 (void *)&value);
2577 return NO_ERROR;
2578 }
2579
2580
setPreviewSize(const QCameraParameters & params)2581 status_t QCameraHardwareInterface::setPreviewSize(const QCameraParameters& params)
2582 {
2583 int width, height;
2584 params.getPreviewSize(&width, &height);
2585 ALOGV("################requested preview size %d x %d", width, height);
2586
2587 // Validate the preview size
2588 for (size_t i = 0; i < mPreviewSizeCount; ++i) {
2589 if (width == mPreviewSizes[i].width
2590 && height == mPreviewSizes[i].height) {
2591 mParameters.setPreviewSize(width, height);
2592 ALOGE("setPreviewSize: width: %d heigh: %d", width, height);
2593 mPreviewWidth = width;
2594 mPreviewHeight = height;
2595 mDimension.display_width = width;
2596 mDimension.display_height = height;
2597 return NO_ERROR;
2598 }
2599 }
2600 ALOGE("Invalid preview size requested: %dx%d", width, height);
2601 return BAD_VALUE;
2602 }
setPreviewFpsRange(const QCameraParameters & params)2603 status_t QCameraHardwareInterface::setPreviewFpsRange(const QCameraParameters& params)
2604 {
2605 ALOGV("%s: E", __func__);
2606 int minFps,maxFps;
2607 int prevMinFps, prevMaxFps;
2608 int rc = NO_ERROR;
2609 bool found = false;
2610
2611 mParameters.getPreviewFpsRange(&prevMinFps, &prevMaxFps);
2612 ALOGV("%s: Existing FpsRange Values:(%d, %d)", __func__, prevMinFps, prevMaxFps);
2613 params.getPreviewFpsRange(&minFps,&maxFps);
2614 ALOGV("%s: Requested FpsRange Values:(%d, %d)", __func__, minFps, maxFps);
2615
2616 if(mInitialized && (minFps == prevMinFps && maxFps == prevMaxFps)) {
2617 ALOGE("%s: No change in FpsRange", __func__);
2618 rc = NO_ERROR;
2619 goto end;
2620 }
2621 for(int i=0; i<mSupportedFpsRangesCount; i++) {
2622 // if the value is in the supported list
2623 if(minFps >= mSupportedFpsRanges[i].minFPS && maxFps <= mSupportedFpsRanges[i].maxFPS) {
2624 found = true;
2625 ALOGE("FPS: i=%d : minFps = %d, maxFps = %d ", i, minFps, maxFps);
2626 mParameters.setPreviewFpsRange(minFps,maxFps);
2627 // validate the values
2628 bool valid = true;
2629 // FPS can not be negative
2630 if(minFps < 0 || maxFps < 0) valid = false;
2631 // minFps must be >= maxFps
2632 if(minFps > maxFps) valid = false;
2633
2634 if(valid) {
2635 //Set the FPS mode
2636 const char *str = (minFps == maxFps) ?
2637 QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_FIXED_MODE:
2638 QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_AUTO_MODE;
2639 ALOGE("%s FPS_MODE = %s", __func__, str);
2640 int32_t frameRateMode = attr_lookup(frame_rate_modes,
2641 sizeof(frame_rate_modes) / sizeof(str_map),str);
2642 bool ret;
2643 ret = native_set_parms(MM_CAMERA_PARM_FPS_MODE, sizeof(int32_t),
2644 (void *)&frameRateMode);
2645
2646 //set FPS values
2647 uint32_t fps; //lower 2 bytes specify maxFps and higher 2 bytes specify minFps
2648 fps = ((uint32_t)(minFps/1000) << 16) + ((uint16_t)(maxFps/1000));
2649
2650 ret = native_set_parms(MM_CAMERA_PARM_FPS, sizeof(uint32_t), (void *)&fps);
2651 mParameters.setPreviewFpsRange(minFps, maxFps);
2652 if(ret)
2653 rc = NO_ERROR;
2654 else {
2655 rc = BAD_VALUE;
2656 ALOGE("%s: error: native_set_params failed", __func__);
2657 }
2658 } else {
2659 ALOGE("%s: error: invalid FPS range value", __func__);
2660 rc = BAD_VALUE;
2661 }
2662 }
2663 }
2664 if(found == false){
2665 ALOGE("%s: error: FPS range value not supported", __func__);
2666 rc = BAD_VALUE;
2667 }
2668 end:
2669 ALOGV("%s: X", __func__);
2670 return rc;
2671 }
2672
setJpegThumbnailSize(const QCameraParameters & params)2673 status_t QCameraHardwareInterface::setJpegThumbnailSize(const QCameraParameters& params){
2674 int width = params.getInt(QCameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
2675 int height = params.getInt(QCameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
2676
2677 ALOGV("requested jpeg thumbnail size %d x %d", width, height);
2678
2679 // Validate the picture size
2680 for (unsigned int i = 0; i < thumbnail_sizes_count; ++i) {
2681 if (width == default_thumbnail_sizes[i].width
2682 && height == default_thumbnail_sizes[i].height) {
2683 thumbnailWidth = width;
2684 thumbnailHeight = height;
2685 mParameters.set(QCameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, width);
2686 mParameters.set(QCameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, height);
2687 return NO_ERROR;
2688 }
2689 }
2690 ALOGE("error: setting jpeg thumbnail size");
2691 return BAD_VALUE;
2692 }
setPictureSize(const QCameraParameters & params)2693 status_t QCameraHardwareInterface::setPictureSize(const QCameraParameters& params)
2694 {
2695 int width, height;
2696 ALOGV("QualcommCameraHardware::setPictureSize E");
2697 params.getPictureSize(&width, &height);
2698 ALOGE("requested picture size %d x %d", width, height);
2699
2700 // Validate the picture size
2701 for (int i = 0; i < mSupportedPictureSizesCount; ++i) {
2702 if (width == mPictureSizesPtr[i].width
2703 && height == mPictureSizesPtr[i].height) {
2704 int old_width, old_height;
2705 mParameters.getPictureSize(&old_width,&old_height);
2706 mParameters.setPictureSize(width, height);
2707 mDimension.picture_width = width;
2708 mDimension.picture_height = height;
2709 if((QCAMERA_HAL_PREVIEW_STARTED == mPreviewState) &&
2710 (width != old_width || height != old_height)) {
2711 mRestartPreview = true;
2712 }
2713 return NO_ERROR;
2714 }
2715 }
2716 /* Dimension not among the ones in the list. Check if
2717 * its a valid dimension, if it is, then configure the
2718 * camera accordingly. else reject it.
2719 */
2720 if( isValidDimension(width, height) ) {
2721 mParameters.setPictureSize(width, height);
2722 mDimension.picture_width = width;
2723 mDimension.picture_height = height;
2724 return NO_ERROR;
2725 } else
2726 ALOGE("Invalid picture size requested: %dx%d", width, height);
2727 return BAD_VALUE;
2728 }
2729
setJpegRotation(int isZsl)2730 status_t QCameraHardwareInterface::setJpegRotation(int isZsl) {
2731 // return mm_jpeg_encoder_setRotation(mRotation, isZsl);
2732 return NO_ERROR;
2733 }
2734
getJpegRotation(void)2735 int QCameraHardwareInterface::getJpegRotation(void) {
2736 ALOGE("%s : rotation is %d", __func__, mRotation);
2737 return mRotation;
2738 }
2739
getISOSpeedValue()2740 int QCameraHardwareInterface::getISOSpeedValue()
2741 {
2742 const char *iso_str = mParameters.get(QCameraParameters::KEY_QC_ISO_MODE);
2743 int iso_index = attr_lookup(iso, sizeof(iso) / sizeof(str_map), iso_str);
2744 int iso_value = iso_speed_values[iso_index];
2745 return iso_value;
2746 }
2747
2748
setJpegQuality(const QCameraParameters & params)2749 status_t QCameraHardwareInterface::setJpegQuality(const QCameraParameters& params) {
2750 status_t rc = NO_ERROR;
2751 int quality = params.getInt(QCameraParameters::KEY_JPEG_QUALITY);
2752 ALOGV("setJpegQuality E");
2753 if (quality >= 0 && quality <= 100) {
2754 mParameters.set(QCameraParameters::KEY_JPEG_QUALITY, quality);
2755 mJpegQuality = quality;
2756 } else {
2757 ALOGE("Invalid jpeg quality=%d", quality);
2758 rc = BAD_VALUE;
2759 }
2760
2761 quality = params.getInt(QCameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
2762 if (quality >= 0 && quality <= 100) {
2763 mParameters.set(QCameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, quality);
2764 } else {
2765 ALOGE("Invalid jpeg thumbnail quality=%d", quality);
2766 rc = BAD_VALUE;
2767 }
2768 ALOGV("setJpegQuality X");
2769 return rc;
2770 }
2771
2772 status_t QCameraHardwareInterface::
setNumOfSnapshot(const QCameraParameters & params)2773 setNumOfSnapshot(const QCameraParameters& params) {
2774 status_t rc = NO_ERROR;
2775
2776 int num_of_snapshot = getNumOfSnapshots(params);
2777
2778 if (num_of_snapshot <= 0) {
2779 num_of_snapshot = 1;
2780 }
2781 ALOGI("number of snapshots = %d", num_of_snapshot);
2782 mParameters.set("num-snaps-per-shutter", num_of_snapshot);
2783
2784 bool result = native_set_parms(MM_CAMERA_PARM_SNAPSHOT_BURST_NUM,
2785 sizeof(int),
2786 (void *)&num_of_snapshot);
2787 if(!result)
2788 ALOGI("%s:Failure setting number of snapshots!!!", __func__);
2789 return rc;
2790 }
2791
setPreviewFormat(const QCameraParameters & params)2792 status_t QCameraHardwareInterface::setPreviewFormat(const QCameraParameters& params) {
2793 const char *str = params.getPreviewFormat();
2794 int32_t previewFormat = attr_lookup(preview_formats, sizeof(preview_formats) / sizeof(str_map), str);
2795 if(previewFormat != NOT_FOUND) {
2796 int num = sizeof(preview_format_info_list)/sizeof(preview_format_info_t);
2797 int i;
2798
2799 for (i = 0; i < num; i++) {
2800 if (preview_format_info_list[i].Hal_format == previewFormat) {
2801 mPreviewFormatInfo = preview_format_info_list[i];
2802 break;
2803 }
2804 }
2805
2806 if (i == num) {
2807 mPreviewFormatInfo.mm_cam_format = CAMERA_YUV_420_NV21;
2808 mPreviewFormatInfo.padding = CAMERA_PAD_TO_WORD;
2809 return BAD_VALUE;
2810 }
2811 bool ret = native_set_parms(MM_CAMERA_PARM_PREVIEW_FORMAT, sizeof(cam_format_t),
2812 (void *)&mPreviewFormatInfo.mm_cam_format);
2813 mParameters.set(QCameraParameters::KEY_PREVIEW_FORMAT, str);
2814 mPreviewFormat = mPreviewFormatInfo.mm_cam_format;
2815 ALOGI("Setting preview format to %d, i =%d, num=%d, hal_format=%d",
2816 mPreviewFormat, i, num, mPreviewFormatInfo.Hal_format);
2817 return NO_ERROR;
2818 } else if ( strTexturesOn ) {
2819 mPreviewFormatInfo.mm_cam_format = CAMERA_YUV_420_NV21;
2820 mPreviewFormatInfo.padding = CAMERA_PAD_TO_4K;
2821 } else {
2822 mPreviewFormatInfo.mm_cam_format = CAMERA_YUV_420_NV21;
2823 mPreviewFormatInfo.padding = CAMERA_PAD_TO_WORD;
2824 }
2825 ALOGE("Invalid preview format value: %s", (str == NULL) ? "NULL" : str);
2826 return BAD_VALUE;
2827 }
2828
setStrTextures(const QCameraParameters & params)2829 status_t QCameraHardwareInterface::setStrTextures(const QCameraParameters& params) {
2830 const char *str = params.get("strtextures");
2831 const char *prev_str = mParameters.get("strtextures");
2832
2833 if(str != NULL) {
2834 if(!strcmp(str,prev_str)) {
2835 return NO_ERROR;
2836 }
2837 int str_size = strlen(str);
2838 mParameters.set("strtextures", str);
2839 if(str_size == 2) {
2840 if(!strncmp(str, "on", str_size) || !strncmp(str, "ON", str_size)){
2841 ALOGI("Resetting mUseOverlay to false");
2842 strTexturesOn = true;
2843 mUseOverlay = false;
2844 }
2845 }else if(str_size == 3){
2846 if (!strncmp(str, "off", str_size) || !strncmp(str, "OFF", str_size)) {
2847 strTexturesOn = false;
2848 mUseOverlay = true;
2849 }
2850 }
2851
2852 }
2853 return NO_ERROR;
2854 }
2855
setFlash(const QCameraParameters & params)2856 status_t QCameraHardwareInterface::setFlash(const QCameraParameters& params)
2857 {
2858 ALOGI("%s: E",__func__);
2859 uint8_t supported;
2860 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2861 MM_CAMERA_PARM_LED_MODE,&supported,&supported);
2862 if(!supported) {
2863 ALOGE("%s:LED FLASH not supported", __func__);
2864 return NO_ERROR;
2865 }
2866
2867 const char *str = params.get(QCameraParameters::KEY_FLASH_MODE);
2868 if (str != NULL) {
2869 int32_t value = attr_lookup(flash, sizeof(flash) / sizeof(str_map), str);
2870 if (value != NOT_FOUND) {
2871 mParameters.set(QCameraParameters::KEY_FLASH_MODE, str);
2872 bool ret = native_set_parms(MM_CAMERA_PARM_LED_MODE,
2873 sizeof(value), (void *)&value);
2874 return ret ? NO_ERROR : UNKNOWN_ERROR;
2875 }
2876 }
2877 ALOGE("Invalid flash mode value: %s", (str == NULL) ? "NULL" : str);
2878
2879 return BAD_VALUE;
2880 }
2881
setAecAwbLock(const QCameraParameters & params)2882 status_t QCameraHardwareInterface::setAecAwbLock(const QCameraParameters & params)
2883 {
2884 ALOGD("%s : E", __func__);
2885 status_t rc = NO_ERROR;
2886 int32_t value;
2887 const char* str;
2888
2889 //for AEC lock
2890 str = params.get(QCameraParameters::KEY_AUTO_EXPOSURE_LOCK);
2891 value = (strcmp(str, "true") == 0)? 1 : 0;
2892 mParameters.set(QCameraParameters::KEY_AUTO_EXPOSURE_LOCK, str);
2893 rc = (native_set_parms(MM_CAMERA_PARM_AEC_LOCK, sizeof(int32_t), (void *)(&value))) ?
2894 NO_ERROR : UNKNOWN_ERROR;
2895
2896 //for AWB lock
2897 str = params.get(QCameraParameters::KEY_AUTO_WHITEBALANCE_LOCK);
2898 value = (strcmp(str, "true") == 0)? 1 : 0;
2899 mParameters.set(QCameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, str);
2900 rc = (native_set_parms(MM_CAMERA_PARM_AWB_LOCK, sizeof(int32_t), (void *)(&value))) ?
2901 NO_ERROR : UNKNOWN_ERROR;
2902 ALOGD("%s : X", __func__);
2903 return rc;
2904 }
2905
setOverlayFormats(const QCameraParameters & params)2906 status_t QCameraHardwareInterface::setOverlayFormats(const QCameraParameters& params)
2907 {
2908 mParameters.set("overlay-format", HAL_PIXEL_FORMAT_YCbCr_420_SP);
2909 if(mIs3DModeOn == true) {
2910 int ovFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP|HAL_3D_IN_SIDE_BY_SIDE_L_R|HAL_3D_OUT_SIDE_BY_SIDE;
2911 mParameters.set("overlay-format", ovFormat);
2912 }
2913 return NO_ERROR;
2914 }
2915
setMCEValue(const QCameraParameters & params)2916 status_t QCameraHardwareInterface::setMCEValue(const QCameraParameters& params)
2917 {
2918 ALOGE("%s",__func__);
2919 uint8_t supported;
2920
2921 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2922 MM_CAMERA_PARM_MCE,&supported,&supported);
2923 if(!supported) {
2924 ALOGE("MM_CAMERA_PARM_MCE mode is not supported for this sensor");
2925 return NO_ERROR;
2926 }
2927 const char *str = params.get(QCameraParameters::KEY_QC_MEMORY_COLOR_ENHANCEMENT);
2928 if (str != NULL) {
2929 int value = attr_lookup(mce, sizeof(mce) / sizeof(str_map), str);
2930 if (value != NOT_FOUND) {
2931 int temp = (int8_t)value;
2932 ALOGI("%s: setting MCE value of %s", __FUNCTION__, str);
2933 mParameters.set(QCameraParameters::KEY_QC_MEMORY_COLOR_ENHANCEMENT, str);
2934
2935 native_set_parms(MM_CAMERA_PARM_MCE, sizeof(int8_t), (void *)&temp);
2936 return NO_ERROR;
2937 }
2938 }
2939 ALOGE("Invalid MCE value: %s", (str == NULL) ? "NULL" : str);
2940
2941 return NO_ERROR;
2942 }
2943
setHighFrameRate(const QCameraParameters & params)2944 status_t QCameraHardwareInterface::setHighFrameRate(const QCameraParameters& params)
2945 {
2946 uint8_t supported;
2947 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2948 MM_CAMERA_PARM_HFR,&supported,&supported);
2949 if(!supported) {
2950 ALOGE("%s: MM_CAMERA_PARM_HFR not supported", __func__);
2951 return NO_ERROR;
2952 }
2953
2954 const char *str = params.get(QCameraParameters::KEY_QC_VIDEO_HIGH_FRAME_RATE);
2955 if (str != NULL) {
2956 int value = attr_lookup(hfr, sizeof(hfr) / sizeof(str_map), str);
2957 if (value != NOT_FOUND) {
2958 mHFRLevel = (int32_t)value;
2959 //Check for change in HFR value
2960 const char *oldHfr = mParameters.get(QCameraParameters::KEY_QC_VIDEO_HIGH_FRAME_RATE);
2961 if(strcmp(oldHfr, str)){
2962 mParameters.set(QCameraParameters::KEY_QC_VIDEO_HIGH_FRAME_RATE, str);
2963 if(QCAMERA_HAL_PREVIEW_STARTED == mPreviewState) {
2964 stopPreviewInternal();
2965 mPreviewState = QCAMERA_HAL_PREVIEW_STOPPED;
2966 native_set_parms(MM_CAMERA_PARM_HFR, sizeof(int32_t), (void *)&mHFRLevel);
2967 mRestartPreview = true;
2968 return NO_ERROR;
2969 }
2970 }
2971 native_set_parms(MM_CAMERA_PARM_HFR, sizeof(int32_t), (void *)&mHFRLevel);
2972 return NO_ERROR;
2973 }
2974 }
2975 ALOGE("Invalid HFR value: %s", (str == NULL) ? "NULL" : str);
2976 return NO_ERROR;
2977 }
2978
setLensshadeValue(const QCameraParameters & params)2979 status_t QCameraHardwareInterface::setLensshadeValue(const QCameraParameters& params)
2980 {
2981
2982 uint8_t supported;
2983 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
2984 MM_CAMERA_PARM_ROLLOFF,&supported,&supported);
2985 if(!supported) {
2986 ALOGE("%s:LENS SHADING not supported", __func__);
2987 return NO_ERROR;
2988 }
2989
2990 const char *str = params.get(QCameraParameters::KEY_QC_LENSSHADE);
2991 if (str != NULL) {
2992 int value = attr_lookup(lensshade,
2993 sizeof(lensshade) / sizeof(str_map), str);
2994 if (value != NOT_FOUND) {
2995 int8_t temp = (int8_t)value;
2996 mParameters.set(QCameraParameters::KEY_QC_LENSSHADE, str);
2997 native_set_parms(MM_CAMERA_PARM_ROLLOFF, sizeof(int8_t), (void *)&temp);
2998 return NO_ERROR;
2999 }
3000 }
3001 ALOGE("Invalid lensShade value: %s", (str == NULL) ? "NULL" : str);
3002 return BAD_VALUE;
3003 }
3004
setFaceDetect(const QCameraParameters & params)3005 status_t QCameraHardwareInterface::setFaceDetect(const QCameraParameters& params)
3006 {
3007 int requested_faces = params.getInt(QCameraParameters::KEY_QC_MAX_NUM_REQUESTED_FACES);
3008 int hardware_supported_faces = mParameters.getInt(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW);
3009 if (requested_faces > hardware_supported_faces) {
3010 requested_faces = hardware_supported_faces;
3011 }
3012 mParameters.set(QCameraParameters::KEY_QC_MAX_NUM_REQUESTED_FACES, requested_faces);
3013 const char *str = params.get(QCameraParameters::KEY_QC_FACE_DETECTION);
3014 ALOGE("setFaceDetect: %s", str);
3015 if (str != NULL) {
3016 fd_set_parm_t fd_set_parm;
3017 int value = attr_lookup(facedetection,
3018 sizeof(facedetection) / sizeof(str_map), str);
3019 mFaceDetectOn = value;
3020 fd_set_parm.fd_mode = value;
3021 fd_set_parm.num_fd = requested_faces;
3022 ALOGE("%s Face detection value = %d, num_fd = %d",__func__, value, requested_faces);
3023 native_set_parms(MM_CAMERA_PARM_FD, sizeof(fd_set_parm_t), (void *)&fd_set_parm);
3024 mParameters.set(QCameraParameters::KEY_QC_FACE_DETECTION, str);
3025 return NO_ERROR;
3026 }
3027 ALOGE("Invalid Face Detection value: %s", (str == NULL) ? "NULL" : str);
3028 return BAD_VALUE;
3029 }
setFaceDetection(const char * str)3030 status_t QCameraHardwareInterface::setFaceDetection(const char *str)
3031 {
3032 if(supportsFaceDetection() == false){
3033 ALOGE("Face detection is not enabled");
3034 return NO_ERROR;
3035 }
3036 if (str != NULL) {
3037 int requested_faces = mParameters.getInt(QCameraParameters::KEY_QC_MAX_NUM_REQUESTED_FACES);
3038 int value = attr_lookup(facedetection,
3039 sizeof(facedetection) / sizeof(str_map), str);
3040 if (value != NOT_FOUND) {
3041 fd_set_parm_t fd_set_parm;
3042 mFaceDetectOn = value;
3043 fd_set_parm.fd_mode = value;
3044 fd_set_parm.num_fd = requested_faces;
3045 ALOGE("%s Face detection value = %d, num_fd = %d",__func__, value, requested_faces);
3046 native_set_parms(MM_CAMERA_PARM_FD, sizeof(fd_set_parm_t), (void *)&fd_set_parm);
3047 mParameters.set(QCameraParameters::KEY_QC_FACE_DETECTION, str);
3048 return NO_ERROR;
3049 }
3050 }
3051 ALOGE("Invalid Face Detection value: %s", (str == NULL) ? "NULL" : str);
3052 return BAD_VALUE;
3053 }
3054
setAEBracket(const QCameraParameters & params)3055 status_t QCameraHardwareInterface::setAEBracket(const QCameraParameters& params)
3056 {
3057 uint8_t supported;
3058 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
3059 MM_CAMERA_PARM_HDR,&supported,&supported);
3060 if(!supported || (myMode & CAMERA_ZSL_MODE)) {
3061 ALOGI("Parameter HDR is not supported for this sensor/ ZSL mode");
3062
3063 if (myMode & CAMERA_ZSL_MODE) {
3064 ALOGE("In ZSL mode, reset AEBBracket to HDR_OFF mode");
3065 exp_bracketing_t temp;
3066 memset(&temp, 0, sizeof(temp));
3067 mHdrMode = HDR_BRACKETING_OFF;
3068 temp.hdr_enable= FALSE;
3069 temp.mode = HDR_BRACKETING_OFF;
3070 native_set_parms(MM_CAMERA_PARM_HDR, sizeof(exp_bracketing_t), (void *)&temp);
3071 }
3072 return NO_ERROR;
3073 }
3074 const char *str = params.get(QCameraParameters::KEY_QC_AE_BRACKET_HDR);
3075
3076 if (str != NULL) {
3077 int value = attr_lookup(hdr_bracket,
3078 sizeof(hdr_bracket) / sizeof(str_map), str);
3079 exp_bracketing_t temp;
3080 memset(&temp, 0, sizeof(temp));
3081 switch (value) {
3082 case HDR_MODE:
3083 {
3084 mHdrMode = HDR_MODE;
3085 ALOGE("%s, mHdrMode == HDR_MODE", __func__);
3086 /* temp.hdr_enable= TRUE;
3087 temp.mode = HDR_MODE;
3088 temp.total_frames = 3;
3089 temp.total_hal_frames = getNumOfSnapshots();
3090 ALOGI("%s: setting HDR frames (%d)", __FUNCTION__, temp.total_hal_frames);
3091 native_set_parms(MM_CAMERA_PARM_HDR, sizeof(exp_bracketing_t), (void *)&temp); */
3092 }
3093 break;
3094 case EXP_BRACKETING_MODE:
3095 {
3096 ALOGE("%s, mHdrMode == EXP_BRACKETING_MODE", __func__);
3097 int numFrames = getNumOfSnapshots();
3098 const char *str_val = params.get("capture-burst-exposures");
3099 if ((str_val != NULL) && (strlen(str_val)>0)) {
3100 ALOGI("%s: capture-burst-exposures %s", __FUNCTION__, str_val);
3101
3102 mHdrMode = EXP_BRACKETING_MODE;
3103 temp.hdr_enable = FALSE;
3104 temp.mode = EXP_BRACKETING_MODE;
3105 temp.total_frames = (numFrames > MAX_SNAPSHOT_BUFFERS -2) ? MAX_SNAPSHOT_BUFFERS -2 : numFrames;
3106 temp.total_hal_frames = temp.total_frames;
3107 strlcpy(temp.values, str_val, MAX_EXP_BRACKETING_LENGTH);
3108 ALOGI("%s: setting Exposure Bracketing value of %s, frame (%d)", __FUNCTION__, temp.values, temp.total_hal_frames);
3109 native_set_parms(MM_CAMERA_PARM_HDR, sizeof(exp_bracketing_t), (void *)&temp);
3110 }
3111 else {
3112 /* Apps not set capture-burst-exposures, error case fall into bracketing off mode */
3113 ALOGI("%s: capture-burst-exposures not set, back to HDR OFF mode", __FUNCTION__);
3114 mHdrMode = HDR_BRACKETING_OFF;
3115 temp.hdr_enable= FALSE;
3116 temp.mode = HDR_BRACKETING_OFF;
3117 native_set_parms(MM_CAMERA_PARM_HDR, sizeof(exp_bracketing_t), (void *)&temp);
3118 }
3119 }
3120 break;
3121 case HDR_BRACKETING_OFF:
3122 ALOGE("%s, mHdrMode == HDR_BRACKETING_OFF", __func__);
3123 default:
3124 {
3125 ALOGE("%s, mHdrMode == HDR_BRACKETING_OFF", __func__);
3126 mHdrMode = HDR_BRACKETING_OFF;
3127 temp.hdr_enable= FALSE;
3128 temp.mode = HDR_BRACKETING_OFF;
3129 native_set_parms(MM_CAMERA_PARM_HDR, sizeof(exp_bracketing_t), (void *)&temp);
3130 }
3131 break;
3132 }
3133
3134 /* save the value*/
3135 mParameters.set(QCameraParameters::KEY_QC_AE_BRACKET_HDR, str);
3136 }
3137 return NO_ERROR;
3138 }
3139
setCaptureBurstExp()3140 status_t QCameraHardwareInterface::setCaptureBurstExp()
3141 {
3142 char burst_exp[PROPERTY_VALUE_MAX];
3143 memset(burst_exp, 0, sizeof(burst_exp));
3144 property_get("persist.capture.burst.exposures", burst_exp, "");
3145 if (NULL != burst_exp)
3146 mParameters.set("capture-burst-exposures", burst_exp);
3147 return NO_ERROR;
3148 }
3149
setRedeyeReduction(const QCameraParameters & params)3150 status_t QCameraHardwareInterface::setRedeyeReduction(const QCameraParameters& params)
3151 {
3152 if(supportsRedEyeReduction() == false) {
3153 ALOGE("Parameter Redeye Reduction is not supported for this sensor");
3154 return NO_ERROR;
3155 }
3156
3157 const char *str = params.get(QCameraParameters::KEY_QC_REDEYE_REDUCTION);
3158 if (str != NULL) {
3159 int value = attr_lookup(redeye_reduction, sizeof(redeye_reduction) / sizeof(str_map), str);
3160 if (value != NOT_FOUND) {
3161 int8_t temp = (int8_t)value;
3162 ALOGI("%s: setting Redeye Reduction value of %s", __FUNCTION__, str);
3163 mParameters.set(QCameraParameters::KEY_QC_REDEYE_REDUCTION, str);
3164
3165 native_set_parms(MM_CAMERA_PARM_REDEYE_REDUCTION, sizeof(int8_t), (void *)&temp);
3166 return NO_ERROR;
3167 }
3168 }
3169 ALOGE("Invalid Redeye Reduction value: %s", (str == NULL) ? "NULL" : str);
3170 return BAD_VALUE;
3171 }
3172
setGpsLocation(const QCameraParameters & params)3173 status_t QCameraHardwareInterface::setGpsLocation(const QCameraParameters& params)
3174 {
3175 const char *method = params.get(QCameraParameters::KEY_GPS_PROCESSING_METHOD);
3176 if (method) {
3177 mParameters.set(QCameraParameters::KEY_GPS_PROCESSING_METHOD, method);
3178 }else {
3179 mParameters.remove(QCameraParameters::KEY_GPS_PROCESSING_METHOD);
3180 }
3181
3182 const char *latitude = params.get(QCameraParameters::KEY_GPS_LATITUDE);
3183 if (latitude) {
3184 ALOGE("latitude %s",latitude);
3185 mParameters.set(QCameraParameters::KEY_GPS_LATITUDE, latitude);
3186 }else {
3187 mParameters.remove(QCameraParameters::KEY_GPS_LATITUDE);
3188 }
3189
3190 const char *latitudeRef = params.get(QCameraParameters::KEY_QC_GPS_LATITUDE_REF);
3191 if (latitudeRef) {
3192 mParameters.set(QCameraParameters::KEY_QC_GPS_LATITUDE_REF, latitudeRef);
3193 }else {
3194 mParameters.remove(QCameraParameters::KEY_QC_GPS_LATITUDE_REF);
3195 }
3196
3197 const char *longitude = params.get(QCameraParameters::KEY_GPS_LONGITUDE);
3198 if (longitude) {
3199 mParameters.set(QCameraParameters::KEY_GPS_LONGITUDE, longitude);
3200 }else {
3201 mParameters.remove(QCameraParameters::KEY_GPS_LONGITUDE);
3202 }
3203
3204 const char *longitudeRef = params.get(QCameraParameters::KEY_QC_GPS_LONGITUDE_REF);
3205 if (longitudeRef) {
3206 mParameters.set(QCameraParameters::KEY_QC_GPS_LONGITUDE_REF, longitudeRef);
3207 }else {
3208 mParameters.remove(QCameraParameters::KEY_QC_GPS_LONGITUDE_REF);
3209 }
3210
3211 const char *altitudeRef = params.get(QCameraParameters::KEY_QC_GPS_ALTITUDE_REF);
3212 if (altitudeRef) {
3213 mParameters.set(QCameraParameters::KEY_QC_GPS_ALTITUDE_REF, altitudeRef);
3214 }else {
3215 mParameters.remove(QCameraParameters::KEY_QC_GPS_ALTITUDE_REF);
3216 }
3217
3218 const char *altitude = params.get(QCameraParameters::KEY_GPS_ALTITUDE);
3219 if (altitude) {
3220 mParameters.set(QCameraParameters::KEY_GPS_ALTITUDE, altitude);
3221 }else {
3222 mParameters.remove(QCameraParameters::KEY_GPS_ALTITUDE);
3223 }
3224
3225 const char *status = params.get(QCameraParameters::KEY_QC_GPS_STATUS);
3226 if (status) {
3227 mParameters.set(QCameraParameters::KEY_QC_GPS_STATUS, status);
3228 }
3229
3230 const char *dateTime = params.get(QCameraParameters::KEY_QC_EXIF_DATETIME);
3231 if (dateTime) {
3232 mParameters.set(QCameraParameters::KEY_QC_EXIF_DATETIME, dateTime);
3233 }else {
3234 mParameters.remove(QCameraParameters::KEY_QC_EXIF_DATETIME);
3235 }
3236
3237 const char *timestamp = params.get(QCameraParameters::KEY_GPS_TIMESTAMP);
3238 if (timestamp) {
3239 mParameters.set(QCameraParameters::KEY_GPS_TIMESTAMP, timestamp);
3240 }else {
3241 mParameters.remove(QCameraParameters::KEY_GPS_TIMESTAMP);
3242 }
3243 ALOGE("setGpsLocation X");
3244 return NO_ERROR;
3245 }
3246
setRotation(const QCameraParameters & params)3247 status_t QCameraHardwareInterface::setRotation(const QCameraParameters& params)
3248 {
3249 status_t rc = NO_ERROR;
3250 int rotation = params.getInt(QCameraParameters::KEY_ROTATION);
3251 if (rotation != NOT_FOUND) {
3252 if (rotation == 0 || rotation == 90 || rotation == 180
3253 || rotation == 270) {
3254 mParameters.set(QCameraParameters::KEY_ROTATION, rotation);
3255 mRotation = rotation;
3256 } else {
3257 ALOGE("Invalid rotation value: %d", rotation);
3258 rc = BAD_VALUE;
3259 }
3260 }
3261 ALOGE("setRotation");
3262 return rc;
3263 }
3264
setDenoise(const QCameraParameters & params)3265 status_t QCameraHardwareInterface::setDenoise(const QCameraParameters& params)
3266 {
3267 return BAD_VALUE;
3268 }
3269
setOrientation(const QCameraParameters & params)3270 status_t QCameraHardwareInterface::setOrientation(const QCameraParameters& params)
3271 {
3272 const char *str = params.get("orientation");
3273
3274 if (str != NULL) {
3275 if (strcmp(str, "portrait") == 0 || strcmp(str, "landscape") == 0) {
3276 // Camera service needs this to decide if the preview frames and raw
3277 // pictures should be rotated.
3278 mParameters.set("orientation", str);
3279 } else {
3280 ALOGE("Invalid orientation value: %s", str);
3281 return BAD_VALUE;
3282 }
3283 }
3284 return NO_ERROR;
3285 }
3286
setPictureFormat(const QCameraParameters & params)3287 status_t QCameraHardwareInterface::setPictureFormat(const QCameraParameters& params)
3288 {
3289 const char * str = params.get(QCameraParameters::KEY_PICTURE_FORMAT);
3290 if(str != NULL){
3291 int32_t value = attr_lookup(picture_formats,
3292 sizeof(picture_formats) / sizeof(str_map), str);
3293 if(value != NOT_FOUND){
3294 if (isZSLMode() && !strcmp(str, "raw")) {
3295 mParameters.set(QCameraParameters::KEY_PICTURE_FORMAT, "jpeg");
3296 } else {
3297 mParameters.set(QCameraParameters::KEY_PICTURE_FORMAT, str);
3298 }
3299 } else {
3300 ALOGE("Invalid Picture Format value: %s", str);
3301 return BAD_VALUE;
3302 }
3303 }
3304 return NO_ERROR;
3305 }
3306
setRecordingHintValue(const int32_t value)3307 status_t QCameraHardwareInterface::setRecordingHintValue(const int32_t value)
3308 {
3309 native_set_parms(MM_CAMERA_PARM_RECORDING_HINT, sizeof(value),
3310 (void *)&value);
3311 if (value == TRUE){
3312 native_set_parms(MM_CAMERA_PARM_CAF_ENABLE, sizeof(value),
3313 (void *)&value);
3314 }
3315 setDISMode();
3316 setFullLiveshot();
3317 return NO_ERROR;
3318 }
3319
setRecordingHint(const QCameraParameters & params)3320 status_t QCameraHardwareInterface::setRecordingHint(const QCameraParameters& params)
3321 {
3322
3323 const char * str = params.get(QCameraParameters::KEY_RECORDING_HINT);
3324
3325 if(str != NULL){
3326 int32_t value = attr_lookup(recording_Hints,
3327 sizeof(recording_Hints) / sizeof(str_map), str);
3328 if(value != NOT_FOUND){
3329 mRecordingHint = value;
3330 setRecordingHintValue(mRecordingHint);
3331 mParameters.set(QCameraParameters::KEY_RECORDING_HINT, str);
3332 return NO_ERROR;
3333 } else {
3334 ALOGE("Invalid Picture Format value: %s", str);
3335 setDISMode();
3336 setFullLiveshot();
3337 return BAD_VALUE;
3338 }
3339 }
3340 setDISMode();
3341 setFullLiveshot();
3342 return NO_ERROR;
3343 }
3344
setDISMode()3345 status_t QCameraHardwareInterface::setDISMode() {
3346 /* Enable DIS only if
3347 * - Camcorder mode AND
3348 * - DIS property is set AND
3349 * - Not in Low power mode. */
3350 uint32_t value = mRecordingHint && mDisEnabled
3351 && !isLowPowerCamcorder();
3352
3353 ALOGI("%s DIS is %s value = %d", __func__,
3354 value ? "Enabled" : "Disabled", value);
3355 native_set_parms(MM_CAMERA_PARM_DIS_ENABLE, sizeof(value),
3356 (void *)&value);
3357 return NO_ERROR;
3358 }
3359
setFullLiveshot()3360 status_t QCameraHardwareInterface::setFullLiveshot()
3361 {
3362 /* Enable full size liveshot only if
3363 * - Camcorder mode AND
3364 * - Full size liveshot is enabled. */
3365 uint32_t value = mRecordingHint && mFullLiveshotEnabled
3366 && !isLowPowerCamcorder();
3367
3368 if (((mDimension.picture_width == mDimension.video_width) &&
3369 (mDimension.picture_height == mDimension.video_height))) {
3370 /* If video size matches the live snapshot size
3371 * turn off full size liveshot to get higher fps. */
3372 value = 0;
3373 }
3374
3375 ALOGI("%s Full size liveshot %s value = %d", __func__,
3376 value ? "Enabled" : "Disabled", value);
3377 native_set_parms(MM_CAMERA_PARM_FULL_LIVESHOT, sizeof(value),
3378 (void *)&value);
3379 return NO_ERROR;
3380 }
3381
setMobiCat(const QCameraParameters & params)3382 status_t QCameraHardwareInterface::setMobiCat(const QCameraParameters& params)
3383 {
3384 mm_cam_mobicat_info_t mbc_info;
3385 char mbc_prop[PROPERTY_VALUE_MAX];
3386 int propval;
3387 memset(mbc_prop, 0, sizeof(mbc_prop));
3388 property_get("persist.camera.mobicat", mbc_prop, "0");
3389 propval = atoi(mbc_prop);
3390 mbc_info.enable = (mParameters.getInt("mobicat") == 1) ? 1 : 0;
3391 ALOGV("%s:%d] prop %d %d", __func__, __LINE__, mbc_info.enable, propval);
3392 mbc_info.enable |= propval;
3393
3394 if (mbc_info.enable != mMobiCatEnabled) {
3395 ALOGV("%s:%d] enable %d", __func__, __LINE__, mbc_info.enable);
3396 native_set_parms(MM_CAMERA_PARM_MOBICAT, sizeof(mm_cam_mobicat_info_t),
3397 (void *)&mbc_info);
3398 mMobiCatEnabled = mbc_info.enable;
3399 }
3400 return NO_ERROR;
3401 }
3402
3403
getAutoFocusMode(const QCameraParameters & params)3404 isp3a_af_mode_t QCameraHardwareInterface::getAutoFocusMode(
3405 const QCameraParameters& params)
3406 {
3407 isp3a_af_mode_t afMode = AF_MODE_MAX;
3408 afMode = (isp3a_af_mode_t)mFocusMode;
3409 return afMode;
3410 }
3411
getPictureSize(int * picture_width,int * picture_height) const3412 void QCameraHardwareInterface::getPictureSize(int *picture_width,
3413 int *picture_height) const
3414 {
3415 mParameters.getPictureSize(picture_width, picture_height);
3416 }
3417
getPreviewSize(int * preview_width,int * preview_height) const3418 void QCameraHardwareInterface::getPreviewSize(int *preview_width,
3419 int *preview_height) const
3420 {
3421 mParameters.getPreviewSize(preview_width, preview_height);
3422 }
3423
getVideoSize(int * video_width,int * video_height) const3424 void QCameraHardwareInterface::getVideoSize(int *video_width,
3425 int *video_height) const
3426 {
3427 mParameters.getVideoSize(video_width, video_height);
3428 }
3429
getThumbnailSize(int * thumb_width,int * thumb_height) const3430 void QCameraHardwareInterface::getThumbnailSize(int *thumb_width,
3431 int *thumb_height) const
3432 {
3433 *thumb_width = mParameters.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
3434 *thumb_height = mParameters.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
3435 }
3436
getPreviewFormat() const3437 cam_format_t QCameraHardwareInterface::getPreviewFormat() const
3438 {
3439 cam_format_t foramt = CAMERA_YUV_420_NV21;
3440 const char *str = mParameters.getPreviewFormat();
3441 int32_t value = attr_lookup(preview_formats,
3442 sizeof(preview_formats)/sizeof(str_map),
3443 str);
3444
3445 if(value != NOT_FOUND) {
3446 int num = sizeof(preview_format_info_list)/sizeof(preview_format_info_t);
3447 int i;
3448 for (i = 0; i < num; i++) {
3449 if (preview_format_info_list[i].Hal_format == value) {
3450 foramt = preview_format_info_list[i].mm_cam_format;
3451 break;
3452 }
3453 }
3454 }
3455
3456 return foramt;
3457 }
3458
getPreviewPadding() const3459 cam_pad_format_t QCameraHardwareInterface::getPreviewPadding() const
3460 {
3461 return mPreviewFormatInfo.padding;
3462 }
3463
getJpegQuality() const3464 int QCameraHardwareInterface::getJpegQuality() const
3465 {
3466 return mJpegQuality;
3467 }
3468
getNumOfSnapshots(void) const3469 int QCameraHardwareInterface::getNumOfSnapshots(void) const
3470 {
3471 char prop[PROPERTY_VALUE_MAX];
3472 memset(prop, 0, sizeof(prop));
3473 property_get("persist.camera.snapshot.number", prop, "0");
3474 ALOGI("%s: prop enable/disable = %d", __func__, atoi(prop));
3475 if (atoi(prop)) {
3476 ALOGE("%s: Reading maximum no of snapshots = %d"
3477 "from properties", __func__, atoi(prop));
3478 return atoi(prop);
3479 } else {
3480 return mParameters.getInt("num-snaps-per-shutter");
3481 }
3482 }
3483
getNumOfSnapshots(const QCameraParameters & params)3484 int QCameraHardwareInterface::getNumOfSnapshots(const QCameraParameters& params)
3485 {
3486 char prop[PROPERTY_VALUE_MAX];
3487 memset(prop, 0, sizeof(prop));
3488 property_get("persist.camera.snapshot.number", prop, "0");
3489 ALOGI("%s: prop enable/disable = %d", __func__, atoi(prop));
3490 if (atoi(prop)) {
3491 ALOGI("%s: Reading maximum no of snapshots = %d"
3492 "from properties", __func__, atoi(prop));
3493 return atoi(prop);
3494 } else {
3495 return params.getInt("num-snaps-per-shutter");
3496 }
3497
3498 }
3499
3500 int QCameraHardwareInterface::
getThumbSizesFromAspectRatio(uint32_t aspect_ratio,int * picture_width,int * picture_height)3501 getThumbSizesFromAspectRatio(uint32_t aspect_ratio,
3502 int *picture_width,
3503 int *picture_height)
3504 {
3505 for(unsigned int i = 0; i < THUMBNAIL_SIZE_COUNT; i++ ){
3506 if(thumbnail_sizes[i].aspect_ratio == aspect_ratio)
3507 {
3508 *picture_width = thumbnail_sizes[i].width;
3509 *picture_height = thumbnail_sizes[i].height;
3510 return NO_ERROR;
3511 }
3512 }
3513
3514 return BAD_VALUE;
3515 }
3516
isRawSnapshot()3517 bool QCameraHardwareInterface::isRawSnapshot()
3518 {
3519 const char *format = mParameters.getPictureFormat();
3520 if( format!= NULL &&
3521 !strcmp(format, QCameraParameters::PIXEL_FORMAT_RAW)){
3522 return true;
3523 }
3524 else{
3525 return false;
3526 }
3527 }
3528
setPreviewSizeTable(void)3529 status_t QCameraHardwareInterface::setPreviewSizeTable(void)
3530 {
3531 status_t ret = NO_ERROR;
3532 mm_camera_dimension_t dim;
3533 struct camera_size_type* preview_size_table;
3534 int preview_table_size;
3535 int i = 0;
3536 char str[10] = {0};
3537
3538 /* Initialize table with default values */
3539 preview_size_table = default_preview_sizes;
3540 preview_table_size = preview_sizes_count;
3541
3542
3543 /* Get maximum preview size supported by sensor*/
3544 memset(&dim, 0, sizeof(mm_camera_dimension_t));
3545 ret = mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
3546 MM_CAMERA_PARM_MAX_PREVIEW_SIZE, &dim);
3547 if (ret != NO_ERROR) {
3548 ALOGE("%s: Failure getting Max Preview Size supported by camera",
3549 __func__);
3550 goto end;
3551 }
3552
3553 ALOGD("%s: Max Preview Sizes Supported: %d X %d", __func__,
3554 dim.width, dim.height);
3555
3556 for (i = 0; i < preview_table_size; i++) {
3557 if ((preview_size_table->width <= dim.width) &&
3558 (preview_size_table->height <= dim.height)) {
3559 ALOGD("%s: Camera Preview Size Table "
3560 "Max width: %d height %d table_size: %d",
3561 __func__, preview_size_table->width,
3562 preview_size_table->height, preview_table_size - i);
3563 break;
3564 }
3565 preview_size_table++;
3566 }
3567 //set preferred preview size to maximum preview size
3568 sprintf(str, "%dx%d", preview_size_table->width, preview_size_table->height);
3569 mParameters.set(QCameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, str);
3570 ALOGD("KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO = %s", str);
3571
3572 end:
3573 /* Save the table in global member*/
3574 mPreviewSizes = preview_size_table;
3575 mPreviewSizeCount = preview_table_size - i;
3576
3577 return ret;
3578 }
3579
setPictureSizeTable(void)3580 status_t QCameraHardwareInterface::setPictureSizeTable(void)
3581 {
3582 status_t ret = NO_ERROR;
3583 mm_camera_dimension_t dim;
3584 struct camera_size_type* picture_size_table;
3585 int picture_table_size;
3586 int i = 0, count = 0;
3587
3588 /* Initialize table with default values */
3589 picture_table_size = sizeof(default_picture_sizes)/
3590 sizeof(default_picture_sizes[0]);
3591 picture_size_table = default_picture_sizes;
3592 mPictureSizes =
3593 ( struct camera_size_type *)malloc(picture_table_size *
3594 sizeof(struct camera_size_type));
3595 if (mPictureSizes == NULL) {
3596 ALOGE("%s: Failre allocating memory to store picture size table",__func__);
3597 goto end;
3598 }
3599
3600 /* Get maximum picture size supported by sensor*/
3601 memset(&dim, 0, sizeof(mm_camera_dimension_t));
3602 ret = mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
3603 MM_CAMERA_PARM_MAX_PICTURE_SIZE, &dim);
3604 if (ret != NO_ERROR) {
3605 ALOGE("%s: Failure getting Max Picture Size supported by camera",
3606 __func__);
3607 ret = NO_MEMORY;
3608 free(mPictureSizes);
3609 mPictureSizes = NULL;
3610 goto end;
3611 }
3612
3613 ALOGD("%s: Max Picture Sizes Supported: %d X %d", __func__,
3614 dim.width, dim.height);
3615
3616 for (i = 0; i < picture_table_size; i++) {
3617 /* We'll store those dimensions whose width AND height
3618 are less than or equal to maximum supported */
3619 if ((picture_size_table->width <= dim.width) &&
3620 (picture_size_table->height <= dim.height)) {
3621 ALOGD("%s: Camera Picture Size Table "
3622 "Max width: %d height %d table_size: %d",
3623 __func__, picture_size_table->width,
3624 picture_size_table->height, count+1);
3625 mPictureSizes[count].height = picture_size_table->height;
3626 mPictureSizes[count].width = picture_size_table->width;
3627 count++;
3628 }
3629 picture_size_table++;
3630 }
3631 mPictureSizeCount = count;
3632
3633 end:
3634 /* In case of error, we use default picture sizes */
3635 if (ret != NO_ERROR) {
3636 mPictureSizes = default_picture_sizes;
3637 mPictureSizeCount = picture_table_size;
3638 }
3639 return ret;
3640 }
3641
setVideoSizeTable(void)3642 status_t QCameraHardwareInterface::setVideoSizeTable(void)
3643 {
3644 status_t ret = NO_ERROR;
3645 mm_camera_dimension_t dim;
3646 struct camera_size_type* video_size_table;
3647 int video_table_size;
3648 int i = 0, count = 0;
3649 ALOGE("%s: E", __func__);
3650
3651 /* Initialize table with default values */
3652 video_table_size = video_sizes_count;
3653 video_size_table = default_video_sizes;
3654 mVideoSizes =
3655 (struct camera_size_type *)malloc(video_table_size *
3656 sizeof(struct camera_size_type));
3657 if(mVideoSizes == NULL) {
3658 ALOGE("%s: error allocating memory to store video size table",__func__);
3659 ret = BAD_VALUE;
3660 goto end;
3661 }
3662
3663 /* Get maximum video size supported by sensor*/
3664 memset(&dim, 0, sizeof(mm_camera_dimension_t));
3665 ret = mCameraHandle->ops->get_parm(mCameraHandle->camera_handle,
3666 MM_CAMERA_PARM_MAX_VIDEO_SIZE, &dim);
3667 if(ret != NO_ERROR) {
3668 ALOGE("%s: error getting Max Video Size supported by camera",
3669 __func__);
3670 ret = NO_MEMORY;
3671 free(mVideoSizes);
3672 mVideoSizes = NULL;
3673 ret = BAD_VALUE;
3674 goto end;
3675 }
3676
3677 ALOGD("%s: Max Video Size Supported: %d X %d", __func__,
3678 dim.width, dim.height);
3679
3680 for(i=0; i < video_table_size; i++) {
3681 /* We'll store those dimensions whose width AND height
3682 are less than or equal to maximum supported */
3683 if((video_size_table->width <= dim.width) &&
3684 (video_size_table->height <= dim.height)) {
3685 ALOGD("%s: Supported Video Size [%d] = %dx%d", __func__, count, video_size_table->width,
3686 video_size_table->height);
3687 mVideoSizes[count].height = video_size_table->height;
3688 mVideoSizes[count].width = video_size_table->width;
3689 count++;
3690 }
3691 video_size_table++;
3692 }
3693 mVideoSizeCount = count;
3694
3695 end:
3696 ALOGE("%s: X", __func__);
3697 return ret;
3698 }
3699
freeVideoSizeTable(void)3700 void QCameraHardwareInterface::freeVideoSizeTable(void)
3701 {
3702 if(mVideoSizes != NULL)
3703 {
3704 free(mVideoSizes);
3705 }
3706 mVideoSizeCount = 0;
3707 }
3708
3709
freePictureTable(void)3710 void QCameraHardwareInterface::freePictureTable(void)
3711 {
3712 /* If we couldn't allocate memory to store picture table
3713 we use the picture table pointer to point to default
3714 picture table array. In that case we cannot free it.*/
3715 if ((mPictureSizes != default_picture_sizes) && mPictureSizes) {
3716 free(mPictureSizes);
3717 }
3718 }
3719
setHistogram(int histogram_en)3720 status_t QCameraHardwareInterface::setHistogram(int histogram_en)
3721 {
3722 status_t ret = NO_ERROR;
3723
3724 ALOGV("setHistogram: E");
3725 if(mStatsOn == histogram_en) {
3726 return ret;
3727 }
3728
3729 status_t rc = NO_ERROR;
3730 mCameraHandle->ops->is_parm_supported(mCameraHandle->camera_handle,
3731 MM_CAMERA_PARM_HISTOGRAM,
3732 (uint8_t*)&rc,(uint8_t*)&rc);
3733 if(!rc) {
3734 ALOGE(" Histogram is not supported for this");
3735 return NO_ERROR;
3736 }
3737 mSendData = histogram_en;
3738 mStatsOn = histogram_en;
3739
3740 if (histogram_en == QCAMERA_PARM_ENABLE) {
3741 ret = initHistogramBuffers();
3742 if (ret != NO_ERROR) {
3743 ALOGE("%s Error initializing Histogram buffers ", __func__);
3744 return ret;
3745 }
3746 }
3747 ALOGI(" Histogram -> %s", histogram_en ? "Enabled" : "Disabled");
3748 native_set_parms(MM_CAMERA_PARM_HISTOGRAM, sizeof(int), &histogram_en);
3749 if(histogram_en == QCAMERA_PARM_DISABLE) {
3750 ret = deInitHistogramBuffers();
3751 if (ret != NO_ERROR) {
3752 ALOGE("%s Error deInitializing Histogram buffers ", __func__);
3753 return ret;
3754 }
3755 }
3756 ALOGV("setHistogram: X");
3757 return ret;
3758 }
3759
setZSLBurstLookBack(const QCameraParameters & params)3760 status_t QCameraHardwareInterface::setZSLBurstLookBack(const QCameraParameters& params)
3761 {
3762 const char *v = params.get("capture-burst-retroactive");
3763 if (v) {
3764 int look_back = atoi(v);
3765 ALOGI("%s: look_back =%d", __func__, look_back);
3766 mParameters.set("capture-burst-retroactive", look_back);
3767 }
3768 return NO_ERROR;
3769 }
3770
setZSLBurstInterval(const QCameraParameters & params)3771 status_t QCameraHardwareInterface::setZSLBurstInterval(const QCameraParameters& params)
3772 {
3773 mZslInterval = BURST_INTREVAL_DEFAULT;
3774 const char *v = params.get("capture-burst-interval");
3775 if (v) {
3776 int interval = atoi(v);
3777 ALOGI("%s: Interval =%d", __func__, interval);
3778 if(interval < BURST_INTREVAL_MIN ||interval > BURST_INTREVAL_MAX ) {
3779 return BAD_VALUE;
3780 }
3781 mZslInterval = interval;
3782 }
3783 return NO_ERROR;
3784 }
3785
getZSLBurstInterval(void)3786 int QCameraHardwareInterface::getZSLBurstInterval( void )
3787 {
3788 int val;
3789
3790 if (mZslInterval == BURST_INTREVAL_DEFAULT) {
3791 char prop[PROPERTY_VALUE_MAX];
3792 memset(prop, 0, sizeof(prop));
3793 property_get("persist.camera.zsl.interval", prop, "1");
3794 val = atoi(prop);
3795 ALOGD("%s: prop interval = %d", __func__, val);
3796 } else {
3797 val = mZslInterval;
3798 }
3799 return val;
3800 }
3801
3802
getZSLQueueDepth(void) const3803 int QCameraHardwareInterface::getZSLQueueDepth(void) const
3804 {
3805 char prop[PROPERTY_VALUE_MAX];
3806 memset(prop, 0, sizeof(prop));
3807 property_get("persist.camera.zsl.queuedepth", prop, "2");
3808 ALOGI("%s: prop = %d", __func__, atoi(prop));
3809 return atoi(prop);
3810 }
3811
getZSLBackLookCount(void) const3812 int QCameraHardwareInterface::getZSLBackLookCount(void) const
3813 {
3814 int look_back;
3815 char prop[PROPERTY_VALUE_MAX];
3816 memset(prop, 0, sizeof(prop));
3817 property_get("persist.camera.zsl.backlookcnt", prop, "0");
3818 ALOGI("%s: prop = %d", __func__, atoi(prop));
3819 look_back = atoi(prop);
3820 if (look_back == 0 ) {
3821 look_back = mParameters.getInt("capture-burst-retroactive");
3822 ALOGE("%s: look_back = %d", __func__, look_back);
3823 }
3824 return look_back;
3825 }
3826
3827 //EXIF functions
deinitExifData()3828 void QCameraHardwareInterface::deinitExifData()
3829 {
3830 ALOGD("Clearing EXIF data");
3831 memset(mExifData, 0, sizeof(exif_tags_info_t) * MAX_EXIF_TABLE_ENTRIES);
3832 mExifTableNumEntries = 0;
3833 }
3834
addExifTag(exif_tag_id_t tagid,exif_tag_type_t type,uint32_t count,uint8_t copy,void * data)3835 void QCameraHardwareInterface::addExifTag(exif_tag_id_t tagid, exif_tag_type_t type,
3836 uint32_t count, uint8_t copy, void *data) {
3837
3838 if(mExifTableNumEntries >= MAX_EXIF_TABLE_ENTRIES) {
3839 ALOGE("%s: Number of entries exceeded limit", __func__);
3840 return;
3841 }
3842 int index = mExifTableNumEntries;
3843 mExifData[index].tag_id = tagid;
3844 mExifData[index].tag_entry.type = type;
3845 mExifData[index].tag_entry.count = count;
3846 mExifData[index].tag_entry.copy = copy;
3847 if((type == EXIF_RATIONAL) && (count > 1))
3848 mExifData[index].tag_entry.data._rats = (rat_t *)data;
3849 if((type == EXIF_RATIONAL) && (count == 1))
3850 mExifData[index].tag_entry.data._rat = *(rat_t *)data;
3851 else if(type == EXIF_ASCII)
3852 mExifData[index].tag_entry.data._ascii = (char *)data;
3853 else if(type == EXIF_BYTE)
3854 mExifData[index].tag_entry.data._byte = *(uint8_t *)data;
3855 else if((type == EXIF_SHORT) && (count > 1))
3856 mExifData[index].tag_entry.data._shorts = (uint16_t *)data;
3857 else if((type == EXIF_SHORT) && (count == 1))
3858 mExifData[index].tag_entry.data._short = *(uint16_t *)data;
3859 // Increase number of entries
3860 mExifTableNumEntries++;
3861 }
3862
getRational(int num,int denom)3863 rat_t getRational(int num, int denom)
3864 {
3865 rat_t temp = {num, denom};
3866 return temp;
3867 }
3868
initExifData()3869 void QCameraHardwareInterface::initExifData(){
3870 if(mExifValues.dateTime) {
3871 addExifTag(EXIFTAGID_EXIF_DATE_TIME_ORIGINAL, EXIF_ASCII,
3872 20, 1, (void *)mExifValues.dateTime);
3873 }
3874 addExifTag(EXIFTAGID_FOCAL_LENGTH, EXIF_RATIONAL, 1, 1, (void *)&(mExifValues.focalLength));
3875 addExifTag(EXIFTAGID_ISO_SPEED_RATING,EXIF_SHORT,1,1,(void *)&(mExifValues.isoSpeed));
3876
3877 if(mExifValues.mGpsProcess) {
3878 addExifTag(EXIFTAGID_GPS_PROCESSINGMETHOD, EXIF_ASCII,
3879 EXIF_ASCII_PREFIX_SIZE + strlen(mExifValues.gpsProcessingMethod + EXIF_ASCII_PREFIX_SIZE) + 1,
3880 1, (void *)mExifValues.gpsProcessingMethod);
3881 }
3882
3883 if(mExifValues.mLatitude) {
3884 addExifTag(EXIFTAGID_GPS_LATITUDE, EXIF_RATIONAL, 3, 1, (void *)mExifValues.latitude);
3885
3886 if(mExifValues.latRef) {
3887 addExifTag(EXIFTAGID_GPS_LATITUDE_REF, EXIF_ASCII, 2,
3888 1, (void *)mExifValues.latRef);
3889 }
3890 }
3891
3892 if(mExifValues.mLongitude) {
3893 addExifTag(EXIFTAGID_GPS_LONGITUDE, EXIF_RATIONAL, 3, 1, (void *)mExifValues.longitude);
3894
3895 if(mExifValues.lonRef) {
3896 addExifTag(EXIFTAGID_GPS_LONGITUDE_REF, EXIF_ASCII, 2,
3897 1, (void *)mExifValues.lonRef);
3898 }
3899 }
3900
3901 if(mExifValues.mAltitude) {
3902 addExifTag(EXIFTAGID_GPS_ALTITUDE, EXIF_RATIONAL, 1,
3903 1, (void *)&(mExifValues.altitude));
3904
3905 addExifTag(EXIFTAGID_GPS_ALTITUDE_REF, EXIF_BYTE, 1, 1, (void *)&mExifValues.mAltitude_ref);
3906 }
3907
3908 if(mExifValues.mTimeStamp) {
3909 time_t unixTime;
3910 struct tm *UTCTimestamp;
3911
3912 unixTime = (time_t)mExifValues.mGPSTimestamp;
3913 UTCTimestamp = gmtime(&unixTime);
3914
3915 strftime(mExifValues.gpsDateStamp, sizeof(mExifValues.gpsDateStamp), "%Y:%m:%d", UTCTimestamp);
3916 addExifTag(EXIFTAGID_GPS_DATESTAMP, EXIF_ASCII,
3917 strlen(mExifValues.gpsDateStamp)+1 , 1, (void *)mExifValues.gpsDateStamp);
3918
3919 mExifValues.gpsTimeStamp[0] = getRational(UTCTimestamp->tm_hour, 1);
3920 mExifValues.gpsTimeStamp[1] = getRational(UTCTimestamp->tm_min, 1);
3921 mExifValues.gpsTimeStamp[2] = getRational(UTCTimestamp->tm_sec, 1);
3922
3923 addExifTag(EXIFTAGID_GPS_TIMESTAMP, EXIF_RATIONAL,
3924 3, 1, (void *)mExifValues.gpsTimeStamp);
3925 ALOGE("EXIFTAGID_GPS_TIMESTAMP set");
3926 }
3927
3928 }
3929
3930 //Add all exif tags in this function
setExifTags()3931 void QCameraHardwareInterface::setExifTags()
3932 {
3933 const char *str;
3934
3935 //set TimeStamp
3936 str = mParameters.get(QCameraParameters::KEY_QC_EXIF_DATETIME);
3937 if(str != NULL) {
3938 strncpy(mExifValues.dateTime, str, 19);
3939 mExifValues.dateTime[19] = '\0';
3940 }
3941
3942 //Set focal length
3943 int focalLengthValue = (int) (mParameters.getFloat(
3944 QCameraParameters::KEY_FOCAL_LENGTH) * FOCAL_LENGTH_DECIMAL_PRECISION);
3945
3946 mExifValues.focalLength = getRational(focalLengthValue, FOCAL_LENGTH_DECIMAL_PRECISION);
3947
3948 //Set ISO Speed
3949 mExifValues.isoSpeed = getISOSpeedValue();
3950
3951 //get time and date from system
3952 time_t rawtime;
3953 struct tm * timeinfo;
3954 time(&rawtime);
3955 timeinfo = localtime (&rawtime);
3956 //Write datetime according to EXIF Spec
3957 //"YYYY:MM:DD HH:MM:SS" (20 chars including \0)
3958 snprintf(mExifValues.dateTime, 20, "%04d:%02d:%02d %02d:%02d:%02d",
3959 timeinfo->tm_year + 1900, timeinfo->tm_mon + 1,
3960 timeinfo->tm_mday, timeinfo->tm_hour,
3961 timeinfo->tm_min, timeinfo->tm_sec);
3962
3963 //set gps tags
3964 setExifTagsGPS();
3965 }
3966
setExifTagsGPS()3967 void QCameraHardwareInterface::setExifTagsGPS()
3968 {
3969 const char *str = NULL;
3970
3971 //Set GPS processing method
3972 str = mParameters.get(QCameraParameters::KEY_GPS_PROCESSING_METHOD);
3973 if(str != NULL) {
3974 memcpy(mExifValues.gpsProcessingMethod, ExifAsciiPrefix, EXIF_ASCII_PREFIX_SIZE);
3975 strncpy(mExifValues.gpsProcessingMethod + EXIF_ASCII_PREFIX_SIZE, str,
3976 GPS_PROCESSING_METHOD_SIZE - 1);
3977 mExifValues.gpsProcessingMethod[EXIF_ASCII_PREFIX_SIZE + GPS_PROCESSING_METHOD_SIZE-1] = '\0';
3978 ALOGE("EXIFTAGID_GPS_PROCESSINGMETHOD = %s %s", mExifValues.gpsProcessingMethod,
3979 mExifValues.gpsProcessingMethod+8);
3980 mExifValues.mGpsProcess = true;
3981 }else{
3982 mExifValues.mGpsProcess = false;
3983 }
3984 str = NULL;
3985
3986 //Set Latitude
3987 str = mParameters.get(QCameraParameters::KEY_GPS_LATITUDE);
3988 if(str != NULL) {
3989 parseGPSCoordinate(str, mExifValues.latitude);
3990 ALOGE("EXIFTAGID_GPS_LATITUDE = %s", str);
3991
3992 //set Latitude Ref
3993 float latitudeValue = mParameters.getFloat(QCameraParameters::KEY_GPS_LATITUDE);
3994 if(latitudeValue < 0.0f) {
3995 mExifValues.latRef[0] = 'S';
3996 } else {
3997 mExifValues.latRef[0] = 'N';
3998 }
3999 mExifValues.latRef[1] = '\0';
4000 mExifValues.mLatitude = true;
4001 mParameters.set(QCameraParameters::KEY_QC_GPS_LATITUDE_REF,mExifValues.latRef);
4002 ALOGE("EXIFTAGID_GPS_LATITUDE_REF = %s", mExifValues.latRef);
4003 }else{
4004 mExifValues.mLatitude = false;
4005 }
4006
4007 //set Longitude
4008 str = NULL;
4009 str = mParameters.get(QCameraParameters::KEY_GPS_LONGITUDE);
4010 if(str != NULL) {
4011 parseGPSCoordinate(str, mExifValues.longitude);
4012 ALOGE("EXIFTAGID_GPS_LONGITUDE = %s", str);
4013
4014 //set Longitude Ref
4015 float longitudeValue = mParameters.getFloat(QCameraParameters::KEY_GPS_LONGITUDE);
4016 if(longitudeValue < 0.0f) {
4017 mExifValues.lonRef[0] = 'W';
4018 } else {
4019 mExifValues.lonRef[0] = 'E';
4020 }
4021 mExifValues.lonRef[1] = '\0';
4022 mExifValues.mLongitude = true;
4023 ALOGE("EXIFTAGID_GPS_LONGITUDE_REF = %s", mExifValues.lonRef);
4024 mParameters.set(QCameraParameters::KEY_QC_GPS_LONGITUDE_REF, mExifValues.lonRef);
4025 }else{
4026 mExifValues.mLongitude = false;
4027 }
4028
4029 //set Altitude
4030 str = mParameters.get(QCameraParameters::KEY_GPS_ALTITUDE);
4031 if(str != NULL) {
4032 double value = atof(str);
4033 mExifValues.mAltitude_ref = 0;
4034 if(value < 0){
4035 mExifValues.mAltitude_ref = 1;
4036 value = -value;
4037 }
4038 mExifValues.altitude = getRational(value*1000, 1000);
4039 mExifValues.mAltitude = true;
4040 //set AltitudeRef
4041 mParameters.set(QCameraParameters::KEY_QC_GPS_ALTITUDE_REF, mExifValues.mAltitude_ref);
4042 ALOGE("EXIFTAGID_GPS_ALTITUDE = %f", value);
4043 }else{
4044 mExifValues.mAltitude = false;
4045 }
4046
4047 //set Gps TimeStamp
4048 str = NULL;
4049 str = mParameters.get(QCameraParameters::KEY_GPS_TIMESTAMP);
4050 if(str != NULL) {
4051 mExifValues.mTimeStamp = true;
4052 mExifValues.mGPSTimestamp = atol(str);
4053 }else{
4054 mExifValues.mTimeStamp = false;
4055 }
4056 }
4057
4058 //latlonString is string formatted coordinate
4059 //coord is rat_t[3]
parseGPSCoordinate(const char * latlonString,rat_t * coord)4060 void QCameraHardwareInterface::parseGPSCoordinate(const char *latlonString, rat_t* coord)
4061 {
4062 if(coord == NULL) {
4063 ALOGE("%s: error, invalid argument coord == NULL", __func__);
4064 return;
4065 }
4066 float degF = fabs(atof(latlonString));
4067 float minF = (degF- (int) degF) * 60;
4068 float secF = (minF - (int) minF) * 60;
4069
4070 coord[0] = getRational((int) degF, 1);
4071 coord[1] = getRational((int) minF, 1);
4072 coord[2] = getRational((int) (secF * 10000), 10000);
4073 }
4074
isLowPowerCamcorder()4075 bool QCameraHardwareInterface::isLowPowerCamcorder() {
4076
4077 if (mPowerMode == LOW_POWER)
4078 return true;
4079
4080 if(mHFRLevel > 1) /* hard code the value now. Need to move tgtcommon to camear.h */
4081 return true;
4082
4083 return false;
4084 }
4085
setNoDisplayMode(const QCameraParameters & params)4086 status_t QCameraHardwareInterface::setNoDisplayMode(const QCameraParameters& params)
4087 {
4088 char prop[PROPERTY_VALUE_MAX];
4089 memset(prop, 0, sizeof(prop));
4090 property_get("persist.camera.nodisplay", prop, "0");
4091 int prop_val = atoi(prop);
4092
4093 if (prop_val == 0) {
4094 const char *str_val = params.get("no-display-mode");
4095 if(str_val && strlen(str_val) > 0) {
4096 mNoDisplayMode = atoi(str_val);
4097 } else {
4098 mNoDisplayMode = 0;
4099 }
4100 ALOGD("Param mNoDisplayMode =%d", mNoDisplayMode);
4101 } else {
4102 mNoDisplayMode = prop_val;
4103 ALOGD("prop mNoDisplayMode =%d", mNoDisplayMode);
4104 }
4105 return NO_ERROR;
4106 }
4107
setRDIMode(const QCameraParameters & params)4108 status_t QCameraHardwareInterface::setRDIMode(const QCameraParameters& params)
4109 {
4110 char prop[PROPERTY_VALUE_MAX];
4111 memset(prop, 0, sizeof(prop));
4112 property_get("persist.camera.rdi.mode", prop, "0");
4113 int prop_val = atoi(prop);
4114 rdiMode = prop_val;
4115 ALOGE("RDI Mode = %d",rdiMode);
4116 return NO_ERROR;
4117 }
4118
setDimension()4119 status_t QCameraHardwareInterface::setDimension()
4120 {
4121 ALOGV("%s: E", __func__);
4122 cam_ctrl_dimension_t dim;
4123 int ret = MM_CAMERA_OK;
4124 int postviewWidth,postviewHeight;
4125
4126 memset(&dim, 0, sizeof(cam_ctrl_dimension_t));
4127 ret = mCameraHandle->ops->get_parm(mCameraHandle->camera_handle, MM_CAMERA_PARM_DIMENSION,&dim);
4128
4129 if (MM_CAMERA_OK != ret) {
4130 ALOGE("%s: error - can't get preview dimension!", __func__);
4131 ALOGE("%s: X", __func__);
4132 return BAD_VALUE;
4133 }
4134
4135 getPreviewSize(&mPreviewWidth, &mPreviewHeight);
4136 dim.display_width = mPreviewWidth;
4137 dim.display_height = mPreviewHeight;
4138
4139 cam_format_t value = getPreviewFormat();
4140 if(value != NOT_FOUND && value != dim.prev_format ) {
4141 //Setting to Parameter requested by the Upper layer
4142 dim.prev_format = value;
4143 }else{
4144 //Setting to default Format.
4145 dim.prev_format = CAMERA_YUV_420_NV21;
4146 }
4147 dim.prev_padding_format = getPreviewPadding( );
4148
4149 getVideoSize(&videoWidth, &videoHeight);
4150 dim.enc_format = CAMERA_YUV_420_NV12;
4151 dim.orig_video_width = videoWidth;
4152 dim.orig_video_height = videoHeight;
4153 dim.video_width = videoWidth;
4154 dim.video_height = videoHeight;
4155 dim.video_chroma_width = videoWidth;
4156 dim.video_chroma_height = videoHeight;
4157
4158 getPictureSize(&mPictureWidth, &mPictureHeight);
4159 dim.picture_width = mPictureWidth;
4160 dim.picture_height = mPictureHeight;
4161
4162 getThumbnailSize(&thumbnailWidth,&thumbnailHeight);
4163 dim.ui_thumbnail_width = thumbnailWidth;
4164 dim.ui_thumbnail_height = thumbnailHeight;
4165
4166 /* Reset the Main image and thumbnail formats here,
4167 * since they might have been changed when video size
4168 * livesnapshot was taken. */
4169 if (mSnapshotFormat == 1)
4170 dim.main_img_format = CAMERA_YUV_422_NV61;
4171 else
4172 dim.main_img_format = CAMERA_YUV_420_NV21;
4173 dim.thumb_format = CAMERA_YUV_420_NV21;
4174
4175 //RDI Format
4176 dim.rdi0_format = CAMERA_BAYER_SBGGR10;
4177
4178 /*Code to handle different limitations*/
4179 if (mRecordingHint && mFullLiveshotEnabled){
4180 dim.ui_thumbnail_height = dim.display_height;
4181 dim.ui_thumbnail_width = dim.display_width;
4182 }
4183 if (isZSLMode()){
4184 postviewWidth = mPreviewWidth;
4185 postviewHeight = mPreviewHeight;
4186 } else {
4187 postviewWidth = thumbnailWidth;
4188 postviewHeight = thumbnailHeight;
4189 }
4190 if (mPictureWidth < postviewWidth || mPictureHeight < postviewHeight)
4191 {
4192 //Changes to handle VFE limitation when primary o/p is main image
4193 dim.picture_width = postviewWidth;
4194 dim.picture_height = postviewHeight;
4195 }
4196
4197 //VFE output1 shouldn't be greater than VFE output2.
4198 if( (dim.display_width > dim.video_width) ||
4199 (dim.display_height > dim.video_height)) {
4200 //Set preview sizes as record sizes.
4201 dim.display_width = dim.video_width;
4202 dim.display_height = dim.video_height;
4203 }
4204 if (mRecordingHint && mFullLiveshotEnabled){
4205 if( (dim.picture_width < dim.video_width) ||
4206 (dim.picture_height < dim.video_height)) {
4207 dim.picture_width = dim.video_width;
4208 dim.picture_height = dim.video_height;
4209 }
4210 }
4211
4212 if(mIs3DModeOn == true) {
4213 /* As preview and video frames are same in 3D mode,
4214 * preview size should be same as video size. This
4215 * cahnge is needed to take of video resolutions
4216 * like 720P and 1080p where the application can
4217 * request different preview sizes like 768x432
4218 */
4219 ALOGE("3D mod is on");
4220 dim.display_width = dim.video_width;
4221 dim.display_height = dim.video_height;
4222 }
4223
4224 /*End of limitation code*/
4225
4226 ret = mCameraHandle->ops->set_parm(mCameraHandle->camera_handle, MM_CAMERA_PARM_DIMENSION,&dim);
4227 if (MM_CAMERA_OK != ret) {
4228 ALOGE("%s X: error - can't config preview parms!", __func__);
4229 return BAD_VALUE;
4230 }
4231 if(mStreams[MM_CAMERA_PREVIEW]) {
4232 mStreams[MM_CAMERA_PREVIEW]->mFormat = dim.prev_format;
4233 mStreams[MM_CAMERA_PREVIEW]->mWidth = dim.display_width;
4234 mStreams[MM_CAMERA_PREVIEW]->mHeight = dim.display_height;
4235 }
4236 if(mStreams[MM_CAMERA_VIDEO]) {
4237 mStreams[MM_CAMERA_VIDEO]->mFormat = dim.enc_format;
4238 mStreams[MM_CAMERA_VIDEO]->mWidth = dim.video_width;
4239 mStreams[MM_CAMERA_VIDEO]->mHeight = dim.video_height;
4240 }
4241 if(mStreams[MM_CAMERA_SNAPSHOT_MAIN]) {
4242 mStreams[MM_CAMERA_SNAPSHOT_MAIN]->mFormat = dim.main_img_format;
4243 if (!isRawSnapshot()) {
4244 mStreams[MM_CAMERA_SNAPSHOT_MAIN]->mWidth = dim.picture_width;
4245 mStreams[MM_CAMERA_SNAPSHOT_MAIN]->mHeight = dim.picture_height;
4246 } else {
4247 cam_frame_resolution_t raw_res;
4248
4249 /* the raw_picture_width in dimension is for RDI dump.
4250 * here, raw snapshot size is from camif. */
4251 memset(&raw_res, 0, sizeof(raw_res));
4252 raw_res.image_mode = MSM_V4L2_EXT_CAPTURE_MODE_RAW;
4253 raw_res.padding_format = CAMERA_PAD_TO_WORD;
4254 ret = mCameraHandle->ops->get_parm(
4255 mCameraHandle->camera_handle,
4256 MM_CAMERA_PARM_FRAME_RESOLUTION,&raw_res);
4257 if (MM_CAMERA_OK != ret) {
4258 ALOGE("%s error - config raw snapshot parms, rc = %d",
4259 __func__, ret);
4260 return BAD_VALUE;
4261 }
4262 mStreams[MM_CAMERA_SNAPSHOT_MAIN]->mWidth = raw_res.width;
4263 mStreams[MM_CAMERA_SNAPSHOT_MAIN]->mHeight = raw_res.height;
4264 mStreams[MM_CAMERA_SNAPSHOT_MAIN]->mFormat = raw_res.format;
4265 }
4266 }
4267 if(mStreams[MM_CAMERA_SNAPSHOT_THUMBNAIL]) {
4268 mStreams[MM_CAMERA_SNAPSHOT_THUMBNAIL]->mFormat = dim.thumb_format;
4269 mStreams[MM_CAMERA_SNAPSHOT_THUMBNAIL]->mWidth = dim.ui_thumbnail_width;
4270 mStreams[MM_CAMERA_SNAPSHOT_THUMBNAIL]->mHeight = dim.ui_thumbnail_height;
4271 }
4272
4273 memcpy(&mDimension, &dim, sizeof(mDimension));
4274 ALOGV("%s: X", __func__);
4275 return NO_ERROR;
4276 }
4277 }; /*namespace android */
4278