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