Add new attribute for focus level 62/258162/3
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 11 May 2021 12:20:33 +0000 (21:20 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Wed, 12 May 2021 05:45:56 +0000 (14:45 +0900)
[Version] 0.10.233
[Issue Type] New feature

Change-Id: I6860e9a6ec8a5e764c5ac71c547559c26aee69a0
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
packaging/libmm-camcorder.spec
src/include/mm_camcorder.h
src/include/mm_camcorder_attribute.h
src/include/mm_camcorder_internal.h
src/include/mm_camcorder_platform.h
src/mm_camcorder.c
src/mm_camcorder_attribute.c
src/mm_camcorder_configure.c
src/mm_camcorder_internal.c
src/mm_camcorder_platform.c
src/mm_camcorder_stillshot.c

index 5a33f3f..3e5b763 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       libmm-camcorder
 Summary:    Camera and recorder library
-Version:    0.10.232
+Version:    0.10.233
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index f2026f8..1347c86 100644 (file)
@@ -768,6 +768,11 @@ extern "C" {
 #define MMCAM_CAMERA_FOCUS_MODE                 "camera-focus-mode"
 
 /**
+ * Focus level
+ */
+#define MMCAM_CAMERA_FOCUS_LEVEL                "camera-focus-level"
+
+/**
  * AF Scan range
  * @see                MMCamcorderAutoFocusType
  */
@@ -3444,6 +3449,9 @@ int mm_camcorder_check_codec_fileformat_compatibility(const char *codec_type, in
 /* external storage state management */
 int mm_camcorder_manage_external_storage_state(MMHandleType camcorder, int storage_state);
 
+/* get focus level */
+int mm_camcorder_get_focus_level(MMHandleType camcorder, int *level);
+
 /* get log level */
 int mm_camcorder_get_log_level(void);
 
index 9721e92..1eb33f0 100644 (file)
@@ -195,6 +195,7 @@ typedef enum {
        MM_CAM_VIDEOSRC_ELEMENT_NAME,
        MM_CAM_AUDIOSRC_ELEMENT_NAME,
        MM_CAM_EXTRA_PREVIEW_ENABLE,
+       MM_CAM_CAMERA_FOCUS_LEVEL,                      /* 140 */
        MM_CAM_ATTRIBUTE_NUM
 } MMCamcorderAttrsID;
 
@@ -365,6 +366,7 @@ bool _mmcamcorder_commit_camera_ptz_type(MMHandleType handle, int attr_idx, cons
 bool _mmcamcorder_commit_camera_pan(MMHandleType handle, int attr_idx, const MMAttrsValue *value);
 bool _mmcamcorder_commit_camera_tilt(MMHandleType handle, int attr_idx, const MMAttrsValue *value);
 bool _mmcamcorder_commit_camera_focus_mode(MMHandleType handle, int attr_idx, const MMAttrsValue *value);
+bool _mmcamcorder_commit_camera_focus_level(MMHandleType handle, int attr_idx, const MMAttrsValue *value);
 bool _mmcamcorder_commit_camera_af_scan_range(MMHandleType handle, int attr_idx, const MMAttrsValue *value);
 bool _mmcamcorder_commit_camera_af_touch_area(MMHandleType handle, int attr_idx, const MMAttrsValue *value);
 bool _mmcamcorder_commit_camera_capture_mode(MMHandleType handle, int attr_idx, const MMAttrsValue *value);
index cd957d8..c1d17f2 100644 (file)
@@ -1326,6 +1326,9 @@ void _mmcamcorder_emit_signal(MMHandleType handle, const char *object_name,
 /* external storage state management */
 int _mmcamcorder_manage_external_storage_state(MMHandleType handle, int storage_state);
 
+/* get focus level */
+int _mmcamcorder_get_focus_level(MMHandleType handle, int *level);
+
 #ifdef __cplusplus
 }
 #endif
index 88c9e82..62b5939 100644 (file)
@@ -144,7 +144,7 @@ extern "C" {
 #define _MMCAMCORDER_SENSOR_ENUM_NONE  -255
 
 /* camera information related */
-#define CAMINFO_CONVERT_NUM            46
+#define CAMINFO_CONVERT_NUM            47
 
 
 /*=======================================================================================
index f37e200..eb74509 100644 (file)
@@ -470,6 +470,13 @@ int mm_camcorder_manage_external_storage_state(MMHandleType camcorder, int stora
        return _mmcamcorder_manage_external_storage_state(camcorder, storage_state);
 }
 
+int mm_camcorder_get_focus_level(MMHandleType camcorder, int *level)
+{
+       mmf_return_val_if_fail((void *)camcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
+
+       return _mmcamcorder_get_focus_level(camcorder, level);
+}
+
 int mm_camcorder_get_log_level(void)
 {
        return _mmcamcorder_get_log_level();
index 60b40ec..9390fe2 100644 (file)
@@ -1689,6 +1689,17 @@ _mmcamcorder_alloc_attribute(MMHandleType handle)
                        {.int_min = 0},
                        {.int_max = 1},
                        _mmcamcorder_commit_extra_preview,
+               },
+               {
+                       MM_CAM_CAMERA_FOCUS_LEVEL,
+                       "camera-focus-level",
+                       MM_ATTRS_TYPE_INT,
+                       MM_ATTRS_FLAG_RW,
+                       {(void*)0},
+                       MM_ATTRS_VALID_TYPE_INT_RANGE,
+                       {.int_min = 0},
+                       {.int_max = -1},
+                       _mmcamcorder_commit_camera_focus_level,
                }
        };
 
@@ -2917,6 +2928,51 @@ bool _mmcamcorder_commit_camera_focus_mode(MMHandleType handle, int attr_idx, co
 }
 
 
+bool _mmcamcorder_commit_camera_focus_level(MMHandleType handle, int attr_idx, const MMAttrsValue *value)
+{
+       int current_state = MM_CAMCORDER_STATE_NONE;
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+       _MMCamcorderSubContext *sc = NULL;
+       GstCameraControl *control = NULL;
+
+       mmf_return_val_if_fail(hcamcorder && value, FALSE);
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+       if (!sc)
+               return TRUE;
+
+       MMCAM_LOG_INFO("Focus level[%d]", value->value.i_val);
+
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state < MM_CAMCORDER_STATE_READY) {
+               MMCAM_LOG_INFO("Focus level will be set later.(state=%d)", current_state);
+               return TRUE;
+       } else if (current_state == MM_CAMCORDER_STATE_CAPTURING) {
+               MMCAM_LOG_ERROR("Can not set while CAPTURING");
+               hcamcorder->error_code = MM_ERROR_CAMCORDER_INVALID_STATE;
+               return FALSE;
+       }
+
+       if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
+               MMCAM_LOG_ERROR("Can't cast Video source into camera control.");
+               return FALSE;
+       }
+
+       control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
+       if (control == NULL) {
+               MMCAM_LOG_ERROR("cast CAMERA_CONTROL failed");
+               return FALSE;
+       }
+
+       if (!gst_camera_control_set_focus_level(control, value->value.i_val)) {
+               MMCAM_LOG_ERROR("set focus level[%d[ failed", value->value.i_val);
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+
 bool _mmcamcorder_commit_camera_af_scan_range(MMHandleType handle, int attr_idx, const MMAttrsValue *value)
 {
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
@@ -4774,6 +4830,8 @@ bool _mmcamcorder_commit_extra_preview(MMHandleType handle, int attr_idx, const
 
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "extra-preview", value->value.i_val);
 
+       MMCAM_LOG_INFO("done");
+
        return TRUE;
 }
 
index c93509a..caf7d74 100644 (file)
@@ -825,6 +825,7 @@ int _mmcamcorder_conf_init(MMHandleType handle, int type, camera_conf *configure
                { "DigitalZoom",          CONFIGURE_VALUE_INT_RANGE, {NULL} },
                { "OpticalZoom",          CONFIGURE_VALUE_INT_RANGE, {NULL} },
                { "FocusMode",            CONFIGURE_VALUE_INT_ARRAY, {NULL} },
+               { "FocusLevel",           CONFIGURE_VALUE_INT_RANGE, {NULL} },
                { "AFType",               CONFIGURE_VALUE_INT_ARRAY, {NULL} },
                { "AEType",               CONFIGURE_VALUE_INT_ARRAY, {NULL} },
                { "ExposureValue",        CONFIGURE_VALUE_INT_RANGE, {NULL} },
index 3920cbc..cef260c 100644 (file)
@@ -2283,6 +2283,39 @@ int _mmcamcorder_stop_focusing(MMHandleType handle)
        }
 }
 
+int _mmcamcorder_get_focus_level(MMHandleType handle, int *level)
+{
+       GstCameraControl *control = NULL;
+       _MMCamcorderSubContext *sc = NULL;
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+
+       mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+       mmf_return_val_if_fail(level, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
+       mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+       if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
+               MMCAM_LOG_ERROR("Can't cast Video source into camera control.");
+               return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
+       }
+
+       control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
+       if (!control) {
+               MMCAM_LOG_ERROR("cast CAMERA_CONTROL failed");
+               return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
+       }
+
+       if (!gst_camera_control_get_focus_level(control, level)) {
+               MMCAM_LOG_ERROR("get focus level failed");
+               return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
+       }
+
+       MMCAM_LOG_INFO("focus level[%d]", *level);
+
+       return MM_ERROR_NONE;
+}
+
 
 /*-----------------------------------------------
 |        CAMCORDER INTERNAL LOCAL              |
index d01a7db..a480548 100644 (file)
@@ -661,6 +661,15 @@ static _MMCamcorderInfoConverting  g_caminfo_convert[CAMINFO_CONVERT_NUM] = {
                "StrobeBrightness",
                MM_CAMCONVERT_TYPE_INT_RANGE,
                NULL,
+       },
+       {
+               CONFIGURE_TYPE_CTRL,
+               CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
+               MM_CAM_CAMERA_FOCUS_LEVEL,
+               MM_CAMCORDER_ATTR_NONE,
+               "FocusLevel",
+               MM_CAMCONVERT_TYPE_INT_RANGE,
+               NULL,
        }
 };
 
index 6c48752..40fa132 100644 (file)
@@ -721,6 +721,11 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle)
                                if (_mmcamcorder_check_supported_attribute(handle, MM_CAM_CAMERA_FOCUS_MODE)) {
                                        mm_attrs_set_modified(attrs, MM_CAM_CAMERA_FOCUS_MODE);
                                        mm_attrs_commit(attrs, MM_CAM_CAMERA_FOCUS_MODE);
+
+                                       if (focus_mode == MM_CAMCORDER_FOCUS_MODE_MANUAL) {
+                                               mm_attrs_set_modified(attrs, MM_CAM_CAMERA_FOCUS_LEVEL);
+                                               mm_attrs_commit(attrs, MM_CAM_CAMERA_FOCUS_LEVEL);
+                                       }
                                } else {
                                        MMCAM_LOG_INFO("focus mode is not supported");
                                }