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