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