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