QCamera2: Updates camera error handling
- This patch propagates an additional V4L2
error event to the camera client via
error callbacks.
Change-Id: I767060496c8e8e1e8936ec185a9560a83f3fb6d5
diff --git a/QCamera2/HAL/QCameraStateMachine.cpp b/QCamera2/HAL/QCameraStateMachine.cpp
index 3fc050d..c34291d 100644
--- a/QCamera2/HAL/QCameraStateMachine.cpp
+++ b/QCamera2/HAL/QCameraStateMachine.cpp
@@ -534,8 +534,26 @@
m_parent->signalAPIResult(&result);
}
break;
- case QCAMERA_SM_EVT_EVT_INTERNAL:
case QCAMERA_SM_EVT_EVT_NOTIFY:
+ {
+ mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
+ switch (cam_evt->server_event_type) {
+ case CAM_EVENT_TYPE_DAEMON_DIED:
+ {
+ free(payload);
+ m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
+ CAMERA_ERROR_SERVER_DIED,
+ 0);
+ }
+ break;
+ default:
+ ALOGE("%s: Invalid internal event %d in state(%d)",
+ __func__, cam_evt->server_event_type, m_state);
+ break;
+ }
+ }
+ break;
+ case QCAMERA_SM_EVT_EVT_INTERNAL:
case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
case QCAMERA_SM_EVT_SNAPSHOT_DONE:
case QCAMERA_SM_EVT_THERMAL_NOTIFY:
@@ -798,8 +816,26 @@
m_parent->signalAPIResult(&result);
}
break;
- case QCAMERA_SM_EVT_EVT_INTERNAL:
case QCAMERA_SM_EVT_EVT_NOTIFY:
+ {
+ mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
+ switch (cam_evt->server_event_type) {
+ case CAM_EVENT_TYPE_DAEMON_DIED:
+ {
+ free(payload);
+ m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
+ CAMERA_ERROR_SERVER_DIED,
+ 0);
+ }
+ break;
+ default:
+ ALOGE("%s: Invalid internal event %d in state(%d)",
+ __func__, cam_evt->server_event_type, m_state);
+ break;
+ }
+ }
+ break;
+ case QCAMERA_SM_EVT_EVT_INTERNAL:
case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
case QCAMERA_SM_EVT_SNAPSHOT_DONE:
case QCAMERA_SM_EVT_THERMAL_NOTIFY:
@@ -1128,6 +1164,14 @@
{
mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
switch (cam_evt->server_event_type) {
+ case CAM_EVENT_TYPE_DAEMON_DIED:
+ {
+ free(payload);
+ m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
+ CAMERA_ERROR_SERVER_DIED,
+ 0);
+ }
+ break;
default:
ALOGD("%s: no handling for server evt (%d) at this state",
__func__, cam_evt->server_event_type);
@@ -1230,6 +1274,24 @@
}
break;
case QCAMERA_SM_EVT_EVT_NOTIFY:
+ {
+ mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
+ switch (cam_evt->server_event_type) {
+ case CAM_EVENT_TYPE_DAEMON_DIED:
+ {
+ free(payload);
+ m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
+ CAMERA_ERROR_SERVER_DIED,
+ 0);
+ }
+ break;
+ default:
+ ALOGE("%s: Invalid internal event %d in state(%d)",
+ __func__, cam_evt->server_event_type, m_state);
+ break;
+ }
+ }
+ break;
case QCAMERA_SM_EVT_THERMAL_NOTIFY:
case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
case QCAMERA_SM_EVT_SNAPSHOT_DONE:
@@ -1488,6 +1550,14 @@
{
mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
switch (cam_evt->server_event_type) {
+ case CAM_EVENT_TYPE_DAEMON_DIED:
+ {
+ free(payload);
+ m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
+ CAMERA_ERROR_SERVER_DIED,
+ 0);
+ }
+ break;
default:
ALOGD("%s: no handling for server evt (%d) at this state",
__func__, cam_evt->server_event_type);
@@ -1799,9 +1869,17 @@
{
mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
switch (cam_evt->server_event_type) {
+ case CAM_EVENT_TYPE_DAEMON_DIED:
+ {
+ free(payload);
+ m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
+ CAMERA_ERROR_SERVER_DIED,
+ 0);
+ }
+ break;
default:
- ALOGD("%s: no handling for server evt (%d) at this state",
- __func__, cam_evt->server_event_type);
+ ALOGE("%s: Invalid internal event %d in state(%d)",
+ __func__, cam_evt->server_event_type, m_state);
break;
}
}
@@ -2082,9 +2160,17 @@
{
mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
switch (cam_evt->server_event_type) {
+ case CAM_EVENT_TYPE_DAEMON_DIED:
+ {
+ free(payload);
+ m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
+ CAMERA_ERROR_SERVER_DIED,
+ 0);
+ }
+ break;
default:
- ALOGD("%s: no handling for server evt (%d) at this state",
- __func__, cam_evt->server_event_type);
+ ALOGE("%s: Invalid internal event %d in state(%d)",
+ __func__, cam_evt->server_event_type, m_state);
break;
}
}
@@ -2402,9 +2488,17 @@
{
mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
switch (cam_evt->server_event_type) {
+ case CAM_EVENT_TYPE_DAEMON_DIED:
+ {
+ free(payload);
+ m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
+ CAMERA_ERROR_SERVER_DIED,
+ 0);
+ }
+ break;
default:
- ALOGD("%s: no handling for server evt (%d) at this state",
- __func__, cam_evt->server_event_type);
+ ALOGE("%s: Invalid internal event %d in state(%d)",
+ __func__, cam_evt->server_event_type, m_state);
break;
}
}