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