OMX3A.cpp revision 024e97a1213041f9d266ee09f7148a0c9b007260
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 33#define TRUE "true" 34#define FALSE "false" 35 36namespace android { 37 38status_t OMXCameraAdapter::setParameters3A(const CameraParameters ¶ms, 39 BaseCameraAdapter::AdapterState state) 40{ 41 status_t ret = NO_ERROR; 42 int mode = 0; 43 const char *str = NULL; 44 45 LOG_FUNCTION_NAME; 46 47 str = params.get(TICameraParameters::KEY_EXPOSURE_MODE); 48 mode = getLUTvalue_HALtoOMX( str, ExpLUT); 49 if ( ( str != NULL ) && ( mParameters3A.Exposure != mode )) 50 { 51 mParameters3A.Exposure = mode; 52 CAMHAL_LOGDB("Exposure mode %d", mode); 53 if ( 0 <= mParameters3A.Exposure ) 54 { 55 mPending3Asettings |= SetExpMode; 56 } 57 } 58 59 str = params.get(CameraParameters::KEY_WHITE_BALANCE); 60 mode = getLUTvalue_HALtoOMX( str, WBalLUT); 61 if (mFirstTimeInit || ((str != NULL) && (mode != mParameters3A.WhiteBallance))) 62 { 63 mParameters3A.WhiteBallance = mode; 64 CAMHAL_LOGDB("Whitebalance mode %d", mode); 65 if ( 0 <= mParameters3A.WhiteBallance ) 66 { 67 mPending3Asettings |= SetWhiteBallance; 68 } 69 } 70 71 if ( 0 <= params.getInt(TICameraParameters::KEY_CONTRAST) ) 72 { 73 if ( mFirstTimeInit || 74 ( (mParameters3A.Contrast + CONTRAST_OFFSET) != 75 params.getInt(TICameraParameters::KEY_CONTRAST)) ) 76 { 77 mParameters3A.Contrast = params.getInt(TICameraParameters::KEY_CONTRAST) - CONTRAST_OFFSET; 78 CAMHAL_LOGDB("Contrast %d", mParameters3A.Contrast); 79 mPending3Asettings |= SetContrast; 80 } 81 } 82 83 if ( 0 <= params.getInt(TICameraParameters::KEY_SHARPNESS) ) 84 { 85 if ( mFirstTimeInit || 86 ((mParameters3A.Sharpness + SHARPNESS_OFFSET) != 87 params.getInt(TICameraParameters::KEY_SHARPNESS))) 88 { 89 mParameters3A.Sharpness = params.getInt(TICameraParameters::KEY_SHARPNESS) - SHARPNESS_OFFSET; 90 CAMHAL_LOGDB("Sharpness %d", mParameters3A.Sharpness); 91 mPending3Asettings |= SetSharpness; 92 } 93 } 94 95 if ( 0 <= params.getInt(TICameraParameters::KEY_SATURATION) ) 96 { 97 if ( mFirstTimeInit || 98 ((mParameters3A.Saturation + SATURATION_OFFSET) != 99 params.getInt(TICameraParameters::KEY_SATURATION)) ) 100 { 101 mParameters3A.Saturation = params.getInt(TICameraParameters::KEY_SATURATION) - SATURATION_OFFSET; 102 CAMHAL_LOGDB("Saturation %d", mParameters3A.Saturation); 103 mPending3Asettings |= SetSaturation; 104 } 105 } 106 107 if ( 0 <= params.getInt(TICameraParameters::KEY_BRIGHTNESS) ) 108 { 109 if ( mFirstTimeInit || 110 (( mParameters3A.Brightness != 111 ( unsigned int ) params.getInt(TICameraParameters::KEY_BRIGHTNESS))) ) 112 { 113 mParameters3A.Brightness = (unsigned)params.getInt(TICameraParameters::KEY_BRIGHTNESS); 114 CAMHAL_LOGDB("Brightness %d", mParameters3A.Brightness); 115 mPending3Asettings |= SetBrightness; 116 } 117 } 118 119 str = params.get(CameraParameters::KEY_ANTIBANDING); 120 mode = getLUTvalue_HALtoOMX(str,FlickerLUT); 121 if ( mFirstTimeInit || ( ( str != NULL ) && ( mParameters3A.Flicker != mode ) )) 122 { 123 mParameters3A.Flicker = mode; 124 CAMHAL_LOGDB("Flicker %d", mParameters3A.Flicker); 125 if ( 0 <= mParameters3A.Flicker ) 126 { 127 mPending3Asettings |= SetFlicker; 128 } 129 } 130 131 str = params.get(TICameraParameters::KEY_ISO); 132 mode = getLUTvalue_HALtoOMX(str, IsoLUT); 133 CAMHAL_LOGVB("ISO mode arrived in HAL : %s", str); 134 if ( mFirstTimeInit || ( ( str != NULL ) && ( mParameters3A.ISO != mode )) ) 135 { 136 mParameters3A.ISO = mode; 137 CAMHAL_LOGDB("ISO %d", mParameters3A.ISO); 138 if ( 0 <= mParameters3A.ISO ) 139 { 140 mPending3Asettings |= SetISO; 141 } 142 } 143 144 str = params.get(CameraParameters::KEY_FOCUS_MODE); 145 mode = getLUTvalue_HALtoOMX(str, FocusLUT); 146 if ( (mFirstTimeInit || ((str != NULL) && (mParameters3A.Focus != mode)))) 147 { 148 //Apply focus mode immediatly only if CAF or Inifinity are selected 149 if ( ( mode == OMX_IMAGE_FocusControlAuto ) || 150 ( mode == OMX_IMAGE_FocusControlAutoInfinity ) ) 151 { 152 mPending3Asettings |= SetFocus; 153 mParameters3A.Focus = mode; 154 } 155 else 156 { 157 //If we switch from CAF to something else, then disable CAF 158 mPending3Asettings |= SetFocus; 159 mParameters3A.Focus = OMX_IMAGE_FocusControlOff; 160 } 161 162 mParameters3A.Focus = mode; 163 CAMHAL_LOGDB("Focus %x", mParameters3A.Focus); 164 } 165 166 str = params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION); 167 if ( mFirstTimeInit || 168 (( str != NULL ) && 169 (mParameters3A.EVCompensation != 170 params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION)))) 171 { 172 CAMHAL_LOGDB("Setting EV Compensation to %d", 173 params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION)); 174 175 mParameters3A.EVCompensation = params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 176 mPending3Asettings |= SetEVCompensation; 177 } 178 179 str = params.get(CameraParameters::KEY_SCENE_MODE); 180 mode = getLUTvalue_HALtoOMX( str, SceneLUT); 181 if ( mFirstTimeInit || (( str != NULL ) && ( mParameters3A.SceneMode != mode )) ) 182 { 183 if ( 0 <= mode ) 184 { 185 mParameters3A.SceneMode = mode; 186 mPending3Asettings |= SetSceneMode; 187 } 188 else 189 { 190 mParameters3A.SceneMode = OMX_Manual; 191 } 192 193 CAMHAL_LOGDB("SceneMode %d", mParameters3A.SceneMode); 194 } 195 196 str = params.get(CameraParameters::KEY_FLASH_MODE); 197 mode = getLUTvalue_HALtoOMX( str, FlashLUT); 198 if ( mFirstTimeInit || (( str != NULL ) && ( mParameters3A.FlashMode != mode )) ) 199 { 200 if ( 0 <= mode ) 201 { 202 mParameters3A.FlashMode = mode; 203 mPending3Asettings |= SetFlash; 204 } 205 else 206 { 207 mParameters3A.FlashMode = OMX_Manual; 208 } 209 } 210 211 CAMHAL_LOGVB("Flash Setting %s", str); 212 CAMHAL_LOGVB("FlashMode %d", mParameters3A.FlashMode); 213 214 str = params.get(CameraParameters::KEY_EFFECT); 215 mode = getLUTvalue_HALtoOMX( str, EffLUT); 216 if ( mFirstTimeInit || (( str != NULL ) && ( mParameters3A.Effect != mode )) ) 217 { 218 mParameters3A.Effect = mode; 219 CAMHAL_LOGDB("Effect %d", mParameters3A.Effect); 220 if ( 0 <= mParameters3A.Effect ) 221 { 222 mPending3Asettings |= SetEffect; 223 } 224 } 225 226 str = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED); 227 if ( (str != NULL) && (!strcmp(str, "true")) ) 228 { 229 OMX_BOOL lock = OMX_FALSE; 230 str = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK); 231 if ( (strcmp(str, "true")) == 0) 232 { 233 CAMHAL_LOGVA("Locking Exposure"); 234 lock = OMX_TRUE; 235 } 236 else 237 { 238 CAMHAL_LOGVA("UnLocking Exposure"); 239 } 240 if (mParameters3A.ExposureLock != lock) 241 { 242 mParameters3A.ExposureLock = lock; 243 CAMHAL_LOGDB("ExposureLock %d", lock); 244 mPending3Asettings |= SetExpLock; 245 } 246 } 247 248 str = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED); 249 if ( (str != NULL) && (!strcmp(str, "true")) ) 250 { 251 OMX_BOOL lock = OMX_FALSE; 252 str = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK); 253 if ( (strcmp(str, "true")) == 0) 254 { 255 CAMHAL_LOGVA("Locking WhiteBalance"); 256 lock = OMX_TRUE; 257 } 258 else 259 { 260 CAMHAL_LOGVA("UnLocking WhiteBalance"); 261 } 262 if (mParameters3A.WhiteBalanceLock != lock) 263 { 264 mParameters3A.WhiteBalanceLock = lock; 265 CAMHAL_LOGDB("WhiteBalanceLock %d", lock); 266 mPending3Asettings |= SetWBLock; 267 } 268 } 269 270 LOG_FUNCTION_NAME_EXIT; 271 272 return ret; 273} 274 275int OMXCameraAdapter::getLUTvalue_HALtoOMX(const char * HalValue, LUTtype LUT) 276{ 277 int LUTsize = LUT.size; 278 if( HalValue ) 279 for(int i = 0; i < LUTsize; i++) 280 if( 0 == strcmp(LUT.Table[i].userDefinition, HalValue) ) 281 return LUT.Table[i].omxDefinition; 282 283 return -ENOENT; 284} 285 286const char* OMXCameraAdapter::getLUTvalue_OMXtoHAL(int OMXValue, LUTtype LUT) 287{ 288 int LUTsize = LUT.size; 289 for(int i = 0; i < LUTsize; i++) 290 if( LUT.Table[i].omxDefinition == OMXValue ) 291 return LUT.Table[i].userDefinition; 292 293 return NULL; 294} 295 296status_t OMXCameraAdapter::apply3ADefaults(Gen3A_settings &Gen3A) 297{ 298 status_t ret = NO_ERROR; 299 300 LOG_FUNCTION_NAME; 301 302 Gen3A.Effect = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_EFFECT, EffLUT); 303 ret |= setEffect(Gen3A); 304 305 Gen3A.FlashMode = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_FLASH_MODE, FlashLUT); 306 ret |= setFlashMode(Gen3A); 307 308 Gen3A.SceneMode = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_SCENE_MODE, SceneLUT); 309 ret |= setScene(Gen3A); 310 311 Gen3A.EVCompensation = atoi(OMXCameraAdapter::DEFAULT_EV_COMPENSATION); 312 ret |= setEVCompensation(Gen3A); 313 314 Gen3A.Focus = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_FOCUS_MODE, FocusLUT); 315 ret |= setFocusMode(Gen3A); 316 317 Gen3A.ISO = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_ISO_MODE, IsoLUT); 318 ret |= setISO(Gen3A); 319 320 Gen3A.Flicker = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_ANTIBANDING, FlickerLUT); 321 ret |= setFlicker(Gen3A); 322 323 Gen3A.Brightness = atoi(OMXCameraAdapter::DEFAULT_BRIGHTNESS); 324 ret |= setBrightness(Gen3A); 325 326 Gen3A.Saturation = atoi(OMXCameraAdapter::DEFAULT_SATURATION); 327 ret |= setSaturation(Gen3A); 328 329 Gen3A.Sharpness = atoi(OMXCameraAdapter::DEFAULT_SHARPNESS); 330 ret |= setSharpness(Gen3A); 331 332 Gen3A.Contrast = atoi(OMXCameraAdapter::DEFAULT_CONTRAST); 333 ret |= setContrast(Gen3A); 334 335 Gen3A.WhiteBallance = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_WB, WBalLUT); 336 ret |= setWBMode(Gen3A); 337 338 Gen3A.Exposure = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_EXPOSURE_MODE, ExpLUT); 339 ret |= setExposureMode(Gen3A); 340 341 Gen3A.ExposureLock = OMX_FALSE; 342 ret |= setExposureLock(Gen3A); 343 344 Gen3A.WhiteBalanceLock = OMX_FALSE; 345 ret |= setWhiteBalanceLock(Gen3A); 346 347 LOG_FUNCTION_NAME_EXIT; 348 349 return NO_ERROR; 350} 351 352status_t OMXCameraAdapter::setExposureMode(Gen3A_settings& Gen3A) 353{ 354 OMX_ERRORTYPE eError = OMX_ErrorNone; 355 OMX_CONFIG_EXPOSURECONTROLTYPE exp; 356 357 LOG_FUNCTION_NAME; 358 359 if ( OMX_StateInvalid == mComponentState ) 360 { 361 CAMHAL_LOGEA("OMX component is in invalid state"); 362 return NO_INIT; 363 } 364 365 OMX_INIT_STRUCT_PTR (&exp, OMX_CONFIG_EXPOSURECONTROLTYPE); 366 exp.nPortIndex = OMX_ALL; 367 exp.eExposureControl = (OMX_EXPOSURECONTROLTYPE)Gen3A.Exposure; 368 369///FIXME: Face priority exposure metering is not stable because of varying face sizes 370///coming from the FD module. So disabling it for now. 371#if 0 372 if ( mFaceDetectionRunning ) 373 { 374 //Disable Region priority and enable Face priority 375 setAlgoPriority(REGION_PRIORITY, EXPOSURE_ALGO, false); 376 setAlgoPriority(FACE_PRIORITY, EXPOSURE_ALGO, true); 377 } 378 else 379#endif 380 { 381 //Disable Region priority and Face priority 382 setAlgoPriority(REGION_PRIORITY, EXPOSURE_ALGO, false); 383 setAlgoPriority(FACE_PRIORITY, EXPOSURE_ALGO, false); 384 } 385 386 eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 387 OMX_IndexConfigCommonExposure, 388 &exp); 389 if ( OMX_ErrorNone != eError ) 390 { 391 CAMHAL_LOGEB("Error while configuring exposure mode 0x%x", eError); 392 } 393 else 394 { 395 CAMHAL_LOGDA("Camera exposure mode configured successfully"); 396 } 397 398 LOG_FUNCTION_NAME_EXIT; 399 400 return ErrorUtils::omxToAndroidError(eError); 401} 402 403status_t OMXCameraAdapter::setFlashMode(Gen3A_settings& Gen3A) 404{ 405 status_t ret = NO_ERROR; 406 OMX_ERRORTYPE eError = OMX_ErrorNone; 407 OMX_IMAGE_PARAM_FLASHCONTROLTYPE flash; 408 409 LOG_FUNCTION_NAME; 410 411 if ( OMX_StateInvalid == mComponentState ) 412 { 413 CAMHAL_LOGEA("OMX component is in invalid state"); 414 return NO_INIT; 415 } 416 417 OMX_INIT_STRUCT_PTR (&flash, OMX_IMAGE_PARAM_FLASHCONTROLTYPE); 418 flash.nPortIndex = OMX_ALL; 419 flash.eFlashControl = ( OMX_IMAGE_FLASHCONTROLTYPE ) Gen3A.FlashMode; 420 421 CAMHAL_LOGDB("Configuring flash mode 0x%x", flash.eFlashControl); 422 eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 423 (OMX_INDEXTYPE) OMX_IndexConfigFlashControl, 424 &flash); 425 if ( OMX_ErrorNone != eError ) 426 { 427 CAMHAL_LOGEB("Error while configuring flash mode 0x%x", eError); 428 } 429 else 430 { 431 CAMHAL_LOGDA("Camera flash mode configured successfully"); 432 } 433 434 LOG_FUNCTION_NAME_EXIT; 435 436 return ErrorUtils::omxToAndroidError(eError); 437} 438 439status_t OMXCameraAdapter::setFocusMode(Gen3A_settings& Gen3A) 440{ 441 status_t ret = NO_ERROR; 442 OMX_ERRORTYPE eError = OMX_ErrorNone; 443 OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focus; 444 size_t top, left, width, height, weight; 445 sp<CameraArea> focusArea = NULL; 446 447 LOG_FUNCTION_NAME; 448 449 if ( OMX_StateInvalid == mComponentState ) 450 { 451 CAMHAL_LOGEA("OMX component is in invalid state"); 452 return NO_INIT; 453 } 454 455 { 456 Mutex::Autolock lock(mFocusAreasLock); 457 458 if ( !mFocusAreas.isEmpty() ) 459 { 460 focusArea = mFocusAreas.itemAt(0); 461 } 462 } 463 464 ///Face detection takes precedence over touch AF 465 if ( mFaceDetectionRunning ) 466 { 467 //Disable region priority first 468 setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, false); 469 470 //Enable face algorithm priority for focus 471 setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO , true); 472 473 //Do normal focus afterwards 474 ////FIXME: Check if the extended focus control is needed? this overrides caf 475 //focusControl.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) OMX_IMAGE_FocusControlExtended; 476 } 477 else if ( ( NULL != focusArea.get() ) && ( focusArea->isValid() ) ) 478 { 479 480 //Disable face priority first 481 setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO, false); 482 483 //Enable region algorithm priority 484 setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, true); 485 486 //Set position 487 OMXCameraPortParameters * mPreviewData = NULL; 488 mPreviewData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex]; 489 focusArea->transfrom(mPreviewData->mWidth, 490 mPreviewData->mHeight, 491 top, 492 left, 493 width, 494 height); 495 setTouchFocus(left, 496 top, 497 width, 498 height, 499 mPreviewData->mWidth, 500 mPreviewData->mHeight); 501 502 //Do normal focus afterwards 503 //FIXME: Check if the extended focus control is needed? this overrides caf 504 //focus.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) OMX_IMAGE_FocusControlExtended; 505 506 } 507 else 508 { 509 510 //Disable both region and face priority 511 setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, false); 512 513 setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO, false); 514 515 } 516 517 if ( NO_ERROR == ret ) 518 { 519 OMX_INIT_STRUCT_PTR (&focus, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); 520 focus.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 521 focus.eFocusControl = (OMX_IMAGE_FOCUSCONTROLTYPE)Gen3A.Focus; 522 523 CAMHAL_LOGDB("Configuring focus mode 0x%x", focus.eFocusControl); 524 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, OMX_IndexConfigFocusControl, &focus); 525 if ( OMX_ErrorNone != eError ) 526 { 527 CAMHAL_LOGEB("Error while configuring focus mode 0x%x", eError); 528 } 529 else 530 { 531 CAMHAL_LOGDA("Camera focus mode configured successfully"); 532 } 533 } 534 535 LOG_FUNCTION_NAME_EXIT; 536 537 return ErrorUtils::omxToAndroidError(eError); 538} 539 540status_t OMXCameraAdapter::setScene(Gen3A_settings& Gen3A) 541{ 542 OMX_ERRORTYPE eError = OMX_ErrorNone; 543 OMX_CONFIG_SCENEMODETYPE scene; 544 545 LOG_FUNCTION_NAME; 546 547 if ( OMX_StateInvalid == mComponentState ) 548 { 549 CAMHAL_LOGEA("OMX component is in invalid state"); 550 return NO_INIT; 551 } 552 553 OMX_INIT_STRUCT_PTR (&scene, OMX_CONFIG_SCENEMODETYPE); 554 scene.nPortIndex = OMX_ALL; 555 scene.eSceneMode = ( OMX_SCENEMODETYPE ) Gen3A.SceneMode; 556 557 CAMHAL_LOGDB("Configuring scene mode 0x%x", scene.eSceneMode); 558 eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 559 ( OMX_INDEXTYPE ) OMX_TI_IndexConfigSceneMode, 560 &scene); 561 if ( OMX_ErrorNone != eError ) 562 { 563 CAMHAL_LOGEB("Error while configuring scene mode 0x%x", eError); 564 } 565 else 566 { 567 CAMHAL_LOGDA("Camera scene configured successfully"); 568 } 569 570 LOG_FUNCTION_NAME_EXIT; 571 572 return ErrorUtils::omxToAndroidError(eError); 573} 574 575status_t OMXCameraAdapter::setEVCompensation(Gen3A_settings& Gen3A) 576{ 577 OMX_ERRORTYPE eError = OMX_ErrorNone; 578 OMX_CONFIG_EXPOSUREVALUETYPE expValues; 579 580 LOG_FUNCTION_NAME; 581 582 if ( OMX_StateInvalid == mComponentState ) 583 { 584 CAMHAL_LOGEA("OMX component is in invalid state"); 585 return NO_INIT; 586 } 587 588 OMX_INIT_STRUCT_PTR (&expValues, OMX_CONFIG_EXPOSUREVALUETYPE); 589 expValues.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 590 591 OMX_GetConfig( mCameraAdapterParameters.mHandleComp, 592 OMX_IndexConfigCommonExposureValue, 593 &expValues); 594 CAMHAL_LOGDB("old EV Compensation for OMX = 0x%x", (int)expValues.xEVCompensation); 595 CAMHAL_LOGDB("EV Compensation for HAL = %d", Gen3A.EVCompensation); 596 597 expValues.xEVCompensation = ( Gen3A.EVCompensation * ( 1 << Q16_OFFSET ) ) / 10; 598 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 599 OMX_IndexConfigCommonExposureValue, 600 &expValues); 601 CAMHAL_LOGDB("new EV Compensation for OMX = 0x%x", (int)expValues.xEVCompensation); 602 if ( OMX_ErrorNone != eError ) 603 { 604 CAMHAL_LOGEB("Error while configuring EV Compensation 0x%x error = 0x%x", 605 ( unsigned int ) expValues.xEVCompensation, 606 eError); 607 } 608 else 609 { 610 CAMHAL_LOGDB("EV Compensation 0x%x configured successfully", 611 ( unsigned int ) expValues.xEVCompensation); 612 } 613 614 LOG_FUNCTION_NAME_EXIT; 615 616 return ErrorUtils::omxToAndroidError(eError); 617} 618 619status_t OMXCameraAdapter::setWBMode(Gen3A_settings& Gen3A) 620{ 621 OMX_ERRORTYPE eError = OMX_ErrorNone; 622 OMX_CONFIG_WHITEBALCONTROLTYPE wb; 623 624 LOG_FUNCTION_NAME; 625 626 if ( OMX_StateInvalid == mComponentState ) 627 { 628 CAMHAL_LOGEA("OMX component is in invalid state"); 629 return NO_INIT; 630 } 631 632 OMX_INIT_STRUCT_PTR (&wb, OMX_CONFIG_WHITEBALCONTROLTYPE); 633 wb.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 634 wb.eWhiteBalControl = ( OMX_WHITEBALCONTROLTYPE ) Gen3A.WhiteBallance; 635 636 if ( WB_FACE_PRIORITY == Gen3A.WhiteBallance ) 637 { 638 //Disable Region priority and enable Face priority 639 setAlgoPriority(REGION_PRIORITY, WHITE_BALANCE_ALGO, false); 640 setAlgoPriority(FACE_PRIORITY, WHITE_BALANCE_ALGO, true); 641 642 //Then set the mode to auto 643 wb.eWhiteBalControl = OMX_WhiteBalControlAuto; 644 } 645 else 646 { 647 //Disable Face and Region priority 648 setAlgoPriority(FACE_PRIORITY, WHITE_BALANCE_ALGO, false); 649 setAlgoPriority(REGION_PRIORITY, WHITE_BALANCE_ALGO, false); 650 } 651 652 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 653 OMX_IndexConfigCommonWhiteBalance, 654 &wb); 655 if ( OMX_ErrorNone != eError ) 656 { 657 CAMHAL_LOGEB("Error while configuring Whitebalance mode 0x%x error = 0x%x", 658 ( unsigned int ) wb.eWhiteBalControl, 659 eError); 660 } 661 else 662 { 663 CAMHAL_LOGDB("Whitebalance mode 0x%x configured successfully", 664 ( unsigned int ) wb.eWhiteBalControl); 665 } 666 667 LOG_FUNCTION_NAME_EXIT; 668 669 return eError; 670} 671 672status_t OMXCameraAdapter::setFlicker(Gen3A_settings& Gen3A) 673{ 674 OMX_ERRORTYPE eError = OMX_ErrorNone; 675 OMX_CONFIG_FLICKERCANCELTYPE flicker; 676 677 LOG_FUNCTION_NAME; 678 679 if ( OMX_StateInvalid == mComponentState ) 680 { 681 CAMHAL_LOGEA("OMX component is in invalid state"); 682 return NO_INIT; 683 } 684 685 OMX_INIT_STRUCT_PTR (&flicker, OMX_CONFIG_FLICKERCANCELTYPE); 686 flicker.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 687 flicker.eFlickerCancel = (OMX_COMMONFLICKERCANCELTYPE)Gen3A.Flicker; 688 689 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 690 (OMX_INDEXTYPE)OMX_IndexConfigFlickerCancel, 691 &flicker ); 692 if ( OMX_ErrorNone != eError ) 693 { 694 CAMHAL_LOGEB("Error while configuring Flicker mode 0x%x error = 0x%x", 695 ( unsigned int ) flicker.eFlickerCancel, 696 eError); 697 } 698 else 699 { 700 CAMHAL_LOGDB("Flicker mode 0x%x configured successfully", 701 ( unsigned int ) flicker.eFlickerCancel); 702 } 703 704 LOG_FUNCTION_NAME_EXIT; 705 706 return ErrorUtils::omxToAndroidError(eError); 707} 708 709status_t OMXCameraAdapter::setBrightness(Gen3A_settings& Gen3A) 710{ 711 OMX_ERRORTYPE eError = OMX_ErrorNone; 712 OMX_CONFIG_BRIGHTNESSTYPE brightness; 713 714 LOG_FUNCTION_NAME; 715 716 if ( OMX_StateInvalid == mComponentState ) 717 { 718 CAMHAL_LOGEA("OMX component is in invalid state"); 719 return NO_INIT; 720 } 721 722 OMX_INIT_STRUCT_PTR (&brightness, OMX_CONFIG_BRIGHTNESSTYPE); 723 brightness.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 724 brightness.nBrightness = Gen3A.Brightness; 725 726 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 727 OMX_IndexConfigCommonBrightness, 728 &brightness); 729 if ( OMX_ErrorNone != eError ) 730 { 731 CAMHAL_LOGEB("Error while configuring Brightness 0x%x error = 0x%x", 732 ( unsigned int ) brightness.nBrightness, 733 eError); 734 } 735 else 736 { 737 CAMHAL_LOGDB("Brightness 0x%x configured successfully", 738 ( unsigned int ) brightness.nBrightness); 739 } 740 741 LOG_FUNCTION_NAME_EXIT; 742 743 return ErrorUtils::omxToAndroidError(eError); 744} 745 746status_t OMXCameraAdapter::setContrast(Gen3A_settings& Gen3A) 747{ 748 OMX_ERRORTYPE eError = OMX_ErrorNone; 749 OMX_CONFIG_CONTRASTTYPE contrast; 750 751 LOG_FUNCTION_NAME; 752 753 if ( OMX_StateInvalid == mComponentState ) 754 { 755 CAMHAL_LOGEA("OMX component is in invalid state"); 756 return NO_INIT; 757 } 758 759 OMX_INIT_STRUCT_PTR (&contrast, OMX_CONFIG_CONTRASTTYPE); 760 contrast.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 761 contrast.nContrast = Gen3A.Contrast; 762 763 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 764 OMX_IndexConfigCommonContrast, 765 &contrast); 766 if ( OMX_ErrorNone != eError ) 767 { 768 CAMHAL_LOGEB("Error while configuring Contrast 0x%x error = 0x%x", 769 ( unsigned int ) contrast.nContrast, 770 eError); 771 } 772 else 773 { 774 CAMHAL_LOGDB("Contrast 0x%x configured successfully", 775 ( unsigned int ) contrast.nContrast); 776 } 777 778 LOG_FUNCTION_NAME_EXIT; 779 780 return eError; 781} 782 783status_t OMXCameraAdapter::setSharpness(Gen3A_settings& Gen3A) 784{ 785 OMX_ERRORTYPE eError = OMX_ErrorNone; 786 OMX_IMAGE_CONFIG_PROCESSINGLEVELTYPE procSharpness; 787 788 LOG_FUNCTION_NAME; 789 790 if ( OMX_StateInvalid == mComponentState ) 791 { 792 CAMHAL_LOGEA("OMX component is in invalid state"); 793 return NO_INIT; 794 } 795 796 OMX_INIT_STRUCT_PTR (&procSharpness, OMX_IMAGE_CONFIG_PROCESSINGLEVELTYPE); 797 procSharpness.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 798 procSharpness.nLevel = Gen3A.Sharpness; 799 800 if( procSharpness.nLevel == 0 ) 801 { 802 procSharpness.bAuto = OMX_TRUE; 803 } 804 else 805 { 806 procSharpness.bAuto = OMX_FALSE; 807 } 808 809 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 810 (OMX_INDEXTYPE)OMX_IndexConfigSharpeningLevel, 811 &procSharpness); 812 if ( OMX_ErrorNone != eError ) 813 { 814 CAMHAL_LOGEB("Error while configuring Sharpness 0x%x error = 0x%x", 815 ( unsigned int ) procSharpness.nLevel, 816 eError); 817 } 818 else 819 { 820 CAMHAL_LOGDB("Sharpness 0x%x configured successfully", 821 ( unsigned int ) procSharpness.nLevel); 822 } 823 824 LOG_FUNCTION_NAME_EXIT; 825 826 return ErrorUtils::omxToAndroidError(eError); 827} 828 829status_t OMXCameraAdapter::setSaturation(Gen3A_settings& Gen3A) 830{ 831 OMX_ERRORTYPE eError = OMX_ErrorNone; 832 OMX_CONFIG_SATURATIONTYPE saturation; 833 834 LOG_FUNCTION_NAME; 835 836 if ( OMX_StateInvalid == mComponentState ) 837 { 838 CAMHAL_LOGEA("OMX component is in invalid state"); 839 return NO_INIT; 840 } 841 842 OMX_INIT_STRUCT_PTR (&saturation, OMX_CONFIG_SATURATIONTYPE); 843 saturation.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 844 saturation.nSaturation = Gen3A.Saturation; 845 846 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 847 OMX_IndexConfigCommonSaturation, 848 &saturation); 849 if ( OMX_ErrorNone != eError ) 850 { 851 CAMHAL_LOGEB("Error while configuring Saturation 0x%x error = 0x%x", 852 ( unsigned int ) saturation.nSaturation, 853 eError); 854 } 855 else 856 { 857 CAMHAL_LOGDB("Saturation 0x%x configured successfully", 858 ( unsigned int ) saturation.nSaturation); 859 } 860 861 LOG_FUNCTION_NAME_EXIT; 862 863 return ErrorUtils::omxToAndroidError(eError); 864} 865 866status_t OMXCameraAdapter::setISO(Gen3A_settings& Gen3A) 867{ 868 OMX_ERRORTYPE eError = OMX_ErrorNone; 869 OMX_CONFIG_EXPOSUREVALUETYPE expValues; 870 871 LOG_FUNCTION_NAME; 872 873 if ( OMX_StateInvalid == mComponentState ) 874 { 875 CAMHAL_LOGEA("OMX component is in invalid state"); 876 return NO_INIT; 877 } 878 879 OMX_INIT_STRUCT_PTR (&expValues, OMX_CONFIG_EXPOSUREVALUETYPE); 880 expValues.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 881 882 OMX_GetConfig( mCameraAdapterParameters.mHandleComp, 883 OMX_IndexConfigCommonExposureValue, 884 &expValues); 885 886 if( 0 == Gen3A.ISO ) 887 { 888 expValues.bAutoSensitivity = OMX_TRUE; 889 } 890 else 891 { 892 expValues.bAutoSensitivity = OMX_FALSE; 893 expValues.nSensitivity = Gen3A.ISO; 894 } 895 896 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 897 OMX_IndexConfigCommonExposureValue, 898 &expValues); 899 if ( OMX_ErrorNone != eError ) 900 { 901 CAMHAL_LOGEB("Error while configuring ISO 0x%x error = 0x%x", 902 ( unsigned int ) expValues.nSensitivity, 903 eError); 904 } 905 else 906 { 907 CAMHAL_LOGDB("ISO 0x%x configured successfully", 908 ( unsigned int ) expValues.nSensitivity); 909 } 910 911 LOG_FUNCTION_NAME_EXIT; 912 913 return ErrorUtils::omxToAndroidError(eError); 914} 915 916status_t OMXCameraAdapter::setEffect(Gen3A_settings& Gen3A) 917{ 918 OMX_ERRORTYPE eError = OMX_ErrorNone; 919 OMX_CONFIG_IMAGEFILTERTYPE effect; 920 921 LOG_FUNCTION_NAME; 922 923 if ( OMX_StateInvalid == mComponentState ) 924 { 925 CAMHAL_LOGEA("OMX component is in invalid state"); 926 return NO_INIT; 927 } 928 929 OMX_INIT_STRUCT_PTR (&effect, OMX_CONFIG_IMAGEFILTERTYPE); 930 effect.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 931 effect.eImageFilter = (OMX_IMAGEFILTERTYPE ) Gen3A.Effect; 932 933 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 934 OMX_IndexConfigCommonImageFilter, 935 &effect); 936 if ( OMX_ErrorNone != eError ) 937 { 938 CAMHAL_LOGEB("Error while configuring Effect 0x%x error = 0x%x", 939 ( unsigned int ) effect.eImageFilter, 940 eError); 941 } 942 else 943 { 944 CAMHAL_LOGDB("Effect 0x%x configured successfully", 945 ( unsigned int ) effect.eImageFilter); 946 } 947 948 LOG_FUNCTION_NAME_EXIT; 949 950 return ErrorUtils::omxToAndroidError(eError); 951} 952 953status_t OMXCameraAdapter::setWhiteBalanceLock(Gen3A_settings& Gen3A) 954{ 955 OMX_ERRORTYPE eError = OMX_ErrorNone; 956 OMX_IMAGE_CONFIG_LOCKTYPE lock; 957 958 LOG_FUNCTION_NAME 959 960 if ( OMX_StateInvalid == mComponentState ) 961 { 962 CAMHAL_LOGEA("OMX component is in invalid state"); 963 return NO_INIT; 964 } 965 966 OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE); 967 lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 968 lock.bLock = Gen3A.WhiteBalanceLock; 969 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 970 (OMX_INDEXTYPE)OMX_IndexConfigImageWhiteBalanceLock, 971 &lock); 972 if ( OMX_ErrorNone != eError ) 973 { 974 CAMHAL_LOGEB("Error while configuring WhiteBalance Lock error = 0x%x", eError); 975 } 976 else 977 { 978 CAMHAL_LOGDB("WhiteBalance Lock configured successfully %d ", lock.bLock); 979 } 980 LOG_FUNCTION_NAME_EXIT 981 982 return ErrorUtils::omxToAndroidError(eError); 983} 984 985status_t OMXCameraAdapter::setExposureLock(Gen3A_settings& Gen3A) 986{ 987 OMX_ERRORTYPE eError = OMX_ErrorNone; 988 OMX_IMAGE_CONFIG_LOCKTYPE lock; 989 990 LOG_FUNCTION_NAME 991 992 if ( OMX_StateInvalid == mComponentState ) 993 { 994 CAMHAL_LOGEA("OMX component is in invalid state"); 995 return NO_INIT; 996 } 997 998 OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE); 999 lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1000 lock.bLock = Gen3A.ExposureLock; 1001 eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, 1002 (OMX_INDEXTYPE)OMX_IndexConfigImageExposureLock, 1003 &lock); 1004 if ( OMX_ErrorNone != eError ) 1005 { 1006 CAMHAL_LOGEB("Error while configuring Exposure Lock error = 0x%x", eError); 1007 } 1008 else 1009 { 1010 CAMHAL_LOGDB("Exposure Lock configured successfully %d ", lock.bLock); 1011 } 1012 LOG_FUNCTION_NAME_EXIT 1013 1014 return ErrorUtils::omxToAndroidError(eError); 1015} 1016 1017status_t OMXCameraAdapter::set3ALock(OMX_BOOL toggle) 1018{ 1019 OMX_ERRORTYPE eError = OMX_ErrorNone; 1020 OMX_IMAGE_CONFIG_LOCKTYPE lock; 1021 char* index = FALSE; 1022 1023 LOG_FUNCTION_NAME 1024 1025 if ( OMX_StateInvalid == mComponentState ) 1026 { 1027 CAMHAL_LOGEA("OMX component is in invalid state"); 1028 return NO_INIT; 1029 } 1030 1031 OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE); 1032 lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1033 1034 mParameters3A.ExposureLock = toggle; 1035 mParameters3A.WhiteBalanceLock = toggle; 1036 1037 eError = OMX_GetConfig( mCameraAdapterParameters.mHandleComp, 1038 (OMX_INDEXTYPE)OMX_IndexConfigImageExposureLock, 1039 &lock); 1040 if ( OMX_ErrorNone != eError ) 1041 { 1042 CAMHAL_LOGEB("Error GetConfig Exposure Lock error = 0x%x", eError); 1043 } 1044 else 1045 { 1046 CAMHAL_LOGDA("Exposure Lock GetConfig successfull"); 1047 } 1048 1049 /* Apply locks only when not applied already */ 1050 if ( lock.bLock != toggle ) 1051 { 1052 setExposureLock(mParameters3A); 1053 } 1054 1055 eError = OMX_GetConfig( mCameraAdapterParameters.mHandleComp, 1056 (OMX_INDEXTYPE)OMX_IndexConfigImageWhiteBalanceLock, 1057 &lock); 1058 if ( OMX_ErrorNone != eError ) 1059 { 1060 CAMHAL_LOGEB("Error GetConfig WhiteBalance Lock error = 0x%x", eError); 1061 } 1062 else 1063 { 1064 CAMHAL_LOGDA("WhiteBalance Lock GetConfig successfull"); 1065 } 1066 1067 /* Apply locks only when not applied already */ 1068 if ( lock.bLock != toggle ) 1069 { 1070 setWhiteBalanceLock(mParameters3A); 1071 } 1072 1073 const char *lock_state = toggle ? TRUE : FALSE; 1074 mParams.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, lock_state); 1075 mParams.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, lock_state); 1076 1077 return ErrorUtils::omxToAndroidError(eError); 1078 1079} 1080 1081status_t OMXCameraAdapter::apply3Asettings( Gen3A_settings& Gen3A ) 1082{ 1083 status_t ret = NO_ERROR; 1084 unsigned int currSett; // 32 bit 1085 int portIndex; 1086 1087 /* 1088 * Scenes have a priority during the process 1089 * of applying 3A related parameters. 1090 * They can override pretty much all other 3A 1091 * settings and similarly get overridden when 1092 * for instance the focus mode gets switched. 1093 * There is only one exception to this rule, 1094 * the manual a.k.a. auto scene. 1095 */ 1096 if ( ( SetSceneMode & mPending3Asettings ) ) 1097 { 1098 mPending3Asettings &= ~SetSceneMode; 1099 return setScene(Gen3A); 1100 } 1101 else if ( OMX_Manual != Gen3A.SceneMode ) 1102 { 1103 mPending3Asettings = 0; 1104 return NO_ERROR; 1105 } 1106 1107 for( currSett = 1; currSett < E3aSettingMax; currSett <<= 1) 1108 { 1109 if( currSett & mPending3Asettings ) 1110 { 1111 switch( currSett ) 1112 { 1113 case SetEVCompensation: 1114 { 1115 ret |= setEVCompensation(Gen3A); 1116 break; 1117 } 1118 1119 case SetWhiteBallance: 1120 { 1121 ret |= setWBMode(Gen3A); 1122 break; 1123 } 1124 1125 case SetFlicker: 1126 { 1127 ret |= setFlicker(Gen3A); 1128 break; 1129 } 1130 1131 case SetBrightness: 1132 { 1133 ret |= setBrightness(Gen3A); 1134 break; 1135 } 1136 1137 case SetContrast: 1138 { 1139 ret |= setContrast(Gen3A); 1140 break; 1141 } 1142 1143 case SetSharpness: 1144 { 1145 ret |= setSharpness(Gen3A); 1146 break; 1147 } 1148 1149 case SetSaturation: 1150 { 1151 ret |= setSaturation(Gen3A); 1152 break; 1153 } 1154 1155 case SetISO: 1156 { 1157 ret |= setISO(Gen3A); 1158 break; 1159 } 1160 1161 case SetEffect: 1162 { 1163 ret |= setEffect(Gen3A); 1164 break; 1165 } 1166 1167 case SetFocus: 1168 { 1169 ret |= setFocusMode(Gen3A); 1170 break; 1171 } 1172 1173 case SetExpMode: 1174 { 1175 ret |= setExposureMode(Gen3A); 1176 break; 1177 } 1178 1179 case SetFlash: 1180 { 1181 ret |= setFlashMode(Gen3A); 1182 break; 1183 } 1184 1185 case SetExpLock: 1186 { 1187 ret |= setExposureLock(Gen3A); 1188 break; 1189 } 1190 1191 case SetWBLock: 1192 { 1193 ret |= setWhiteBalanceLock(Gen3A); 1194 break; 1195 } 1196 1197 default: 1198 CAMHAL_LOGEB("this setting (0x%x) is still not supported in CameraAdapter ", 1199 currSett); 1200 break; 1201 } 1202 mPending3Asettings &= ~currSett; 1203 } 1204 } 1205 return ret; 1206} 1207 1208}; 1209