Support new APIs for media packet internal callback 32/313532/1 accepted/tizen/unified/20240701.191823 accepted/tizen/unified/dev/20240702.054034 accepted/tizen/unified/toolchain/20240812.133355 accepted/tizen/unified/x/20240702.031223 accepted/tizen/unified/x/asan/20240813.231835
authorJeongmo Yang <jm80.yang@samsung.com>
Wed, 24 Jan 2024 11:46:40 +0000 (20:46 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Thu, 27 Jun 2024 06:21:44 +0000 (15:21 +0900)
[Version] 1.1.0
[Issue Type] New feature

Change-Id: I3de89be07540892b1a955ad8e9c6e34d52e7fcce
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 1e5f675a3216b0bf4bd9f356bd78028430c94dd9..eef1ec62f813b964abdf18dda942e356310c79a2 100644 (file)
@@ -1693,6 +1693,19 @@ int legacy_camera_get_device_count(camera_h camera, int *device_count);
  */
 bool legacy_camera_is_supported_media_packet_preview_cb(camera_h camera);
 
+/**
+ * @brief Gets the media packet preview internal callback feature's supported state.
+ * @ingroup CAPI_MEDIA_CAMERA_CAPABILITY_MODULE
+ * @since_tizen 7.0
+ * @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 @c true if supported, otherwise @c false
+ * @exception #CAMERA_ERROR_NONE Successful
+ * @exception #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
+ * @exception #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ */
+bool legacy_camera_is_supported_media_packet_preview_internal_cb(camera_h camera);
+
 /**
  * @brief Gets the extra preview feature's supported state.
  * @ingroup CAPI_MEDIA_CAMERA_CAPABILITY_MODULE
@@ -4146,6 +4159,7 @@ int legacy_camera_attr_get_extra_preview_bitrate(camera_h camera, int stream_id,
 int legacy_camera_attr_set_extra_preview_gop_interval(camera_h camera, int stream_id, int interval);
 int legacy_camera_attr_get_extra_preview_gop_interval(camera_h camera, int stream_id, int *interval);
 int legacy_camera_request_codec_config(camera_h camera);
+int legacy_camera_set_preview_cb_flag(camera_h camera, bool enable, int flag);
 
 
 #define CAM_LOG_CRITICAL(format, args...) \
index fb2edf7bc354483cb390c30381b3c5c70144354e..4e60608858347be82bb14266a443df94e143b2b0 100644 (file)
@@ -1136,6 +1136,29 @@ bool legacy_camera_is_supported_media_packet_preview_cb(camera_h camera)
 }
 
 
+bool legacy_camera_is_supported_media_packet_preview_internal_cb(camera_h camera)
+{
+       int ret = MM_ERROR_NONE;
+       int supported = false;
+       camera_s *handle = (camera_s *)camera;
+
+       camera_return_val_if_fail(handle, false);
+
+       ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
+               MMCAM_SUPPORT_MEDIA_PACKET_PREVIEW_INTERNAL_CB, &supported,
+               NULL);
+       set_last_result(__convert_camera_error_code(__func__, ret));
+       if (ret != MM_ERROR_NONE) {
+               CAM_LOG_ERROR("MMCAM_SUPPORT_MEDIA_PACKET_PREVIEW_CB get failed");
+               return false;
+       }
+
+       CAM_LOG_INFO("support media packet preview internal callback[%d]", supported);
+
+       return supported;
+}
+
+
 bool legacy_camera_is_supported_extra_preview(camera_h camera)
 {
        int ret = MM_ERROR_NONE;
@@ -4658,6 +4681,21 @@ int legacy_camera_request_codec_config(camera_h camera)
 }
 
 
+int legacy_camera_set_preview_cb_flag(camera_h camera, bool enable, int flag)
+{
+       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],flag[0x%x]", enable, flag);
+
+       ret = mm_camcorder_set_video_stream_callback_flag(handle->mm_handle, (gboolean)enable, flag);
+
+       return __convert_camera_error_code(__func__, ret);
+}
+
+
 int legacy_camera_get_log_level(void)
 {
        return mm_camcorder_get_log_level();
index f3ad56a84e3e760792768b7a25158e640351d744..59686261b754d7069332af5ab6479fffa3e093b8 100644 (file)
@@ -209,20 +209,23 @@ typedef enum {
        MUSE_CAMERA_API_SUPPORT_EXTRA_PREVIEW,
        MUSE_CAMERA_API_SET_EXTRA_PREVIEW_DEVICE,
        MUSE_CAMERA_API_REQUEST_CODEC_CONFIG,
+       MUSE_CAMERA_API_SUPPORT_MEDIA_PACKET_PREVIEW_INTERNAL_CB,
+       MUSE_CAMERA_API_SET_MEDIA_PACKET_PREVIEW_INTERNAL_CB,  /* 175 */
+       MUSE_CAMERA_API_UNSET_MEDIA_PACKET_PREVIEW_INTERNAL_CB,
        MUSE_CAMERA_API_ATTR_SET_SATURATION,
-       MUSE_CAMERA_API_ATTR_GET_SATURATION, /* 175 */
+       MUSE_CAMERA_API_ATTR_GET_SATURATION,
        MUSE_CAMERA_API_ATTR_GET_SATURATION_RANGE,
-       MUSE_CAMERA_API_ATTR_SET_SHARPNESS,
+       MUSE_CAMERA_API_ATTR_SET_SHARPNESS, /* 180 */
        MUSE_CAMERA_API_ATTR_GET_SHARPNESS,
        MUSE_CAMERA_API_ATTR_GET_SHARPNESS_RANGE,
-       MUSE_CAMERA_API_ATTR_SET_GAIN, /* 180 */
+       MUSE_CAMERA_API_ATTR_SET_GAIN,
        MUSE_CAMERA_API_ATTR_GET_GAIN,
-       MUSE_CAMERA_API_ATTR_GET_GAIN_RANGE,
+       MUSE_CAMERA_API_ATTR_GET_GAIN_RANGE, /* 185 */
        MUSE_CAMERA_API_ATTR_GET_GAIN_STEP,
        MUSE_CAMERA_API_ATTR_SET_WHITEBALANCE_TEMPERATURE,
-       MUSE_CAMERA_API_ATTR_GET_WHITEBALANCE_TEMPERATURE, /* 185 */
+       MUSE_CAMERA_API_ATTR_GET_WHITEBALANCE_TEMPERATURE,
        MUSE_CAMERA_API_ATTR_GET_WHITEBALANCE_TEMPERATURE_RANGE,
-       MUSE_CAMERA_API_ATTR_GET_WHITEBALANCE_TEMPERATURE_STEP,
+       MUSE_CAMERA_API_ATTR_GET_WHITEBALANCE_TEMPERATURE_STEP, /* 190 */
        MUSE_CAMERA_API_FORCE_STOP, /* This is not used for client. */
        MUSE_CAMERA_API_MAX
 } muse_camera_api_e;
@@ -270,7 +273,8 @@ typedef enum {
        MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_PTZ_TYPE,
        MUSE_CAMERA_EVENT_TYPE_INTERRUPT_STARTED,
        MUSE_CAMERA_EVENT_TYPE_EXTRA_PREVIEW,
-       MUSE_CAMERA_EVENT_TYPE_NUM /* 30 */
+       MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW_INTERNAL, /* 30 */
+       MUSE_CAMERA_EVENT_TYPE_NUM
 } muse_camera_event_e;
 
 /**
index 218a3b7a56ecebed8d0a18aedb2a7d4f3e478929..7ec163f1218302d922f2b5c5c00a45902d0d2ffb 100644 (file)
@@ -30,12 +30,13 @@ extern "C" {
 #include <muse_camera.h>
 #include <legacy_camera_internal.h>
 
-#define PREVIEW_CB_TYPE_NONE            0x00000000
-#define PREVIEW_CB_TYPE_NORMAL          0x0000000F
-#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 PREVIEW_CB_TYPE_NONE                    0x00000000
+#define PREVIEW_CB_TYPE_NORMAL                  0x0000000F
+#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 PREVIEW_CB_TYPE_MEDIA_PACKET_INTERNAL   0x00F00000
 
 #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 efeae20c9958405656fc59e4a81ca24c27c5011d..0290cd769cafc34df9f21c8dab4745b4c810145d 100644 (file)
@@ -1271,6 +1271,12 @@ static void __camera_task_process_job(muse_camera_handle_s *muse_camera, muse_ca
        case MUSE_CAMERA_API_UNSET_MEDIA_PACKET_PREVIEW_CB:
                ret = __camera_dispatcher_unset_preview_cb_flag(muse_camera, PREVIEW_CB_TYPE_MEDIA_PACKET);
                break;
+       case MUSE_CAMERA_API_SET_MEDIA_PACKET_PREVIEW_INTERNAL_CB:
+               ret = __camera_dispatcher_set_preview_cb_flag(muse_camera, PREVIEW_CB_TYPE_MEDIA_PACKET_INTERNAL);
+               break;
+       case MUSE_CAMERA_API_UNSET_MEDIA_PACKET_PREVIEW_INTERNAL_CB:
+               ret = __camera_dispatcher_unset_preview_cb_flag(muse_camera, PREVIEW_CB_TYPE_MEDIA_PACKET_INTERNAL);
+               break;
        case MUSE_CAMERA_API_SET_MEDIA_BRIDGE:
                ret = __camera_dispatcher_set_preview_cb_flag(muse_camera, PREVIEW_CB_TYPE_MEDIA_BRIDGE);
                break;
@@ -1326,10 +1332,19 @@ static int __camera_dispatcher_set_preview_cb_flag(muse_camera_handle_s *muse_ca
        }
 
        if (ret == CAMERA_ERROR_NONE) {
-               if (!CHECK_PREVIEW_CB(muse_camera, PREVIEW_CB_TYPE_EXTRA) && flag == PREVIEW_CB_TYPE_EXTRA)
-                       legacy_camera_enable_extra_preview(muse_camera->camera_handle, true);
+               if (flag == PREVIEW_CB_TYPE_MEDIA_PACKET_INTERNAL) {
+                       ret = legacy_camera_set_preview_cb_flag(muse_camera->camera_handle,
+                               true, MM_CAMCORDER_VIDEO_STREAM_CALLBACK_FLAG_INTERNAL);
+               } else {
+                       ret = legacy_camera_set_preview_cb_flag(muse_camera->camera_handle,
+                               true, MM_CAMCORDER_VIDEO_STREAM_CALLBACK_FLAG_NORMAL);
 
-               SET_PREVIEW_CB_TYPE(muse_camera, flag);
+                       if (!CHECK_PREVIEW_CB(muse_camera, PREVIEW_CB_TYPE_EXTRA) && flag == PREVIEW_CB_TYPE_EXTRA)
+                               ret |= legacy_camera_enable_extra_preview(muse_camera->camera_handle, true);
+               }
+
+               if (ret == CAMERA_ERROR_NONE)
+                       SET_PREVIEW_CB_TYPE(muse_camera, flag);
        }
 
        return ret;
@@ -1349,28 +1364,45 @@ static int __camera_dispatcher_unset_preview_cb_flag(muse_camera_handle_s *muse_
 
        if (muse_camera->preview_cb_flag == PREVIEW_CB_TYPE_NONE) {
                CAM_LOG_INFO("nothing to do");
-               return ret;
+               return CAMERA_ERROR_NONE;
        }
 
-       CAM_LOG_INFO("current flag[0x%x] - unset[0x%x]",
+       CAM_LOG_INFO("current flag[0x%08x] - unset[0x%08x]",
                muse_camera->preview_cb_flag, flag);
 
        /* backup current 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) {
                CAM_LOG_INFO("disable extra preview");
+               ret = legacy_camera_enable_extra_preview(muse_camera->camera_handle, false);
+               if (ret != CAMERA_ERROR_NONE) {
+                       CAM_LOG_ERROR("disable extra preview failed[0x%x]", ret);
+                       return ret;
+               }
 
-               legacy_camera_enable_extra_preview(muse_camera->camera_handle, false);
                is_extra_preview_disabled = TRUE;
        }
 
        UNSET_PREVIEW_CB_TYPE(muse_camera, flag);
 
-       if (muse_camera->preview_cb_flag == PREVIEW_CB_TYPE_NONE) {
-               CAM_LOG_INFO("unset preview cb");
+       if (flag == PREVIEW_CB_TYPE_MEDIA_PACKET_INTERNAL) {
+               ret = legacy_camera_set_preview_cb_flag(muse_camera->camera_handle,
+                       false, MM_CAMCORDER_VIDEO_STREAM_CALLBACK_FLAG_INTERNAL);
+               if (ret != CAMERA_ERROR_NONE)
+                       CAM_LOG_ERROR("remove INTERNAL flag failed");
+       } else if (!CHECK_PREVIEW_CB(muse_camera, PREVIEW_CB_TYPE_NORMAL) &&
+               !CHECK_PREVIEW_CB(muse_camera, PREVIEW_CB_TYPE_EVAS) &&
+               !CHECK_PREVIEW_CB(muse_camera, PREVIEW_CB_TYPE_MEDIA_PACKET) &&
+               !CHECK_PREVIEW_CB(muse_camera, PREVIEW_CB_TYPE_MEDIA_BRIDGE) &&
+               !CHECK_PREVIEW_CB(muse_camera, PREVIEW_CB_TYPE_EXTRA)) {
+               ret = legacy_camera_set_preview_cb_flag(muse_camera->camera_handle,
+                       false, MM_CAMCORDER_VIDEO_STREAM_CALLBACK_FLAG_NORMAL);
+               if (ret != CAMERA_ERROR_NONE)
+                       CAM_LOG_ERROR("remove NORMAL flag failed");
+       }
 
+       if (muse_camera->preview_cb_flag == PREVIEW_CB_TYPE_NONE) {
                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);
@@ -1957,6 +1989,26 @@ int camera_dispatcher_is_supported_media_packet_preview_cb(muse_module_h module)
        return MUSE_CAMERA_ERROR_NONE;
 }
 
+int camera_dispatcher_is_supported_media_packet_preview_internal_cb(muse_module_h module)
+{
+       bool supported = false;
+       muse_camera_handle_s *muse_camera = NULL;
+       muse_camera_api_e api = MUSE_CAMERA_API_SUPPORT_MEDIA_PACKET_PREVIEW_INTERNAL_CB;
+       muse_camera_api_class_e class = MUSE_CAMERA_API_CLASS_IMMEDIATE;
+
+       muse_camera = (muse_camera_handle_s *)muse_server_ipc_get_handle(module);
+
+       CAM_LOG_INFO("handle[%p]", muse_camera);
+
+       supported = legacy_camera_is_supported_media_packet_preview_internal_cb(muse_camera->camera_handle);
+
+       CAM_LOG_INFO("supported[%d]", supported);
+
+       muse_camera_msg_return(api, class, (int)supported, module);
+
+       return MUSE_CAMERA_ERROR_NONE;
+}
+
 int camera_dispatcher_is_supported_extra_preview(muse_module_h module)
 {
        bool supported = false;
@@ -2656,6 +2708,34 @@ int camera_dispatcher_unset_media_packet_preview_cb(muse_module_h module)
        return MUSE_CAMERA_ERROR_NONE;
 }
 
+int camera_dispatcher_set_media_packet_preview_internal_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_MEDIA_PACKET_PREVIEW_INTERNAL_CB,
+               MUSE_CAMERA_API_CLASS_IMMEDIATE, 0);
+
+       return MUSE_CAMERA_ERROR_NONE;
+}
+
+int camera_dispatcher_unset_media_packet_preview_internal_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_MEDIA_PACKET_PREVIEW_INTERNAL_CB,
+               MUSE_CAMERA_API_CLASS_IMMEDIATE, 0);
+
+       return MUSE_CAMERA_ERROR_NONE;
+}
+
 int camera_dispatcher_set_state_changed_cb(muse_module_h module)
 {
        int ret = CAMERA_ERROR_NONE;
@@ -6408,6 +6488,9 @@ int (*dispatcher[MUSE_CAMERA_API_MAX]) (muse_module_h module) = {
        camera_dispatcher_is_supported_extra_preview, /* MUSE_CAMERA_API_SUPPORT_EXTRA_PREVIEW, */
        camera_dispatcher_set_extra_preview_device, /* MUSE_CAMERA_API_SET_EXTRA_PREVIEW_DEVICE */
        camera_dispatcher_request_codec_config, /* MUSE_CAMERA_API_REQUEST_CODEC_CONFIG */
+       camera_dispatcher_is_supported_media_packet_preview_internal_cb, /* MUSE_CAMERA_API_SUPPORT_MEDIA_PACKET_PREVIEW_INTERNAL_CB */
+       camera_dispatcher_set_media_packet_preview_internal_cb, /* MUSE_CAMERA_API_SET_MEDIA_PACKET_PREVIEW_CB */
+       camera_dispatcher_unset_media_packet_preview_internal_cb, /* MUSE_CAMERA_API_UNSET_MEDIA_PACKET_PREVIEW_CB */
        camera_dispatcher_attr_set_saturation, /* MUSE_CAMERA_API_ATTR_SET_SATURATION */
        camera_dispatcher_attr_get_saturation, /* MUSE_CAMERA_API_ATTR_GET_SATURATION */
        camera_dispatcher_attr_get_saturation_range, /* MUSE_CAMERA_API_ATTR_GET_SATURATION_RANGE */
index 4106349c321625fb0dac1401a84e35c8b4613cbb..d03c2d8e910dc04a747e1ff5a35f072c22efd11b 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mmsvc-camera
 Summary:    A Camera module for muse server
-Version:    1.0.1
+Version:    1.1.0
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0