1 /* 2 * Copyright (C) Texas Instruments - http://www.ti.com/ 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 /** 18 * @file OMX3A.cpp 19 * 20 * This file contains functionality for handling 3A configurations. 21 * 22 */ 23 24 #undef LOG_TAG 25 26 #define LOG_TAG "CameraHAL" 27 28 #include "CameraHal.h" 29 #include "OMXCameraAdapter.h" 30 #include "ErrorUtils.h" 31 32 #include <cutils/properties.h> 33 34 #undef TRUE 35 #undef FALSE 36 #define TRUE "true" 37 #define FALSE "false" 38 39 #define METERING_AREAS_RANGE 0xFF 40 41 namespace android { 42 const SceneModesEntry* OMXCameraAdapter::getSceneModeEntry(const char* name, 43 OMX_SCENEMODETYPE scene) { 44 const SceneModesEntry* cameraLUT = NULL; 45 const SceneModesEntry* entry = NULL; 46 unsigned int numEntries = 0; 47 48 // 1. Find camera's scene mode LUT 49 for (unsigned int i = 0; i < ARRAY_SIZE(CameraToSensorModesLUT); i++) { 50 if (strcmp(CameraToSensorModesLUT[i].name, name) == 0) { 51 cameraLUT = CameraToSensorModesLUT[i].Table; 52 numEntries = CameraToSensorModesLUT[i].size; 53 break; 54 } 55 } 56 57 // 2. Find scene mode entry in table 58 if (!cameraLUT) { 59 goto EXIT; 60 } 61 62 for (unsigned int i = 0; i < numEntries; i++) { 63 if(cameraLUT[i].scene == scene) { 64 entry = cameraLUT + i; 65 break; 66 } 67 } 68 EXIT: 69 return entry; 70 } 71 72 status_t OMXCameraAdapter::setParameters3A(const CameraParameters ¶ms, 73 BaseCameraAdapter::AdapterState state) 74 { 75 status_t ret = NO_ERROR; 76 int mode = 0; 77 const char *str = NULL; 78 int varint = 0; 79 BaseCameraAdapter::AdapterState nextState; 80 BaseCameraAdapter::getNextState(nextState); 81 82 LOG_FUNCTION_NAME; 83 84 Mutex::Autolock lock(m3ASettingsUpdateLock); 85 86 str = params.get(CameraParameters::KEY_SCENE_MODE); 87 mode = getLUTvalue_HALtoOMX( str, SceneLUT); 88 if ( mFirstTimeInit || ((str != NULL) && ( mParameters3A.SceneMode != mode )) ) { 89 if ( 0 <= mode ) { 90 mParameters3A.SceneMode = mode; 91 if ((mode == OMX_Manual) && (mFirstTimeInit == false)){//Auto mode 92 mFirstTimeInit = true; 93 } 94 if ((mode != OMX_Manual) && 95 (state & PREVIEW_ACTIVE) && !(nextState & CAPTURE_ACTIVE)) { 96 // if setting preset scene mode, previewing, and not in the middle of capture 97 // set preset scene mode immediately instead of in next FBD 98 // for feedback params to work properly since they need to be read 99 // by application in subsequent getParameters() 100 ret |= setScene(mParameters3A); 101 // re-apply EV compensation after setting scene mode since it probably reset it 102 if(mParameters3A.EVCompensation) { 103 setEVCompensation(mParameters3A); 104 } 105 return ret; 106 } else { 107 mPending3Asettings |= SetSceneMode; 108 } 109 } else { 110 mParameters3A.SceneMode = OMX_Manual; 111 } 112 CAMHAL_LOGVB("SceneMode %d", mParameters3A.SceneMode); 113 } 114 115 #ifdef OMAP_ENHANCEMENT 116 117 str = params.get(TICameraParameters::KEY_EXPOSURE_MODE); 118 mode = getLUTvalue_HALtoOMX( str, ExpLUT); 119 if ( ( str != NULL ) && ( mParameters3A.Exposure != mode )) 120 { 121 mParameters3A.Exposure = mode; 122 CAMHAL_LOGDB("Exposure mode %d", mode); 123 if ( 0 <= mParameters3A.Exposure ) 124 { 125 mPending3Asettings |= SetExpMode; 126 } 127 } 128 129 #endif 130 131 str = params.get(CameraParameters::KEY_WHITE_BALANCE); 132 mode = getLUTvalue_HALtoOMX( str, WBalLUT); 133 if (mFirstTimeInit || ((str != NULL) && (mode != mParameters3A.WhiteBallance))) 134 { 135 mParameters3A.WhiteBallance = mode; 136 CAMHAL_LOGDB("Whitebalance mode %d", mode); 137 if ( 0 <= mParameters3A.WhiteBallance ) 138 { 139 mPending3Asettings |= SetWhiteBallance; 140 } 141 } 142 143 #ifdef OMAP_ENHANCEMENT 144 145 varint = params.getInt(TICameraParameters::KEY_CONTRAST); 146 if ( 0 <= varint ) 147 { 148 if ( mFirstTimeInit || 149 ( (mParameters3A.Contrast + CONTRAST_OFFSET) != varint ) ) 150 { 151 mParameters3A.Contrast = varint - CONTRAST_OFFSET; 152 CAMHAL_LOGDB("Contrast %d", mParameters3A.Contrast); 153 mPending3Asettings |= SetContrast; 154 } 155 } 156 157 varint = params.getInt(TICameraParameters::KEY_SHARPNESS); 158 if ( 0 <= varint ) 159 { 160 if ( mFirstTimeInit || 161 ((mParameters3A.Sharpness + SHARPNESS_OFFSET) != varint )) 162 { 163 mParameters3A.Sharpness = varint - SHARPNESS_OFFSET; 164 CAMHAL_LOGDB("Sharpness %d", mParameters3A.Sharpness); 165 mPending3Asettings |= SetSharpness; 166 } 167 } 168 169 varint = params.getInt(TICameraParameters::KEY_SATURATION); 170 if ( 0 <= varint ) 171 { 172 if ( mFirstTimeInit || 173 ((mParameters3A.Saturation + SATURATION_OFFSET) != varint ) ) 174 { 175 mParameters3A.Saturation = varint - SATURATION_OFFSET; 176 CAMHAL_LOGDB("Saturation %d", mParameters3A.Saturation); 177 mPending3Asettings |= SetSaturation; 178 } 179 } 180 181 varint = params.getInt(TICameraParameters::KEY_BRIGHTNESS); 182 if ( 0 <= varint ) 183 { 184 if ( mFirstTimeInit || 185 (( mParameters3A.Brightness != varint )) ) 186 { 187 mParameters3A.Brightness = (unsigned) varint; 188 CAMHAL_LOGDB("Brightness %d", mParameters3A.Brightness); 189 mPending3Asettings |= SetBrightness; 190 } 191 } 192 193 #endif 194 195 str = params.get(CameraParameters::KEY_ANTIBANDING); 196 mode = getLUTvalue_HALtoOMX(str,FlickerLUT); 197 if ( mFirstTimeInit || ( ( str != NULL ) && ( mParameters3A.Flicker != mode ) )) 198 { 199 mParameters3A.Flicker = mode; 200 CAMHAL_LOGDB("Flicker %d", mParameters3A.Flicker); 201 if ( 0 <= mParameters3A.Flicker ) 202 { 203 mPending3Asettings |= SetFlicker; 204 } 205 } 206 207 #ifdef OMAP_ENHANCEMENT 208 209 str = params.get(TICameraParameters::KEY_ISO); 210 mode = getLUTvalue_HALtoOMX(str, IsoLUT); 211 CAMHAL_LOGVB("ISO mode arrived in HAL : %s", str); 212 if ( mFirstTimeInit || ( ( str != NULL ) && ( mParameters3A.ISO != mode )) ) 213 { 214 mParameters3A.ISO = mode; 215 CAMHAL_LOGDB("ISO %d", mParameters3A.ISO); 216 if ( 0 <= mParameters3A.ISO ) 217 { 218 mPending3Asettings |= SetISO; 219 } 220 } 221 222 #endif 223 224 str = params.get(CameraParameters::KEY_FOCUS_MODE); 225 mode = getLUTvalue_HALtoOMX(str, FocusLUT); 226 if ( (mFirstTimeInit || ((str != NULL) && (mParameters3A.Focus != mode)))) 227 { 228 mPending3Asettings |= SetFocus; 229 230 mParameters3A.Focus = mode; 231 232 // if focus mode is set to infinity...update focus distance immediately 233 if (mode == OMX_IMAGE_FocusControlAutoInfinity) { 234 updateFocusDistances(mParameters); 235 } 236 237 CAMHAL_LOGDB("Focus %x", mParameters3A.Focus); 238 } 239 240 str = params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION); 241 varint = params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 242 if ( mFirstTimeInit || 243 (( str != NULL ) && 244 (mParameters3A.EVCompensation != varint ))) 245 { 246 CAMHAL_LOGDB("Setting EV Compensation to %d", varint); 247 248 mParameters3A.EVCompensation = varint; 249 mPending3Asettings |= SetEVCompensation; 250 } 251 252 str = params.get(CameraParameters::KEY_FLASH_MODE); 253 mode = getLUTvalue_HALtoOMX( str, FlashLUT); 254 if ( mFirstTimeInit || (( str != NULL ) && ( mParameters3A.FlashMode != mode )) ) 255 { 256 if ( 0 <= mode ) 257 { 258 mParameters3A.FlashMode = mode; 259 mPending3Asettings |= SetFlash; 260 } 261 else 262 { 263 mParameters3A.FlashMode = OMX_Manual; 264 } 265 } 266 267 CAMHAL_LOGVB("Flash Setting %s", str); 268 CAMHAL_LOGVB("FlashMode %d", mParameters3A.FlashMode); 269 270 str = params.get(CameraParameters::KEY_EFFECT); 271 mode = getLUTvalue_HALtoOMX( str, EffLUT); 272 if ( mFirstTimeInit || (( str != NULL ) && ( mParameters3A.Effect != mode )) ) 273 { 274 mParameters3A.Effect = mode; 275 CAMHAL_LOGDB("Effect %d", mParameters3A.Effect); 276 if ( 0 <= mParameters3A.Effect ) 277 { 278 mPending3Asettings |= SetEffect; 279 } 280 } 281 282 str = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED); 283 if ( (str != NULL) && (!strcmp(str, "true")) ) 284 { 285 OMX_BOOL lock = OMX_FALSE; 286 mUserSetExpLock = OMX_FALSE; 287 str = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK); 288 if (str && ((strcmp(str, "true")) == 0)) 289 { 290 CAMHAL_LOGVA("Locking Exposure"); 291 lock = OMX_TRUE; 292 mUserSetExpLock = OMX_TRUE; 293 } 294 else 295 { 296 CAMHAL_LOGVA("UnLocking Exposure"); 297 } 298 299 if (mParameters3A.ExposureLock != lock) 300 { 301 mParameters3A.ExposureLock = lock; 302 CAMHAL_LOGDB("ExposureLock %d", lock); 303 mPending3Asettings |= SetExpLock; 304 } 305 } 306 307 str = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED); 308 if ( (str != NULL) && (!strcmp(str, "true")) ) 309 { 310 OMX_BOOL lock = OMX_FALSE; 311 mUserSetWbLock = OMX_FALSE; 312 str = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK); 313 if (str && ((strcmp(str, "true")) == 0)) 314 { 315 CAMHAL_LOGVA("Locking WhiteBalance"); 316 lock = OMX_TRUE; 317 mUserSetWbLock = OMX_TRUE; 318 } 319 else 320 { 321 CAMHAL_LOGVA("UnLocking WhiteBalance"); 322 } 323 if (mParameters3A.WhiteBalanceLock != lock) 324 { 325 mParameters3A.WhiteBalanceLock = lock; 326 CAMHAL_LOGDB("WhiteBalanceLock %d", lock); 327 mPending3Asettings |= SetWBLock; 328 } 329 } 330 331 str = params.get(TICameraParameters::KEY_AUTO_FOCUS_LOCK); 332 if (str && (strcmp(str, TRUE) == 0) && (mParameters3A.FocusLock != OMX_TRUE)) { 333 CAMHAL_LOGVA("Locking Focus"); 334 mParameters3A.FocusLock = OMX_TRUE; 335 setFocusLock(mParameters3A); 336 } else if (str && (strcmp(str, FALSE) == 0) && (mParameters3A.FocusLock != OMX_FALSE)) { 337 CAMHAL_LOGVA("UnLocking Focus"); 338 mParameters3A.FocusLock = OMX_FALSE; 339 setFocusLock(mParameters3A); 340 } 341 342 str = params.get(CameraParameters::KEY_METERING_AREAS); 343 if ( (str != NULL) ) { 344 size_t MAX_METERING_AREAS; 345 Vector< sp<CameraArea> > tempAreas; 346 347 MAX_METERING_AREAS = atoi(params.get(CameraParameters::KEY_MAX_NUM_METERING_AREAS)); 348 349 Mutex::Autolock lock(mMeteringAreasLock); 350 351 ret = CameraArea::parseAreas(str, ( strlen(str) + 1 ), tempAreas); 352 353 CAMHAL_LOGVB("areAreasDifferent? = %d", 354 CameraArea::areAreasDifferent(mMeteringAreas, tempAreas)); 355 356 if ( (NO_ERROR == ret) && CameraArea::areAreasDifferent(mMeteringAreas, tempAreas) ) { 357 mMeteringAreas.clear(); 358 mMeteringAreas = tempAreas; 359 360 if ( MAX_METERING_AREAS >= mMeteringAreas.size() ) { 361 CAMHAL_LOGDB("Setting Metering Areas %s", 362 params.get(CameraParameters::KEY_METERING_AREAS)); 363 364 mPending3Asettings |= SetMeteringAreas; 365 } else { 366 CAMHAL_LOGEB("Metering areas supported %d, metering areas set %d", 367 MAX_METERING_AREAS, mMeteringAreas.size()); 368 ret = -EINVAL; 369 } 370 } 371 } 372 373 LOG_FUNCTION_NAME_EXIT; 374 375 return ret; 376 } 377 378 int OMXCameraAdapter::getLUTvalue_HALtoOMX(const char * HalValue, LUTtype LUT) 379 { 380 int LUTsize = LUT.size; 381 if( HalValue ) 382 for(int i = 0; i < LUTsize; i++) 383 if( 0 == strcmp(LUT.Table[i].userDefinition, HalValue) ) 384 return LUT.Table[i].omxDefinition; 385 386 return -ENOENT; 387 } 388 389 const char* OMXCameraAdapter::getLUTvalue_OMXtoHAL(int OMXValue, LUTtype LUT) 390 { 391 int LUTsize = LUT.size; 392 for(int i = 0; i < LUTsize; i++) 393 if( LUT.Table[i].omxDefinition == OMXValue ) 394 return LUT.Table[i].userDefinition; 395 396 return NULL; 397 } 398 399 status_t OMXCameraAdapter::init3AParams(Gen3A_settings &Gen3A) 400 { 401 LOG_FUNCTION_NAME; 402 403 Gen3A.Effect = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_EFFECT, EffLUT); 404 Gen3A.FlashMode = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_FLASH_MODE, FlashLUT); 405 Gen3A.SceneMode = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_SCENE_MODE, SceneLUT); 406 Gen3A.EVCompensation = atoi(OMXCameraAdapter::DEFAULT_EV_COMPENSATION); 407 Gen3A.Focus = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_FOCUS_MODE, FocusLUT); 408 Gen3A.ISO = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_ISO_MODE, IsoLUT); 409 Gen3A.Flicker = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_ANTIBANDING, FlickerLUT); 410 Gen3A.Brightness = atoi(OMXCameraAdapter::DEFAULT_BRIGHTNESS); 411 Gen3A.Saturation = atoi(OMXCameraAdapter::DEFAULT_SATURATION) - SATURATION_OFFSET; 412 Gen3A.Sharpness = atoi(OMXCameraAdapter::DEFAULT_SHARPNESS) - SHARPNESS_OFFSET; 413 Gen3A.Contrast = atoi(OMXCameraAdapter::DEFAULT_CONTRAST) - CONTRAST_OFFSET; 414 Gen3A.WhiteBallance = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_WB, WBalLUT); 415 Gen3A.Exposure = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_EXPOSURE_MODE, ExpLUT); 416 Gen3A.ExposureLock = OMX_FALSE; 417 Gen3A.FocusLock = OMX_FALSE; 418 Gen3A.WhiteBalanceLock = OMX_FALSE; 419 420 LOG_FUNCTION_NAME_EXIT; 421 422 return NO_ERROR; 423 } 424 425 status_t OMXCameraAdapter::setExposureMode(Gen3A_settings& Gen3A) 426 { 427 OMX_ERRORTYPE eError = OMX_ErrorNone; 428 OMX_CONFIG_EXPOSURECONTROLTYPE exp; 429 430 LOG_FUNCTION_NAME; 431 432 if ( OMX_StateInvalid == mComponentState ) 433 { 434 CAMHAL_LOGEA("OMX component is in invalid state"); 435 return NO_INIT; 436 } 437 438 OMX_INIT_STRUCT_PTR (&exp, OMX_CONFIG_EXPOSURECONTROLTYPE); 439 exp.nPortIndex = OMX_ALL; 440 exp.eExposureControl = (OMX_EXPOSURECONTROLTYPE)Gen3A.Exposure; 441 442 eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 443 OMX_IndexConfigCommonExposure, 444 &exp); 445 if ( OMX_ErrorNone != eError ) 446 { 447 CAMHAL_LOGEB("Error while configuring exposure mode 0x%x", eError); 448 } 449 else 450 { 451 CAMHAL_LOGDA("Camera exposure mode configured successfully"); 452 } 453 454 LOG_FUNCTION_NAME_EXIT; 455 456 return ErrorUtils::omxToAndroidError(eError); 457 } 458 459 static bool isFlashDisabled() { 460 #if (PROPERTY_VALUE_MAX < 5) 461 #error "PROPERTY_VALUE_MAX must be at least 5" 462 #endif 463 464 // Ignore flash_off system property for user build. 465 char buildType[PROPERTY_VALUE_MAX]; 466 if (property_get("ro.build.type", buildType, NULL) && 467 !strcasecmp(buildType, "user")) { 468 return false; 469 } 470 471 char value[PROPERTY_VALUE_MAX]; 472 if (property_get("camera.flash_off", value, NULL) && 473 (!strcasecmp(value, "true") || !strcasecmp(value, "1"))) { 474 ALOGW("flash is disabled for testing purpose"); 475 return true; 476 } 477 478 return false; 479 } 480 481 status_t OMXCameraAdapter::setFlashMode(Gen3A_settings& Gen3A) 482 { 483 status_t ret = NO_ERROR; 484 OMX_ERRORTYPE eError = OMX_ErrorNone; 485 OMX_IMAGE_PARAM_FLASHCONTROLTYPE flash; 486 OMX_CONFIG_FOCUSASSISTTYPE focusAssist; 487 488 LOG_FUNCTION_NAME; 489 490 if ( OMX_StateInvalid == mComponentState ) 491 { 492 CAMHAL_LOGEA("OMX component is in invalid state"); 493 return NO_INIT; 494 } 495 496 OMX_INIT_STRUCT_PTR (&flash, OMX_IMAGE_PARAM_FLASHCONTROLTYPE); 497 flash.nPortIndex = OMX_ALL; 498 499 if (isFlashDisabled()) { 500 flash.eFlashControl = ( OMX_IMAGE_FLASHCONTROLTYPE ) OMX_IMAGE_FlashControlOff; 501 } else { 502 flash.eFlashControl = ( OMX_IMAGE_FLASHCONTROLTYPE ) Gen3A.FlashMode; 503 } 504 505 CAMHAL_LOGDB("Configuring flash mode 0x%x", flash.eFlashControl); 506 eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 507 (OMX_INDEXTYPE) OMX_IndexConfigFlashControl, 508 &flash); 509 if ( OMX_ErrorNone != eError ) 510 { 511 CAMHAL_LOGEB("Error while configuring flash mode 0x%x", eError); 512 } 513 else 514 { 515 CAMHAL_LOGDA("Camera flash mode configured successfully"); 516 } 517 518 if ( OMX_ErrorNone == eError ) 519 { 520 OMX_INIT_STRUCT_PTR (&focusAssist, OMX_CONFIG_FOCUSASSISTTYPE); 521 focusAssist.nPortIndex = OMX_ALL; 522 if ( flash.eFlashControl == OMX_IMAGE_FlashControlOff ) 523 { 524 focusAssist.bFocusAssist = OMX_FALSE; 525 } 526 else 527 { 528 focusAssist.bFocusAssist = OMX_TRUE; 529 } 530 531 CAMHAL_LOGDB("Configuring AF Assist mode 0x%x", focusAssist.bFocusAssist); 532 eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 533 (OMX_INDEXTYPE) OMX_IndexConfigFocusAssist, 534 &focusAssist); 535 if ( OMX_ErrorNone != eError ) 536 { 537 CAMHAL_LOGEB("Error while configuring AF Assist mode 0x%x", eError); 538 } 539 else 540 { 541 CAMHAL_LOGDA("Camera AF Assist mode configured successfully"); 542 } 543 } 544 545 LOG_FUNCTION_NAME_EXIT; 546 547 return ErrorUtils::omxToAndroidError(eError); 548 } 549 550 status_t OMXCameraAdapter::getFlashMode(Gen3A_settings& Gen3A) 551 { 552 status_t ret = NO_ERROR; 553 OMX_ERRORTYPE eError = OMX_ErrorNone; 554 OMX_IMAGE_PARAM_FLASHCONTROLTYPE flash; 555 556 LOG_FUNCTION_NAME; 557 558 if ( OMX_StateInvalid == mComponentState ) { 559 CAMHAL_LOGEA("OMX component is in invalid state"); 560 return NO_INIT; 561 } 562 563 OMX_INIT_STRUCT_PTR (&flash, OMX_IMAGE_PARAM_FLASHCONTROLTYPE); 564 flash.nPortIndex = OMX_ALL; 565 566 eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 567 (OMX_INDEXTYPE) OMX_IndexConfigFlashControl, 568 &flash); 569 570 if ( OMX_ErrorNone != eError ) { 571 CAMHAL_LOGEB("Error while getting flash mode 0x%x", eError); 572 } else { 573 Gen3A.FlashMode = flash.eFlashControl; 574 CAMHAL_LOGDB("Gen3A.FlashMode 0x%x", Gen3A.FlashMode); 575 } 576 577 LOG_FUNCTION_NAME_EXIT; 578 579 return ErrorUtils::omxToAndroidError(eError); 580 } 581 582 status_t OMXCameraAdapter::setFocusMode(Gen3A_settings& Gen3A) 583 { 584 status_t ret = NO_ERROR; 585 OMX_ERRORTYPE eError = OMX_ErrorNone; 586 OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focus; 587 size_t top, left, width, height, weight; 588 OMX_CONFIG_BOOLEANTYPE bOMX; 589 590 LOG_FUNCTION_NAME; 591 592 BaseCameraAdapter::AdapterState state; 593 BaseCameraAdapter::getState(state); 594 595 if ( OMX_StateInvalid == mComponentState ) 596 { 597 CAMHAL_LOGEA("OMX component is in invalid state"); 598 return NO_INIT; 599 } 600 601 602 ///Face detection takes precedence over touch AF 603 if ( mFaceDetectionRunning ) 604 { 605 //Disable region priority first 606 setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, false); 607 608 //Enable face algorithm priority for focus 609 setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO , true); 610 611 //Do normal focus afterwards 612 ////FIXME: Check if the extended focus control is needed? this overrides caf 613 //focusControl.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) OMX_IMAGE_FocusControlExtended; 614 } 615 else if ( (!mFocusAreas.isEmpty()) && (!mFocusAreas.itemAt(0)->isZeroArea()) ) 616 { 617 618 //Disable face priority first 619 setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO, false); 620 621 //Enable region algorithm priority 622 setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, true); 623 624 625 //Do normal focus afterwards 626 //FIXME: Check if the extended focus control is needed? this overrides caf 627 //focus.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) OMX_IMAGE_FocusControlExtended; 628 629 } 630 else 631 { 632 633 //Disable both region and face priority 634 setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, false); 635 636 setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO, false); 637 638 } 639 640 if ( NO_ERROR == ret && ((state & AF_ACTIVE) == 0) ) 641 { 642 OMX_INIT_STRUCT_PTR (&bOMX, OMX_CONFIG_BOOLEANTYPE); 643 644 if ( Gen3A.Focus == OMX_IMAGE_FocusControlAutoInfinity) 645 { 646 // Don't lock at infinity, otherwise the AF cannot drive 647 // the lens at infinity position 648 if( set3ALock(mUserSetExpLock, mUserSetWbLock, OMX_FALSE) != NO_ERROR) 649 { 650 CAMHAL_LOGEA("Error Applying 3A locks"); 651 } else { 652 CAMHAL_LOGDA("Focus locked. Applied focus locks successfully"); 653 } 654 } 655 if ( Gen3A.Focus == OMX_IMAGE_FocusControlAuto || 656 Gen3A.Focus == OMX_IMAGE_FocusControlAutoInfinity) 657 { 658 // Run focus scanning if switching to continuous infinity focus mode 659 bOMX.bEnabled = OMX_TRUE; 660 } 661 else 662 { 663 bOMX.bEnabled = OMX_FALSE; 664 } 665 666 eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 667 (OMX_INDEXTYPE)OMX_TI_IndexConfigAutofocusEnable, 668 &bOMX); 669 670 OMX_INIT_STRUCT_PTR (&focus, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); 671 focus.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 672 focus.eFocusControl = (OMX_IMAGE_FOCUSCONTROLTYPE)Gen3A.Focus; 673 674 CAMHAL_LOGDB("Configuring focus mode 0x%x", focus.eFocusControl); 675 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, OMX_IndexConfigFocusControl, &focus); 676 if ( OMX_ErrorNone != eError ) 677 { 678 CAMHAL_LOGEB("Error while configuring focus mode 0x%x", eError); 679 } 680 else 681 { 682 CAMHAL_LOGDA("Camera focus mode configured successfully"); 683 } 684 } 685 686 LOG_FUNCTION_NAME_EXIT; 687 688 return ErrorUtils::omxToAndroidError(eError); 689 } 690 691 status_t OMXCameraAdapter::getFocusMode(Gen3A_settings& Gen3A) 692 { 693 status_t ret = NO_ERROR; 694 OMX_ERRORTYPE eError = OMX_ErrorNone; 695 OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focus; 696 size_t top, left, width, height, weight; 697 698 LOG_FUNCTION_NAME; 699 700 if (OMX_StateInvalid == mComponentState) { 701 CAMHAL_LOGEA("OMX component is in invalid state"); 702 return NO_INIT; 703 } 704 705 OMX_INIT_STRUCT_PTR (&focus, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); 706 focus.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 707 eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 708 OMX_IndexConfigFocusControl, &focus); 709 710 if (OMX_ErrorNone != eError) { 711 CAMHAL_LOGEB("Error while configuring focus mode 0x%x", eError); 712 } else { 713 Gen3A.Focus = focus.eFocusControl; 714 CAMHAL_LOGDB("Gen3A.Focus 0x%x", Gen3A.Focus); 715 } 716 717 LOG_FUNCTION_NAME_EXIT; 718 719 return ErrorUtils::omxToAndroidError(eError); 720 } 721 722 status_t OMXCameraAdapter::setScene(Gen3A_settings& Gen3A) 723 { 724 OMX_ERRORTYPE eError = OMX_ErrorNone; 725 OMX_CONFIG_SCENEMODETYPE scene; 726 727 LOG_FUNCTION_NAME; 728 729 if ( OMX_StateInvalid == mComponentState ) 730 { 731 CAMHAL_LOGEA("OMX component is in invalid state"); 732 return NO_INIT; 733 } 734 735 OMX_INIT_STRUCT_PTR (&scene, OMX_CONFIG_SCENEMODETYPE); 736 scene.nPortIndex = OMX_ALL; 737 scene.eSceneMode = ( OMX_SCENEMODETYPE ) Gen3A.SceneMode; 738 739 CAMHAL_LOGDB("Configuring scene mode 0x%x", scene.eSceneMode); 740 eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 741 ( OMX_INDEXTYPE ) OMX_TI_IndexConfigSceneMode, 742 &scene); 743 744 if (OMX_ErrorNone != eError) { 745 CAMHAL_LOGEB("Error while configuring scene mode 0x%x", eError); 746 } else { 747 CAMHAL_LOGDA("Camera scene configured successfully"); 748 if (Gen3A.SceneMode != OMX_Manual) { 749 // Get preset scene mode feedback 750 getFocusMode(Gen3A); 751 getFlashMode(Gen3A); 752 getWBMode(Gen3A); 753 754 // TODO(XXX): Re-enable these for mainline 755 // getSharpness(Gen3A); 756 // getSaturation(Gen3A); 757 // getISO(Gen3A); 758 } 759 } 760 761 LOG_FUNCTION_NAME_EXIT; 762 763 return ErrorUtils::omxToAndroidError(eError); 764 } 765 766 status_t OMXCameraAdapter::setEVCompensation(Gen3A_settings& Gen3A) 767 { 768 OMX_ERRORTYPE eError = OMX_ErrorNone; 769 OMX_CONFIG_EXPOSUREVALUETYPE expValues; 770 771 LOG_FUNCTION_NAME; 772 773 if ( OMX_StateInvalid == mComponentState ) 774 { 775 CAMHAL_LOGEA("OMX component is in invalid state"); 776 return NO_INIT; 777 } 778 779 OMX_INIT_STRUCT_PTR (&expValues, OMX_CONFIG_EXPOSUREVALUETYPE); 780 expValues.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 781 782 OMX_GetConfig( mCameraAdapterParameters.mHandleComp, 783 OMX_IndexConfigCommonExposureValue, 784 &expValues); 785 CAMHAL_LOGDB("old EV Compensation for OMX = 0x%x", (int)expValues.xEVCompensation); 786 CAMHAL_LOGDB("EV Compensation for HAL = %d", Gen3A.EVCompensation); 787 788 expValues.xEVCompensation = ( Gen3A.EVCompensation * ( 1 << Q16_OFFSET ) ) / 10; 789 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 790 OMX_IndexConfigCommonExposureValue, 791 &expValues); 792 CAMHAL_LOGDB("new EV Compensation for OMX = 0x%x", (int)expValues.xEVCompensation); 793 if ( OMX_ErrorNone != eError ) 794 { 795 CAMHAL_LOGEB("Error while configuring EV Compensation 0x%x error = 0x%x", 796 ( unsigned int ) expValues.xEVCompensation, 797 eError); 798 } 799 else 800 { 801 CAMHAL_LOGDB("EV Compensation 0x%x configured successfully", 802 ( unsigned int ) expValues.xEVCompensation); 803 } 804 805 LOG_FUNCTION_NAME_EXIT; 806 807 return ErrorUtils::omxToAndroidError(eError); 808 } 809 810 status_t OMXCameraAdapter::getEVCompensation(Gen3A_settings& Gen3A) 811 { 812 OMX_ERRORTYPE eError = OMX_ErrorNone; 813 OMX_CONFIG_EXPOSUREVALUETYPE expValues; 814 815 LOG_FUNCTION_NAME; 816 817 if ( OMX_StateInvalid == mComponentState ) { 818 CAMHAL_LOGEA("OMX component is in invalid state"); 819 return NO_INIT; 820 } 821 822 OMX_INIT_STRUCT_PTR (&expValues, OMX_CONFIG_EXPOSUREVALUETYPE); 823 expValues.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 824 825 OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 826 OMX_IndexConfigCommonExposureValue, 827 &expValues); 828 829 if ( OMX_ErrorNone != eError ) { 830 CAMHAL_LOGEB("Error while getting EV Compensation error = 0x%x", eError); 831 } else { 832 Gen3A.EVCompensation = (10 * expValues.xEVCompensation) / (1 << Q16_OFFSET); 833 CAMHAL_LOGDB("Gen3A.EVCompensation 0x%x", Gen3A.EVCompensation); 834 } 835 836 LOG_FUNCTION_NAME_EXIT; 837 838 return ErrorUtils::omxToAndroidError(eError); 839 } 840 841 status_t OMXCameraAdapter::setWBMode(Gen3A_settings& Gen3A) 842 { 843 OMX_ERRORTYPE eError = OMX_ErrorNone; 844 OMX_CONFIG_WHITEBALCONTROLTYPE wb; 845 846 LOG_FUNCTION_NAME; 847 848 if ( OMX_StateInvalid == mComponentState ) 849 { 850 CAMHAL_LOGEA("OMX component is in invalid state"); 851 return NO_INIT; 852 } 853 854 OMX_INIT_STRUCT_PTR (&wb, OMX_CONFIG_WHITEBALCONTROLTYPE); 855 wb.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 856 wb.eWhiteBalControl = ( OMX_WHITEBALCONTROLTYPE ) Gen3A.WhiteBallance; 857 858 if ( WB_FACE_PRIORITY == Gen3A.WhiteBallance ) 859 { 860 //Disable Region priority and enable Face priority 861 setAlgoPriority(REGION_PRIORITY, WHITE_BALANCE_ALGO, false); 862 setAlgoPriority(FACE_PRIORITY, WHITE_BALANCE_ALGO, true); 863 864 //Then set the mode to auto 865 wb.eWhiteBalControl = OMX_WhiteBalControlAuto; 866 } 867 else 868 { 869 //Disable Face and Region priority 870 setAlgoPriority(FACE_PRIORITY, WHITE_BALANCE_ALGO, false); 871 setAlgoPriority(REGION_PRIORITY, WHITE_BALANCE_ALGO, false); 872 } 873 874 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 875 OMX_IndexConfigCommonWhiteBalance, 876 &wb); 877 if ( OMX_ErrorNone != eError ) 878 { 879 CAMHAL_LOGEB("Error while configuring Whitebalance mode 0x%x error = 0x%x", 880 ( unsigned int ) wb.eWhiteBalControl, 881 eError); 882 } 883 else 884 { 885 CAMHAL_LOGDB("Whitebalance mode 0x%x configured successfully", 886 ( unsigned int ) wb.eWhiteBalControl); 887 } 888 889 LOG_FUNCTION_NAME_EXIT; 890 891 return eError; 892 } 893 894 status_t OMXCameraAdapter::getWBMode(Gen3A_settings& Gen3A) 895 { 896 OMX_ERRORTYPE eError = OMX_ErrorNone; 897 OMX_CONFIG_WHITEBALCONTROLTYPE wb; 898 899 LOG_FUNCTION_NAME; 900 901 if ( OMX_StateInvalid == mComponentState ) { 902 CAMHAL_LOGEA("OMX component is in invalid state"); 903 return NO_INIT; 904 } 905 906 OMX_INIT_STRUCT_PTR (&wb, OMX_CONFIG_WHITEBALCONTROLTYPE); 907 wb.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 908 909 eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 910 OMX_IndexConfigCommonWhiteBalance, 911 &wb); 912 913 if (OMX_ErrorNone != eError) { 914 CAMHAL_LOGEB("Error while getting Whitebalance mode error = 0x%x", eError); 915 } else { 916 Gen3A.WhiteBallance = wb.eWhiteBalControl; 917 CAMHAL_LOGDB("Gen3A.WhiteBallance 0x%x", Gen3A.WhiteBallance); 918 } 919 920 LOG_FUNCTION_NAME_EXIT; 921 922 return eError; 923 } 924 925 status_t OMXCameraAdapter::setFlicker(Gen3A_settings& Gen3A) 926 { 927 OMX_ERRORTYPE eError = OMX_ErrorNone; 928 OMX_CONFIG_FLICKERCANCELTYPE flicker; 929 930 LOG_FUNCTION_NAME; 931 932 if ( OMX_StateInvalid == mComponentState ) 933 { 934 CAMHAL_LOGEA("OMX component is in invalid state"); 935 return NO_INIT; 936 } 937 938 OMX_INIT_STRUCT_PTR (&flicker, OMX_CONFIG_FLICKERCANCELTYPE); 939 flicker.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 940 flicker.eFlickerCancel = (OMX_COMMONFLICKERCANCELTYPE)Gen3A.Flicker; 941 942 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 943 (OMX_INDEXTYPE)OMX_IndexConfigFlickerCancel, 944 &flicker ); 945 if ( OMX_ErrorNone != eError ) 946 { 947 CAMHAL_LOGEB("Error while configuring Flicker mode 0x%x error = 0x%x", 948 ( unsigned int ) flicker.eFlickerCancel, 949 eError); 950 } 951 else 952 { 953 CAMHAL_LOGDB("Flicker mode 0x%x configured successfully", 954 ( unsigned int ) flicker.eFlickerCancel); 955 } 956 957 LOG_FUNCTION_NAME_EXIT; 958 959 return ErrorUtils::omxToAndroidError(eError); 960 } 961 962 status_t OMXCameraAdapter::setBrightness(Gen3A_settings& Gen3A) 963 { 964 OMX_ERRORTYPE eError = OMX_ErrorNone; 965 OMX_CONFIG_BRIGHTNESSTYPE brightness; 966 967 LOG_FUNCTION_NAME; 968 969 if ( OMX_StateInvalid == mComponentState ) 970 { 971 CAMHAL_LOGEA("OMX component is in invalid state"); 972 return NO_INIT; 973 } 974 975 OMX_INIT_STRUCT_PTR (&brightness, OMX_CONFIG_BRIGHTNESSTYPE); 976 brightness.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 977 brightness.nBrightness = Gen3A.Brightness; 978 979 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 980 OMX_IndexConfigCommonBrightness, 981 &brightness); 982 if ( OMX_ErrorNone != eError ) 983 { 984 CAMHAL_LOGEB("Error while configuring Brightness 0x%x error = 0x%x", 985 ( unsigned int ) brightness.nBrightness, 986 eError); 987 } 988 else 989 { 990 CAMHAL_LOGDB("Brightness 0x%x configured successfully", 991 ( unsigned int ) brightness.nBrightness); 992 } 993 994 LOG_FUNCTION_NAME_EXIT; 995 996 return ErrorUtils::omxToAndroidError(eError); 997 } 998 999 status_t OMXCameraAdapter::setContrast(Gen3A_settings& Gen3A) 1000 { 1001 OMX_ERRORTYPE eError = OMX_ErrorNone; 1002 OMX_CONFIG_CONTRASTTYPE contrast; 1003 1004 LOG_FUNCTION_NAME; 1005 1006 if ( OMX_StateInvalid == mComponentState ) 1007 { 1008 CAMHAL_LOGEA("OMX component is in invalid state"); 1009 return NO_INIT; 1010 } 1011 1012 OMX_INIT_STRUCT_PTR (&contrast, OMX_CONFIG_CONTRASTTYPE); 1013 contrast.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1014 contrast.nContrast = Gen3A.Contrast; 1015 1016 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 1017 OMX_IndexConfigCommonContrast, 1018 &contrast); 1019 if ( OMX_ErrorNone != eError ) 1020 { 1021 CAMHAL_LOGEB("Error while configuring Contrast 0x%x error = 0x%x", 1022 ( unsigned int ) contrast.nContrast, 1023 eError); 1024 } 1025 else 1026 { 1027 CAMHAL_LOGDB("Contrast 0x%x configured successfully", 1028 ( unsigned int ) contrast.nContrast); 1029 } 1030 1031 LOG_FUNCTION_NAME_EXIT; 1032 1033 return eError; 1034 } 1035 1036 status_t OMXCameraAdapter::setSharpness(Gen3A_settings& Gen3A) 1037 { 1038 OMX_ERRORTYPE eError = OMX_ErrorNone; 1039 OMX_IMAGE_CONFIG_PROCESSINGLEVELTYPE procSharpness; 1040 1041 LOG_FUNCTION_NAME; 1042 1043 if ( OMX_StateInvalid == mComponentState ) 1044 { 1045 CAMHAL_LOGEA("OMX component is in invalid state"); 1046 return NO_INIT; 1047 } 1048 1049 OMX_INIT_STRUCT_PTR (&procSharpness, OMX_IMAGE_CONFIG_PROCESSINGLEVELTYPE); 1050 procSharpness.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1051 procSharpness.nLevel = Gen3A.Sharpness; 1052 1053 if( procSharpness.nLevel == 0 ) 1054 { 1055 procSharpness.bAuto = OMX_TRUE; 1056 } 1057 else 1058 { 1059 procSharpness.bAuto = OMX_FALSE; 1060 } 1061 1062 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 1063 (OMX_INDEXTYPE)OMX_IndexConfigSharpeningLevel, 1064 &procSharpness); 1065 if ( OMX_ErrorNone != eError ) 1066 { 1067 CAMHAL_LOGEB("Error while configuring Sharpness 0x%x error = 0x%x", 1068 ( unsigned int ) procSharpness.nLevel, 1069 eError); 1070 } 1071 else 1072 { 1073 CAMHAL_LOGDB("Sharpness 0x%x configured successfully", 1074 ( unsigned int ) procSharpness.nLevel); 1075 } 1076 1077 LOG_FUNCTION_NAME_EXIT; 1078 1079 return ErrorUtils::omxToAndroidError(eError); 1080 } 1081 1082 status_t OMXCameraAdapter::getSharpness(Gen3A_settings& Gen3A) 1083 { 1084 OMX_ERRORTYPE eError = OMX_ErrorNone; 1085 OMX_IMAGE_CONFIG_PROCESSINGLEVELTYPE procSharpness; 1086 1087 LOG_FUNCTION_NAME; 1088 1089 if (OMX_StateInvalid == mComponentState) { 1090 CAMHAL_LOGEA("OMX component is in invalid state"); 1091 return NO_INIT; 1092 } 1093 1094 OMX_INIT_STRUCT_PTR (&procSharpness, OMX_IMAGE_CONFIG_PROCESSINGLEVELTYPE); 1095 procSharpness.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1096 1097 eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 1098 (OMX_INDEXTYPE)OMX_IndexConfigSharpeningLevel, 1099 &procSharpness); 1100 1101 if (OMX_ErrorNone != eError) { 1102 CAMHAL_LOGEB("Error while configuring Sharpness error = 0x%x", eError); 1103 } else { 1104 Gen3A.Sharpness = procSharpness.nLevel; 1105 CAMHAL_LOGDB("Gen3A.Sharpness 0x%x", Gen3A.Sharpness); 1106 } 1107 1108 LOG_FUNCTION_NAME_EXIT; 1109 1110 return ErrorUtils::omxToAndroidError(eError); 1111 } 1112 1113 status_t OMXCameraAdapter::setSaturation(Gen3A_settings& Gen3A) 1114 { 1115 OMX_ERRORTYPE eError = OMX_ErrorNone; 1116 OMX_CONFIG_SATURATIONTYPE saturation; 1117 1118 LOG_FUNCTION_NAME; 1119 1120 if ( OMX_StateInvalid == mComponentState ) 1121 { 1122 CAMHAL_LOGEA("OMX component is in invalid state"); 1123 return NO_INIT; 1124 } 1125 1126 OMX_INIT_STRUCT_PTR (&saturation, OMX_CONFIG_SATURATIONTYPE); 1127 saturation.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1128 saturation.nSaturation = Gen3A.Saturation; 1129 1130 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 1131 OMX_IndexConfigCommonSaturation, 1132 &saturation); 1133 if ( OMX_ErrorNone != eError ) 1134 { 1135 CAMHAL_LOGEB("Error while configuring Saturation 0x%x error = 0x%x", 1136 ( unsigned int ) saturation.nSaturation, 1137 eError); 1138 } 1139 else 1140 { 1141 CAMHAL_LOGDB("Saturation 0x%x configured successfully", 1142 ( unsigned int ) saturation.nSaturation); 1143 } 1144 1145 LOG_FUNCTION_NAME_EXIT; 1146 1147 return ErrorUtils::omxToAndroidError(eError); 1148 } 1149 1150 status_t OMXCameraAdapter::getSaturation(Gen3A_settings& Gen3A) 1151 { 1152 OMX_ERRORTYPE eError = OMX_ErrorNone; 1153 OMX_CONFIG_SATURATIONTYPE saturation; 1154 1155 LOG_FUNCTION_NAME; 1156 1157 if (OMX_StateInvalid == mComponentState) { 1158 CAMHAL_LOGEA("OMX component is in invalid state"); 1159 return NO_INIT; 1160 } 1161 1162 OMX_INIT_STRUCT_PTR (&saturation, OMX_CONFIG_SATURATIONTYPE); 1163 saturation.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1164 1165 eError = OMX_GetConfig( mCameraAdapterParameters.mHandleComp, 1166 OMX_IndexConfigCommonSaturation, 1167 &saturation); 1168 1169 if (OMX_ErrorNone != eError) { 1170 CAMHAL_LOGEB("Error while getting Saturation error = 0x%x", eError); 1171 } else { 1172 Gen3A.Saturation = saturation.nSaturation; 1173 CAMHAL_LOGDB("Gen3A.Saturation 0x%x", Gen3A.Saturation); 1174 } 1175 1176 LOG_FUNCTION_NAME_EXIT; 1177 1178 return ErrorUtils::omxToAndroidError(eError); 1179 } 1180 1181 status_t OMXCameraAdapter::setISO(Gen3A_settings& Gen3A) 1182 { 1183 OMX_ERRORTYPE eError = OMX_ErrorNone; 1184 OMX_CONFIG_EXPOSUREVALUETYPE expValues; 1185 1186 LOG_FUNCTION_NAME; 1187 1188 if ( OMX_StateInvalid == mComponentState ) 1189 { 1190 CAMHAL_LOGEA("OMX component is in invalid state"); 1191 return NO_INIT; 1192 } 1193 1194 OMX_INIT_STRUCT_PTR (&expValues, OMX_CONFIG_EXPOSUREVALUETYPE); 1195 expValues.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1196 1197 OMX_GetConfig( mCameraAdapterParameters.mHandleComp, 1198 OMX_IndexConfigCommonExposureValue, 1199 &expValues); 1200 1201 if( 0 == Gen3A.ISO ) 1202 { 1203 expValues.bAutoSensitivity = OMX_TRUE; 1204 } 1205 else 1206 { 1207 expValues.bAutoSensitivity = OMX_FALSE; 1208 expValues.nSensitivity = Gen3A.ISO; 1209 } 1210 1211 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 1212 OMX_IndexConfigCommonExposureValue, 1213 &expValues); 1214 if ( OMX_ErrorNone != eError ) 1215 { 1216 CAMHAL_LOGEB("Error while configuring ISO 0x%x error = 0x%x", 1217 ( unsigned int ) expValues.nSensitivity, 1218 eError); 1219 } 1220 else 1221 { 1222 CAMHAL_LOGDB("ISO 0x%x configured successfully", 1223 ( unsigned int ) expValues.nSensitivity); 1224 } 1225 1226 LOG_FUNCTION_NAME_EXIT; 1227 1228 return ErrorUtils::omxToAndroidError(eError); 1229 } 1230 1231 status_t OMXCameraAdapter::getISO(Gen3A_settings& Gen3A) 1232 { 1233 OMX_ERRORTYPE eError = OMX_ErrorNone; 1234 OMX_CONFIG_EXPOSUREVALUETYPE expValues; 1235 1236 LOG_FUNCTION_NAME; 1237 1238 if (OMX_StateInvalid == mComponentState) { 1239 CAMHAL_LOGEA("OMX component is in invalid state"); 1240 return NO_INIT; 1241 } 1242 1243 OMX_INIT_STRUCT_PTR (&expValues, OMX_CONFIG_EXPOSUREVALUETYPE); 1244 expValues.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1245 1246 OMX_GetConfig( mCameraAdapterParameters.mHandleComp, 1247 OMX_IndexConfigCommonExposureValue, 1248 &expValues); 1249 1250 if (OMX_ErrorNone != eError) { 1251 CAMHAL_LOGEB("Error while getting ISO error = 0x%x", eError); 1252 } else { 1253 Gen3A.ISO = expValues.nSensitivity; 1254 CAMHAL_LOGDB("Gen3A.ISO %d", Gen3A.ISO); 1255 } 1256 1257 LOG_FUNCTION_NAME_EXIT; 1258 1259 return ErrorUtils::omxToAndroidError(eError); 1260 } 1261 1262 status_t OMXCameraAdapter::setEffect(Gen3A_settings& Gen3A) 1263 { 1264 OMX_ERRORTYPE eError = OMX_ErrorNone; 1265 OMX_CONFIG_IMAGEFILTERTYPE effect; 1266 1267 LOG_FUNCTION_NAME; 1268 1269 if ( OMX_StateInvalid == mComponentState ) 1270 { 1271 CAMHAL_LOGEA("OMX component is in invalid state"); 1272 return NO_INIT; 1273 } 1274 1275 OMX_INIT_STRUCT_PTR (&effect, OMX_CONFIG_IMAGEFILTERTYPE); 1276 effect.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1277 effect.eImageFilter = (OMX_IMAGEFILTERTYPE ) Gen3A.Effect; 1278 1279 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 1280 OMX_IndexConfigCommonImageFilter, 1281 &effect); 1282 if ( OMX_ErrorNone != eError ) 1283 { 1284 CAMHAL_LOGEB("Error while configuring Effect 0x%x error = 0x%x", 1285 ( unsigned int ) effect.eImageFilter, 1286 eError); 1287 } 1288 else 1289 { 1290 CAMHAL_LOGDB("Effect 0x%x configured successfully", 1291 ( unsigned int ) effect.eImageFilter); 1292 } 1293 1294 LOG_FUNCTION_NAME_EXIT; 1295 1296 return ErrorUtils::omxToAndroidError(eError); 1297 } 1298 1299 status_t OMXCameraAdapter::setWhiteBalanceLock(Gen3A_settings& Gen3A) 1300 { 1301 OMX_ERRORTYPE eError = OMX_ErrorNone; 1302 OMX_IMAGE_CONFIG_LOCKTYPE lock; 1303 1304 LOG_FUNCTION_NAME 1305 1306 if ( OMX_StateInvalid == mComponentState ) 1307 { 1308 CAMHAL_LOGEA("OMX component is in invalid state"); 1309 return NO_INIT; 1310 } 1311 1312 OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE); 1313 lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1314 lock.bLock = Gen3A.WhiteBalanceLock; 1315 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 1316 (OMX_INDEXTYPE)OMX_IndexConfigImageWhiteBalanceLock, 1317 &lock); 1318 if ( OMX_ErrorNone != eError ) 1319 { 1320 CAMHAL_LOGEB("Error while configuring WhiteBalance Lock error = 0x%x", eError); 1321 } 1322 else 1323 { 1324 CAMHAL_LOGDB("WhiteBalance Lock configured successfully %d ", lock.bLock); 1325 } 1326 LOG_FUNCTION_NAME_EXIT 1327 1328 return ErrorUtils::omxToAndroidError(eError); 1329 } 1330 1331 status_t OMXCameraAdapter::setExposureLock(Gen3A_settings& Gen3A) 1332 { 1333 OMX_ERRORTYPE eError = OMX_ErrorNone; 1334 OMX_IMAGE_CONFIG_LOCKTYPE lock; 1335 1336 LOG_FUNCTION_NAME 1337 1338 if ( OMX_StateInvalid == mComponentState ) 1339 { 1340 CAMHAL_LOGEA("OMX component is in invalid state"); 1341 return NO_INIT; 1342 } 1343 1344 OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE); 1345 lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1346 lock.bLock = Gen3A.ExposureLock; 1347 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 1348 (OMX_INDEXTYPE)OMX_IndexConfigImageExposureLock, 1349 &lock); 1350 if ( OMX_ErrorNone != eError ) 1351 { 1352 CAMHAL_LOGEB("Error while configuring Exposure Lock error = 0x%x", eError); 1353 } 1354 else 1355 { 1356 CAMHAL_LOGDB("Exposure Lock configured successfully %d ", lock.bLock); 1357 } 1358 LOG_FUNCTION_NAME_EXIT 1359 1360 return ErrorUtils::omxToAndroidError(eError); 1361 } 1362 1363 status_t OMXCameraAdapter::setFocusLock(Gen3A_settings& Gen3A) 1364 { 1365 OMX_ERRORTYPE eError = OMX_ErrorNone; 1366 OMX_IMAGE_CONFIG_LOCKTYPE lock; 1367 1368 LOG_FUNCTION_NAME 1369 1370 if ( OMX_StateInvalid == mComponentState ) { 1371 CAMHAL_LOGEA("OMX component is in invalid state"); 1372 return NO_INIT; 1373 } 1374 1375 OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE); 1376 lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1377 1378 lock.bLock = Gen3A.FocusLock; 1379 eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 1380 (OMX_INDEXTYPE)OMX_IndexConfigImageFocusLock, 1381 &lock); 1382 1383 if ( OMX_ErrorNone != eError ) { 1384 CAMHAL_LOGEB("Error while configuring Focus Lock error = 0x%x", eError); 1385 } else { 1386 CAMHAL_LOGDB("Focus Lock configured successfully %d ", lock.bLock); 1387 } 1388 1389 LOG_FUNCTION_NAME_EXIT 1390 1391 return ErrorUtils::omxToAndroidError(eError); 1392 } 1393 1394 status_t OMXCameraAdapter::set3ALock(OMX_BOOL toggleExp, OMX_BOOL toggleWb, OMX_BOOL toggleFocus) 1395 { 1396 OMX_ERRORTYPE eError = OMX_ErrorNone; 1397 OMX_IMAGE_CONFIG_LOCKTYPE lock; 1398 1399 LOG_FUNCTION_NAME 1400 1401 if ( OMX_StateInvalid == mComponentState ) 1402 { 1403 CAMHAL_LOGEA("OMX component is in invalid state"); 1404 return NO_INIT; 1405 } 1406 1407 OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE); 1408 lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1409 1410 mParameters3A.ExposureLock = toggleExp; 1411 mParameters3A.FocusLock = toggleFocus; 1412 mParameters3A.WhiteBalanceLock = toggleWb; 1413 1414 eError = OMX_GetConfig( mCameraAdapterParameters.mHandleComp, 1415 (OMX_INDEXTYPE)OMX_IndexConfigImageExposureLock, 1416 &lock); 1417 1418 if ( OMX_ErrorNone != eError ) 1419 { 1420 CAMHAL_LOGEB("Error GetConfig Exposure Lock error = 0x%x", eError); 1421 goto EXIT; 1422 } 1423 else 1424 { 1425 const char *lock_state_exp = toggleExp ? TRUE : FALSE; 1426 CAMHAL_LOGDA("Exposure Lock GetConfig successfull"); 1427 1428 /* Apply locks only when not applied already */ 1429 if ( lock.bLock != toggleExp ) 1430 { 1431 setExposureLock(mParameters3A); 1432 } 1433 1434 mParams.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, lock_state_exp); 1435 } 1436 1437 OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE); 1438 lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1439 eError = OMX_GetConfig( mCameraAdapterParameters.mHandleComp, 1440 (OMX_INDEXTYPE)OMX_IndexConfigImageFocusLock, 1441 &lock); 1442 1443 if ( OMX_ErrorNone != eError ) 1444 { 1445 CAMHAL_LOGEB("Error GetConfig Focus Lock error = 0x%x", eError); 1446 goto EXIT; 1447 } 1448 else 1449 { 1450 CAMHAL_LOGDB("Focus Lock GetConfig successfull bLock(%d)", lock.bLock); 1451 1452 /* Apply locks only when not applied already */ 1453 if ( lock.bLock != toggleFocus ) 1454 { 1455 setFocusLock(mParameters3A); 1456 } 1457 } 1458 1459 OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE); 1460 lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1461 eError = OMX_GetConfig( mCameraAdapterParameters.mHandleComp, 1462 (OMX_INDEXTYPE)OMX_IndexConfigImageWhiteBalanceLock, 1463 &lock); 1464 1465 if ( OMX_ErrorNone != eError ) 1466 { 1467 CAMHAL_LOGEB("Error GetConfig WhiteBalance Lock error = 0x%x", eError); 1468 goto EXIT; 1469 } 1470 else 1471 { 1472 const char *lock_state_wb = toggleWb ? TRUE : FALSE; 1473 CAMHAL_LOGDA("WhiteBalance Lock GetConfig successfull"); 1474 1475 /* Apply locks only when not applied already */ 1476 if ( lock.bLock != toggleWb ) 1477 { 1478 setWhiteBalanceLock(mParameters3A); 1479 } 1480 1481 mParams.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, lock_state_wb); 1482 } 1483 EXIT: 1484 return ErrorUtils::omxToAndroidError(eError); 1485 } 1486 1487 status_t OMXCameraAdapter::setMeteringAreas(Gen3A_settings& Gen3A) 1488 { 1489 status_t ret = NO_ERROR; 1490 OMX_ERRORTYPE eError = OMX_ErrorNone; 1491 1492 OMX_ALGOAREASTYPE **meteringAreas; 1493 OMX_TI_CONFIG_SHAREDBUFFER sharedBuffer; 1494 MemoryManager memMgr; 1495 int areasSize = 0; 1496 1497 LOG_FUNCTION_NAME 1498 1499 Mutex::Autolock lock(mMeteringAreasLock); 1500 1501 if ( OMX_StateInvalid == mComponentState ) 1502 { 1503 CAMHAL_LOGEA("OMX component is in invalid state"); 1504 return NO_INIT; 1505 } 1506 1507 areasSize = ((sizeof(OMX_ALGOAREASTYPE)+4095)/4096)*4096; 1508 meteringAreas = (OMX_ALGOAREASTYPE**) memMgr.allocateBuffer(0, 0, NULL, areasSize, 1); 1509 1510 OMXCameraPortParameters * mPreviewData = NULL; 1511 mPreviewData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex]; 1512 1513 if (!meteringAreas) 1514 { 1515 CAMHAL_LOGEB("Error allocating buffer for metering areas %d", eError); 1516 return -ENOMEM; 1517 } 1518 1519 OMX_INIT_STRUCT_PTR (meteringAreas[0], OMX_ALGOAREASTYPE); 1520 1521 meteringAreas[0]->nPortIndex = OMX_ALL; 1522 meteringAreas[0]->nNumAreas = mMeteringAreas.size(); 1523 meteringAreas[0]->nAlgoAreaPurpose = OMX_AlgoAreaExposure; 1524 1525 for ( unsigned int n = 0; n < mMeteringAreas.size(); n++) 1526 { 1527 // transform the coordinates to 3A-type coordinates 1528 mMeteringAreas.itemAt(n)->transfrom((size_t)mPreviewData->mWidth, 1529 (size_t)mPreviewData->mHeight, 1530 (size_t&)meteringAreas[0]->tAlgoAreas[n].nTop, 1531 (size_t&)meteringAreas[0]->tAlgoAreas[n].nLeft, 1532 (size_t&)meteringAreas[0]->tAlgoAreas[n].nWidth, 1533 (size_t&)meteringAreas[0]->tAlgoAreas[n].nHeight); 1534 1535 meteringAreas[0]->tAlgoAreas[n].nLeft = 1536 ( meteringAreas[0]->tAlgoAreas[n].nLeft * METERING_AREAS_RANGE ) / mPreviewData->mWidth; 1537 meteringAreas[0]->tAlgoAreas[n].nTop = 1538 ( meteringAreas[0]->tAlgoAreas[n].nTop* METERING_AREAS_RANGE ) / mPreviewData->mHeight; 1539 meteringAreas[0]->tAlgoAreas[n].nWidth = 1540 ( meteringAreas[0]->tAlgoAreas[n].nWidth * METERING_AREAS_RANGE ) / mPreviewData->mWidth; 1541 meteringAreas[0]->tAlgoAreas[n].nHeight = 1542 ( meteringAreas[0]->tAlgoAreas[n].nHeight * METERING_AREAS_RANGE ) / mPreviewData->mHeight; 1543 1544 meteringAreas[0]->tAlgoAreas[n].nPriority = mMeteringAreas.itemAt(n)->getWeight(); 1545 1546 CAMHAL_LOGDB("Metering area %d : top = %d left = %d width = %d height = %d prio = %d", 1547 n, (int)meteringAreas[0]->tAlgoAreas[n].nTop, (int)meteringAreas[0]->tAlgoAreas[n].nLeft, 1548 (int)meteringAreas[0]->tAlgoAreas[n].nWidth, (int)meteringAreas[0]->tAlgoAreas[n].nHeight, 1549 (int)meteringAreas[0]->tAlgoAreas[n].nPriority); 1550 1551 } 1552 1553 OMX_INIT_STRUCT_PTR (&sharedBuffer, OMX_TI_CONFIG_SHAREDBUFFER); 1554 1555 sharedBuffer.nPortIndex = OMX_ALL; 1556 sharedBuffer.nSharedBuffSize = areasSize; 1557 sharedBuffer.pSharedBuff = (OMX_U8 *) meteringAreas[0]; 1558 1559 if ( NULL == sharedBuffer.pSharedBuff ) 1560 { 1561 CAMHAL_LOGEA("No resources to allocate OMX shared buffer"); 1562 ret = -ENOMEM; 1563 goto EXIT; 1564 } 1565 1566 eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 1567 (OMX_INDEXTYPE) OMX_TI_IndexConfigAlgoAreas, &sharedBuffer); 1568 1569 if ( OMX_ErrorNone != eError ) 1570 { 1571 CAMHAL_LOGEB("Error while setting Focus Areas configuration 0x%x", eError); 1572 ret = -EINVAL; 1573 } 1574 else 1575 { 1576 CAMHAL_LOGDA("Metering Areas SetConfig successfull."); 1577 } 1578 1579 EXIT: 1580 if (NULL != meteringAreas) 1581 { 1582 memMgr.freeBuffer((void*) meteringAreas); 1583 meteringAreas = NULL; 1584 } 1585 1586 return ret; 1587 } 1588 1589 status_t OMXCameraAdapter::apply3Asettings( Gen3A_settings& Gen3A ) 1590 { 1591 status_t ret = NO_ERROR; 1592 unsigned int currSett; // 32 bit 1593 int portIndex; 1594 1595 LOG_FUNCTION_NAME; 1596 1597 Mutex::Autolock lock(m3ASettingsUpdateLock); 1598 1599 /* 1600 * Scenes have a priority during the process 1601 * of applying 3A related parameters. 1602 * They can override pretty much all other 3A 1603 * settings and similarly get overridden when 1604 * for instance the focus mode gets switched. 1605 * There is only one exception to this rule, 1606 * the manual a.k.a. auto scene. 1607 */ 1608 if (SetSceneMode & mPending3Asettings) { 1609 mPending3Asettings &= ~SetSceneMode; 1610 ret |= setScene(Gen3A); 1611 // re-apply EV compensation after setting scene mode since it probably reset it 1612 if(Gen3A.EVCompensation) { 1613 setEVCompensation(Gen3A); 1614 } 1615 return ret; 1616 } else if (OMX_Manual != Gen3A.SceneMode) { 1617 // only certain settings are allowed when scene mode is set 1618 mPending3Asettings &= (SetEVCompensation | SetFocus | SetWBLock | 1619 SetExpLock | SetWhiteBallance | SetFlash); 1620 if ( mPending3Asettings == 0 ) return NO_ERROR; 1621 } 1622 1623 for( currSett = 1; currSett < E3aSettingMax; currSett <<= 1) 1624 { 1625 if( currSett & mPending3Asettings ) 1626 { 1627 switch( currSett ) 1628 { 1629 case SetEVCompensation: 1630 { 1631 ret |= setEVCompensation(Gen3A); 1632 break; 1633 } 1634 1635 case SetWhiteBallance: 1636 { 1637 ret |= setWBMode(Gen3A); 1638 break; 1639 } 1640 1641 case SetFlicker: 1642 { 1643 ret |= setFlicker(Gen3A); 1644 break; 1645 } 1646 1647 case SetBrightness: 1648 { 1649 ret |= setBrightness(Gen3A); 1650 break; 1651 } 1652 1653 case SetContrast: 1654 { 1655 ret |= setContrast(Gen3A); 1656 break; 1657 } 1658 1659 case SetSharpness: 1660 { 1661 ret |= setSharpness(Gen3A); 1662 break; 1663 } 1664 1665 case SetSaturation: 1666 { 1667 ret |= setSaturation(Gen3A); 1668 break; 1669 } 1670 1671 case SetISO: 1672 { 1673 ret |= setISO(Gen3A); 1674 break; 1675 } 1676 1677 case SetEffect: 1678 { 1679 ret |= setEffect(Gen3A); 1680 break; 1681 } 1682 1683 case SetFocus: 1684 { 1685 ret |= setFocusMode(Gen3A); 1686 break; 1687 } 1688 1689 case SetExpMode: 1690 { 1691 ret |= setExposureMode(Gen3A); 1692 break; 1693 } 1694 1695 case SetFlash: 1696 { 1697 ret |= setFlashMode(Gen3A); 1698 break; 1699 } 1700 1701 case SetExpLock: 1702 { 1703 ret |= setExposureLock(Gen3A); 1704 break; 1705 } 1706 1707 case SetWBLock: 1708 { 1709 ret |= setWhiteBalanceLock(Gen3A); 1710 break; 1711 } 1712 case SetMeteringAreas: 1713 { 1714 ret |= setMeteringAreas(Gen3A); 1715 } 1716 break; 1717 default: 1718 CAMHAL_LOGEB("this setting (0x%x) is still not supported in CameraAdapter ", 1719 currSett); 1720 break; 1721 } 1722 mPending3Asettings &= ~currSett; 1723 } 1724 } 1725 1726 LOG_FUNCTION_NAME_EXIT; 1727 1728 return ret; 1729 } 1730 1731 }; 1732