blob: 193652733726245edba2f9392d2874ff51bd842f [file] [log] [blame]
Sai Kumar Sanagavarapud972ac12014-01-07 14:23:52 +05301/* Copyright (c) 2012-2014, The Linux Foundataion. All rights reserved.
Muhua Libc9a8082012-11-07 15:51:28 -08002*
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
Muhua Libc9a8082012-11-07 15:51:28 -080032#include <utils/Errors.h>
33#include "QCamera2HWI.h"
34#include "QCameraStateMachine.h"
35
Shuzhen Wang89635cf2012-12-20 13:47:22 -080036namespace qcamera {
Muhua Libc9a8082012-11-07 15:51:28 -080037
Muhua Lida2c4be2012-11-26 09:14:16 -080038/*===========================================================================
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 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -080049void *QCameraStateMachine::smEvtProcRoutine(void *data)
50{
51 int running = 1, ret;
52 QCameraStateMachine *pme = (QCameraStateMachine *)data;
53
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +053054 CDBG_HIGH("%s: E", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -080055 do {
56 do {
Shuzhen Wang2da44612012-12-20 10:51:57 -080057 ret = cam_sem_wait(&pme->cmd_sem);
Muhua Libc9a8082012-11-07 15:51:28 -080058 if (ret != 0 && errno != EINVAL) {
Shuzhen Wang2da44612012-12-20 10:51:57 -080059 ALOGE("%s: cam_sem_wait error (%s)",
Muhua Libc9a8082012-11-07 15:51:28 -080060 __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:
Muhua Li31eaee02012-12-11 08:56:45 -080075 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;
Muhua Libc9a8082012-11-07 15:51:28 -080079 case QCAMERA_SM_CMD_TYPE_EVT:
80 pme->stateMachine(node->evt, node->evt_payload);
Muhua Li31eaee02012-12-11 08:56:45 -080081
82 // EVT is async call, so payload need to be free after use
83 free(node->evt_payload);
84 node->evt_payload = NULL;
Muhua Libc9a8082012-11-07 15:51:28 -080085 break;
86 case QCAMERA_SM_CMD_TYPE_EXIT:
87 running = 0;
88 break;
89 default:
90 break;
91 }
Muhua Li31eaee02012-12-11 08:56:45 -080092 free(node);
93 node = NULL;
Muhua Libc9a8082012-11-07 15:51:28 -080094 }
95 } while (running);
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +053096 CDBG_HIGH("%s: X", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -080097 return NULL;
98}
99
Muhua Lida2c4be2012-11-26 09:14:16 -0800100/*===========================================================================
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 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800110QCameraStateMachine::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;
Shuzhen Wang2da44612012-12-20 10:51:57 -0800117 cam_sem_init(&cmd_sem, 0);
Muhua Libc9a8082012-11-07 15:51:28 -0800118 pthread_create(&cmd_pid,
119 NULL,
120 smEvtProcRoutine,
121 this);
Vladimir Petrovd942f542014-06-13 10:49:55 +0300122 pthread_setname_np(cmd_pid, "CAM_stMachine");
Muhua Libc9a8082012-11-07 15:51:28 -0800123}
124
Muhua Lida2c4be2012-11-26 09:14:16 -0800125/*===========================================================================
126 * FUNCTION : ~QCameraStateMachine
127 *
128 * DESCRIPTION: desctructor of QCameraStateMachine. Will stop process thread.
129 *
130 * PARAMETERS : none
131 *
132 * RETURN : none
133 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800134QCameraStateMachine::~QCameraStateMachine()
135{
136 if (cmd_pid != 0) {
137 qcamera_sm_cmd_t *node =
138 (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
139 if (NULL != node) {
140 memset(node, 0, sizeof(qcamera_sm_cmd_t));
141 node->cmd = QCAMERA_SM_CMD_TYPE_EXIT;
142
143 api_queue.enqueue((void *)node);
Shuzhen Wang2da44612012-12-20 10:51:57 -0800144 cam_sem_post(&cmd_sem);
Muhua Libc9a8082012-11-07 15:51:28 -0800145
146 /* wait until cmd thread exits */
147 if (pthread_join(cmd_pid, NULL) != 0) {
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +0530148 CDBG_HIGH("%s: pthread dead already\n", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -0800149 }
150 }
151 cmd_pid = 0;
152 }
Shuzhen Wang2da44612012-12-20 10:51:57 -0800153 cam_sem_destroy(&cmd_sem);
Muhua Libc9a8082012-11-07 15:51:28 -0800154}
155
Muhua Lida2c4be2012-11-26 09:14:16 -0800156/*===========================================================================
157 * FUNCTION : procAPI
158 *
159 * DESCRIPTION: process incoming API request from framework layer.
160 *
161 * PARAMETERS :
162 * @evt : event to be processed
163 * @api_payload : API payload. Can be NULL if not needed.
164 *
165 * RETURN : int32_t type of status
166 * NO_ERROR -- success
167 * none-zero failure code
168 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800169int32_t QCameraStateMachine::procAPI(qcamera_sm_evt_enum_t evt,
170 void *api_payload)
171{
172 qcamera_sm_cmd_t *node =
173 (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
Muhua Lida2c4be2012-11-26 09:14:16 -0800174 if (NULL == node) {
175 ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
176 return NO_MEMORY;
Muhua Libc9a8082012-11-07 15:51:28 -0800177 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800178
179 memset(node, 0, sizeof(qcamera_sm_cmd_t));
180 node->cmd = QCAMERA_SM_CMD_TYPE_API;
181 node->evt = evt;
182 node->evt_payload = api_payload;
183 if (api_queue.enqueue((void *)node)) {
Shuzhen Wang2da44612012-12-20 10:51:57 -0800184 cam_sem_post(&cmd_sem);
Muhua Lida2c4be2012-11-26 09:14:16 -0800185 return NO_ERROR;
186 } else {
187 free(node);
188 return UNKNOWN_ERROR;
189 }
Muhua Libc9a8082012-11-07 15:51:28 -0800190}
191
Muhua Lida2c4be2012-11-26 09:14:16 -0800192/*===========================================================================
193 * FUNCTION : procEvt
194 *
195 * DESCRIPTION: process incoming envent from mm-camera-interface and
196 * mm-jpeg-interface.
197 *
198 * PARAMETERS :
199 * @evt : event to be processed
200 * @evt_payload : event payload. Can be NULL if not needed.
201 *
202 * RETURN : int32_t type of status
203 * NO_ERROR -- success
204 * none-zero failure code
205 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800206int32_t QCameraStateMachine::procEvt(qcamera_sm_evt_enum_t evt,
207 void *evt_payload)
208{
209 qcamera_sm_cmd_t *node =
210 (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
Muhua Lida2c4be2012-11-26 09:14:16 -0800211 if (NULL == node) {
212 ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
213 return NO_MEMORY;
Muhua Libc9a8082012-11-07 15:51:28 -0800214 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800215
216 memset(node, 0, sizeof(qcamera_sm_cmd_t));
217 node->cmd = QCAMERA_SM_CMD_TYPE_EVT;
218 node->evt = evt;
219 node->evt_payload = evt_payload;
220 if (evt_queue.enqueue((void *)node)) {
Shuzhen Wang2da44612012-12-20 10:51:57 -0800221 cam_sem_post(&cmd_sem);
Muhua Lida2c4be2012-11-26 09:14:16 -0800222 return NO_ERROR;
223 } else {
224 free(node);
225 return UNKNOWN_ERROR;
226 }
Muhua Libc9a8082012-11-07 15:51:28 -0800227}
228
Muhua Lida2c4be2012-11-26 09:14:16 -0800229/*===========================================================================
230 * FUNCTION : stateMachine
231 *
232 * DESCRIPTION: finite state machine entry function. Depends on state,
233 * incoming event will be handled differently.
234 *
235 * PARAMETERS :
236 * @evt : event to be processed
237 * @payload : event payload. Can be NULL if not needed.
238 *
239 * RETURN : int32_t type of status
240 * NO_ERROR -- success
241 * none-zero failure code
242 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800243int32_t QCameraStateMachine::stateMachine(qcamera_sm_evt_enum_t evt, void *payload)
244{
245 int32_t rc = NO_ERROR;
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;
Shuzhen Wang93f24112013-02-20 16:01:42 -0800256 case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
257 rc = procEvtPrepareSnapshotState(evt, payload);
258 break;
Muhua Libc9a8082012-11-07 15:51:28 -0800259 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
Muhua Lida2c4be2012-11-26 09:14:16 -0800278/*===========================================================================
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 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800292int32_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 switch (evt) {
300 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
301 {
302 rc = m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
303 result.status = rc;
304 result.request_api = evt;
305 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
306 m_parent->signalAPIResult(&result);
307 }
308 break;
309 case QCAMERA_SM_EVT_SET_CALLBACKS:
310 {
311 qcamera_sm_evt_setcb_payload_t *setcbs =
312 (qcamera_sm_evt_setcb_payload_t *)payload;
313 rc = m_parent->setCallBacks(setcbs->notify_cb,
314 setcbs->data_cb,
315 setcbs->data_cb_timestamp,
316 setcbs->get_memory,
317 setcbs->user);
318 result.status = rc;
319 result.request_api = evt;
320 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
321 m_parent->signalAPIResult(&result);
322 }
323 break;
324 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
325 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300326 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800327 result.status = rc;
328 result.request_api = evt;
329 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
330 m_parent->signalAPIResult(&result);
331 }
332 break;
333 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
334 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300335 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800336 result.status = rc;
337 result.request_api = evt;
338 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
339 m_parent->signalAPIResult(&result);
340 }
341 break;
342 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
343 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300344 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800345 result.status = rc;
346 result.request_api = evt;
347 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
348 result.enabled = enabled;
349 m_parent->signalAPIResult(&result);
350 }
351 break;
352 case QCAMERA_SM_EVT_SET_PARAMS:
353 {
Muhua Lida2c4be2012-11-26 09:14:16 -0800354 bool needRestart = false;
355 rc = m_parent->updateParameters((char*)payload, needRestart);
Emilian Peev9afd73b2013-10-31 08:19:57 -0700356 if (needRestart) {
357 // Clear memory pools
358 m_parent->m_memoryPool.clear();
359 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800360 if (rc == NO_ERROR) {
361 rc = m_parent->commitParameterChanges();
362 }
Muhua Libc9a8082012-11-07 15:51:28 -0800363 result.status = rc;
364 result.request_api = evt;
365 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
366 m_parent->signalAPIResult(&result);
367 }
368 break;
369 case QCAMERA_SM_EVT_GET_PARAMS:
370 {
371 result.params = m_parent->getParameters();
372 rc = NO_ERROR;
373 result.status = rc;
374 result.request_api = evt;
375 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
376 m_parent->signalAPIResult(&result);
377 }
378 break;
379 case QCAMERA_SM_EVT_PUT_PARAMS:
380 {
381 rc = m_parent->putParameters((char*)payload);
382 result.status = rc;
383 result.request_api = evt;
384 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
385 m_parent->signalAPIResult(&result);
386 }
387 break;
388 case QCAMERA_SM_EVT_START_PREVIEW:
389 {
390 if (m_parent->mPreviewWindow == NULL) {
Mansoor Aftab06c809c2013-01-23 19:44:47 -0800391 rc = m_parent->preparePreview();
392 if(rc == NO_ERROR) {
393 // preview window is not set yet, move to previewReady state
394 m_state = QCAMERA_SM_STATE_PREVIEW_READY;
395 } else {
396 ALOGE("%s: preparePreview failed",__func__);
397 }
Muhua Libc9a8082012-11-07 15:51:28 -0800398 } else {
399 rc = m_parent->preparePreview();
Muhua Lida2c4be2012-11-26 09:14:16 -0800400 if (rc == NO_ERROR) {
Muhua Libc9a8082012-11-07 15:51:28 -0800401 rc = m_parent->startPreview();
Muhua Lida2c4be2012-11-26 09:14:16 -0800402 if (rc != NO_ERROR) {
Muhua Libc9a8082012-11-07 15:51:28 -0800403 m_parent->unpreparePreview();
404 } else {
Muhua Lida2c4be2012-11-26 09:14:16 -0800405 // start preview success, move to previewing state
Muhua Libc9a8082012-11-07 15:51:28 -0800406 m_state = QCAMERA_SM_STATE_PREVIEWING;
407 }
408 }
409 }
410 result.status = rc;
411 result.request_api = evt;
412 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
413 m_parent->signalAPIResult(&result);
414 }
415 break;
416 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
417 {
418 rc = m_parent->preparePreview();
419 if (rc == NO_ERROR) {
420 rc = m_parent->startPreview();
421 if (rc != NO_ERROR) {
422 m_parent->unpreparePreview();
423 } else {
424 m_state = QCAMERA_SM_STATE_PREVIEWING;
425 }
426 }
427 result.status = rc;
428 result.request_api = evt;
429 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
430 m_parent->signalAPIResult(&result);
431 }
432 break;
433 case QCAMERA_SM_EVT_STOP_PREVIEW:
434 {
435 // no op needed here
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +0530436 CDBG_HIGH("%s: already in preview stopped state, do nothing", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -0800437 result.status = NO_ERROR;
438 result.request_api = evt;
439 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
440 m_parent->signalAPIResult(&result);
441 }
442 break;
443 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
444 case QCAMERA_SM_EVT_RECORDING_ENABLED:
445 {
446 result.status = NO_ERROR;
447 result.request_api = evt;
448 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
449 result.enabled = 0;
450 m_parent->signalAPIResult(&result);
451 }
452 break;
453 case QCAMERA_SM_EVT_RELEASE:
454 {
455 rc = m_parent->release();
456 result.status = rc;
457 result.request_api = evt;
458 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
459 m_parent->signalAPIResult(&result);
460 }
461 break;
462 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
463 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300464 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800465 result.status = rc;
466 result.request_api = evt;
467 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
468 m_parent->signalAPIResult(&result);
469 }
470 break;
471 case QCAMERA_SM_EVT_DUMP:
472 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300473 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800474 result.status = rc;
475 result.request_api = evt;
476 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
477 m_parent->signalAPIResult(&result);
478 }
479 break;
Ankit Premrajka3b00dc62012-12-14 18:37:52 -0800480 case QCAMERA_SM_EVT_SEND_COMMAND:
481 {
482 qcamera_sm_evt_command_payload_t *cmd_payload =
483 (qcamera_sm_evt_command_payload_t *)payload;
484 rc = m_parent->sendCommand(cmd_payload->cmd,
485 cmd_payload->arg1,
486 cmd_payload->arg2);
487 result.status = rc;
488 result.request_api = evt;
489 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
490 m_parent->signalAPIResult(&result);
491 }
492 break;
Muhua Libc9a8082012-11-07 15:51:28 -0800493 case QCAMERA_SM_EVT_START_RECORDING:
494 case QCAMERA_SM_EVT_STOP_RECORDING:
495 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
Shuzhen Wang93f24112013-02-20 16:01:42 -0800496 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -0800497 case QCAMERA_SM_EVT_TAKE_PICTURE:
Muhua Libc9a8082012-11-07 15:51:28 -0800498 {
499 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
500 rc = INVALID_OPERATION;
501 result.status = rc;
502 result.request_api = evt;
503 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
504 m_parent->signalAPIResult(&result);
505 }
506 break;
Georgi Hristv72d768f2013-10-02 17:47:59 +0300507 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
Muhua Li1612f422013-01-03 11:07:39 -0800508 case QCAMERA_SM_EVT_CANCEL_PICTURE:
Muhua Li1612f422013-01-03 11:07:39 -0800509 {
510 // no op needed here
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +0530511 CDBG_HIGH("%s: No ops for evt(%d) in state(%d)", __func__, evt, m_state);
Muhua Li1612f422013-01-03 11:07:39 -0800512 result.status = NO_ERROR;
513 result.request_api = evt;
514 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
515 m_parent->signalAPIResult(&result);
516 }
517 break;
Muhua Li0c14e432013-03-06 15:50:17 -0800518 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
519 {
520 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +0530521 result.status = rc;
522 result.request_api = evt;
523 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
524 m_parent->signalAPIResult(&result);
Muhua Li0c14e432013-03-06 15:50:17 -0800525 }
526 break;
Muhua Li5858c392013-02-04 17:53:34 -0800527 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
528 {
529 int32_t faceID = 0;
530 qcamera_sm_evt_reg_face_payload_t *reg_payload =
531 (qcamera_sm_evt_reg_face_payload_t *)payload;
532 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
533 reg_payload->config,
534 faceID);
535 result.status = rc;
536 result.request_api = evt;
537 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
538 result.handle = faceID;
539 m_parent->signalAPIResult(&result);
540 }
541 break;
Emilian Peev2ae455e2013-04-18 10:41:56 +0300542 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
543 {
544 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300545 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peev2ae455e2013-04-18 10:41:56 +0300546 }
547 break;
Muhua Libc9a8082012-11-07 15:51:28 -0800548 case QCAMERA_SM_EVT_EVT_NOTIFY:
Emilian Peev15690592013-04-19 09:55:40 +0300549 {
550 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
551 switch (cam_evt->server_event_type) {
552 case CAM_EVENT_TYPE_DAEMON_DIED:
553 {
Emilian Peev15690592013-04-19 09:55:40 +0300554 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
555 CAMERA_ERROR_SERVER_DIED,
556 0);
557 }
558 break;
559 default:
560 ALOGE("%s: Invalid internal event %d in state(%d)",
561 __func__, cam_evt->server_event_type, m_state);
562 break;
563 }
564 }
565 break;
Muhua Lic9390df2013-05-22 17:54:13 -0700566 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
567 {
568 // No ops, but need to notify
569 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
570 result.status = rc;
571 result.request_api = evt;
572 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
573 m_parent->signalEvtResult(&result);
574 }
575 break;
Emilian Peev15690592013-04-19 09:55:40 +0300576 case QCAMERA_SM_EVT_EVT_INTERNAL:
Muhua Libc9a8082012-11-07 15:51:28 -0800577 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
578 default:
579 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
580 break;
581 }
582
583 return rc;
584}
585
Muhua Lida2c4be2012-11-26 09:14:16 -0800586/*===========================================================================
587 * FUNCTION : procEvtPreviewReadyState
588 *
589 * DESCRIPTION: finite state machine function to handle event in state of
590 * QCAMERA_SM_STATE_PREVIEW_READY.
591 *
592 * PARAMETERS :
593 * @evt : event to be processed
594 * @payload : event payload. Can be NULL if not needed.
595 *
596 * RETURN : int32_t type of status
597 * NO_ERROR -- success
598 * none-zero failure code
599 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800600int32_t QCameraStateMachine::procEvtPreviewReadyState(qcamera_sm_evt_enum_t evt,
601 void *payload)
602{
603 int32_t rc = NO_ERROR;
604 qcamera_api_result_t result;
605 memset(&result, 0, sizeof(qcamera_api_result_t));
606
607 switch (evt) {
608 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
609 {
610 m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
611 if (m_parent->mPreviewWindow != NULL) {
612 rc = m_parent->startPreview();
613 if (rc != NO_ERROR) {
614 m_parent->unpreparePreview();
615 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
616 } else {
617 m_state = QCAMERA_SM_STATE_PREVIEWING;
618 }
619 }
620
621 result.status = rc;
622 result.request_api = evt;
623 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
624 m_parent->signalAPIResult(&result);
625 }
626 break;
627 case QCAMERA_SM_EVT_SET_CALLBACKS:
628 {
629 qcamera_sm_evt_setcb_payload_t *setcbs =
630 (qcamera_sm_evt_setcb_payload_t *)payload;
631 rc = m_parent->setCallBacks(setcbs->notify_cb,
632 setcbs->data_cb,
633 setcbs->data_cb_timestamp,
634 setcbs->get_memory,
635 setcbs->user);
636 result.status = rc;
637 result.request_api = evt;
638 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
639 m_parent->signalAPIResult(&result);
640 }
641 break;
642 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
643 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300644 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800645 result.status = rc;
646 result.request_api = evt;
647 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
648 m_parent->signalAPIResult(&result);
649 }
650 break;
651 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
652 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300653 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800654 result.status = rc;
655 result.request_api = evt;
656 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
657 m_parent->signalAPIResult(&result);
658 }
659 break;
660 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
661 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300662 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800663 result.status = rc;
664 result.request_api = evt;
665 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
666 result.enabled = enabled;
667 m_parent->signalAPIResult(&result);
668 }
669 break;
670 case QCAMERA_SM_EVT_SET_PARAMS:
671 {
Muhua Lida2c4be2012-11-26 09:14:16 -0800672 bool needRestart = false;
673 rc = m_parent->updateParameters((char*)payload, needRestart);
674 if (rc == NO_ERROR) {
Muhua Li6d69e932013-01-24 16:39:27 -0800675 if (needRestart) {
676 // need restart preview for parameters to take effect
677 m_parent->unpreparePreview();
Emilian Peev9afd73b2013-10-31 08:19:57 -0700678 // Clear memory pools
679 m_parent->m_memoryPool.clear();
Muhua Li6d69e932013-01-24 16:39:27 -0800680 // commit parameter changes to server
681 m_parent->commitParameterChanges();
682 // prepare preview again
683 rc = m_parent->preparePreview();
684 if (rc != NO_ERROR) {
685 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
686 }
687 } else {
688 rc = m_parent->commitParameterChanges();
689 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800690 }
Muhua Li6d69e932013-01-24 16:39:27 -0800691
Muhua Libc9a8082012-11-07 15:51:28 -0800692 result.status = rc;
693 result.request_api = evt;
694 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
695 m_parent->signalAPIResult(&result);
696 }
697 break;
698 case QCAMERA_SM_EVT_GET_PARAMS:
699 {
700 result.params = m_parent->getParameters();
701 rc = NO_ERROR;
702 result.status = rc;
703 result.request_api = evt;
704 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
705 m_parent->signalAPIResult(&result);
706 }
707 break;
708 case QCAMERA_SM_EVT_PUT_PARAMS:
709 {
710 rc = m_parent->putParameters((char*)payload);
711 result.status = rc;
712 result.request_api = evt;
713 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
714 m_parent->signalAPIResult(&result);
715 }
716 break;
717 case QCAMERA_SM_EVT_START_PREVIEW:
718 {
719 // no ops here
720 rc = NO_ERROR;
721 result.status = rc;
722 result.request_api = evt;
723 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
724 m_parent->signalAPIResult(&result);
725 }
726 break;
727 case QCAMERA_SM_EVT_STOP_PREVIEW:
728 {
729 m_parent->unpreparePreview();
730 rc = 0;
731 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
732 result.status = rc;
733 result.request_api = evt;
734 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
735 m_parent->signalAPIResult(&result);
736 }
737 break;
738 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
739 {
740 rc = NO_ERROR;
741 result.status = rc;
742 result.request_api = evt;
743 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
744 result.enabled = 1;
745 m_parent->signalAPIResult(&result);
746 }
747 break;
748 case QCAMERA_SM_EVT_RECORDING_ENABLED:
749 {
750 rc = 0;
751 result.status = rc;
752 result.request_api = evt;
753 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
754 result.enabled = 0;
755 m_parent->signalAPIResult(&result);
756 }
757 break;
758 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
759 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300760 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800761 result.status = rc;
762 result.request_api = evt;
763 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
764 m_parent->signalAPIResult(&result);
765 }
766 break;
767 case QCAMERA_SM_EVT_DUMP:
768 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300769 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800770 result.status = rc;
771 result.request_api = evt;
772 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
773 m_parent->signalAPIResult(&result);
774 }
775 break;
776 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
777 {
778 rc = m_parent->autoFocus();
779 result.status = rc;
780 result.request_api = evt;
781 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
782 m_parent->signalAPIResult(&result);
783 }
784 break;
785 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
786 {
787 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +0530788 result.status = rc;
789 result.request_api = evt;
790 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
791 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -0800792 }
793 break;
794 case QCAMERA_SM_EVT_SEND_COMMAND:
795 {
796 qcamera_sm_evt_command_payload_t *cmd_payload =
797 (qcamera_sm_evt_command_payload_t *)payload;
798 rc = m_parent->sendCommand(cmd_payload->cmd,
799 cmd_payload->arg1,
800 cmd_payload->arg2);
801 result.status = rc;
802 result.request_api = evt;
803 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
804 m_parent->signalAPIResult(&result);
805 }
806 break;
Muhua Li5858c392013-02-04 17:53:34 -0800807 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
808 {
809 int32_t faceID = 0;
810 qcamera_sm_evt_reg_face_payload_t *reg_payload =
811 (qcamera_sm_evt_reg_face_payload_t *)payload;
812 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
813 reg_payload->config,
814 faceID);
815 result.status = rc;
816 result.request_api = evt;
817 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
818 result.handle = faceID;
819 m_parent->signalAPIResult(&result);
820 }
821 break;
Muhua Libc9a8082012-11-07 15:51:28 -0800822 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
823 case QCAMERA_SM_EVT_START_RECORDING:
824 case QCAMERA_SM_EVT_STOP_RECORDING:
Shuzhen Wang93f24112013-02-20 16:01:42 -0800825 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -0800826 case QCAMERA_SM_EVT_TAKE_PICTURE:
827 case QCAMERA_SM_EVT_CANCEL_PICTURE:
828 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
829 case QCAMERA_SM_EVT_RELEASE:
830 {
831 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
832 rc = INVALID_OPERATION;
833 result.status = rc;
834 result.request_api = evt;
835 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
836 m_parent->signalAPIResult(&result);
837 }
838 break;
839 case QCAMERA_SM_EVT_EVT_NOTIFY:
Emilian Peev15690592013-04-19 09:55:40 +0300840 {
841 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
842 switch (cam_evt->server_event_type) {
843 case CAM_EVENT_TYPE_DAEMON_DIED:
844 {
Emilian Peev15690592013-04-19 09:55:40 +0300845 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
846 CAMERA_ERROR_SERVER_DIED,
847 0);
848 }
849 break;
850 default:
851 ALOGE("%s: Invalid internal event %d in state(%d)",
852 __func__, cam_evt->server_event_type, m_state);
853 break;
854 }
855 }
856 break;
Muhua Lic9390df2013-05-22 17:54:13 -0700857 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
858 {
859 // No ops, but need to notify
860 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
861 result.status = rc;
862 result.request_api = evt;
863 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
864 m_parent->signalEvtResult(&result);
865 }
866 break;
Emilian Peev15690592013-04-19 09:55:40 +0300867 case QCAMERA_SM_EVT_EVT_INTERNAL:
Muhua Libc9a8082012-11-07 15:51:28 -0800868 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Shuzhen Wangaa829ce2013-01-09 14:41:49 -0800869 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Muhua Libc9a8082012-11-07 15:51:28 -0800870 default:
871 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
872 break;
873 }
874
875 return rc;
876}
877
Muhua Lida2c4be2012-11-26 09:14:16 -0800878/*===========================================================================
879 * FUNCTION : procEvtPreviewingState
880 *
881 * DESCRIPTION: finite state machine function to handle event in state of
882 * QCAMERA_SM_STATE_PREVIEWING.
883 *
884 * PARAMETERS :
885 * @evt : event to be processed
886 * @payload : event payload. Can be NULL if not needed.
887 *
888 * RETURN : int32_t type of status
889 * NO_ERROR -- success
890 * none-zero failure code
891 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800892int32_t QCameraStateMachine::procEvtPreviewingState(qcamera_sm_evt_enum_t evt,
893 void *payload)
894{
895 int32_t rc = NO_ERROR;
896 qcamera_api_result_t result;
897 memset(&result, 0, sizeof(qcamera_api_result_t));
898
899 switch (evt) {
900 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
901 {
902 // Error setting preview window during previewing
903 ALOGE("Cannot set preview window when preview is running");
904 rc = INVALID_OPERATION;
905 result.status = rc;
906 result.request_api = evt;
907 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
908 m_parent->signalAPIResult(&result);
909 }
910 break;
911 case QCAMERA_SM_EVT_SET_CALLBACKS:
912 {
913 qcamera_sm_evt_setcb_payload_t *setcbs =
914 (qcamera_sm_evt_setcb_payload_t *)payload;
915 rc = m_parent->setCallBacks(setcbs->notify_cb,
916 setcbs->data_cb,
917 setcbs->data_cb_timestamp,
918 setcbs->get_memory,
919 setcbs->user);
920 result.status = rc;
921 result.request_api = evt;
922 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
923 m_parent->signalAPIResult(&result);
924 }
925 break;
926 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
927 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300928 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800929 result.status = rc;
930 result.request_api = evt;
931 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
932 m_parent->signalAPIResult(&result);
933 }
934 break;
935 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
936 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300937 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800938 result.status = rc;
939 result.request_api = evt;
940 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
941 m_parent->signalAPIResult(&result);
942 }
943 break;
944 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
945 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300946 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800947 result.status = rc;
948 result.request_api = evt;
949 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
950 result.enabled = enabled;
951 m_parent->signalAPIResult(&result);
952 }
953 break;
954 case QCAMERA_SM_EVT_SET_PARAMS:
955 {
Muhua Lida2c4be2012-11-26 09:14:16 -0800956 bool needRestart = false;
957 rc = m_parent->updateParameters((char*)payload, needRestart);
958 if (rc == NO_ERROR) {
959 if (needRestart) {
960 // need restart preview for parameters to take effect
961 // stop preview
962 m_parent->stopPreview();
Emilian Peev9afd73b2013-10-31 08:19:57 -0700963 // Clear memory pools
964 m_parent->m_memoryPool.clear();
Muhua Lida2c4be2012-11-26 09:14:16 -0800965 // commit parameter changes to server
Muhua Li66f3b532013-01-23 17:19:05 -0800966 m_parent->commitParameterChanges();
Muhua Lida2c4be2012-11-26 09:14:16 -0800967 // start preview again
Muhua Li66f3b532013-01-23 17:19:05 -0800968 rc = m_parent->preparePreview();
969 if (rc == NO_ERROR) {
970 rc = m_parent->startPreview();
971 if (rc != NO_ERROR) {
972 m_parent->unpreparePreview();
973 }
974 }
975 if (rc != NO_ERROR) {
976 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
977 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800978 } else {
979 rc = m_parent->commitParameterChanges();
980 }
981 }
Muhua Libc9a8082012-11-07 15:51:28 -0800982 result.status = rc;
983 result.request_api = evt;
984 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
985 m_parent->signalAPIResult(&result);
986 }
987 break;
988 case QCAMERA_SM_EVT_GET_PARAMS:
989 {
990 result.params = m_parent->getParameters();
991 rc = NO_ERROR;
992 result.status = rc;
993 result.request_api = evt;
994 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
995 m_parent->signalAPIResult(&result);
996 }
997 break;
998 case QCAMERA_SM_EVT_PUT_PARAMS:
999 {
1000 rc = m_parent->putParameters((char*)payload);
1001 result.status = rc;
1002 result.request_api = evt;
1003 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1004 m_parent->signalAPIResult(&result);
1005 }
1006 break;
1007 case QCAMERA_SM_EVT_START_PREVIEW:
1008 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
1009 {
1010 // no ops here
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301011 CDBG_HIGH("%s: Already in previewing, no ops here to start preview", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -08001012 rc = NO_ERROR;
1013 result.status = rc;
1014 result.request_api = evt;
1015 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1016 m_parent->signalAPIResult(&result);
1017 }
1018 break;
1019 case QCAMERA_SM_EVT_STOP_PREVIEW:
1020 {
1021 rc = m_parent->stopPreview();
1022 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1023 result.status = rc;
1024 result.request_api = evt;
1025 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1026 m_parent->signalAPIResult(&result);
1027 }
1028 break;
1029 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1030 {
1031 rc = NO_ERROR;
1032 result.status = rc;
1033 result.request_api = evt;
1034 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1035 result.enabled = 1;
1036 m_parent->signalAPIResult(&result);
1037 }
1038 break;
1039 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1040 {
1041 rc = NO_ERROR;
1042 result.status = rc;
1043 result.request_api = evt;
1044 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1045 result.enabled = 0;
1046 m_parent->signalAPIResult(&result);
1047 }
1048 break;
1049 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1050 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001051 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001052 result.status = rc;
1053 result.request_api = evt;
1054 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1055 m_parent->signalAPIResult(&result);
1056 }
1057 break;
1058 case QCAMERA_SM_EVT_DUMP:
1059 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001060 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001061 result.status = rc;
1062 result.request_api = evt;
1063 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1064 m_parent->signalAPIResult(&result);
1065 }
1066 break;
1067 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1068 {
1069 rc = m_parent->autoFocus();
1070 result.status = rc;
1071 result.request_api = evt;
1072 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1073 m_parent->signalAPIResult(&result);
1074 }
1075 break;
1076 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1077 {
1078 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05301079 result.status = rc;
1080 result.request_api = evt;
1081 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1082 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001083 }
1084 break;
1085 case QCAMERA_SM_EVT_START_RECORDING:
1086 {
1087 rc = m_parent->startRecording();
1088 if (rc == NO_ERROR) {
1089 // move state to recording state
1090 m_state = QCAMERA_SM_STATE_RECORDING;
1091 }
1092 result.status = rc;
1093 result.request_api = evt;
1094 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1095 m_parent->signalAPIResult(&result);
1096 }
1097 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08001098 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08001099 {
Muhua Li0c14e432013-03-06 15:50:17 -08001100 rc = m_parent->prepareHardwareForSnapshot(FALSE);
Muhua Libc9a8082012-11-07 15:51:28 -08001101 if (rc == NO_ERROR) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08001102 // Do not signal API result in this case.
1103 // Need to wait for snapshot done in metadta.
1104 m_state = QCAMERA_SM_STATE_PREPARE_SNAPSHOT;
1105 } else {
1106 // Do not change state in this case.
1107 ALOGE("%s: prepareHardwareForSnapshot failed %d",
1108 __func__, rc);
1109
1110 result.status = rc;
1111 result.request_api = evt;
1112 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1113 m_parent->signalAPIResult(&result);
1114 }
1115 }
1116 break;
1117 case QCAMERA_SM_EVT_TAKE_PICTURE:
1118 {
Muhua Li8e614bc2013-04-17 17:38:42 -07001119 if ( m_parent->mParameters.getRecordingHintValue() == false) {
Emilian Peeva43000b2013-09-27 14:27:21 -07001120 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08001121 m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
Muhua Lia9dca012013-05-03 22:37:42 -07001122 rc = m_parent->takePicture();
1123 if (rc != NO_ERROR) {
1124 // move state to previewing state
1125 m_state = QCAMERA_SM_STATE_PREVIEWING;
1126 }
Shuzhen Wang93f24112013-02-20 16:01:42 -08001127 } else {
1128 m_state = QCAMERA_SM_STATE_PIC_TAKING;
Muhua Lia9dca012013-05-03 22:37:42 -07001129 rc = m_parent->takePicture();
1130 if (rc != NO_ERROR) {
1131 // move state to preview stopped state
1132 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1133 }
Shuzhen Wang93f24112013-02-20 16:01:42 -08001134 }
Muhua Lia9dca012013-05-03 22:37:42 -07001135
1136 result.status = rc;
1137 result.request_api = evt;
1138 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1139 m_parent->signalAPIResult(&result);
Muhua Li8e614bc2013-04-17 17:38:42 -07001140 } else {
Muhua Lia9dca012013-05-03 22:37:42 -07001141 m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
Muhua Li8e614bc2013-04-17 17:38:42 -07001142 rc = m_parent->takeLiveSnapshot();
Muhua Lia9dca012013-05-03 22:37:42 -07001143 if (rc != NO_ERROR ) {
1144 m_state = QCAMERA_SM_STATE_PREVIEWING;
Muhua Li8e614bc2013-04-17 17:38:42 -07001145 }
Muhua Lia9dca012013-05-03 22:37:42 -07001146 result.status = rc;
1147 result.request_api = evt;
1148 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1149 m_parent->signalAPIResult(&result);
Muhua Li8e614bc2013-04-17 17:38:42 -07001150 }
Muhua Libc9a8082012-11-07 15:51:28 -08001151 }
1152 break;
1153 case QCAMERA_SM_EVT_SEND_COMMAND:
1154 {
1155 qcamera_sm_evt_command_payload_t *cmd_payload =
1156 (qcamera_sm_evt_command_payload_t *)payload;
1157 rc = m_parent->sendCommand(cmd_payload->cmd,
1158 cmd_payload->arg1,
1159 cmd_payload->arg2);
Emilian Peevd17d2e12014-01-13 12:32:57 +02001160 if (CAMERA_CMD_LONGSHOT_ON == cmd_payload->cmd) {
1161 if (QCAMERA_SM_EVT_RESTART_PERVIEW == cmd_payload->arg1) {
1162 m_parent->stopPreview();
1163 // Clear memory pools
1164 m_parent->m_memoryPool.clear();
1165 // start preview again
1166 rc = m_parent->preparePreview();
1167 if (rc == NO_ERROR) {
1168 rc = m_parent->startPreview();
1169 if (rc != NO_ERROR) {
1170 m_parent->unpreparePreview();
1171 }
1172 }
1173 }
1174 }
Muhua Libc9a8082012-11-07 15:51:28 -08001175 result.status = rc;
1176 result.request_api = evt;
1177 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1178 m_parent->signalAPIResult(&result);
1179 }
1180 break;
Muhua Li5858c392013-02-04 17:53:34 -08001181 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
1182 {
1183 int32_t faceID = 0;
1184 qcamera_sm_evt_reg_face_payload_t *reg_payload =
1185 (qcamera_sm_evt_reg_face_payload_t *)payload;
1186 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
1187 reg_payload->config,
1188 faceID);
1189 result.status = rc;
1190 result.request_api = evt;
1191 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
1192 result.handle = faceID;
1193 m_parent->signalAPIResult(&result);
1194 }
1195 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001196 case QCAMERA_SM_EVT_CANCEL_PICTURE:
1197 case QCAMERA_SM_EVT_STOP_RECORDING:
1198 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1199 case QCAMERA_SM_EVT_RELEASE:
1200 {
1201 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1202 rc = INVALID_OPERATION;
1203 result.status = rc;
1204 result.request_api = evt;
1205 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1206 m_parent->signalAPIResult(&result);
1207 }
1208 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001209 case QCAMERA_SM_EVT_EVT_INTERNAL:
1210 {
1211 qcamera_sm_internal_evt_payload_t *internal_evt =
1212 (qcamera_sm_internal_evt_payload_t *)payload;
1213 switch (internal_evt->evt_type) {
1214 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
1215 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
1216 break;
Muhua Li510aab22013-05-28 17:00:38 -07001217 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
1218 break;
1219 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
1220 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
1221 break;
1222 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
1223 rc = m_parent->processHistogramStats(internal_evt->stats_data);
1224 break;
1225 case QCAMERA_INTERNAL_EVT_CROP_INFO:
1226 rc = m_parent->processZoomEvent(internal_evt->crop_data);
1227 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08001228 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
1229 rc = m_parent->processASDUpdate(internal_evt->asd_data);
1230 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08001231 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
1232 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
1233 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001234 default:
Shuzhen Wang93f24112013-02-20 16:01:42 -08001235 ALOGE("%s: Invalid internal event %d in state(%d)",
1236 __func__, internal_evt->evt_type, m_state);
Muhua Li31eaee02012-12-11 08:56:45 -08001237 break;
1238 }
1239 }
1240 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001241 case QCAMERA_SM_EVT_EVT_NOTIFY:
1242 {
1243 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1244 switch (cam_evt->server_event_type) {
Emilian Peev15690592013-04-19 09:55:40 +03001245 case CAM_EVENT_TYPE_DAEMON_DIED:
1246 {
Emilian Peev15690592013-04-19 09:55:40 +03001247 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1248 CAMERA_ERROR_SERVER_DIED,
1249 0);
1250 }
1251 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001252 default:
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301253 CDBG_HIGH("%s: no handling for server evt (%d) at this state",
Muhua Libc9a8082012-11-07 15:51:28 -08001254 __func__, cam_evt->server_event_type);
1255 break;
1256 }
1257 }
1258 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08001259 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08001260 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08001261 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001262 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peeve1d5acb2013-02-01 11:29:53 -08001263 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08001264 break;
Muhua Lida2c4be2012-11-26 09:14:16 -08001265 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
Muhua Lic9390df2013-05-22 17:54:13 -07001266 {
1267 // No ops, but need to notify
1268 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1269 result.status = rc;
1270 result.request_api = evt;
1271 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1272 m_parent->signalEvtResult(&result);
1273 }
1274 break;
1275 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Muhua Libc9a8082012-11-07 15:51:28 -08001276 default:
1277 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1278 break;
1279 }
1280
1281 return rc;
1282}
1283
Muhua Lida2c4be2012-11-26 09:14:16 -08001284/*===========================================================================
Shuzhen Wang93f24112013-02-20 16:01:42 -08001285 * FUNCTION : procEvtPrepareSnapshotState
1286 *
1287 * DESCRIPTION: finite state machine function to handle event in state of
1288 * QCAMERA_SM_STATE_PREPARE_SNAPSHOT.
1289 *
1290 * PARAMETERS :
1291 * @evt : event to be processed
1292 * @payload : event payload. Can be NULL if not needed.
1293 *
1294 * RETURN : int32_t type of status
1295 * NO_ERROR -- success
1296 * none-zero failure code
1297 *==========================================================================*/
1298int32_t QCameraStateMachine::procEvtPrepareSnapshotState(qcamera_sm_evt_enum_t evt,
1299 void *payload)
1300{
1301 int32_t rc = NO_ERROR;
1302 qcamera_api_result_t result;
1303 memset(&result, 0, sizeof(qcamera_api_result_t));
1304
1305 switch (evt) {
1306 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
1307 case QCAMERA_SM_EVT_SET_CALLBACKS:
1308 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
1309 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
1310 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
1311 case QCAMERA_SM_EVT_SET_PARAMS:
1312 case QCAMERA_SM_EVT_GET_PARAMS:
1313 case QCAMERA_SM_EVT_PUT_PARAMS:
1314 case QCAMERA_SM_EVT_START_PREVIEW:
1315 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
1316 case QCAMERA_SM_EVT_STOP_PREVIEW:
1317 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1318 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1319 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1320 case QCAMERA_SM_EVT_DUMP:
1321 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1322 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1323 case QCAMERA_SM_EVT_START_RECORDING:
1324 case QCAMERA_SM_EVT_TAKE_PICTURE:
Muhua Li510aab22013-05-28 17:00:38 -07001325 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Shuzhen Wang93f24112013-02-20 16:01:42 -08001326 case QCAMERA_SM_EVT_SEND_COMMAND:
1327 case QCAMERA_SM_EVT_CANCEL_PICTURE:
1328 case QCAMERA_SM_EVT_STOP_RECORDING:
1329 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1330 case QCAMERA_SM_EVT_RELEASE:
1331 {
1332 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1333 rc = INVALID_OPERATION;
1334 result.status = rc;
1335 result.request_api = evt;
1336 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1337 m_parent->signalAPIResult(&result);
1338 }
1339 break;
1340 case QCAMERA_SM_EVT_EVT_INTERNAL:
1341 {
1342 qcamera_sm_internal_evt_payload_t *internal_evt =
1343 (qcamera_sm_internal_evt_payload_t *)payload;
1344 switch (internal_evt->evt_type) {
Muhua Li6f3c5322013-05-08 17:20:17 -07001345 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
1346 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
1347 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08001348 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301349 CDBG("%s: Received QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE event",
Shuzhen Wang93f24112013-02-20 16:01:42 -08001350 __func__);
1351 m_parent->processPrepSnapshotDoneEvent(internal_evt->prep_snapshot_state);
1352 m_state = QCAMERA_SM_STATE_PREVIEWING;
1353
1354 result.status = NO_ERROR;
1355 result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT;
1356 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1357 m_parent->signalAPIResult(&result);
1358 break;
Muhua Li510aab22013-05-28 17:00:38 -07001359 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
1360 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
1361 break;
1362 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
1363 rc = m_parent->processHistogramStats(internal_evt->stats_data);
1364 break;
1365 case QCAMERA_INTERNAL_EVT_CROP_INFO:
1366 rc = m_parent->processZoomEvent(internal_evt->crop_data);
1367 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08001368 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
1369 rc = m_parent->processASDUpdate(internal_evt->asd_data);
1370 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08001371 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
1372 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
1373 break;
1374
Shuzhen Wang93f24112013-02-20 16:01:42 -08001375 default:
1376 ALOGE("%s: Invalid internal event %d in state(%d)",
1377 __func__, internal_evt->evt_type, m_state);
1378 break;
1379 }
1380 }
1381 break;
1382 case QCAMERA_SM_EVT_EVT_NOTIFY:
Emilian Peev15690592013-04-19 09:55:40 +03001383 {
1384 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1385 switch (cam_evt->server_event_type) {
1386 case CAM_EVENT_TYPE_DAEMON_DIED:
1387 {
Emilian Peev15690592013-04-19 09:55:40 +03001388 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1389 CAMERA_ERROR_SERVER_DIED,
1390 0);
1391 }
1392 break;
1393 default:
1394 ALOGE("%s: Invalid internal event %d in state(%d)",
1395 __func__, cam_evt->server_event_type, m_state);
1396 break;
1397 }
1398 }
1399 break;
Muhua Lic9390df2013-05-22 17:54:13 -07001400 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
1401 {
1402 // No ops, but need to notify
1403 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1404 result.status = rc;
1405 result.request_api = evt;
1406 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1407 m_parent->signalEvtResult(&result);
1408 }
1409 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08001410 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
1411 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Shuzhen Wang93f24112013-02-20 16:01:42 -08001412 default:
1413 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1414 break;
1415 }
1416
1417 return rc;
1418}
1419
1420/*===========================================================================
Muhua Lida2c4be2012-11-26 09:14:16 -08001421 * FUNCTION : procEvtPicTakingState
1422 *
1423 * DESCRIPTION: finite state machine function to handle event in state of
1424 * QCAMERA_SM_STATE_PIC_TAKING.
1425 *
1426 * PARAMETERS :
1427 * @evt : event to be processed
1428 * @payload : event payload. Can be NULL if not needed.
1429 *
1430 * RETURN : int32_t type of status
1431 * NO_ERROR -- success
1432 * none-zero failure code
1433 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08001434int32_t QCameraStateMachine::procEvtPicTakingState(qcamera_sm_evt_enum_t evt,
1435 void *payload)
1436{
1437 int32_t rc = NO_ERROR;
1438 qcamera_api_result_t result;
1439 memset(&result, 0, sizeof(qcamera_api_result_t));
1440
1441 switch (evt) {
1442 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
1443 {
1444 // Error setting preview window during previewing
1445 ALOGE("Cannot set preview window when preview is running");
1446 rc = INVALID_OPERATION;
1447 result.status = rc;
1448 result.request_api = evt;
1449 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1450 m_parent->signalAPIResult(&result);
1451 }
1452 break;
1453 case QCAMERA_SM_EVT_SET_CALLBACKS:
1454 {
1455 qcamera_sm_evt_setcb_payload_t *setcbs =
1456 (qcamera_sm_evt_setcb_payload_t *)payload;
1457 rc = m_parent->setCallBacks(setcbs->notify_cb,
1458 setcbs->data_cb,
1459 setcbs->data_cb_timestamp,
1460 setcbs->get_memory,
1461 setcbs->user);
1462 result.status = rc;
1463 result.request_api = evt;
1464 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1465 m_parent->signalAPIResult(&result);
1466 }
1467 break;
1468 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
1469 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001470 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001471 result.status = rc;
1472 result.request_api = evt;
1473 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1474 m_parent->signalAPIResult(&result);
1475 }
1476 break;
1477 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
1478 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001479 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001480 result.status = rc;
1481 result.request_api = evt;
1482 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1483 m_parent->signalAPIResult(&result);
1484 }
1485 break;
1486 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
1487 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001488 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001489 result.status = rc;
1490 result.request_api = evt;
1491 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1492 result.enabled = enabled;
1493 m_parent->signalAPIResult(&result);
1494 }
1495 break;
1496 case QCAMERA_SM_EVT_SET_PARAMS:
1497 {
Muhua Lida2c4be2012-11-26 09:14:16 -08001498 bool needRestart = false;
1499 rc = m_parent->updateParameters((char*)payload, needRestart);
1500 if (rc == NO_ERROR) {
1501 rc = m_parent->commitParameterChanges();
1502 }
Muhua Libc9a8082012-11-07 15:51:28 -08001503 result.status = rc;
1504 result.request_api = evt;
1505 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1506 m_parent->signalAPIResult(&result);
1507 }
1508 break;
1509 case QCAMERA_SM_EVT_GET_PARAMS:
1510 {
1511 result.params = m_parent->getParameters();
1512 rc = NO_ERROR;
1513 result.status = rc;
1514 result.request_api = evt;
1515 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
1516 m_parent->signalAPIResult(&result);
1517 }
1518 break;
1519 case QCAMERA_SM_EVT_PUT_PARAMS:
1520 {
1521 rc = m_parent->putParameters((char*)payload);
1522 result.status = rc;
1523 result.request_api = evt;
1524 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1525 m_parent->signalAPIResult(&result);
1526 }
1527 break;
1528 case QCAMERA_SM_EVT_STOP_PREVIEW:
1529 {
Muhua Libd1b6122013-03-05 15:25:27 -08001530 // cancel picture first
1531 rc = m_parent->cancelPicture();
1532 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1533
Muhua Libc9a8082012-11-07 15:51:28 -08001534 result.status = rc;
1535 result.request_api = evt;
1536 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1537 m_parent->signalAPIResult(&result);
1538 }
1539 break;
1540 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1541 {
1542 rc = NO_ERROR;
1543 result.status = rc;
1544 result.request_api = evt;
1545 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1546 result.enabled = 0;
1547 m_parent->signalAPIResult(&result);
1548 }
1549 break;
1550 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1551 {
1552 rc = NO_ERROR;
1553 result.status = rc;
1554 result.request_api = evt;
1555 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1556 result.enabled = 0;
1557 m_parent->signalAPIResult(&result);
1558 }
1559 break;
1560 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1561 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001562 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001563 result.status = rc;
1564 result.request_api = evt;
1565 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1566 m_parent->signalAPIResult(&result);
1567 }
1568 break;
1569 case QCAMERA_SM_EVT_DUMP:
1570 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001571 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001572 result.status = rc;
1573 result.request_api = evt;
1574 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1575 m_parent->signalAPIResult(&result);
1576 }
1577 break;
1578 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1579 {
1580 rc = m_parent->autoFocus();
1581 result.status = rc;
1582 result.request_api = evt;
1583 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1584 m_parent->signalAPIResult(&result);
1585 }
1586 break;
1587 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1588 {
1589 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05301590 result.status = rc;
1591 result.request_api = evt;
1592 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1593 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001594 }
1595 break;
1596 case QCAMERA_SM_EVT_SEND_COMMAND:
1597 {
1598 qcamera_sm_evt_command_payload_t *cmd_payload =
1599 (qcamera_sm_evt_command_payload_t *)payload;
1600 rc = m_parent->sendCommand(cmd_payload->cmd,
1601 cmd_payload->arg1,
1602 cmd_payload->arg2);
Shuzhen Wang53e022d2014-06-04 22:17:25 -07001603#ifndef VANILLA_HAL
Emilian Peeva43000b2013-09-27 14:27:21 -07001604 if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
1605 // move state to previewing state
1606 m_state = QCAMERA_SM_STATE_PREVIEWING;
1607 }
Shuzhen Wang53e022d2014-06-04 22:17:25 -07001608#endif
Muhua Libc9a8082012-11-07 15:51:28 -08001609 result.status = rc;
1610 result.request_api = evt;
1611 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1612 m_parent->signalAPIResult(&result);
1613 }
1614 break;
1615 case QCAMERA_SM_EVT_CANCEL_PICTURE:
1616 {
1617 rc = m_parent->cancelPicture();
1618 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1619 result.status = rc;
1620 result.request_api = evt;
1621 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1622 m_parent->signalAPIResult(&result);
1623 }
1624 break;
Muhua Li5858c392013-02-04 17:53:34 -08001625 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
1626 {
1627 int32_t faceID = 0;
1628 qcamera_sm_evt_reg_face_payload_t *reg_payload =
1629 (qcamera_sm_evt_reg_face_payload_t *)payload;
1630 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
1631 reg_payload->config,
1632 faceID);
1633 result.status = rc;
1634 result.request_api = evt;
1635 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
1636 result.handle = faceID;
1637 m_parent->signalAPIResult(&result);
1638 }
1639 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001640 case QCAMERA_SM_EVT_TAKE_PICTURE:
Emilian Peeva43000b2013-09-27 14:27:21 -07001641 {
1642 if ( m_parent->isLongshotEnabled() ) {
1643 rc = m_parent->longShot();
1644 } else {
1645 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1646 rc = INVALID_OPERATION;
1647 }
1648
1649 result.status = rc;
1650 result.request_api = evt;
1651 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1652 m_parent->signalAPIResult(&result);
1653 }
1654 break;
1655 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08001656 case QCAMERA_SM_EVT_START_RECORDING:
1657 case QCAMERA_SM_EVT_STOP_RECORDING:
1658 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1659 case QCAMERA_SM_EVT_START_PREVIEW:
1660 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
1661 case QCAMERA_SM_EVT_RELEASE:
1662 {
1663 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1664 rc = INVALID_OPERATION;
1665 result.status = rc;
1666 result.request_api = evt;
1667 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1668 m_parent->signalAPIResult(&result);
1669 }
1670 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001671 case QCAMERA_SM_EVT_EVT_INTERNAL:
1672 {
1673 qcamera_sm_internal_evt_payload_t *internal_evt =
1674 (qcamera_sm_internal_evt_payload_t *)payload;
1675 switch (internal_evt->evt_type) {
1676 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
1677 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
1678 break;
Muhua Li510aab22013-05-28 17:00:38 -07001679 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
1680 break;
1681 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
1682 break;
1683 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
1684 break;
1685 case QCAMERA_INTERNAL_EVT_CROP_INFO:
1686 rc = m_parent->processZoomEvent(internal_evt->crop_data);
1687 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08001688 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
1689 rc = m_parent->processASDUpdate(internal_evt->asd_data);
1690 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08001691 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
1692 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
1693 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001694 default:
1695 break;
1696 }
1697 }
1698 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001699 case QCAMERA_SM_EVT_EVT_NOTIFY:
1700 {
1701 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1702 switch (cam_evt->server_event_type) {
Emilian Peev9c53a9e2013-12-12 15:58:13 +02001703 case CAM_EVENT_TYPE_REPROCESS_STAGE_DONE:
1704 {
1705 if ( m_parent->isLongshotEnabled() ) {
1706 if(!m_parent->m_postprocessor.getMultipleStages()) {
1707 m_parent->m_postprocessor.setMultipleStages(true);
1708 }
1709 m_parent->playShutter();
1710 }
1711 }
1712 break;
Emilian Peev15690592013-04-19 09:55:40 +03001713 case CAM_EVENT_TYPE_DAEMON_DIED:
1714 {
Emilian Peev15690592013-04-19 09:55:40 +03001715 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1716 CAMERA_ERROR_SERVER_DIED,
1717 0);
1718 }
1719 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001720 default:
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301721 CDBG_HIGH("%s: no handling for server evt (%d) at this state",
Muhua Libc9a8082012-11-07 15:51:28 -08001722 __func__, cam_evt->server_event_type);
1723 break;
1724 }
1725 }
1726 break;
1727 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
1728 {
1729 qcamera_jpeg_evt_payload_t *jpeg_job =
1730 (qcamera_jpeg_evt_payload_t *)payload;
1731 rc = m_parent->processJpegNotify(jpeg_job);
1732 }
1733 break;
Emilian Peev7d36a812013-11-20 00:15:54 -08001734 case QCAMERA_SM_EVT_STOP_CAPTURE_CHANNEL:
1735 {
Emilian Peev8a977232013-11-04 07:56:32 -08001736 bool restartPreview = m_parent->isPreviewRestartEnabled();
1737 rc = m_parent->stopCaptureChannel(restartPreview);
1738
1739 if (restartPreview && (NO_ERROR == rc)) {
1740 rc = m_parent->preparePreview();
1741 if (NO_ERROR == rc) {
1742 m_parent->m_bPreviewStarted = true;
1743 rc = m_parent->startPreview();
1744 }
1745 }
1746
Emilian Peev7d36a812013-11-20 00:15:54 -08001747 }
1748 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001749 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
1750 {
1751 rc = m_parent->cancelPicture();
Emilian Peev8a977232013-11-04 07:56:32 -08001752
1753 bool restartPreview = m_parent->isPreviewRestartEnabled();
1754 if (restartPreview) {
1755 m_state = QCAMERA_SM_STATE_PREVIEWING;
1756 } else {
1757 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1758 }
1759
Emilian Peev6d90c1f2013-04-12 09:33:06 +03001760 result.status = rc;
1761 result.request_api = evt;
1762 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1763 m_parent->signalEvtResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001764 }
1765 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08001766 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peev2ae455e2013-04-18 10:41:56 +03001767 {
1768 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001769 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peev2ae455e2013-04-18 10:41:56 +03001770 }
1771 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001772 default:
1773 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1774 break;
1775 }
1776
1777 return rc;
1778}
1779
Muhua Lida2c4be2012-11-26 09:14:16 -08001780/*===========================================================================
1781 * FUNCTION : procEvtRecordingState
1782 *
1783 * DESCRIPTION: finite state machine function to handle event in state of
1784 * QCAMERA_SM_STATE_RECORDING.
1785 *
1786 * PARAMETERS :
1787 * @evt : event to be processed
1788 * @payload : event payload. Can be NULL if not needed.
1789 *
1790 * RETURN : int32_t type of status
1791 * NO_ERROR -- success
1792 * none-zero failure code
1793 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08001794int32_t QCameraStateMachine::procEvtRecordingState(qcamera_sm_evt_enum_t evt,
1795 void *payload)
1796{
1797 int32_t rc = NO_ERROR;
1798 qcamera_api_result_t result;
1799 memset(&result, 0, sizeof(qcamera_api_result_t));
1800
1801 switch (evt) {
Emilian Peev88293e92013-06-07 12:37:18 +03001802 case QCAMERA_SM_EVT_START_PREVIEW:
Muhua Libc9a8082012-11-07 15:51:28 -08001803 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
1804 {
Emilian Peev88293e92013-06-07 12:37:18 +03001805 // WA: CTS test VideoSnapshot will try to
1806 // start preview during video recording.
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301807 CDBG_HIGH("CTS video restart op");
Emilian Peev88293e92013-06-07 12:37:18 +03001808 rc = NO_ERROR;
Muhua Libc9a8082012-11-07 15:51:28 -08001809 result.status = rc;
1810 result.request_api = evt;
1811 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1812 m_parent->signalAPIResult(&result);
1813 }
1814 break;
1815 case QCAMERA_SM_EVT_SET_CALLBACKS:
1816 {
1817 qcamera_sm_evt_setcb_payload_t *setcbs =
1818 (qcamera_sm_evt_setcb_payload_t *)payload;
1819 rc = m_parent->setCallBacks(setcbs->notify_cb,
1820 setcbs->data_cb,
1821 setcbs->data_cb_timestamp,
1822 setcbs->get_memory,
1823 setcbs->user);
1824 result.status = rc;
1825 result.request_api = evt;
1826 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1827 m_parent->signalAPIResult(&result);
1828 }
1829 break;
1830 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
1831 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001832 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001833 result.status = rc;
1834 result.request_api = evt;
1835 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1836 m_parent->signalAPIResult(&result);
1837 }
1838 break;
1839 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
1840 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001841 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001842 result.status = rc;
1843 result.request_api = evt;
1844 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1845 m_parent->signalAPIResult(&result);
1846 }
1847 break;
1848 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
1849 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001850 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001851 result.status = rc;
1852 result.request_api = evt;
1853 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1854 result.enabled = enabled;
1855 m_parent->signalAPIResult(&result);
1856 }
1857 break;
1858 case QCAMERA_SM_EVT_SET_PARAMS:
1859 {
Muhua Lida2c4be2012-11-26 09:14:16 -08001860 bool needRestart = false;
1861 rc = m_parent->updateParameters((char*)payload, needRestart);
1862 if (rc == NO_ERROR) {
1863 if (needRestart) {
1864 // cannot set parameters that requires restart during recording
1865 ALOGE("%s: Cannot set parameters that requires restart during recording",
1866 __func__);
1867 rc = BAD_VALUE;
1868 } else {
1869 rc = m_parent->commitParameterChanges();
1870 }
1871 }
Muhua Libc9a8082012-11-07 15:51:28 -08001872 result.status = rc;
1873 result.request_api = evt;
1874 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1875 m_parent->signalAPIResult(&result);
1876 }
1877 break;
1878 case QCAMERA_SM_EVT_GET_PARAMS:
1879 {
1880 result.params = m_parent->getParameters();
1881 rc = NO_ERROR;
1882 result.status = rc;
1883 result.request_api = evt;
1884 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
1885 m_parent->signalAPIResult(&result);
1886 }
1887 break;
1888 case QCAMERA_SM_EVT_PUT_PARAMS:
1889 {
1890 rc = m_parent->putParameters((char*)payload);
1891 result.status = rc;
1892 result.request_api = evt;
1893 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1894 m_parent->signalAPIResult(&result);
1895 }
1896 break;
1897 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1898 {
1899 rc = NO_ERROR;
1900 result.status = rc;
1901 result.request_api = evt;
1902 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1903 result.enabled = 0;
1904 m_parent->signalAPIResult(&result);
1905 }
1906 break;
1907 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1908 {
1909 rc = NO_ERROR;
1910 result.status = rc;
1911 result.request_api = evt;
1912 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1913 result.enabled = 1;
1914 m_parent->signalAPIResult(&result);
1915 }
1916 break;
1917 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1918 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001919 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001920 result.status = rc;
1921 result.request_api = evt;
1922 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1923 m_parent->signalAPIResult(&result);
1924 }
1925 break;
1926 case QCAMERA_SM_EVT_DUMP:
1927 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001928 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001929 result.status = rc;
1930 result.request_api = evt;
1931 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1932 m_parent->signalAPIResult(&result);
1933 }
1934 break;
1935 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1936 {
1937 rc = m_parent->autoFocus();
1938 result.status = rc;
1939 result.request_api = evt;
1940 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1941 m_parent->signalAPIResult(&result);
1942 }
1943 break;
1944 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1945 {
1946 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05301947 result.status = rc;
1948 result.request_api = evt;
1949 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1950 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001951 }
1952 break;
1953 case QCAMERA_SM_EVT_SEND_COMMAND:
1954 {
1955 qcamera_sm_evt_command_payload_t *cmd_payload =
1956 (qcamera_sm_evt_command_payload_t *)payload;
1957 rc = m_parent->sendCommand(cmd_payload->cmd,
1958 cmd_payload->arg1,
1959 cmd_payload->arg2);
1960 result.status = rc;
1961 result.request_api = evt;
1962 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1963 m_parent->signalAPIResult(&result);
1964 }
1965 break;
1966 case QCAMERA_SM_EVT_TAKE_PICTURE:
1967 {
Muhua Li1d0c4772013-02-22 15:39:45 -08001968 m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
Muhua Libc9a8082012-11-07 15:51:28 -08001969 rc = m_parent->takeLiveSnapshot();
Muhua Li1d0c4772013-02-22 15:39:45 -08001970 if (rc != NO_ERROR) {
1971 m_state = QCAMERA_SM_STATE_RECORDING;
Muhua Libc9a8082012-11-07 15:51:28 -08001972 }
1973 result.status = rc;
1974 result.request_api = evt;
1975 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1976 m_parent->signalAPIResult(&result);
1977 }
1978 break;
1979 case QCAMERA_SM_EVT_START_RECORDING:
1980 {
1981 // no ops here
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301982 CDBG_HIGH("%s: already in recording state, no ops for start_recording", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -08001983 rc = 0;
1984 result.status = rc;
1985 result.request_api = evt;
1986 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1987 m_parent->signalAPIResult(&result);
1988 }
1989 break;
1990 case QCAMERA_SM_EVT_STOP_RECORDING:
1991 {
1992 rc = m_parent->stopRecording();
1993 m_state = QCAMERA_SM_STATE_PREVIEWING;
1994 result.status = rc;
1995 result.request_api = evt;
1996 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1997 m_parent->signalAPIResult(&result);
1998 }
1999 break;
Emilian Peevf392f172013-05-13 16:29:53 -07002000 case QCAMERA_SM_EVT_STOP_PREVIEW:
2001 {
2002 rc = m_parent->stopRecording();
2003 m_state = QCAMERA_SM_STATE_PREVIEWING;
2004
2005 rc = m_parent->stopPreview();
2006 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
2007
2008 result.status = rc;
2009 result.request_api = evt;
2010 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2011 m_parent->signalAPIResult(&result);
2012 }
2013 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002014 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
2015 {
2016 rc = m_parent->releaseRecordingFrame((const void *)payload);
2017 result.status = rc;
2018 result.request_api = evt;
2019 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2020 m_parent->signalAPIResult(&result);
2021 }
2022 break;
Muhua Li5858c392013-02-04 17:53:34 -08002023 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
2024 {
2025 int32_t faceID = 0;
2026 qcamera_sm_evt_reg_face_payload_t *reg_payload =
2027 (qcamera_sm_evt_reg_face_payload_t *)payload;
2028 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
2029 reg_payload->config,
2030 faceID);
2031 result.status = rc;
2032 result.request_api = evt;
2033 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
2034 result.handle = faceID;
2035 m_parent->signalAPIResult(&result);
2036 }
2037 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08002038 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
2039 {
2040 //In Video snapshot, prepare hardware is a no-op.
2041 result.status = NO_ERROR;
2042 result.request_api = evt;
2043 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2044 m_parent->signalAPIResult(&result);
2045 }
2046 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002047 case QCAMERA_SM_EVT_CANCEL_PICTURE:
Muhua Libc9a8082012-11-07 15:51:28 -08002048 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
Muhua Libc9a8082012-11-07 15:51:28 -08002049 case QCAMERA_SM_EVT_RELEASE:
2050 {
2051 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2052 rc = INVALID_OPERATION;
2053 result.status = rc;
2054 result.request_api = evt;
2055 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2056 m_parent->signalAPIResult(&result);
2057 }
2058 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002059 case QCAMERA_SM_EVT_EVT_INTERNAL:
2060 {
2061 qcamera_sm_internal_evt_payload_t *internal_evt =
2062 (qcamera_sm_internal_evt_payload_t *)payload;
2063 switch (internal_evt->evt_type) {
2064 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
2065 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
2066 break;
Muhua Li510aab22013-05-28 17:00:38 -07002067 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
2068 break;
2069 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
2070 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
2071 break;
2072 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
2073 rc = m_parent->processHistogramStats(internal_evt->stats_data);
2074 break;
2075 case QCAMERA_INTERNAL_EVT_CROP_INFO:
2076 rc = m_parent->processZoomEvent(internal_evt->crop_data);
2077 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08002078 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
2079 rc = m_parent->processASDUpdate(internal_evt->asd_data);
2080 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08002081 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
2082 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
2083 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002084 default:
2085 break;
2086 }
2087 }
2088 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002089 case QCAMERA_SM_EVT_EVT_NOTIFY:
2090 {
2091 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
2092 switch (cam_evt->server_event_type) {
Emilian Peev15690592013-04-19 09:55:40 +03002093 case CAM_EVENT_TYPE_DAEMON_DIED:
2094 {
Emilian Peev15690592013-04-19 09:55:40 +03002095 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2096 CAMERA_ERROR_SERVER_DIED,
2097 0);
2098 }
2099 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002100 default:
Emilian Peev15690592013-04-19 09:55:40 +03002101 ALOGE("%s: Invalid internal event %d in state(%d)",
2102 __func__, cam_evt->server_event_type, m_state);
Muhua Libc9a8082012-11-07 15:51:28 -08002103 break;
2104 }
2105 }
2106 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002107 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002108 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08002109 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002110 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002111 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002112 break;
Muhua Lida2c4be2012-11-26 09:14:16 -08002113 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
Muhua Lic9390df2013-05-22 17:54:13 -07002114 {
2115 // No ops, but need to notify
2116 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2117 result.status = rc;
2118 result.request_api = evt;
2119 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2120 m_parent->signalEvtResult(&result);
2121 }
2122 break;
2123 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Muhua Libc9a8082012-11-07 15:51:28 -08002124 default:
2125 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2126 break;
2127 }
2128
2129 return rc;
2130}
2131
Muhua Lida2c4be2012-11-26 09:14:16 -08002132/*===========================================================================
2133 * FUNCTION : procEvtVideoPicTakingState
2134 *
2135 * DESCRIPTION: finite state machine function to handle event in state of
2136 * QCAMERA_SM_STATE_VIDEO_PIC_TAKING.
2137 *
2138 * PARAMETERS :
2139 * @evt : event to be processed
2140 * @payload : event payload. Can be NULL if not needed.
2141 *
2142 * RETURN : int32_t type of status
2143 * NO_ERROR -- success
2144 * none-zero failure code
2145 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08002146int32_t QCameraStateMachine::procEvtVideoPicTakingState(qcamera_sm_evt_enum_t evt,
2147 void *payload)
2148{
2149 int32_t rc = NO_ERROR;
2150 qcamera_api_result_t result;
2151 memset(&result, 0, sizeof(qcamera_api_result_t));
2152
2153 switch (evt) {
2154 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
2155 {
2156 // Error setting preview window during previewing
2157 ALOGE("Cannot set preview window when preview is running");
2158 rc = INVALID_OPERATION;
2159 result.status = rc;
2160 result.request_api = evt;
2161 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2162 m_parent->signalAPIResult(&result);
2163 }
2164 break;
2165 case QCAMERA_SM_EVT_SET_CALLBACKS:
2166 {
2167 qcamera_sm_evt_setcb_payload_t *setcbs =
2168 (qcamera_sm_evt_setcb_payload_t *)payload;
2169 rc = m_parent->setCallBacks(setcbs->notify_cb,
2170 setcbs->data_cb,
2171 setcbs->data_cb_timestamp,
2172 setcbs->get_memory,
2173 setcbs->user);
2174 result.status = rc;
2175 result.request_api = evt;
2176 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2177 m_parent->signalAPIResult(&result);
2178 }
2179 break;
2180 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
2181 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002182 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002183 result.status = rc;
2184 result.request_api = evt;
2185 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2186 m_parent->signalAPIResult(&result);
2187 }
2188 break;
2189 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
2190 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002191 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002192 result.status = rc;
2193 result.request_api = evt;
2194 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2195 m_parent->signalAPIResult(&result);
2196 }
2197 break;
2198 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
2199 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002200 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002201 result.status = rc;
2202 result.request_api = evt;
2203 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2204 result.enabled = enabled;
2205 m_parent->signalAPIResult(&result);
2206 }
2207 break;
2208 case QCAMERA_SM_EVT_SET_PARAMS:
2209 {
Muhua Lida2c4be2012-11-26 09:14:16 -08002210 bool needRestart = false;
2211 rc = m_parent->updateParameters((char*)payload, needRestart);
2212 if (rc == NO_ERROR) {
2213 if (needRestart) {
2214 // cannot set parameters that requires restart during recording
2215 ALOGE("%s: Cannot set parameters that requires restart during recording",
2216 __func__);
2217 rc = BAD_VALUE;
2218 } else {
2219 rc = m_parent->commitParameterChanges();
2220 }
2221 }
Muhua Libc9a8082012-11-07 15:51:28 -08002222 result.status = rc;
2223 result.request_api = evt;
2224 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2225 m_parent->signalAPIResult(&result);
2226 }
2227 break;
2228 case QCAMERA_SM_EVT_GET_PARAMS:
2229 {
2230 result.params = m_parent->getParameters();
2231 rc = NO_ERROR;
2232 result.status = rc;
2233 result.request_api = evt;
2234 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
2235 m_parent->signalAPIResult(&result);
2236 }
2237 break;
2238 case QCAMERA_SM_EVT_PUT_PARAMS:
2239 {
2240 rc = m_parent->putParameters((char*)payload);
2241 result.status = rc;
2242 result.request_api = evt;
2243 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2244 m_parent->signalAPIResult(&result);
2245 }
2246 break;
2247 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
2248 {
2249 rc = NO_ERROR;
2250 result.status = rc;
2251 result.request_api = evt;
2252 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2253 result.enabled = 1;
2254 m_parent->signalAPIResult(&result);
2255 }
2256 break;
2257 case QCAMERA_SM_EVT_RECORDING_ENABLED:
2258 {
2259 rc = NO_ERROR;
2260 result.status = rc;
2261 result.request_api = evt;
2262 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2263 result.enabled = 1;
2264 m_parent->signalAPIResult(&result);
2265 }
2266 break;
2267 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
2268 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002269 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002270 result.status = rc;
2271 result.request_api = evt;
2272 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2273 m_parent->signalAPIResult(&result);
2274 }
2275 break;
2276 case QCAMERA_SM_EVT_DUMP:
2277 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002278 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002279 result.status = rc;
2280 result.request_api = evt;
2281 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2282 m_parent->signalAPIResult(&result);
2283 }
2284 break;
2285 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
2286 {
2287 rc = m_parent->autoFocus();
2288 result.status = rc;
2289 result.request_api = evt;
2290 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2291 m_parent->signalAPIResult(&result);
2292 }
2293 break;
2294 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
2295 {
2296 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05302297 result.status = rc;
2298 result.request_api = evt;
2299 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2300 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002301 }
2302 break;
2303 case QCAMERA_SM_EVT_SEND_COMMAND:
2304 {
2305 qcamera_sm_evt_command_payload_t *cmd_payload =
2306 (qcamera_sm_evt_command_payload_t *)payload;
2307 rc = m_parent->sendCommand(cmd_payload->cmd,
2308 cmd_payload->arg1,
2309 cmd_payload->arg2);
2310 result.status = rc;
2311 result.request_api = evt;
2312 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2313 m_parent->signalAPIResult(&result);
2314 }
2315 break;
2316 case QCAMERA_SM_EVT_STOP_RECORDING:
2317 {
Sai Kumar Sanagavarapud972ac12014-01-07 14:23:52 +05302318 rc = m_parent->cancelLiveSnapshot();
2319 m_state = QCAMERA_SM_STATE_RECORDING;
2320
Muhua Libc9a8082012-11-07 15:51:28 -08002321 rc = m_parent->stopRecording();
Sai Kumar Sanagavarapud972ac12014-01-07 14:23:52 +05302322 m_state = QCAMERA_SM_STATE_PREVIEWING;
2323
Muhua Libc9a8082012-11-07 15:51:28 -08002324 result.status = rc;
2325 result.request_api = evt;
2326 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2327 m_parent->signalAPIResult(&result);
2328 }
2329 break;
2330 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
2331 {
2332 rc = m_parent->releaseRecordingFrame((const void *)payload);
2333 result.status = rc;
2334 result.request_api = evt;
2335 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2336 m_parent->signalAPIResult(&result);
2337 }
2338 break;
2339 case QCAMERA_SM_EVT_CANCEL_PICTURE:
2340 {
2341 rc = m_parent->cancelLiveSnapshot();
2342 m_state = QCAMERA_SM_STATE_RECORDING;
2343 result.status = rc;
2344 result.request_api = evt;
2345 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2346 m_parent->signalAPIResult(&result);
2347 }
2348 break;
Muhua Li5858c392013-02-04 17:53:34 -08002349 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
2350 {
2351 int32_t faceID = 0;
2352 qcamera_sm_evt_reg_face_payload_t *reg_payload =
2353 (qcamera_sm_evt_reg_face_payload_t *)payload;
2354 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
2355 reg_payload->config,
2356 faceID);
2357 result.status = rc;
2358 result.request_api = evt;
2359 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
2360 result.handle = faceID;
2361 m_parent->signalAPIResult(&result);
2362 }
2363 break;
Emilian Peevf392f172013-05-13 16:29:53 -07002364 case QCAMERA_SM_EVT_STOP_PREVIEW:
2365 {
2366 rc = m_parent->cancelLiveSnapshot();
2367 m_state = QCAMERA_SM_STATE_RECORDING;
2368
2369 rc = m_parent->stopRecording();
2370 m_state = QCAMERA_SM_STATE_PREVIEWING;
2371
2372 rc = m_parent->stopPreview();
2373 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
2374
2375 result.status = rc;
2376 result.request_api = evt;
2377 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2378 m_parent->signalAPIResult(&result);
2379 }
2380 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002381 case QCAMERA_SM_EVT_START_RECORDING:
2382 case QCAMERA_SM_EVT_START_PREVIEW:
2383 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
Muhua Li510aab22013-05-28 17:00:38 -07002384 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08002385 case QCAMERA_SM_EVT_TAKE_PICTURE:
2386 case QCAMERA_SM_EVT_RELEASE:
2387 {
2388 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2389 rc = INVALID_OPERATION;
2390 result.status = rc;
2391 result.request_api = evt;
2392 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2393 m_parent->signalAPIResult(&result);
2394 }
2395 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002396 case QCAMERA_SM_EVT_EVT_INTERNAL:
2397 {
2398 qcamera_sm_internal_evt_payload_t *internal_evt =
2399 (qcamera_sm_internal_evt_payload_t *)payload;
2400 switch (internal_evt->evt_type) {
2401 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
2402 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
2403 break;
Muhua Li510aab22013-05-28 17:00:38 -07002404 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
2405 break;
2406 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
2407 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
2408 break;
2409 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
2410 rc = m_parent->processHistogramStats(internal_evt->stats_data);
2411 break;
2412 case QCAMERA_INTERNAL_EVT_CROP_INFO:
2413 rc = m_parent->processZoomEvent(internal_evt->crop_data);
2414 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08002415 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
2416 rc = m_parent->processASDUpdate(internal_evt->asd_data);
2417 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08002418 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
2419 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
2420 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002421 default:
2422 break;
2423 }
2424 }
2425 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002426 case QCAMERA_SM_EVT_EVT_NOTIFY:
2427 {
2428 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
2429 switch (cam_evt->server_event_type) {
Emilian Peev15690592013-04-19 09:55:40 +03002430 case CAM_EVENT_TYPE_DAEMON_DIED:
2431 {
Emilian Peev15690592013-04-19 09:55:40 +03002432 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2433 CAMERA_ERROR_SERVER_DIED,
2434 0);
2435 }
2436 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002437 default:
Emilian Peev15690592013-04-19 09:55:40 +03002438 ALOGE("%s: Invalid internal event %d in state(%d)",
2439 __func__, cam_evt->server_event_type, m_state);
Muhua Libc9a8082012-11-07 15:51:28 -08002440 break;
2441 }
2442 }
2443 break;
2444 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
2445 {
2446 qcamera_jpeg_evt_payload_t *jpeg_job =
2447 (qcamera_jpeg_evt_payload_t *)payload;
2448 rc = m_parent->processJpegNotify(jpeg_job);
2449 }
2450 break;
2451 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
2452 {
2453 rc = m_parent->cancelLiveSnapshot();
2454 m_state = QCAMERA_SM_STATE_RECORDING;
Emilian Peev6d90c1f2013-04-12 09:33:06 +03002455 result.status = rc;
2456 result.request_api = evt;
2457 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2458 m_parent->signalEvtResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002459 }
2460 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002461 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002462 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08002463 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002464 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002465 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002466 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002467 default:
2468 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2469 break;
2470 }
2471
2472 return rc;
2473}
2474
Muhua Lida2c4be2012-11-26 09:14:16 -08002475/*===========================================================================
2476 * FUNCTION : procEvtPreviewPicTakingState
2477 *
2478 * DESCRIPTION: finite state machine function to handle event in state of
2479 * QCAMERA_SM_STATE_PREVIEW_PIC_TAKING.
2480 *
2481 * PARAMETERS :
2482 * @evt : event to be processed
2483 * @payload : event payload. Can be NULL if not needed.
2484 *
2485 * RETURN : int32_t type of status
2486 * NO_ERROR -- success
2487 * none-zero failure code
2488 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08002489int32_t QCameraStateMachine::procEvtPreviewPicTakingState(qcamera_sm_evt_enum_t evt,
2490 void *payload)
2491{
2492 int32_t rc = NO_ERROR;
2493 qcamera_api_result_t result;
2494 memset(&result, 0, sizeof(qcamera_api_result_t));
2495
2496 switch (evt) {
2497 case QCAMERA_SM_EVT_SET_CALLBACKS:
2498 {
2499 qcamera_sm_evt_setcb_payload_t *setcbs =
2500 (qcamera_sm_evt_setcb_payload_t *)payload;
2501 rc = m_parent->setCallBacks(setcbs->notify_cb,
2502 setcbs->data_cb,
2503 setcbs->data_cb_timestamp,
2504 setcbs->get_memory,
2505 setcbs->user);
2506 result.status = rc;
2507 result.request_api = evt;
2508 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2509 m_parent->signalAPIResult(&result);
2510 }
2511 break;
2512 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
2513 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002514 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002515 result.status = rc;
2516 result.request_api = evt;
2517 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2518 m_parent->signalAPIResult(&result);
2519 }
2520 break;
2521 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
2522 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002523 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002524 result.status = rc;
2525 result.request_api = evt;
2526 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2527 m_parent->signalAPIResult(&result);
2528 }
2529 break;
2530 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
2531 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002532 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002533 result.status = rc;
2534 result.request_api = evt;
2535 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2536 result.enabled = enabled;
2537 m_parent->signalAPIResult(&result);
2538 }
2539 break;
2540 case QCAMERA_SM_EVT_SET_PARAMS:
2541 {
Muhua Lida2c4be2012-11-26 09:14:16 -08002542 bool needRestart = false;
2543 rc = m_parent->updateParameters((char*)payload, needRestart);
2544 if (rc == NO_ERROR) {
2545 if (needRestart) {
2546 // need restart preview for parameters to take effect
2547 // stop preview
2548 m_parent->stopPreview();
Emilian Peev9afd73b2013-10-31 08:19:57 -07002549 // Clear memory pools
2550 m_parent->m_memoryPool.clear();
Muhua Lida2c4be2012-11-26 09:14:16 -08002551 // commit parameter changes to server
Muhua Li66f3b532013-01-23 17:19:05 -08002552 m_parent->commitParameterChanges();
Muhua Lida2c4be2012-11-26 09:14:16 -08002553 // start preview again
Muhua Li66f3b532013-01-23 17:19:05 -08002554 rc = m_parent->preparePreview();
2555 if (rc == NO_ERROR) {
2556 rc = m_parent->startPreview();
2557 if (rc != NO_ERROR) {
2558 m_parent->unpreparePreview();
2559 }
2560 }
2561 if (rc != NO_ERROR) {
2562 m_state = QCAMERA_SM_STATE_PIC_TAKING;
2563 }
Muhua Lida2c4be2012-11-26 09:14:16 -08002564 } else {
2565 rc = m_parent->commitParameterChanges();
2566 }
2567 }
Muhua Libc9a8082012-11-07 15:51:28 -08002568 result.status = rc;
2569 result.request_api = evt;
2570 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2571 m_parent->signalAPIResult(&result);
2572 }
2573 break;
2574 case QCAMERA_SM_EVT_GET_PARAMS:
2575 {
2576 result.params = m_parent->getParameters();
2577 rc = NO_ERROR;
2578 result.status = rc;
2579 result.request_api = evt;
2580 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
2581 m_parent->signalAPIResult(&result);
2582 }
2583 break;
2584 case QCAMERA_SM_EVT_PUT_PARAMS:
2585 {
2586 rc = m_parent->putParameters((char*)payload);
2587 result.status = rc;
2588 result.request_api = evt;
2589 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2590 m_parent->signalAPIResult(&result);
2591 }
2592 break;
2593 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
2594 {
2595 rc = NO_ERROR;
2596 result.status = rc;
2597 result.request_api = evt;
2598 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2599 result.enabled = 1;
2600 m_parent->signalAPIResult(&result);
2601 }
2602 break;
2603 case QCAMERA_SM_EVT_RECORDING_ENABLED:
2604 {
2605 rc = NO_ERROR;
2606 result.status = rc;
2607 result.request_api = evt;
2608 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2609 result.enabled = 0;
2610 m_parent->signalAPIResult(&result);
2611 }
2612 break;
2613 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
2614 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002615 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002616 result.status = rc;
2617 result.request_api = evt;
2618 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2619 m_parent->signalAPIResult(&result);
2620 }
2621 break;
2622 case QCAMERA_SM_EVT_DUMP:
2623 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002624 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002625 result.status = rc;
2626 result.request_api = evt;
2627 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2628 m_parent->signalAPIResult(&result);
2629 }
2630 break;
2631 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
2632 {
2633 rc = m_parent->autoFocus();
2634 result.status = rc;
2635 result.request_api = evt;
2636 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2637 m_parent->signalAPIResult(&result);
2638 }
2639 break;
2640 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
2641 {
2642 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05302643 result.status = rc;
2644 result.request_api = evt;
2645 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2646 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002647 }
2648 break;
2649 case QCAMERA_SM_EVT_SEND_COMMAND:
2650 {
2651 qcamera_sm_evt_command_payload_t *cmd_payload =
2652 (qcamera_sm_evt_command_payload_t *)payload;
2653 rc = m_parent->sendCommand(cmd_payload->cmd,
2654 cmd_payload->arg1,
2655 cmd_payload->arg2);
Shuzhen Wang53e022d2014-06-04 22:17:25 -07002656#ifndef VANILLA_HAL
Emilian Peeve32d03b2013-08-13 16:15:41 +03002657 if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
2658 // move state to previewing state
2659 m_state = QCAMERA_SM_STATE_PREVIEWING;
2660 }
Shuzhen Wang53e022d2014-06-04 22:17:25 -07002661#endif
Muhua Libc9a8082012-11-07 15:51:28 -08002662 result.status = rc;
2663 result.request_api = evt;
2664 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2665 m_parent->signalAPIResult(&result);
2666 }
2667 break;
2668 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
2669 {
2670 rc = m_parent->releaseRecordingFrame((const void *)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_CANCEL_PICTURE:
2678 {
Emilian Peeva43000b2013-09-27 14:27:21 -07002679 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08002680 rc = m_parent->cancelPicture();
2681 } else {
2682 rc = m_parent->cancelLiveSnapshot();
2683 }
Muhua Libc9a8082012-11-07 15:51:28 -08002684 m_state = QCAMERA_SM_STATE_PREVIEWING;
2685 result.status = rc;
2686 result.request_api = evt;
2687 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2688 m_parent->signalAPIResult(&result);
2689 }
2690 break;
2691 case QCAMERA_SM_EVT_STOP_PREVIEW:
2692 {
Muhua Libd1b6122013-03-05 15:25:27 -08002693 if (m_parent->isZSLMode()) {
2694 // cancel picture first
2695 rc = m_parent->cancelPicture();
2696 m_parent->stopChannel(QCAMERA_CH_TYPE_ZSL);
Emilian Peeva43000b2013-09-27 14:27:21 -07002697 } else if (m_parent->isLongshotEnabled()) {
2698 // just cancel picture
2699 rc = m_parent->cancelPicture();
Muhua Libd1b6122013-03-05 15:25:27 -08002700 } else {
2701 rc = m_parent->cancelLiveSnapshot();
2702 m_parent->stopChannel(QCAMERA_CH_TYPE_PREVIEW);
2703 }
2704 // unprepare preview
2705 m_parent->unpreparePreview();
2706 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
Muhua Libc9a8082012-11-07 15:51:28 -08002707 result.status = rc;
2708 result.request_api = evt;
2709 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2710 m_parent->signalAPIResult(&result);
2711 }
2712 break;
2713 case QCAMERA_SM_EVT_START_RECORDING:
2714 {
Muhua Licf1cf672013-05-10 09:42:50 -07002715 if (m_parent->isZSLMode()) {
2716 ALOGE("%s: cannot handle evt(%d) in state(%d) in ZSL mode",
2717 __func__, evt, m_state);
2718 rc = INVALID_OPERATION;
Emilian Peeva43000b2013-09-27 14:27:21 -07002719 } else if (m_parent->isLongshotEnabled()) {
2720 ALOGE("%s: cannot handle evt(%d) in state(%d) in Longshot mode",
2721 __func__, evt, m_state);
2722 rc = INVALID_OPERATION;
Muhua Licf1cf672013-05-10 09:42:50 -07002723 } else {
2724 rc = m_parent->startRecording();
2725 if (rc == NO_ERROR) {
2726 m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
2727 }
Muhua Libc9a8082012-11-07 15:51:28 -08002728 }
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;
Muhua Li5858c392013-02-04 17:53:34 -08002735 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
2736 {
2737 int32_t faceID = 0;
2738 qcamera_sm_evt_reg_face_payload_t *reg_payload =
2739 (qcamera_sm_evt_reg_face_payload_t *)payload;
2740 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
2741 reg_payload->config,
2742 faceID);
2743 result.status = rc;
2744 result.request_api = evt;
2745 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
2746 result.handle = faceID;
2747 m_parent->signalAPIResult(&result);
2748 }
2749 break;
Emilian Peeve32d03b2013-08-13 16:15:41 +03002750 case QCAMERA_SM_EVT_TAKE_PICTURE:
2751 {
2752 if ( m_parent->isLongshotEnabled() ) {
2753 rc = m_parent->longShot();
2754 } else {
2755 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2756 rc = INVALID_OPERATION;
2757 }
2758
2759 result.status = rc;
2760 result.request_api = evt;
2761 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2762 m_parent->signalAPIResult(&result);
2763 }
2764 break;
2765 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08002766 case QCAMERA_SM_EVT_STOP_RECORDING:
2767 case QCAMERA_SM_EVT_START_PREVIEW:
2768 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
Muhua Libc9a8082012-11-07 15:51:28 -08002769 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
2770 case QCAMERA_SM_EVT_RELEASE:
2771 {
2772 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2773 rc = INVALID_OPERATION;
2774 result.status = rc;
2775 result.request_api = evt;
2776 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2777 m_parent->signalAPIResult(&result);
2778 }
2779 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002780 case QCAMERA_SM_EVT_EVT_INTERNAL:
2781 {
2782 qcamera_sm_internal_evt_payload_t *internal_evt =
2783 (qcamera_sm_internal_evt_payload_t *)payload;
2784 switch (internal_evt->evt_type) {
2785 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
2786 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
2787 break;
Muhua Li510aab22013-05-28 17:00:38 -07002788 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
2789 break;
2790 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
2791 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
2792 break;
2793 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
2794 rc = m_parent->processHistogramStats(internal_evt->stats_data);
2795 break;
2796 case QCAMERA_INTERNAL_EVT_CROP_INFO:
2797 rc = m_parent->processZoomEvent(internal_evt->crop_data);
2798 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08002799 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
2800 rc = m_parent->processASDUpdate(internal_evt->asd_data);
2801 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08002802 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
2803 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
2804 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002805 default:
2806 break;
2807 }
2808 }
2809 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002810 case QCAMERA_SM_EVT_EVT_NOTIFY:
2811 {
2812 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
2813 switch (cam_evt->server_event_type) {
Emilian Peev9c53a9e2013-12-12 15:58:13 +02002814 case CAM_EVENT_TYPE_REPROCESS_STAGE_DONE:
2815 {
2816 if ( m_parent->isLongshotEnabled() ) {
2817 if(!m_parent->m_postprocessor.getMultipleStages()) {
2818 m_parent->m_postprocessor.setMultipleStages(true);
2819 }
2820 m_parent->playShutter();
2821 }
2822 }
2823 break;
Emilian Peev15690592013-04-19 09:55:40 +03002824 case CAM_EVENT_TYPE_DAEMON_DIED:
2825 {
Emilian Peev15690592013-04-19 09:55:40 +03002826 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2827 CAMERA_ERROR_SERVER_DIED,
2828 0);
2829 }
2830 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002831 default:
Emilian Peev15690592013-04-19 09:55:40 +03002832 ALOGE("%s: Invalid internal event %d in state(%d)",
2833 __func__, cam_evt->server_event_type, m_state);
Muhua Libc9a8082012-11-07 15:51:28 -08002834 break;
2835 }
2836 }
2837 break;
2838 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
2839 {
2840 qcamera_jpeg_evt_payload_t *jpeg_job =
2841 (qcamera_jpeg_evt_payload_t *)payload;
2842 rc = m_parent->processJpegNotify(jpeg_job);
2843 }
2844 break;
2845 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
2846 {
Emilian Peeva43000b2013-09-27 14:27:21 -07002847 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08002848 rc = m_parent->cancelPicture();
2849 } else {
2850 rc = m_parent->cancelLiveSnapshot();
2851 }
Muhua Libc9a8082012-11-07 15:51:28 -08002852 m_state = QCAMERA_SM_STATE_PREVIEWING;
Emilian Peev6d90c1f2013-04-12 09:33:06 +03002853 result.status = rc;
2854 result.request_api = evt;
2855 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2856 m_parent->signalEvtResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002857 }
2858 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002859 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002860 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08002861 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002862 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002863 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002864 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002865 default:
2866 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2867 break;
2868 }
2869
2870 return rc;
2871}
2872
Muhua Lida2c4be2012-11-26 09:14:16 -08002873/*===========================================================================
2874 * FUNCTION : isPreviewRunning
2875 *
2876 * DESCRIPTION: check if preview is in process.
2877 *
2878 * PARAMETERS : None
2879 *
2880 * RETURN : true -- preview running
2881 * false -- preview stopped
2882 *==========================================================================*/
2883bool QCameraStateMachine::isPreviewRunning()
2884{
2885 switch (m_state) {
2886 case QCAMERA_SM_STATE_PREVIEWING:
2887 case QCAMERA_SM_STATE_RECORDING:
2888 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
2889 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
Muhua Libf818e52013-04-23 18:05:26 -07002890 case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
chiza8491aa2014-03-21 13:02:39 +08002891 case QCAMERA_SM_STATE_PREVIEW_READY:
Muhua Lida2c4be2012-11-26 09:14:16 -08002892 return true;
2893 default:
2894 return false;
2895 }
2896}
2897
Emilian Peeve32d03b2013-08-13 16:15:41 +03002898/*===========================================================================
Emilian Peev7890d1f2014-04-30 15:13:41 -07002899 * FUNCTION : isPreviewReady
2900 *
2901 * DESCRIPTION: check if preview is in ready state.
2902 *
2903 * PARAMETERS : None
2904 *
2905 * RETURN : true -- preview is in ready state
2906 * false -- preview is stopped
2907 *==========================================================================*/
2908bool QCameraStateMachine::isPreviewReady()
2909{
2910 switch (m_state) {
2911 case QCAMERA_SM_STATE_PREVIEW_READY:
2912 return true;
2913 default:
2914 return false;
2915 }
2916}
2917
2918/*===========================================================================
Emilian Peeve32d03b2013-08-13 16:15:41 +03002919 * FUNCTION : isCaptureRunning
2920 *
2921 * DESCRIPTION: check if image capture is in process.
2922 *
2923 * PARAMETERS : None
2924 *
2925 * RETURN : true -- capture running
2926 * false -- capture stopped
2927 *==========================================================================*/
2928bool QCameraStateMachine::isCaptureRunning()
2929{
2930 switch (m_state) {
2931 case QCAMERA_SM_STATE_PIC_TAKING:
2932 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
2933 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
2934 return true;
2935 default:
2936 return false;
2937 }
2938}
Vijay kumar Tumatifa8d9b32013-09-23 16:09:07 +05302939/*===========================================================================
2940 * FUNCTION : isNonZSLCaptureRunning
2941 *
2942 * DESCRIPTION: check if image capture is in process in non ZSL mode.
2943 *
2944 * PARAMETERS : None
2945 *
2946 * RETURN : true -- capture running in non ZSL mode
2947 * false -- Either in not capture mode or captur is not in non ZSL mode
2948 *==========================================================================*/
2949bool QCameraStateMachine::isNonZSLCaptureRunning()
2950{
2951 switch (m_state) {
2952 case QCAMERA_SM_STATE_PIC_TAKING:
2953 return true;
2954 default:
2955 return false;
2956 }
2957}
2958
Emilian Peeve32d03b2013-08-13 16:15:41 +03002959
Shuzhen Wang89635cf2012-12-20 13:47:22 -08002960}; // namespace qcamera