From e34fe56f0bee7242cffbb05408686ae5b0c6533d Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Fri, 10 Jan 2025 16:16:57 +0900 Subject: [PATCH] Add new attribute: MMCAM_CAMERA_SWITCH_DEVICE - It's for switching device command support. [Version] 0.10.299 [Issue Type] New feature Change-Id: Ifaa3ffd1981e121d696e9ae7b6145eeadd5ee1ae Signed-off-by: Jeongmo Yang --- packaging/libmm-camcorder.spec | 2 +- src/include/mm_camcorder.h | 5 +++ src/include/mm_camcorder_attribute.h | 2 ++ src/include/mm_camcorder_platform.h | 2 +- src/mm_camcorder_attribute.c | 48 ++++++++++++++++++++++++++++ src/mm_camcorder_configure.c | 1 + src/mm_camcorder_platform.c | 9 ++++++ 7 files changed, 67 insertions(+), 2 deletions(-) diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index 3306176..f1fd1be 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.298 +Version: 0.10.299 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_camcorder.h b/src/include/mm_camcorder.h index 751938d..41bdc2f 100644 --- a/src/include/mm_camcorder.h +++ b/src/include/mm_camcorder.h @@ -1370,6 +1370,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 3de628f..b129dda 100644 --- a/src/include/mm_camcorder_attribute.h +++ b/src/include/mm_camcorder_attribute.h @@ -200,6 +200,7 @@ typedef enum { MM_CAM_REQUEST_CODEC_CONFIG, MM_CAM_SUPPORT_MEDIA_PACKET_PREVIEW_INTERNAL_CB, MM_CAM_VIDEO_STREAM_CALLBACK_FLAG, + MM_CAM_CAMERA_SWITCH_DEVICE, MM_CAM_ATTRIBUTE_NUM } MMCamcorderAttrsID; @@ -405,6 +406,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 ad4f7ea..4ff21cc 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 47 +#define CAMINFO_CONVERT_NUM 48 /*======================================================================================= diff --git a/src/mm_camcorder_attribute.c b/src/mm_camcorder_attribute.c index 760c1f9..f94b103 100644 --- a/src/mm_camcorder_attribute.c +++ b/src/mm_camcorder_attribute.c @@ -1743,6 +1743,17 @@ _mmcamcorder_alloc_attribute(MMHandleType handle) {.int_min = 0}, {.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, } }; @@ -4915,6 +4926,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 99bff35..777ebe3 100644 --- a/src/mm_camcorder_configure.c +++ b/src/mm_camcorder_configure.c @@ -671,6 +671,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} }, }; /* [AudioInput] matching table */ diff --git a/src/mm_camcorder_platform.c b/src/mm_camcorder_platform.c index a480548..4fdc59b 100644 --- a/src/mm_camcorder_platform.c +++ b/src/mm_camcorder_platform.c @@ -670,6 +670,15 @@ static _MMCamcorderInfoConverting g_caminfo_convert[CAMINFO_CONVERT_NUM] = { "FocusLevel", 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, } }; -- 2.34.1