From: Jeongmo Yang Date: Fri, 10 Jan 2025 07:16:57 +0000 (+0900) Subject: Add new attribute: MMCAM_CAMERA_SWITCH_DEVICE X-Git-Tag: accepted/tizen/unified/20250610.081759^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Ftizen;p=platform%2Fcore%2Fmultimedia%2Flibmm-camcorder.git Add new attribute: MMCAM_CAMERA_SWITCH_DEVICE - It's for switching device command support. [Version] 1.4.0 [Issue Type] New feature Change-Id: Ifaa3ffd1981e121d696e9ae7b6145eeadd5ee1ae Signed-off-by: Jeongmo Yang --- diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index 425736c..efc8702 100644 --- a/packaging/libmm-camcorder.spec +++ b/packaging/libmm-camcorder.spec @@ -1,6 +1,6 @@ Name: libmm-camcorder Summary: Camera and recorder library -Version: 1.3.4 +Version: 1.4.0 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_camcorder.h b/src/include/mm_camcorder.h index 1144228..a2a7f38 100644 --- a/src/include/mm_camcorder.h +++ b/src/include/mm_camcorder.h @@ -1390,6 +1390,11 @@ extern "C" { */ #define MMCAM_VIDEO_STREAM_CALLBACK_FLAG "video-stream-callback-flag" +/** + * Switch device + */ +#define MMCAM_CAMERA_SWITCH_DEVICE "camera-switch-device" + /*======================================================================================= diff --git a/src/include/mm_camcorder_attribute.h b/src/include/mm_camcorder_attribute.h index 9a1a0d2..6c2fb3f 100644 --- a/src/include/mm_camcorder_attribute.h +++ b/src/include/mm_camcorder_attribute.h @@ -200,7 +200,8 @@ typedef enum { MM_CAM_REQUEST_CODEC_CONFIG, MM_CAM_SUPPORT_MEDIA_PACKET_PREVIEW_INTERNAL_CB, MM_CAM_VIDEO_STREAM_CALLBACK_FLAG, - MM_CAM_FILTER_WB_TEMPERATURE, /* 145 */ + MM_CAM_CAMERA_SWITCH_DEVICE, /* 145 */ + MM_CAM_FILTER_WB_TEMPERATURE, MM_CAM_FILTER_WB_TEMPERATURE_STEP, MM_CAM_CAMERA_GAIN, MM_CAM_CAMERA_GAIN_STEP, @@ -409,6 +410,7 @@ bool _mmcamcorder_commit_tag(MMHandleType handle, int attr_idx, const MMAttrsVal bool _mmcamcorder_commit_audio_replay_gain(MMHandleType handle, int attr_idx, const MMAttrsValue *value); bool _mmcamcorder_commit_extra_preview(MMHandleType handle, int attr_idx, const MMAttrsValue *value); bool _mmcamcorder_commit_request_codec_config(MMHandleType handle, int attr_idx, const MMAttrsValue *value); +bool _mmcamcorder_commit_camera_switch_device(MMHandleType handle, int attr_idx, const MMAttrsValue *value); /** diff --git a/src/include/mm_camcorder_platform.h b/src/include/mm_camcorder_platform.h index 89e07ea..fc5fe4c 100644 --- a/src/include/mm_camcorder_platform.h +++ b/src/include/mm_camcorder_platform.h @@ -134,7 +134,7 @@ extern "C" { #define _MMCAMCORDER_SENSOR_ENUM_NONE -255 /* camera information related */ -#define CAMINFO_CONVERT_NUM 49 +#define CAMINFO_CONVERT_NUM 50 /*======================================================================================= diff --git a/src/mm_camcorder_attribute.c b/src/mm_camcorder_attribute.c index 49866cb..639a833 100644 --- a/src/mm_camcorder_attribute.c +++ b/src/mm_camcorder_attribute.c @@ -1744,6 +1744,17 @@ _mmcamcorder_alloc_attribute(MMHandleType handle) {.int_max = _MMCAMCORDER_MAX_INT}, NULL, }, + { + MM_CAM_CAMERA_SWITCH_DEVICE, + "camera-switch-device", + MM_ATTRS_TYPE_INT, + MM_ATTRS_FLAG_RW, + {(void*)0}, + MM_ATTRS_VALID_TYPE_INT_ARRAY, + {0}, + {0}, + _mmcamcorder_commit_camera_switch_device, + }, { MM_CAM_FILTER_WB_TEMPERATURE, "filter-wb-temperature", @@ -5021,6 +5032,43 @@ bool _mmcamcorder_commit_request_codec_config(MMHandleType handle, int attr_idx, } +bool _mmcamcorder_commit_camera_switch_device(MMHandleType handle, int attr_idx, const MMAttrsValue *value) +{ + int device = 0; + 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); + mmf_return_val_if_fail(sc, TRUE); + + current_state = _mmcamcorder_get_state(handle); + + if (hcamcorder->type != MM_CAMCORDER_MODE_VIDEO_CAPTURE || + current_state != MM_CAMCORDER_STATE_PREPARE || + !GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) { + MMCAM_LOG_ERROR("invalid condition[type:%d,state:%d]", + hcamcorder->type, current_state); + return FALSE; + } + + device = value->value.i_val; + + MMCAM_LOG_INFO("switch device[%d]", device); + + control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); + if (!gst_camera_control_switch_device(control, device)) { + MMCAM_LOG_ERROR("switch device[%d] failed", device); + return FALSE; + } + + return TRUE; +} + + bool _mmcamcorder_set_attribute_to_camsensor(MMHandleType handle) { mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); diff --git a/src/mm_camcorder_configure.c b/src/mm_camcorder_configure.c index 08cbbcc..d60e5a4 100644 --- a/src/mm_camcorder_configure.c +++ b/src/mm_camcorder_configure.c @@ -674,6 +674,7 @@ int _mmcamcorder_conf_init(MMHandleType handle, int type, camera_conf *configure { "SupportUserBuffer", CONFIGURE_VALUE_INT, {.value_int = 0} }, { "MeasurePreviewFPS", CONFIGURE_VALUE_INT, {.value_int = 0} }, { "DefaultEncodedPreviewBitrate", CONFIGURE_VALUE_INT, {.value_int = DEFAULT_ENCODED_PREVIEW_BITRATE} }, + { "SwitchDevice", CONFIGURE_VALUE_INT_ARRAY, {NULL} }, { "UpdateCapsByStreamRotation", CONFIGURE_VALUE_INT, {.value_int = 0} }, }; diff --git a/src/mm_camcorder_platform.c b/src/mm_camcorder_platform.c index 97541c0..3e22aa4 100644 --- a/src/mm_camcorder_platform.c +++ b/src/mm_camcorder_platform.c @@ -672,6 +672,15 @@ static _MMCamcorderInfoConverting g_caminfo_convert[CAMINFO_CONVERT_NUM] = { MM_CAMCONVERT_TYPE_INT_RANGE, NULL, }, + { + CONFIGURE_TYPE_MAIN, + CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT, + MM_CAM_CAMERA_SWITCH_DEVICE, + MM_CAMCORDER_ATTR_NONE, + "SwitchDevice", + MM_CAMCONVERT_TYPE_INT_ARRAY, + NULL, + }, { CONFIGURE_TYPE_CTRL, CONFIGURE_CATEGORY_CTRL_EFFECT,