Support user buffer fd 23/200223/4 accepted/tizen/unified/20190415.132547 submit/tizen/20190412.070842
authorJeongmo Yang <jm80.yang@samsung.com>
Wed, 20 Feb 2019 08:37:12 +0000 (17:37 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Fri, 22 Feb 2019 02:11:05 +0000 (11:11 +0900)
[Version] 0.3.23
[Profile] Common
[Issue Type] Update

Change-Id: I0ce2cd72dd353d99f5bfea682be592c967cddf63
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
legacy/include/legacy_camera.h
legacy/include/legacy_camera_internal.h
legacy/src/legacy_camera.c
muse/include/muse_camera_internal.h
muse/src/muse_camera_dispatcher.c
packaging/mmsvc-camera.spec

index 42753dbffc096abdb472882abafa0f265b21a7c5..db3a3b95d2ac8d04241a1f60412583542f0fcc9d 100644 (file)
@@ -1158,6 +1158,20 @@ int legacy_camera_start_face_detection(camera_h camera, camera_face_detected_cb
  */
 int legacy_camera_stop_face_detection(camera_h camera);
 
+/**
+ * @brief Sets the buffer fd allocated by user to use as preview buffer.
+ * @param[in] camera The handle to the camera
+ * @param[in] fds The buffer fd
+ * @param[in] number The number of buffer
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #CAMERA_ERROR_NONE Successful
+ * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CAMERA_ERROR_INVALID_STATE Invalid state
+ * @retval #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
+ * @pre The camera state must be set to #CAMERA_STATE_CREATED.
+ */
+int legacy_camera_set_user_buffer(camera_h camera, int *fds, int number);
+
 /**
  * @}
  */
@@ -3541,6 +3555,17 @@ int legacy_camera_attr_is_enabled_auto_contrast(camera_h camera, bool *enabled);
  */
 bool legacy_camera_attr_is_supported_auto_contrast(camera_h camera);
 
+/**
+ * @brief Gets state of support of user buffer.
+ * @ingroup CAPI_MEDIA_CAMERA_CAPABILITY_MODULE
+ * @remarks The specific error code can be obtained using the get_last_result() method. Error codes are described in Exception section.
+ * @param[in] camera The handle to the camera
+ * @return true on supported, otherwise false
+ * @exception #CAMERA_ERROR_NONE Successful
+ * @exception #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ */
+bool legacy_camera_attr_is_supported_user_buffer(camera_h camera);
+
 /**
  * @}
  */
index 8a41219a43929c66a0a92564e176fe3507b331fe..4cf9c2a7d349bb5258c6f580cd97e0831e42028e 100644 (file)
@@ -28,7 +28,7 @@ extern "C" {
   */
 
 /**
- * @brief Set pid of client for sound focus API.
+ * @brief Set pid of client.
  * @ingroup CAPI_MEDIA_CAMERA_MUSED_MODULE
  * @param[in] camera The handle to the camera
  * @param[in] pid The pid of client
index e69679098e3c06091ae622d71b93e45d36937b7a..799776478400171d6dcd0cde8a4652bc8aae339f 100644 (file)
@@ -4326,6 +4326,30 @@ bool legacy_camera_attr_is_supported_auto_contrast(camera_h camera)
 }
 
 
+bool legacy_camera_attr_is_supported_user_buffer(camera_h camera)
+{
+       if (camera == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return false;
+       }
+
+       int is_supported;
+       int ret = MM_ERROR_NONE;
+       camera_s *handle = (camera_s *)camera;
+
+       ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
+               MMCAM_SUPPORT_USER_BUFFER, &is_supported,
+               NULL);
+       set_last_result(__convert_camera_error_code(__func__, ret));
+       if (ret != MM_ERROR_NONE) {
+               LOGE("MMCAM_SUPPORT_USER_BUFFER get attr failed");
+               return false;
+       }
+
+       return (bool)is_supported;
+}
+
+
 int legacy_camera_attr_disable_shutter_sound(camera_h camera, bool disable)
 {
        if (camera == NULL) {
@@ -4808,3 +4832,31 @@ void legacy_camera_send_signal(camera_h camera)
 
        return;
 }
+
+
+int legacy_camera_set_user_buffer(camera_h camera, int *fds, int number)
+{
+       int ret = MM_ERROR_NONE;
+       camera_s *handle = NULL;
+
+       if (camera == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       if (!fds || number < 1) {
+               LOGE("invalid fds %p or number %d", fds, number);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       handle = (camera_s *)camera;
+
+       LOGD("number - %d", number);
+
+       ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
+               MMCAM_USER_BUFFER_FD, (void *)fds, number,
+               NULL);
+
+       return __convert_camera_error_code(__func__, ret);
+}
+
index 656938f27768d9760b36a3768185bf90282292d8..484d140a60a496d8836e897e0e01308840820d8f 100644 (file)
@@ -72,6 +72,8 @@ typedef struct {
        gboolean task_run;
        muse_module_h module;
        gboolean is_shutting_down;
+       int fds[MUSE_NUM_FD];
+       int fd_number;
 } muse_camera_handle_s;
 
 
index d8e3ebf292501b987cf12b2c46f0ed5a93b5bfba..bcc42969771682d306b72593b633a191efbd5279 100644 (file)
@@ -1397,6 +1397,7 @@ static void _camera_task_add_job(muse_camera_handle_s *muse_camera, int api, int
 
 static void __camera_task_process_job(muse_camera_handle_s *muse_camera, muse_camera_task_job_s *job)
 {
+       int i = 0;
        int ret = CAMERA_ERROR_NONE;
 
        if (!muse_camera) {
@@ -1409,6 +1410,15 @@ static void __camera_task_process_job(muse_camera_handle_s *muse_camera, muse_ca
        switch (job->api) {
        case MUSE_CAMERA_API_STOP_PREVIEW:
                ret = legacy_camera_stop_preview(muse_camera->camera_handle);
+
+               if (ret == CAMERA_ERROR_NONE && muse_camera->fd_number > 0) {
+                       for (i = 0 ; i < muse_camera->fd_number ; i++) {
+                               LOGD("close user buffer fd[%d] %d", i, muse_camera->fds[i]);
+                               close(muse_camera->fds[i]);
+                               muse_camera->fds[i] = -1;
+                       }
+                       muse_camera->fd_number = 0;
+               }
                break;
        case MUSE_CAMERA_API_START_CAPTURE:
                ret = legacy_camera_start_capture(muse_camera->camera_handle,
@@ -1595,9 +1605,12 @@ static void _camera_dispatcher_release_resource(muse_module_h module)
 int camera_dispatcher_create(muse_module_h module)
 {
        int ret = CAMERA_ERROR_NONE;
-       int device_type;
+       int device_type = 0;
+       int preview_format = CAMERA_PIXEL_FORMAT_INVALID;
+       int user_buffer_supported = 0;
        int pid = 0;
        bool camera_feature_supported = false;
+       char *send_msg = NULL;
        void *gdbus_connection = NULL;
        muse_camera_handle_s *muse_camera = NULL;
        muse_camera_api_e api = MUSE_CAMERA_API_CREATE;
@@ -1683,6 +1696,14 @@ int camera_dispatcher_create(muse_module_h module)
                goto _CREATE_ERROR;
        }
 
+       ret = legacy_camera_get_preview_format(muse_camera->camera_handle, &preview_format);
+       if (ret != CAMERA_ERROR_NONE) {
+               LOGE("legacy_camera_get_preview_format failed : 0x%x", ret);
+               goto _CREATE_ERROR;
+       }
+
+       user_buffer_supported = legacy_camera_attr_is_supported_user_buffer(muse_camera->camera_handle);
+
        g_mutex_init(&muse_camera->list_lock);
        g_cond_init(&muse_camera->list_cond);
        g_mutex_init(&muse_camera->preview_cb_lock);
@@ -1690,10 +1711,19 @@ int camera_dispatcher_create(muse_module_h module)
        muse_camera->preview_cb_flag = 0;
        muse_camera->module = module;
 
-       LOGD("handle : %p", muse_camera);
+       LOGD("handle : %p, user buffer %d", muse_camera, user_buffer_supported);
 
        muse_server_ipc_set_handle(module, (intptr_t)muse_camera);
-       muse_camera_msg_return1(api, class, ret, module, MUSE_CAMERA_GET_TYPE_POINTER, -1, "handle", 0, muse_camera);
+
+       send_msg = muse_core_msg_new(api,
+               MUSE_TYPE_INT, PARAM_API_CLASS, class,
+               MUSE_TYPE_INT, PARAM_RET, ret,
+               MUSE_TYPE_INT, "preview_format", preview_format,
+               MUSE_TYPE_INT, "user_buffer_supported", user_buffer_supported,
+               MUSE_TYPE_POINTER, "handle", muse_camera,
+               0);
+
+       __camera_dispatcher_send_msg(module, send_msg, NULL);
 
        return MUSE_CAMERA_ERROR_NONE;
 
@@ -1773,8 +1803,11 @@ int camera_dispatcher_destroy(muse_module_h module)
 
 int camera_dispatcher_start_preview(muse_module_h module)
 {
+       int i = 0;
        int ret = CAMERA_ERROR_NONE;
        int client_fd = -1;
+       int fds[MUSE_NUM_FD] = {-1, -1, -1, -1};
+       int fd_number = 0;
        muse_camera_handle_s *muse_camera = NULL;
        muse_camera_api_e api = MUSE_CAMERA_API_START_PREVIEW;
        muse_camera_api_class_e class = MUSE_CAMERA_API_CLASS_IMMEDIATE;
@@ -1799,10 +1832,38 @@ int camera_dispatcher_start_preview(muse_module_h module)
                return MUSE_CAMERA_ERROR_INVALID;
        }
 
-       ret = legacy_camera_start_preview(muse_camera->camera_handle);
+       /* get user buffer fd */
+       if (muse_server_ipc_get_fds(module, fds, &fd_number) == MM_ERROR_NONE) {
+               /* set user buffer */
+               if (fd_number > 0) {
+                       ret = legacy_camera_set_user_buffer(muse_camera->camera_handle, fds, fd_number);
+                       LOGD("fd number %d, ret 0x%x", fd_number, ret);
+               }
+       }
+
+       ret |= legacy_camera_start_preview(muse_camera->camera_handle);
 
        muse_camera_msg_return(api, class, ret, module);
 
+       /* fd handling */
+       if (fd_number > 0) {
+               if (ret == CAMERA_ERROR_NONE) {
+                       /* set fd and number */
+                       for (i = 0 ; i < fd_number ; i++)
+                               muse_camera->fds[i] = fds[i];
+
+                       muse_camera->fd_number = fd_number;
+               } else {
+                       /* close exported fd */
+                       for (i = 0 ; i < fd_number ; i++) {
+                               LOGE("[PREVIEW FAILED] close exported fds[%d] %d", i, fds[i]);
+                               close(fds[i]);
+                       }
+
+                       muse_camera->fd_number = 0;
+               }
+       }
+
        return MUSE_CAMERA_ERROR_NONE;
 }
 
index da45e8e2c88f3827871aa275bf61086d1e65ed8a..7f845b2cfffd6f4d3dc00a9d01b018b840d32976 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mmsvc-camera
 Summary:    A Camera module for muse server
-Version:    0.3.22
+Version:    0.3.23
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0