Support new extra preview mode 56/280156/4 accepted/tizen/unified/20220830.032655 submit/tizen/20220829.031256
authorJeongmo Yang <jm80.yang@samsung.com>
Wed, 24 Aug 2022 11:35:42 +0000 (20:35 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Fri, 26 Aug 2022 10:56:16 +0000 (19:56 +0900)
- The defined extra preview mode
 : MM_CAMCORDER_EXTRA_PREVIEW_MODE_CAMERA_CONTROL
 : MM_CAMCORDER_EXTRA_PREVIEW_MODE_VIDEO_PAD -> New
- Currently, only 1 extra preview stream is supported
  when it's MM_CAMCORDER_EXTRA_PREVIEW_MODE_VIDEO_PAD mode.

[Version] 0.10.267
[Issue Type] New feature

Change-Id: I0521335875569d9ffa2820f48172e7ab897ad2dc
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
packaging/libmm-camcorder.spec
src/include/mm_camcorder.h
src/include/mm_camcorder_internal.h
src/include/mm_camcorder_stillshot.h
src/mm_camcorder_configure.c
src/mm_camcorder_internal.c
src/mm_camcorder_stillshot.c

index 19aaafb..0172819 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       libmm-camcorder
 Summary:    Camera and recorder library
-Version:    0.10.266
+Version:    0.10.267
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index f2637df..7b48044 100644 (file)
@@ -1407,6 +1407,14 @@ typedef enum {
        MM_CAMCORDER_CAPTURE_MODE_IMAGE_PAD             /**< Capture through image source pad in camerasrc plugin */
 } MMCamcorderCaptureMode;
 
+/**
+ * An enumeration of extra preview mode.
+ */
+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 */
+} MMCamcorderExtraPreviewMode;
+
 
 /**
  * An enumeration for color tone. Color tone provides an impression of
index 5b09b43..cbca186 100644 (file)
@@ -546,6 +546,10 @@ typedef enum {
        _MMCAMCORDER_VIDEOSRC_CAP_FILT,
        _MMCAMCORDER_VIDEOSRC_CAP_SINK,
 
+       /* Pipeline element of extra preview */
+       _MMCAMCORDER_VIDEOSRC_EXT_FILT,
+       _MMCAMCORDER_VIDEOSRC_EXT_SINK,
+
        /* Pipeline element of Video output */
        _MMCAMCORDER_VIDEOSINK_QUE,
        _MMCAMCORDER_VIDEOSINK_CLS,
@@ -677,7 +681,7 @@ typedef struct {
 } _MMCamcorderReplayGain;
 
 /**
- * MMCamcorder Extra preview stream format
+ * MMCamcorder Extra preview format
  */
 typedef struct {
        int pixel_format;
@@ -689,7 +693,16 @@ typedef struct {
        gboolean need_to_set_format;
        gboolean need_to_set_bitrate;
        gboolean need_to_set_gop_interval;
-} _MMCamcorderExtraPreviewStreamFormat;
+} _MMCamcorderExtraPreviewFormat;
+
+/**
+ * MMCamcorder Extra preview
+ */
+typedef struct {
+       gboolean is_supported;
+       MMCamcorderExtraPreviewMode mode;
+       _MMCamcorderExtraPreviewFormat format[MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM];
+} _MMCamcorderExtraPreview;
 
 /**
  * MMCamcorder Sub Context
@@ -855,9 +868,7 @@ typedef struct mmf_camcorder {
        /* Profiling */
        int measure_preview_fps;                                /**< Flag for measuring fps of preview frames */
 
-       /* Extra preview */
-       int support_extra_preview;
-       _MMCamcorderExtraPreviewStreamFormat extra_preview_format[MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM];
+       _MMCamcorderExtraPreview extra_preview;                 /**< Extra preview */
 
        GQuark buffer_quark;                                    /**< Quark for buffer */
 
index 7dbf64d..443f815 100644 (file)
@@ -116,10 +116,11 @@ void __mmcamcorder_get_capture_data_from_buffer(MMCamcorderCaptureDataType *capt
 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(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data);
+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_stream(MMHandleType handle);
+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);
index f4f080a..2492109 100644 (file)
@@ -822,7 +822,8 @@ int _mmcamcorder_conf_init(MMHandleType handle, int type, camera_conf *configure
                { "RecommendPreviewResolution", CONFIGURE_VALUE_INT_PAIR_ARRAY, {NULL} },
                { "FacingDirection",      CONFIGURE_VALUE_INT,            {.value_int = MM_CAMCORDER_CAMERA_FACING_DIRECTION_REAR} },
                { "FrameStabilityCount",  CONFIGURE_VALUE_INT,            {.value_int = 0} },
-               { "SupportExtraPreview",  CONFIGURE_VALUE_INT,            {.value_int = 0} }
+               { "SupportExtraPreview",  CONFIGURE_VALUE_INT,            {.value_int = 0} },
+               { "ExtraPreviewMode",     CONFIGURE_VALUE_INT,            {.value_int = MM_CAMCORDER_EXTRA_PREVIEW_MODE_CAMERA_CONTROL} }
        };
 
        /* [Strobe] matching table */
index 1856449..c81d318 100644 (file)
@@ -423,7 +423,12 @@ static gint __mmcamcorder_init_configure_video_capture(mmf_camcorder_t *hcamcord
        _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_ctrl,
                CONFIGURE_CATEGORY_CTRL_CAMERA,
                "SupportExtraPreview",
-               &hcamcorder->support_extra_preview);
+               (int *)&hcamcorder->extra_preview.is_supported);
+
+       _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_ctrl,
+               CONFIGURE_CATEGORY_CTRL_CAMERA,
+               "ExtraPreviewMode",
+               (int *)&hcamcorder->extra_preview.mode);
 
        _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_ctrl,
                CONFIGURE_CATEGORY_CTRL_CAMERA,
@@ -488,7 +493,8 @@ static gint __mmcamcorder_init_configure_video_capture(mmf_camcorder_t *hcamcord
 
        MMCAM_LOG_INFO("Support user buffer[%d]", hcamcorder->support_user_buffer);
        MMCAM_LOG_INFO("Support media packet preview cb[%d]", hcamcorder->support_media_packet_preview_cb);
-       MMCAM_LOG_INFO("Support extra preview[%d]", hcamcorder->support_extra_preview);
+       MMCAM_LOG_INFO("Support extra preview[%d]", hcamcorder->extra_preview.is_supported);
+       MMCAM_LOG_INFO("Extra preview mode[%d]", hcamcorder->extra_preview.mode);
        MMCAM_LOG_INFO("Capture mode[%d]", hcamcorder->capture_mode);
        MMCAM_LOG_INFO("Use zero copy format[%d]", hcamcorder->use_zero_copy_format);
        MMCAM_LOG_INFO("Use video convert[%d]", hcamcorder->use_videoconvert);
@@ -546,7 +552,7 @@ static gint __mmcamcorder_init_configure_video_capture(mmf_camcorder_t *hcamcord
                MMCAM_SUPPORT_ZERO_COPY_FORMAT, hcamcorder->use_zero_copy_format,
                MMCAM_SUPPORT_MEDIA_PACKET_PREVIEW_CB, hcamcorder->support_media_packet_preview_cb,
                MMCAM_SUPPORT_USER_BUFFER, hcamcorder->support_user_buffer,
-               MMCAM_SUPPORT_EXTRA_PREVIEW, hcamcorder->support_extra_preview,
+               MMCAM_SUPPORT_EXTRA_PREVIEW, hcamcorder->extra_preview.is_supported,
                MMCAM_CAMERA_FPS, fps_info.int_array.def,
                MMCAM_DISPLAY_FLIP, camera_default_flip,
                MMCAM_CAPTURE_SOUND_ENABLE, play_capture_sound,
@@ -3133,9 +3139,9 @@ int _mmcamcorder_create_pipeline(MMHandleType handle, int type)
                                return ret;
                }
 
-               if (hcamcorder->support_extra_preview &&
-                       _mmcamcorder_initialize_extra_preview_stream(handle) != MM_ERROR_NONE)
-                       MMCAM_LOG_WARNING("connect extra preview stream signal failed");
+               if (hcamcorder->extra_preview.is_supported &&
+                       _mmcamcorder_initialize_extra_preview(handle) != MM_ERROR_NONE)
+                       MMCAM_LOG_WARNING("initialize extra preview failed");
                break;
        }
 
index 01367e5..9161189 100644 (file)
@@ -123,7 +123,7 @@ int _mmcamcorder_prepare_capture_mode_encodebin(MMHandleType handle)
        /* connect handoff signal to get capture data */
        MMCAMCORDER_SIGNAL_CONNECT(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst,
                _MMCAMCORDER_HANDLER_STILLSHOT, "handoff",
-               G_CALLBACK(__mmcamcorder_handoff_callback),
+               G_CALLBACK(__mmcamcorder_handoff_callback_capture),
                hcamcorder);
 
        return MM_ERROR_NONE;
@@ -242,7 +242,7 @@ int _mmcamcorder_prepare_capture_mode_image_pad(MMHandleType handle)
        /* connect handoff signal to get capture data */
        MMCAMCORDER_SIGNAL_CONNECT(sc->element[_MMCAMCORDER_VIDEOSRC_CAP_SINK].gst,
                _MMCAMCORDER_HANDLER_STILLSHOT, "handoff",
-               G_CALLBACK(__mmcamcorder_handoff_callback),
+               G_CALLBACK(__mmcamcorder_handoff_callback_capture),
                hcamcorder);
 
        return MM_ERROR_NONE;
@@ -260,17 +260,16 @@ pipeline_creation_error:
 }
 
 
-int _mmcamcorder_initialize_extra_preview_stream(MMHandleType handle)
+static int __mmcamcorder_extra_preview_camera_control(mmf_camcorder_t *hcamcorder)
 {
        int i = 0;
-       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderSubContext *sc = NULL;
        GstCameraControl *control = NULL;
-       _MMCamcorderExtraPreviewStreamFormat *e_fmt = NULL;
+       _MMCamcorderExtraPreviewFormat *e_fmt = NULL;
 
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
-       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+       sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
        mmf_return_val_if_fail(sc && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
        mmf_return_val_if_fail(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
@@ -289,7 +288,7 @@ int _mmcamcorder_initialize_extra_preview_stream(MMHandleType handle)
        }
 
        for (i = 0 ; i < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM ; i++) {
-               e_fmt = &hcamcorder->extra_preview_format[i];
+               e_fmt = &hcamcorder->extra_preview.format[i];
 
                if (e_fmt->need_to_set_format) {
                        if (!gst_camera_control_set_extra_preview_stream_format(control,
@@ -320,6 +319,128 @@ int _mmcamcorder_initialize_extra_preview_stream(MMHandleType handle)
 }
 
 
+static int __mmcamcorder_extra_preview_video_pad(mmf_camcorder_t *hcamcorder)
+{
+       int err = MM_ERROR_NONE;
+       int extra_preview_enable = 0;
+       int width = 0;
+       int height = 0;
+       int fps = 0;
+       gchar *caps_string = NULL;
+       GstCaps *caps = NULL;
+       GList *element_list = NULL;
+       _MMCamcorderSubContext *sc = NULL;
+
+       mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
+       mmf_return_val_if_fail(sc && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+       err = mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
+               MMCAM_EXTRA_PREVIEW_ENABLE, &extra_preview_enable,
+               NULL);
+
+       width = hcamcorder->extra_preview.format[0].width;
+       height = hcamcorder->extra_preview.format[0].height;
+       fps = hcamcorder->extra_preview.format[0].fps;
+
+       if (!extra_preview_enable || width <= 0 || height <= 0 || fps <= 0) {
+               MMCAM_LOG_WARNING("extra preview disabled[enable:%d,res:%dx%d,fps:%d]",
+                       extra_preview_enable, width, height, fps);
+               return MM_ERROR_NONE;
+       }
+
+       _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);
+
+       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SINK].gst, "sync", TRUE);
+       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SINK].gst, "async", FALSE);
+       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SINK].gst, "enable-last-sample", FALSE);
+       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SINK].gst, "signal-handoffs", TRUE);
+
+       caps = gst_caps_new_simple("video/x-h264",
+               "width", G_TYPE_INT, width,
+               "height", G_TYPE_INT, height,
+               "framerate", GST_TYPE_FRACTION, fps, 1,
+               NULL);
+       if (!caps) {
+               MMCAM_LOG_ERROR("caps for extra preview failed");
+               err = MM_ERROR_CAMCORDER_GST_LINK;
+               goto pipeline_creation_error;
+       }
+
+       caps_string = gst_caps_to_string(caps);
+       if (caps_string) {
+               MMCAM_LOG_INFO("set caps for capture[%s]", caps_string);
+               g_free(caps_string);
+               caps_string = NULL;
+       }
+
+       MMCAMCORDER_G_OBJECT_SET_POINTER(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_FILT].gst, "caps", caps);
+       gst_caps_unref(caps);
+
+       /* add elements to main pipeline */
+       if (!_mmcamcorder_add_elements_to_bin(GST_BIN(sc->element[_MMCAMCORDER_MAIN_PIPE].gst), element_list)) {
+               MMCAM_LOG_ERROR("element_list add error.");
+               err = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
+               goto pipeline_creation_error;
+       }
+
+       /* 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 (!_mmcamcorder_link_elements(element_list)) {
+               MMCAM_LOG_ERROR("element link error.");
+               err = MM_ERROR_CAMCORDER_GST_LINK;
+               goto pipeline_creation_error;
+       }
+
+       g_list_free(element_list);
+
+       /* connect handoff signal to get capture data */
+       MMCAMCORDER_SIGNAL_CONNECT(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SINK].gst,
+               _MMCAMCORDER_HANDLER_STILLSHOT, "handoff",
+               G_CALLBACK(__mmcamcorder_handoff_callback_extra_preview),
+               hcamcorder);
+
+       return MM_ERROR_NONE;
+
+pipeline_creation_error:
+       _MMCAMCORDER_ELEMENT_REMOVE(sc->element, _MMCAMCORDER_VIDEOSRC_EXT_FILT);
+       _MMCAMCORDER_ELEMENT_REMOVE(sc->element, _MMCAMCORDER_VIDEOSRC_EXT_SINK);
+
+       if (element_list) {
+               g_list_free(element_list);
+               element_list = NULL;
+       }
+
+       return err;
+}
+
+
+int _mmcamcorder_initialize_extra_preview(MMHandleType handle)
+{
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+
+       mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+       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);
+       default:
+               MMCAM_LOG_ERROR("unknown extra preview mode[%d]", hcamcorder->extra_preview.mode);
+               return MM_ERROR_CAMCORDER_INTERNAL;
+       }
+}
+
+
 int _mmcamcorder_unprepare_capture_mode_encodebin(MMHandleType handle)
 {
        int ret = MM_ERROR_NONE;
@@ -1883,7 +2004,36 @@ static void __mmcamcorder_extra_preview_stream_cb(GstElement *element, int strea
 }
 
 
-gboolean __mmcamcorder_handoff_callback(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data)
+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;
+
+       GstCaps *caps = NULL;
+       GstSample *sample = NULL;
+
+       mmf_return_val_if_fail(hcamcorder, FALSE);
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
+       mmf_return_val_if_fail(sc && sc->element, FALSE);
+
+       /* make sample with buffer and caps */
+       caps = gst_pad_get_allowed_caps(pad);
+       mmf_return_val_if_fail(caps, TRUE);
+
+       sample = gst_sample_new(buffer, caps, NULL, NULL);
+       gst_caps_unref(caps);
+       mmf_return_val_if_fail(sample, TRUE);
+
+       _mmcamcorder_invoke_video_stream_cb((MMHandleType)u_data, sample, TRUE, 0);
+
+       gst_sample_unref(sample);
+
+       return TRUE;
+}
+
+
+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;
@@ -3036,7 +3186,7 @@ int _mmcamcorder_set_extra_preview_stream_format(MMHandleType camcorder, int str
        _MMCamcorderSubContext *sc = NULL;
 
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
-       mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
+       mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, 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(pixel_format > MM_PIXEL_FORMAT_INVALID && pixel_format < MM_PIXEL_FORMAT_NUM,
@@ -3060,13 +3210,13 @@ int _mmcamcorder_set_extra_preview_stream_format(MMHandleType camcorder, int str
                }
        } else {
                MMCAM_LOG_INFO("It will be set when start preview");
-               hcamcorder->extra_preview_format[stream_id].need_to_set_format = TRUE;
+               hcamcorder->extra_preview.format[stream_id].need_to_set_format = TRUE;
        }
 
-       hcamcorder->extra_preview_format[stream_id].pixel_format = pixel_format;
-       hcamcorder->extra_preview_format[stream_id].width = width;
-       hcamcorder->extra_preview_format[stream_id].height = height;
-       hcamcorder->extra_preview_format[stream_id].fps = fps;
+       hcamcorder->extra_preview.format[stream_id].pixel_format = pixel_format;
+       hcamcorder->extra_preview.format[stream_id].width = width;
+       hcamcorder->extra_preview.format[stream_id].height = height;
+       hcamcorder->extra_preview.format[stream_id].fps = fps;
 
        return MM_ERROR_NONE;
 }
@@ -3084,7 +3234,7 @@ int _mmcamcorder_get_extra_preview_stream_format(MMHandleType camcorder, int str
        _MMCamcorderSubContext *sc = NULL;
 
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
-       mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
+       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);
@@ -3105,10 +3255,10 @@ int _mmcamcorder_get_extra_preview_stream_format(MMHandleType camcorder, int str
                *height = _height;
                *fps = _fps;
        } else {
-               *pixel_format = hcamcorder->extra_preview_format[stream_id].pixel_format;
-               *width = hcamcorder->extra_preview_format[stream_id].width;
-               *height = hcamcorder->extra_preview_format[stream_id].height;
-               *fps = hcamcorder->extra_preview_format[stream_id].fps;
+               *pixel_format = hcamcorder->extra_preview.format[stream_id].pixel_format;
+               *width = hcamcorder->extra_preview.format[stream_id].width;
+               *height = hcamcorder->extra_preview.format[stream_id].height;
+               *fps = hcamcorder->extra_preview.format[stream_id].fps;
        }
 
        MMCAM_LOG_INFO("get result[fmt:%d(%d),res:%dx%d,fps:%d][state:%d]",
@@ -3126,7 +3276,7 @@ int _mmcamcorder_set_extra_preview_bitrate(MMHandleType camcorder, int stream_id
        _MMCamcorderSubContext *sc = NULL;
 
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
-       mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
+       mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, 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(bitrate > 0, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
@@ -3146,10 +3296,10 @@ int _mmcamcorder_set_extra_preview_bitrate(MMHandleType camcorder, int stream_id
                }
        } else {
                MMCAM_LOG_INFO("It will be set when start preview");
-               hcamcorder->extra_preview_format[stream_id].need_to_set_bitrate = TRUE;
+               hcamcorder->extra_preview.format[stream_id].need_to_set_bitrate = TRUE;
        }
 
-       hcamcorder->extra_preview_format[stream_id].bitrate = bitrate;
+       hcamcorder->extra_preview.format[stream_id].bitrate = bitrate;
 
        return MM_ERROR_NONE;
 }
@@ -3164,7 +3314,7 @@ int _mmcamcorder_get_extra_preview_bitrate(MMHandleType camcorder, int stream_id
        _MMCamcorderSubContext *sc = NULL;
 
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
-       mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
+       mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, 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(bitrate, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
@@ -3183,7 +3333,7 @@ int _mmcamcorder_get_extra_preview_bitrate(MMHandleType camcorder, int stream_id
 
                *bitrate = _bitrate;
        } else {
-               *bitrate = hcamcorder->extra_preview_format[stream_id].bitrate;
+               *bitrate = hcamcorder->extra_preview.format[stream_id].bitrate;
        }
 
        MMCAM_LOG_INFO("get bitrate[%d] for stream[%d][state:%d]",
@@ -3201,7 +3351,7 @@ int _mmcamcorder_set_extra_preview_gop_interval(MMHandleType camcorder, int stre
        _MMCamcorderSubContext *sc = NULL;
 
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
-       mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
+       mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, 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);
 
@@ -3220,10 +3370,10 @@ int _mmcamcorder_set_extra_preview_gop_interval(MMHandleType camcorder, int stre
                }
        } else {
                MMCAM_LOG_INFO("It will be set when start preview");
-               hcamcorder->extra_preview_format[stream_id].need_to_set_gop_interval = TRUE;
+               hcamcorder->extra_preview.format[stream_id].need_to_set_gop_interval = TRUE;
        }
 
-       hcamcorder->extra_preview_format[stream_id].gop_interval = interval;
+       hcamcorder->extra_preview.format[stream_id].gop_interval = interval;
 
        return MM_ERROR_NONE;
 }
@@ -3238,7 +3388,7 @@ int _mmcamcorder_get_extra_preview_gop_interval(MMHandleType camcorder, int stre
        _MMCamcorderSubContext *sc = NULL;
 
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
-       mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
+       mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, 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(interval, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
@@ -3257,7 +3407,7 @@ int _mmcamcorder_get_extra_preview_gop_interval(MMHandleType camcorder, int stre
 
                *interval = _interval;
        } else {
-               *interval = hcamcorder->extra_preview_format[stream_id].gop_interval;
+               *interval = hcamcorder->extra_preview.format[stream_id].gop_interval;
        }
 
        MMCAM_LOG_INFO("get GOP interval[%d] for stream[%d][state:%d]",