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