summaryrefslogtreecommitdiff
path: root/camera/QCamera2/HAL/QCameraStateMachine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'camera/QCamera2/HAL/QCameraStateMachine.cpp')
-rw-r--r--camera/QCamera2/HAL/QCameraStateMachine.cpp3033
1 files changed, 0 insertions, 3033 deletions
diff --git a/camera/QCamera2/HAL/QCameraStateMachine.cpp b/camera/QCamera2/HAL/QCameraStateMachine.cpp
deleted file mode 100644
index e477ab1..0000000
--- a/camera/QCamera2/HAL/QCameraStateMachine.cpp
+++ /dev/null
@@ -1,3033 +0,0 @@
-/* Copyright (c) 2012-2015, The Linux Foundataion. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are
-* met:
-* * Redistributions of source code must retain the above copyright
-* notice, this list of conditions and the following disclaimer.
-* * Redistributions in binary form must reproduce the above
-* copyright notice, this list of conditions and the following
-* disclaimer in the documentation and/or other materials provided
-* with the distribution.
-* * Neither the name of The Linux Foundation nor the names of its
-* contributors may be used to endorse or promote products derived
-* from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-*/
-
-#define LOG_TAG "QCameraStateMachine"
-
-#include <utils/Errors.h>
-#include "QCamera2HWI.h"
-#include "QCameraStateMachine.h"
-
-namespace qcamera {
-
-/*===========================================================================
- * FUNCTION : smEvtProcRoutine
- *
- * DESCRIPTION: Statemachine process thread routine to handle events
- * in different state.
- *
- * PARAMETERS :
- * @data : ptr to QCameraStateMachine object
- *
- * RETURN : none
- *==========================================================================*/
-void *QCameraStateMachine::smEvtProcRoutine(void *data)
-{
- int running = 1, ret;
- QCameraStateMachine *pme = (QCameraStateMachine *)data;
-
- CDBG_HIGH("%s: E", __func__);
- do {
- do {
- ret = cam_sem_wait(&pme->cmd_sem);
- if (ret != 0 && errno != EINVAL) {
- ALOGE("%s: cam_sem_wait error (%s)",
- __func__, strerror(errno));
- return NULL;
- }
- } while (ret != 0);
-
- // we got notified about new cmd avail in cmd queue
- // first check API cmd queue
- qcamera_sm_cmd_t *node = (qcamera_sm_cmd_t *)pme->api_queue.dequeue();
- if (node == NULL) {
- // no API cmd, then check evt cmd queue
- node = (qcamera_sm_cmd_t *)pme->evt_queue.dequeue();
- }
- if (node != NULL) {
- switch (node->cmd) {
- case QCAMERA_SM_CMD_TYPE_API:
- pme->stateMachine(node->evt, node->evt_payload);
- // API is in a way sync call, so evt_payload is managed by HWI
- // no need to free payload for API
- break;
- case QCAMERA_SM_CMD_TYPE_EVT:
- pme->stateMachine(node->evt, node->evt_payload);
-
- // EVT is async call, so payload need to be free after use
- free(node->evt_payload);
- node->evt_payload = NULL;
- break;
- case QCAMERA_SM_CMD_TYPE_EXIT:
- running = 0;
- break;
- default:
- break;
- }
- free(node);
- node = NULL;
- }
- } while (running);
- CDBG_HIGH("%s: X", __func__);
- return NULL;
-}
-
-/*===========================================================================
- * FUNCTION : QCameraStateMachine
- *
- * DESCRIPTION: constructor of QCameraStateMachine. Will start process thread
- *
- * PARAMETERS :
- * @ctrl : ptr to HWI object
- *
- * RETURN : none
- *==========================================================================*/
-QCameraStateMachine::QCameraStateMachine(QCamera2HardwareInterface *ctrl) :
- api_queue(),
- evt_queue()
-{
- m_parent = ctrl;
- m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
- cmd_pid = 0;
- cam_sem_init(&cmd_sem, 0);
- pthread_create(&cmd_pid,
- NULL,
- smEvtProcRoutine,
- this);
- pthread_setname_np(cmd_pid, "CAM_stMachine");
-}
-
-/*===========================================================================
- * FUNCTION : ~QCameraStateMachine
- *
- * DESCRIPTION: desctructor of QCameraStateMachine. Will stop process thread.
- *
- * PARAMETERS : none
- *
- * RETURN : none
- *==========================================================================*/
-QCameraStateMachine::~QCameraStateMachine()
-{
- cam_sem_destroy(&cmd_sem);
-}
-
-/*===========================================================================
- * FUNCTION : releaseThread
- *
- * DESCRIPTION: Sends an exit command and terminates the state machine thread
- *
- * PARAMETERS : none
- *
- * RETURN : none
- *==========================================================================*/
-void QCameraStateMachine::releaseThread()
-{
- if (cmd_pid != 0) {
- qcamera_sm_cmd_t *node =
- (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
- if (NULL != node) {
- memset(node, 0, sizeof(qcamera_sm_cmd_t));
- node->cmd = QCAMERA_SM_CMD_TYPE_EXIT;
-
- api_queue.enqueue((void *)node);
- cam_sem_post(&cmd_sem);
-
- /* wait until cmd thread exits */
- if (pthread_join(cmd_pid, NULL) != 0) {
- CDBG_HIGH("%s: pthread dead already\n", __func__);
- }
- }
- cmd_pid = 0;
- }
-}
-
-/*===========================================================================
- * FUNCTION : procAPI
- *
- * DESCRIPTION: process incoming API request from framework layer.
- *
- * PARAMETERS :
- * @evt : event to be processed
- * @api_payload : API payload. Can be NULL if not needed.
- *
- * RETURN : int32_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-int32_t QCameraStateMachine::procAPI(qcamera_sm_evt_enum_t evt,
- void *api_payload)
-{
- qcamera_sm_cmd_t *node =
- (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
- if (NULL == node) {
- ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
- return NO_MEMORY;
- }
-
- memset(node, 0, sizeof(qcamera_sm_cmd_t));
- node->cmd = QCAMERA_SM_CMD_TYPE_API;
- node->evt = evt;
- node->evt_payload = api_payload;
- if (api_queue.enqueue((void *)node)) {
- cam_sem_post(&cmd_sem);
- return NO_ERROR;
- } else {
- free(node);
- return UNKNOWN_ERROR;
- }
-}
-
-/*===========================================================================
- * FUNCTION : procEvt
- *
- * DESCRIPTION: process incoming envent from mm-camera-interface and
- * mm-jpeg-interface.
- *
- * PARAMETERS :
- * @evt : event to be processed
- * @evt_payload : event payload. Can be NULL if not needed.
- *
- * RETURN : int32_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-int32_t QCameraStateMachine::procEvt(qcamera_sm_evt_enum_t evt,
- void *evt_payload)
-{
- qcamera_sm_cmd_t *node =
- (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
- if (NULL == node) {
- ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
- return NO_MEMORY;
- }
-
- memset(node, 0, sizeof(qcamera_sm_cmd_t));
- node->cmd = QCAMERA_SM_CMD_TYPE_EVT;
- node->evt = evt;
- node->evt_payload = evt_payload;
- if (evt_queue.enqueue((void *)node)) {
- cam_sem_post(&cmd_sem);
- return NO_ERROR;
- } else {
- free(node);
- return UNKNOWN_ERROR;
- }
-}
-
-/*===========================================================================
- * FUNCTION : stateMachine
- *
- * DESCRIPTION: finite state machine entry function. Depends on state,
- * incoming event will be handled differently.
- *
- * PARAMETERS :
- * @evt : event to be processed
- * @payload : event payload. Can be NULL if not needed.
- *
- * RETURN : int32_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-int32_t QCameraStateMachine::stateMachine(qcamera_sm_evt_enum_t evt, void *payload)
-{
- int32_t rc = NO_ERROR;
- switch (m_state) {
- case QCAMERA_SM_STATE_PREVIEW_STOPPED:
- rc = procEvtPreviewStoppedState(evt, payload);
- break;
- case QCAMERA_SM_STATE_PREVIEW_READY:
- rc = procEvtPreviewReadyState(evt, payload);
- break;
- case QCAMERA_SM_STATE_PREVIEWING:
- rc = procEvtPreviewingState(evt, payload);
- break;
- case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
- rc = procEvtPrepareSnapshotState(evt, payload);
- break;
- case QCAMERA_SM_STATE_PIC_TAKING:
- rc = procEvtPicTakingState(evt, payload);
- break;
- case QCAMERA_SM_STATE_RECORDING:
- rc = procEvtRecordingState(evt, payload);
- break;
- case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
- rc = procEvtVideoPicTakingState(evt, payload);
- break;
- case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
- rc = procEvtPreviewPicTakingState(evt, payload);
- break;
- default:
- break;
- }
-
- return rc;
-}
-
-/*===========================================================================
- * FUNCTION : procEvtPreviewStoppedState
- *
- * DESCRIPTION: finite state machine function to handle event in state of
- * QCAMERA_SM_STATE_PREVIEW_STOPPED.
- *
- * PARAMETERS :
- * @evt : event to be processed
- * @payload : event payload. Can be NULL if not needed.
- *
- * RETURN : int32_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-int32_t QCameraStateMachine::procEvtPreviewStoppedState(qcamera_sm_evt_enum_t evt,
- void *payload)
-{
- int32_t rc = NO_ERROR;
- qcamera_api_result_t result;
- memset(&result, 0, sizeof(qcamera_api_result_t));
-
- switch (evt) {
- case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
- {
- rc = m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SET_CALLBACKS:
- {
- qcamera_sm_evt_setcb_payload_t *setcbs =
- (qcamera_sm_evt_setcb_payload_t *)payload;
- rc = m_parent->setCallBacks(setcbs->notify_cb,
- setcbs->data_cb,
- setcbs->data_cb_timestamp,
- setcbs->get_memory,
- setcbs->user);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
- {
- rc = m_parent->enableMsgType(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
- {
- rc = m_parent->disableMsgType(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
- {
- int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = enabled;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SET_PARAMS:
- {
- bool needRestart = false;
- rc = m_parent->updateParameters((char*)payload, needRestart);
- if (needRestart) {
- // Clear memory pools
- m_parent->m_memoryPool.clear();
- }
- if (rc == NO_ERROR) {
- rc = m_parent->commitParameterChanges();
- }
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_GET_PARAMS:
- {
- result.params = m_parent->getParameters();
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PUT_PARAMS:
- {
- rc = m_parent->putParameters((char*)payload);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_PREVIEW:
- {
- if (m_parent->mPreviewWindow == NULL) {
- rc = m_parent->preparePreview();
- if(rc == NO_ERROR) {
- // preview window is not set yet, move to previewReady state
- m_state = QCAMERA_SM_STATE_PREVIEW_READY;
- } else {
- ALOGE("%s: preparePreview failed",__func__);
- }
- } else {
- rc = m_parent->preparePreview();
- if (rc == NO_ERROR) {
- rc = m_parent->startPreview();
- if (rc != NO_ERROR) {
- m_parent->unpreparePreview();
- } else {
- // start preview success, move to previewing state
- m_state = QCAMERA_SM_STATE_PREVIEWING;
- }
- }
- }
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
- {
- rc = m_parent->preparePreview();
- if (rc == NO_ERROR) {
- rc = m_parent->startPreview();
- if (rc != NO_ERROR) {
- m_parent->unpreparePreview();
- } else {
- m_state = QCAMERA_SM_STATE_PREVIEWING;
- }
- }
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_PREVIEW:
- {
- // no op needed here
- CDBG_HIGH("%s: already in preview stopped state, do nothing", __func__);
- result.status = NO_ERROR;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PREVIEW_ENABLED:
- case QCAMERA_SM_EVT_RECORDING_ENABLED:
- {
- result.status = NO_ERROR;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = 0;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_RELEASE:
- {
- rc = m_parent->release();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
- {
- rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_DUMP:
- {
- rc = m_parent->dump(*((int *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SEND_COMMAND:
- {
- qcamera_sm_evt_command_payload_t *cmd_payload =
- (qcamera_sm_evt_command_payload_t *)payload;
- rc = m_parent->sendCommand(cmd_payload->cmd,
- cmd_payload->arg1,
- cmd_payload->arg2);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_RECORDING:
- case QCAMERA_SM_EVT_STOP_RECORDING:
- case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
- case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
- case QCAMERA_SM_EVT_TAKE_PICTURE:
- {
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- rc = INVALID_OPERATION;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_AUTO_FOCUS:
- case QCAMERA_SM_EVT_CANCEL_PICTURE:
- {
- // no op needed here
- CDBG_HIGH("%s: No ops for evt(%d) in state(%d)", __func__, evt, m_state);
- result.status = NO_ERROR;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
- {
- rc = m_parent->cancelAutoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_REG_FACE_IMAGE:
- {
- int32_t faceID = 0;
- qcamera_sm_evt_reg_face_payload_t *reg_payload =
- (qcamera_sm_evt_reg_face_payload_t *)payload;
- rc = m_parent->registerFaceImage(reg_payload->img_ptr,
- reg_payload->config,
- faceID);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
- result.handle = faceID;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_THERMAL_NOTIFY:
- {
- rc = m_parent->updateThermalLevel(
- *((qcamera_thermal_level_enum_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_EVT_NOTIFY:
- {
- mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
- switch (cam_evt->server_event_type) {
- case CAM_EVENT_TYPE_DAEMON_DIED:
- {
- m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
- CAMERA_ERROR_SERVER_DIED,
- 0);
- }
- break;
- default:
- ALOGE("%s: Invalid internal event %d in state(%d)",
- __func__, cam_evt->server_event_type, m_state);
- break;
- }
- }
- break;
- case QCAMERA_SM_EVT_SNAPSHOT_DONE:
- {
- // No ops, but need to notify
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalEvtResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_EVT_INTERNAL:
- case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
- default:
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- break;
- }
-
- return rc;
-}
-
-/*===========================================================================
- * FUNCTION : procEvtPreviewReadyState
- *
- * DESCRIPTION: finite state machine function to handle event in state of
- * QCAMERA_SM_STATE_PREVIEW_READY.
- *
- * PARAMETERS :
- * @evt : event to be processed
- * @payload : event payload. Can be NULL if not needed.
- *
- * RETURN : int32_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-int32_t QCameraStateMachine::procEvtPreviewReadyState(qcamera_sm_evt_enum_t evt,
- void *payload)
-{
- int32_t rc = NO_ERROR;
- qcamera_api_result_t result;
- memset(&result, 0, sizeof(qcamera_api_result_t));
-
- switch (evt) {
- case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
- {
- m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
- if (m_parent->mPreviewWindow != NULL) {
- rc = m_parent->startPreview();
- if (rc != NO_ERROR) {
- m_parent->unpreparePreview();
- m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
- } else {
- m_state = QCAMERA_SM_STATE_PREVIEWING;
- }
- }
-
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SET_CALLBACKS:
- {
- qcamera_sm_evt_setcb_payload_t *setcbs =
- (qcamera_sm_evt_setcb_payload_t *)payload;
- rc = m_parent->setCallBacks(setcbs->notify_cb,
- setcbs->data_cb,
- setcbs->data_cb_timestamp,
- setcbs->get_memory,
- setcbs->user);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
- {
- rc = m_parent->enableMsgType(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
- {
- rc = m_parent->disableMsgType(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
- {
- int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = enabled;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SET_PARAMS:
- {
- bool needRestart = false;
- rc = m_parent->updateParameters((char*)payload, needRestart);
- if (rc == NO_ERROR) {
- if (needRestart) {
- // need restart preview for parameters to take effect
- m_parent->unpreparePreview();
- // Clear memory pools
- m_parent->m_memoryPool.clear();
- // commit parameter changes to server
- m_parent->commitParameterChanges();
- // prepare preview again
- rc = m_parent->preparePreview();
- if (rc != NO_ERROR) {
- m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
- }
- } else {
- rc = m_parent->commitParameterChanges();
- }
- }
-
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_GET_PARAMS:
- {
- result.params = m_parent->getParameters();
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PUT_PARAMS:
- {
- rc = m_parent->putParameters((char*)payload);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_PREVIEW:
- {
- // no ops here
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_PREVIEW:
- {
- m_parent->unpreparePreview();
- rc = 0;
- m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PREVIEW_ENABLED:
- {
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = 1;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_RECORDING_ENABLED:
- {
- rc = 0;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = 0;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
- {
- rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_DUMP:
- {
- rc = m_parent->dump(*((int *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_AUTO_FOCUS:
- {
- rc = m_parent->autoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
- {
- rc = m_parent->cancelAutoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SEND_COMMAND:
- {
- qcamera_sm_evt_command_payload_t *cmd_payload =
- (qcamera_sm_evt_command_payload_t *)payload;
- rc = m_parent->sendCommand(cmd_payload->cmd,
- cmd_payload->arg1,
- cmd_payload->arg2);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_REG_FACE_IMAGE:
- {
- int32_t faceID = 0;
- qcamera_sm_evt_reg_face_payload_t *reg_payload =
- (qcamera_sm_evt_reg_face_payload_t *)payload;
- rc = m_parent->registerFaceImage(reg_payload->img_ptr,
- reg_payload->config,
- faceID);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
- result.handle = faceID;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
- case QCAMERA_SM_EVT_START_RECORDING:
- case QCAMERA_SM_EVT_STOP_RECORDING:
- case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
- case QCAMERA_SM_EVT_TAKE_PICTURE:
- case QCAMERA_SM_EVT_CANCEL_PICTURE:
- case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
- case QCAMERA_SM_EVT_RELEASE:
- {
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- rc = INVALID_OPERATION;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_EVT_NOTIFY:
- {
- mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
- switch (cam_evt->server_event_type) {
- case CAM_EVENT_TYPE_DAEMON_DIED:
- {
- m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
- CAMERA_ERROR_SERVER_DIED,
- 0);
- }
- break;
- default:
- ALOGE("%s: Invalid internal event %d in state(%d)",
- __func__, cam_evt->server_event_type, m_state);
- break;
- }
- }
- break;
- case QCAMERA_SM_EVT_SNAPSHOT_DONE:
- {
- // No ops, but need to notify
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalEvtResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_THERMAL_NOTIFY:
- {
- rc = m_parent->updateThermalLevel(
- *((qcamera_thermal_level_enum_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_EVT_INTERNAL:
- case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
- default:
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- break;
- }
-
- return rc;
-}
-
-/*===========================================================================
- * FUNCTION : procEvtPreviewingState
- *
- * DESCRIPTION: finite state machine function to handle event in state of
- * QCAMERA_SM_STATE_PREVIEWING.
- *
- * PARAMETERS :
- * @evt : event to be processed
- * @payload : event payload. Can be NULL if not needed.
- *
- * RETURN : int32_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-int32_t QCameraStateMachine::procEvtPreviewingState(qcamera_sm_evt_enum_t evt,
- void *payload)
-{
- int32_t rc = NO_ERROR;
- qcamera_api_result_t result;
- memset(&result, 0, sizeof(qcamera_api_result_t));
-
- switch (evt) {
- case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
- {
- // Error setting preview window during previewing
- ALOGE("Cannot set preview window when preview is running");
- rc = INVALID_OPERATION;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SET_CALLBACKS:
- {
- qcamera_sm_evt_setcb_payload_t *setcbs =
- (qcamera_sm_evt_setcb_payload_t *)payload;
- rc = m_parent->setCallBacks(setcbs->notify_cb,
- setcbs->data_cb,
- setcbs->data_cb_timestamp,
- setcbs->get_memory,
- setcbs->user);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
- {
- rc = m_parent->enableMsgType(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
- {
- rc = m_parent->disableMsgType(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
- {
- int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = enabled;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SET_PARAMS:
- {
- bool needRestart = false;
- rc = m_parent->updateParameters((char*)payload, needRestart);
- if (rc == NO_ERROR) {
- if (needRestart) {
- // need restart preview for parameters to take effect
- // stop preview
- m_parent->stopPreview();
- // Clear memory pools
- m_parent->m_memoryPool.clear();
- // commit parameter changes to server
- m_parent->commitParameterChanges();
- // start preview again
- rc = m_parent->preparePreview();
- if (rc == NO_ERROR) {
- rc = m_parent->startPreview();
- if (rc != NO_ERROR) {
- m_parent->unpreparePreview();
- }
- }
- if (rc != NO_ERROR) {
- m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
- }
- } else {
- rc = m_parent->commitParameterChanges();
- }
- }
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_GET_PARAMS:
- {
- result.params = m_parent->getParameters();
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PUT_PARAMS:
- {
- rc = m_parent->putParameters((char*)payload);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_PREVIEW:
- case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
- {
- // no ops here
- CDBG_HIGH("%s: Already in previewing, no ops here to start preview", __func__);
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_PREVIEW:
- {
- rc = m_parent->stopPreview();
- m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PREVIEW_ENABLED:
- {
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = 1;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_RECORDING_ENABLED:
- {
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = 0;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
- {
- rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_DUMP:
- {
- rc = m_parent->dump(*((int *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_AUTO_FOCUS:
- {
- rc = m_parent->autoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
- {
- rc = m_parent->cancelAutoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_RECORDING:
- {
- rc = m_parent->startRecording();
- if (rc == NO_ERROR) {
- // move state to recording state
- m_state = QCAMERA_SM_STATE_RECORDING;
- }
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
- {
- rc = m_parent->prepareHardwareForSnapshot(FALSE);
- if (rc == NO_ERROR) {
- // Do not signal API result in this case.
- // Need to wait for snapshot done in metadta.
- m_state = QCAMERA_SM_STATE_PREPARE_SNAPSHOT;
- } else {
- // Do not change state in this case.
- ALOGE("%s: prepareHardwareForSnapshot failed %d",
- __func__, rc);
-
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- }
- break;
- case QCAMERA_SM_EVT_TAKE_PICTURE:
- {
- if ( m_parent->mParameters.getRecordingHintValue() == true) {
- m_parent->stopPreview();
- m_parent->mParameters.updateRecordingHintValue(FALSE);
- // start preview again
- rc = m_parent->preparePreview();
- if (rc == NO_ERROR) {
- rc = m_parent->startPreview();
- if (rc != NO_ERROR) {
- m_parent->unpreparePreview();
- }
- }
- }
- if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
- m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
- rc = m_parent->takePicture();
- if (rc != NO_ERROR) {
- // move state to previewing state
- m_state = QCAMERA_SM_STATE_PREVIEWING;
- }
- } else {
- m_state = QCAMERA_SM_STATE_PIC_TAKING;
- rc = m_parent->takePicture();
- if (rc != NO_ERROR) {
- // move state to preview stopped state
- m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
- }
- }
-
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SEND_COMMAND:
- {
- qcamera_sm_evt_command_payload_t *cmd_payload =
- (qcamera_sm_evt_command_payload_t *)payload;
- rc = m_parent->sendCommand(cmd_payload->cmd,
- cmd_payload->arg1,
- cmd_payload->arg2);
-#ifndef VANILLA_HAL
- if (CAMERA_CMD_LONGSHOT_ON == cmd_payload->cmd) {
- if (QCAMERA_SM_EVT_RESTART_PERVIEW == cmd_payload->arg1) {
- m_parent->stopPreview();
- // Clear memory pools
- m_parent->m_memoryPool.clear();
- // start preview again
- rc = m_parent->preparePreview();
- if (rc == NO_ERROR) {
- rc = m_parent->startPreview();
- if (rc != NO_ERROR) {
- m_parent->unpreparePreview();
- }
- }
- }
- }
-#endif
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_REG_FACE_IMAGE:
- {
- int32_t faceID = 0;
- qcamera_sm_evt_reg_face_payload_t *reg_payload =
- (qcamera_sm_evt_reg_face_payload_t *)payload;
- rc = m_parent->registerFaceImage(reg_payload->img_ptr,
- reg_payload->config,
- faceID);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
- result.handle = faceID;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_CANCEL_PICTURE:
- case QCAMERA_SM_EVT_STOP_RECORDING:
- case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
- case QCAMERA_SM_EVT_RELEASE:
- {
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- rc = INVALID_OPERATION;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_EVT_INTERNAL:
- {
- qcamera_sm_internal_evt_payload_t *internal_evt =
- (qcamera_sm_internal_evt_payload_t *)payload;
- switch (internal_evt->evt_type) {
- case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
- rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
- break;
- case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
- break;
- case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
- rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
- break;
- case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
- rc = m_parent->processHistogramStats(internal_evt->stats_data);
- break;
- case QCAMERA_INTERNAL_EVT_CROP_INFO:
- rc = m_parent->processZoomEvent(internal_evt->crop_data);
- break;
- case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
- rc = m_parent->processASDUpdate(internal_evt->asd_data);
- break;
- case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
- rc = m_parent->processAWBUpdate(internal_evt->awb_data);
- break;
- case QCAMERA_INTERNAL_EVT_AE_UPDATE:
- rc = m_parent->processAEInfo(internal_evt->ae_data);
- break;
- case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
- rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
- break;
- default:
- ALOGE("%s: Invalid internal event %d in state(%d)",
- __func__, internal_evt->evt_type, m_state);
- break;
- }
- }
- break;
- case QCAMERA_SM_EVT_EVT_NOTIFY:
- {
- mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
- switch (cam_evt->server_event_type) {
- case CAM_EVENT_TYPE_DAEMON_DIED:
- {
- m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
- CAMERA_ERROR_SERVER_DIED,
- 0);
- }
- break;
- default:
- CDBG_HIGH("%s: no handling for server evt (%d) at this state",
- __func__, cam_evt->server_event_type);
- break;
- }
- }
- break;
- case QCAMERA_SM_EVT_THERMAL_NOTIFY:
- {
- rc = m_parent->updateThermalLevel(
- *((qcamera_thermal_level_enum_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SNAPSHOT_DONE:
- {
- // No ops, but need to notify
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalEvtResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
- default:
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- break;
- }
-
- return rc;
-}
-
-/*===========================================================================
- * FUNCTION : procEvtPrepareSnapshotState
- *
- * DESCRIPTION: finite state machine function to handle event in state of
- * QCAMERA_SM_STATE_PREPARE_SNAPSHOT.
- *
- * PARAMETERS :
- * @evt : event to be processed
- * @payload : event payload. Can be NULL if not needed.
- *
- * RETURN : int32_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-int32_t QCameraStateMachine::procEvtPrepareSnapshotState(qcamera_sm_evt_enum_t evt,
- void *payload)
-{
- int32_t rc = NO_ERROR;
- qcamera_api_result_t result;
- memset(&result, 0, sizeof(qcamera_api_result_t));
-
- switch (evt) {
- case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
- case QCAMERA_SM_EVT_SET_CALLBACKS:
- case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
- case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
- case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
- case QCAMERA_SM_EVT_SET_PARAMS:
- case QCAMERA_SM_EVT_GET_PARAMS:
- case QCAMERA_SM_EVT_PUT_PARAMS:
- case QCAMERA_SM_EVT_START_PREVIEW:
- case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
- case QCAMERA_SM_EVT_STOP_PREVIEW:
- case QCAMERA_SM_EVT_PREVIEW_ENABLED:
- case QCAMERA_SM_EVT_RECORDING_ENABLED:
- case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
- case QCAMERA_SM_EVT_DUMP:
- case QCAMERA_SM_EVT_START_AUTO_FOCUS:
- case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
- case QCAMERA_SM_EVT_START_RECORDING:
- case QCAMERA_SM_EVT_TAKE_PICTURE:
- case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
- case QCAMERA_SM_EVT_SEND_COMMAND:
- case QCAMERA_SM_EVT_CANCEL_PICTURE:
- case QCAMERA_SM_EVT_STOP_RECORDING:
- case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
- case QCAMERA_SM_EVT_RELEASE:
- {
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- rc = INVALID_OPERATION;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_EVT_INTERNAL:
- {
- qcamera_sm_internal_evt_payload_t *internal_evt =
- (qcamera_sm_internal_evt_payload_t *)payload;
- switch (internal_evt->evt_type) {
- case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
- rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
- break;
- case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
- CDBG("%s: Received QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE event",
- __func__);
- m_parent->processPrepSnapshotDoneEvent(internal_evt->prep_snapshot_state);
- m_state = QCAMERA_SM_STATE_PREVIEWING;
-
- result.status = NO_ERROR;
- result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- break;
- case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
- rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
- break;
- case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
- rc = m_parent->processHistogramStats(internal_evt->stats_data);
- break;
- case QCAMERA_INTERNAL_EVT_CROP_INFO:
- rc = m_parent->processZoomEvent(internal_evt->crop_data);
- break;
- case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
- rc = m_parent->processASDUpdate(internal_evt->asd_data);
- break;
- case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
- rc = m_parent->processAWBUpdate(internal_evt->awb_data);
- break;
- case QCAMERA_INTERNAL_EVT_AE_UPDATE:
- rc = m_parent->processAEInfo(internal_evt->ae_data);
- break;
- case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
- rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
- break;
-
- default:
- ALOGE("%s: Invalid internal event %d in state(%d)",
- __func__, internal_evt->evt_type, m_state);
- break;
- }
- }
- break;
- case QCAMERA_SM_EVT_EVT_NOTIFY:
- {
- mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
- switch (cam_evt->server_event_type) {
- case CAM_EVENT_TYPE_DAEMON_DIED:
- {
- m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
- CAMERA_ERROR_SERVER_DIED,
- 0);
- }
- break;
- default:
- ALOGE("%s: Invalid internal event %d in state(%d)",
- __func__, cam_evt->server_event_type, m_state);
- break;
- }
- }
- break;
- case QCAMERA_SM_EVT_SNAPSHOT_DONE:
- {
- // No ops, but need to notify
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalEvtResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_THERMAL_NOTIFY:
- {
- rc = m_parent->updateThermalLevel(
- *((qcamera_thermal_level_enum_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
- default:
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- break;
- }
-
- return rc;
-}
-
-/*===========================================================================
- * FUNCTION : procEvtPicTakingState
- *
- * DESCRIPTION: finite state machine function to handle event in state of
- * QCAMERA_SM_STATE_PIC_TAKING.
- *
- * PARAMETERS :
- * @evt : event to be processed
- * @payload : event payload. Can be NULL if not needed.
- *
- * RETURN : int32_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-int32_t QCameraStateMachine::procEvtPicTakingState(qcamera_sm_evt_enum_t evt,
- void *payload)
-{
- int32_t rc = NO_ERROR;
- qcamera_api_result_t result;
- memset(&result, 0, sizeof(qcamera_api_result_t));
-
- switch (evt) {
- case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
- {
- // Error setting preview window during previewing
- ALOGE("Cannot set preview window when preview is running");
- rc = INVALID_OPERATION;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SET_CALLBACKS:
- {
- qcamera_sm_evt_setcb_payload_t *setcbs =
- (qcamera_sm_evt_setcb_payload_t *)payload;
- rc = m_parent->setCallBacks(setcbs->notify_cb,
- setcbs->data_cb,
- setcbs->data_cb_timestamp,
- setcbs->get_memory,
- setcbs->user);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
- {
- rc = m_parent->enableMsgType(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
- {
- rc = m_parent->disableMsgType(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
- {
- int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = enabled;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SET_PARAMS:
- {
- bool needRestart = false;
- rc = m_parent->updateParameters((char*)payload, needRestart);
- if (rc == NO_ERROR) {
- rc = m_parent->commitParameterChanges();
- }
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_GET_PARAMS:
- {
- result.params = m_parent->getParameters();
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PUT_PARAMS:
- {
- rc = m_parent->putParameters((char*)payload);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_PREVIEW:
- {
- // cancel picture first
- rc = m_parent->cancelPicture();
- m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
-
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PREVIEW_ENABLED:
- {
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = 0;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_RECORDING_ENABLED:
- {
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = 0;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
- {
- rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_DUMP:
- {
- rc = m_parent->dump(*((int *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_AUTO_FOCUS:
- {
- rc = m_parent->autoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
- {
- rc = m_parent->cancelAutoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SEND_COMMAND:
- {
- qcamera_sm_evt_command_payload_t *cmd_payload =
- (qcamera_sm_evt_command_payload_t *)payload;
- rc = m_parent->sendCommand(cmd_payload->cmd,
- cmd_payload->arg1,
- cmd_payload->arg2);
-#ifndef VANILLA_HAL
- if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
- // move state to previewing state
- m_state = QCAMERA_SM_STATE_PREVIEWING;
- }
-#endif
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_CANCEL_PICTURE:
- {
- rc = m_parent->cancelPicture();
- m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_REG_FACE_IMAGE:
- {
- int32_t faceID = 0;
- qcamera_sm_evt_reg_face_payload_t *reg_payload =
- (qcamera_sm_evt_reg_face_payload_t *)payload;
- rc = m_parent->registerFaceImage(reg_payload->img_ptr,
- reg_payload->config,
- faceID);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
- result.handle = faceID;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_TAKE_PICTURE:
- {
- if ( m_parent->isLongshotEnabled() ) {
- rc = m_parent->longShot();
- } else {
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- rc = INVALID_OPERATION;
- }
-
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
- case QCAMERA_SM_EVT_START_RECORDING:
- case QCAMERA_SM_EVT_STOP_RECORDING:
- case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
- case QCAMERA_SM_EVT_START_PREVIEW:
- case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
- case QCAMERA_SM_EVT_RELEASE:
- {
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- rc = INVALID_OPERATION;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_EVT_INTERNAL:
- {
- qcamera_sm_internal_evt_payload_t *internal_evt =
- (qcamera_sm_internal_evt_payload_t *)payload;
- switch (internal_evt->evt_type) {
- case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
- rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
- break;
- case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
- break;
- case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
- break;
- case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
- break;
- case QCAMERA_INTERNAL_EVT_CROP_INFO:
- rc = m_parent->processZoomEvent(internal_evt->crop_data);
- break;
- case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
- rc = m_parent->processASDUpdate(internal_evt->asd_data);
- break;
- case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
- rc = m_parent->processAWBUpdate(internal_evt->awb_data);
- break;
- case QCAMERA_INTERNAL_EVT_AE_UPDATE:
- rc = m_parent->processAEInfo(internal_evt->ae_data);
- break;
- case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
- rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
- break;
- default:
- break;
- }
- }
- break;
- case QCAMERA_SM_EVT_EVT_NOTIFY:
- {
- mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
- switch (cam_evt->server_event_type) {
- case CAM_EVENT_TYPE_REPROCESS_STAGE_DONE:
- {
- if ( m_parent->isLongshotEnabled() ) {
- if(!m_parent->m_postprocessor.getMultipleStages()) {
- m_parent->m_postprocessor.setMultipleStages(true);
- }
- m_parent->playShutter();
- }
- }
- break;
- case CAM_EVENT_TYPE_DAEMON_DIED:
- {
- m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
- CAMERA_ERROR_SERVER_DIED,
- 0);
- }
- break;
- default:
- CDBG_HIGH("%s: no handling for server evt (%d) at this state",
- __func__, cam_evt->server_event_type);
- break;
- }
- }
- break;
- case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
- {
- qcamera_jpeg_evt_payload_t *jpeg_job =
- (qcamera_jpeg_evt_payload_t *)payload;
- rc = m_parent->processJpegNotify(jpeg_job);
- }
- break;
- case QCAMERA_SM_EVT_STOP_CAPTURE_CHANNEL:
- {
- bool restartPreview = m_parent->isPreviewRestartEnabled();
- rc = m_parent->stopCaptureChannel(restartPreview);
-
- if (restartPreview && (NO_ERROR == rc)) {
- rc = m_parent->preparePreview();
- if (NO_ERROR == rc) {
- m_parent->m_bPreviewStarted = true;
- rc = m_parent->startPreview();
- }
- }
-
- }
- break;
- case QCAMERA_SM_EVT_SNAPSHOT_DONE:
- {
- rc = m_parent->cancelPicture();
-
- bool restartPreview = m_parent->isPreviewRestartEnabled();
- if (restartPreview) {
- m_state = QCAMERA_SM_STATE_PREVIEWING;
- } else {
- m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
- }
-
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalEvtResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_THERMAL_NOTIFY:
- {
- rc = m_parent->updateThermalLevel(
- *((qcamera_thermal_level_enum_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- default:
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- break;
- }
-
- return rc;
-}
-
-/*===========================================================================
- * FUNCTION : procEvtRecordingState
- *
- * DESCRIPTION: finite state machine function to handle event in state of
- * QCAMERA_SM_STATE_RECORDING.
- *
- * PARAMETERS :
- * @evt : event to be processed
- * @payload : event payload. Can be NULL if not needed.
- *
- * RETURN : int32_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-int32_t QCameraStateMachine::procEvtRecordingState(qcamera_sm_evt_enum_t evt,
- void *payload)
-{
- int32_t rc = NO_ERROR;
- qcamera_api_result_t result;
- memset(&result, 0, sizeof(qcamera_api_result_t));
-
- switch (evt) {
- case QCAMERA_SM_EVT_START_PREVIEW:
- case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
- {
- // WA: CTS test VideoSnapshot will try to
- // start preview during video recording.
- CDBG_HIGH("CTS video restart op");
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SET_CALLBACKS:
- {
- qcamera_sm_evt_setcb_payload_t *setcbs =
- (qcamera_sm_evt_setcb_payload_t *)payload;
- rc = m_parent->setCallBacks(setcbs->notify_cb,
- setcbs->data_cb,
- setcbs->data_cb_timestamp,
- setcbs->get_memory,
- setcbs->user);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
- {
- rc = m_parent->enableMsgType(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
- {
- rc = m_parent->disableMsgType(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
- {
- int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = enabled;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SET_PARAMS:
- {
- bool needRestart = false;
- rc = m_parent->updateParameters((char*)payload, needRestart);
- if (rc == NO_ERROR) {
- if (needRestart) {
- // cannot set parameters that requires restart during recording
- ALOGE("%s: Cannot set parameters that requires restart during recording",
- __func__);
- rc = BAD_VALUE;
- } else {
- rc = m_parent->commitParameterChanges();
- }
- }
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_GET_PARAMS:
- {
- result.params = m_parent->getParameters();
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PUT_PARAMS:
- {
- rc = m_parent->putParameters((char*)payload);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PREVIEW_ENABLED:
- {
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = 0;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_RECORDING_ENABLED:
- {
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = 1;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
- {
- rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_DUMP:
- {
- rc = m_parent->dump(*((int *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_AUTO_FOCUS:
- {
- rc = m_parent->autoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
- {
- rc = m_parent->cancelAutoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SEND_COMMAND:
- {
- qcamera_sm_evt_command_payload_t *cmd_payload =
- (qcamera_sm_evt_command_payload_t *)payload;
- rc = m_parent->sendCommand(cmd_payload->cmd,
- cmd_payload->arg1,
- cmd_payload->arg2);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_TAKE_PICTURE:
- {
- m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
- rc = m_parent->takeLiveSnapshot();
- if (rc != NO_ERROR) {
- m_state = QCAMERA_SM_STATE_RECORDING;
- }
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_RECORDING:
- {
- // no ops here
- CDBG_HIGH("%s: already in recording state, no ops for start_recording", __func__);
- rc = 0;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_RECORDING:
- {
- rc = m_parent->stopRecording();
- m_state = QCAMERA_SM_STATE_PREVIEWING;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_PREVIEW:
- {
- rc = m_parent->stopRecording();
- m_state = QCAMERA_SM_STATE_PREVIEWING;
-
- rc = m_parent->stopPreview();
- m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
-
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
- {
- rc = m_parent->releaseRecordingFrame((const void *)payload);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_REG_FACE_IMAGE:
- {
- int32_t faceID = 0;
- qcamera_sm_evt_reg_face_payload_t *reg_payload =
- (qcamera_sm_evt_reg_face_payload_t *)payload;
- rc = m_parent->registerFaceImage(reg_payload->img_ptr,
- reg_payload->config,
- faceID);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
- result.handle = faceID;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
- {
- //In Video snapshot, prepare hardware is a no-op.
- result.status = NO_ERROR;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_CANCEL_PICTURE:
- case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
- case QCAMERA_SM_EVT_RELEASE:
- {
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- rc = INVALID_OPERATION;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_EVT_INTERNAL:
- {
- qcamera_sm_internal_evt_payload_t *internal_evt =
- (qcamera_sm_internal_evt_payload_t *)payload;
- switch (internal_evt->evt_type) {
- case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
- rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
- break;
- case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
- break;
- case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
- rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
- break;
- case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
- rc = m_parent->processHistogramStats(internal_evt->stats_data);
- break;
- case QCAMERA_INTERNAL_EVT_CROP_INFO:
- rc = m_parent->processZoomEvent(internal_evt->crop_data);
- break;
- case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
- rc = m_parent->processASDUpdate(internal_evt->asd_data);
- break;
- case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
- rc = m_parent->processAWBUpdate(internal_evt->awb_data);
- break;
- case QCAMERA_INTERNAL_EVT_AE_UPDATE:
- rc = m_parent->processAEInfo(internal_evt->ae_data);
- break;
- case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
- rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
- break;
- default:
- break;
- }
- }
- break;
- case QCAMERA_SM_EVT_EVT_NOTIFY:
- {
- mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
- switch (cam_evt->server_event_type) {
- case CAM_EVENT_TYPE_DAEMON_DIED:
- {
- m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
- CAMERA_ERROR_SERVER_DIED,
- 0);
- }
- break;
- default:
- ALOGE("%s: Invalid internal event %d in state(%d)",
- __func__, cam_evt->server_event_type, m_state);
- break;
- }
- }
- break;
- case QCAMERA_SM_EVT_THERMAL_NOTIFY:
- {
- rc = m_parent->updateThermalLevel(
- *((qcamera_thermal_level_enum_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SNAPSHOT_DONE:
- {
- // No ops, but need to notify
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalEvtResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
- default:
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- break;
- }
-
- return rc;
-}
-
-/*===========================================================================
- * FUNCTION : procEvtVideoPicTakingState
- *
- * DESCRIPTION: finite state machine function to handle event in state of
- * QCAMERA_SM_STATE_VIDEO_PIC_TAKING.
- *
- * PARAMETERS :
- * @evt : event to be processed
- * @payload : event payload. Can be NULL if not needed.
- *
- * RETURN : int32_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-int32_t QCameraStateMachine::procEvtVideoPicTakingState(qcamera_sm_evt_enum_t evt,
- void *payload)
-{
- int32_t rc = NO_ERROR;
- qcamera_api_result_t result;
- memset(&result, 0, sizeof(qcamera_api_result_t));
-
- switch (evt) {
- case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
- {
- // Error setting preview window during previewing
- ALOGE("Cannot set preview window when preview is running");
- rc = INVALID_OPERATION;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SET_CALLBACKS:
- {
- qcamera_sm_evt_setcb_payload_t *setcbs =
- (qcamera_sm_evt_setcb_payload_t *)payload;
- rc = m_parent->setCallBacks(setcbs->notify_cb,
- setcbs->data_cb,
- setcbs->data_cb_timestamp,
- setcbs->get_memory,
- setcbs->user);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
- {
- rc = m_parent->enableMsgType(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
- {
- rc = m_parent->disableMsgType(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
- {
- int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = enabled;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SET_PARAMS:
- {
- bool needRestart = false;
- rc = m_parent->updateParameters((char*)payload, needRestart);
- if (rc == NO_ERROR) {
- if (needRestart) {
- // cannot set parameters that requires restart during recording
- ALOGE("%s: Cannot set parameters that requires restart during recording",
- __func__);
- rc = BAD_VALUE;
- } else {
- rc = m_parent->commitParameterChanges();
- }
- }
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_GET_PARAMS:
- {
- result.params = m_parent->getParameters();
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PUT_PARAMS:
- {
- rc = m_parent->putParameters((char*)payload);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PREVIEW_ENABLED:
- {
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = 1;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_RECORDING_ENABLED:
- {
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = 1;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
- {
- rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_DUMP:
- {
- rc = m_parent->dump(*((int *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_AUTO_FOCUS:
- {
- rc = m_parent->autoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
- {
- rc = m_parent->cancelAutoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SEND_COMMAND:
- {
- qcamera_sm_evt_command_payload_t *cmd_payload =
- (qcamera_sm_evt_command_payload_t *)payload;
- rc = m_parent->sendCommand(cmd_payload->cmd,
- cmd_payload->arg1,
- cmd_payload->arg2);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_RECORDING:
- {
- rc = m_parent->cancelLiveSnapshot();
- m_state = QCAMERA_SM_STATE_RECORDING;
-
- rc = m_parent->stopRecording();
- m_state = QCAMERA_SM_STATE_PREVIEWING;
-
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
- {
- rc = m_parent->releaseRecordingFrame((const void *)payload);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_CANCEL_PICTURE:
- {
- rc = m_parent->cancelLiveSnapshot();
- m_state = QCAMERA_SM_STATE_RECORDING;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_REG_FACE_IMAGE:
- {
- int32_t faceID = 0;
- qcamera_sm_evt_reg_face_payload_t *reg_payload =
- (qcamera_sm_evt_reg_face_payload_t *)payload;
- rc = m_parent->registerFaceImage(reg_payload->img_ptr,
- reg_payload->config,
- faceID);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
- result.handle = faceID;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_PREVIEW:
- {
- rc = m_parent->cancelLiveSnapshot();
- m_state = QCAMERA_SM_STATE_RECORDING;
-
- rc = m_parent->stopRecording();
- m_state = QCAMERA_SM_STATE_PREVIEWING;
-
- rc = m_parent->stopPreview();
- m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
-
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_RECORDING:
- case QCAMERA_SM_EVT_START_PREVIEW:
- case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
- case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
- case QCAMERA_SM_EVT_TAKE_PICTURE:
- case QCAMERA_SM_EVT_RELEASE:
- {
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- rc = INVALID_OPERATION;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_EVT_INTERNAL:
- {
- qcamera_sm_internal_evt_payload_t *internal_evt =
- (qcamera_sm_internal_evt_payload_t *)payload;
- switch (internal_evt->evt_type) {
- case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
- rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
- break;
- case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
- break;
- case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
- rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
- break;
- case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
- rc = m_parent->processHistogramStats(internal_evt->stats_data);
- break;
- case QCAMERA_INTERNAL_EVT_CROP_INFO:
- rc = m_parent->processZoomEvent(internal_evt->crop_data);
- break;
- case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
- rc = m_parent->processASDUpdate(internal_evt->asd_data);
- break;
- case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
- rc = m_parent->processAWBUpdate(internal_evt->awb_data);
- break;
- case QCAMERA_INTERNAL_EVT_AE_UPDATE:
- rc = m_parent->processAEInfo(internal_evt->ae_data);
- break;
- case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
- rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
- break;
- default:
- break;
- }
- }
- break;
- case QCAMERA_SM_EVT_EVT_NOTIFY:
- {
- mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
- switch (cam_evt->server_event_type) {
- case CAM_EVENT_TYPE_DAEMON_DIED:
- {
- m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
- CAMERA_ERROR_SERVER_DIED,
- 0);
- }
- break;
- default:
- ALOGE("%s: Invalid internal event %d in state(%d)",
- __func__, cam_evt->server_event_type, m_state);
- break;
- }
- }
- break;
- case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
- {
- qcamera_jpeg_evt_payload_t *jpeg_job =
- (qcamera_jpeg_evt_payload_t *)payload;
- rc = m_parent->processJpegNotify(jpeg_job);
- }
- break;
- case QCAMERA_SM_EVT_SNAPSHOT_DONE:
- {
- rc = m_parent->cancelLiveSnapshot();
- m_state = QCAMERA_SM_STATE_RECORDING;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalEvtResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_THERMAL_NOTIFY:
- {
- rc = m_parent->updateThermalLevel(
- *((qcamera_thermal_level_enum_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- default:
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- break;
- }
-
- return rc;
-}
-
-/*===========================================================================
- * FUNCTION : procEvtPreviewPicTakingState
- *
- * DESCRIPTION: finite state machine function to handle event in state of
- * QCAMERA_SM_STATE_PREVIEW_PIC_TAKING.
- *
- * PARAMETERS :
- * @evt : event to be processed
- * @payload : event payload. Can be NULL if not needed.
- *
- * RETURN : int32_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-int32_t QCameraStateMachine::procEvtPreviewPicTakingState(qcamera_sm_evt_enum_t evt,
- void *payload)
-{
- int32_t rc = NO_ERROR;
- qcamera_api_result_t result;
- memset(&result, 0, sizeof(qcamera_api_result_t));
-
- switch (evt) {
- case QCAMERA_SM_EVT_SET_CALLBACKS:
- {
- qcamera_sm_evt_setcb_payload_t *setcbs =
- (qcamera_sm_evt_setcb_payload_t *)payload;
- rc = m_parent->setCallBacks(setcbs->notify_cb,
- setcbs->data_cb,
- setcbs->data_cb_timestamp,
- setcbs->get_memory,
- setcbs->user);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
- {
- rc = m_parent->enableMsgType(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
- {
- rc = m_parent->disableMsgType(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
- {
- int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = enabled;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SET_PARAMS:
- {
- bool needRestart = false;
- rc = m_parent->updateParameters((char*)payload, needRestart);
- if (rc == NO_ERROR) {
- if (needRestart) {
- // need restart preview for parameters to take effect
- // stop preview
- m_parent->stopPreview();
- // Clear memory pools
- m_parent->m_memoryPool.clear();
- // commit parameter changes to server
- m_parent->commitParameterChanges();
- // start preview again
- rc = m_parent->preparePreview();
- if (rc == NO_ERROR) {
- rc = m_parent->startPreview();
- if (rc != NO_ERROR) {
- m_parent->unpreparePreview();
- }
- }
- if (rc != NO_ERROR) {
- m_state = QCAMERA_SM_STATE_PIC_TAKING;
- }
- } else {
- rc = m_parent->commitParameterChanges();
- }
- }
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_GET_PARAMS:
- {
- result.params = m_parent->getParameters();
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PUT_PARAMS:
- {
- rc = m_parent->putParameters((char*)payload);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PREVIEW_ENABLED:
- {
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = 1;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_RECORDING_ENABLED:
- {
- rc = NO_ERROR;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
- result.enabled = 0;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
- {
- rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_DUMP:
- {
- rc = m_parent->dump(*((int *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_AUTO_FOCUS:
- {
- rc = m_parent->autoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
- {
- rc = m_parent->cancelAutoFocus();
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_SEND_COMMAND:
- {
- qcamera_sm_evt_command_payload_t *cmd_payload =
- (qcamera_sm_evt_command_payload_t *)payload;
- rc = m_parent->sendCommand(cmd_payload->cmd,
- cmd_payload->arg1,
- cmd_payload->arg2);
-#ifndef VANILLA_HAL
- if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
- // move state to previewing state
- m_state = QCAMERA_SM_STATE_PREVIEWING;
- }
-#endif
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
- {
- rc = m_parent->releaseRecordingFrame((const void *)payload);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_CANCEL_PICTURE:
- {
- if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
- rc = m_parent->cancelPicture();
- } else {
- rc = m_parent->cancelLiveSnapshot();
- }
- m_state = QCAMERA_SM_STATE_PREVIEWING;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_STOP_PREVIEW:
- {
- if (m_parent->isZSLMode()) {
- // cancel picture first
- rc = m_parent->cancelPicture();
- m_parent->stopChannel(QCAMERA_CH_TYPE_ZSL);
- } else if (m_parent->isLongshotEnabled()) {
- // just cancel picture
- rc = m_parent->cancelPicture();
- } else {
- rc = m_parent->cancelLiveSnapshot();
- m_parent->stopChannel(QCAMERA_CH_TYPE_PREVIEW);
- }
- // unprepare preview
- m_parent->unpreparePreview();
- m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_START_RECORDING:
- {
- if (m_parent->isZSLMode()) {
- ALOGE("%s: cannot handle evt(%d) in state(%d) in ZSL mode",
- __func__, evt, m_state);
- rc = INVALID_OPERATION;
- } else if (m_parent->isLongshotEnabled()) {
- ALOGE("%s: cannot handle evt(%d) in state(%d) in Longshot mode",
- __func__, evt, m_state);
- rc = INVALID_OPERATION;
- } else {
- rc = m_parent->startRecording();
- if (rc == NO_ERROR) {
- m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
- }
- }
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_REG_FACE_IMAGE:
- {
- int32_t faceID = 0;
- qcamera_sm_evt_reg_face_payload_t *reg_payload =
- (qcamera_sm_evt_reg_face_payload_t *)payload;
- rc = m_parent->registerFaceImage(reg_payload->img_ptr,
- reg_payload->config,
- faceID);
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
- result.handle = faceID;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_TAKE_PICTURE:
- {
- if ( m_parent->isLongshotEnabled() ) {
- rc = m_parent->longShot();
- } else {
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- rc = INVALID_OPERATION;
- }
-
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
- case QCAMERA_SM_EVT_STOP_RECORDING:
- case QCAMERA_SM_EVT_START_PREVIEW:
- case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
- case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
- case QCAMERA_SM_EVT_RELEASE:
- {
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- rc = INVALID_OPERATION;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_EVT_INTERNAL:
- {
- qcamera_sm_internal_evt_payload_t *internal_evt =
- (qcamera_sm_internal_evt_payload_t *)payload;
- switch (internal_evt->evt_type) {
- case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
- rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
- break;
- case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
- break;
- case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
- rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
- break;
- case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
- rc = m_parent->processHistogramStats(internal_evt->stats_data);
- break;
- case QCAMERA_INTERNAL_EVT_CROP_INFO:
- rc = m_parent->processZoomEvent(internal_evt->crop_data);
- break;
- case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
- rc = m_parent->processASDUpdate(internal_evt->asd_data);
- break;
- case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
- rc = m_parent->processAWBUpdate(internal_evt->awb_data);
- break;
- case QCAMERA_INTERNAL_EVT_AE_UPDATE:
- rc = m_parent->processAEInfo(internal_evt->ae_data);
- break;
- case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
- rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
- break;
- default:
- break;
- }
- }
- break;
- case QCAMERA_SM_EVT_EVT_NOTIFY:
- {
- mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
- switch (cam_evt->server_event_type) {
- case CAM_EVENT_TYPE_REPROCESS_STAGE_DONE:
- {
- if ( m_parent->isLongshotEnabled() ) {
- if(!m_parent->m_postprocessor.getMultipleStages()) {
- m_parent->m_postprocessor.setMultipleStages(true);
- }
- m_parent->playShutter();
- }
- }
- break;
- case CAM_EVENT_TYPE_DAEMON_DIED:
- {
- m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
- CAMERA_ERROR_SERVER_DIED,
- 0);
- }
- break;
- default:
- ALOGE("%s: Invalid internal event %d in state(%d)",
- __func__, cam_evt->server_event_type, m_state);
- break;
- }
- }
- break;
- case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
- {
- qcamera_jpeg_evt_payload_t *jpeg_job =
- (qcamera_jpeg_evt_payload_t *)payload;
- rc = m_parent->processJpegNotify(jpeg_job);
- }
- break;
- case QCAMERA_SM_EVT_SNAPSHOT_DONE:
- {
- if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
- rc = m_parent->cancelPicture();
- } else {
- rc = m_parent->cancelLiveSnapshot();
- }
- m_state = QCAMERA_SM_STATE_PREVIEWING;
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalEvtResult(&result);
- }
- break;
- case QCAMERA_SM_EVT_THERMAL_NOTIFY:
- {
- rc = m_parent->updateThermalLevel(
- *((qcamera_thermal_level_enum_t *)payload));
- result.status = rc;
- result.request_api = evt;
- result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
- m_parent->signalAPIResult(&result);
- }
- break;
- default:
- ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
- break;
- }
-
- return rc;
-}
-
-/*===========================================================================
- * FUNCTION : isPreviewRunning
- *
- * DESCRIPTION: check if preview is in process.
- *
- * PARAMETERS : None
- *
- * RETURN : true -- preview running
- * false -- preview stopped
- *==========================================================================*/
-bool QCameraStateMachine::isPreviewRunning()
-{
- switch (m_state) {
- case QCAMERA_SM_STATE_PREVIEWING:
- case QCAMERA_SM_STATE_RECORDING:
- case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
- case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
- case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
- case QCAMERA_SM_STATE_PREVIEW_READY:
- return true;
- default:
- return false;
- }
-}
-
-/*===========================================================================
- * FUNCTION : isCaptureRunning
- *
- * DESCRIPTION: check if image capture is in process.
- *
- * PARAMETERS : None
- *
- * RETURN : true -- capture running
- * false -- capture stopped
- *==========================================================================*/
-bool QCameraStateMachine::isCaptureRunning()
-{
- switch (m_state) {
- case QCAMERA_SM_STATE_PIC_TAKING:
- case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
- case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
- return true;
- default:
- return false;
- }
-}
-/*===========================================================================
- * FUNCTION : isNonZSLCaptureRunning
- *
- * DESCRIPTION: check if image capture is in process in non ZSL mode.
- *
- * PARAMETERS : None
- *
- * RETURN : true -- capture running in non ZSL mode
- * false -- Either in not capture mode or captur is not in non ZSL mode
- *==========================================================================*/
-bool QCameraStateMachine::isNonZSLCaptureRunning()
-{
- switch (m_state) {
- case QCAMERA_SM_STATE_PIC_TAKING:
- return true;
- default:
- return false;
- }
-}
-
-
-}; // namespace qcamera