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