From: Jeongmo Yang Date: Tue, 11 May 2021 12:20:33 +0000 (+0900) Subject: Add new attribute for focus level X-Git-Tag: accepted/tizen/unified/20210602.122542~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=25d1097db3eb9aadc5cda8e20fed51c528bf6ea8;p=platform%2Fcore%2Fmultimedia%2Flibmm-camcorder.git Add new attribute for focus level [Version] 0.10.233 [Issue Type] New feature Change-Id: I6860e9a6ec8a5e764c5ac71c547559c26aee69a0 Signed-off-by: Jeongmo Yang --- diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index 5a33f3f..3e5b763 100755 --- a/packaging/libmm-camcorder.spec +++ b/packaging/libmm-camcorder.spec @@ -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 diff --git a/src/include/mm_camcorder.h b/src/include/mm_camcorder.h index f2026f8..1347c86 100644 --- a/src/include/mm_camcorder.h +++ b/src/include/mm_camcorder.h @@ -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); diff --git a/src/include/mm_camcorder_attribute.h b/src/include/mm_camcorder_attribute.h index 9721e92..1eb33f0 100644 --- a/src/include/mm_camcorder_attribute.h +++ b/src/include/mm_camcorder_attribute.h @@ -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); diff --git a/src/include/mm_camcorder_internal.h b/src/include/mm_camcorder_internal.h index cd957d8..c1d17f2 100644 --- a/src/include/mm_camcorder_internal.h +++ b/src/include/mm_camcorder_internal.h @@ -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 diff --git a/src/include/mm_camcorder_platform.h b/src/include/mm_camcorder_platform.h index 88c9e82..62b5939 100644 --- a/src/include/mm_camcorder_platform.h +++ b/src/include/mm_camcorder_platform.h @@ -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 /*======================================================================================= diff --git a/src/mm_camcorder.c b/src/mm_camcorder.c index f37e200..eb74509 100644 --- a/src/mm_camcorder.c +++ b/src/mm_camcorder.c @@ -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(); diff --git a/src/mm_camcorder_attribute.c b/src/mm_camcorder_attribute.c index 60b40ec..9390fe2 100644 --- a/src/mm_camcorder_attribute.c +++ b/src/mm_camcorder_attribute.c @@ -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; } diff --git a/src/mm_camcorder_configure.c b/src/mm_camcorder_configure.c index c93509a..caf7d74 100644 --- a/src/mm_camcorder_configure.c +++ b/src/mm_camcorder_configure.c @@ -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} }, diff --git a/src/mm_camcorder_internal.c b/src/mm_camcorder_internal.c index 3920cbc..cef260c 100644 --- a/src/mm_camcorder_internal.c +++ b/src/mm_camcorder_internal.c @@ -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 | diff --git a/src/mm_camcorder_platform.c b/src/mm_camcorder_platform.c index d01a7db..a480548 100644 --- a/src/mm_camcorder_platform.c +++ b/src/mm_camcorder_platform.c @@ -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, } }; diff --git a/src/mm_camcorder_stillshot.c b/src/mm_camcorder_stillshot.c index 6c48752..40fa132 100644 --- a/src/mm_camcorder_stillshot.c +++ b/src/mm_camcorder_stillshot.c @@ -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"); }