From: Jeongmo Yang Date: Thu, 8 Sep 2022 08:39:20 +0000 (+0900) Subject: Support new extra preview mode X-Git-Tag: accepted/tizen/unified/20220920.110650^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=faee8872fa8780dfde42dee7a28272cd0605d142;hp=6c2d46b4bca72b7b2a56f692361d7b2b1274d1fb;p=platform%2Fcore%2Fmultimedia%2Flibmm-camcorder.git Support new extra preview mode - The defined extra preview mode : MM_CAMCORDER_EXTRA_PREVIEW_MODE_CAMERA_CONTROL : MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_SRCPAD -> Changed from MM_CAMCORDER_EXTRA_PREVIEW_MODE_VIDEO_PAD : MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_ELEMENT -> New - Minor change : Add sub function to get element and element name. : Make some functions as static. [Version] 0.10.270 [Issue Type] New feature Change-Id: If1d2188aae227ee32437cd2409c2ee2226143dec Signed-off-by: Jeongmo Yang --- diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index 6e08b7b..76b7b96 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.269 +Version: 0.10.270 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_camcorder.h b/src/include/mm_camcorder.h index 7b48044..be7b87e 100644 --- a/src/include/mm_camcorder.h +++ b/src/include/mm_camcorder.h @@ -1412,7 +1412,8 @@ typedef enum { */ typedef enum { MM_CAMCORDER_EXTRA_PREVIEW_MODE_CAMERA_CONTROL = 0, /**< Extra preview through camera control interface of camerasrc plugin */ - MM_CAMCORDER_EXTRA_PREVIEW_MODE_VIDEO_PAD /**< Extra preview through video source pad in camerasrc plugin */ + MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_SRCPAD, /**< Extra preview through additional source pad in camerasrc plugin */ + MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_ELEMENT /**< Extra preview through additional element */ } MMCamcorderExtraPreviewMode; @@ -3482,6 +3483,7 @@ int mm_camcorder_get_focus_level(MMHandleType camcorder, int *level); int mm_camcorder_get_log_level(void); /* extra preview */ +int mm_camcorder_set_extra_preview_device_type(MMHandleType camcorder, int stream_id, int device_type); int mm_camcorder_set_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int pixel_format, int width, int height, int fps); int mm_camcorder_get_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int *pixel_format, int *width, int *height, int *fps); int mm_camcorder_set_extra_preview_bitrate(MMHandleType camcorder, int stream_id, int bitrate); diff --git a/src/include/mm_camcorder_configure.h b/src/include/mm_camcorder_configure.h index 165b3fe..a5fc93a 100644 --- a/src/include/mm_camcorder_configure.h +++ b/src/include/mm_camcorder_configure.h @@ -397,6 +397,7 @@ int _mmcamcorder_conf_get_default_value_int(MMHandleType handle, int type, int c int _mmcamcorder_conf_get_default_value_string(MMHandleType handle, int type, int category, const char *name, const char **value); int _mmcamcorder_conf_get_default_element(MMHandleType handle, int type, int category, const char *name, type_element **element); int _mmcamcorder_conf_get_category_size(MMHandleType handle, int type, int category, int *size); +void _mmcamcorder_conf_get_element_and_name(MMHandleType handle, int category, const char *name, type_element **element, const char **element_name); #ifdef __cplusplus } diff --git a/src/include/mm_camcorder_internal.h b/src/include/mm_camcorder_internal.h index c51ef04..3c2dfd9 100644 --- a/src/include/mm_camcorder_internal.h +++ b/src/include/mm_camcorder_internal.h @@ -548,6 +548,7 @@ typedef enum { _MMCAMCORDER_VIDEOSRC_CAP_SINK, /* Pipeline element of extra preview */ + _MMCAMCORDER_VIDEOSRC_EXT_SRC, _MMCAMCORDER_VIDEOSRC_EXT_FILT, _MMCAMCORDER_VIDEOSRC_EXT_SINK, @@ -701,7 +702,9 @@ typedef struct { */ typedef struct { gboolean is_supported; + gboolean is_enabled; MMCamcorderExtraPreviewMode mode; + int camera_id[MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM]; _MMCamcorderExtraPreviewFormat format[MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM]; } _MMCamcorderExtraPreview; diff --git a/src/include/mm_camcorder_stillshot.h b/src/include/mm_camcorder_stillshot.h index 443f815..50c71aa 100644 --- a/src/include/mm_camcorder_stillshot.h +++ b/src/include/mm_camcorder_stillshot.h @@ -90,43 +90,18 @@ typedef struct { /*======================================================================================= | GLOBAL FUNCTION PROTOTYPES | ========================================================================================*/ -int _mmcamcorder_prepare_capture_mode_camera_control(MMHandleType handle); -int _mmcamcorder_prepare_capture_mode_encodebin(MMHandleType handle); -int _mmcamcorder_prepare_capture_mode_image_pad(MMHandleType handle); - -int _mmcamcorder_unprepare_capture_mode_encodebin(MMHandleType handle); - -/** - * This function destroy image pipeline. - * - * @param[in] handle Handle of camcorder context. - * @return void - * @remarks - * @see _mmcamcorder_destroy_pipeline() - * - */ -void _mmcamcorder_destroy_video_capture_pipeline(MMHandleType handle); +int _mmcamcorder_initialize_capture_mode(MMHandleType handle); int _mmcamcorder_video_capture_command(MMHandleType handle, int command); +void _mmcamcorder_destroy_video_capture_pipeline(MMHandleType handle); -/* Function for capture */ -int __mmcamcorder_set_exif_basic_info(MMHandleType handle, int image_width, int image_height); -int __mmcamcorder_update_exif_info(MMHandleType handle, void *imagedata, int imgln); -void __mmcamcorder_init_stillshot_info(MMHandleType handle); -void __mmcamcorder_get_capture_data_from_buffer(MMCamcorderCaptureDataType *capture_data, int pixtype, GstSample *sample); -void __mmcamcorder_release_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, int tag_enable, int provide_exif); -int __mmcamcorder_capture_save_exifinfo(MMHandleType handle, MMCamcorderCaptureDataType *original, MMCamcorderCaptureDataType *thumbnail, int provide_exif); -int __mmcamcorder_set_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, MMCamcorderCaptureDataType *thumbnail, int provide_exif); -gboolean __mmcamcorder_handoff_callback_capture(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data); -gboolean __mmcamcorder_handoff_callback_extra_preview(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data); - -/* extra preview */ -int _mmcamcorder_initialize_extra_preview(MMHandleType handle); -int _mmcamcorder_set_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int pixel_format, int width, int height, int fps); -int _mmcamcorder_get_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int *pixel_format, int *width, int *height, int *fps); -int _mmcamcorder_set_extra_preview_bitrate(MMHandleType camcorder, int stream_id, int bitrate); -int _mmcamcorder_get_extra_preview_bitrate(MMHandleType camcorder, int stream_id, int *bitrate); -int _mmcamcorder_set_extra_preview_gop_interval(MMHandleType camcorder, int stream_id, int interval); -int _mmcamcorder_get_extra_preview_gop_interval(MMHandleType camcorder, int stream_id, int *interval); +int _mmcamcorder_initialize_extra_preview_mode(MMHandleType handle); +int _mmcamcorder_set_extra_preview_device_type(MMHandleType handle, int stream_id, int device_type); +int _mmcamcorder_set_extra_preview_stream_format(MMHandleType handle, int stream_id, int pixel_format, int width, int height, int fps); +int _mmcamcorder_get_extra_preview_stream_format(MMHandleType handle, int stream_id, int *pixel_format, int *width, int *height, int *fps); +int _mmcamcorder_set_extra_preview_bitrate(MMHandleType handle, int stream_id, int bitrate); +int _mmcamcorder_get_extra_preview_bitrate(MMHandleType handle, int stream_id, int *bitrate); +int _mmcamcorder_set_extra_preview_gop_interval(MMHandleType handle, int stream_id, int interval); +int _mmcamcorder_get_extra_preview_gop_interval(MMHandleType handle, int stream_id, int *interval); #ifdef __cplusplus } diff --git a/src/include/mm_camcorder_util.h b/src/include/mm_camcorder_util.h index cfa5fb5..5cdd5f6 100644 --- a/src/include/mm_camcorder_util.h +++ b/src/include/mm_camcorder_util.h @@ -345,6 +345,7 @@ int _mmcamcorder_get_file_system_type(const gchar *path, int *file_system_type); void *_mmcamcorder_util_task_thread_func(void *data); /* device */ +int _mmcamcorder_get_camera_id(int device_type, int *camera_id); int _mmcamcorder_get_device_led_brightness(GDBusConnection *conn, int *brightness); /* sound play via dbus*/ diff --git a/src/mm_camcorder.c b/src/mm_camcorder.c index 9c2b190..a4c046a 100644 --- a/src/mm_camcorder.c +++ b/src/mm_camcorder.c @@ -482,6 +482,11 @@ int mm_camcorder_get_log_level(void) return _mmcamcorder_get_log_level(); } +int mm_camcorder_set_extra_preview_device_type(MMHandleType camcorder, int stream_id, int device_type) +{ + return _mmcamcorder_set_extra_preview_device_type(camcorder, stream_id, device_type); +} + int mm_camcorder_set_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int pixel_format, int width, int height, int fps) { return _mmcamcorder_set_extra_preview_stream_format(camcorder, stream_id, pixel_format, width, height, fps); diff --git a/src/mm_camcorder_attribute.c b/src/mm_camcorder_attribute.c index 1e282d7..f2c9599 100644 --- a/src/mm_camcorder_attribute.c +++ b/src/mm_camcorder_attribute.c @@ -4820,6 +4820,8 @@ bool _mmcamcorder_commit_extra_preview(MMHandleType handle, int attr_idx, const MMCAM_LOG_INFO("Enable extra preview(%d)", value->value.i_val); + hcamcorder->extra_preview.is_enabled = (gboolean)value->value.i_val; + current_state = _mmcamcorder_get_state(handle); if (current_state < MM_CAMCORDER_STATE_READY) { MMCAM_LOG_INFO("will be set when preview is started"); diff --git a/src/mm_camcorder_configure.c b/src/mm_camcorder_configure.c index 2492109..3737d04 100644 --- a/src/mm_camcorder_configure.c +++ b/src/mm_camcorder_configure.c @@ -2090,6 +2090,28 @@ int _mmcamcorder_conf_get_category_size(MMHandleType handle, int type, int categ return TRUE; } +void _mmcamcorder_conf_get_element_and_name(MMHandleType handle, int category, const char *name, type_element **element, const char **element_name) +{ + type_element *_element = NULL; + mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); + + if (!hcamcorder) { + MMCAM_LOG_ERROR("NULL handle"); + return; + } + + _mmcamcorder_conf_get_element(handle, hcamcorder->conf_main, + category, name, &_element); + + if (element) + *element = _element; + + if (element_name) { + _mmcamcorder_conf_get_value_element_name(_element, element_name); + MMCAM_LOG_INFO("[%s] -> [%s]", name, *element_name); + } +} + void _mmcamcorder_conf_print_info(MMHandleType handle, camera_conf** configure_info) { int i, j, k, type, category_type; diff --git a/src/mm_camcorder_gstcommon.c b/src/mm_camcorder_gstcommon.c index b6deab8..05384d3 100644 --- a/src/mm_camcorder_gstcommon.c +++ b/src/mm_camcorder_gstcommon.c @@ -550,7 +550,7 @@ int _mmcamcorder_create_preview_elements(MMHandleType handle) mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); _MMCamcorderSubContext *sc = NULL; - type_element *VideosrcElement = NULL; + type_element *videosrc_element = NULL; type_int_array *input_index = NULL; mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED); @@ -620,12 +620,9 @@ int _mmcamcorder_create_preview_elements(MMHandleType handle) /* Get fourcc from picture format */ sc->fourcc = _mmcamcorder_get_fourcc(sc->info_image->preview_format, codectype, hcamcorder->use_zero_copy_format); - /* Get videosrc element and its name from configure */ - _mmcamcorder_conf_get_element(handle, hcamcorder->conf_main, - CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT, - "VideosrcElement", - &VideosrcElement); - _mmcamcorder_conf_get_value_element_name(VideosrcElement, &videosrc_name); + _mmcamcorder_conf_get_element_and_name((MMHandleType)hcamcorder, + CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT, "VideosrcElement", + &videosrc_element, &videosrc_name); /** * Create child element @@ -665,7 +662,7 @@ int _mmcamcorder_create_preview_elements(MMHandleType handle) MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "high-speed-fps", fps); /* Set basic information of videosrc element */ - _mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, VideosrcElement); + _mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, videosrc_element); /* Set video device index */ if (hcamcorder->is_network) { @@ -887,7 +884,7 @@ int _mmcamcorder_create_audiosrc_bin(MMHandleType handle) mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); _MMCamcorderSubContext *sc = NULL; _MMCamcorderGstElement *last_element = NULL; - type_element *AudiosrcElement = NULL; + type_element *audiosrc_element = NULL; mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED); @@ -944,11 +941,9 @@ int _mmcamcorder_create_audiosrc_bin(MMHandleType handle) goto pipeline_creation_error; } - _mmcamcorder_conf_get_element(handle, hcamcorder->conf_main, - CONFIGURE_CATEGORY_MAIN_AUDIO_INPUT, - cat_name, - &AudiosrcElement); - _mmcamcorder_conf_get_value_element_name(AudiosrcElement, &audiosrc_name); + _mmcamcorder_conf_get_element_and_name((MMHandleType)hcamcorder, + CONFIGURE_CATEGORY_MAIN_AUDIO_INPUT, cat_name, + &audiosrc_element, &audiosrc_name); free(cat_name); cat_name = NULL; @@ -961,7 +956,7 @@ int _mmcamcorder_create_audiosrc_bin(MMHandleType handle) _mmcamcorder_set_sound_stream_info(sc->encode_element[_MMCAMCORDER_AUDIOSRC_SRC].gst, stream_type, stream_index); /* set audiosrc properties in ini configuration */ - _mmcamcorder_conf_set_value_element_property(sc->encode_element[_MMCAMCORDER_AUDIOSRC_SRC].gst, AudiosrcElement); + _mmcamcorder_conf_set_value_element_property(sc->encode_element[_MMCAMCORDER_AUDIOSRC_SRC].gst, audiosrc_element); /* set block size */ _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_main, @@ -1749,6 +1744,20 @@ int _mmcamcorder_create_preview_pipeline(MMHandleType handle) gst_object_unref(bus); bus = NULL; + /* capture mode */ + err = _mmcamcorder_initialize_capture_mode(handle); + if (err != MM_ERROR_NONE) { + MMCAM_LOG_ERROR("initialize capture mode[%d] failed", hcamcorder->capture_mode); + goto pipeline_creation_error; + } + + /* extra preview mode */ + err = _mmcamcorder_initialize_extra_preview_mode(handle); + if (err != MM_ERROR_NONE) { + MMCAM_LOG_ERROR("initialize extra preview mode[%d] failed", hcamcorder->extra_preview.mode); + goto pipeline_creation_error; + } + return MM_ERROR_NONE; pipeline_creation_error: diff --git a/src/mm_camcorder_internal.c b/src/mm_camcorder_internal.c index c81d318..b473eb7 100644 --- a/src/mm_camcorder_internal.c +++ b/src/mm_camcorder_internal.c @@ -606,32 +606,24 @@ static gint __mmcamcorder_init_configure_common(mmf_camcorder_t *hcamcorder) int device_count = 0; const char *videosrc_name = NULL; const char *audiosrc_name = NULL; - type_element *SrcElement = NULL; if (!hcamcorder) { MMCAM_LOG_ERROR("NULL handle"); return MM_ERROR_CAMCORDER_NOT_INITIALIZED; } - /* Device count */ _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_main, CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT, "DeviceCount", &device_count); - /* Videosrc element name */ - _mmcamcorder_conf_get_element((MMHandleType)hcamcorder, hcamcorder->conf_main, - CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT, - "VideosrcElement", - &SrcElement); - _mmcamcorder_conf_get_value_element_name(SrcElement, &videosrc_name); + _mmcamcorder_conf_get_element_and_name((MMHandleType)hcamcorder, + CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT, "VideosrcElement", + NULL, &videosrc_name); - /* Audiosrc element name */ - _mmcamcorder_conf_get_element((MMHandleType)hcamcorder, hcamcorder->conf_main, - CONFIGURE_CATEGORY_MAIN_AUDIO_INPUT, - "AudiosrcElement", - &SrcElement); - _mmcamcorder_conf_get_value_element_name(SrcElement, &audiosrc_name); + _mmcamcorder_conf_get_element_and_name((MMHandleType)hcamcorder, + CONFIGURE_CATEGORY_MAIN_AUDIO_INPUT, "AudiosrcElement", + NULL, &audiosrc_name); MMCAM_LOG_INFO("Device count[%d], Videosrc[%s], Audiosrc[%s]", device_count, videosrc_name, audiosrc_name); @@ -3128,20 +3120,6 @@ int _mmcamcorder_create_pipeline(MMHandleType handle, int type) ret = _mmcamcorder_create_preview_pipeline(handle); if (ret != MM_ERROR_NONE) return ret; - - if (hcamcorder->capture_mode == MM_CAMCORDER_CAPTURE_MODE_CAMERA_CONTROL) { - ret = _mmcamcorder_prepare_capture_mode_camera_control(handle); - if (ret != MM_ERROR_NONE) - return ret; - } else if (hcamcorder->capture_mode == MM_CAMCORDER_CAPTURE_MODE_IMAGE_PAD) { - ret = _mmcamcorder_prepare_capture_mode_image_pad(handle); - if (ret != MM_ERROR_NONE) - return ret; - } - - if (hcamcorder->extra_preview.is_supported && - _mmcamcorder_initialize_extra_preview(handle) != MM_ERROR_NONE) - MMCAM_LOG_WARNING("initialize extra preview failed"); break; } diff --git a/src/mm_camcorder_stillshot.c b/src/mm_camcorder_stillshot.c index b58d290..85a5202 100644 --- a/src/mm_camcorder_stillshot.c +++ b/src/mm_camcorder_stillshot.c @@ -59,15 +59,32 @@ do { \ | LOCAL FUNCTION PROTOTYPES: | ---------------------------------------------------------------------------------------*/ /** STATIC INTERNAL FUNCTION **/ -/* Functions for JPEG capture without Encode bin */ -int _mmcamcorder_image_cmd_capture(MMHandleType handle); -int _mmcamcorder_image_cmd_preview_start(MMHandleType handle); -int _mmcamcorder_image_cmd_preview_stop(MMHandleType handle); +static int __mmcamcorder_image_cmd_capture(MMHandleType handle); +static int __mmcamcorder_image_cmd_preview_start(MMHandleType handle); +static int __mmcamcorder_image_cmd_preview_stop(MMHandleType handle); + +static int __mmcamcorder_capture_mode_init_camera_control(MMHandleType handle); +static int __mmcamcorder_capture_mode_init_encodebin(MMHandleType handle); +static int __mmcamcorder_capture_mode_init_image_pad(MMHandleType handle); +static int __mmcamcorder_capture_mode_deinit_encodebin(MMHandleType handle); + +static int __mmcamcorder_extra_preview_mode_init_camera_control(mmf_camcorder_t *hcamcorder); +static int __mmcamcorder_extra_preview_mode_init_pipeline(MMHandleType handle, MMCamcorderExtraPreviewMode mode); + +static int __mmcamcorder_set_exif_basic_info(MMHandleType handle, int image_width, int image_height); +static int __mmcamcorder_update_exif_info(MMHandleType handle, void *imagedata, int imgln); +static void __mmcamcorder_init_stillshot_info(MMHandleType handle); +static void __mmcamcorder_get_capture_data_from_buffer(MMCamcorderCaptureDataType *capture_data, int pixtype, GstSample *sample); +static void __mmcamcorder_release_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, int tag_enable, int provide_exif); +static int __mmcamcorder_capture_save_exifinfo(MMHandleType handle, MMCamcorderCaptureDataType *original, MMCamcorderCaptureDataType *thumbnail, int provide_exif); +static int __mmcamcorder_set_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, MMCamcorderCaptureDataType *thumbnail, int provide_exif); + +static gboolean __mmcamcorder_handoff_callback_capture(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data); +static gboolean __mmcamcorder_handoff_callback_extra_preview(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data); + static void __mmcamcorder_image_capture_cb(GstElement *element, GstSample *sample1, GstSample *sample2, GstSample *sample3, gpointer u_data); static void __mmcamcorder_extra_preview_stream_cb(GstElement *element, int stream_id, GstSample *sample, gpointer u_data); - -/* sound status changed callback */ -static void __sound_status_changed_cb(keynode_t* node, void *data); +static void __mmcamcorder_sound_status_changed_cb(keynode_t* node, void *data); /*======================================================================================= | FUNCTION DEFINITIONS | @@ -78,7 +95,7 @@ static void __sound_status_changed_cb(keynode_t* node, void *data); ---------------------------------------------------------------------------------------*/ -int _mmcamcorder_prepare_capture_mode_encodebin(MMHandleType handle) +static int __mmcamcorder_capture_mode_init_encodebin(MMHandleType handle) { int err = MM_ERROR_UNKNOWN; GstPad *srcpad = NULL; @@ -129,12 +146,12 @@ int _mmcamcorder_prepare_capture_mode_encodebin(MMHandleType handle) return MM_ERROR_NONE; pipeline_creation_error: - _mmcamcorder_unprepare_capture_mode_encodebin(handle); + __mmcamcorder_capture_mode_deinit_encodebin(handle); return err; } -int _mmcamcorder_prepare_capture_mode_camera_control(MMHandleType handle) +static int __mmcamcorder_capture_mode_init_camera_control(MMHandleType handle) { mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); _MMCamcorderSubContext *sc = NULL; @@ -157,7 +174,7 @@ int _mmcamcorder_prepare_capture_mode_camera_control(MMHandleType handle) } -int _mmcamcorder_prepare_capture_mode_image_pad(MMHandleType handle) +static int __mmcamcorder_capture_mode_init_image_pad(MMHandleType handle) { int err = MM_ERROR_NONE; int capture_width = 0; @@ -260,7 +277,22 @@ pipeline_creation_error: } -static int __mmcamcorder_extra_preview_camera_control(mmf_camcorder_t *hcamcorder) +int _mmcamcorder_initialize_capture_mode(MMHandleType handle) +{ + mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); + + mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED); + + if (hcamcorder->capture_mode == MM_CAMCORDER_CAPTURE_MODE_CAMERA_CONTROL) + return __mmcamcorder_capture_mode_init_camera_control(handle); + else if (hcamcorder->capture_mode == MM_CAMCORDER_CAPTURE_MODE_IMAGE_PAD) + return __mmcamcorder_capture_mode_init_image_pad(handle); + + return MM_ERROR_NONE; +} + + +static int __mmcamcorder_extra_preview_mode_init_camera_control(mmf_camcorder_t *hcamcorder) { int i = 0; _MMCamcorderSubContext *sc = NULL; @@ -319,16 +351,20 @@ static int __mmcamcorder_extra_preview_camera_control(mmf_camcorder_t *hcamcorde } -static int __mmcamcorder_extra_preview_video_pad(mmf_camcorder_t *hcamcorder) +static int __mmcamcorder_extra_preview_mode_init_pipeline(MMHandleType handle, MMCamcorderExtraPreviewMode mode) { int err = MM_ERROR_NONE; int extra_preview_enable = 0; int width = 0; int height = 0; int fps = 0; + const char *videosrc_name = NULL; GstCaps *caps = NULL; GList *element_list = NULL; + + mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); _MMCamcorderSubContext *sc = NULL; + type_element *videosrc_element = NULL; mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED); @@ -349,6 +385,18 @@ static int __mmcamcorder_extra_preview_video_pad(mmf_camcorder_t *hcamcorder) return MM_ERROR_NONE; } + if (mode == MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_ELEMENT) { + _mmcamcorder_conf_get_element_and_name(handle, + CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT, "VideosrcElement", + &videosrc_element, &videosrc_name); + + _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_EXT_SRC, videosrc_name, "videosrc_ext_src", element_list, err); + + MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SRC].gst, "camera-id", hcamcorder->extra_preview.camera_id[0]); + + _mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SRC].gst, videosrc_element); + } + _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_EXT_FILT, "capsfilter", "videosrc_ext_filt", element_list, err); _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_EXT_SINK, "fakesink", "videosrc_ext_sink", element_list, err); @@ -377,11 +425,13 @@ static int __mmcamcorder_extra_preview_video_pad(mmf_camcorder_t *hcamcorder) } /* link elements */ - if (!gst_element_link_pads(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "video_%u", - sc->element[_MMCAMCORDER_VIDEOSRC_EXT_FILT].gst, "sink")) { - MMCAM_LOG_ERROR("pad for extra preview link failed"); - err = MM_ERROR_CAMCORDER_GST_LINK; - goto pipeline_creation_error; + if (mode == MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_SRCPAD) { + if (!gst_element_link_pads(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "video_%u", + sc->element[_MMCAMCORDER_VIDEOSRC_EXT_FILT].gst, "sink")) { + MMCAM_LOG_ERROR("pad for extra preview link failed"); + err = MM_ERROR_CAMCORDER_GST_LINK; + goto pipeline_creation_error; + } } if (!_mmcamcorder_link_elements(element_list)) { @@ -413,17 +463,20 @@ pipeline_creation_error: } -int _mmcamcorder_initialize_extra_preview(MMHandleType handle) +int _mmcamcorder_initialize_extra_preview_mode(MMHandleType handle) { mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED); + mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, MM_ERROR_NONE); + mmf_return_val_if_fail(hcamcorder->extra_preview.is_enabled, MM_ERROR_NONE); switch (hcamcorder->extra_preview.mode) { case MM_CAMCORDER_EXTRA_PREVIEW_MODE_CAMERA_CONTROL: - return __mmcamcorder_extra_preview_camera_control(hcamcorder); - case MM_CAMCORDER_EXTRA_PREVIEW_MODE_VIDEO_PAD: - return __mmcamcorder_extra_preview_video_pad(hcamcorder); + return __mmcamcorder_extra_preview_mode_init_camera_control(handle); + case MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_SRCPAD: + case MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_ELEMENT: + return __mmcamcorder_extra_preview_mode_init_pipeline(handle, hcamcorder->extra_preview.mode); default: MMCAM_LOG_ERROR("unknown extra preview mode[%d]", hcamcorder->extra_preview.mode); return MM_ERROR_CAMCORDER_INTERNAL; @@ -431,7 +484,7 @@ int _mmcamcorder_initialize_extra_preview(MMHandleType handle) } -int _mmcamcorder_unprepare_capture_mode_encodebin(MMHandleType handle) +static int __mmcamcorder_capture_mode_deinit_encodebin(MMHandleType handle) { int ret = MM_ERROR_NONE; mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); @@ -562,7 +615,7 @@ _REUSE_CHECK_DONE: } -int _mmcamcorder_image_cmd_capture(MMHandleType handle) +static int __mmcamcorder_image_cmd_capture(MMHandleType handle) { int ret = MM_ERROR_NONE; int width = 0; @@ -779,7 +832,7 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle) info->resolution_change = FALSE; } - ret = _mmcamcorder_prepare_capture_mode_encodebin((MMHandleType)hcamcorder); + ret = __mmcamcorder_capture_mode_init_encodebin((MMHandleType)hcamcorder); if (ret != MM_ERROR_NONE) { MMCAM_LOG_ERROR("failed to create encodesinkbin %x", ret); goto cmd_done; @@ -862,7 +915,7 @@ cmd_done: } -int _mmcamcorder_image_cmd_preview_start(MMHandleType handle) +static int __mmcamcorder_image_cmd_preview_start(MMHandleType handle) { int ret = MM_ERROR_NONE; int width = 0; @@ -995,7 +1048,7 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle) MMCAM_LOG_INFO("Wait Frame Done. count before[%d],after[%d], try_count[%d]", current_framecount, sc->kpi.video_framecount, try_count); } else if (hcamcorder->capture_mode == MM_CAMCORDER_CAPTURE_MODE_ENCODEBIN) { - ret = _mmcamcorder_unprepare_capture_mode_encodebin(handle); + ret = __mmcamcorder_capture_mode_deinit_encodebin(handle); if (ret != MM_ERROR_NONE) goto cmd_error; @@ -1081,7 +1134,7 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle) MMCAM_LOG_INFO("register vconf changed_cb and get sound status"); /* register changed_cb */ - vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, __sound_status_changed_cb, hcamcorder); + vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, __mmcamcorder_sound_status_changed_cb, hcamcorder); /* get sound status */ vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &(info->sound_status)); @@ -1095,7 +1148,7 @@ cmd_error: } -int _mmcamcorder_image_cmd_preview_stop(MMHandleType handle) +static int __mmcamcorder_image_cmd_preview_stop(MMHandleType handle) { int ret = MM_ERROR_NONE; int strobe_mode = MM_CAMCORDER_STROBE_MODE_OFF; @@ -1173,7 +1226,7 @@ int _mmcamcorder_image_cmd_preview_stop(MMHandleType handle) if (sc->info_image->sound_status != _SOUND_STATUS_INIT) { MMCAM_LOG_INFO("deregister sound status callback"); - vconf_ignore_key_changed(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, __sound_status_changed_cb); + vconf_ignore_key_changed(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, __mmcamcorder_sound_status_changed_cb); sc->info_image->sound_status = _SOUND_STATUS_INIT; } @@ -1198,16 +1251,16 @@ int _mmcamcorder_video_capture_command(MMHandleType handle, int command) switch (command) { case _MMCamcorder_CMD_CAPTURE: - ret = _mmcamcorder_image_cmd_capture(handle); + ret = __mmcamcorder_image_cmd_capture(handle); break; case _MMCamcorder_CMD_PREVIEW_START: - ret = _mmcamcorder_image_cmd_preview_start(handle); + ret = __mmcamcorder_image_cmd_preview_start(handle); /* I place this function last because it miscalculates a buffer that sents in GST_STATE_PAUSED */ _mmcamcorder_video_current_framerate_init(handle); break; case _MMCamcorder_CMD_PREVIEW_STOP: - ret = _mmcamcorder_image_cmd_preview_stop(handle); + ret = __mmcamcorder_image_cmd_preview_stop(handle); break; case _MMCamcorder_CMD_RECORD: case _MMCamcorder_CMD_PAUSE: @@ -1225,7 +1278,7 @@ int _mmcamcorder_video_capture_command(MMHandleType handle, int command) } -void __mmcamcorder_init_stillshot_info(MMHandleType handle) +static void __mmcamcorder_init_stillshot_info(MMHandleType handle) { mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); _MMCamcorderSubContext *sc = NULL; @@ -1254,7 +1307,7 @@ void __mmcamcorder_init_stillshot_info(MMHandleType handle) } -int __mmcamcorder_capture_save_exifinfo(MMHandleType handle, MMCamcorderCaptureDataType *original, MMCamcorderCaptureDataType *thumbnail, int provide_exif) +static int __mmcamcorder_capture_save_exifinfo(MMHandleType handle, MMCamcorderCaptureDataType *original, MMCamcorderCaptureDataType *thumbnail, int provide_exif) { int ret = MM_ERROR_NONE; unsigned char *data = NULL; @@ -1317,7 +1370,7 @@ int __mmcamcorder_capture_save_exifinfo(MMHandleType handle, MMCamcorderCaptureD } -void __mmcamcorder_get_capture_data_from_buffer(MMCamcorderCaptureDataType *capture_data, int pixtype, GstSample *sample) +static void __mmcamcorder_get_capture_data_from_buffer(MMCamcorderCaptureDataType *capture_data, int pixtype, GstSample *sample) { GstCaps *caps = NULL; GstMapInfo mapinfo; @@ -1363,7 +1416,7 @@ GET_FAILED: } -int __mmcamcorder_set_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, MMCamcorderCaptureDataType *thumbnail, int provide_exif) +static int __mmcamcorder_set_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, MMCamcorderCaptureDataType *thumbnail, int provide_exif) { mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); _MMCamcorderSubContext *sc = NULL; @@ -1384,7 +1437,7 @@ int __mmcamcorder_set_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType } -void __mmcamcorder_release_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, int tag_enable, int provide_exif) +static void __mmcamcorder_release_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, int tag_enable, int provide_exif) { mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); _MMCamcorderSubContext *sc = NULL; @@ -1994,7 +2047,7 @@ static void __mmcamcorder_extra_preview_stream_cb(GstElement *element, int strea } -gboolean __mmcamcorder_handoff_callback_extra_preview(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data) +static gboolean __mmcamcorder_handoff_callback_extra_preview(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data) { mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(u_data); _MMCamcorderSubContext *sc = NULL; @@ -2023,7 +2076,7 @@ gboolean __mmcamcorder_handoff_callback_extra_preview(GstElement *fakesink, GstB } -gboolean __mmcamcorder_handoff_callback_capture(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data) +static gboolean __mmcamcorder_handoff_callback_capture(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data) { mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(u_data); _MMCamcorderSubContext *sc = NULL; @@ -2379,7 +2432,7 @@ exit: } -int __mmcamcorder_update_exif_info(MMHandleType handle, void* imagedata, int imgln) +static int __mmcamcorder_update_exif_info(MMHandleType handle, void* imagedata, int imgln) { int ret = MM_ERROR_NONE; mmf_camcorder_t *hcamcorder = NULL; @@ -2413,7 +2466,7 @@ int __mmcamcorder_update_exif_info(MMHandleType handle, void* imagedata, int img return ret; } -int __mmcamcorder_set_exif_basic_info(MMHandleType handle, int image_width, int image_height) +static int __mmcamcorder_set_exif_basic_info(MMHandleType handle, int image_width, int image_height) { int ret = MM_ERROR_NONE; int value; @@ -3149,7 +3202,7 @@ exit: } -static void __sound_status_changed_cb(keynode_t* node, void *data) +static void __mmcamcorder_sound_status_changed_cb(keynode_t* node, void *data) { mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)data; _MMCamcorderImageInfo *info = NULL; @@ -3168,9 +3221,44 @@ static void __sound_status_changed_cb(keynode_t* node, void *data) } -int _mmcamcorder_set_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int pixel_format, int width, int height, int fps) +int _mmcamcorder_set_extra_preview_device_type(MMHandleType handle, int stream_id, int device_type) +{ + int ret = MM_ERROR_NONE; + int camera_id = 0; + mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)handle; + MMCamcorderStateType current_state = MM_CAMCORDER_STATE_NONE; + + mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); + mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, MM_ERROR_CAMCORDER_NOT_SUPPORTED); + mmf_return_val_if_fail(hcamcorder->extra_preview.mode == MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_ELEMENT, + MM_ERROR_CAMCORDER_NOT_SUPPORTED); + mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM, + MM_ERROR_CAMCORDER_INVALID_ARGUMENT); + mmf_return_val_if_fail(device_type > MM_VIDEO_DEVICE_NONE && device_type < MM_VIDEO_DEVICE_NUM + , MM_ERROR_CAMCORDER_INVALID_ARGUMENT); + + mm_camcorder_get_state(handle, ¤t_state); + + MMCAM_LOG_INFO("stream_id[%d], device type[%d]", stream_id, device_type); + + if (current_state > MM_CAMCORDER_STATE_NULL) { + MMCAM_LOG_ERROR("The device type can not be set after pipeline created"); + return MM_ERROR_CAMCORDER_INVALID_STATE; + } + + ret = _mmcamcorder_get_camera_id(device_type, &camera_id); + if (ret != MM_ERROR_NONE) + return ret; + + hcamcorder->extra_preview.camera_id[stream_id] = camera_id; + + return MM_ERROR_NONE; +} + + +int _mmcamcorder_set_extra_preview_stream_format(MMHandleType handle, int stream_id, int pixel_format, int width, int height, int fps) { - mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)camcorder; + mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)handle; MMCamcorderStateType current_state = MM_CAMCORDER_STATE_NONE; GstCameraControl *control = NULL; _MMCamcorderSubContext *sc = NULL; @@ -3183,13 +3271,13 @@ int _mmcamcorder_set_extra_preview_stream_format(MMHandleType camcorder, int str MM_ERROR_CAMCORDER_INVALID_ARGUMENT); mmf_return_val_if_fail(width > 0 && height > 0 && fps >= 0, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); - mm_camcorder_get_state(camcorder, ¤t_state); + mm_camcorder_get_state(handle, ¤t_state); MMCAM_LOG_INFO("state[%d] stream_id[%d],fmt[%d],res[%dx%d],fps[%d]", current_state, stream_id, pixel_format, width, height, fps); if (current_state >= MM_CAMCORDER_STATE_READY) { - sc = MMF_CAMCORDER_SUBCONTEXT(camcorder); + sc = MMF_CAMCORDER_SUBCONTEXT(handle); mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); @@ -3212,14 +3300,14 @@ int _mmcamcorder_set_extra_preview_stream_format(MMHandleType camcorder, int str } -int _mmcamcorder_get_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int *pixel_format, int *width, int *height, int *fps) +int _mmcamcorder_get_extra_preview_stream_format(MMHandleType handle, int stream_id, int *pixel_format, int *width, int *height, int *fps) { int _width = 0; int _height = 0; int _fps = 0; GstCameraControlImageFormat _img_fmt = GST_CAMERA_CONTROL_IMAGE_FORMAT_NV12; GstCameraControl *control = NULL; - mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)camcorder; + mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)handle; MMCamcorderStateType current_state = MM_CAMCORDER_STATE_NONE; _MMCamcorderSubContext *sc = NULL; @@ -3227,10 +3315,10 @@ int _mmcamcorder_get_extra_preview_stream_format(MMHandleType camcorder, int str mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, MM_ERROR_CAMCORDER_NOT_SUPPORTED); mmf_return_val_if_fail(pixel_format && width && height && fps, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); - mm_camcorder_get_state(camcorder, ¤t_state); + mm_camcorder_get_state(handle, ¤t_state); if (current_state >= MM_CAMCORDER_STATE_READY) { - sc = MMF_CAMCORDER_SUBCONTEXT(camcorder); + sc = MMF_CAMCORDER_SUBCONTEXT(handle); mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); @@ -3258,9 +3346,9 @@ int _mmcamcorder_get_extra_preview_stream_format(MMHandleType camcorder, int str } -int _mmcamcorder_set_extra_preview_bitrate(MMHandleType camcorder, int stream_id, int bitrate) +int _mmcamcorder_set_extra_preview_bitrate(MMHandleType handle, int stream_id, int bitrate) { - mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)camcorder; + mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)handle; MMCamcorderStateType current_state = MM_CAMCORDER_STATE_NONE; GstCameraControl *control = NULL; _MMCamcorderSubContext *sc = NULL; @@ -3271,12 +3359,12 @@ int _mmcamcorder_set_extra_preview_bitrate(MMHandleType camcorder, int stream_id MM_ERROR_CAMCORDER_INVALID_ARGUMENT); mmf_return_val_if_fail(bitrate > 0, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); - mm_camcorder_get_state(camcorder, ¤t_state); + mm_camcorder_get_state(handle, ¤t_state); MMCAM_LOG_INFO("state[%d] stream[%d], bitrate[%d]", current_state, stream_id, bitrate); if (current_state >= MM_CAMCORDER_STATE_READY) { - sc = MMF_CAMCORDER_SUBCONTEXT(camcorder); + sc = MMF_CAMCORDER_SUBCONTEXT(handle); mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); @@ -3295,11 +3383,11 @@ int _mmcamcorder_set_extra_preview_bitrate(MMHandleType camcorder, int stream_id } -int _mmcamcorder_get_extra_preview_bitrate(MMHandleType camcorder, int stream_id, int *bitrate) +int _mmcamcorder_get_extra_preview_bitrate(MMHandleType handle, int stream_id, int *bitrate) { int _bitrate = 0; GstCameraControl *control = NULL; - mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)camcorder; + mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)handle; MMCamcorderStateType current_state = MM_CAMCORDER_STATE_NONE; _MMCamcorderSubContext *sc = NULL; @@ -3309,10 +3397,10 @@ int _mmcamcorder_get_extra_preview_bitrate(MMHandleType camcorder, int stream_id MM_ERROR_CAMCORDER_INVALID_ARGUMENT); mmf_return_val_if_fail(bitrate, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); - mm_camcorder_get_state(camcorder, ¤t_state); + mm_camcorder_get_state(handle, ¤t_state); if (current_state >= MM_CAMCORDER_STATE_READY) { - sc = MMF_CAMCORDER_SUBCONTEXT(camcorder); + sc = MMF_CAMCORDER_SUBCONTEXT(handle); mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); @@ -3333,9 +3421,9 @@ int _mmcamcorder_get_extra_preview_bitrate(MMHandleType camcorder, int stream_id } -int _mmcamcorder_set_extra_preview_gop_interval(MMHandleType camcorder, int stream_id, int interval) +int _mmcamcorder_set_extra_preview_gop_interval(MMHandleType handle, int stream_id, int interval) { - mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)camcorder; + mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)handle; MMCamcorderStateType current_state = MM_CAMCORDER_STATE_NONE; GstCameraControl *control = NULL; _MMCamcorderSubContext *sc = NULL; @@ -3345,12 +3433,12 @@ int _mmcamcorder_set_extra_preview_gop_interval(MMHandleType camcorder, int stre mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); - mm_camcorder_get_state(camcorder, ¤t_state); + mm_camcorder_get_state(handle, ¤t_state); MMCAM_LOG_INFO("state[%d] stream[%d], interval[%d]", current_state, stream_id, interval); if (current_state >= MM_CAMCORDER_STATE_READY) { - sc = MMF_CAMCORDER_SUBCONTEXT(camcorder); + sc = MMF_CAMCORDER_SUBCONTEXT(handle); mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); @@ -3369,11 +3457,11 @@ int _mmcamcorder_set_extra_preview_gop_interval(MMHandleType camcorder, int stre } -int _mmcamcorder_get_extra_preview_gop_interval(MMHandleType camcorder, int stream_id, int *interval) +int _mmcamcorder_get_extra_preview_gop_interval(MMHandleType handle, int stream_id, int *interval) { int _interval = 0; GstCameraControl *control = NULL; - mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)camcorder; + mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)handle; MMCamcorderStateType current_state = MM_CAMCORDER_STATE_NONE; _MMCamcorderSubContext *sc = NULL; @@ -3383,10 +3471,10 @@ int _mmcamcorder_get_extra_preview_gop_interval(MMHandleType camcorder, int stre MM_ERROR_CAMCORDER_INVALID_ARGUMENT); mmf_return_val_if_fail(interval, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); - mm_camcorder_get_state(camcorder, ¤t_state); + mm_camcorder_get_state(handle, ¤t_state); if (current_state >= MM_CAMCORDER_STATE_READY) { - sc = MMF_CAMCORDER_SUBCONTEXT(camcorder); + sc = MMF_CAMCORDER_SUBCONTEXT(handle); mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); diff --git a/src/mm_camcorder_util.c b/src/mm_camcorder_util.c index af640a1..8514490 100644 --- a/src/mm_camcorder_util.c +++ b/src/mm_camcorder_util.c @@ -876,6 +876,44 @@ int _mmcamcorder_get_file_system_type(const gchar *path, int *file_system_type) } +int _mmcamcorder_get_camera_id(int device_type, int *camera_id) +{ + int ret = MM_ERROR_NONE; + MMCamPreset info = {.videodev_type = device_type}; + MMHandleType handle = NULL; + mmf_camcorder_t *hcamcorder = NULL; + type_int_array *input_index = NULL; + + mmf_return_val_if_fail(camera_id, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); + + ret = _mmcamcorder_create(&handle, &info); + if (ret != MM_ERROR_NONE) { + MMCAM_LOG_ERROR("_mmcamcorder_create failed[0x%x]", ret); + return ret; + } + + hcamcorder = MMF_CAMCORDER(handle); + + _mmcamcorder_conf_get_value_int_array(hcamcorder->conf_ctrl, + CONFIGURE_CATEGORY_CTRL_CAMERA, + "InputIndex", &input_index); + if (!input_index) { + MMCAM_LOG_ERROR("Get input index failed"); + ret = MM_ERROR_CAMCORDER_INTERNAL; + goto _GET_CAMERA_ID_OUT; + } + + *camera_id = input_index->default_value; + + MMCAM_LOG_INFO("device type[%d] -> camera id[%d]", device_type, *camera_id); + +_GET_CAMERA_ID_OUT: + _mmcamcorder_destroy(handle); + + return ret; +} + + int _mmcamcorder_get_device_led_brightness(GDBusConnection *conn, int *brightness) { int get_value = 0;