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