Support extra preview related APIs 53/257553/7
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 27 Apr 2021 12:52:25 +0000 (21:52 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Tue, 11 May 2021 09:06:03 +0000 (18:06 +0900)
[Version] 0.3.42
[Issue Type] New feature

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

index 0111f64..ce9a34f 100644 (file)
@@ -3859,6 +3859,7 @@ void legacy_camera_lock(camera_h camera, bool is_lock);
 void legacy_camera_send_signal(camera_h camera);
 int legacy_camera_get_platform_privilege(camera_h camera, const char **platform_privilege);
 int legacy_camera_get_log_level(void);
+int legacy_camera_enable_extra_preview(camera_h camera, bool enable);
 
 
 #define CAM_LOG_CRITICAL(format, args...) \
index 2933c13..11197d5 100644 (file)
@@ -4227,6 +4227,23 @@ int legacy_camera_attr_get_flash_brightness_range(camera_h camera, int *min, int
 }
 
 
+int legacy_camera_enable_extra_preview(camera_h camera, bool enable)
+{
+       int ret = MM_ERROR_NONE;
+       camera_s *handle = (camera_s *)camera;
+
+       camera_return_val_if_fail(handle, CAMERA_ERROR_INVALID_PARAMETER);
+
+       CAM_LOG_INFO("enable[%d]", enable);
+
+       ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
+               MMCAM_EXTRA_PREVIEW_ENABLE, enable,
+               NULL);
+
+       return __convert_camera_error_code(__func__, ret);
+}
+
+
 int legacy_camera_get_log_level(void)
 {
        return mm_camcorder_get_log_level();
index 81e6807..a9922aa 100644 (file)
@@ -195,6 +195,8 @@ typedef enum {
        MUSE_CAMERA_API_ATTR_GET_FLASH_BRIGHTNESS_RANGE,
        MUSE_CAMERA_API_SET_MEDIA_BRIDGE,
        MUSE_CAMERA_API_UNSET_MEDIA_BRIDGE,
+       MUSE_CAMERA_API_SET_EXTRA_PREVIEW_CB,      /* 160 */
+       MUSE_CAMERA_API_UNSET_EXTRA_PREVIEW_CB,
        MUSE_CAMERA_API_MAX
 } muse_camera_api_e;
 
@@ -240,7 +242,8 @@ typedef enum {
        MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_STREAM_ROTATION,
        MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_PTZ_TYPE,
        MUSE_CAMERA_EVENT_TYPE_INTERRUPT_STARTED,
-       MUSE_CAMERA_EVENT_TYPE_NUM /* 29 */
+       MUSE_CAMERA_EVENT_TYPE_EXTRA_PREVIEW,
+       MUSE_CAMERA_EVENT_TYPE_NUM /* 30 */
 } muse_camera_event_e;
 
 /**
index be995b5..1c501ec 100644 (file)
@@ -35,6 +35,7 @@ extern "C" {
 #define PREVIEW_CB_TYPE_EVAS            0x000000F0
 #define PREVIEW_CB_TYPE_MEDIA_PACKET    0x00000F00
 #define PREVIEW_CB_TYPE_MEDIA_BRIDGE    0x0000F000
+#define PREVIEW_CB_TYPE_EXTRA           0x000F0000
 
 #define CHECK_PREVIEW_CB(muse_camera, cb_type) ((muse_camera)->preview_cb_flag & cb_type)
 #define SET_PREVIEW_CB_TYPE(muse_camera, cb_type) ((muse_camera)->preview_cb_flag |= cb_type)
index ec6ab11..3e51d95 100644 (file)
@@ -1202,6 +1202,12 @@ static void __camera_task_process_job(muse_camera_handle_s *muse_camera, muse_ca
        case MUSE_CAMERA_API_UNSET_MEDIA_BRIDGE:
                ret = __camera_dispatcher_unset_preview_cb_flag(muse_camera, PREVIEW_CB_TYPE_MEDIA_BRIDGE);
                break;
+       case MUSE_CAMERA_API_SET_EXTRA_PREVIEW_CB:
+               ret = __camera_dispatcher_set_preview_cb_flag(muse_camera, PREVIEW_CB_TYPE_EXTRA);
+               break;
+       case MUSE_CAMERA_API_UNSET_EXTRA_PREVIEW_CB:
+               ret = __camera_dispatcher_unset_preview_cb_flag(muse_camera, PREVIEW_CB_TYPE_EXTRA);
+               break;
        default:
                CAM_LOG_ERROR("unhandled task - api[%d]", job->api);
                goto _PROCESS_DONE;
@@ -1232,15 +1238,29 @@ static int __camera_dispatcher_set_preview_cb_flag(muse_camera_handle_s *muse_ca
                muse_camera->preview_cb_flag, flag);
 
        if (muse_camera->preview_cb_flag == PREVIEW_CB_TYPE_NONE) {
-               ret = legacy_camera_set_preview_cb(muse_camera->camera_handle, \
+               g_mutex_unlock(&muse_camera->preview_cb_lock);
+
+               ret = legacy_camera_set_preview_cb(muse_camera->camera_handle,
                        (camera_preview_cb)_camera_dispatcher_preview_cb,
                        (void *)muse_camera->module);
+
+               g_mutex_lock(&muse_camera->preview_cb_lock);
+
                if (ret != CAMERA_ERROR_NONE)
                        CAM_LOG_ERROR("set preview cb failed[0x%x]", ret);
        }
 
-       if (ret == CAMERA_ERROR_NONE)
+       if (ret == CAMERA_ERROR_NONE) {
+               if (!CHECK_PREVIEW_CB(muse_camera, PREVIEW_CB_TYPE_EXTRA) && flag == PREVIEW_CB_TYPE_EXTRA) {
+                       g_mutex_unlock(&muse_camera->preview_cb_lock);
+
+                       legacy_camera_enable_extra_preview(muse_camera->camera_handle, true);
+
+                       g_mutex_lock(&muse_camera->preview_cb_lock);
+               }
+
                SET_PREVIEW_CB_TYPE(muse_camera, flag);
+       }
 
        g_mutex_unlock(&muse_camera->preview_cb_lock);
 
@@ -1251,32 +1271,55 @@ static int __camera_dispatcher_set_preview_cb_flag(muse_camera_handle_s *muse_ca
 static int __camera_dispatcher_unset_preview_cb_flag(muse_camera_handle_s *muse_camera, guint flag)
 {
        int ret = CAMERA_ERROR_NONE;
-       guint current_flag = 0x0;
+       guint old_flag = 0x0;
+       gboolean is_extra_preview_disabled = FALSE;
 
        camera_return_val_if_fail(muse_camera, CAMERA_ERROR_INVALID_PARAMETER);
 
+       if (muse_camera->preview_cb_flag == PREVIEW_CB_TYPE_NONE) {
+               CAM_LOG_INFO("nothing to do");
+               return ret;
+       }
+
        g_mutex_lock(&muse_camera->preview_cb_lock);
 
        CAM_LOG_INFO("current flag[0x%x] - unset[0x%x]",
                muse_camera->preview_cb_flag, flag);
 
        /* backup current flag */
-       current_flag = muse_camera->preview_cb_flag;
+       old_flag = muse_camera->preview_cb_flag;
+
+       /* disable extra preview */
+       if (CHECK_PREVIEW_CB(muse_camera, PREVIEW_CB_TYPE_EXTRA) && flag == PREVIEW_CB_TYPE_EXTRA) {
+               g_mutex_unlock(&muse_camera->preview_cb_lock);
+
+               CAM_LOG_INFO("disable extra preview");
+
+               legacy_camera_enable_extra_preview(muse_camera->camera_handle, false);
+               is_extra_preview_disabled = TRUE;
+
+               g_mutex_lock(&muse_camera->preview_cb_lock);
+       }
 
        UNSET_PREVIEW_CB_TYPE(muse_camera, flag);
 
        if (muse_camera->preview_cb_flag == PREVIEW_CB_TYPE_NONE) {
                g_mutex_unlock(&muse_camera->preview_cb_lock);
 
-               ret = legacy_camera_unset_preview_cb(muse_camera->camera_handle);
-
-               g_mutex_lock(&muse_camera->preview_cb_lock);
+               CAM_LOG_INFO("unset preview cb");
 
+               ret = legacy_camera_unset_preview_cb(muse_camera->camera_handle);
                if (ret != CAMERA_ERROR_NONE) {
                        CAM_LOG_ERROR("unset preview cb failed[0x%x]", ret);
-                       /* restore flag */
-                       muse_camera->preview_cb_flag = current_flag;
+
+                       /* restore flag and extra preview */
+                       muse_camera->preview_cb_flag = old_flag;
+
+                       if (is_extra_preview_disabled)
+                               legacy_camera_enable_extra_preview(muse_camera->camera_handle, true);
                }
+
+               g_mutex_lock(&muse_camera->preview_cb_lock);
        }
 
        g_mutex_unlock(&muse_camera->preview_cb_lock);
@@ -5277,6 +5320,36 @@ int camera_dispatcher_unset_media_bridge(muse_module_h module)
 }
 
 
+int camera_dispatcher_set_extra_preview_cb(muse_module_h module)
+{
+       muse_camera_handle_s *muse_camera = NULL;
+
+       muse_camera = (muse_camera_handle_s *)muse_server_ipc_get_handle(module);
+
+       CAM_LOG_INFO("handle[%p]", muse_camera);
+
+       _camera_task_add_job(muse_camera, MUSE_CAMERA_API_SET_EXTRA_PREVIEW_CB,
+               MUSE_CAMERA_API_CLASS_IMMEDIATE, 0);
+
+       return MUSE_CAMERA_ERROR_NONE;
+}
+
+
+int camera_dispatcher_unset_extra_preview_cb(muse_module_h module)
+{
+       muse_camera_handle_s *muse_camera = NULL;
+
+       muse_camera = (muse_camera_handle_s *)muse_server_ipc_get_handle(module);
+
+       CAM_LOG_INFO("handle[%p]", muse_camera);
+
+       _camera_task_add_job(muse_camera, MUSE_CAMERA_API_UNSET_EXTRA_PREVIEW_CB,
+               MUSE_CAMERA_API_CLASS_IMMEDIATE, 0);
+
+       return MUSE_CAMERA_ERROR_NONE;
+}
+
+
 static tbm_bo __camera_normal_buffer_bo_new(MMCamcorderVideoStreamDataType *stream, tbm_bufmgr bufmgr)
 {
        int data_size[3] = {0, 0, 0};
@@ -5621,7 +5694,9 @@ int (*dispatcher[MUSE_CAMERA_API_MAX]) (muse_module_h module) = {
        camera_dispatcher_attr_get_flash_brightness, /* MUSE_CAMERA_API_ATTR_GET_FLASH_BRIGHTNESS */
        camera_dispatcher_attr_get_flash_brightness_range, /* MUSE_CAMERA_API_ATTR_GET_FLASH_BRIGHTNESS_RANGE */
        camera_dispatcher_set_media_bridge, /* MUSE_CAMERA_API_SET_MEDIA_BRIDGE */
-       camera_dispatcher_unset_media_bridge /* MUSE_CAMERA_API_UNSET_MEDIA_BRIDGE */
+       camera_dispatcher_unset_media_bridge, /* MUSE_CAMERA_API_UNSET_MEDIA_BRIDGE */
+       camera_dispatcher_set_extra_preview_cb, /* MUSE_CAMERA_API_SET_EXTRA_PREVIEW_CB, */
+       camera_dispatcher_unset_extra_preview_cb /* MUSE_CAMERA_API_UNSET_EXTRA_PREVIEW_CB, */
 };
 
 
index bc145a2..bd51599 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mmsvc-camera
 Summary:    A Camera module for muse server
-Version:    0.3.41
+Version:    0.3.42
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0