CameraHal.cpp revision 08bd593a76c52f567ab844a9d92a9ffa2fe47ee9
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 CameraHal.cpp 19* 20* This file maps the Camera Hardware Interface to V4L2. 21* 22*/ 23 24#define LOG_TAG "CameraHAL" 25 26#include "CameraHal.h" 27#include "ANativeWindowDisplayAdapter.h" 28#include "TICameraParameters.h" 29#include "CameraProperties.h" 30#include <cutils/properties.h> 31 32#include <poll.h> 33#include <math.h> 34 35namespace android { 36 37extern "C" CameraAdapter* CameraAdapter_Factory(); 38 39/*****************************************************************************/ 40 41////Constant definitions and declarations 42////@todo Have a CameraProperties class to store these parameters as constants for every camera 43//// Currently, they are hard-coded 44 45const int CameraHal::NO_BUFFERS_PREVIEW = MAX_CAMERA_BUFFERS; 46const int CameraHal::NO_BUFFERS_IMAGE_CAPTURE = 2; 47 48const uint32_t MessageNotifier::EVENT_BIT_FIELD_POSITION = 0; 49const uint32_t MessageNotifier::FRAME_BIT_FIELD_POSITION = 0; 50 51/******************************************************************************/ 52 53#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 54 55struct timeval CameraHal::mStartPreview; 56struct timeval CameraHal::mStartFocus; 57struct timeval CameraHal::mStartCapture; 58 59#endif 60 61static void orientation_cb(uint32_t orientation, uint32_t tilt, void* cookie) { 62 CameraHal *camera = NULL; 63 64 if (cookie) { 65 camera = (CameraHal*) cookie; 66 camera->onOrientationEvent(orientation, tilt); 67 } 68 69} 70/*-------------Camera Hal Interface Method definitions STARTS here--------------------*/ 71 72/** 73 Callback function to receive orientation events from SensorListener 74 */ 75void CameraHal::onOrientationEvent(uint32_t orientation, uint32_t tilt) { 76 LOG_FUNCTION_NAME; 77 78 if ( NULL != mCameraAdapter ) { 79 mCameraAdapter->onOrientationEvent(orientation, tilt); 80 } 81 82 LOG_FUNCTION_NAME_EXIT; 83} 84 85/** 86 @brief Set the notification and data callbacks 87 88 @param[in] notify_cb Notify callback for notifying the app about events and errors 89 @param[in] data_cb Buffer callback for sending the preview/raw frames to the app 90 @param[in] data_cb_timestamp Buffer callback for sending the video frames w/ timestamp 91 @param[in] user Callback cookie 92 @return none 93 94 */ 95void CameraHal::setCallbacks(camera_notify_callback notify_cb, 96 camera_data_callback data_cb, 97 camera_data_timestamp_callback data_cb_timestamp, 98 camera_request_memory get_memory, 99 void *user) 100{ 101 LOG_FUNCTION_NAME; 102 103 if ( NULL != mAppCallbackNotifier.get() ) 104 { 105 mAppCallbackNotifier->setCallbacks(this, 106 notify_cb, 107 data_cb, 108 data_cb_timestamp, 109 get_memory, 110 user); 111 } 112 113 LOG_FUNCTION_NAME_EXIT; 114} 115 116/** 117 @brief Enable a message, or set of messages. 118 119 @param[in] msgtype Bitmask of the messages to enable (defined in include/ui/Camera.h) 120 @return none 121 122 */ 123void CameraHal::enableMsgType(int32_t msgType) 124{ 125 LOG_FUNCTION_NAME; 126 127 if ( ( msgType & CAMERA_MSG_SHUTTER ) && ( !mShutterEnabled ) ) 128 { 129 msgType &= ~CAMERA_MSG_SHUTTER; 130 } 131 132 { 133 Mutex::Autolock lock(mLock); 134 mMsgEnabled |= msgType; 135 } 136 137 if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) 138 { 139 if(mDisplayPaused) 140 { 141 CAMHAL_LOGDA("Preview currently paused...will enable preview callback when restarted"); 142 msgType &= ~CAMERA_MSG_PREVIEW_FRAME; 143 }else 144 { 145 CAMHAL_LOGDA("Enabling Preview Callback"); 146 } 147 } 148 else 149 { 150 CAMHAL_LOGDB("Preview callback not enabled %x", msgType); 151 } 152 153 154 ///Configure app callback notifier with the message callback required 155 mAppCallbackNotifier->enableMsgType (msgType); 156 157 LOG_FUNCTION_NAME_EXIT; 158} 159 160/** 161 @brief Disable a message, or set of messages. 162 163 @param[in] msgtype Bitmask of the messages to disable (defined in include/ui/Camera.h) 164 @return none 165 166 */ 167void CameraHal::disableMsgType(int32_t msgType) 168{ 169 LOG_FUNCTION_NAME; 170 171 { 172 Mutex::Autolock lock(mLock); 173 mMsgEnabled &= ~msgType; 174 } 175 176 if( msgType & CAMERA_MSG_PREVIEW_FRAME) 177 { 178 CAMHAL_LOGDA("Disabling Preview Callback"); 179 } 180 181 ///Configure app callback notifier 182 mAppCallbackNotifier->disableMsgType (msgType); 183 184 LOG_FUNCTION_NAME_EXIT; 185} 186 187/** 188 @brief Query whether a message, or a set of messages, is enabled. 189 190 Note that this is operates as an AND, if any of the messages queried are off, this will 191 return false. 192 193 @param[in] msgtype Bitmask of the messages to query (defined in include/ui/Camera.h) 194 @return true If all message types are enabled 195 false If any message type 196 197 */ 198int CameraHal::msgTypeEnabled(int32_t msgType) 199{ 200 LOG_FUNCTION_NAME; 201 Mutex::Autolock lock(mLock); 202 LOG_FUNCTION_NAME_EXIT; 203 return (mMsgEnabled & msgType); 204} 205 206/** 207 @brief Set the camera parameters. 208 209 @param[in] params Camera parameters to configure the camera 210 @return NO_ERROR 211 @todo Define error codes 212 213 */ 214int CameraHal::setParameters(const char* parameters) 215{ 216 217 LOG_FUNCTION_NAME; 218 219 CameraParameters params; 220 221 String8 str_params(parameters); 222 params.unflatten(str_params); 223 224 LOG_FUNCTION_NAME_EXIT; 225 226 return setParameters(params); 227} 228 229/** 230 @brief Set the camera parameters. 231 232 @param[in] params Camera parameters to configure the camera 233 @return NO_ERROR 234 @todo Define error codes 235 236 */ 237int CameraHal::setParameters(const CameraParameters& params) 238{ 239 240 LOG_FUNCTION_NAME; 241 242 int w, h; 243 int w_orig, h_orig; 244 int framerate,minframerate; 245 int maxFPS, minFPS; 246 int error; 247 int base; 248 const char *valstr = NULL; 249 const char *prevFormat; 250 char *af_coord; 251 TIUTILS::Message msg; 252 status_t ret = NO_ERROR; 253 // Needed for KEY_RECORDING_HINT 254 bool restartPreviewRequired = false; 255 bool updateRequired = false; 256 CameraParameters oldParams(mParameters.flatten()); 257 bool videoMode = false; 258 char range[MAX_PROP_VALUE_LENGTH]; 259 260 { 261 Mutex::Autolock lock(mLock); 262 263 ///Ensure that preview is not enabled when the below parameters are changed. 264 if(!previewEnabled()) 265 { 266 267 CAMHAL_LOGDB("PreviewFormat %s", params.getPreviewFormat()); 268 269 if ((valstr = params.getPreviewFormat()) != NULL) { 270 if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS))) { 271 mParameters.setPreviewFormat(valstr); 272 } else { 273 CAMHAL_LOGEB("Invalid preview format.Supported: %s", mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS)); 274 return -EINVAL; 275 } 276 } 277 278 if ((valstr = params.get(TICameraParameters::KEY_VNF)) != NULL) { 279 if ( (params.getInt(TICameraParameters::KEY_VNF)==0) || (params.getInt(TICameraParameters::KEY_VNF)==1) ) { 280 CAMHAL_LOGDB("VNF set %s", params.get(TICameraParameters::KEY_VNF)); 281 mParameters.set(TICameraParameters::KEY_VNF, valstr); 282 } else { 283 CAMHAL_LOGEB("ERROR: Invalid VNF: %s", valstr); 284 ret = -EINVAL; 285 } 286 } 287 288 if ((valstr = params.get(TICameraParameters::KEY_VSTAB)) != NULL) { 289 if ((params.getInt(TICameraParameters::KEY_VSTAB)==0) || (params.getInt(TICameraParameters::KEY_VSTAB)==1)) { 290 CAMHAL_LOGDB("VSTAB set %s", params.get(TICameraParameters::KEY_VSTAB)); 291 mParameters.set(TICameraParameters::KEY_VSTAB, valstr); 292 } else { 293 CAMHAL_LOGEB("ERROR: Invalid VSTAB: %s", valstr); 294 ret = -EINVAL; 295 } 296 } 297 298 if( (valstr = params.get(TICameraParameters::KEY_CAP_MODE)) != NULL) 299 { 300 CAMHAL_LOGDB("Capture mode set %s", params.get(TICameraParameters::KEY_CAP_MODE)); 301 mParameters.set(TICameraParameters::KEY_CAP_MODE, valstr); 302 } 303 304 if ((valstr = params.get(TICameraParameters::KEY_IPP)) != NULL) { 305 if (isParameterValid(valstr,mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES))) { 306 CAMHAL_LOGDB("IPP mode set %s", params.get(TICameraParameters::KEY_IPP)); 307 mParameters.set(TICameraParameters::KEY_IPP, valstr); 308 } else { 309 CAMHAL_LOGEB("ERROR: Invalid IPP mode: %s", valstr); 310 ret = -EINVAL; 311 } 312 } 313 314 if((valstr = params.get(TICameraParameters::KEY_S3D2D_PREVIEW)) != NULL) 315 { 316 CAMHAL_LOGDB("Stereo 3D->2D Preview mode is %s", params.get(TICameraParameters::KEY_S3D2D_PREVIEW)); 317 mParameters.set(TICameraParameters::KEY_S3D2D_PREVIEW, valstr); 318 } 319 320 if((valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE)) != NULL) 321 { 322 CAMHAL_LOGDB("AutoConvergence mode is %s", params.get(TICameraParameters::KEY_AUTOCONVERGENCE)); 323 mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE, valstr); 324 } 325 326 } 327 328 //CTS requirement, we should be able to change the preview resolution 329 //while in paused display state 330 if ( !previewEnabled() || mDisplayPaused ) 331 { 332 params.getPreviewSize(&w, &h); 333 if (w == -1 && h == -1) { 334 CAMHAL_LOGEA("Unable to get preview size"); 335 return -EINVAL; 336 } 337 338 int oldWidth, oldHeight; 339 mParameters.getPreviewSize(&oldWidth, &oldHeight); 340 341 int orientation =0; 342 if((valstr = params.get(TICameraParameters::KEY_SENSOR_ORIENTATION)) != NULL) 343 { 344 CAMHAL_LOGDB("Sensor Orientation is set to %s", params.get(TICameraParameters::KEY_SENSOR_ORIENTATION)); 345 mParameters.set(TICameraParameters::KEY_SENSOR_ORIENTATION, valstr); 346 orientation = params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION); 347 } 348 349 if(orientation ==90 || orientation ==270) 350 { 351 if ( !isResolutionValid(h,w, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES))) 352 { 353 CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h); 354 return -EINVAL; 355 } 356 else 357 { 358 mParameters.setPreviewSize(w, h); 359 } 360 } 361 else 362 { 363 if ( !isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES))) 364 { 365 CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h); 366 return -EINVAL; 367 } 368 else 369 { 370 mParameters.setPreviewSize(w, h); 371 } 372 } 373 374 if ( ( oldWidth != w ) || ( oldHeight != h ) ) 375 { 376 mDynamicPreviewSwitch = true; 377 } 378 379 CAMHAL_LOGDB("PreviewResolution by App %d x %d", w, h); 380 } 381 382 // Handle RECORDING_HINT to Set/Reset Video Mode Parameters 383 valstr = params.get(CameraParameters::KEY_RECORDING_HINT); 384 if(valstr != NULL) 385 { 386 if(strcmp(valstr, CameraParameters::TRUE) == 0) 387 { 388 CAMHAL_LOGDB("Recording Hint is set to %s", valstr); 389 mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr); 390 restartPreviewRequired = setVideoModeParameters(); 391 videoMode = true; 392 } 393 else if(strcmp(valstr, CameraParameters::FALSE) == 0) 394 { 395 CAMHAL_LOGDB("Recording Hint is set to %s", valstr); 396 mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr); 397 restartPreviewRequired = resetVideoModeParameters(); 398 } 399 else 400 { 401 CAMHAL_LOGEA("Invalid RECORDING_HINT"); 402 return -EINVAL; 403 } 404 } 405 else 406 { 407 // This check is required in following case. 408 // If VideoRecording activity sets KEY_RECORDING_HINT to TRUE and 409 // ImageCapture activity doesnot set KEY_RECORDING_HINT to FALSE (i.e. simply NULL), 410 // then Video Mode parameters may remain present in ImageCapture activity as well. 411 CAMHAL_LOGDA("Recording Hint is set to NULL"); 412 mParameters.set(CameraParameters::KEY_RECORDING_HINT, ""); 413 restartPreviewRequired = resetVideoModeParameters(); 414 } 415 416 ///Below parameters can be changed when the preview is running 417 if ( (valstr = params.getPictureFormat()) != NULL ) { 418 if (isParameterValid(params.getPictureFormat(),mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS))) { 419 mParameters.setPictureFormat(valstr); 420 } else { 421 CAMHAL_LOGEB("ERROR: Invalid picture format: %s",valstr); 422 ret = -EINVAL; 423 } 424 } 425 426 params.getPictureSize(&w, &h); 427 if ( isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES))) { 428 mParameters.setPictureSize(w, h); 429 } else { 430 CAMHAL_LOGEB("ERROR: Invalid picture resolution %dx%d", w, h); 431 ret = -EINVAL; 432 } 433 434 CAMHAL_LOGDB("Picture Size by App %d x %d", w, h); 435 436 if ((valstr = params.get(TICameraParameters::KEY_BURST)) != NULL) { 437 if (params.getInt(TICameraParameters::KEY_BURST) >=0) { 438 CAMHAL_LOGDB("Burst set %s", params.get(TICameraParameters::KEY_BURST)); 439 mParameters.set(TICameraParameters::KEY_BURST, valstr); 440 } else { 441 CAMHAL_LOGEB("ERROR: Invalid Burst value: %s",valstr); 442 ret = -EINVAL; 443 } 444 } 445 446 framerate = params.getPreviewFrameRate(); 447 valstr = params.get(CameraParameters::KEY_PREVIEW_FPS_RANGE); 448 CAMHAL_LOGDB("FRAMERATE %d", framerate); 449 450 CAMHAL_LOGVB("Passed FRR: %s, Supported FRR %s", valstr 451 , mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED)); 452 CAMHAL_LOGVB("Passed FR: %d, Supported FR %s", framerate 453 , mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES)); 454 455 456 //Perform parameter validation 457 if(!isParameterValid(valstr 458 , mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED)) 459 || !isParameterValid(framerate, 460 mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES))) 461 { 462 CAMHAL_LOGEA("Invalid frame rate range or frame rate"); 463 return -EINVAL; 464 } 465 466 // Variable framerate ranges have higher priority over 467 // deprecated constant FPS. "KEY_PREVIEW_FPS_RANGE" should 468 // be cleared by the client in order for constant FPS to get 469 // applied. 470 if ( strcmp(valstr, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE)) != 0) 471 { 472 // APP wants to set FPS range 473 //Set framerate = MAXFPS 474 CAMHAL_LOGDA("APP IS CHANGING FRAME RATE RANGE"); 475 params.getPreviewFpsRange(&minFPS, &maxFPS); 476 477 if ( ( 0 > minFPS ) || ( 0 > maxFPS ) ) 478 { 479 CAMHAL_LOGEA("ERROR: FPS Range is negative!"); 480 return -EINVAL; 481 } 482 483 framerate = maxFPS /CameraHal::VFR_SCALE; 484 485 } 486 else 487 { 488 if ( framerate != atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)) ) 489 { 490 491 selectFPSRange(framerate, &minFPS, &maxFPS); 492 CAMHAL_LOGDB("Select FPS Range %d %d", minFPS, maxFPS); 493 } 494 else 495 { 496 if (videoMode) { 497 valstr = mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_VIDEO); 498 CameraParameters temp; 499 temp.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr); 500 temp.getPreviewFpsRange(&minFPS, &maxFPS); 501 } 502 else { 503 valstr = mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_IMAGE); 504 CameraParameters temp; 505 temp.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr); 506 temp.getPreviewFpsRange(&minFPS, &maxFPS); 507 } 508 509 framerate = maxFPS / CameraHal::VFR_SCALE; 510 } 511 512 } 513 514 CAMHAL_LOGDB("FPS Range = %s", valstr); 515 CAMHAL_LOGDB("DEFAULT FPS Range = %s", mCameraProperties->get(CameraProperties::FRAMERATE_RANGE)); 516 517 minFPS /= CameraHal::VFR_SCALE; 518 maxFPS /= CameraHal::VFR_SCALE; 519 520 if ( ( 0 == minFPS ) || ( 0 == maxFPS ) ) 521 { 522 CAMHAL_LOGEA("ERROR: FPS Range is invalid!"); 523 ret = -EINVAL; 524 } 525 526 if ( maxFPS < minFPS ) 527 { 528 CAMHAL_LOGEA("ERROR: Max FPS is smaller than Min FPS!"); 529 ret = -EINVAL; 530 } 531 CAMHAL_LOGDB("SET FRAMERATE %d", framerate); 532 mParameters.setPreviewFrameRate(framerate); 533 mParameters.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, params.get(CameraParameters::KEY_PREVIEW_FPS_RANGE)); 534 535 CAMHAL_LOGDB("FPS Range [%d, %d]", minFPS, maxFPS); 536 mParameters.set(TICameraParameters::KEY_MINFRAMERATE, minFPS); 537 mParameters.set(TICameraParameters::KEY_MAXFRAMERATE, maxFPS); 538 539 if( ( valstr = params.get(TICameraParameters::KEY_GBCE) ) != NULL ) 540 { 541 CAMHAL_LOGDB("GBCE Value = %s", valstr); 542 mParameters.set(TICameraParameters::KEY_GBCE, valstr); 543 } 544 545 if( ( valstr = params.get(TICameraParameters::KEY_GLBCE) ) != NULL ) 546 { 547 CAMHAL_LOGDB("GLBCE Value = %s", valstr); 548 mParameters.set(TICameraParameters::KEY_GLBCE, valstr); 549 } 550 551 ///Update the current parameter set 552 if( (valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE)) != NULL) 553 { 554 CAMHAL_LOGDB("AutoConvergence Mode is set = %s", params.get(TICameraParameters::KEY_AUTOCONVERGENCE)); 555 mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE, valstr); 556 } 557 558 if( (valstr = params.get(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES)) !=NULL ) 559 { 560 CAMHAL_LOGDB("ManualConvergence Value = %s", params.get(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES)); 561 mParameters.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, valstr); 562 } 563 564 if ((valstr = params.get(TICameraParameters::KEY_EXPOSURE_MODE)) != NULL) { 565 if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES))) { 566 CAMHAL_LOGDB("Exposure set = %s", valstr); 567 mParameters.set(TICameraParameters::KEY_EXPOSURE_MODE, valstr); 568 } else { 569 CAMHAL_LOGEB("ERROR: Invalid Exposure = %s", valstr); 570 ret = -EINVAL; 571 } 572 } 573 574 if ((valstr = params.get(CameraParameters::KEY_WHITE_BALANCE)) != NULL) { 575 if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE))) { 576 CAMHAL_LOGDB("White balance set %s", valstr); 577 mParameters.set(CameraParameters::KEY_WHITE_BALANCE, valstr); 578 } else { 579 CAMHAL_LOGEB("ERROR: Invalid white balance = %s", valstr); 580 ret = -EINVAL; 581 } 582 } 583 584 if ((valstr = params.get(TICameraParameters::KEY_CONTRAST)) != NULL) { 585 if (params.getInt(TICameraParameters::KEY_CONTRAST) >= 0 ) { 586 CAMHAL_LOGDB("Contrast set %s", valstr); 587 mParameters.set(TICameraParameters::KEY_CONTRAST, valstr); 588 } else { 589 CAMHAL_LOGEB("ERROR: Invalid Contrast = %s", valstr); 590 ret = -EINVAL; 591 } 592 } 593 594 if ((valstr =params.get(TICameraParameters::KEY_SHARPNESS)) != NULL) { 595 if (params.getInt(TICameraParameters::KEY_SHARPNESS) >= 0 ) { 596 CAMHAL_LOGDB("Sharpness set %s", valstr); 597 mParameters.set(TICameraParameters::KEY_SHARPNESS, valstr); 598 } else { 599 CAMHAL_LOGEB("ERROR: Invalid Sharpness = %s", valstr); 600 ret = -EINVAL; 601 } 602 } 603 604 if ((valstr = params.get(TICameraParameters::KEY_SATURATION)) != NULL) { 605 if (params.getInt(TICameraParameters::KEY_SATURATION) >= 0 ) { 606 CAMHAL_LOGDB("Saturation set %s", valstr); 607 mParameters.set(TICameraParameters::KEY_SATURATION, valstr); 608 } else { 609 CAMHAL_LOGEB("ERROR: Invalid Saturation = %s", valstr); 610 ret = -EINVAL; 611 } 612 } 613 614 if ((valstr = params.get(TICameraParameters::KEY_BRIGHTNESS)) != NULL) { 615 if (params.getInt(TICameraParameters::KEY_BRIGHTNESS) >= 0 ) { 616 CAMHAL_LOGDB("Brightness set %s", valstr); 617 mParameters.set(TICameraParameters::KEY_BRIGHTNESS, valstr); 618 } else { 619 CAMHAL_LOGEB("ERROR: Invalid Brightness = %s", valstr); 620 ret = -EINVAL; 621 } 622 } 623 624 if ((valstr = params.get(CameraParameters::KEY_ANTIBANDING)) != NULL) { 625 if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING))) { 626 CAMHAL_LOGDB("Antibanding set %s", valstr); 627 mParameters.set(CameraParameters::KEY_ANTIBANDING, valstr); 628 } else { 629 CAMHAL_LOGEB("ERROR: Invalid Antibanding = %s", valstr); 630 ret = -EINVAL; 631 } 632 } 633 634 if ((valstr = params.get(TICameraParameters::KEY_ISO)) != NULL) { 635 if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES))) { 636 CAMHAL_LOGDB("ISO set %s", valstr); 637 mParameters.set(TICameraParameters::KEY_ISO, valstr); 638 } else { 639 CAMHAL_LOGEB("ERROR: Invalid ISO = %s", valstr); 640 ret = -EINVAL; 641 } 642 } 643 644 if ((valstr = params.get(CameraParameters::KEY_FOCUS_MODE)) != NULL) { 645 if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES))) { 646 CAMHAL_LOGDB("Focus mode set %s", params.get(CameraParameters::KEY_FOCUS_MODE)); 647 mParameters.set(CameraParameters::KEY_FOCUS_MODE, valstr); 648 } else { 649 CAMHAL_LOGEB("ERROR: Invalid FOCUS mode = %s", valstr); 650 ret = -EINVAL; 651 } 652 } 653 654 if( (valstr = params.get(CameraParameters::KEY_FOCUS_AREAS)) != NULL ) 655 { 656 CAMHAL_LOGEB("Focus areas position set %s", params.get(CameraParameters::KEY_FOCUS_AREAS)); 657 mParameters.set(CameraParameters::KEY_FOCUS_AREAS, valstr); 658 } 659 660 if( (valstr = params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)) != NULL ) 661 { 662 CAMHAL_LOGDB("Measurements set to %s", params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)); 663 mParameters.set(TICameraParameters::KEY_MEASUREMENT_ENABLE, valstr); 664 665 if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_ENABLE) == 0) 666 { 667 mMeasurementEnabled = true; 668 } 669 else if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_DISABLE) == 0) 670 { 671 mMeasurementEnabled = false; 672 } 673 else 674 { 675 mMeasurementEnabled = false; 676 } 677 678 } 679 680 if( (valstr = params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION)) != NULL) 681 { 682 CAMHAL_LOGDB("Exposure compensation set %s", params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION)); 683 mParameters.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, valstr); 684 } 685 686 if ((valstr = params.get(CameraParameters::KEY_SCENE_MODE)) != NULL) { 687 if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES))) { 688 CAMHAL_LOGDB("Scene mode set %s", valstr); 689 mParameters.set(CameraParameters::KEY_SCENE_MODE, valstr); 690 } else { 691 CAMHAL_LOGEB("ERROR: Invalid Scene mode = %s", valstr); 692 ret = -EINVAL; 693 } 694 } 695 696 if ((valstr = params.get(CameraParameters::KEY_FLASH_MODE)) != NULL) { 697 if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES))) { 698 CAMHAL_LOGDB("Flash mode set %s", valstr); 699 mParameters.set(CameraParameters::KEY_FLASH_MODE, valstr); 700 } else { 701 CAMHAL_LOGEB("ERROR: Invalid Flash mode = %s", valstr); 702 ret = -EINVAL; 703 } 704 } 705 706 if ((valstr = params.get(CameraParameters::KEY_EFFECT)) != NULL) { 707 if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS))) { 708 CAMHAL_LOGDB("Effect set %s", valstr); 709 mParameters.set(CameraParameters::KEY_EFFECT, valstr); 710 } else { 711 CAMHAL_LOGEB("ERROR: Invalid Effect = %s", valstr); 712 ret = -EINVAL; 713 } 714 } 715 716 if(( (valstr = params.get(CameraParameters::KEY_ROTATION)) != NULL) 717 && (params.getInt(CameraParameters::KEY_ROTATION) >=0)) 718 { 719 CAMHAL_LOGDB("Rotation set %s", params.get(CameraParameters::KEY_ROTATION)); 720 mParameters.set(CameraParameters::KEY_ROTATION, valstr); 721 } 722 723 if(( (valstr = params.get(CameraParameters::KEY_JPEG_QUALITY)) != NULL) 724 && (params.getInt(CameraParameters::KEY_JPEG_QUALITY) >=0)) 725 { 726 CAMHAL_LOGDB("Jpeg quality set %s", params.get(CameraParameters::KEY_JPEG_QUALITY)); 727 mParameters.set(CameraParameters::KEY_JPEG_QUALITY, valstr); 728 } 729 730 if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH)) != NULL) 731 && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH) >=0)) 732 { 733 CAMHAL_LOGDB("Thumbnail width set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH)); 734 mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, valstr); 735 } 736 737 if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT)) != NULL) 738 && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT) >=0)) 739 { 740 CAMHAL_LOGDB("Thumbnail width set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT)); 741 mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, valstr); 742 } 743 744 if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY)) != NULL ) 745 && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY) >=0)) 746 { 747 CAMHAL_LOGDB("Thumbnail quality set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY)); 748 mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, valstr); 749 } 750 751 if( (valstr = params.get(CameraParameters::KEY_GPS_LATITUDE)) != NULL ) 752 { 753 CAMHAL_LOGDB("GPS latitude set %s", params.get(CameraParameters::KEY_GPS_LATITUDE)); 754 mParameters.set(CameraParameters::KEY_GPS_LATITUDE, valstr); 755 }else{ 756 mParameters.remove(CameraParameters::KEY_GPS_LATITUDE); 757 } 758 759 if( (valstr = params.get(CameraParameters::KEY_GPS_LONGITUDE)) != NULL ) 760 { 761 CAMHAL_LOGDB("GPS longitude set %s", params.get(CameraParameters::KEY_GPS_LONGITUDE)); 762 mParameters.set(CameraParameters::KEY_GPS_LONGITUDE, valstr); 763 }else{ 764 mParameters.remove(CameraParameters::KEY_GPS_LONGITUDE); 765 } 766 767 if( (valstr = params.get(CameraParameters::KEY_GPS_ALTITUDE)) != NULL ) 768 { 769 CAMHAL_LOGDB("GPS altitude set %s", params.get(CameraParameters::KEY_GPS_ALTITUDE)); 770 mParameters.set(CameraParameters::KEY_GPS_ALTITUDE, valstr); 771 }else{ 772 mParameters.remove(CameraParameters::KEY_GPS_ALTITUDE); 773 } 774 775 if( (valstr = params.get(CameraParameters::KEY_GPS_TIMESTAMP)) != NULL ) 776 { 777 CAMHAL_LOGDB("GPS timestamp set %s", params.get(CameraParameters::KEY_GPS_TIMESTAMP)); 778 mParameters.set(CameraParameters::KEY_GPS_TIMESTAMP, valstr); 779 }else{ 780 mParameters.remove(CameraParameters::KEY_GPS_TIMESTAMP); 781 } 782 783 if( (valstr = params.get(TICameraParameters::KEY_GPS_DATESTAMP)) != NULL ) 784 { 785 CAMHAL_LOGDB("GPS datestamp set %s", params.get(TICameraParameters::KEY_GPS_DATESTAMP)); 786 mParameters.set(TICameraParameters::KEY_GPS_DATESTAMP, valstr); 787 }else{ 788 mParameters.remove(TICameraParameters::KEY_GPS_DATESTAMP); 789 } 790 791 if( (valstr = params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD)) != NULL ) 792 { 793 CAMHAL_LOGDB("GPS processing method set %s", params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD)); 794 mParameters.set(CameraParameters::KEY_GPS_PROCESSING_METHOD, valstr); 795 }else{ 796 mParameters.remove(CameraParameters::KEY_GPS_PROCESSING_METHOD); 797 } 798 799 if( (valstr = params.get(TICameraParameters::KEY_GPS_MAPDATUM )) != NULL ) 800 { 801 CAMHAL_LOGDB("GPS MAPDATUM set %s", params.get(TICameraParameters::KEY_GPS_MAPDATUM)); 802 mParameters.set(TICameraParameters::KEY_GPS_MAPDATUM, valstr); 803 }else{ 804 mParameters.remove(TICameraParameters::KEY_GPS_MAPDATUM); 805 } 806 807 if( (valstr = params.get(TICameraParameters::KEY_GPS_VERSION)) != NULL ) 808 { 809 CAMHAL_LOGDB("GPS MAPDATUM set %s", params.get(TICameraParameters::KEY_GPS_VERSION)); 810 mParameters.set(TICameraParameters::KEY_GPS_VERSION, valstr); 811 }else{ 812 mParameters.remove(TICameraParameters::KEY_GPS_VERSION); 813 } 814 815 if( (valstr = params.get(TICameraParameters::KEY_EXIF_MODEL)) != NULL ) 816 { 817 CAMHAL_LOGDB("EXIF Model set %s", params.get(TICameraParameters::KEY_EXIF_MODEL)); 818 mParameters.set(TICameraParameters::KEY_EXIF_MODEL, valstr); 819 } 820 821 if( (valstr = params.get(TICameraParameters::KEY_EXIF_MAKE)) != NULL ) 822 { 823 CAMHAL_LOGDB("EXIF Make set %s", params.get(TICameraParameters::KEY_EXIF_MAKE)); 824 mParameters.set(TICameraParameters::KEY_EXIF_MAKE, valstr); 825 } 826 827 if( (valstr = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)) != NULL ) 828 { 829 CAMHAL_LOGDB("Exposure Bracketing set %s", params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)); 830 mParameters.set(TICameraParameters::KEY_EXP_BRACKETING_RANGE, valstr); 831 } 832 else 833 { 834 mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE); 835 } 836 837 if ((valstr = params.get(CameraParameters::KEY_ZOOM)) != NULL ) { 838 if ((params.getInt(CameraParameters::KEY_ZOOM) >= 0 ) && 839 (params.getInt(CameraParameters::KEY_ZOOM) <= mMaxZoomSupported )) { 840 CAMHAL_LOGDB("Zoom set %s", valstr); 841 doesSetParameterNeedUpdate(valstr, 842 mParameters.get(CameraParameters::KEY_ZOOM), 843 updateRequired); 844 mParameters.set(CameraParameters::KEY_ZOOM, valstr); 845 } else { 846 CAMHAL_LOGEB("ERROR: Invalid Zoom: %s", valstr); 847 ret = -EINVAL; 848 } 849 } 850 851 if( (valstr = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)) != NULL ) 852 { 853 CAMHAL_LOGDB("Auto Exposure Lock set %s", params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); 854 doesSetParameterNeedUpdate(valstr, 855 mParameters.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK), 856 updateRequired); 857 mParameters.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, valstr); 858 } 859 860 if( (valstr = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) != NULL ) 861 { 862 CAMHAL_LOGDB("Auto WhiteBalance Lock set %s", params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); 863 doesSetParameterNeedUpdate(valstr, 864 mParameters.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK), 865 updateRequired); 866 mParameters.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, valstr); 867 } 868 if( (valstr = params.get(CameraParameters::KEY_METERING_AREAS)) != NULL ) 869 { 870 CAMHAL_LOGEB("Metering areas position set %s", params.get(CameraParameters::KEY_METERING_AREAS)); 871 mParameters.set(CameraParameters::KEY_METERING_AREAS, valstr); 872 } 873 874 CameraParameters adapterParams = mParameters; 875 876 // Only send parameters to adapter if preview is already 877 // enabled or doesSetParameterNeedUpdate says so. Initial setParameters to camera adapter, 878 // will be called in startPreview() 879 // TODO(XXX): Need to identify other parameters that need update from camera adapter 880 if ( (NULL != mCameraAdapter) && (mPreviewEnabled || updateRequired) ) { 881 ret |= mCameraAdapter->setParameters(adapterParams); 882 } 883 884 if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS) ) 885 { 886 int posBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS); 887 if ( 0 < posBracketRange ) 888 { 889 mBracketRangePositive = posBracketRange; 890 } 891 } 892 CAMHAL_LOGDB("Positive bracketing range %d", mBracketRangePositive); 893 894 895 if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG) ) 896 { 897 int negBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG); 898 if ( 0 < negBracketRange ) 899 { 900 mBracketRangeNegative = negBracketRange; 901 } 902 } 903 CAMHAL_LOGDB("Negative bracketing range %d", mBracketRangeNegative); 904 905 if( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL) && 906 ( strcmp(valstr, TICameraParameters::BRACKET_ENABLE) == 0 )) 907 { 908 if ( !mBracketingEnabled ) 909 { 910 CAMHAL_LOGDA("Enabling bracketing"); 911 mBracketingEnabled = true; 912 913 //Wait for AF events to enable bracketing 914 if ( NULL != mCameraAdapter ) 915 { 916 setEventProvider( CameraHalEvent::ALL_EVENTS, mCameraAdapter ); 917 } 918 } 919 else 920 { 921 CAMHAL_LOGDA("Bracketing already enabled"); 922 } 923 } 924 else if ( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL ) && 925 ( strcmp(valstr, TICameraParameters::BRACKET_DISABLE) == 0 )) 926 { 927 CAMHAL_LOGDA("Disabling bracketing"); 928 929 mBracketingEnabled = false; 930 stopImageBracketing(); 931 932 //Remove AF events subscription 933 if ( NULL != mEventProvider ) 934 { 935 mEventProvider->disableEventNotification( CameraHalEvent::ALL_EVENTS ); 936 delete mEventProvider; 937 mEventProvider = NULL; 938 } 939 940 } 941 942 if( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) && 943 ( strcmp(valstr, TICameraParameters::SHUTTER_ENABLE) == 0 )) 944 { 945 CAMHAL_LOGDA("Enabling shutter sound"); 946 947 mShutterEnabled = true; 948 mMsgEnabled |= CAMERA_MSG_SHUTTER; 949 mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr); 950 } 951 else if ( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) && 952 ( strcmp(valstr, TICameraParameters::SHUTTER_DISABLE) == 0 )) 953 { 954 CAMHAL_LOGDA("Disabling shutter sound"); 955 956 mShutterEnabled = false; 957 mMsgEnabled &= ~CAMERA_MSG_SHUTTER; 958 mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr); 959 } 960 961 } 962 963 //On fail restore old parameters 964 if ( NO_ERROR != ret ) { 965 mParameters.unflatten(oldParams.flatten()); 966 } 967 968 // Restart Preview if needed by KEY_RECODING_HINT only if preview is already running. 969 // If preview is not started yet, Video Mode parameters will take effect on next startPreview() 970 if(restartPreviewRequired && previewEnabled()) 971 { 972 CAMHAL_LOGDA("Restarting Preview as needed by KEY_RECODING_HINT"); 973 ret = restartPreview(); 974 } 975 if (ret != NO_ERROR) 976 { 977 CAMHAL_LOGEA("Failed to restart Preview"); 978 return ret; 979 } 980 981 LOG_FUNCTION_NAME_EXIT; 982 983 return ret; 984} 985 986status_t CameraHal::allocPreviewBufs(int width, int height, const char* previewFormat, 987 unsigned int buffercount, unsigned int &max_queueable) 988{ 989 status_t ret = NO_ERROR; 990 991 LOG_FUNCTION_NAME; 992 993 if(mDisplayAdapter.get() == NULL) 994 { 995 // Memory allocation of preview buffers is now placed in gralloc 996 // CameraHal should not allocate preview buffers without DisplayAdapter 997 return NO_MEMORY; 998 } 999 1000 if(!mPreviewBufs) 1001 { 1002 ///@todo Pluralise the name of this method to allocateBuffers 1003 mPreviewLength = 0; 1004 mPreviewBufs = (int32_t *) mDisplayAdapter->allocateBuffer(width, height, 1005 previewFormat, 1006 mPreviewLength, 1007 buffercount); 1008 1009 if (NULL == mPreviewBufs ) { 1010 CAMHAL_LOGEA("Couldn't allocate preview buffers"); 1011 return NO_MEMORY; 1012 } 1013 1014 mPreviewOffsets = (uint32_t *) mDisplayAdapter->getOffsets(); 1015 if ( NULL == mPreviewOffsets ) { 1016 CAMHAL_LOGEA("Buffer mapping failed"); 1017 return BAD_VALUE; 1018 } 1019 1020 mPreviewFd = mDisplayAdapter->getFd(); 1021 if ( -1 == mPreviewFd ) { 1022 CAMHAL_LOGEA("Invalid handle"); 1023 return BAD_VALUE; 1024 } 1025 1026 mBufProvider = (BufferProvider*) mDisplayAdapter.get(); 1027 1028 ret = mDisplayAdapter->maxQueueableBuffers(max_queueable); 1029 if (ret != NO_ERROR) { 1030 return ret; 1031 } 1032 1033 } 1034 1035 LOG_FUNCTION_NAME_EXIT; 1036 1037 return ret; 1038 1039} 1040 1041status_t CameraHal::freePreviewBufs() 1042{ 1043 status_t ret = NO_ERROR; 1044 LOG_FUNCTION_NAME; 1045 1046 CAMHAL_LOGDB("mPreviewBufs = 0x%x", (unsigned int)mPreviewBufs); 1047 if(mPreviewBufs) 1048 { 1049 ///@todo Pluralise the name of this method to freeBuffers 1050 ret = mBufProvider->freeBuffer(mPreviewBufs); 1051 mPreviewBufs = NULL; 1052 LOG_FUNCTION_NAME_EXIT; 1053 return ret; 1054 } 1055 LOG_FUNCTION_NAME_EXIT; 1056 return ret; 1057} 1058 1059 1060status_t CameraHal::allocPreviewDataBufs(size_t size, size_t bufferCount) 1061{ 1062 status_t ret = NO_ERROR; 1063 int bytes; 1064 1065 LOG_FUNCTION_NAME; 1066 1067 bytes = size; 1068 1069 if ( NO_ERROR == ret ) 1070 { 1071 if( NULL != mPreviewDataBufs ) 1072 { 1073 ret = freePreviewDataBufs(); 1074 } 1075 } 1076 1077 if ( NO_ERROR == ret ) 1078 { 1079 bytes = ((bytes+4095)/4096)*4096; 1080 mPreviewDataBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, NULL, bytes, bufferCount); 1081 1082 CAMHAL_LOGDB("Size of Preview data buffer = %d", bytes); 1083 if( NULL == mPreviewDataBufs ) 1084 { 1085 CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager"); 1086 ret = -NO_MEMORY; 1087 } 1088 else 1089 { 1090 bytes = size; 1091 } 1092 } 1093 1094 if ( NO_ERROR == ret ) 1095 { 1096 mPreviewDataFd = mMemoryManager->getFd(); 1097 mPreviewDataLength = bytes; 1098 mPreviewDataOffsets = mMemoryManager->getOffsets(); 1099 } 1100 else 1101 { 1102 mPreviewDataFd = -1; 1103 mPreviewDataLength = 0; 1104 mPreviewDataOffsets = NULL; 1105 } 1106 1107 LOG_FUNCTION_NAME; 1108 1109 return ret; 1110} 1111 1112status_t CameraHal::freePreviewDataBufs() 1113{ 1114 status_t ret = NO_ERROR; 1115 1116 LOG_FUNCTION_NAME; 1117 1118 if ( NO_ERROR == ret ) 1119 { 1120 1121 if( NULL != mPreviewDataBufs ) 1122 { 1123 1124 ///@todo Pluralise the name of this method to freeBuffers 1125 ret = mMemoryManager->freeBuffer(mPreviewDataBufs); 1126 mPreviewDataBufs = NULL; 1127 1128 } 1129 } 1130 1131 LOG_FUNCTION_NAME_EXIT; 1132 1133 return ret; 1134} 1135 1136status_t CameraHal::allocImageBufs(unsigned int width, unsigned int height, size_t size, const char* previewFormat, unsigned int bufferCount) 1137{ 1138 status_t ret = NO_ERROR; 1139 int bytes; 1140 1141 LOG_FUNCTION_NAME; 1142 1143 bytes = size; 1144 1145 ///Always allocate the buffers for image capture using MemoryManager 1146 if ( NO_ERROR == ret ) 1147 { 1148 if( ( NULL != mImageBufs ) ) 1149 { 1150 ret = freeImageBufs(); 1151 } 1152 } 1153 1154 if ( NO_ERROR == ret ) 1155 { 1156 bytes = ((bytes+4095)/4096)*4096; 1157 mImageBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, previewFormat, bytes, bufferCount); 1158 1159 CAMHAL_LOGDB("Size of Image cap buffer = %d", bytes); 1160 if( NULL == mImageBufs ) 1161 { 1162 CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager"); 1163 ret = -NO_MEMORY; 1164 } 1165 else 1166 { 1167 bytes = size; 1168 } 1169 } 1170 1171 if ( NO_ERROR == ret ) 1172 { 1173 mImageFd = mMemoryManager->getFd(); 1174 mImageLength = bytes; 1175 mImageOffsets = mMemoryManager->getOffsets(); 1176 } 1177 else 1178 { 1179 mImageFd = -1; 1180 mImageLength = 0; 1181 mImageOffsets = NULL; 1182 } 1183 1184 LOG_FUNCTION_NAME; 1185 1186 return ret; 1187} 1188 1189void endImageCapture( void *userData) 1190{ 1191 LOG_FUNCTION_NAME; 1192 1193 if ( NULL != userData ) 1194 { 1195 CameraHal *c = reinterpret_cast<CameraHal *>(userData); 1196 c->signalEndImageCapture(); 1197 } 1198 1199 LOG_FUNCTION_NAME_EXIT; 1200} 1201 1202void releaseImageBuffers(void *userData) 1203{ 1204 LOG_FUNCTION_NAME; 1205 1206// Make releaseImageBuffers a no-op for now because it is racing against AppCallbackNotifier 1207// in the home screen use-case. Image capture buffers are anyways reallocated on subsequent 1208// captures and also released as part of final camera hal cleanup 1209#if 0 1210 if ( NULL != userData ) 1211 { 1212 CameraHal *c = reinterpret_cast<CameraHal *>(userData); 1213 c->freeImageBufs(); 1214 } 1215#endif 1216 1217 LOG_FUNCTION_NAME_EXIT; 1218} 1219 1220status_t CameraHal::signalEndImageCapture() 1221{ 1222 status_t ret = NO_ERROR; 1223 int w,h; 1224 CameraParameters adapterParams = mParameters; 1225 Mutex::Autolock lock(mLock); 1226 1227 LOG_FUNCTION_NAME; 1228 1229 mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE); 1230 1231 LOG_FUNCTION_NAME_EXIT; 1232 1233 return ret; 1234} 1235 1236status_t CameraHal::freeImageBufs() 1237{ 1238 status_t ret = NO_ERROR; 1239 1240 LOG_FUNCTION_NAME; 1241 1242 if ( NO_ERROR == ret ) 1243 { 1244 1245 if( NULL != mImageBufs ) 1246 { 1247 1248 ///@todo Pluralise the name of this method to freeBuffers 1249 ret = mMemoryManager->freeBuffer(mImageBufs); 1250 mImageBufs = NULL; 1251 1252 } 1253 else 1254 { 1255 ret = -EINVAL; 1256 } 1257 1258 } 1259 1260 LOG_FUNCTION_NAME_EXIT; 1261 1262 return ret; 1263} 1264 1265 1266 1267/** 1268 @brief Start preview mode. 1269 1270 @param none 1271 @return NO_ERROR Camera switched to VF mode 1272 @todo Update function header with the different errors that are possible 1273 1274 */ 1275status_t CameraHal::startPreview() 1276{ 1277 1278 status_t ret = NO_ERROR; 1279 CameraAdapter::BuffersDescriptor desc; 1280 CameraFrame frame; 1281 const char *valstr = NULL; 1282 unsigned int required_buffer_count; 1283 unsigned int max_queueble_buffers; 1284 1285#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 1286 1287 gettimeofday(&mStartPreview, NULL); 1288 1289#endif 1290 1291 LOG_FUNCTION_NAME; 1292 1293 if ( mPreviewEnabled ) 1294 { 1295 CAMHAL_LOGDA("Preview already running"); 1296 1297 LOG_FUNCTION_NAME_EXIT; 1298 1299 return ALREADY_EXISTS; 1300 } 1301 1302 if ( NULL != mCameraAdapter ) { 1303 1304 ret = mCameraAdapter->setParameters(mParameters); 1305 } 1306 1307 ///If we don't have the preview callback enabled and display adapter, 1308 if(!mSetPreviewWindowCalled || (mDisplayAdapter.get() == NULL)) 1309 { 1310 CAMHAL_LOGEA("Preview not started. Preview in progress flag set"); 1311 mPreviewStartInProgress = true; 1312 return NO_ERROR; 1313 } 1314 1315 if( (mDisplayAdapter.get() != NULL) && ( !mPreviewEnabled ) && ( mDisplayPaused ) ) 1316 { 1317 CAMHAL_LOGDA("Preview is in paused state"); 1318 1319 mDisplayPaused = false; 1320 mPreviewEnabled = true; 1321 if ( NO_ERROR == ret ) 1322 { 1323 ret = mDisplayAdapter->pauseDisplay(mDisplayPaused); 1324 1325 if ( NO_ERROR != ret ) 1326 { 1327 CAMHAL_LOGEB("Display adapter resume failed %x", ret); 1328 } 1329 } 1330 //restart preview callbacks 1331 if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) 1332 { 1333 mAppCallbackNotifier->enableMsgType (CAMERA_MSG_PREVIEW_FRAME); 1334 } 1335 if ( mDynamicPreviewSwitch ) 1336 { 1337 forceStopPreview(); 1338 mDynamicPreviewSwitch = false; 1339 } 1340 else 1341 { 1342 return ret; 1343 } 1344 } 1345 1346 /// Ensure that buffers for preview are allocated before we start the camera 1347 ///Get the updated size from Camera Adapter, to account for padding etc 1348 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW, 1349 ( int ) &frame); 1350 if ( NO_ERROR != ret ) 1351 { 1352 return ret; 1353 } 1354 1355 ///Update the current preview width and height 1356 mPreviewWidth = frame.mWidth; 1357 mPreviewHeight = frame.mHeight; 1358 1359 //Update the padded width and height - required for VNF and VSTAB 1360 mParameters.set(TICameraParameters::KEY_PADDED_WIDTH, mPreviewWidth); 1361 mParameters.set(TICameraParameters::KEY_PADDED_HEIGHT, mPreviewHeight); 1362 1363 required_buffer_count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS)); 1364 1365 ///Allocate the preview buffers 1366 ret = allocPreviewBufs(frame.mWidth, frame.mHeight, mParameters.getPreviewFormat(), required_buffer_count, max_queueble_buffers); 1367 1368 if ( NO_ERROR != ret ) 1369 { 1370 CAMHAL_LOGEA("Couldn't allocate buffers for Preview"); 1371 goto error; 1372 } 1373 1374 if ( mMeasurementEnabled ) 1375 { 1376 1377 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA, 1378 ( int ) &frame, 1379 required_buffer_count); 1380 if ( NO_ERROR != ret ) 1381 { 1382 return ret; 1383 } 1384 1385 ///Allocate the preview data buffers 1386 ret = allocPreviewDataBufs(frame.mLength, required_buffer_count); 1387 if ( NO_ERROR != ret ) { 1388 CAMHAL_LOGEA("Couldn't allocate preview data buffers"); 1389 goto error; 1390 } 1391 1392 if ( NO_ERROR == ret ) 1393 { 1394 desc.mBuffers = mPreviewDataBufs; 1395 desc.mOffsets = mPreviewDataOffsets; 1396 desc.mFd = mPreviewDataFd; 1397 desc.mLength = mPreviewDataLength; 1398 desc.mCount = ( size_t ) required_buffer_count; 1399 desc.mMaxQueueable = (size_t) required_buffer_count; 1400 1401 mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA, 1402 ( int ) &desc); 1403 } 1404 1405 } 1406 1407 ///Pass the buffers to Camera Adapter 1408 desc.mBuffers = mPreviewBufs; 1409 desc.mOffsets = mPreviewOffsets; 1410 desc.mFd = mPreviewFd; 1411 desc.mLength = mPreviewLength; 1412 desc.mCount = ( size_t ) required_buffer_count; 1413 desc.mMaxQueueable = (size_t) max_queueble_buffers; 1414 1415 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW, 1416 ( int ) &desc); 1417 1418 if ( NO_ERROR != ret ) 1419 { 1420 CAMHAL_LOGEB("Failed to register preview buffers: 0x%x", ret); 1421 freePreviewBufs(); 1422 return ret; 1423 } 1424 1425 mAppCallbackNotifier->startPreviewCallbacks(mParameters, mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, required_buffer_count); 1426 1427 ///Start the callback notifier 1428 ret = mAppCallbackNotifier->start(); 1429 1430 if( ALREADY_EXISTS == ret ) 1431 { 1432 //Already running, do nothing 1433 CAMHAL_LOGDA("AppCallbackNotifier already running"); 1434 ret = NO_ERROR; 1435 } 1436 else if ( NO_ERROR == ret ) { 1437 CAMHAL_LOGDA("Started AppCallbackNotifier.."); 1438 mAppCallbackNotifier->setMeasurements(mMeasurementEnabled); 1439 } 1440 else 1441 { 1442 CAMHAL_LOGDA("Couldn't start AppCallbackNotifier"); 1443 goto error; 1444 } 1445 1446 ///Enable the display adapter if present, actual overlay enable happens when we post the buffer 1447 if(mDisplayAdapter.get() != NULL) 1448 { 1449 CAMHAL_LOGDA("Enabling display"); 1450 bool isS3d = false; 1451 DisplayAdapter::S3DParameters s3dParams; 1452 int width, height; 1453 mParameters.getPreviewSize(&width, &height); 1454#if 0 //TODO: s3d is not part of bringup...will reenable 1455 if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_SUPPORTED)) != NULL) { 1456 isS3d = (strcmp(valstr, "true") == 0); 1457 } 1458 if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D2D_PREVIEW)) != NULL) { 1459 if (strcmp(valstr, "off") == 0) 1460 { 1461 CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS OFF"); 1462 //TODO: obtain the frame packing configuration from camera or user settings 1463 //once side by side configuration is supported 1464 s3dParams.mode = OVERLAY_S3D_MODE_ON; 1465 s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER; 1466 s3dParams.order = OVERLAY_S3D_ORDER_LF; 1467 s3dParams.subSampling = OVERLAY_S3D_SS_NONE; 1468 } 1469 else 1470 { 1471 CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS ON"); 1472 s3dParams.mode = OVERLAY_S3D_MODE_OFF; 1473 s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER; 1474 s3dParams.order = OVERLAY_S3D_ORDER_LF; 1475 s3dParams.subSampling = OVERLAY_S3D_SS_NONE; 1476 } 1477 } 1478#endif //if 0 1479 1480#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 1481 1482 ret = mDisplayAdapter->enableDisplay(width, height, &mStartPreview, isS3d ? &s3dParams : NULL); 1483 1484#else 1485 1486 ret = mDisplayAdapter->enableDisplay(width, height, NULL, isS3d ? &s3dParams : NULL); 1487 1488#endif 1489 1490 if ( ret != NO_ERROR ) 1491 { 1492 CAMHAL_LOGEA("Couldn't enable display"); 1493 goto error; 1494 } 1495 1496 } 1497 1498 ///Send START_PREVIEW command to adapter 1499 CAMHAL_LOGDA("Starting CameraAdapter preview mode"); 1500 1501 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW); 1502 1503 if(ret!=NO_ERROR) 1504 { 1505 CAMHAL_LOGEA("Couldn't start preview w/ CameraAdapter"); 1506 goto error; 1507 } 1508 CAMHAL_LOGDA("Started preview"); 1509 1510 mPreviewEnabled = true; 1511 mPreviewStartInProgress = false; 1512 return ret; 1513 1514 error: 1515 1516 CAMHAL_LOGEA("Performing cleanup after error"); 1517 1518 //Do all the cleanup 1519 freePreviewBufs(); 1520 mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW); 1521 if(mDisplayAdapter.get() != NULL) 1522 { 1523 mDisplayAdapter->disableDisplay(false); 1524 } 1525 mAppCallbackNotifier->stop(); 1526 mPreviewStartInProgress = false; 1527 mPreviewEnabled = false; 1528 LOG_FUNCTION_NAME_EXIT; 1529 1530 return ret; 1531} 1532 1533/** 1534 @brief Sets ANativeWindow object. 1535 1536 Preview buffers provided to CameraHal via this object. DisplayAdapter will be interfacing with it 1537 to render buffers to display. 1538 1539 @param[in] window The ANativeWindow object created by Surface flinger 1540 @return NO_ERROR If the ANativeWindow object passes validation criteria 1541 @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios 1542 1543 */ 1544status_t CameraHal::setPreviewWindow(struct preview_stream_ops *window) 1545{ 1546 status_t ret = NO_ERROR; 1547 CameraAdapter::BuffersDescriptor desc; 1548 1549 LOG_FUNCTION_NAME; 1550 mSetPreviewWindowCalled = true; 1551 1552 ///If the Camera service passes a null window, we destroy existing window and free the DisplayAdapter 1553 if(!window) 1554 { 1555 if(mDisplayAdapter.get() != NULL) 1556 { 1557 ///NULL window passed, destroy the display adapter if present 1558 CAMHAL_LOGEA("NULL window passed, destroying display adapter"); 1559 mDisplayAdapter.clear(); 1560 ///@remarks If there was a window previously existing, we usually expect another valid window to be passed by the client 1561 ///@remarks so, we will wait until it passes a valid window to begin the preview again 1562 mSetPreviewWindowCalled = false; 1563 } 1564 CAMHAL_LOGEA("NULL ANativeWindow passed to setPreviewWindow"); 1565 return NO_ERROR; 1566 }else if(mDisplayAdapter.get() == NULL) 1567 { 1568 // Need to create the display adapter since it has not been created 1569 // Create display adapter 1570 mDisplayAdapter = new ANativeWindowDisplayAdapter(); 1571 ret = NO_ERROR; 1572 if(!mDisplayAdapter.get() || ((ret=mDisplayAdapter->initialize())!=NO_ERROR)) 1573 { 1574 if(ret!=NO_ERROR) 1575 { 1576 mDisplayAdapter.clear(); 1577 CAMHAL_LOGEA("DisplayAdapter initialize failed"); 1578 LOG_FUNCTION_NAME_EXIT; 1579 return ret; 1580 } 1581 else 1582 { 1583 CAMHAL_LOGEA("Couldn't create DisplayAdapter"); 1584 LOG_FUNCTION_NAME_EXIT; 1585 return NO_MEMORY; 1586 } 1587 } 1588 1589 // DisplayAdapter needs to know where to get the CameraFrames from inorder to display 1590 // Since CameraAdapter is the one that provides the frames, set it as the frame provider for DisplayAdapter 1591 mDisplayAdapter->setFrameProvider(mCameraAdapter); 1592 1593 // Any dynamic errors that happen during the camera use case has to be propagated back to the application 1594 // via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that notifies such errors to the application 1595 // Set it as the error handler for the DisplayAdapter 1596 mDisplayAdapter->setErrorHandler(mAppCallbackNotifier.get()); 1597 1598 // Update the display adapter with the new window that is passed from CameraService 1599 ret = mDisplayAdapter->setPreviewWindow(window); 1600 if(ret!=NO_ERROR) 1601 { 1602 CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret); 1603 } 1604 1605 if(mPreviewStartInProgress) 1606 { 1607 CAMHAL_LOGDA("setPreviewWindow called when preview running"); 1608 // Start the preview since the window is now available 1609 ret = startPreview(); 1610 } 1611 }else 1612 { 1613 /* If mDisplayAdpater is already created. No need to do anything. 1614 * We get a surface handle directly now, so we can reconfigure surface 1615 * itself in DisplayAdapter if dimensions have changed 1616 */ 1617 } 1618 LOG_FUNCTION_NAME_EXIT; 1619 1620 return ret; 1621 1622} 1623 1624 1625/** 1626 @brief Stop a previously started preview. 1627 1628 @param none 1629 @return none 1630 1631 */ 1632void CameraHal::stopPreview() 1633{ 1634 LOG_FUNCTION_NAME; 1635 1636 if(!previewEnabled() && !mDisplayPaused) 1637 { 1638 LOG_FUNCTION_NAME_EXIT; 1639 return; 1640 } 1641 1642 bool imageCaptureRunning = (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE) && 1643 (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE); 1644 if(mDisplayPaused && !imageCaptureRunning) 1645 { 1646 // Display is paused, which essentially means there is no preview active. 1647 // Note: this is done so that when stopPreview is called by client after 1648 // an image capture, we do not de-initialize the camera adapter and 1649 // restart over again. 1650 1651 // Since we are not calling CameraAdapter->stopPreview, we need to 1652 // explicitly release the 3A locks in this first level stopPreview call 1653 // before returning 1654 if ( NULL != mCameraAdapter ) { 1655 CameraParameters adapterParams = mParameters; 1656 1657 adapterParams.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, CameraParameters::FALSE); 1658 adapterParams.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, CameraParameters::FALSE); 1659 mCameraAdapter->setParameters(adapterParams); 1660 } 1661 1662 return; 1663 } 1664 1665 forceStopPreview(); 1666 1667 // Reset Capture-Mode to default, so that when we switch from VideoRecording 1668 // to ImageCapture, CAPTURE_MODE is not left to VIDEO_MODE. 1669 CAMHAL_LOGDA("Resetting Capture-Mode to default"); 1670 mParameters.set(TICameraParameters::KEY_CAP_MODE, ""); 1671 1672 LOG_FUNCTION_NAME_EXIT; 1673} 1674 1675/** 1676 @brief Returns true if preview is enabled 1677 1678 @param none 1679 @return true If preview is running currently 1680 false If preview has been stopped 1681 1682 */ 1683bool CameraHal::previewEnabled() 1684{ 1685 LOG_FUNCTION_NAME; 1686 1687 return (mPreviewEnabled || mPreviewStartInProgress); 1688} 1689 1690/** 1691 @brief Start record mode. 1692 1693 When a record image is available a CAMERA_MSG_VIDEO_FRAME message is sent with 1694 the corresponding frame. Every record frame must be released by calling 1695 releaseRecordingFrame(). 1696 1697 @param none 1698 @return NO_ERROR If recording could be started without any issues 1699 @todo Update the header with possible error values in failure scenarios 1700 1701 */ 1702status_t CameraHal::startRecording( ) 1703{ 1704 int w, h; 1705 const char *valstr = NULL; 1706 bool restartPreviewRequired = false; 1707 status_t ret = NO_ERROR; 1708 1709 LOG_FUNCTION_NAME; 1710 1711 1712#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 1713 1714 gettimeofday(&mStartPreview, NULL); 1715 1716#endif 1717 1718 if(!previewEnabled()) 1719 { 1720 return NO_INIT; 1721 } 1722 1723 valstr = mParameters.get(CameraParameters::KEY_RECORDING_HINT); 1724 if ( (valstr == NULL) || 1725 ( (valstr != NULL) && (strcmp(valstr, CameraParameters::TRUE) != 0) ) ) 1726 { 1727 restartPreviewRequired = setVideoModeParameters(); 1728 1729 if(restartPreviewRequired) 1730 { 1731 ret = restartPreview(); 1732 } 1733 } 1734 1735 if ( NO_ERROR == ret ) 1736 { 1737 ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS))); 1738 } 1739 1740 if ( NO_ERROR == ret ) 1741 { 1742 ret = mAppCallbackNotifier->startRecording(); 1743 } 1744 1745 if ( NO_ERROR == ret ) 1746 { 1747 ///Buffers for video capture (if different from preview) are expected to be allocated within CameraAdapter 1748 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_VIDEO); 1749 } 1750 1751 if ( NO_ERROR == ret ) 1752 { 1753 mRecordingEnabled = true; 1754 } 1755 1756 LOG_FUNCTION_NAME_EXIT; 1757 1758 return ret; 1759} 1760 1761/** 1762 @brief Set the camera parameters specific to Video Recording. 1763 1764 This function checks for the camera parameters which have to be set for recording. 1765 Video Recording needs CAPTURE_MODE to be VIDEO_MODE. This function sets it. 1766 This function also enables Video Recording specific functions like VSTAB & VNF. 1767 1768 @param none 1769 @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect. 1770 @todo Modify the policies for enabling VSTAB & VNF usecase based later. 1771 1772 */ 1773bool CameraHal::setVideoModeParameters() 1774{ 1775 const char *valstr = NULL; 1776 bool restartPreviewRequired = false; 1777 status_t ret = NO_ERROR; 1778 1779 LOG_FUNCTION_NAME; 1780 1781 // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview 1782 valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE); 1783 if ( (valstr == NULL) || 1784 ( (valstr != NULL) && (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) != 0) ) ) 1785 { 1786 CAMHAL_LOGDA("Set CAPTURE_MODE to VIDEO_MODE"); 1787 mParameters.set(TICameraParameters::KEY_CAP_MODE, (const char *) TICameraParameters::VIDEO_MODE); 1788 restartPreviewRequired = true; 1789 } 1790 1791 // Check if CAPTURE_MODE is VIDEO_MODE, since VSTAB & VNF work only in VIDEO_MODE. 1792 valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE); 1793 if (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) == 0) 1794 { 1795 // Enable VSTAB, if not enabled already 1796 valstr = mParameters.get(TICameraParameters::KEY_VSTAB); 1797 if ( (valstr == NULL) || 1798 ( (valstr != NULL) && (strcmp(valstr, "1") != 0) ) ) 1799 { 1800 CAMHAL_LOGDA("Enable VSTAB"); 1801 mParameters.set(TICameraParameters::KEY_VSTAB, "1"); 1802 restartPreviewRequired = true; 1803 } 1804 1805 // Enable VNF, if not enabled already 1806 valstr = mParameters.get(TICameraParameters::KEY_VNF); 1807 if ( (valstr == NULL) || 1808 ( (valstr != NULL) && (strcmp(valstr, "1") != 0) ) ) 1809 { 1810 CAMHAL_LOGDA("Enable VNF"); 1811 mParameters.set(TICameraParameters::KEY_VNF, "1"); 1812 restartPreviewRequired = true; 1813 } 1814 1815 // For VSTAB alone for 1080p resolution, padded width goes > 2048, which cannot be rendered by GPU. 1816 // In such case, there is support in Ducati for combination of VSTAB & VNF requiring padded width < 2048. 1817 // So we are forcefully enabling VNF, if VSTAB is enabled for 1080p resolution. 1818 valstr = mParameters.get(TICameraParameters::KEY_VSTAB); 1819 if ((valstr != NULL) && (strcmp(valstr, "1") == 0) && (mPreviewWidth == 1920)) 1820 { 1821 CAMHAL_LOGDA("Force Enable VNF for 1080p"); 1822 mParameters.set(TICameraParameters::KEY_VNF, "1"); 1823 restartPreviewRequired = true; 1824 } 1825 } 1826 1827 LOG_FUNCTION_NAME_EXIT; 1828 1829 return restartPreviewRequired; 1830} 1831 1832/** 1833 @brief Reset the camera parameters specific to Video Recording. 1834 1835 This function resets CAPTURE_MODE and disables Recording specific functions like VSTAB & VNF. 1836 1837 @param none 1838 @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect. 1839 1840 */ 1841bool CameraHal::resetVideoModeParameters() 1842{ 1843 const char *valstr = NULL; 1844 bool restartPreviewRequired = false; 1845 status_t ret = NO_ERROR; 1846 1847 LOG_FUNCTION_NAME; 1848 1849 // ignore this if we are already recording 1850 if (mRecordingEnabled) { 1851 return false; 1852 } 1853 1854 // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview 1855 valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE); 1856 if ( (valstr != NULL) && (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) == 0) ) 1857 { 1858 CAMHAL_LOGDA("Reset Capture-Mode to default"); 1859 mParameters.set(TICameraParameters::KEY_CAP_MODE, ""); 1860 restartPreviewRequired = true; 1861 } 1862 1863 // Enable VSTAB, if not enabled already 1864 valstr = mParameters.get(TICameraParameters::KEY_VSTAB); 1865 if ( (valstr != NULL) && (strcmp(valstr, "1") == 0) ) 1866 { 1867 CAMHAL_LOGDA("Disable VSTAB"); 1868 mParameters.set(TICameraParameters::KEY_VSTAB, "0"); 1869 restartPreviewRequired = true; 1870 } 1871 1872 // Enable VNF, if not enabled already 1873 valstr = mParameters.get(TICameraParameters::KEY_VNF); 1874 if ( (valstr != NULL) && (strcmp(valstr, "1") == 0) ) 1875 { 1876 CAMHAL_LOGDA("Disable VNF"); 1877 mParameters.set(TICameraParameters::KEY_VNF, "0"); 1878 restartPreviewRequired = true; 1879 } 1880 1881 LOG_FUNCTION_NAME_EXIT; 1882 1883 return restartPreviewRequired; 1884} 1885 1886/** 1887 @brief Restart the preview with setParameter. 1888 1889 This function restarts preview, for some VIDEO_MODE parameters to take effect. 1890 1891 @param none 1892 @return NO_ERROR If recording parameters could be set without any issues 1893 1894 */ 1895status_t CameraHal::restartPreview() 1896{ 1897 const char *valstr = NULL; 1898 char tmpvalstr[30]; 1899 status_t ret = NO_ERROR; 1900 1901 LOG_FUNCTION_NAME; 1902 1903 // Retain CAPTURE_MODE before calling stopPreview(), since it is reset in stopPreview(). 1904 tmpvalstr[0] = 0; 1905 valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE); 1906 if(valstr != NULL) 1907 { 1908 if(sizeof(tmpvalstr) < (strlen(valstr)+1)) 1909 { 1910 return -EINVAL; 1911 } 1912 1913 strncpy(tmpvalstr, valstr, sizeof(tmpvalstr)); 1914 tmpvalstr[sizeof(tmpvalstr)-1] = 0; 1915 } 1916 1917 stopPreview(); 1918 1919 { 1920 Mutex::Autolock lock(mLock); 1921 mParameters.set(TICameraParameters::KEY_CAP_MODE, tmpvalstr); 1922 mCameraAdapter->setParameters(mParameters); 1923 } 1924 1925 ret = startPreview(); 1926 1927 LOG_FUNCTION_NAME_EXIT; 1928 1929 return ret; 1930} 1931 1932/** 1933 @brief Stop a previously started recording. 1934 1935 @param none 1936 @return none 1937 1938 */ 1939void CameraHal::stopRecording() 1940{ 1941 CameraAdapter::AdapterState currentState; 1942 1943 LOG_FUNCTION_NAME; 1944 1945 Mutex::Autolock lock(mLock); 1946 1947 if (!mRecordingEnabled ) 1948 { 1949 return; 1950 } 1951 1952 currentState = mCameraAdapter->getState(); 1953 if (currentState == CameraAdapter::VIDEO_CAPTURE_STATE) { 1954 mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE); 1955 } 1956 1957 mAppCallbackNotifier->stopRecording(); 1958 1959 mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_VIDEO); 1960 1961 mRecordingEnabled = false; 1962 1963 LOG_FUNCTION_NAME_EXIT; 1964} 1965 1966/** 1967 @brief Returns true if recording is enabled. 1968 1969 @param none 1970 @return true If recording is currently running 1971 false If recording has been stopped 1972 1973 */ 1974int CameraHal::recordingEnabled() 1975{ 1976 LOG_FUNCTION_NAME; 1977 1978 LOG_FUNCTION_NAME_EXIT; 1979 1980 return mRecordingEnabled; 1981} 1982 1983/** 1984 @brief Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME. 1985 1986 @param[in] mem MemoryBase pointer to the frame being released. Must be one of the buffers 1987 previously given by CameraHal 1988 @return none 1989 1990 */ 1991void CameraHal::releaseRecordingFrame(const void* mem) 1992{ 1993 LOG_FUNCTION_NAME; 1994 1995 //CAMHAL_LOGDB(" 0x%x", mem->pointer()); 1996 1997 if ( ( mRecordingEnabled ) && mem != NULL) 1998 { 1999 mAppCallbackNotifier->releaseRecordingFrame(mem); 2000 } 2001 2002 LOG_FUNCTION_NAME_EXIT; 2003 2004 return; 2005} 2006 2007/** 2008 @brief Start auto focus 2009 2010 This call asynchronous. 2011 The notification callback routine is called with CAMERA_MSG_FOCUS once when 2012 focusing is complete. autoFocus() will be called again if another auto focus is 2013 needed. 2014 2015 @param none 2016 @return NO_ERROR 2017 @todo Define the error codes if the focus is not locked 2018 2019 */ 2020status_t CameraHal::autoFocus() 2021{ 2022 status_t ret = NO_ERROR; 2023 2024#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 2025 2026 gettimeofday(&mStartFocus, NULL); 2027 2028#endif 2029 2030 2031 LOG_FUNCTION_NAME; 2032 2033 if ( NULL != mCameraAdapter ) 2034 { 2035 2036#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 2037 2038 //pass the autoFocus timestamp along with the command to camera adapter 2039 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS, ( int ) &mStartFocus); 2040 2041#else 2042 2043 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS); 2044 2045#endif 2046 2047 } 2048 else 2049 { 2050 ret = -1; 2051 } 2052 2053 LOG_FUNCTION_NAME_EXIT; 2054 2055 return ret; 2056} 2057 2058/** 2059 @brief Cancels auto-focus function. 2060 2061 If the auto-focus is still in progress, this function will cancel it. 2062 Whether the auto-focus is in progress or not, this function will return the 2063 focus position to the default. If the camera does not support auto-focus, this is a no-op. 2064 2065 2066 @param none 2067 @return NO_ERROR If the cancel succeeded 2068 @todo Define error codes if cancel didnt succeed 2069 2070 */ 2071status_t CameraHal::cancelAutoFocus() 2072{ 2073 LOG_FUNCTION_NAME; 2074 if( NULL != mCameraAdapter ) 2075 { 2076 mCameraAdapter->sendCommand(CameraAdapter::CAMERA_CANCEL_AUTOFOCUS); 2077 } 2078 LOG_FUNCTION_NAME_EXIT; 2079 return NO_ERROR; 2080} 2081 2082void CameraHal::setEventProvider(int32_t eventMask, MessageNotifier * eventNotifier) 2083{ 2084 2085 LOG_FUNCTION_NAME; 2086 2087 if ( NULL != mEventProvider ) 2088 { 2089 mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS); 2090 delete mEventProvider; 2091 mEventProvider = NULL; 2092 } 2093 2094 mEventProvider = new EventProvider(eventNotifier, this, eventCallbackRelay); 2095 if ( NULL == mEventProvider ) 2096 { 2097 CAMHAL_LOGEA("Error in creating EventProvider"); 2098 } 2099 else 2100 { 2101 mEventProvider->enableEventNotification(eventMask); 2102 } 2103 2104 LOG_FUNCTION_NAME_EXIT; 2105} 2106 2107void CameraHal::eventCallbackRelay(CameraHalEvent* event) 2108{ 2109 LOG_FUNCTION_NAME; 2110 2111 CameraHal *appcbn = ( CameraHal * ) (event->mCookie); 2112 appcbn->eventCallback(event ); 2113 2114 LOG_FUNCTION_NAME_EXIT; 2115} 2116 2117void CameraHal::eventCallback(CameraHalEvent* event) 2118{ 2119 LOG_FUNCTION_NAME; 2120 2121 if ( NULL != event ) 2122 { 2123 switch( event->mEventType ) 2124 { 2125 case CameraHalEvent::EVENT_FOCUS_LOCKED: 2126 case CameraHalEvent::EVENT_FOCUS_ERROR: 2127 { 2128 if ( mBracketingEnabled ) 2129 { 2130 startImageBracketing(); 2131 } 2132 break; 2133 } 2134 default: 2135 { 2136 break; 2137 } 2138 }; 2139 } 2140 2141 LOG_FUNCTION_NAME_EXIT; 2142} 2143 2144status_t CameraHal::startImageBracketing() 2145{ 2146 status_t ret = NO_ERROR; 2147 CameraFrame frame; 2148 CameraAdapter::BuffersDescriptor desc; 2149 2150#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 2151 2152 gettimeofday(&mStartCapture, NULL); 2153 2154#endif 2155 2156 LOG_FUNCTION_NAME; 2157 2158 if(!previewEnabled() && !mDisplayPaused) 2159 { 2160 LOG_FUNCTION_NAME_EXIT; 2161 return NO_INIT; 2162 } 2163 2164 if ( !mBracketingEnabled ) 2165 { 2166 return ret; 2167 } 2168 2169 if ( NO_ERROR == ret ) 2170 { 2171 mBracketingRunning = true; 2172 } 2173 2174 if ( (NO_ERROR == ret) && ( NULL != mCameraAdapter ) ) 2175 { 2176 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE, 2177 ( int ) &frame, 2178 ( mBracketRangeNegative + 1 )); 2179 2180 if ( NO_ERROR != ret ) 2181 { 2182 CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret); 2183 } 2184 } 2185 2186 if ( NO_ERROR == ret ) 2187 { 2188 if ( NULL != mAppCallbackNotifier.get() ) 2189 { 2190 mAppCallbackNotifier->setBurst(true); 2191 } 2192 } 2193 2194 if ( NO_ERROR == ret ) 2195 { 2196 mParameters.getPictureSize(( int * ) &frame.mWidth, 2197 ( int * ) &frame.mHeight); 2198 2199 ret = allocImageBufs(frame.mWidth, 2200 frame.mHeight, 2201 frame.mLength, 2202 mParameters.getPictureFormat(), 2203 ( mBracketRangeNegative + 1 )); 2204 if ( NO_ERROR != ret ) 2205 { 2206 CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret); 2207 } 2208 } 2209 2210 if ( (NO_ERROR == ret) && ( NULL != mCameraAdapter ) ) 2211 { 2212 2213 desc.mBuffers = mImageBufs; 2214 desc.mOffsets = mImageOffsets; 2215 desc.mFd = mImageFd; 2216 desc.mLength = mImageLength; 2217 desc.mCount = ( size_t ) ( mBracketRangeNegative + 1 ); 2218 desc.mMaxQueueable = ( size_t ) ( mBracketRangeNegative + 1 ); 2219 2220 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE, 2221 ( int ) &desc); 2222 2223 if ( NO_ERROR == ret ) 2224 { 2225 2226#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 2227 2228 //pass capture timestamp along with the camera adapter command 2229 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE, ( mBracketRangePositive + 1 ), (int) &mStartCapture); 2230 2231#else 2232 2233 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE, ( mBracketRangePositive + 1 )); 2234 2235#endif 2236 2237 } 2238 } 2239 2240 return ret; 2241} 2242 2243status_t CameraHal::stopImageBracketing() 2244{ 2245 status_t ret = NO_ERROR; 2246 2247 LOG_FUNCTION_NAME; 2248 2249 if ( !mBracketingRunning ) 2250 { 2251 return ret; 2252 } 2253 2254 if ( NO_ERROR == ret ) 2255 { 2256 mBracketingRunning = false; 2257 } 2258 2259 if(!previewEnabled() && !mDisplayPaused) 2260 { 2261 return NO_INIT; 2262 } 2263 2264 if ( NO_ERROR == ret ) 2265 { 2266 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE); 2267 } 2268 2269 LOG_FUNCTION_NAME_EXIT; 2270 2271 return ret; 2272} 2273 2274/** 2275 @brief Take a picture. 2276 2277 @param none 2278 @return NO_ERROR If able to switch to image capture 2279 @todo Define error codes if unable to switch to image capture 2280 2281 */ 2282status_t CameraHal::takePicture( ) 2283{ 2284 status_t ret = NO_ERROR; 2285 CameraFrame frame; 2286 CameraAdapter::BuffersDescriptor desc; 2287 int burst; 2288 const char *valstr = NULL; 2289 unsigned int bufferCount = 1; 2290 2291 Mutex::Autolock lock(mLock); 2292 2293#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 2294 2295 gettimeofday(&mStartCapture, NULL); 2296 2297#endif 2298 2299 LOG_FUNCTION_NAME; 2300 2301 if(!previewEnabled() && !mDisplayPaused) 2302 { 2303 LOG_FUNCTION_NAME_EXIT; 2304 CAMHAL_LOGEA("Preview not started..."); 2305 return NO_INIT; 2306 } 2307 2308 // return error if we are already capturing 2309 if ( (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE && 2310 mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE) || 2311 (mCameraAdapter->getState() == CameraAdapter::VIDEO_CAPTURE_STATE && 2312 mCameraAdapter->getNextState() != CameraAdapter::VIDEO_STATE) ) { 2313 CAMHAL_LOGEA("Already capturing an image..."); 2314 return NO_INIT; 2315 } 2316 2317 // we only support video snapshot if we are in video mode (recording hint is set) 2318 valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE); 2319 if ( (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE) && 2320 (valstr && strcmp(valstr, TICameraParameters::VIDEO_MODE)) ) { 2321 CAMHAL_LOGEA("Trying to capture while recording without recording hint set..."); 2322 return INVALID_OPERATION; 2323 } 2324 2325 if ( !mBracketingRunning ) 2326 { 2327 2328 if ( NO_ERROR == ret ) 2329 { 2330 burst = mParameters.getInt(TICameraParameters::KEY_BURST); 2331 } 2332 2333 //Allocate all buffers only in burst capture case 2334 if ( burst > 1 ) 2335 { 2336 bufferCount = CameraHal::NO_BUFFERS_IMAGE_CAPTURE; 2337 if ( NULL != mAppCallbackNotifier.get() ) 2338 { 2339 mAppCallbackNotifier->setBurst(true); 2340 } 2341 } 2342 else 2343 { 2344 if ( NULL != mAppCallbackNotifier.get() ) 2345 { 2346 mAppCallbackNotifier->setBurst(false); 2347 } 2348 } 2349 2350 // pause preview during normal image capture 2351 // do not pause preview if recording (video state) 2352 if (NO_ERROR == ret && 2353 NULL != mDisplayAdapter.get() && 2354 burst < 1) { 2355 if (mCameraAdapter->getState() != CameraAdapter::VIDEO_STATE) { 2356 mDisplayPaused = true; 2357 mPreviewEnabled = false; 2358 ret = mDisplayAdapter->pauseDisplay(mDisplayPaused); 2359 // since preview is paused we should stop sending preview frames too 2360 if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) { 2361 mAppCallbackNotifier->disableMsgType (CAMERA_MSG_PREVIEW_FRAME); 2362 } 2363 } 2364 2365#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 2366 mDisplayAdapter->setSnapshotTimeRef(&mStartCapture); 2367#endif 2368 } 2369 2370 if ( (NO_ERROR == ret) && (NULL != mCameraAdapter) ) 2371 { 2372 if ( NO_ERROR == ret ) 2373 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE, 2374 ( int ) &frame, 2375 bufferCount); 2376 2377 if ( NO_ERROR != ret ) 2378 { 2379 CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret); 2380 } 2381 } 2382 2383 if ( NO_ERROR == ret ) 2384 { 2385 mParameters.getPictureSize(( int * ) &frame.mWidth, 2386 ( int * ) &frame.mHeight); 2387 2388 ret = allocImageBufs(frame.mWidth, 2389 frame.mHeight, 2390 frame.mLength, 2391 mParameters.getPictureFormat(), 2392 bufferCount); 2393 if ( NO_ERROR != ret ) 2394 { 2395 CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret); 2396 } 2397 } 2398 2399 if ( (NO_ERROR == ret) && ( NULL != mCameraAdapter ) ) 2400 { 2401 desc.mBuffers = mImageBufs; 2402 desc.mOffsets = mImageOffsets; 2403 desc.mFd = mImageFd; 2404 desc.mLength = mImageLength; 2405 desc.mCount = ( size_t ) bufferCount; 2406 desc.mMaxQueueable = ( size_t ) bufferCount; 2407 2408 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE, 2409 ( int ) &desc); 2410 } 2411 } 2412 else 2413 { 2414 mBracketingRunning = false; 2415 } 2416 2417 if ( ( NO_ERROR == ret ) && ( NULL != mCameraAdapter ) ) 2418 { 2419 2420#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 2421 2422 //pass capture timestamp along with the camera adapter command 2423 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE, (int) &mStartCapture); 2424 2425#else 2426 2427 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE); 2428 2429#endif 2430 2431 } 2432 2433 return ret; 2434} 2435 2436/** 2437 @brief Cancel a picture that was started with takePicture. 2438 2439 Calling this method when no picture is being taken is a no-op. 2440 2441 @param none 2442 @return NO_ERROR If cancel succeeded. Cancel can succeed if image callback is not sent 2443 @todo Define error codes 2444 2445 */ 2446status_t CameraHal::cancelPicture( ) 2447{ 2448 LOG_FUNCTION_NAME; 2449 2450 Mutex::Autolock lock(mLock); 2451 2452 mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE); 2453 2454 return NO_ERROR; 2455} 2456 2457/** 2458 @brief Return the camera parameters. 2459 2460 @param none 2461 @return Currently configured camera parameters 2462 2463 */ 2464char* CameraHal::getParameters() 2465{ 2466 String8 params_str8; 2467 char* params_string; 2468 2469 LOG_FUNCTION_NAME; 2470 2471 if( NULL != mCameraAdapter ) 2472 { 2473 mCameraAdapter->getParameters(mParameters); 2474 } 2475 2476 2477 params_str8 = mParameters.flatten(); 2478 2479 // camera service frees this string... 2480 params_string = (char*) malloc(sizeof(char) * (params_str8.length()+1)); 2481 strcpy(params_string, params_str8.string()); 2482 2483 LOG_FUNCTION_NAME_EXIT; 2484 2485 ///Return the current set of parameters 2486 2487 return params_string; 2488} 2489 2490void CameraHal::putParameters(char *parms) 2491{ 2492 free(parms); 2493} 2494 2495/** 2496 @brief Send command to camera driver. 2497 2498 @param none 2499 @return NO_ERROR If the command succeeds 2500 @todo Define the error codes that this function can return 2501 2502 */ 2503status_t CameraHal::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) 2504{ 2505 status_t ret = NO_ERROR; 2506 2507 LOG_FUNCTION_NAME; 2508 2509 2510 if ( ( NO_ERROR == ret ) && ( NULL == mCameraAdapter ) ) 2511 { 2512 CAMHAL_LOGEA("No CameraAdapter instance"); 2513 ret = -EINVAL; 2514 } 2515 2516 if ( ( NO_ERROR == ret ) && ( !previewEnabled() )) 2517 { 2518 CAMHAL_LOGEA("Preview is not running"); 2519 ret = -EINVAL; 2520 } 2521 2522 if ( NO_ERROR == ret ) 2523 { 2524 switch(cmd) 2525 { 2526 case CAMERA_CMD_START_SMOOTH_ZOOM: 2527 2528 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_SMOOTH_ZOOM, arg1); 2529 2530 break; 2531 case CAMERA_CMD_STOP_SMOOTH_ZOOM: 2532 2533 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM); 2534 2535 case CAMERA_CMD_START_FACE_DETECTION: 2536 2537 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_FD); 2538 2539 break; 2540 2541 case CAMERA_CMD_STOP_FACE_DETECTION: 2542 2543 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD); 2544 2545 break; 2546 2547 default: 2548 break; 2549 }; 2550 } 2551 2552 LOG_FUNCTION_NAME_EXIT; 2553 2554 return ret; 2555} 2556 2557/** 2558 @brief Release the hardware resources owned by this object. 2559 2560 Note that this is *not* done in the destructor. 2561 2562 @param none 2563 @return none 2564 2565 */ 2566void CameraHal::release() 2567{ 2568 LOG_FUNCTION_NAME; 2569 ///@todo Investigate on how release is used by CameraService. Vaguely remember that this is called 2570 ///just before CameraHal object destruction 2571 deinitialize(); 2572 LOG_FUNCTION_NAME_EXIT; 2573} 2574 2575 2576/** 2577 @brief Dump state of the camera hardware 2578 2579 @param[in] fd File descriptor 2580 @param[in] args Arguments 2581 @return NO_ERROR Dump succeeded 2582 @todo Error codes for dump fail 2583 2584 */ 2585status_t CameraHal::dump(int fd) const 2586{ 2587 LOG_FUNCTION_NAME; 2588 ///Implement this method when the h/w dump function is supported on Ducati side 2589 return NO_ERROR; 2590} 2591 2592/*-------------Camera Hal Interface Method definitions ENDS here--------------------*/ 2593 2594 2595 2596 2597/*-------------Camera Hal Internal Method definitions STARTS here--------------------*/ 2598 2599/** 2600 @brief Constructor of CameraHal 2601 2602 Member variables are initialized here. No allocations should be done here as we 2603 don't use c++ exceptions in the code. 2604 2605 */ 2606CameraHal::CameraHal(int cameraId) 2607{ 2608 LOG_FUNCTION_NAME; 2609 2610 ///Initialize all the member variables to their defaults 2611 mPreviewEnabled = false; 2612 mPreviewBufs = NULL; 2613 mImageBufs = NULL; 2614 mBufProvider = NULL; 2615 mPreviewStartInProgress = false; 2616 mVideoBufs = NULL; 2617 mVideoBufProvider = NULL; 2618 mRecordingEnabled = false; 2619 mDisplayPaused = false; 2620 mSetPreviewWindowCalled = false; 2621 mMsgEnabled = 0; 2622 mAppCallbackNotifier = NULL; 2623 mMemoryManager = NULL; 2624 mCameraAdapter = NULL; 2625 mBracketingEnabled = false; 2626 mBracketingRunning = false; 2627 mEventProvider = NULL; 2628 mBracketRangePositive = 1; 2629 mBracketRangeNegative = 1; 2630 mMaxZoomSupported = 0; 2631 mShutterEnabled = true; 2632 mMeasurementEnabled = false; 2633 mPreviewDataBufs = NULL; 2634 mCameraProperties = NULL; 2635 mCurrentTime = 0; 2636 mFalsePreview = 0; 2637 mImageOffsets = NULL; 2638 mImageLength = 0; 2639 mImageFd = 0; 2640 mVideoOffsets = NULL; 2641 mVideoFd = 0; 2642 mVideoLength = 0; 2643 mPreviewDataOffsets = NULL; 2644 mPreviewDataFd = 0; 2645 mPreviewDataLength = 0; 2646 mPreviewFd = 0; 2647 mPreviewWidth = 0; 2648 mPreviewHeight = 0; 2649 mPreviewLength = 0; 2650 mPreviewOffsets = NULL; 2651 mPreviewRunning = 0; 2652 mPreviewStateOld = 0; 2653 mRecordingEnabled = 0; 2654 mRecordEnabled = 0; 2655 mSensorListener = NULL; 2656 mDynamicPreviewSwitch = false; 2657 2658#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 2659 2660 //Initialize the CameraHAL constructor timestamp, which is used in the 2661 // PPM() method as time reference if the user does not supply one. 2662 gettimeofday(&ppm_start, NULL); 2663 2664#endif 2665 2666 mCameraIndex = cameraId; 2667 2668 LOG_FUNCTION_NAME_EXIT; 2669} 2670 2671/** 2672 @brief Destructor of CameraHal 2673 2674 This function simply calls deinitialize() to free up memory allocate during construct 2675 phase 2676 */ 2677CameraHal::~CameraHal() 2678{ 2679 LOG_FUNCTION_NAME; 2680 2681 ///Call de-initialize here once more - it is the last chance for us to relinquish all the h/w and s/w resources 2682 deinitialize(); 2683 2684 if ( NULL != mEventProvider ) 2685 { 2686 mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS); 2687 delete mEventProvider; 2688 mEventProvider = NULL; 2689 } 2690 2691 /// Free the callback notifier 2692 mAppCallbackNotifier.clear(); 2693 2694 /// Free the display adapter 2695 mDisplayAdapter.clear(); 2696 2697 if ( NULL != mCameraAdapter ) { 2698 int strongCount = mCameraAdapter->getStrongCount(); 2699 2700 mCameraAdapter->decStrong(mCameraAdapter); 2701 2702 mCameraAdapter = NULL; 2703 } 2704 2705 freeImageBufs(); 2706 2707 /// Free the memory manager 2708 mMemoryManager.clear(); 2709 2710 LOG_FUNCTION_NAME_EXIT; 2711} 2712 2713/** 2714 @brief Initialize the Camera HAL 2715 2716 Creates CameraAdapter, AppCallbackNotifier, DisplayAdapter and MemoryManager 2717 2718 @param None 2719 @return NO_ERROR - On success 2720 NO_MEMORY - On failure to allocate memory for any of the objects 2721 @remarks Camera Hal internal function 2722 2723 */ 2724 2725status_t CameraHal::initialize(CameraProperties::Properties* properties) 2726{ 2727 LOG_FUNCTION_NAME; 2728 2729 int sensor_index = 0; 2730 2731 ///Initialize the event mask used for registering an event provider for AppCallbackNotifier 2732 ///Currently, registering all events as to be coming from CameraAdapter 2733 int32_t eventMask = CameraHalEvent::ALL_EVENTS; 2734 2735 // Get my camera properties 2736 mCameraProperties = properties; 2737 2738 if(!mCameraProperties) 2739 { 2740 goto fail_loop; 2741 } 2742 2743 // Dump the properties of this Camera 2744 // will only print if DEBUG macro is defined 2745 mCameraProperties->dump(); 2746 2747 if (strcmp(CameraProperties::DEFAULT_VALUE, mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX)) != 0 ) 2748 { 2749 sensor_index = atoi(mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX)); 2750 } 2751 2752 CAMHAL_LOGDB("Sensor index %d", sensor_index); 2753 2754 mCameraAdapter = CameraAdapter_Factory(); 2755 if ( ( NULL == mCameraAdapter ) || (mCameraAdapter->initialize(properties, sensor_index)!=NO_ERROR)) 2756 { 2757 CAMHAL_LOGEA("Unable to create or initialize CameraAdapter"); 2758 mCameraAdapter = NULL; 2759 goto fail_loop; 2760 } 2761 2762 mCameraAdapter->incStrong(mCameraAdapter); 2763 mCameraAdapter->registerImageReleaseCallback(releaseImageBuffers, (void *) this); 2764 mCameraAdapter->registerEndCaptureCallback(endImageCapture, (void *)this); 2765 2766 if(!mAppCallbackNotifier.get()) 2767 { 2768 /// Create the callback notifier 2769 mAppCallbackNotifier = new AppCallbackNotifier(); 2770 if( ( NULL == mAppCallbackNotifier.get() ) || ( mAppCallbackNotifier->initialize() != NO_ERROR)) 2771 { 2772 CAMHAL_LOGEA("Unable to create or initialize AppCallbackNotifier"); 2773 goto fail_loop; 2774 } 2775 } 2776 2777 if(!mMemoryManager.get()) 2778 { 2779 /// Create Memory Manager 2780 mMemoryManager = new MemoryManager(); 2781 if( ( NULL == mMemoryManager.get() ) || ( mMemoryManager->initialize() != NO_ERROR)) 2782 { 2783 CAMHAL_LOGEA("Unable to create or initialize MemoryManager"); 2784 goto fail_loop; 2785 } 2786 } 2787 2788 ///Setup the class dependencies... 2789 2790 ///AppCallbackNotifier has to know where to get the Camera frames and the events like auto focus lock etc from. 2791 ///CameraAdapter is the one which provides those events 2792 ///Set it as the frame and event providers for AppCallbackNotifier 2793 ///@remarks setEventProvider API takes in a bit mask of events for registering a provider for the different events 2794 /// That way, if events can come from DisplayAdapter in future, we will be able to add it as provider 2795 /// for any event 2796 mAppCallbackNotifier->setEventProvider(eventMask, mCameraAdapter); 2797 mAppCallbackNotifier->setFrameProvider(mCameraAdapter); 2798 2799 ///Any dynamic errors that happen during the camera use case has to be propagated back to the application 2800 ///via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that notifies such errors to the application 2801 ///Set it as the error handler for CameraAdapter 2802 mCameraAdapter->setErrorHandler(mAppCallbackNotifier.get()); 2803 2804 ///Start the callback notifier 2805 if(mAppCallbackNotifier->start() != NO_ERROR) 2806 { 2807 CAMHAL_LOGEA("Couldn't start AppCallbackNotifier"); 2808 goto fail_loop; 2809 } 2810 2811 CAMHAL_LOGDA("Started AppCallbackNotifier.."); 2812 mAppCallbackNotifier->setMeasurements(mMeasurementEnabled); 2813 2814 ///Initialize default parameters 2815 initDefaultParameters(); 2816 2817 2818 if ( setParameters(mParameters) != NO_ERROR ) 2819 { 2820 CAMHAL_LOGEA("Failed to set default parameters?!"); 2821 } 2822 2823 // register for sensor events 2824 mSensorListener = new SensorListener(); 2825 if (mSensorListener.get()) { 2826 if (mSensorListener->initialize() == NO_ERROR) { 2827 mSensorListener->setCallbacks(orientation_cb, this); 2828 mSensorListener->enableSensor(SensorListener::SENSOR_ORIENTATION); 2829 } else { 2830 CAMHAL_LOGEA("Error initializing SensorListener. not fatal, continuing"); 2831 mSensorListener.clear(); 2832 mSensorListener = NULL; 2833 } 2834 } 2835 2836 LOG_FUNCTION_NAME_EXIT; 2837 2838 return NO_ERROR; 2839 2840 fail_loop: 2841 2842 ///Free up the resources because we failed somewhere up 2843 deinitialize(); 2844 LOG_FUNCTION_NAME_EXIT; 2845 2846 return NO_MEMORY; 2847 2848} 2849 2850bool CameraHal::isResolutionValid(unsigned int width, unsigned int height, const char *supportedResolutions) 2851{ 2852 bool ret = true; 2853 status_t status = NO_ERROR; 2854 char tmpBuffer[PARAM_BUFFER + 1]; 2855 char *pos = NULL; 2856 2857 LOG_FUNCTION_NAME; 2858 2859 if ( NULL == supportedResolutions ) 2860 { 2861 CAMHAL_LOGEA("Invalid supported resolutions string"); 2862 ret = false; 2863 goto exit; 2864 } 2865 2866 status = snprintf(tmpBuffer, PARAM_BUFFER, "%dx%d", width, height); 2867 if ( 0 > status ) 2868 { 2869 CAMHAL_LOGEA("Error encountered while generating validation string"); 2870 ret = false; 2871 goto exit; 2872 } 2873 2874 pos = strstr(supportedResolutions, tmpBuffer); 2875 if ( NULL == pos ) 2876 { 2877 ret = false; 2878 } 2879 else 2880 { 2881 ret = true; 2882 } 2883 2884exit: 2885 2886 LOG_FUNCTION_NAME_EXIT; 2887 2888 return ret; 2889} 2890 2891bool CameraHal::isParameterValid(const char *param, const char *supportedParams) 2892{ 2893 bool ret = true; 2894 char *pos = NULL; 2895 2896 LOG_FUNCTION_NAME; 2897 2898 if ( NULL == supportedParams ) 2899 { 2900 CAMHAL_LOGEA("Invalid supported parameters string"); 2901 ret = false; 2902 goto exit; 2903 } 2904 2905 if ( NULL == param ) 2906 { 2907 CAMHAL_LOGEA("Invalid parameter string"); 2908 ret = false; 2909 goto exit; 2910 } 2911 2912 pos = strstr(supportedParams, param); 2913 if ( NULL == pos ) 2914 { 2915 ret = false; 2916 } 2917 else 2918 { 2919 ret = true; 2920 } 2921 2922exit: 2923 2924 LOG_FUNCTION_NAME_EXIT; 2925 2926 return ret; 2927} 2928 2929bool CameraHal::isParameterValid(int param, const char *supportedParams) 2930{ 2931 bool ret = true; 2932 char *pos = NULL; 2933 status_t status; 2934 char tmpBuffer[PARAM_BUFFER + 1]; 2935 2936 LOG_FUNCTION_NAME; 2937 2938 if ( NULL == supportedParams ) 2939 { 2940 CAMHAL_LOGEA("Invalid supported parameters string"); 2941 ret = false; 2942 goto exit; 2943 } 2944 2945 status = snprintf(tmpBuffer, PARAM_BUFFER, "%d", param); 2946 if ( 0 > status ) 2947 { 2948 CAMHAL_LOGEA("Error encountered while generating validation string"); 2949 ret = false; 2950 goto exit; 2951 } 2952 2953 pos = strstr(supportedParams, tmpBuffer); 2954 if ( NULL == pos ) 2955 { 2956 ret = false; 2957 } 2958 else 2959 { 2960 ret = true; 2961 } 2962 2963exit: 2964 2965 LOG_FUNCTION_NAME_EXIT; 2966 2967 return ret; 2968} 2969 2970status_t CameraHal::doesSetParameterNeedUpdate(const char* new_param, const char* old_param, bool& update) { 2971 if (!new_param || !old_param) { 2972 return -EINVAL; 2973 } 2974 2975 // if params mismatch we should update parameters for camera adapter 2976 if ((strcmp(new_param, old_param) != 0)) { 2977 update = true; 2978 } 2979 2980 return NO_ERROR; 2981} 2982 2983status_t CameraHal::parseResolution(const char *resStr, int &width, int &height) 2984{ 2985 status_t ret = NO_ERROR; 2986 char *ctx, *pWidth, *pHeight; 2987 const char *sep = "x"; 2988 char *tmp = NULL; 2989 2990 LOG_FUNCTION_NAME; 2991 2992 if ( NULL == resStr ) 2993 { 2994 return -EINVAL; 2995 } 2996 2997 //This fixes "Invalid input resolution" 2998 char *resStr_copy = (char *)malloc(strlen(resStr) + 1); 2999 if ( NULL!=resStr_copy ) { 3000 if ( NO_ERROR == ret ) 3001 { 3002 strcpy(resStr_copy, resStr); 3003 pWidth = strtok_r( (char *) resStr_copy, sep, &ctx); 3004 3005 if ( NULL != pWidth ) 3006 { 3007 width = atoi(pWidth); 3008 } 3009 else 3010 { 3011 CAMHAL_LOGEB("Invalid input resolution %s", resStr); 3012 ret = -EINVAL; 3013 } 3014 } 3015 3016 if ( NO_ERROR == ret ) 3017 { 3018 pHeight = strtok_r(NULL, sep, &ctx); 3019 3020 if ( NULL != pHeight ) 3021 { 3022 height = atoi(pHeight); 3023 } 3024 else 3025 { 3026 CAMHAL_LOGEB("Invalid input resolution %s", resStr); 3027 ret = -EINVAL; 3028 } 3029 } 3030 3031 free(resStr_copy); 3032 resStr_copy = NULL; 3033 } 3034 LOG_FUNCTION_NAME_EXIT; 3035 3036 return ret; 3037} 3038 3039void CameraHal::insertSupportedParams() 3040{ 3041 char tmpBuffer[PARAM_BUFFER + 1]; 3042 3043 LOG_FUNCTION_NAME; 3044 3045 CameraParameters &p = mParameters; 3046 3047 ///Set the name of the camera 3048 p.set(TICameraParameters::KEY_CAMERA_NAME, mCameraProperties->get(CameraProperties::CAMERA_NAME)); 3049 3050 mMaxZoomSupported = atoi(mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES)); 3051 3052 p.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES)); 3053 p.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS)); 3054 p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)); 3055 p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS)); 3056 p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES)); 3057 p.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_THUMBNAIL_SIZES)); 3058 p.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE)); 3059 p.set(CameraParameters::KEY_SUPPORTED_EFFECTS, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS)); 3060 p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES)); 3061 p.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES)); 3062 p.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES)); 3063 p.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING)); 3064 p.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MAX)); 3065 p.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MIN)); 3066 p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_EV_STEP)); 3067 p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES)); 3068 p.set(TICameraParameters::KEY_SUPPORTED_EXPOSURE, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES)); 3069 p.set(TICameraParameters::KEY_SUPPORTED_ISO_VALUES, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES)); 3070 p.set(CameraParameters::KEY_ZOOM_RATIOS, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_RATIOS)); 3071 p.set(CameraParameters::KEY_MAX_ZOOM, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES)); 3072 p.set(CameraParameters::KEY_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::ZOOM_SUPPORTED)); 3073 p.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::SMOOTH_ZOOM_SUPPORTED)); 3074 p.set(TICameraParameters::KEY_SUPPORTED_IPP, mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES)); 3075 p.set(TICameraParameters::KEY_S3D_SUPPORTED,mCameraProperties->get(CameraProperties::S3D_SUPPORTED)); 3076 p.set(TICameraParameters::KEY_S3D2D_PREVIEW_MODE,mCameraProperties->get(CameraProperties::S3D2D_PREVIEW_MODES)); 3077 p.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE_MODE)); 3078 p.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, mCameraProperties->get(CameraProperties::MANUALCONVERGENCE_VALUES)); 3079 p.set(TICameraParameters::KEY_VSTAB,mCameraProperties->get(CameraProperties::VSTAB)); 3080 p.set(TICameraParameters::KEY_VSTAB_VALUES,mCameraProperties->get(CameraProperties::VSTAB_VALUES)); 3081 p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED)); 3082 p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION)); 3083 p.set(TICameraParameters::KEY_SENSOR_ORIENTATION_VALUES, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION_VALUES)); 3084 p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK_SUPPORTED)); 3085 p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK_SUPPORTED)); 3086 p.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, mCameraProperties->get(CameraProperties::VIDEO_SNAPSHOT_SUPPORTED)); 3087 3088 LOG_FUNCTION_NAME_EXIT; 3089 3090} 3091 3092void CameraHal::initDefaultParameters() 3093{ 3094 //Purpose of this function is to initialize the default current and supported parameters for the currently 3095 //selected camera. 3096 3097 CameraParameters &p = mParameters; 3098 int currentRevision, adapterRevision; 3099 status_t ret = NO_ERROR; 3100 int width, height; 3101 3102 LOG_FUNCTION_NAME; 3103 3104 ret = parseResolution(mCameraProperties->get(CameraProperties::PREVIEW_SIZE), width, height); 3105 3106 if ( NO_ERROR == ret ) 3107 { 3108 p.setPreviewSize(width, height); 3109 } 3110 else 3111 { 3112 p.setPreviewSize(MIN_WIDTH, MIN_HEIGHT); 3113 } 3114 3115 ret = parseResolution(mCameraProperties->get(CameraProperties::PICTURE_SIZE), width, height); 3116 3117 if ( NO_ERROR == ret ) 3118 { 3119 p.setPictureSize(width, height); 3120 } 3121 else 3122 { 3123 p.setPictureSize(PICTURE_WIDTH, PICTURE_HEIGHT); 3124 } 3125 3126 ret = parseResolution(mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_SIZE), width, height); 3127 3128 if ( NO_ERROR == ret ) 3129 { 3130 p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, width); 3131 p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, height); 3132 } 3133 else 3134 { 3135 p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, MIN_WIDTH); 3136 p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, MIN_HEIGHT); 3137 } 3138 3139 insertSupportedParams(); 3140 3141 //Insert default values 3142 p.setPreviewFrameRate(atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE))); 3143 p.setPreviewFormat(mCameraProperties->get(CameraProperties::PREVIEW_FORMAT)); 3144 p.setPictureFormat(mCameraProperties->get(CameraProperties::PICTURE_FORMAT)); 3145 p.set(CameraParameters::KEY_JPEG_QUALITY, mCameraProperties->get(CameraProperties::JPEG_QUALITY)); 3146 p.set(CameraParameters::KEY_WHITE_BALANCE, mCameraProperties->get(CameraProperties::WHITEBALANCE)); 3147 p.set(CameraParameters::KEY_EFFECT, mCameraProperties->get(CameraProperties::EFFECT)); 3148 p.set(CameraParameters::KEY_ANTIBANDING, mCameraProperties->get(CameraProperties::ANTIBANDING)); 3149 p.set(CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE)); 3150 p.set(CameraParameters::KEY_FOCUS_MODE, mCameraProperties->get(CameraProperties::FOCUS_MODE)); 3151 p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::EV_COMPENSATION)); 3152 p.set(CameraParameters::KEY_SCENE_MODE, mCameraProperties->get(CameraProperties::SCENE_MODE)); 3153 p.set(CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE)); 3154 p.set(CameraParameters::KEY_ZOOM, mCameraProperties->get(CameraProperties::ZOOM)); 3155 p.set(TICameraParameters::KEY_CONTRAST, mCameraProperties->get(CameraProperties::CONTRAST)); 3156 p.set(TICameraParameters::KEY_SATURATION, mCameraProperties->get(CameraProperties::SATURATION)); 3157 p.set(TICameraParameters::KEY_BRIGHTNESS, mCameraProperties->get(CameraProperties::BRIGHTNESS)); 3158 p.set(TICameraParameters::KEY_SHARPNESS, mCameraProperties->get(CameraProperties::SHARPNESS)); 3159 p.set(TICameraParameters::KEY_EXPOSURE_MODE, mCameraProperties->get(CameraProperties::EXPOSURE_MODE)); 3160 p.set(TICameraParameters::KEY_ISO, mCameraProperties->get(CameraProperties::ISO_MODE)); 3161 p.set(TICameraParameters::KEY_IPP, mCameraProperties->get(CameraProperties::IPP)); 3162 p.set(TICameraParameters::KEY_GBCE, mCameraProperties->get(CameraProperties::GBCE)); 3163 p.set(TICameraParameters::KEY_S3D2D_PREVIEW, mCameraProperties->get(CameraProperties::S3D2D_PREVIEW)); 3164 p.set(TICameraParameters::KEY_AUTOCONVERGENCE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE)); 3165 p.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, mCameraProperties->get(CameraProperties::MANUALCONVERGENCE_VALUES)); 3166 p.set(TICameraParameters::KEY_VSTAB,mCameraProperties->get(CameraProperties::VSTAB)); 3167 p.set(TICameraParameters::KEY_VSTAB_VALUES,mCameraProperties->get(CameraProperties::VSTAB_VALUES)); 3168 p.set(CameraParameters::KEY_FOCAL_LENGTH, mCameraProperties->get(CameraProperties::FOCAL_LENGTH)); 3169 p.set(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::HOR_ANGLE)); 3170 p.set(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::VER_ANGLE)); 3171 p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,mCameraProperties->get(CameraProperties::FRAMERATE_RANGE)); 3172 p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION)); 3173 p.set(TICameraParameters::KEY_SENSOR_ORIENTATION_VALUES, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION_VALUES)); 3174 p.set(TICameraParameters::KEY_EXIF_MAKE, mCameraProperties->get(CameraProperties::EXIF_MAKE)); 3175 p.set(TICameraParameters::KEY_EXIF_MODEL, mCameraProperties->get(CameraProperties::EXIF_MODEL)); 3176 p.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_QUALITY)); 3177 p.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, "OMX_TI_COLOR_FormatYUV420PackedSemiPlanar"); 3178 p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, mCameraProperties->get(CameraProperties::MAX_FD_HW_FACES)); 3179 p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, mCameraProperties->get(CameraProperties::MAX_FD_SW_FACES)); 3180 3181 // Only one area a.k.a Touch AF for now. 3182 // TODO: Add support for multiple focus areas. 3183 p.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, mCameraProperties->get(CameraProperties::MAX_FOCUS_AREAS)); 3184 p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK)); 3185 p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK)); 3186 p.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, mCameraProperties->get(CameraProperties::MAX_NUM_METERING_AREAS)); 3187 3188 LOG_FUNCTION_NAME_EXIT; 3189} 3190 3191/** 3192 @brief Stop a previously started preview. 3193 @param none 3194 @return none 3195 3196 */ 3197void CameraHal::forceStopPreview() 3198{ 3199 LOG_FUNCTION_NAME; 3200 3201 // stop bracketing if it is running 3202 stopImageBracketing(); 3203 3204 if(mDisplayAdapter.get() != NULL) { 3205 ///Stop the buffer display first 3206 mDisplayAdapter->disableDisplay(); 3207 } 3208 3209 if(mAppCallbackNotifier.get() != NULL) { 3210 //Stop the callback sending 3211 mAppCallbackNotifier->stop(); 3212 mAppCallbackNotifier->flushAndReturnFrames(); 3213 mAppCallbackNotifier->stopPreviewCallbacks(); 3214 } 3215 3216 if ( NULL != mCameraAdapter ) { 3217 CameraAdapter::AdapterState currentState; 3218 CameraAdapter::AdapterState nextState; 3219 3220 currentState = mCameraAdapter->getState(); 3221 nextState = mCameraAdapter->getNextState(); 3222 3223 // since prerequisite for capturing is for camera system 3224 // to be previewing...cancel all captures before stopping 3225 // preview 3226 if ( (currentState == CameraAdapter::CAPTURE_STATE) && 3227 (nextState != CameraAdapter::PREVIEW_STATE)) { 3228 mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE); 3229 } 3230 3231 // only need to send these control commands to state machine if we are 3232 // passed the LOADED_PREVIEW_STATE 3233 if (currentState > CameraAdapter::LOADED_PREVIEW_STATE) { 3234 // according to javadoc...FD should be stopped in stopPreview 3235 // and application needs to call startFaceDection again 3236 // to restart FD 3237 mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD); 3238 3239 cancelAutoFocus(); 3240 } 3241 3242 // only need to send these control commands to state machine if we are 3243 // passed the INITIALIZED_STATE 3244 if (currentState > CameraAdapter::INTIALIZED_STATE) { 3245 //Stop the source of frames 3246 mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW); 3247 } 3248 } 3249 3250 freePreviewBufs(); 3251 freePreviewDataBufs(); 3252 3253 mPreviewEnabled = false; 3254 mDisplayPaused = false; 3255 mPreviewStartInProgress = false; 3256 3257 LOG_FUNCTION_NAME_EXIT; 3258} 3259 3260/** 3261 @brief Deallocates memory for all the resources held by Camera HAL. 3262 3263 Frees the following objects- CameraAdapter, AppCallbackNotifier, DisplayAdapter, 3264 and Memory Manager 3265 3266 @param none 3267 @return none 3268 3269 */ 3270void CameraHal::deinitialize() 3271{ 3272 LOG_FUNCTION_NAME; 3273 3274 if ( mPreviewEnabled || mDisplayPaused ) { 3275 forceStopPreview(); 3276 } 3277 3278 mSetPreviewWindowCalled = false; 3279 3280 if (mSensorListener.get()) { 3281 mSensorListener->disableSensor(SensorListener::SENSOR_ORIENTATION); 3282 mSensorListener.clear(); 3283 mSensorListener = NULL; 3284 } 3285 3286 LOG_FUNCTION_NAME_EXIT; 3287 3288} 3289 3290status_t CameraHal::storeMetaDataInBuffers(bool enable) 3291{ 3292 LOG_FUNCTION_NAME; 3293 3294 return mAppCallbackNotifier->useMetaDataBufferMode(enable); 3295 3296 LOG_FUNCTION_NAME_EXIT; 3297} 3298 3299void CameraHal::selectFPSRange(int framerate, int *min_fps, int *max_fps) 3300{ 3301 char * ptr; 3302 char supported[MAX_PROP_VALUE_LENGTH]; 3303 int fpsrangeArray[2]; 3304 int i = 0; 3305 3306 LOG_FUNCTION_NAME; 3307 size_t size = strlen(mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED))+1; 3308 strncpy(supported, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED), size); 3309 3310 ptr = strtok (supported," (,)"); 3311 3312 while (ptr != NULL) 3313 { 3314 fpsrangeArray[i]= atoi(ptr)/CameraHal::VFR_SCALE; 3315 if (i == 1) 3316 { 3317 if (framerate == fpsrangeArray[i]) 3318 { 3319 CAMHAL_LOGDB("SETTING FPS RANGE min = %d max = %d \n", fpsrangeArray[0], fpsrangeArray[1]); 3320 *min_fps = fpsrangeArray[0]*CameraHal::VFR_SCALE; 3321 *max_fps = fpsrangeArray[1]*CameraHal::VFR_SCALE; 3322 break; 3323 } 3324 } 3325 ptr = strtok (NULL, " (,)"); 3326 i++; 3327 i%=2; 3328 } 3329 3330 LOG_FUNCTION_NAME_EXIT; 3331 3332} 3333 3334}; 3335 3336 3337