1 /* Copyright (c) 2012-2015, The Linux Foundataion. All rights reserved. 2 * 3 * Redistribution and use in source and binary forms, with or without 4 * modification, are permitted provided that the following conditions are 5 * met: 6 * * Redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer. 8 * * Redistributions in binary form must reproduce the above 9 * copyright notice, this list of conditions and the following 10 * disclaimer in the documentation and/or other materials provided 11 * with the distribution. 12 * * Neither the name of The Linux Foundation nor the names of its 13 * contributors may be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 */ 29 30 #define LOG_TAG "QCameraStateMachine" 31 32 #include <utils/Errors.h> 33 #include "QCamera2HWI.h" 34 #include "QCameraStateMachine.h" 35 36 namespace qcamera { 37 38 /*=========================================================================== 39 * FUNCTION : smEvtProcRoutine 40 * 41 * DESCRIPTION: Statemachine process thread routine to handle events 42 * in different state. 43 * 44 * PARAMETERS : 45 * @data : ptr to QCameraStateMachine object 46 * 47 * RETURN : none 48 *==========================================================================*/ 49 void *QCameraStateMachine::smEvtProcRoutine(void *data) 50 { 51 int running = 1, ret; 52 QCameraStateMachine *pme = (QCameraStateMachine *)data; 53 54 CDBG_HIGH("%s: E", __func__); 55 do { 56 do { 57 ret = cam_sem_wait(&pme->cmd_sem); 58 if (ret != 0 && errno != EINVAL) { 59 ALOGE("%s: cam_sem_wait error (%s)", 60 __func__, strerror(errno)); 61 return NULL; 62 } 63 } while (ret != 0); 64 65 // we got notified about new cmd avail in cmd queue 66 // first check API cmd queue 67 qcamera_sm_cmd_t *node = (qcamera_sm_cmd_t *)pme->api_queue.dequeue(); 68 if (node == NULL) { 69 // no API cmd, then check evt cmd queue 70 node = (qcamera_sm_cmd_t *)pme->evt_queue.dequeue(); 71 } 72 if (node != NULL) { 73 switch (node->cmd) { 74 case QCAMERA_SM_CMD_TYPE_API: 75 pme->stateMachine(node->evt, node->evt_payload); 76 // API is in a way sync call, so evt_payload is managed by HWI 77 // no need to free payload for API 78 break; 79 case QCAMERA_SM_CMD_TYPE_EVT: 80 pme->stateMachine(node->evt, node->evt_payload); 81 82 // EVT is async call, so payload need to be free after use 83 free(node->evt_payload); 84 node->evt_payload = NULL; 85 break; 86 case QCAMERA_SM_CMD_TYPE_EXIT: 87 running = 0; 88 break; 89 default: 90 break; 91 } 92 free(node); 93 node = NULL; 94 } 95 } while (running); 96 CDBG_HIGH("%s: X", __func__); 97 return NULL; 98 } 99 100 /*=========================================================================== 101 * FUNCTION : QCameraStateMachine 102 * 103 * DESCRIPTION: constructor of QCameraStateMachine. Will start process thread 104 * 105 * PARAMETERS : 106 * @ctrl : ptr to HWI object 107 * 108 * RETURN : none 109 *==========================================================================*/ 110 QCameraStateMachine::QCameraStateMachine(QCamera2HardwareInterface *ctrl) : 111 api_queue(), 112 evt_queue() 113 { 114 m_parent = ctrl; 115 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 116 cmd_pid = 0; 117 cam_sem_init(&cmd_sem, 0); 118 pthread_create(&cmd_pid, 119 NULL, 120 smEvtProcRoutine, 121 this); 122 pthread_setname_np(cmd_pid, "CAM_stMachine"); 123 m_bDelayPreviewMsgs = false; 124 m_DelayedMsgs = 0; 125 } 126 127 /*=========================================================================== 128 * FUNCTION : ~QCameraStateMachine 129 * 130 * DESCRIPTION: desctructor of QCameraStateMachine. Will stop process thread. 131 * 132 * PARAMETERS : none 133 * 134 * RETURN : none 135 *==========================================================================*/ 136 QCameraStateMachine::~QCameraStateMachine() 137 { 138 cam_sem_destroy(&cmd_sem); 139 } 140 141 /*=========================================================================== 142 * FUNCTION : releaseThread 143 * 144 * DESCRIPTION: Sends an exit command and terminates the state machine thread 145 * 146 * PARAMETERS : none 147 * 148 * RETURN : none 149 *==========================================================================*/ 150 void QCameraStateMachine::releaseThread() 151 { 152 if (cmd_pid != 0) { 153 qcamera_sm_cmd_t *node = 154 (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t)); 155 if (NULL != node) { 156 memset(node, 0, sizeof(qcamera_sm_cmd_t)); 157 node->cmd = QCAMERA_SM_CMD_TYPE_EXIT; 158 159 if (api_queue.enqueue((void *)node)) { 160 cam_sem_post(&cmd_sem); 161 } else { 162 free(node); 163 node = NULL; 164 } 165 166 /* wait until cmd thread exits */ 167 if (pthread_join(cmd_pid, NULL) != 0) { 168 CDBG_HIGH("%s: pthread dead already\n", __func__); 169 } 170 } 171 cmd_pid = 0; 172 } 173 } 174 175 /*=========================================================================== 176 * FUNCTION : applyDelayedMsgs 177 * 178 * DESCRIPTION: Enable if needed any delayed message types 179 * 180 * PARAMETERS : None 181 * RETURN : int32_t type of status 182 * NO_ERROR -- success 183 * none-zero failure code 184 *==========================================================================*/ 185 int32_t QCameraStateMachine::applyDelayedMsgs() 186 { 187 int32_t rc = NO_ERROR; 188 189 if (m_bDelayPreviewMsgs && m_DelayedMsgs) { 190 rc = m_parent->enableMsgType(m_DelayedMsgs); 191 m_bDelayPreviewMsgs = false; 192 m_DelayedMsgs = 0; 193 } else if (m_bDelayPreviewMsgs) { 194 m_bDelayPreviewMsgs = false; 195 } 196 197 return rc; 198 } 199 200 /*=========================================================================== 201 * FUNCTION : procAPI 202 * 203 * DESCRIPTION: process incoming API request from framework layer. 204 * 205 * PARAMETERS : 206 * @evt : event to be processed 207 * @api_payload : API payload. Can be NULL if not needed. 208 * 209 * RETURN : int32_t type of status 210 * NO_ERROR -- success 211 * none-zero failure code 212 *==========================================================================*/ 213 int32_t QCameraStateMachine::procAPI(qcamera_sm_evt_enum_t evt, 214 void *api_payload) 215 { 216 qcamera_sm_cmd_t *node = 217 (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t)); 218 if (NULL == node) { 219 ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__); 220 return NO_MEMORY; 221 } 222 223 memset(node, 0, sizeof(qcamera_sm_cmd_t)); 224 node->cmd = QCAMERA_SM_CMD_TYPE_API; 225 node->evt = evt; 226 node->evt_payload = api_payload; 227 if (api_queue.enqueue((void *)node)) { 228 cam_sem_post(&cmd_sem); 229 return NO_ERROR; 230 } else { 231 free(node); 232 return UNKNOWN_ERROR; 233 } 234 } 235 236 /*=========================================================================== 237 * FUNCTION : procEvt 238 * 239 * DESCRIPTION: process incoming envent from mm-camera-interface and 240 * mm-jpeg-interface. 241 * 242 * PARAMETERS : 243 * @evt : event to be processed 244 * @evt_payload : event payload. Can be NULL if not needed. 245 * 246 * RETURN : int32_t type of status 247 * NO_ERROR -- success 248 * none-zero failure code 249 *==========================================================================*/ 250 int32_t QCameraStateMachine::procEvt(qcamera_sm_evt_enum_t evt, 251 void *evt_payload) 252 { 253 qcamera_sm_cmd_t *node = 254 (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t)); 255 if (NULL == node) { 256 ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__); 257 return NO_MEMORY; 258 } 259 260 memset(node, 0, sizeof(qcamera_sm_cmd_t)); 261 node->cmd = QCAMERA_SM_CMD_TYPE_EVT; 262 node->evt = evt; 263 node->evt_payload = evt_payload; 264 if (evt_queue.enqueue((void *)node)) { 265 cam_sem_post(&cmd_sem); 266 return NO_ERROR; 267 } else { 268 free(node); 269 return UNKNOWN_ERROR; 270 } 271 } 272 273 /*=========================================================================== 274 * FUNCTION : stateMachine 275 * 276 * DESCRIPTION: finite state machine entry function. Depends on state, 277 * incoming event will be handled differently. 278 * 279 * PARAMETERS : 280 * @evt : event to be processed 281 * @payload : event payload. Can be NULL if not needed. 282 * 283 * RETURN : int32_t type of status 284 * NO_ERROR -- success 285 * none-zero failure code 286 *==========================================================================*/ 287 int32_t QCameraStateMachine::stateMachine(qcamera_sm_evt_enum_t evt, void *payload) 288 { 289 int32_t rc = NO_ERROR; 290 ALOGV("%s: m_state %d, event (%d)", __func__, m_state, evt); 291 switch (m_state) { 292 case QCAMERA_SM_STATE_PREVIEW_STOPPED: 293 rc = procEvtPreviewStoppedState(evt, payload); 294 break; 295 case QCAMERA_SM_STATE_PREVIEW_READY: 296 rc = procEvtPreviewReadyState(evt, payload); 297 break; 298 case QCAMERA_SM_STATE_PREVIEWING: 299 rc = procEvtPreviewingState(evt, payload); 300 break; 301 case QCAMERA_SM_STATE_PREPARE_SNAPSHOT: 302 rc = procEvtPrepareSnapshotState(evt, payload); 303 break; 304 case QCAMERA_SM_STATE_PIC_TAKING: 305 rc = procEvtPicTakingState(evt, payload); 306 break; 307 case QCAMERA_SM_STATE_RECORDING: 308 rc = procEvtRecordingState(evt, payload); 309 break; 310 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING: 311 rc = procEvtVideoPicTakingState(evt, payload); 312 break; 313 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING: 314 rc = procEvtPreviewPicTakingState(evt, payload); 315 break; 316 default: 317 break; 318 } 319 320 return rc; 321 } 322 323 /*=========================================================================== 324 * FUNCTION : procEvtPreviewStoppedState 325 * 326 * DESCRIPTION: finite state machine function to handle event in state of 327 * QCAMERA_SM_STATE_PREVIEW_STOPPED. 328 * 329 * PARAMETERS : 330 * @evt : event to be processed 331 * @payload : event payload. Can be NULL if not needed. 332 * 333 * RETURN : int32_t type of status 334 * NO_ERROR -- success 335 * none-zero failure code 336 *==========================================================================*/ 337 int32_t QCameraStateMachine::procEvtPreviewStoppedState(qcamera_sm_evt_enum_t evt, 338 void *payload) 339 { 340 int32_t rc = NO_ERROR; 341 qcamera_api_result_t result; 342 memset(&result, 0, sizeof(qcamera_api_result_t)); 343 344 ALOGV("%s: event (%d)", __func__, evt); 345 switch (evt) { 346 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW: 347 { 348 rc = m_parent->setPreviewWindow((struct preview_stream_ops *)payload); 349 result.status = rc; 350 result.request_api = evt; 351 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 352 m_parent->signalAPIResult(&result); 353 } 354 break; 355 case QCAMERA_SM_EVT_SET_CALLBACKS: 356 { 357 qcamera_sm_evt_setcb_payload_t *setcbs = 358 (qcamera_sm_evt_setcb_payload_t *)payload; 359 rc = m_parent->setCallBacks(setcbs->notify_cb, 360 setcbs->data_cb, 361 setcbs->data_cb_timestamp, 362 setcbs->get_memory, 363 setcbs->user); 364 result.status = rc; 365 result.request_api = evt; 366 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 367 m_parent->signalAPIResult(&result); 368 } 369 break; 370 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE: 371 { 372 rc = m_parent->enableMsgType(*((int32_t *)payload)); 373 result.status = rc; 374 result.request_api = evt; 375 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 376 m_parent->signalAPIResult(&result); 377 } 378 break; 379 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE: 380 { 381 rc = m_parent->disableMsgType(*((int32_t *)payload)); 382 result.status = rc; 383 result.request_api = evt; 384 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 385 m_parent->signalAPIResult(&result); 386 } 387 break; 388 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED: 389 { 390 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload)); 391 result.status = rc; 392 result.request_api = evt; 393 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 394 result.enabled = enabled; 395 m_parent->signalAPIResult(&result); 396 } 397 break; 398 case QCAMERA_SM_EVT_SET_PARAMS: 399 { 400 bool needRestart = false; 401 rc = m_parent->updateParameters((char*)payload, needRestart); 402 if (needRestart) { 403 // Clear memory pools 404 m_parent->m_memoryPool.clear(); 405 } 406 if (rc == NO_ERROR) { 407 rc = m_parent->commitParameterChanges(); 408 } 409 result.status = rc; 410 result.request_api = evt; 411 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 412 m_parent->signalAPIResult(&result); 413 } 414 break; 415 case QCAMERA_SM_EVT_GET_PARAMS: 416 { 417 result.params = m_parent->getParameters(); 418 rc = NO_ERROR; 419 result.status = rc; 420 result.request_api = evt; 421 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS; 422 m_parent->signalAPIResult(&result); 423 } 424 break; 425 case QCAMERA_SM_EVT_PUT_PARAMS: 426 { 427 rc = m_parent->putParameters((char*)payload); 428 result.status = rc; 429 result.request_api = evt; 430 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 431 m_parent->signalAPIResult(&result); 432 } 433 break; 434 case QCAMERA_SM_EVT_START_PREVIEW: 435 { 436 if (m_parent->mPreviewWindow == NULL) { 437 rc = m_parent->preparePreview(); 438 if(rc == NO_ERROR) { 439 // preview window is not set yet, move to previewReady state 440 m_state = QCAMERA_SM_STATE_PREVIEW_READY; 441 } else { 442 ALOGE("%s: preparePreview failed",__func__); 443 } 444 } else { 445 rc = m_parent->preparePreview(); 446 if (rc == NO_ERROR) { 447 applyDelayedMsgs(); 448 rc = m_parent->startPreview(); 449 if (rc != NO_ERROR) { 450 m_parent->unpreparePreview(); 451 } else { 452 // start preview success, move to previewing state 453 m_state = QCAMERA_SM_STATE_PREVIEWING; 454 } 455 } 456 } 457 result.status = rc; 458 result.request_api = evt; 459 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 460 m_parent->signalAPIResult(&result); 461 } 462 break; 463 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW: 464 { 465 rc = m_parent->preparePreview(); 466 if (rc == NO_ERROR) { 467 applyDelayedMsgs(); 468 rc = m_parent->startPreview(); 469 if (rc != NO_ERROR) { 470 m_parent->unpreparePreview(); 471 } else { 472 m_state = QCAMERA_SM_STATE_PREVIEWING; 473 } 474 } 475 result.status = rc; 476 result.request_api = evt; 477 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 478 m_parent->signalAPIResult(&result); 479 } 480 break; 481 case QCAMERA_SM_EVT_STOP_PREVIEW: 482 { 483 // no op needed here 484 CDBG_HIGH("%s: already in preview stopped state, do nothing", __func__); 485 result.status = NO_ERROR; 486 result.request_api = evt; 487 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 488 m_parent->signalAPIResult(&result); 489 } 490 break; 491 case QCAMERA_SM_EVT_PREVIEW_ENABLED: 492 case QCAMERA_SM_EVT_RECORDING_ENABLED: 493 { 494 result.status = NO_ERROR; 495 result.request_api = evt; 496 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 497 result.enabled = 0; 498 m_parent->signalAPIResult(&result); 499 } 500 break; 501 case QCAMERA_SM_EVT_RELEASE: 502 { 503 rc = m_parent->release(); 504 result.status = rc; 505 result.request_api = evt; 506 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 507 m_parent->signalAPIResult(&result); 508 } 509 break; 510 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS: 511 { 512 rc = m_parent->storeMetaDataInBuffers(*((int *)payload)); 513 result.status = rc; 514 result.request_api = evt; 515 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 516 m_parent->signalAPIResult(&result); 517 } 518 break; 519 case QCAMERA_SM_EVT_DUMP: 520 { 521 rc = m_parent->dump(*((int *)payload)); 522 result.status = rc; 523 result.request_api = evt; 524 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 525 m_parent->signalAPIResult(&result); 526 } 527 break; 528 case QCAMERA_SM_EVT_SEND_COMMAND: 529 { 530 qcamera_sm_evt_command_payload_t *cmd_payload = 531 (qcamera_sm_evt_command_payload_t *)payload; 532 rc = m_parent->sendCommand(cmd_payload->cmd, 533 cmd_payload->arg1, 534 cmd_payload->arg2); 535 result.status = rc; 536 result.request_api = evt; 537 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 538 m_parent->signalAPIResult(&result); 539 } 540 break; 541 case QCAMERA_SM_EVT_START_RECORDING: 542 case QCAMERA_SM_EVT_STOP_RECORDING: 543 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME: 544 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT: 545 case QCAMERA_SM_EVT_TAKE_PICTURE: 546 { 547 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 548 rc = INVALID_OPERATION; 549 result.status = rc; 550 result.request_api = evt; 551 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 552 m_parent->signalAPIResult(&result); 553 } 554 break; 555 case QCAMERA_SM_EVT_START_AUTO_FOCUS: 556 case QCAMERA_SM_EVT_CANCEL_PICTURE: 557 { 558 // no op needed here 559 CDBG_HIGH("%s: No ops for evt(%d) in state(%d)", __func__, evt, m_state); 560 result.status = NO_ERROR; 561 result.request_api = evt; 562 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 563 m_parent->signalAPIResult(&result); 564 } 565 break; 566 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS: 567 { 568 rc = m_parent->cancelAutoFocus(); 569 result.status = rc; 570 result.request_api = evt; 571 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 572 m_parent->signalAPIResult(&result); 573 } 574 break; 575 case QCAMERA_SM_EVT_REG_FACE_IMAGE: 576 { 577 int32_t faceID = 0; 578 qcamera_sm_evt_reg_face_payload_t *reg_payload = 579 (qcamera_sm_evt_reg_face_payload_t *)payload; 580 rc = m_parent->registerFaceImage(reg_payload->img_ptr, 581 reg_payload->config, 582 faceID); 583 result.status = rc; 584 result.request_api = evt; 585 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE; 586 result.handle = faceID; 587 m_parent->signalAPIResult(&result); 588 } 589 break; 590 case QCAMERA_SM_EVT_THERMAL_NOTIFY: 591 { 592 rc = m_parent->updateThermalLevel(payload); 593 } 594 break; 595 case QCAMERA_SM_EVT_EVT_NOTIFY: 596 { 597 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload; 598 switch (cam_evt->server_event_type) { 599 case CAM_EVENT_TYPE_DAEMON_DIED: 600 { 601 //close the camera backend 602 mm_camera_vtbl_t* handle = m_parent->mCameraHandle; 603 if (handle && handle->ops) { 604 handle->ops->error_close_camera(handle->camera_handle); 605 } else { 606 ALOGE("%s: Could not close because the handle or ops is NULL", 607 __func__); 608 } 609 m_parent->sendEvtNotify(CAMERA_MSG_ERROR, 610 CAMERA_ERROR_SERVER_DIED, 611 0); 612 } 613 break; 614 default: 615 ALOGE("%s: Invalid internal event %d in state(%d)", 616 __func__, cam_evt->server_event_type, m_state); 617 break; 618 } 619 } 620 break; 621 case QCAMERA_SM_EVT_SNAPSHOT_DONE: 622 { 623 // No ops, but need to notify 624 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 625 result.status = rc; 626 result.request_api = evt; 627 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 628 m_parent->signalEvtResult(&result); 629 } 630 break; 631 case QCAMERA_SM_EVT_EVT_INTERNAL: 632 { 633 qcamera_sm_internal_evt_payload_t *internal_evt = 634 (qcamera_sm_internal_evt_payload_t *)payload; 635 switch (internal_evt->evt_type) { 636 case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE: 637 rc = m_parent->mParameters.updateFlashMode(internal_evt->led_data); 638 break; 639 default: 640 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 641 break; 642 } 643 } 644 break; 645 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY: 646 default: 647 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 648 break; 649 } 650 651 return rc; 652 } 653 654 /*=========================================================================== 655 * FUNCTION : procEvtPreviewReadyState 656 * 657 * DESCRIPTION: finite state machine function to handle event in state of 658 * QCAMERA_SM_STATE_PREVIEW_READY. 659 * 660 * PARAMETERS : 661 * @evt : event to be processed 662 * @payload : event payload. Can be NULL if not needed. 663 * 664 * RETURN : int32_t type of status 665 * NO_ERROR -- success 666 * none-zero failure code 667 *==========================================================================*/ 668 int32_t QCameraStateMachine::procEvtPreviewReadyState(qcamera_sm_evt_enum_t evt, 669 void *payload) 670 { 671 int32_t rc = NO_ERROR; 672 qcamera_api_result_t result; 673 memset(&result, 0, sizeof(qcamera_api_result_t)); 674 675 ALOGV("%s: event (%d)", __func__, evt); 676 switch (evt) { 677 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW: 678 { 679 m_parent->setPreviewWindow((struct preview_stream_ops *)payload); 680 if (m_parent->mPreviewWindow != NULL) { 681 applyDelayedMsgs(); 682 rc = m_parent->startPreview(); 683 if (rc != NO_ERROR) { 684 m_parent->unpreparePreview(); 685 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 686 } else { 687 m_state = QCAMERA_SM_STATE_PREVIEWING; 688 } 689 } 690 691 result.status = rc; 692 result.request_api = evt; 693 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 694 m_parent->signalAPIResult(&result); 695 } 696 break; 697 case QCAMERA_SM_EVT_SET_CALLBACKS: 698 { 699 qcamera_sm_evt_setcb_payload_t *setcbs = 700 (qcamera_sm_evt_setcb_payload_t *)payload; 701 rc = m_parent->setCallBacks(setcbs->notify_cb, 702 setcbs->data_cb, 703 setcbs->data_cb_timestamp, 704 setcbs->get_memory, 705 setcbs->user); 706 result.status = rc; 707 result.request_api = evt; 708 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 709 m_parent->signalAPIResult(&result); 710 } 711 break; 712 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE: 713 { 714 rc = m_parent->enableMsgType(*((int32_t *)payload)); 715 result.status = rc; 716 result.request_api = evt; 717 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 718 m_parent->signalAPIResult(&result); 719 } 720 break; 721 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE: 722 { 723 rc = m_parent->disableMsgType(*((int32_t *)payload)); 724 result.status = rc; 725 result.request_api = evt; 726 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 727 m_parent->signalAPIResult(&result); 728 } 729 break; 730 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED: 731 { 732 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload)); 733 result.status = rc; 734 result.request_api = evt; 735 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 736 result.enabled = enabled; 737 m_parent->signalAPIResult(&result); 738 } 739 break; 740 case QCAMERA_SM_EVT_SET_PARAMS: 741 { 742 bool needRestart = false; 743 rc = m_parent->updateParameters((char*)payload, needRestart); 744 if (rc == NO_ERROR) { 745 if (needRestart) { 746 // need restart preview for parameters to take effect 747 m_parent->unpreparePreview(); 748 // Clear memory pools 749 m_parent->m_memoryPool.clear(); 750 // commit parameter changes to server 751 m_parent->commitParameterChanges(); 752 // prepare preview again 753 rc = m_parent->preparePreview(); 754 if (rc != NO_ERROR) { 755 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 756 } 757 } else { 758 rc = m_parent->commitParameterChanges(); 759 } 760 } 761 762 result.status = rc; 763 result.request_api = evt; 764 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 765 m_parent->signalAPIResult(&result); 766 } 767 break; 768 case QCAMERA_SM_EVT_GET_PARAMS: 769 { 770 result.params = m_parent->getParameters(); 771 rc = NO_ERROR; 772 result.status = rc; 773 result.request_api = evt; 774 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS; 775 m_parent->signalAPIResult(&result); 776 } 777 break; 778 case QCAMERA_SM_EVT_PUT_PARAMS: 779 { 780 rc = m_parent->putParameters((char*)payload); 781 result.status = rc; 782 result.request_api = evt; 783 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 784 m_parent->signalAPIResult(&result); 785 } 786 break; 787 case QCAMERA_SM_EVT_START_PREVIEW: 788 { 789 // no ops here 790 rc = NO_ERROR; 791 result.status = rc; 792 result.request_api = evt; 793 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 794 m_parent->signalAPIResult(&result); 795 } 796 break; 797 case QCAMERA_SM_EVT_STOP_PREVIEW: 798 { 799 m_parent->unpreparePreview(); 800 rc = 0; 801 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 802 result.status = rc; 803 result.request_api = evt; 804 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 805 m_parent->signalAPIResult(&result); 806 } 807 break; 808 case QCAMERA_SM_EVT_PREVIEW_ENABLED: 809 { 810 rc = NO_ERROR; 811 result.status = rc; 812 result.request_api = evt; 813 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 814 result.enabled = 1; 815 m_parent->signalAPIResult(&result); 816 } 817 break; 818 case QCAMERA_SM_EVT_RECORDING_ENABLED: 819 { 820 rc = 0; 821 result.status = rc; 822 result.request_api = evt; 823 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 824 result.enabled = 0; 825 m_parent->signalAPIResult(&result); 826 } 827 break; 828 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS: 829 { 830 rc = m_parent->storeMetaDataInBuffers(*((int *)payload)); 831 result.status = rc; 832 result.request_api = evt; 833 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 834 m_parent->signalAPIResult(&result); 835 } 836 break; 837 case QCAMERA_SM_EVT_DUMP: 838 { 839 rc = m_parent->dump(*((int *)payload)); 840 result.status = rc; 841 result.request_api = evt; 842 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 843 m_parent->signalAPIResult(&result); 844 } 845 break; 846 case QCAMERA_SM_EVT_START_AUTO_FOCUS: 847 { 848 rc = m_parent->autoFocus(); 849 result.status = rc; 850 result.request_api = evt; 851 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 852 m_parent->signalAPIResult(&result); 853 } 854 break; 855 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS: 856 { 857 rc = m_parent->cancelAutoFocus(); 858 result.status = rc; 859 result.request_api = evt; 860 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 861 m_parent->signalAPIResult(&result); 862 } 863 break; 864 case QCAMERA_SM_EVT_SEND_COMMAND: 865 { 866 qcamera_sm_evt_command_payload_t *cmd_payload = 867 (qcamera_sm_evt_command_payload_t *)payload; 868 rc = m_parent->sendCommand(cmd_payload->cmd, 869 cmd_payload->arg1, 870 cmd_payload->arg2); 871 result.status = rc; 872 result.request_api = evt; 873 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 874 m_parent->signalAPIResult(&result); 875 } 876 break; 877 case QCAMERA_SM_EVT_REG_FACE_IMAGE: 878 { 879 int32_t faceID = 0; 880 qcamera_sm_evt_reg_face_payload_t *reg_payload = 881 (qcamera_sm_evt_reg_face_payload_t *)payload; 882 rc = m_parent->registerFaceImage(reg_payload->img_ptr, 883 reg_payload->config, 884 faceID); 885 result.status = rc; 886 result.request_api = evt; 887 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE; 888 result.handle = faceID; 889 m_parent->signalAPIResult(&result); 890 } 891 break; 892 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW: 893 case QCAMERA_SM_EVT_START_RECORDING: 894 case QCAMERA_SM_EVT_STOP_RECORDING: 895 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT: 896 case QCAMERA_SM_EVT_TAKE_PICTURE: 897 case QCAMERA_SM_EVT_CANCEL_PICTURE: 898 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME: 899 case QCAMERA_SM_EVT_RELEASE: 900 { 901 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 902 rc = INVALID_OPERATION; 903 result.status = rc; 904 result.request_api = evt; 905 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 906 m_parent->signalAPIResult(&result); 907 } 908 break; 909 case QCAMERA_SM_EVT_EVT_NOTIFY: 910 { 911 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload; 912 switch (cam_evt->server_event_type) { 913 case CAM_EVENT_TYPE_DAEMON_DIED: 914 { 915 //close the camera backend 916 mm_camera_vtbl_t* handle = m_parent->mCameraHandle; 917 if (handle && handle->ops) { 918 handle->ops->error_close_camera(handle->camera_handle); 919 } else { 920 ALOGE("%s: Could not close because the handle or ops is NULL", 921 __func__); 922 } 923 m_parent->sendEvtNotify(CAMERA_MSG_ERROR, 924 CAMERA_ERROR_SERVER_DIED, 925 0); 926 } 927 break; 928 default: 929 ALOGE("%s: Invalid internal event %d in state(%d)", 930 __func__, cam_evt->server_event_type, m_state); 931 break; 932 } 933 } 934 break; 935 case QCAMERA_SM_EVT_SNAPSHOT_DONE: 936 { 937 // No ops, but need to notify 938 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 939 result.status = rc; 940 result.request_api = evt; 941 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 942 m_parent->signalEvtResult(&result); 943 } 944 break; 945 case QCAMERA_SM_EVT_EVT_INTERNAL: 946 { 947 qcamera_sm_internal_evt_payload_t *internal_evt = 948 (qcamera_sm_internal_evt_payload_t *)payload; 949 switch (internal_evt->evt_type) { 950 case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE: 951 rc = m_parent->mParameters.updateFlashMode(internal_evt->led_data); 952 break; 953 default: 954 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 955 break; 956 } 957 } 958 break; 959 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY: 960 case QCAMERA_SM_EVT_THERMAL_NOTIFY: 961 default: 962 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 963 break; 964 } 965 966 return rc; 967 } 968 969 /*=========================================================================== 970 * FUNCTION : procEvtPreviewingState 971 * 972 * DESCRIPTION: finite state machine function to handle event in state of 973 * QCAMERA_SM_STATE_PREVIEWING. 974 * 975 * PARAMETERS : 976 * @evt : event to be processed 977 * @payload : event payload. Can be NULL if not needed. 978 * 979 * RETURN : int32_t type of status 980 * NO_ERROR -- success 981 * none-zero failure code 982 *==========================================================================*/ 983 int32_t QCameraStateMachine::procEvtPreviewingState(qcamera_sm_evt_enum_t evt, 984 void *payload) 985 { 986 int32_t rc = NO_ERROR; 987 qcamera_api_result_t result; 988 memset(&result, 0, sizeof(qcamera_api_result_t)); 989 990 ALOGV("%s: event (%d)", __func__, evt); 991 switch (evt) { 992 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW: 993 { 994 // Error setting preview window during previewing 995 ALOGE("Error!! cannot set preview window when preview is running"); 996 rc = INVALID_OPERATION; 997 result.status = rc; 998 result.request_api = evt; 999 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1000 m_parent->signalAPIResult(&result); 1001 } 1002 break; 1003 case QCAMERA_SM_EVT_SET_CALLBACKS: 1004 { 1005 qcamera_sm_evt_setcb_payload_t *setcbs = 1006 (qcamera_sm_evt_setcb_payload_t *)payload; 1007 rc = m_parent->setCallBacks(setcbs->notify_cb, 1008 setcbs->data_cb, 1009 setcbs->data_cb_timestamp, 1010 setcbs->get_memory, 1011 setcbs->user); 1012 result.status = rc; 1013 result.request_api = evt; 1014 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1015 m_parent->signalAPIResult(&result); 1016 } 1017 break; 1018 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE: 1019 { 1020 int32_t enable_msgs = *((int32_t *)payload); 1021 if (m_bDelayPreviewMsgs && 1022 (enable_msgs & CAMERA_MSG_PREVIEW_FRAME)) { 1023 enable_msgs &= ~CAMERA_MSG_PREVIEW_FRAME; 1024 m_DelayedMsgs = CAMERA_MSG_PREVIEW_FRAME; 1025 } 1026 rc = m_parent->enableMsgType(enable_msgs); 1027 result.status = rc; 1028 result.request_api = evt; 1029 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1030 m_parent->signalAPIResult(&result); 1031 } 1032 break; 1033 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE: 1034 { 1035 int32_t disable_msgs = *((int32_t *)payload); 1036 if (m_bDelayPreviewMsgs && m_DelayedMsgs) { 1037 m_DelayedMsgs &= ~disable_msgs; 1038 if (0 == m_DelayedMsgs) { 1039 m_bDelayPreviewMsgs = false; 1040 } 1041 } 1042 rc = m_parent->disableMsgType(disable_msgs); 1043 result.status = rc; 1044 result.request_api = evt; 1045 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1046 m_parent->signalAPIResult(&result); 1047 } 1048 break; 1049 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED: 1050 { 1051 int32_t msgs = *((int32_t *)payload); 1052 int enabled = m_parent->msgTypeEnabled(msgs); 1053 if (m_bDelayPreviewMsgs && m_DelayedMsgs) { 1054 enabled |= (msgs & m_DelayedMsgs); 1055 } 1056 result.status = rc; 1057 result.request_api = evt; 1058 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 1059 result.enabled = enabled; 1060 m_parent->signalAPIResult(&result); 1061 } 1062 break; 1063 case QCAMERA_SM_EVT_SET_PARAMS: 1064 { 1065 bool needRestart = false; 1066 rc = m_parent->updateParameters((char*)payload, needRestart); 1067 if (rc == NO_ERROR) { 1068 if (needRestart) { 1069 // need restart preview for parameters to take effect 1070 // stop preview 1071 m_parent->stopPreview(); 1072 // Clear memory pools 1073 m_parent->m_memoryPool.clear(); 1074 // commit parameter changes to server 1075 m_parent->commitParameterChanges(); 1076 // start preview again 1077 rc = m_parent->preparePreview(); 1078 if (rc == NO_ERROR) { 1079 applyDelayedMsgs(); 1080 rc = m_parent->startPreview(); 1081 if (rc != NO_ERROR) { 1082 m_parent->unpreparePreview(); 1083 } 1084 } 1085 if (rc != NO_ERROR) { 1086 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 1087 } 1088 } else { 1089 rc = m_parent->commitParameterChanges(); 1090 } 1091 } 1092 result.status = rc; 1093 result.request_api = evt; 1094 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1095 m_parent->signalAPIResult(&result); 1096 } 1097 break; 1098 case QCAMERA_SM_EVT_GET_PARAMS: 1099 { 1100 result.params = m_parent->getParameters(); 1101 rc = NO_ERROR; 1102 result.status = rc; 1103 result.request_api = evt; 1104 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS; 1105 m_parent->signalAPIResult(&result); 1106 } 1107 break; 1108 case QCAMERA_SM_EVT_PUT_PARAMS: 1109 { 1110 rc = m_parent->putParameters((char*)payload); 1111 result.status = rc; 1112 result.request_api = evt; 1113 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1114 m_parent->signalAPIResult(&result); 1115 } 1116 break; 1117 case QCAMERA_SM_EVT_START_PREVIEW: 1118 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW: 1119 { 1120 // no ops here 1121 CDBG_HIGH("%s: Already in previewing, no ops here to start preview", __func__); 1122 applyDelayedMsgs(); 1123 rc = NO_ERROR; 1124 result.status = rc; 1125 result.request_api = evt; 1126 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1127 m_parent->signalAPIResult(&result); 1128 } 1129 break; 1130 case QCAMERA_SM_EVT_STOP_PREVIEW: 1131 { 1132 rc = m_parent->stopPreview(); 1133 applyDelayedMsgs(); 1134 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 1135 result.status = rc; 1136 result.request_api = evt; 1137 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1138 m_parent->signalAPIResult(&result); 1139 } 1140 break; 1141 case QCAMERA_SM_EVT_PREVIEW_ENABLED: 1142 { 1143 applyDelayedMsgs(); 1144 rc = NO_ERROR; 1145 result.status = rc; 1146 result.request_api = evt; 1147 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 1148 result.enabled = 1; 1149 m_parent->signalAPIResult(&result); 1150 } 1151 break; 1152 case QCAMERA_SM_EVT_RECORDING_ENABLED: 1153 { 1154 rc = NO_ERROR; 1155 result.status = rc; 1156 result.request_api = evt; 1157 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 1158 result.enabled = 0; 1159 m_parent->signalAPIResult(&result); 1160 } 1161 break; 1162 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS: 1163 { 1164 rc = m_parent->storeMetaDataInBuffers(*((int *)payload)); 1165 result.status = rc; 1166 result.request_api = evt; 1167 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1168 m_parent->signalAPIResult(&result); 1169 } 1170 break; 1171 case QCAMERA_SM_EVT_DUMP: 1172 { 1173 rc = m_parent->dump(*((int *)payload)); 1174 result.status = rc; 1175 result.request_api = evt; 1176 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1177 m_parent->signalAPIResult(&result); 1178 } 1179 break; 1180 case QCAMERA_SM_EVT_START_AUTO_FOCUS: 1181 { 1182 rc = m_parent->autoFocus(); 1183 result.status = rc; 1184 result.request_api = evt; 1185 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1186 m_parent->signalAPIResult(&result); 1187 } 1188 break; 1189 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS: 1190 { 1191 rc = m_parent->cancelAutoFocus(); 1192 result.status = rc; 1193 result.request_api = evt; 1194 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1195 m_parent->signalAPIResult(&result); 1196 } 1197 break; 1198 case QCAMERA_SM_EVT_START_RECORDING: 1199 { 1200 rc = m_parent->startRecording(); 1201 if (rc == NO_ERROR) { 1202 // move state to recording state 1203 m_state = QCAMERA_SM_STATE_RECORDING; 1204 applyDelayedMsgs(); 1205 } 1206 result.status = rc; 1207 result.request_api = evt; 1208 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1209 m_parent->signalAPIResult(&result); 1210 } 1211 break; 1212 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT: 1213 { 1214 rc = m_parent->prepareHardwareForSnapshot(FALSE); 1215 if (rc == NO_ERROR) { 1216 // Do not signal API result in this case. 1217 // Need to wait for snapshot done in metadta. 1218 m_state = QCAMERA_SM_STATE_PREPARE_SNAPSHOT; 1219 applyDelayedMsgs(); 1220 } else { 1221 // Do not change state in this case. 1222 ALOGE("%s: prepareHardwareForSnapshot failed %d", 1223 __func__, rc); 1224 1225 result.status = rc; 1226 result.request_api = evt; 1227 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1228 m_parent->signalAPIResult(&result); 1229 } 1230 } 1231 break; 1232 case QCAMERA_SM_EVT_TAKE_PICTURE: 1233 { 1234 1235 ALOGV("%s: QCAMERA_SM_EVT_TAKE_PICTURE ", __func__); 1236 if ( m_parent->mParameters.getRecordingHintValue() == false) { 1237 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) { 1238 m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING; 1239 m_bDelayPreviewMsgs = true; 1240 rc = m_parent->takePicture(); 1241 if (rc != NO_ERROR) { 1242 // move state to previewing state 1243 m_state = QCAMERA_SM_STATE_PREVIEWING; 1244 } 1245 if (!(m_parent->isRetroPicture()) || (rc != NO_ERROR)) { 1246 ALOGD("%s: signal API result, m_state = %d", 1247 __func__, m_state); 1248 result.status = rc; 1249 result.request_api = evt; 1250 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1251 m_parent->signalAPIResult(&result); 1252 } 1253 } else { 1254 m_state = QCAMERA_SM_STATE_PIC_TAKING; 1255 rc = m_parent->takePicture(); 1256 if (rc != NO_ERROR) { 1257 // move state to preview stopped state 1258 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 1259 } 1260 1261 result.status = rc; 1262 result.request_api = evt; 1263 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1264 m_parent->signalAPIResult(&result); 1265 } 1266 } else { 1267 m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING; 1268 rc = m_parent->takeLiveSnapshot(); 1269 if (rc != NO_ERROR ) { 1270 m_state = QCAMERA_SM_STATE_PREVIEWING; 1271 } 1272 result.status = rc; 1273 result.request_api = evt; 1274 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1275 m_parent->signalAPIResult(&result); 1276 } 1277 } 1278 break; 1279 case QCAMERA_SM_EVT_SEND_COMMAND: 1280 { 1281 qcamera_sm_evt_command_payload_t *cmd_payload = 1282 (qcamera_sm_evt_command_payload_t *)payload; 1283 rc = m_parent->sendCommand(cmd_payload->cmd, 1284 cmd_payload->arg1, 1285 cmd_payload->arg2); 1286 #ifndef VANILLA_HAL 1287 if (CAMERA_CMD_LONGSHOT_ON == cmd_payload->cmd) { 1288 if (QCAMERA_SM_EVT_RESTART_PERVIEW == cmd_payload->arg1) { 1289 m_parent->stopPreview(); 1290 // Clear memory pools 1291 m_parent->m_memoryPool.clear(); 1292 // start preview again 1293 rc = m_parent->preparePreview(); 1294 if (rc == NO_ERROR) { 1295 applyDelayedMsgs(); 1296 rc = m_parent->startPreview(); 1297 if (rc != NO_ERROR) { 1298 m_parent->unpreparePreview(); 1299 } 1300 } 1301 } 1302 } 1303 #endif 1304 result.status = rc; 1305 result.request_api = evt; 1306 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1307 m_parent->signalAPIResult(&result); 1308 } 1309 break; 1310 case QCAMERA_SM_EVT_REG_FACE_IMAGE: 1311 { 1312 int32_t faceID = 0; 1313 qcamera_sm_evt_reg_face_payload_t *reg_payload = 1314 (qcamera_sm_evt_reg_face_payload_t *)payload; 1315 rc = m_parent->registerFaceImage(reg_payload->img_ptr, 1316 reg_payload->config, 1317 faceID); 1318 result.status = rc; 1319 result.request_api = evt; 1320 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE; 1321 result.handle = faceID; 1322 m_parent->signalAPIResult(&result); 1323 } 1324 break; 1325 case QCAMERA_SM_EVT_CANCEL_PICTURE: 1326 case QCAMERA_SM_EVT_STOP_RECORDING: 1327 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME: 1328 case QCAMERA_SM_EVT_RELEASE: 1329 { 1330 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 1331 rc = INVALID_OPERATION; 1332 result.status = rc; 1333 result.request_api = evt; 1334 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1335 m_parent->signalAPIResult(&result); 1336 } 1337 break; 1338 case QCAMERA_SM_EVT_EVT_INTERNAL: 1339 { 1340 qcamera_sm_internal_evt_payload_t *internal_evt = 1341 (qcamera_sm_internal_evt_payload_t *)payload; 1342 switch (internal_evt->evt_type) { 1343 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE: 1344 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data); 1345 break; 1346 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE: 1347 break; 1348 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT: 1349 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data); 1350 break; 1351 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS: 1352 rc = m_parent->processHistogramStats(internal_evt->stats_data); 1353 break; 1354 case QCAMERA_INTERNAL_EVT_CROP_INFO: 1355 rc = m_parent->processZoomEvent(internal_evt->crop_data); 1356 break; 1357 case QCAMERA_INTERNAL_EVT_ASD_UPDATE: 1358 rc = m_parent->processASDUpdate(internal_evt->asd_data); 1359 break; 1360 case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE: 1361 rc = m_parent->mParameters.updateFlashMode(internal_evt->led_data); 1362 break; 1363 case QCAMERA_INTERNAL_EVT_AWB_UPDATE: 1364 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data); 1365 break; 1366 case QCAMERA_INTERNAL_EVT_AE_UPDATE: 1367 rc = m_parent->processAEInfo(internal_evt->ae_data); 1368 break; 1369 case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE: 1370 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos); 1371 break; 1372 case QCAMERA_INTERNAL_EVT_HDR_UPDATE: 1373 rc = m_parent->processHDRData(internal_evt->hdr_data); 1374 break; 1375 case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK: 1376 rc = m_parent->processRetroAECUnlock(); 1377 break; 1378 case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE: 1379 rc = m_parent->processZSLCaptureDone(); 1380 break; 1381 default: 1382 ALOGE("%s: Invalid internal event %d in state(%d)", 1383 __func__, internal_evt->evt_type, m_state); 1384 break; 1385 } 1386 } 1387 break; 1388 case QCAMERA_SM_EVT_EVT_NOTIFY: 1389 { 1390 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload; 1391 switch (cam_evt->server_event_type) { 1392 case CAM_EVENT_TYPE_DAEMON_DIED: 1393 { 1394 //close the camera backend 1395 mm_camera_vtbl_t* handle = m_parent->mCameraHandle; 1396 if (handle && handle->ops) { 1397 handle->ops->error_close_camera(handle->camera_handle); 1398 } else { 1399 ALOGE("%s: Could not close because the handle or ops is NULL", 1400 __func__); 1401 } 1402 m_parent->sendEvtNotify(CAMERA_MSG_ERROR, 1403 CAMERA_ERROR_SERVER_DIED, 1404 0); 1405 } 1406 break; 1407 default: 1408 CDBG_HIGH("%s: no handling for server evt (%d) at this state", 1409 __func__, cam_evt->server_event_type); 1410 break; 1411 } 1412 } 1413 break; 1414 case QCAMERA_SM_EVT_THERMAL_NOTIFY: 1415 { 1416 rc = m_parent->updateThermalLevel(payload); 1417 } 1418 break; 1419 case QCAMERA_SM_EVT_SNAPSHOT_DONE: 1420 { 1421 // No ops, but need to notify 1422 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 1423 result.status = rc; 1424 result.request_api = evt; 1425 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1426 m_parent->signalEvtResult(&result); 1427 } 1428 break; 1429 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY: 1430 default: 1431 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 1432 break; 1433 } 1434 1435 return rc; 1436 } 1437 1438 /*=========================================================================== 1439 * FUNCTION : procEvtPrepareSnapshotState 1440 * 1441 * DESCRIPTION: finite state machine function to handle event in state of 1442 * QCAMERA_SM_STATE_PREPARE_SNAPSHOT. 1443 * 1444 * PARAMETERS : 1445 * @evt : event to be processed 1446 * @payload : event payload. Can be NULL if not needed. 1447 * 1448 * RETURN : int32_t type of status 1449 * NO_ERROR -- success 1450 * none-zero failure code 1451 *==========================================================================*/ 1452 int32_t QCameraStateMachine::procEvtPrepareSnapshotState(qcamera_sm_evt_enum_t evt, 1453 void *payload) 1454 { 1455 int32_t rc = NO_ERROR; 1456 qcamera_api_result_t result; 1457 memset(&result, 0, sizeof(qcamera_api_result_t)); 1458 1459 ALOGV("%s: event (%d)", __func__, evt); 1460 switch (evt) { 1461 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW: 1462 case QCAMERA_SM_EVT_SET_CALLBACKS: 1463 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE: 1464 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE: 1465 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED: 1466 case QCAMERA_SM_EVT_SET_PARAMS: 1467 case QCAMERA_SM_EVT_GET_PARAMS: 1468 case QCAMERA_SM_EVT_PUT_PARAMS: 1469 case QCAMERA_SM_EVT_START_PREVIEW: 1470 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW: 1471 case QCAMERA_SM_EVT_STOP_PREVIEW: 1472 case QCAMERA_SM_EVT_PREVIEW_ENABLED: 1473 case QCAMERA_SM_EVT_RECORDING_ENABLED: 1474 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS: 1475 case QCAMERA_SM_EVT_DUMP: 1476 case QCAMERA_SM_EVT_START_AUTO_FOCUS: 1477 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS: 1478 case QCAMERA_SM_EVT_START_RECORDING: 1479 case QCAMERA_SM_EVT_TAKE_PICTURE: 1480 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT: 1481 case QCAMERA_SM_EVT_SEND_COMMAND: 1482 case QCAMERA_SM_EVT_CANCEL_PICTURE: 1483 case QCAMERA_SM_EVT_STOP_RECORDING: 1484 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME: 1485 case QCAMERA_SM_EVT_RELEASE: 1486 { 1487 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 1488 rc = INVALID_OPERATION; 1489 result.status = rc; 1490 result.request_api = evt; 1491 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1492 m_parent->signalAPIResult(&result); 1493 } 1494 break; 1495 case QCAMERA_SM_EVT_EVT_INTERNAL: 1496 { 1497 qcamera_sm_internal_evt_payload_t *internal_evt = 1498 (qcamera_sm_internal_evt_payload_t *)payload; 1499 switch (internal_evt->evt_type) { 1500 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE: 1501 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data); 1502 break; 1503 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE: 1504 CDBG("%s: Received QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE event", 1505 __func__); 1506 m_parent->processPrepSnapshotDoneEvent(internal_evt->prep_snapshot_state); 1507 m_state = QCAMERA_SM_STATE_PREVIEWING; 1508 1509 result.status = NO_ERROR; 1510 result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT; 1511 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1512 m_parent->signalAPIResult(&result); 1513 break; 1514 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT: 1515 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data); 1516 break; 1517 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS: 1518 rc = m_parent->processHistogramStats(internal_evt->stats_data); 1519 break; 1520 case QCAMERA_INTERNAL_EVT_CROP_INFO: 1521 rc = m_parent->processZoomEvent(internal_evt->crop_data); 1522 break; 1523 case QCAMERA_INTERNAL_EVT_ASD_UPDATE: 1524 rc = m_parent->processASDUpdate(internal_evt->asd_data); 1525 break; 1526 case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE: 1527 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 1528 break; 1529 case QCAMERA_INTERNAL_EVT_AWB_UPDATE: 1530 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data); 1531 break; 1532 case QCAMERA_INTERNAL_EVT_AE_UPDATE: 1533 rc = m_parent->processAEInfo(internal_evt->ae_data); 1534 break; 1535 case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE: 1536 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos); 1537 break; 1538 case QCAMERA_INTERNAL_EVT_HDR_UPDATE: 1539 rc = m_parent->processHDRData(internal_evt->hdr_data); 1540 break; 1541 case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK: 1542 rc = m_parent->processRetroAECUnlock(); 1543 break; 1544 case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE: 1545 rc = m_parent->processZSLCaptureDone(); 1546 break; 1547 default: 1548 ALOGE("%s: Invalid internal event %d in state(%d)", 1549 __func__, internal_evt->evt_type, m_state); 1550 break; 1551 } 1552 } 1553 break; 1554 case QCAMERA_SM_EVT_EVT_NOTIFY: 1555 { 1556 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload; 1557 switch (cam_evt->server_event_type) { 1558 case CAM_EVENT_TYPE_DAEMON_DIED: 1559 { 1560 //close the camera backend 1561 mm_camera_vtbl_t* handle = m_parent->mCameraHandle; 1562 if (handle && handle->ops) { 1563 handle->ops->error_close_camera(handle->camera_handle); 1564 } else { 1565 ALOGE("%s: Could not close because the handle or ops is NULL", 1566 __func__); 1567 } 1568 m_parent->sendEvtNotify(CAMERA_MSG_ERROR, 1569 CAMERA_ERROR_SERVER_DIED, 1570 0); 1571 } 1572 break; 1573 default: 1574 ALOGE("%s: Invalid internal event %d in state(%d)", 1575 __func__, cam_evt->server_event_type, m_state); 1576 break; 1577 } 1578 } 1579 break; 1580 case QCAMERA_SM_EVT_SNAPSHOT_DONE: 1581 { 1582 // No ops, but need to notify 1583 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 1584 result.status = rc; 1585 result.request_api = evt; 1586 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1587 m_parent->signalEvtResult(&result); 1588 } 1589 break; 1590 case QCAMERA_SM_EVT_THERMAL_NOTIFY: 1591 { 1592 rc = m_parent->updateThermalLevel(payload); 1593 } 1594 break; 1595 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY: 1596 default: 1597 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 1598 break; 1599 } 1600 1601 return rc; 1602 } 1603 1604 /*=========================================================================== 1605 * FUNCTION : procEvtPicTakingState 1606 * 1607 * DESCRIPTION: finite state machine function to handle event in state of 1608 * QCAMERA_SM_STATE_PIC_TAKING. 1609 * 1610 * PARAMETERS : 1611 * @evt : event to be processed 1612 * @payload : event payload. Can be NULL if not needed. 1613 * 1614 * RETURN : int32_t type of status 1615 * NO_ERROR -- success 1616 * none-zero failure code 1617 *==========================================================================*/ 1618 int32_t QCameraStateMachine::procEvtPicTakingState(qcamera_sm_evt_enum_t evt, 1619 void *payload) 1620 { 1621 int32_t rc = NO_ERROR; 1622 qcamera_api_result_t result; 1623 memset(&result, 0, sizeof(qcamera_api_result_t)); 1624 1625 ALOGV("%s: event (%d)", __func__, evt); 1626 switch (evt) { 1627 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW: 1628 { 1629 // Error setting preview window during previewing 1630 ALOGE("Error!! cannot set preview window when preview is running"); 1631 rc = INVALID_OPERATION; 1632 result.status = rc; 1633 result.request_api = evt; 1634 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1635 m_parent->signalAPIResult(&result); 1636 } 1637 break; 1638 case QCAMERA_SM_EVT_SET_CALLBACKS: 1639 { 1640 qcamera_sm_evt_setcb_payload_t *setcbs = 1641 (qcamera_sm_evt_setcb_payload_t *)payload; 1642 rc = m_parent->setCallBacks(setcbs->notify_cb, 1643 setcbs->data_cb, 1644 setcbs->data_cb_timestamp, 1645 setcbs->get_memory, 1646 setcbs->user); 1647 result.status = rc; 1648 result.request_api = evt; 1649 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1650 m_parent->signalAPIResult(&result); 1651 } 1652 break; 1653 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE: 1654 { 1655 rc = m_parent->enableMsgType(*((int32_t *)payload)); 1656 result.status = rc; 1657 result.request_api = evt; 1658 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1659 m_parent->signalAPIResult(&result); 1660 } 1661 break; 1662 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE: 1663 { 1664 rc = m_parent->disableMsgType(*((int32_t *)payload)); 1665 result.status = rc; 1666 result.request_api = evt; 1667 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1668 m_parent->signalAPIResult(&result); 1669 } 1670 break; 1671 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED: 1672 { 1673 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload)); 1674 result.status = rc; 1675 result.request_api = evt; 1676 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 1677 result.enabled = enabled; 1678 m_parent->signalAPIResult(&result); 1679 } 1680 break; 1681 case QCAMERA_SM_EVT_SET_PARAMS: 1682 { 1683 bool needRestart = false; 1684 rc = m_parent->updateParameters((char*)payload, needRestart); 1685 if (rc == NO_ERROR) { 1686 rc = m_parent->commitParameterChanges(); 1687 } 1688 result.status = rc; 1689 result.request_api = evt; 1690 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1691 m_parent->signalAPIResult(&result); 1692 } 1693 break; 1694 case QCAMERA_SM_EVT_GET_PARAMS: 1695 { 1696 result.params = m_parent->getParameters(); 1697 rc = NO_ERROR; 1698 result.status = rc; 1699 result.request_api = evt; 1700 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS; 1701 m_parent->signalAPIResult(&result); 1702 } 1703 break; 1704 case QCAMERA_SM_EVT_PUT_PARAMS: 1705 { 1706 rc = m_parent->putParameters((char*)payload); 1707 result.status = rc; 1708 result.request_api = evt; 1709 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1710 m_parent->signalAPIResult(&result); 1711 } 1712 break; 1713 case QCAMERA_SM_EVT_STOP_PREVIEW: 1714 { 1715 // cancel picture first 1716 rc = m_parent->cancelPicture(); 1717 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 1718 1719 result.status = rc; 1720 result.request_api = evt; 1721 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1722 m_parent->signalAPIResult(&result); 1723 } 1724 break; 1725 case QCAMERA_SM_EVT_PREVIEW_ENABLED: 1726 { 1727 rc = NO_ERROR; 1728 result.status = rc; 1729 result.request_api = evt; 1730 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 1731 result.enabled = 0; 1732 m_parent->signalAPIResult(&result); 1733 } 1734 break; 1735 case QCAMERA_SM_EVT_RECORDING_ENABLED: 1736 { 1737 rc = NO_ERROR; 1738 result.status = rc; 1739 result.request_api = evt; 1740 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 1741 result.enabled = 0; 1742 m_parent->signalAPIResult(&result); 1743 } 1744 break; 1745 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS: 1746 { 1747 rc = m_parent->storeMetaDataInBuffers(*((int *)payload)); 1748 result.status = rc; 1749 result.request_api = evt; 1750 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1751 m_parent->signalAPIResult(&result); 1752 } 1753 break; 1754 case QCAMERA_SM_EVT_DUMP: 1755 { 1756 rc = m_parent->dump(*((int *)payload)); 1757 result.status = rc; 1758 result.request_api = evt; 1759 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1760 m_parent->signalAPIResult(&result); 1761 } 1762 break; 1763 case QCAMERA_SM_EVT_START_AUTO_FOCUS: 1764 { 1765 rc = m_parent->autoFocus(); 1766 result.status = rc; 1767 result.request_api = evt; 1768 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1769 m_parent->signalAPIResult(&result); 1770 } 1771 break; 1772 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS: 1773 { 1774 rc = m_parent->cancelAutoFocus(); 1775 result.status = rc; 1776 result.request_api = evt; 1777 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1778 m_parent->signalAPIResult(&result); 1779 } 1780 break; 1781 case QCAMERA_SM_EVT_SEND_COMMAND: 1782 { 1783 qcamera_sm_evt_command_payload_t *cmd_payload = 1784 (qcamera_sm_evt_command_payload_t *)payload; 1785 rc = m_parent->sendCommand(cmd_payload->cmd, 1786 cmd_payload->arg1, 1787 cmd_payload->arg2); 1788 #ifndef VANILLA_HAL 1789 if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) { 1790 // move state to previewing state 1791 m_state = QCAMERA_SM_STATE_PREVIEWING; 1792 } 1793 #endif 1794 result.status = rc; 1795 result.request_api = evt; 1796 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1797 m_parent->signalAPIResult(&result); 1798 } 1799 break; 1800 case QCAMERA_SM_EVT_CANCEL_PICTURE: 1801 { 1802 rc = m_parent->cancelPicture(); 1803 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 1804 result.status = rc; 1805 result.request_api = evt; 1806 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1807 m_parent->signalAPIResult(&result); 1808 } 1809 break; 1810 case QCAMERA_SM_EVT_REG_FACE_IMAGE: 1811 { 1812 int32_t faceID = 0; 1813 qcamera_sm_evt_reg_face_payload_t *reg_payload = 1814 (qcamera_sm_evt_reg_face_payload_t *)payload; 1815 rc = m_parent->registerFaceImage(reg_payload->img_ptr, 1816 reg_payload->config, 1817 faceID); 1818 result.status = rc; 1819 result.request_api = evt; 1820 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE; 1821 result.handle = faceID; 1822 m_parent->signalAPIResult(&result); 1823 } 1824 break; 1825 case QCAMERA_SM_EVT_TAKE_PICTURE: 1826 { 1827 if ( m_parent->isLongshotEnabled() ) { 1828 rc = m_parent->longShot(); 1829 } else { 1830 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 1831 rc = INVALID_OPERATION; 1832 } 1833 1834 result.status = rc; 1835 result.request_api = evt; 1836 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1837 m_parent->signalAPIResult(&result); 1838 } 1839 break; 1840 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT: 1841 case QCAMERA_SM_EVT_START_RECORDING: 1842 case QCAMERA_SM_EVT_STOP_RECORDING: 1843 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME: 1844 case QCAMERA_SM_EVT_START_PREVIEW: 1845 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW: 1846 case QCAMERA_SM_EVT_RELEASE: 1847 { 1848 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 1849 rc = INVALID_OPERATION; 1850 result.status = rc; 1851 result.request_api = evt; 1852 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1853 m_parent->signalAPIResult(&result); 1854 } 1855 break; 1856 case QCAMERA_SM_EVT_EVT_INTERNAL: 1857 { 1858 qcamera_sm_internal_evt_payload_t *internal_evt = 1859 (qcamera_sm_internal_evt_payload_t *)payload; 1860 switch (internal_evt->evt_type) { 1861 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE: 1862 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data); 1863 break; 1864 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE: 1865 break; 1866 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT: 1867 break; 1868 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS: 1869 break; 1870 case QCAMERA_INTERNAL_EVT_CROP_INFO: 1871 rc = m_parent->processZoomEvent(internal_evt->crop_data); 1872 break; 1873 case QCAMERA_INTERNAL_EVT_ASD_UPDATE: 1874 rc = m_parent->processASDUpdate(internal_evt->asd_data); 1875 break; 1876 case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE: 1877 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 1878 break; 1879 case QCAMERA_INTERNAL_EVT_AWB_UPDATE: 1880 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data); 1881 break; 1882 case QCAMERA_INTERNAL_EVT_AE_UPDATE: 1883 rc = m_parent->processAEInfo(internal_evt->ae_data); 1884 break; 1885 case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE: 1886 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos); 1887 break; 1888 case QCAMERA_INTERNAL_EVT_HDR_UPDATE: 1889 rc = m_parent->processHDRData(internal_evt->hdr_data); 1890 break; 1891 case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK: 1892 rc = m_parent->processRetroAECUnlock(); 1893 break; 1894 case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE: 1895 rc = m_parent->processZSLCaptureDone(); 1896 break; 1897 default: 1898 break; 1899 } 1900 } 1901 break; 1902 case QCAMERA_SM_EVT_EVT_NOTIFY: 1903 { 1904 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload; 1905 switch (cam_evt->server_event_type) { 1906 case CAM_EVENT_TYPE_DAEMON_DIED: 1907 { 1908 // Send internal events to release statemachine 1909 // thread to process CAMERA_ERROR_SERVER_DIED error 1910 result.status = rc; 1911 result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT; 1912 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1913 m_parent->signalAPIResult(&result); 1914 1915 result.status = rc; 1916 result.request_api = QCAMERA_SM_EVT_TAKE_PICTURE; 1917 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1918 m_parent->signalAPIResult(&result); 1919 1920 //close the camera backend 1921 mm_camera_vtbl_t* handle = m_parent->mCameraHandle; 1922 if (handle && handle->ops) { 1923 handle->ops->error_close_camera(handle->camera_handle); 1924 } else { 1925 ALOGE("%s: Could not close because the handle or ops is NULL", 1926 __func__); 1927 } 1928 m_parent->sendEvtNotify(CAMERA_MSG_ERROR, 1929 CAMERA_ERROR_SERVER_DIED, 1930 0); 1931 } 1932 break; 1933 default: 1934 CDBG_HIGH("%s: no handling for server evt (%d) at this state", 1935 __func__, cam_evt->server_event_type); 1936 break; 1937 } 1938 } 1939 break; 1940 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY: 1941 { 1942 qcamera_jpeg_evt_payload_t *jpeg_job = 1943 (qcamera_jpeg_evt_payload_t *)payload; 1944 rc = m_parent->processJpegNotify(jpeg_job); 1945 } 1946 break; 1947 case QCAMERA_SM_EVT_STOP_CAPTURE_CHANNEL: 1948 { 1949 bool restartPreview = m_parent->isPreviewRestartEnabled(); 1950 rc = m_parent->stopCaptureChannel(restartPreview); 1951 1952 if (restartPreview && (NO_ERROR == rc)) { 1953 rc = m_parent->preparePreview(); 1954 if (NO_ERROR == rc) { 1955 m_parent->m_bPreviewStarted = true; 1956 applyDelayedMsgs(); 1957 rc = m_parent->startPreview(); 1958 } 1959 } 1960 1961 result.status = rc; 1962 result.request_api = evt; 1963 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1964 m_parent->signalAPIResult(&result); 1965 } 1966 break; 1967 case QCAMERA_SM_EVT_SNAPSHOT_DONE: 1968 { 1969 rc = m_parent->cancelPicture(); 1970 1971 bool restartPreview = m_parent->isPreviewRestartEnabled(); 1972 if (restartPreview) { 1973 m_state = QCAMERA_SM_STATE_PREVIEWING; 1974 } else { 1975 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 1976 } 1977 1978 result.status = rc; 1979 result.request_api = evt; 1980 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1981 m_parent->signalEvtResult(&result); 1982 } 1983 break; 1984 case QCAMERA_SM_EVT_THERMAL_NOTIFY: 1985 { 1986 rc = m_parent->updateThermalLevel(payload); 1987 } 1988 break; 1989 default: 1990 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 1991 break; 1992 } 1993 1994 return rc; 1995 } 1996 1997 /*=========================================================================== 1998 * FUNCTION : procEvtRecordingState 1999 * 2000 * DESCRIPTION: finite state machine function to handle event in state of 2001 * QCAMERA_SM_STATE_RECORDING. 2002 * 2003 * PARAMETERS : 2004 * @evt : event to be processed 2005 * @payload : event payload. Can be NULL if not needed. 2006 * 2007 * RETURN : int32_t type of status 2008 * NO_ERROR -- success 2009 * none-zero failure code 2010 *==========================================================================*/ 2011 int32_t QCameraStateMachine::procEvtRecordingState(qcamera_sm_evt_enum_t evt, 2012 void *payload) 2013 { 2014 int32_t rc = NO_ERROR; 2015 qcamera_api_result_t result; 2016 memset(&result, 0, sizeof(qcamera_api_result_t)); 2017 2018 ALOGV("%s: event (%d)", __func__, evt); 2019 switch (evt) { 2020 case QCAMERA_SM_EVT_START_PREVIEW: 2021 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW: 2022 { 2023 // WA: CTS test VideoSnapshot will try to 2024 // start preview during video recording. 2025 CDBG_HIGH("CTS video restart op"); 2026 rc = NO_ERROR; 2027 result.status = rc; 2028 result.request_api = evt; 2029 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2030 m_parent->signalAPIResult(&result); 2031 } 2032 break; 2033 case QCAMERA_SM_EVT_SET_CALLBACKS: 2034 { 2035 qcamera_sm_evt_setcb_payload_t *setcbs = 2036 (qcamera_sm_evt_setcb_payload_t *)payload; 2037 rc = m_parent->setCallBacks(setcbs->notify_cb, 2038 setcbs->data_cb, 2039 setcbs->data_cb_timestamp, 2040 setcbs->get_memory, 2041 setcbs->user); 2042 result.status = rc; 2043 result.request_api = evt; 2044 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2045 m_parent->signalAPIResult(&result); 2046 } 2047 break; 2048 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE: 2049 { 2050 rc = m_parent->enableMsgType(*((int32_t *)payload)); 2051 result.status = rc; 2052 result.request_api = evt; 2053 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2054 m_parent->signalAPIResult(&result); 2055 } 2056 break; 2057 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE: 2058 { 2059 rc = m_parent->disableMsgType(*((int32_t *)payload)); 2060 result.status = rc; 2061 result.request_api = evt; 2062 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2063 m_parent->signalAPIResult(&result); 2064 } 2065 break; 2066 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED: 2067 { 2068 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload)); 2069 result.status = rc; 2070 result.request_api = evt; 2071 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2072 result.enabled = enabled; 2073 m_parent->signalAPIResult(&result); 2074 } 2075 break; 2076 case QCAMERA_SM_EVT_SET_PARAMS: 2077 { 2078 bool needRestart = false; 2079 rc = m_parent->updateParameters((char*)payload, needRestart); 2080 if (rc == NO_ERROR) { 2081 if (needRestart) { 2082 // cannot set parameters that requires restart during recording 2083 ALOGE("%s: Error!! cannot set parameters that requires restart during recording", 2084 __func__); 2085 rc = BAD_VALUE; 2086 } else { 2087 rc = m_parent->commitParameterChanges(); 2088 } 2089 } 2090 result.status = rc; 2091 result.request_api = evt; 2092 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2093 m_parent->signalAPIResult(&result); 2094 } 2095 break; 2096 case QCAMERA_SM_EVT_GET_PARAMS: 2097 { 2098 result.params = m_parent->getParameters(); 2099 rc = NO_ERROR; 2100 result.status = rc; 2101 result.request_api = evt; 2102 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS; 2103 m_parent->signalAPIResult(&result); 2104 } 2105 break; 2106 case QCAMERA_SM_EVT_PUT_PARAMS: 2107 { 2108 rc = m_parent->putParameters((char*)payload); 2109 result.status = rc; 2110 result.request_api = evt; 2111 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2112 m_parent->signalAPIResult(&result); 2113 } 2114 break; 2115 case QCAMERA_SM_EVT_PREVIEW_ENABLED: 2116 { 2117 rc = NO_ERROR; 2118 result.status = rc; 2119 result.request_api = evt; 2120 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2121 result.enabled = 0; 2122 m_parent->signalAPIResult(&result); 2123 } 2124 break; 2125 case QCAMERA_SM_EVT_RECORDING_ENABLED: 2126 { 2127 rc = NO_ERROR; 2128 result.status = rc; 2129 result.request_api = evt; 2130 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2131 result.enabled = 1; 2132 m_parent->signalAPIResult(&result); 2133 } 2134 break; 2135 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS: 2136 { 2137 rc = m_parent->storeMetaDataInBuffers(*((int *)payload)); 2138 result.status = rc; 2139 result.request_api = evt; 2140 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2141 m_parent->signalAPIResult(&result); 2142 } 2143 break; 2144 case QCAMERA_SM_EVT_DUMP: 2145 { 2146 rc = m_parent->dump(*((int *)payload)); 2147 result.status = rc; 2148 result.request_api = evt; 2149 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2150 m_parent->signalAPIResult(&result); 2151 } 2152 break; 2153 case QCAMERA_SM_EVT_START_AUTO_FOCUS: 2154 { 2155 rc = m_parent->autoFocus(); 2156 result.status = rc; 2157 result.request_api = evt; 2158 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2159 m_parent->signalAPIResult(&result); 2160 } 2161 break; 2162 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS: 2163 { 2164 rc = m_parent->cancelAutoFocus(); 2165 result.status = rc; 2166 result.request_api = evt; 2167 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2168 m_parent->signalAPIResult(&result); 2169 } 2170 break; 2171 case QCAMERA_SM_EVT_SEND_COMMAND: 2172 { 2173 qcamera_sm_evt_command_payload_t *cmd_payload = 2174 (qcamera_sm_evt_command_payload_t *)payload; 2175 rc = m_parent->sendCommand(cmd_payload->cmd, 2176 cmd_payload->arg1, 2177 cmd_payload->arg2); 2178 result.status = rc; 2179 result.request_api = evt; 2180 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2181 m_parent->signalAPIResult(&result); 2182 } 2183 break; 2184 case QCAMERA_SM_EVT_TAKE_PICTURE: 2185 { 2186 m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING; 2187 rc = m_parent->takeLiveSnapshot(); 2188 if (rc != NO_ERROR) { 2189 m_state = QCAMERA_SM_STATE_RECORDING; 2190 } 2191 result.status = rc; 2192 result.request_api = evt; 2193 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2194 m_parent->signalAPIResult(&result); 2195 } 2196 break; 2197 case QCAMERA_SM_EVT_START_RECORDING: 2198 { 2199 // no ops here 2200 CDBG_HIGH("%s: already in recording state, no ops for start_recording", __func__); 2201 rc = 0; 2202 result.status = rc; 2203 result.request_api = evt; 2204 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2205 m_parent->signalAPIResult(&result); 2206 } 2207 break; 2208 case QCAMERA_SM_EVT_STOP_RECORDING: 2209 { 2210 rc = m_parent->stopRecording(); 2211 m_state = QCAMERA_SM_STATE_PREVIEWING; 2212 result.status = rc; 2213 result.request_api = evt; 2214 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2215 m_parent->signalAPIResult(&result); 2216 } 2217 break; 2218 case QCAMERA_SM_EVT_STOP_PREVIEW: 2219 { 2220 rc = m_parent->stopRecording(); 2221 m_state = QCAMERA_SM_STATE_PREVIEWING; 2222 2223 rc = m_parent->stopPreview(); 2224 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 2225 2226 result.status = rc; 2227 result.request_api = evt; 2228 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2229 m_parent->signalAPIResult(&result); 2230 } 2231 break; 2232 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME: 2233 { 2234 rc = m_parent->releaseRecordingFrame((const void *)payload); 2235 result.status = rc; 2236 result.request_api = evt; 2237 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2238 m_parent->signalAPIResult(&result); 2239 } 2240 break; 2241 case QCAMERA_SM_EVT_REG_FACE_IMAGE: 2242 { 2243 int32_t faceID = 0; 2244 qcamera_sm_evt_reg_face_payload_t *reg_payload = 2245 (qcamera_sm_evt_reg_face_payload_t *)payload; 2246 rc = m_parent->registerFaceImage(reg_payload->img_ptr, 2247 reg_payload->config, 2248 faceID); 2249 result.status = rc; 2250 result.request_api = evt; 2251 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE; 2252 result.handle = faceID; 2253 m_parent->signalAPIResult(&result); 2254 } 2255 break; 2256 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT: 2257 { 2258 //In Video snapshot, prepare hardware is a no-op. 2259 result.status = NO_ERROR; 2260 result.request_api = evt; 2261 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2262 m_parent->signalAPIResult(&result); 2263 } 2264 break; 2265 case QCAMERA_SM_EVT_CANCEL_PICTURE: 2266 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW: 2267 case QCAMERA_SM_EVT_RELEASE: 2268 { 2269 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 2270 rc = INVALID_OPERATION; 2271 result.status = rc; 2272 result.request_api = evt; 2273 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2274 m_parent->signalAPIResult(&result); 2275 } 2276 break; 2277 case QCAMERA_SM_EVT_EVT_INTERNAL: 2278 { 2279 qcamera_sm_internal_evt_payload_t *internal_evt = 2280 (qcamera_sm_internal_evt_payload_t *)payload; 2281 switch (internal_evt->evt_type) { 2282 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE: 2283 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data); 2284 break; 2285 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE: 2286 break; 2287 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT: 2288 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data); 2289 break; 2290 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS: 2291 rc = m_parent->processHistogramStats(internal_evt->stats_data); 2292 break; 2293 case QCAMERA_INTERNAL_EVT_CROP_INFO: 2294 rc = m_parent->processZoomEvent(internal_evt->crop_data); 2295 break; 2296 case QCAMERA_INTERNAL_EVT_ASD_UPDATE: 2297 rc = m_parent->processASDUpdate(internal_evt->asd_data); 2298 break; 2299 case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE: 2300 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 2301 break; 2302 case QCAMERA_INTERNAL_EVT_AWB_UPDATE: 2303 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data); 2304 break; 2305 case QCAMERA_INTERNAL_EVT_AE_UPDATE: 2306 rc = m_parent->processAEInfo(internal_evt->ae_data); 2307 break; 2308 case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE: 2309 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos); 2310 break; 2311 case QCAMERA_INTERNAL_EVT_HDR_UPDATE: 2312 rc = m_parent->processHDRData(internal_evt->hdr_data); 2313 break; 2314 case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK: 2315 rc = m_parent->processRetroAECUnlock(); 2316 break; 2317 case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE: 2318 rc = m_parent->processZSLCaptureDone(); 2319 break; 2320 default: 2321 break; 2322 } 2323 } 2324 break; 2325 case QCAMERA_SM_EVT_EVT_NOTIFY: 2326 { 2327 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload; 2328 switch (cam_evt->server_event_type) { 2329 case CAM_EVENT_TYPE_DAEMON_DIED: 2330 { 2331 //close the camera backend 2332 mm_camera_vtbl_t* handle = m_parent->mCameraHandle; 2333 if (handle && handle->ops) { 2334 handle->ops->error_close_camera(handle->camera_handle); 2335 } else { 2336 ALOGE("%s: Could not close because the handle or ops is NULL", 2337 __func__); 2338 } 2339 m_parent->sendEvtNotify(CAMERA_MSG_ERROR, 2340 CAMERA_ERROR_SERVER_DIED, 2341 0); 2342 } 2343 break; 2344 default: 2345 ALOGE("%s: Invalid internal event %d in state(%d)", 2346 __func__, cam_evt->server_event_type, m_state); 2347 break; 2348 } 2349 } 2350 break; 2351 case QCAMERA_SM_EVT_THERMAL_NOTIFY: 2352 { 2353 rc = m_parent->updateThermalLevel(payload); 2354 } 2355 break; 2356 case QCAMERA_SM_EVT_SNAPSHOT_DONE: 2357 { 2358 // No ops, but need to notify 2359 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 2360 result.status = rc; 2361 result.request_api = evt; 2362 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2363 m_parent->signalEvtResult(&result); 2364 } 2365 break; 2366 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY: 2367 default: 2368 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 2369 break; 2370 } 2371 2372 return rc; 2373 } 2374 2375 /*=========================================================================== 2376 * FUNCTION : procEvtVideoPicTakingState 2377 * 2378 * DESCRIPTION: finite state machine function to handle event in state of 2379 * QCAMERA_SM_STATE_VIDEO_PIC_TAKING. 2380 * 2381 * PARAMETERS : 2382 * @evt : event to be processed 2383 * @payload : event payload. Can be NULL if not needed. 2384 * 2385 * RETURN : int32_t type of status 2386 * NO_ERROR -- success 2387 * none-zero failure code 2388 *==========================================================================*/ 2389 int32_t QCameraStateMachine::procEvtVideoPicTakingState(qcamera_sm_evt_enum_t evt, 2390 void *payload) 2391 { 2392 int32_t rc = NO_ERROR; 2393 qcamera_api_result_t result; 2394 memset(&result, 0, sizeof(qcamera_api_result_t)); 2395 2396 ALOGV("%s: event (%d)", __func__, evt); 2397 switch (evt) { 2398 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW: 2399 { 2400 // Error setting preview window during previewing 2401 ALOGE("Error!! cannot set preview window when preview is running"); 2402 rc = INVALID_OPERATION; 2403 result.status = rc; 2404 result.request_api = evt; 2405 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2406 m_parent->signalAPIResult(&result); 2407 } 2408 break; 2409 case QCAMERA_SM_EVT_SET_CALLBACKS: 2410 { 2411 qcamera_sm_evt_setcb_payload_t *setcbs = 2412 (qcamera_sm_evt_setcb_payload_t *)payload; 2413 rc = m_parent->setCallBacks(setcbs->notify_cb, 2414 setcbs->data_cb, 2415 setcbs->data_cb_timestamp, 2416 setcbs->get_memory, 2417 setcbs->user); 2418 result.status = rc; 2419 result.request_api = evt; 2420 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2421 m_parent->signalAPIResult(&result); 2422 } 2423 break; 2424 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE: 2425 { 2426 rc = m_parent->enableMsgType(*((int32_t *)payload)); 2427 result.status = rc; 2428 result.request_api = evt; 2429 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2430 m_parent->signalAPIResult(&result); 2431 } 2432 break; 2433 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE: 2434 { 2435 rc = m_parent->disableMsgType(*((int32_t *)payload)); 2436 result.status = rc; 2437 result.request_api = evt; 2438 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2439 m_parent->signalAPIResult(&result); 2440 } 2441 break; 2442 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED: 2443 { 2444 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload)); 2445 result.status = rc; 2446 result.request_api = evt; 2447 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2448 result.enabled = enabled; 2449 m_parent->signalAPIResult(&result); 2450 } 2451 break; 2452 case QCAMERA_SM_EVT_SET_PARAMS: 2453 { 2454 bool needRestart = false; 2455 rc = m_parent->updateParameters((char*)payload, needRestart); 2456 if (rc == NO_ERROR) { 2457 if (needRestart) { 2458 // cannot set parameters that requires restart during recording 2459 ALOGE("%s: Error!! cannot set parameters that requires restart during recording", 2460 __func__); 2461 rc = BAD_VALUE; 2462 } else { 2463 rc = m_parent->commitParameterChanges(); 2464 } 2465 } 2466 result.status = rc; 2467 result.request_api = evt; 2468 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2469 m_parent->signalAPIResult(&result); 2470 } 2471 break; 2472 case QCAMERA_SM_EVT_GET_PARAMS: 2473 { 2474 result.params = m_parent->getParameters(); 2475 rc = NO_ERROR; 2476 result.status = rc; 2477 result.request_api = evt; 2478 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS; 2479 m_parent->signalAPIResult(&result); 2480 } 2481 break; 2482 case QCAMERA_SM_EVT_PUT_PARAMS: 2483 { 2484 rc = m_parent->putParameters((char*)payload); 2485 result.status = rc; 2486 result.request_api = evt; 2487 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2488 m_parent->signalAPIResult(&result); 2489 } 2490 break; 2491 case QCAMERA_SM_EVT_PREVIEW_ENABLED: 2492 { 2493 rc = NO_ERROR; 2494 result.status = rc; 2495 result.request_api = evt; 2496 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2497 result.enabled = 1; 2498 m_parent->signalAPIResult(&result); 2499 } 2500 break; 2501 case QCAMERA_SM_EVT_RECORDING_ENABLED: 2502 { 2503 rc = NO_ERROR; 2504 result.status = rc; 2505 result.request_api = evt; 2506 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2507 result.enabled = 1; 2508 m_parent->signalAPIResult(&result); 2509 } 2510 break; 2511 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS: 2512 { 2513 rc = m_parent->storeMetaDataInBuffers(*((int *)payload)); 2514 result.status = rc; 2515 result.request_api = evt; 2516 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2517 m_parent->signalAPIResult(&result); 2518 } 2519 break; 2520 case QCAMERA_SM_EVT_DUMP: 2521 { 2522 rc = m_parent->dump(*((int *)payload)); 2523 result.status = rc; 2524 result.request_api = evt; 2525 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2526 m_parent->signalAPIResult(&result); 2527 } 2528 break; 2529 case QCAMERA_SM_EVT_START_AUTO_FOCUS: 2530 { 2531 rc = m_parent->autoFocus(); 2532 result.status = rc; 2533 result.request_api = evt; 2534 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2535 m_parent->signalAPIResult(&result); 2536 } 2537 break; 2538 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS: 2539 { 2540 rc = m_parent->cancelAutoFocus(); 2541 result.status = rc; 2542 result.request_api = evt; 2543 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2544 m_parent->signalAPIResult(&result); 2545 } 2546 break; 2547 case QCAMERA_SM_EVT_SEND_COMMAND: 2548 { 2549 qcamera_sm_evt_command_payload_t *cmd_payload = 2550 (qcamera_sm_evt_command_payload_t *)payload; 2551 rc = m_parent->sendCommand(cmd_payload->cmd, 2552 cmd_payload->arg1, 2553 cmd_payload->arg2); 2554 result.status = rc; 2555 result.request_api = evt; 2556 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2557 m_parent->signalAPIResult(&result); 2558 } 2559 break; 2560 case QCAMERA_SM_EVT_STOP_RECORDING: 2561 { 2562 rc = m_parent->cancelLiveSnapshot(); 2563 m_state = QCAMERA_SM_STATE_RECORDING; 2564 2565 rc = m_parent->stopRecording(); 2566 m_state = QCAMERA_SM_STATE_PREVIEWING; 2567 2568 result.status = rc; 2569 result.request_api = evt; 2570 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2571 m_parent->signalAPIResult(&result); 2572 } 2573 break; 2574 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME: 2575 { 2576 rc = m_parent->releaseRecordingFrame((const void *)payload); 2577 result.status = rc; 2578 result.request_api = evt; 2579 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2580 m_parent->signalAPIResult(&result); 2581 } 2582 break; 2583 case QCAMERA_SM_EVT_CANCEL_PICTURE: 2584 { 2585 rc = m_parent->cancelLiveSnapshot(); 2586 m_state = QCAMERA_SM_STATE_RECORDING; 2587 result.status = rc; 2588 result.request_api = evt; 2589 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2590 m_parent->signalAPIResult(&result); 2591 } 2592 break; 2593 case QCAMERA_SM_EVT_REG_FACE_IMAGE: 2594 { 2595 int32_t faceID = 0; 2596 qcamera_sm_evt_reg_face_payload_t *reg_payload = 2597 (qcamera_sm_evt_reg_face_payload_t *)payload; 2598 rc = m_parent->registerFaceImage(reg_payload->img_ptr, 2599 reg_payload->config, 2600 faceID); 2601 result.status = rc; 2602 result.request_api = evt; 2603 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE; 2604 result.handle = faceID; 2605 m_parent->signalAPIResult(&result); 2606 } 2607 break; 2608 case QCAMERA_SM_EVT_STOP_PREVIEW: 2609 { 2610 rc = m_parent->cancelLiveSnapshot(); 2611 m_state = QCAMERA_SM_STATE_RECORDING; 2612 2613 rc = m_parent->stopRecording(); 2614 m_state = QCAMERA_SM_STATE_PREVIEWING; 2615 2616 rc = m_parent->stopPreview(); 2617 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 2618 2619 result.status = rc; 2620 result.request_api = evt; 2621 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2622 m_parent->signalAPIResult(&result); 2623 } 2624 break; 2625 case QCAMERA_SM_EVT_START_RECORDING: 2626 case QCAMERA_SM_EVT_START_PREVIEW: 2627 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW: 2628 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT: 2629 case QCAMERA_SM_EVT_TAKE_PICTURE: 2630 case QCAMERA_SM_EVT_RELEASE: 2631 { 2632 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 2633 rc = INVALID_OPERATION; 2634 result.status = rc; 2635 result.request_api = evt; 2636 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2637 m_parent->signalAPIResult(&result); 2638 } 2639 break; 2640 case QCAMERA_SM_EVT_EVT_INTERNAL: 2641 { 2642 qcamera_sm_internal_evt_payload_t *internal_evt = 2643 (qcamera_sm_internal_evt_payload_t *)payload; 2644 switch (internal_evt->evt_type) { 2645 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE: 2646 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data); 2647 break; 2648 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE: 2649 break; 2650 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT: 2651 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data); 2652 break; 2653 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS: 2654 rc = m_parent->processHistogramStats(internal_evt->stats_data); 2655 break; 2656 case QCAMERA_INTERNAL_EVT_CROP_INFO: 2657 rc = m_parent->processZoomEvent(internal_evt->crop_data); 2658 break; 2659 case QCAMERA_INTERNAL_EVT_ASD_UPDATE: 2660 rc = m_parent->processASDUpdate(internal_evt->asd_data); 2661 break; 2662 case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE: 2663 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 2664 break; 2665 case QCAMERA_INTERNAL_EVT_AWB_UPDATE: 2666 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data); 2667 break; 2668 case QCAMERA_INTERNAL_EVT_AE_UPDATE: 2669 rc = m_parent->processAEInfo(internal_evt->ae_data); 2670 break; 2671 case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE: 2672 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos); 2673 break; 2674 case QCAMERA_INTERNAL_EVT_HDR_UPDATE: 2675 rc = m_parent->processHDRData(internal_evt->hdr_data); 2676 break; 2677 case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK: 2678 rc = m_parent->processRetroAECUnlock(); 2679 break; 2680 case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE: 2681 rc = m_parent->processZSLCaptureDone(); 2682 break; 2683 default: 2684 break; 2685 } 2686 } 2687 break; 2688 case QCAMERA_SM_EVT_EVT_NOTIFY: 2689 { 2690 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload; 2691 switch (cam_evt->server_event_type) { 2692 case CAM_EVENT_TYPE_DAEMON_DIED: 2693 { 2694 //close the camera backend 2695 mm_camera_vtbl_t* handle = m_parent->mCameraHandle; 2696 if (handle && handle->ops) { 2697 handle->ops->error_close_camera(handle->camera_handle); 2698 } else { 2699 ALOGE("%s: Could not close because the handle or ops is NULL", 2700 __func__); 2701 } 2702 m_parent->sendEvtNotify(CAMERA_MSG_ERROR, 2703 CAMERA_ERROR_SERVER_DIED, 2704 0); 2705 } 2706 break; 2707 default: 2708 ALOGE("%s: Invalid internal event %d in state(%d)", 2709 __func__, cam_evt->server_event_type, m_state); 2710 break; 2711 } 2712 } 2713 break; 2714 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY: 2715 { 2716 qcamera_jpeg_evt_payload_t *jpeg_job = 2717 (qcamera_jpeg_evt_payload_t *)payload; 2718 rc = m_parent->processJpegNotify(jpeg_job); 2719 } 2720 break; 2721 case QCAMERA_SM_EVT_SNAPSHOT_DONE: 2722 { 2723 rc = m_parent->cancelLiveSnapshot(); 2724 m_state = QCAMERA_SM_STATE_RECORDING; 2725 result.status = rc; 2726 result.request_api = evt; 2727 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2728 m_parent->signalEvtResult(&result); 2729 } 2730 break; 2731 case QCAMERA_SM_EVT_THERMAL_NOTIFY: 2732 { 2733 rc = m_parent->updateThermalLevel(payload); 2734 } 2735 break; 2736 default: 2737 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 2738 break; 2739 } 2740 2741 return rc; 2742 } 2743 2744 /*=========================================================================== 2745 * FUNCTION : procEvtPreviewPicTakingState 2746 * 2747 * DESCRIPTION: finite state machine function to handle event in state of 2748 * QCAMERA_SM_STATE_PREVIEW_PIC_TAKING. 2749 * 2750 * PARAMETERS : 2751 * @evt : event to be processed 2752 * @payload : event payload. Can be NULL if not needed. 2753 * 2754 * RETURN : int32_t type of status 2755 * NO_ERROR -- success 2756 * none-zero failure code 2757 *==========================================================================*/ 2758 int32_t QCameraStateMachine::procEvtPreviewPicTakingState(qcamera_sm_evt_enum_t evt, 2759 void *payload) 2760 { 2761 int32_t rc = NO_ERROR; 2762 qcamera_api_result_t result; 2763 memset(&result, 0, sizeof(qcamera_api_result_t)); 2764 2765 ALOGV("%s: event (%d)", __func__, evt); 2766 switch (evt) { 2767 case QCAMERA_SM_EVT_SET_CALLBACKS: 2768 { 2769 qcamera_sm_evt_setcb_payload_t *setcbs = 2770 (qcamera_sm_evt_setcb_payload_t *)payload; 2771 rc = m_parent->setCallBacks(setcbs->notify_cb, 2772 setcbs->data_cb, 2773 setcbs->data_cb_timestamp, 2774 setcbs->get_memory, 2775 setcbs->user); 2776 result.status = rc; 2777 result.request_api = evt; 2778 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2779 m_parent->signalAPIResult(&result); 2780 } 2781 break; 2782 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE: 2783 { 2784 rc = m_parent->enableMsgType(*((int32_t *)payload)); 2785 result.status = rc; 2786 result.request_api = evt; 2787 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2788 m_parent->signalAPIResult(&result); 2789 } 2790 break; 2791 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE: 2792 { 2793 rc = m_parent->disableMsgType(*((int32_t *)payload)); 2794 result.status = rc; 2795 result.request_api = evt; 2796 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2797 m_parent->signalAPIResult(&result); 2798 } 2799 break; 2800 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED: 2801 { 2802 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload)); 2803 result.status = rc; 2804 result.request_api = evt; 2805 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2806 result.enabled = enabled; 2807 m_parent->signalAPIResult(&result); 2808 } 2809 break; 2810 case QCAMERA_SM_EVT_SET_PARAMS: 2811 { 2812 bool needRestart = false; 2813 rc = m_parent->updateParameters((char*)payload, needRestart); 2814 if (rc == NO_ERROR) { 2815 if (needRestart) { 2816 // need restart preview for parameters to take effect 2817 // stop preview 2818 m_parent->stopPreview(); 2819 // Clear memory pools 2820 m_parent->m_memoryPool.clear(); 2821 // commit parameter changes to server 2822 m_parent->commitParameterChanges(); 2823 // start preview again 2824 rc = m_parent->preparePreview(); 2825 if (rc == NO_ERROR) { 2826 applyDelayedMsgs(); 2827 rc = m_parent->startPreview(); 2828 if (rc != NO_ERROR) { 2829 m_parent->unpreparePreview(); 2830 } 2831 } 2832 if (rc != NO_ERROR) { 2833 m_state = QCAMERA_SM_STATE_PIC_TAKING; 2834 } 2835 } else { 2836 rc = m_parent->commitParameterChanges(); 2837 } 2838 } 2839 result.status = rc; 2840 result.request_api = evt; 2841 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2842 m_parent->signalAPIResult(&result); 2843 } 2844 break; 2845 case QCAMERA_SM_EVT_GET_PARAMS: 2846 { 2847 result.params = m_parent->getParameters(); 2848 rc = NO_ERROR; 2849 result.status = rc; 2850 result.request_api = evt; 2851 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS; 2852 m_parent->signalAPIResult(&result); 2853 } 2854 break; 2855 case QCAMERA_SM_EVT_PUT_PARAMS: 2856 { 2857 rc = m_parent->putParameters((char*)payload); 2858 result.status = rc; 2859 result.request_api = evt; 2860 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2861 m_parent->signalAPIResult(&result); 2862 } 2863 break; 2864 case QCAMERA_SM_EVT_PREVIEW_ENABLED: 2865 { 2866 rc = NO_ERROR; 2867 result.status = rc; 2868 result.request_api = evt; 2869 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2870 result.enabled = 1; 2871 m_parent->signalAPIResult(&result); 2872 } 2873 break; 2874 case QCAMERA_SM_EVT_RECORDING_ENABLED: 2875 { 2876 rc = NO_ERROR; 2877 result.status = rc; 2878 result.request_api = evt; 2879 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2880 result.enabled = 0; 2881 m_parent->signalAPIResult(&result); 2882 } 2883 break; 2884 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS: 2885 { 2886 rc = m_parent->storeMetaDataInBuffers(*((int *)payload)); 2887 result.status = rc; 2888 result.request_api = evt; 2889 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2890 m_parent->signalAPIResult(&result); 2891 } 2892 break; 2893 case QCAMERA_SM_EVT_DUMP: 2894 { 2895 rc = m_parent->dump(*((int *)payload)); 2896 result.status = rc; 2897 result.request_api = evt; 2898 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2899 m_parent->signalAPIResult(&result); 2900 } 2901 break; 2902 case QCAMERA_SM_EVT_START_AUTO_FOCUS: 2903 { 2904 rc = m_parent->autoFocus(); 2905 result.status = rc; 2906 result.request_api = evt; 2907 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2908 m_parent->signalAPIResult(&result); 2909 } 2910 break; 2911 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS: 2912 { 2913 rc = m_parent->cancelAutoFocus(); 2914 result.status = rc; 2915 result.request_api = evt; 2916 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2917 m_parent->signalAPIResult(&result); 2918 } 2919 break; 2920 case QCAMERA_SM_EVT_SEND_COMMAND: 2921 { 2922 qcamera_sm_evt_command_payload_t *cmd_payload = 2923 (qcamera_sm_evt_command_payload_t *)payload; 2924 rc = m_parent->sendCommand(cmd_payload->cmd, 2925 cmd_payload->arg1, 2926 cmd_payload->arg2); 2927 #ifndef VANILLA_HAL 2928 if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) { 2929 // move state to previewing state 2930 m_state = QCAMERA_SM_STATE_PREVIEWING; 2931 } 2932 #endif 2933 result.status = rc; 2934 result.request_api = evt; 2935 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2936 m_parent->signalAPIResult(&result); 2937 } 2938 break; 2939 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME: 2940 { 2941 rc = m_parent->releaseRecordingFrame((const void *)payload); 2942 result.status = rc; 2943 result.request_api = evt; 2944 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2945 m_parent->signalAPIResult(&result); 2946 } 2947 break; 2948 case QCAMERA_SM_EVT_CANCEL_PICTURE: 2949 { 2950 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) { 2951 rc = m_parent->cancelPicture(); 2952 } else { 2953 rc = m_parent->cancelLiveSnapshot(); 2954 } 2955 m_state = QCAMERA_SM_STATE_PREVIEWING; 2956 result.status = rc; 2957 result.request_api = evt; 2958 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2959 m_parent->signalAPIResult(&result); 2960 } 2961 break; 2962 case QCAMERA_SM_EVT_STOP_PREVIEW: 2963 { 2964 if (m_parent->isZSLMode()) { 2965 // cancel picture first 2966 rc = m_parent->cancelPicture(); 2967 m_parent->stopChannel(QCAMERA_CH_TYPE_ZSL); 2968 } else if (m_parent->isLongshotEnabled()) { 2969 // just cancel picture 2970 rc = m_parent->cancelPicture(); 2971 } else { 2972 rc = m_parent->cancelLiveSnapshot(); 2973 m_parent->stopChannel(QCAMERA_CH_TYPE_PREVIEW); 2974 } 2975 // unprepare preview 2976 m_parent->unpreparePreview(); 2977 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 2978 result.status = rc; 2979 result.request_api = evt; 2980 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2981 m_parent->signalAPIResult(&result); 2982 } 2983 break; 2984 case QCAMERA_SM_EVT_START_RECORDING: 2985 { 2986 if (m_parent->isZSLMode()) { 2987 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d) in ZSL mode", 2988 __func__, evt, m_state); 2989 rc = INVALID_OPERATION; 2990 } else if (m_parent->isLongshotEnabled()) { 2991 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d) in Longshot mode", 2992 __func__, evt, m_state); 2993 rc = INVALID_OPERATION; 2994 } else { 2995 rc = m_parent->startRecording(); 2996 if (rc == NO_ERROR) { 2997 m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING; 2998 } 2999 } 3000 result.status = rc; 3001 result.request_api = evt; 3002 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3003 m_parent->signalAPIResult(&result); 3004 } 3005 break; 3006 case QCAMERA_SM_EVT_REG_FACE_IMAGE: 3007 { 3008 int32_t faceID = 0; 3009 qcamera_sm_evt_reg_face_payload_t *reg_payload = 3010 (qcamera_sm_evt_reg_face_payload_t *)payload; 3011 rc = m_parent->registerFaceImage(reg_payload->img_ptr, 3012 reg_payload->config, 3013 faceID); 3014 result.status = rc; 3015 result.request_api = evt; 3016 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE; 3017 result.handle = faceID; 3018 m_parent->signalAPIResult(&result); 3019 } 3020 break; 3021 case QCAMERA_SM_EVT_TAKE_PICTURE: 3022 { 3023 if ( m_parent->isLongshotEnabled() ) { 3024 rc = m_parent->longShot(); 3025 } else { 3026 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 3027 rc = INVALID_OPERATION; 3028 } 3029 3030 result.status = rc; 3031 result.request_api = evt; 3032 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3033 m_parent->signalAPIResult(&result); 3034 } 3035 break; 3036 3037 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT: 3038 { 3039 ALOGD("%s: [ZSL Retro]Prepare Snapshot", __func__); 3040 if (m_parent->isRetroPicture()) { 3041 ALOGD("%s: [ZSL Retro] Prepare Snapshot in Retro Mode", __func__); 3042 rc = m_parent->prepareHardwareForSnapshot(FALSE); 3043 if (rc != NO_ERROR) { 3044 ALOGE("%s: [ZSL Retro]prepareHardwareForSnapshot failed %d", 3045 __func__, rc); 3046 result.status = rc; 3047 result.request_api = evt; 3048 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3049 m_parent->signalAPIResult(&result); 3050 } 3051 } 3052 else { 3053 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", 3054 __func__, evt, m_state); 3055 rc = INVALID_OPERATION; 3056 result.status = rc; 3057 result.request_api = evt; 3058 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3059 m_parent->signalAPIResult(&result); 3060 } 3061 } 3062 break; 3063 case QCAMERA_SM_EVT_STOP_RECORDING: 3064 case QCAMERA_SM_EVT_START_PREVIEW: 3065 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW: 3066 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW: 3067 case QCAMERA_SM_EVT_RELEASE: 3068 { 3069 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 3070 rc = INVALID_OPERATION; 3071 result.status = rc; 3072 result.request_api = evt; 3073 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3074 m_parent->signalAPIResult(&result); 3075 } 3076 break; 3077 case QCAMERA_SM_EVT_EVT_INTERNAL: 3078 { 3079 qcamera_sm_internal_evt_payload_t *internal_evt = 3080 (qcamera_sm_internal_evt_payload_t *)payload; 3081 switch (internal_evt->evt_type) { 3082 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE: 3083 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data); 3084 break; 3085 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE: 3086 ALOGD("%s: [ZSL Retro]Received QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE event", 3087 __func__); 3088 if (m_parent->isRetroPicture()) { 3089 m_parent->processPrepSnapshotDoneEvent(internal_evt->prep_snapshot_state); 3090 ALOGD("%s: [ZSL Retro] Retro picture", __func__); 3091 result.status = NO_ERROR; 3092 result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT; 3093 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3094 m_parent->signalAPIResult(&result); 3095 } 3096 else { 3097 ALOGE("%s: [ZSL Retro] Invalid Case for " 3098 "QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT event", __func__); 3099 } 3100 break; 3101 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT: 3102 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data); 3103 break; 3104 case QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT: 3105 // This is valid only in Retro picture Mode 3106 if (m_parent->isRetroPicture()) { 3107 ALOGD("%s: [ZSL Retro] Received QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT event", 3108 __func__); 3109 result.status = NO_ERROR; 3110 result.request_api = QCAMERA_SM_EVT_TAKE_PICTURE; 3111 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3112 m_parent->signalAPIResult(&result); 3113 } 3114 else { 3115 ALOGD("%s: [ZSL Retro] Wrong Case for " 3116 "QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT event", __func__); 3117 } 3118 break; 3119 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS: 3120 rc = m_parent->processHistogramStats(internal_evt->stats_data); 3121 break; 3122 case QCAMERA_INTERNAL_EVT_CROP_INFO: 3123 rc = m_parent->processZoomEvent(internal_evt->crop_data); 3124 break; 3125 case QCAMERA_INTERNAL_EVT_ASD_UPDATE: 3126 rc = m_parent->processASDUpdate(internal_evt->asd_data); 3127 break; 3128 case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE: 3129 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 3130 break; 3131 case QCAMERA_INTERNAL_EVT_AWB_UPDATE: 3132 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data); 3133 break; 3134 case QCAMERA_INTERNAL_EVT_AE_UPDATE: 3135 rc = m_parent->processAEInfo(internal_evt->ae_data); 3136 break; 3137 case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE: 3138 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos); 3139 break; 3140 case QCAMERA_INTERNAL_EVT_HDR_UPDATE: 3141 rc = m_parent->processHDRData(internal_evt->hdr_data); 3142 break; 3143 case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK: 3144 rc = m_parent->processRetroAECUnlock(); 3145 break; 3146 case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE: 3147 rc = m_parent->processZSLCaptureDone(); 3148 break; 3149 default: 3150 break; 3151 } 3152 } 3153 break; 3154 case QCAMERA_SM_EVT_EVT_NOTIFY: 3155 { 3156 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload; 3157 switch (cam_evt->server_event_type) { 3158 case CAM_EVENT_TYPE_DAEMON_DIED: 3159 { 3160 //close the camera backend 3161 mm_camera_vtbl_t* handle = m_parent->mCameraHandle; 3162 if (handle && handle->ops) { 3163 handle->ops->error_close_camera(handle->camera_handle); 3164 } else { 3165 ALOGE("%s: Could not close because the handle or ops is NULL", 3166 __func__); 3167 } 3168 m_parent->sendEvtNotify(CAMERA_MSG_ERROR, 3169 CAMERA_ERROR_SERVER_DIED, 3170 0); 3171 } 3172 break; 3173 default: 3174 ALOGE("%s: Invalid internal event %d in state(%d)", 3175 __func__, cam_evt->server_event_type, m_state); 3176 break; 3177 } 3178 } 3179 break; 3180 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY: 3181 { 3182 ALOGV("%s: [ZSL Retro] Calling Process Jpeg Notify", 3183 __func__); 3184 qcamera_jpeg_evt_payload_t *jpeg_job = 3185 (qcamera_jpeg_evt_payload_t *)payload; 3186 rc = m_parent->processJpegNotify(jpeg_job); 3187 } 3188 break; 3189 case QCAMERA_SM_EVT_SNAPSHOT_DONE: 3190 { 3191 ALOGV("%s: [ZSL Retro] Snapshot Done", __func__); 3192 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) { 3193 rc = m_parent->cancelPicture(); 3194 } else { 3195 rc = m_parent->cancelLiveSnapshot(); 3196 } 3197 m_state = QCAMERA_SM_STATE_PREVIEWING; 3198 if (m_parent->isRetroPicture()){ 3199 result.status = rc; 3200 result.request_api = evt; 3201 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3202 ALOGV("\n Signalling for JPEG snapshot done!!"); 3203 m_parent->signalAPIResult(&result); 3204 3205 } 3206 result.status = rc; 3207 result.request_api = evt; 3208 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3209 m_parent->signalEvtResult(&result); 3210 } 3211 break; 3212 case QCAMERA_SM_EVT_THERMAL_NOTIFY: 3213 { 3214 rc = m_parent->updateThermalLevel(payload); 3215 } 3216 break; 3217 default: 3218 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 3219 break; 3220 } 3221 3222 return rc; 3223 } 3224 3225 /*=========================================================================== 3226 * FUNCTION : isRecording 3227 * 3228 * DESCRIPTION: check if recording is in process. 3229 * 3230 * PARAMETERS : None 3231 * 3232 * RETURN : true -- recording 3233 * false -- not in recording mode 3234 *==========================================================================*/ 3235 bool QCameraStateMachine::isRecording() 3236 { 3237 switch (m_state) { 3238 case QCAMERA_SM_STATE_RECORDING: 3239 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING: 3240 return true; 3241 default: 3242 return false; 3243 } 3244 } 3245 3246 /*=========================================================================== 3247 * FUNCTION : isPreviewRunning 3248 * 3249 * DESCRIPTION: check if preview is in process. 3250 * 3251 * PARAMETERS : None 3252 * 3253 * RETURN : true -- preview running 3254 * false -- preview stopped 3255 *==========================================================================*/ 3256 bool QCameraStateMachine::isPreviewRunning() 3257 { 3258 switch (m_state) { 3259 case QCAMERA_SM_STATE_PREVIEWING: 3260 case QCAMERA_SM_STATE_RECORDING: 3261 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING: 3262 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING: 3263 case QCAMERA_SM_STATE_PREPARE_SNAPSHOT: 3264 case QCAMERA_SM_STATE_PREVIEW_READY: 3265 return true; 3266 default: 3267 return false; 3268 } 3269 } 3270 3271 /*=========================================================================== 3272 * FUNCTION : isPreviewReady 3273 * 3274 * DESCRIPTION: check if preview is in ready state. 3275 * 3276 * PARAMETERS : None 3277 * 3278 * RETURN : true -- preview is in ready state 3279 * false -- preview is stopped 3280 *==========================================================================*/ 3281 bool QCameraStateMachine::isPreviewReady() 3282 { 3283 switch (m_state) { 3284 case QCAMERA_SM_STATE_PREVIEW_READY: 3285 return true; 3286 default: 3287 return false; 3288 } 3289 } 3290 3291 /*=========================================================================== 3292 * FUNCTION : isCaptureRunning 3293 * 3294 * DESCRIPTION: check if image capture is in process. 3295 * 3296 * PARAMETERS : None 3297 * 3298 * RETURN : true -- capture running 3299 * false -- capture stopped 3300 *==========================================================================*/ 3301 bool QCameraStateMachine::isCaptureRunning() 3302 { 3303 switch (m_state) { 3304 case QCAMERA_SM_STATE_PIC_TAKING: 3305 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING: 3306 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING: 3307 return true; 3308 default: 3309 return false; 3310 } 3311 } 3312 /*=========================================================================== 3313 * FUNCTION : isNonZSLCaptureRunning 3314 * 3315 * DESCRIPTION: check if image capture is in process in non ZSL mode. 3316 * 3317 * PARAMETERS : None 3318 * 3319 * RETURN : true -- capture running in non ZSL mode 3320 * false -- Either in not capture mode or captur is not in non ZSL mode 3321 *==========================================================================*/ 3322 bool QCameraStateMachine::isNonZSLCaptureRunning() 3323 { 3324 switch (m_state) { 3325 case QCAMERA_SM_STATE_PIC_TAKING: 3326 return true; 3327 default: 3328 return false; 3329 } 3330 } 3331 3332 /*=========================================================================== 3333 * FUNCTION : dump 3334 * 3335 * DESCRIPTION: Composes a string based on current configuration 3336 * 3337 * PARAMETERS : none 3338 * 3339 * RETURN : Formatted string 3340 *==========================================================================*/ 3341 String8 QCameraStateMachine::dump() 3342 { 3343 String8 str("\n"); 3344 char s[128]; 3345 3346 snprintf(s, 128, "Is Preview Running: %d\n", isPreviewRunning()); 3347 str += s; 3348 3349 snprintf(s, 128, "Is Capture Running: %d\n", isCaptureRunning()); 3350 str += s; 3351 3352 snprintf(s, 128, "Is Non ZSL Capture Running: %d\n", 3353 isNonZSLCaptureRunning()); 3354 str += s; 3355 3356 snprintf(s, 128, "Current State: %d \n", m_state); 3357 str += s; 3358 3359 switch(m_state){ 3360 case QCAMERA_SM_STATE_PREVIEW_STOPPED: 3361 snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEW_STOPPED \n"); 3362 break; 3363 3364 case QCAMERA_SM_STATE_PREVIEW_READY: 3365 snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEW_READY \n"); 3366 break; 3367 3368 case QCAMERA_SM_STATE_PREVIEWING: 3369 snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEWING \n"); 3370 break; 3371 3372 case QCAMERA_SM_STATE_PREPARE_SNAPSHOT: 3373 snprintf(s, 128, " QCAMERA_SM_STATE_PREPARE_SNAPSHOT \n"); 3374 break; 3375 3376 case QCAMERA_SM_STATE_PIC_TAKING: 3377 snprintf(s, 128, " QCAMERA_SM_STATE_PIC_TAKING \n"); 3378 break; 3379 3380 case QCAMERA_SM_STATE_RECORDING: 3381 snprintf(s, 128, " QCAMERA_SM_STATE_RECORDING \n"); 3382 break; 3383 3384 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING: 3385 snprintf(s, 128, " QCAMERA_SM_STATE_VIDEO_PIC_TAKING \n"); 3386 break; 3387 3388 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING: 3389 snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEW_PIC_TAKING \n"); 3390 break; 3391 } 3392 str += s; 3393 3394 return str; 3395 } 3396 3397 }; // namespace qcamera 3398