QCamera2: This change contains following changes.

1. Add meta data stream to support histogram and face detection.
2. Run fromdos on all source files.
3. Add double padding capability in frame offset calculation.
4. change cam_intf.h to pass plane info to server.
5. change mm-camera-interface for data struct change in mapping
   unmapping via domain socket.
6. add QCameraExif class to wrap HAL exif info.
7. seperate common data structs and types from cam_intf.h
   into a new file cam_types.h to be shared by all modules.
8. Code cleanup
   fix copyright marking, remove unnecessary ALOE,
   comment out jpeg_open, use assignment instead of memcpy
9. QCameraParameters implementation
10. clean up parameter struct in cam_intf.h
11. merge impl in SockParm into QCameraParameters
12. Add bayer pattern in the bayer raw formats.

Change-Id: I30e804433139215cbcfea1f55c3aad8e79435208
diff --git a/QCamera2/HAL/QCameraStateMachine.cpp b/QCamera2/HAL/QCameraStateMachine.cpp
index acde9b0..275ed5f 100644
--- a/QCamera2/HAL/QCameraStateMachine.cpp
+++ b/QCamera2/HAL/QCameraStateMachine.cpp
@@ -36,6 +36,17 @@
 
 namespace android {
 
+/*===========================================================================
+ * FUNCTION   : smEvtProcRoutine
+ *
+ * DESCRIPTION: Statemachine process thread routine to handle events
+ *              in different state.
+ *
+ * PARAMETERS :
+ *   @data    : ptr to QCameraStateMachine object
+ *
+ * RETURN     : none
+ *==========================================================================*/
 void *QCameraStateMachine::smEvtProcRoutine(void *data)
 {
     int running = 1, ret;
@@ -77,6 +88,16 @@
     return NULL;
 }
 
+/*===========================================================================
+ * FUNCTION   : QCameraStateMachine
+ *
+ * DESCRIPTION: constructor of QCameraStateMachine. Will start process thread
+ *
+ * PARAMETERS :
+ *   @ctrl    : ptr to HWI object
+ *
+ * RETURN     : none
+ *==========================================================================*/
 QCameraStateMachine::QCameraStateMachine(QCamera2HardwareInterface *ctrl) :
     api_queue(),
     evt_queue()
@@ -91,6 +112,15 @@
                    this);
 }
 
+/*===========================================================================
+ * FUNCTION   : ~QCameraStateMachine
+ *
+ * DESCRIPTION: desctructor of QCameraStateMachine. Will stop process thread.
+ *
+ * PARAMETERS : none
+ *
+ * RETURN     : none
+ *==========================================================================*/
 QCameraStateMachine::~QCameraStateMachine()
 {
     if (cmd_pid != 0) {
@@ -113,38 +143,93 @@
     sem_destroy(&cmd_sem);
 }
 
+/*===========================================================================
+ * FUNCTION   : procAPI
+ *
+ * DESCRIPTION: process incoming API request from framework layer.
+ *
+ * PARAMETERS :
+ *   @evt          : event to be processed
+ *   @api_payload  : API payload. Can be NULL if not needed.
+ *
+ * RETURN     : int32_t type of status
+ *              NO_ERROR  -- success
+ *              none-zero failure code
+ *==========================================================================*/
 int32_t QCameraStateMachine::procAPI(qcamera_sm_evt_enum_t evt,
                                      void *api_payload)
 {
     qcamera_sm_cmd_t *node =
         (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
-    if (NULL != node) {
-        memset(node, 0, sizeof(qcamera_sm_cmd_t));
-        node->cmd = QCAMERA_SM_CMD_TYPE_API;
-        node->evt = evt;
-        node->evt_payload = api_payload;
-        api_queue.enqueue((void *)node);
-        sem_post(&cmd_sem);
+    if (NULL == node) {
+        ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
+        return NO_MEMORY;
     }
-    return NO_ERROR;
+
+    memset(node, 0, sizeof(qcamera_sm_cmd_t));
+    node->cmd = QCAMERA_SM_CMD_TYPE_API;
+    node->evt = evt;
+    node->evt_payload = api_payload;
+    if (api_queue.enqueue((void *)node)) {
+        sem_post(&cmd_sem);
+        return NO_ERROR;
+    } else {
+        free(node);
+        return UNKNOWN_ERROR;
+    }
 }
 
+/*===========================================================================
+ * FUNCTION   : procEvt
+ *
+ * DESCRIPTION: process incoming envent from mm-camera-interface and
+ *              mm-jpeg-interface.
+ *
+ * PARAMETERS :
+ *   @evt          : event to be processed
+ *   @evt_payload  : event payload. Can be NULL if not needed.
+ *
+ * RETURN     : int32_t type of status
+ *              NO_ERROR  -- success
+ *              none-zero failure code
+ *==========================================================================*/
 int32_t QCameraStateMachine::procEvt(qcamera_sm_evt_enum_t evt,
                                      void *evt_payload)
 {
     qcamera_sm_cmd_t *node =
         (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
-    if (NULL != node) {
-        memset(node, 0, sizeof(qcamera_sm_cmd_t));
-        node->cmd = QCAMERA_SM_CMD_TYPE_EVT;
-        node->evt = evt;
-        node->evt_payload = evt_payload;
-        evt_queue.enqueue((void *)node);
-        sem_post(&cmd_sem);
+    if (NULL == node) {
+        ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
+        return NO_MEMORY;
     }
-    return NO_ERROR;
+
+    memset(node, 0, sizeof(qcamera_sm_cmd_t));
+    node->cmd = QCAMERA_SM_CMD_TYPE_EVT;
+    node->evt = evt;
+    node->evt_payload = evt_payload;
+    if (evt_queue.enqueue((void *)node)) {
+        sem_post(&cmd_sem);
+        return NO_ERROR;
+    } else {
+        free(node);
+        return UNKNOWN_ERROR;
+    }
 }
 
+/*===========================================================================
+ * FUNCTION   : stateMachine
+ *
+ * DESCRIPTION: finite state machine entry function. Depends on state,
+ *              incoming event will be handled differently.
+ *
+ * PARAMETERS :
+ *   @evt      : event to be processed
+ *   @payload  : event payload. Can be NULL if not needed.
+ *
+ * RETURN     : int32_t type of status
+ *              NO_ERROR  -- success
+ *              none-zero failure code
+ *==========================================================================*/
 int32_t QCameraStateMachine::stateMachine(qcamera_sm_evt_enum_t evt, void *payload)
 {
     int32_t rc = NO_ERROR;
@@ -177,6 +262,20 @@
     return rc;
 }
 
+/*===========================================================================
+ * FUNCTION   : procEvtPreviewStoppedState
+ *
+ * DESCRIPTION: finite state machine function to handle event in state of
+ *              QCAMERA_SM_STATE_PREVIEW_STOPPED.
+ *
+ * PARAMETERS :
+ *   @evt      : event to be processed
+ *   @payload  : event payload. Can be NULL if not needed.
+ *
+ * RETURN     : int32_t type of status
+ *              NO_ERROR  -- success
+ *              none-zero failure code
+ *==========================================================================*/
 int32_t QCameraStateMachine::procEvtPreviewStoppedState(qcamera_sm_evt_enum_t evt,
                                                         void *payload)
 {
@@ -239,7 +338,11 @@
         break;
     case QCAMERA_SM_EVT_SET_PARAMS:
         {
-            rc = m_parent->setParameters((char*)payload);
+            bool needRestart = false;
+            rc = m_parent->updateParameters((char*)payload, needRestart);
+            if (rc == NO_ERROR) {
+                rc = m_parent->commitParameterChanges();
+            }
             result.status = rc;
             result.request_api = evt;
             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
@@ -268,16 +371,17 @@
     case QCAMERA_SM_EVT_START_PREVIEW:
         {
             if (m_parent->mPreviewWindow == NULL) {
-                // preview is not set yet, move to previewReady state
+                // preview window is not set yet, move to previewReady state
                 m_state = QCAMERA_SM_STATE_PREVIEW_READY;
                 rc = NO_ERROR;
             } else {
                 rc = m_parent->preparePreview();
-                if (rc == 0) {
+                if (rc == NO_ERROR) {
                     rc = m_parent->startPreview();
-                    if (rc != 0) {
+                    if (rc != NO_ERROR) {
                         m_parent->unpreparePreview();
                     } else {
+                        // start preview success, move to previewing state
                         m_state = QCAMERA_SM_STATE_PREVIEWING;
                     }
                 }
@@ -371,6 +475,7 @@
         break;
     case QCAMERA_SM_EVT_EVT_NOTIFY:
     case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
+    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
     default:
         ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
         break;
@@ -379,6 +484,20 @@
     return rc;
 }
 
+/*===========================================================================
+ * FUNCTION   : procEvtPreviewReadyState
+ *
+ * DESCRIPTION: finite state machine function to handle event in state of
+ *              QCAMERA_SM_STATE_PREVIEW_READY.
+ *
+ * PARAMETERS :
+ *   @evt      : event to be processed
+ *   @payload  : event payload. Can be NULL if not needed.
+ *
+ * RETURN     : int32_t type of status
+ *              NO_ERROR  -- success
+ *              none-zero failure code
+ *==========================================================================*/
 int32_t QCameraStateMachine::procEvtPreviewReadyState(qcamera_sm_evt_enum_t evt,
                                                       void *payload)
 {
@@ -451,7 +570,11 @@
         break;
     case QCAMERA_SM_EVT_SET_PARAMS:
         {
-            rc = m_parent->setParameters((char*)payload);
+            bool needRestart = false;
+            rc = m_parent->updateParameters((char*)payload, needRestart);
+            if (rc == NO_ERROR) {
+                rc = m_parent->commitParameterChanges();
+            }
             result.status = rc;
             result.request_api = evt;
             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
@@ -585,6 +708,7 @@
         break;
     case QCAMERA_SM_EVT_EVT_NOTIFY:
     case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
+    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
     default:
         ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
         break;
@@ -593,6 +717,20 @@
     return rc;
 }
 
+/*===========================================================================
+ * FUNCTION   : procEvtPreviewingState
+ *
+ * DESCRIPTION: finite state machine function to handle event in state of
+ *              QCAMERA_SM_STATE_PREVIEWING.
+ *
+ * PARAMETERS :
+ *   @evt      : event to be processed
+ *   @payload  : event payload. Can be NULL if not needed.
+ *
+ * RETURN     : int32_t type of status
+ *              NO_ERROR  -- success
+ *              none-zero failure code
+ *==========================================================================*/
 int32_t QCameraStateMachine::procEvtPreviewingState(qcamera_sm_evt_enum_t evt,
                                                     void *payload)
 {
@@ -657,7 +795,21 @@
         break;
     case QCAMERA_SM_EVT_SET_PARAMS:
         {
-            rc = m_parent->setParameters((char*)payload);
+            bool needRestart = false;
+            rc = m_parent->updateParameters((char*)payload, needRestart);
+            if (rc == NO_ERROR) {
+                if (needRestart) {
+                    // need restart preview for parameters to take effect
+                    // stop preview
+                    m_parent->stopPreview();
+                    // commit parameter changes to server
+                    rc = m_parent->commitParameterChanges();
+                    // start preview again
+                    m_parent->startPreview();
+                } else {
+                    rc = m_parent->commitParameterChanges();
+                }
+            }
             result.status = rc;
             result.request_api = evt;
             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
@@ -834,6 +986,7 @@
         }
         break;
     case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
+    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
     default:
         ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
         break;
@@ -842,6 +995,20 @@
     return rc;
 }
 
+/*===========================================================================
+ * FUNCTION   : procEvtPicTakingState
+ *
+ * DESCRIPTION: finite state machine function to handle event in state of
+ *              QCAMERA_SM_STATE_PIC_TAKING.
+ *
+ * PARAMETERS :
+ *   @evt      : event to be processed
+ *   @payload  : event payload. Can be NULL if not needed.
+ *
+ * RETURN     : int32_t type of status
+ *              NO_ERROR  -- success
+ *              none-zero failure code
+ *==========================================================================*/
 int32_t QCameraStateMachine::procEvtPicTakingState(qcamera_sm_evt_enum_t evt,
                                                    void *payload)
 {
@@ -906,7 +1073,11 @@
         break;
     case QCAMERA_SM_EVT_SET_PARAMS:
         {
-            rc = m_parent->setParameters((char*)payload);
+            bool needRestart = false;
+            rc = m_parent->updateParameters((char*)payload, needRestart);
+            if (rc == NO_ERROR) {
+                rc = m_parent->commitParameterChanges();
+            }
             result.status = rc;
             result.request_api = evt;
             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
@@ -1076,6 +1247,20 @@
     return rc;
 }
 
+/*===========================================================================
+ * FUNCTION   : procEvtRecordingState
+ *
+ * DESCRIPTION: finite state machine function to handle event in state of
+ *              QCAMERA_SM_STATE_RECORDING.
+ *
+ * PARAMETERS :
+ *   @evt      : event to be processed
+ *   @payload  : event payload. Can be NULL if not needed.
+ *
+ * RETURN     : int32_t type of status
+ *              NO_ERROR  -- success
+ *              none-zero failure code
+ *==========================================================================*/
 int32_t QCameraStateMachine::procEvtRecordingState(qcamera_sm_evt_enum_t evt,
                                                    void *payload)
 {
@@ -1140,7 +1325,18 @@
         break;
     case QCAMERA_SM_EVT_SET_PARAMS:
         {
-            rc = m_parent->setParameters((char*)payload);
+            bool needRestart = false;
+            rc = m_parent->updateParameters((char*)payload, needRestart);
+            if (rc == NO_ERROR) {
+                if (needRestart) {
+                    // cannot set parameters that requires restart during recording
+                    ALOGE("%s: Cannot set parameters that requires restart during recording",
+                          __func__);
+                    rc = BAD_VALUE;
+                } else {
+                    rc = m_parent->commitParameterChanges();
+                }
+            }
             result.status = rc;
             result.request_api = evt;
             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
@@ -1309,6 +1505,7 @@
         }
         break;
     case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
+    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
     default:
         ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
         break;
@@ -1317,6 +1514,20 @@
     return rc;
 }
 
+/*===========================================================================
+ * FUNCTION   : procEvtVideoPicTakingState
+ *
+ * DESCRIPTION: finite state machine function to handle event in state of
+ *              QCAMERA_SM_STATE_VIDEO_PIC_TAKING.
+ *
+ * PARAMETERS :
+ *   @evt      : event to be processed
+ *   @payload  : event payload. Can be NULL if not needed.
+ *
+ * RETURN     : int32_t type of status
+ *              NO_ERROR  -- success
+ *              none-zero failure code
+ *==========================================================================*/
 int32_t QCameraStateMachine::procEvtVideoPicTakingState(qcamera_sm_evt_enum_t evt,
                                                         void *payload)
 {
@@ -1381,7 +1592,18 @@
         break;
     case QCAMERA_SM_EVT_SET_PARAMS:
         {
-            rc = m_parent->setParameters((char*)payload);
+            bool needRestart = false;
+            rc = m_parent->updateParameters((char*)payload, needRestart);
+            if (rc == NO_ERROR) {
+                if (needRestart) {
+                    // cannot set parameters that requires restart during recording
+                    ALOGE("%s: Cannot set parameters that requires restart during recording",
+                          __func__);
+                    rc = BAD_VALUE;
+                } else {
+                    rc = m_parent->commitParameterChanges();
+                }
+            }
             result.status = rc;
             result.request_api = evt;
             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
@@ -1558,6 +1780,20 @@
     return rc;
 }
 
+/*===========================================================================
+ * FUNCTION   : procEvtPreviewPicTakingState
+ *
+ * DESCRIPTION: finite state machine function to handle event in state of
+ *              QCAMERA_SM_STATE_PREVIEW_PIC_TAKING.
+ *
+ * PARAMETERS :
+ *   @evt      : event to be processed
+ *   @payload  : event payload. Can be NULL if not needed.
+ *
+ * RETURN     : int32_t type of status
+ *              NO_ERROR  -- success
+ *              none-zero failure code
+ *==========================================================================*/
 int32_t QCameraStateMachine::procEvtPreviewPicTakingState(qcamera_sm_evt_enum_t evt,
                                                           void *payload)
 {
@@ -1611,7 +1847,21 @@
         break;
     case QCAMERA_SM_EVT_SET_PARAMS:
         {
-            rc = m_parent->setParameters((char*)payload);
+            bool needRestart = false;
+            rc = m_parent->updateParameters((char*)payload, needRestart);
+            if (rc == NO_ERROR) {
+                if (needRestart) {
+                    // need restart preview for parameters to take effect
+                    // stop preview
+                    m_parent->stopPreview();
+                    // commit parameter changes to server
+                    rc = m_parent->commitParameterChanges();
+                    // start preview again
+                    m_parent->startPreview();
+                } else {
+                    rc = m_parent->commitParameterChanges();
+                }
+            }
             result.status = rc;
             result.request_api = evt;
             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
@@ -1803,4 +2053,27 @@
     return rc;
 }
 
+/*===========================================================================
+ * FUNCTION   : isPreviewRunning
+ *
+ * DESCRIPTION: check if preview is in process.
+ *
+ * PARAMETERS : None
+ *
+ * RETURN     : true -- preview running
+ *              false -- preview stopped
+ *==========================================================================*/
+bool QCameraStateMachine::isPreviewRunning()
+{
+    switch (m_state) {
+    case QCAMERA_SM_STATE_PREVIEWING:
+    case QCAMERA_SM_STATE_RECORDING:
+    case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
+    case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
+        return true;
+    default:
+        return false;
+    }
+}
+
 }; // namespace android