Support new extra preview mode 45/281045/4 accepted/tizen/unified/20220920.110650
authorJeongmo Yang <jm80.yang@samsung.com>
Thu, 8 Sep 2022 08:39:20 +0000 (17:39 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Mon, 19 Sep 2022 10:48:56 +0000 (19:48 +0900)
- 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 <jm80.yang@samsung.com>
13 files changed:
packaging/libmm-camcorder.spec
src/include/mm_camcorder.h
src/include/mm_camcorder_configure.h
src/include/mm_camcorder_internal.h
src/include/mm_camcorder_stillshot.h
src/include/mm_camcorder_util.h
src/mm_camcorder.c
src/mm_camcorder_attribute.c
src/mm_camcorder_configure.c
src/mm_camcorder_gstcommon.c
src/mm_camcorder_internal.c
src/mm_camcorder_stillshot.c
src/mm_camcorder_util.c

index 6e08b7b..76b7b96 100755 (executable)
@@ -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
index 7b48044..be7b87e 100644 (file)
@@ -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);
index 165b3fe..a5fc93a 100644 (file)
@@ -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
 }
index c51ef04..3c2dfd9 100644 (file)
@@ -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;
 
index 443f815..50c71aa 100644 (file)
@@ -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
 }
index cfa5fb5..5cdd5f6 100644 (file)
@@ -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*/
index 9c2b190..a4c046a 100644 (file)
@@ -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);
index 1e282d7..f2c9599 100644 (file)
@@ -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");
index 2492109..3737d04 100644 (file)
@@ -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;
index b6deab8..05384d3 100644 (file)
@@ -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:
index c81d318..b473eb7 100644 (file)
@@ -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;
        }
 
index b58d290..85a5202 100644 (file)
@@ -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, &current_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, &current_state);
+       mm_camcorder_get_state(handle, &current_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, &current_state);
+       mm_camcorder_get_state(handle, &current_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, &current_state);
+       mm_camcorder_get_state(handle, &current_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, &current_state);
+       mm_camcorder_get_state(handle, &current_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, &current_state);
+       mm_camcorder_get_state(handle, &current_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, &current_state);
+       mm_camcorder_get_state(handle, &current_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);
index af640a1..8514490 100644 (file)
@@ -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;