[Release version 0.10.62] Add new attributes for reuse display, Remove unnecessary... 58/78858/4
authorJeongmo Yang <jm80.yang@samsung.com>
Thu, 7 Jul 2016 07:20:09 +0000 (16:20 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Mon, 11 Jul 2016 04:58:14 +0000 (13:58 +0900)
Change-Id: Ia5550be9c333ea839bf8028c0bc76bea502307fd
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
configure.ac
packaging/libmm-camcorder.spec
src/Makefile.am
src/include/mm_camcorder.h
src/include/mm_camcorder_attribute.h
src/include/mm_camcorder_internal.h
src/mm_camcorder_attribute.c
src/mm_camcorder_gstcommon.c
src/mm_camcorder_internal.c
src/mm_camcorder_stillshot.c
src/mm_camcorder_videorec.c

index 11e4a98..c9444a7 100644 (file)
@@ -39,20 +39,9 @@ PKG_CHECK_MODULES(GST_APP, gstreamer-app-1.0 >= 1.2.0)
 AC_SUBST(GST_APP_CFLAGS)
 AC_SUBST(GST_APP_LIBS)
 
-AC_ARG_ENABLE(wayland, AC_HELP_STRING([--enable-wayland], [enable wayland]),
-[
-  case "${enableval}" in
-    yes) WAYLAND_SUPPORT=yes ;;
-    no)  WAYLAND_SUPPORT=no ;;
-    *) AC_MSG_ERROR(bad value ${enableval} for --enable-wayland) ;;
-  esac
-],[WAYLAND_SUPPORT=no])
-if test "x$WAYLAND_SUPPORT" = "xyes"; then
 PKG_CHECK_MODULES(GST_WAYLAND, gstreamer-wayland-1.0 >= 1.2.0)
 AC_SUBST(GST_WAYLAND_CFLAGS)
 AC_SUBST(GST_WAYLAND_LIBS)
-fi
-AM_CONDITIONAL([WAYLAND_SUPPORT], [test "x$WAYLAND_SUPPORT" = "xyes"])
 
 PKG_CHECK_MODULES(MM_COMMON, mm-common)
 AC_SUBST(MM_COMMON_CFLAGS)
index 2efda55..2967b69 100644 (file)
@@ -1,8 +1,6 @@
-%bcond_with wayland
-
 Name:       libmm-camcorder
 Summary:    Camera and recorder library
-Version:    0.10.61
+Version:    0.10.62
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
@@ -20,10 +18,8 @@ BuildRequires:  pkgconfig(mmutil-jpeg)
 BuildRequires:  pkgconfig(gstreamer-base-1.0)
 BuildRequires:  pkgconfig(gstreamer-video-1.0)
 BuildRequires:  pkgconfig(gstreamer-app-1.0)
-%if %{with wayland}
 BuildRequires:  pkgconfig(gstreamer-wayland-1.0)
 BuildRequires:  pkgconfig(wayland-client)
-%endif
 BuildRequires:  pkgconfig(vconf)
 BuildRequires:  pkgconfig(libtbm)
 BuildRequires:  pkgconfig(storage)
@@ -57,15 +53,9 @@ Camera and recorder function supported library for development.
 
 
 %build
-%if %{with wayland}
-export CFLAGS+=" -DHAVE_WAYLAND -DGST_USE_UNSTABLE_API"
-%endif
-export CFLAGS+=" -D_LARGEFILE64_SOURCE -DSYSCONFDIR=\\\"%{_sysconfdir}\\\" -DTZ_SYS_ETC=\\\"%{TZ_SYS_ETC}\\\""
+export CFLAGS+=" -D_LARGEFILE64_SOURCE -DGST_USE_UNSTABLE_API -DSYSCONFDIR=\\\"%{_sysconfdir}\\\" -DTZ_SYS_ETC=\\\"%{TZ_SYS_ETC}\\\""
 ./autogen.sh
 %configure \
-%if %{with wayland}
-       --enable-wayland \
-%endif
 %if "%{TIZEN_PRODUCT_TV}" != "1"
        --enable-murphy \
 %else
index 6e10e96..752719c 100644 (file)
@@ -38,6 +38,7 @@ libmmfcamcorder_la_CFLAGS = -I$(srcdir)/include \
                             $(GST_PLUGIN_BASE_CFLAGS) \
                             $(GST_VIDEO_CFLAGS) \
                             $(GST_APP_CFLAGS) \
+                            $(GST_WAYLAND_CFLAGS) \
                             $(EXIF_CFLAGS) \
                             $(MM_COMMON_CFLAGS) \
                             $(MMSOUND_CFLAGS) \
@@ -57,6 +58,7 @@ libmmfcamcorder_la_LIBADD = \
                            $(GST_PLUGIN_BASE_LIBS) \
                            $(GST_VIDEO_LIBS) \
                            $(GST_APP_LIBS) \
+                           $(GST_WAYLAND_LIBS) \
                            $(MM_COMMON_LIBS) \
                            $(EXIF_LIBS) \
                            $(MMSOUND_LIBS) \
@@ -73,11 +75,6 @@ libmmfcamcorder_la_CFLAGS += -fdata-sections -ffunction-sections -Wl,--gc-sectio
 libmmfcamcorder_la_LDFLAGS = -Wl,--gc-sections
 libmmfcamcorder_la_LIBADD += $(SYSTEMINFO_LIBS)
 
-if WAYLAND_SUPPORT
-libmmfcamcorder_la_CFLAGS += $(GST_WAYLAND_CFLAGS)
-libmmfcamcorder_la_LIBADD += $(GST_WAYLAND_LIBS)
-endif
-
 if MURPHY_SUPPORT
 libmmfcamcorder_la_SOURCES += mm_camcorder_resource.c
 libmmfcamcorder_la_CFLAGS += $(MURPHY_RESOURCE_CFLAGS) $(MURPHY_GLIB_CFLAGS) -D_MMCAMCORDER_MURPHY_SUPPORT
index 494d517..c9ad54e 100644 (file)
@@ -1276,12 +1276,19 @@ extern "C" {
  * The type of PTZ(Pan Tilt Zoom). Mechanical or Electonic PTZ.
  */
 #define MMCAM_CAMERA_PTZ_TYPE                   "camera-ptz-type"
+
 /**
  * Stream type and index for sound route
  */
 #define MMCAM_SOUND_STREAM_TYPE                 "sound-stream-type"
 #define MMCAM_SOUND_STREAM_INDEX                "sound-stream-index"
 
+/**
+ * The display reuse flag and sink element pointer
+ */
+#define MMCAM_DISPLAY_REUSE_HINT                "display-reuse-hint"
+#define MMCAM_DISPLAY_REUSE_ELEMENT             "display-reuse-element"
+
 /*=======================================================================================
 | ENUM DEFINITIONS                                                                     |
 ========================================================================================*/
@@ -1822,7 +1829,6 @@ typedef struct _MMCamFaceDetectInfo {
        MMCamFaceInfo *face_info;               /**< face information, this should be freed after use it. */
 } MMCamFaceDetectInfo;
 
-#ifdef HAVE_WAYLAND
 /**
  * Wayland information
  */
@@ -1834,7 +1840,7 @@ typedef struct _MMCamWaylandInfo {
        int window_height;
        void *evas_obj;
 } MMCamWaylandInfo;
-#endif /* HAVE_WAYLAND */
+
 
 /*=======================================================================================
 | TYPE DEFINITIONS                                                                     |
index fc63974..65601e6 100644 (file)
@@ -184,6 +184,8 @@ typedef enum
        MM_CAM_ROOT_DIRECTORY,
        MM_CAM_SOUND_STREAM_TYPE,
        MM_CAM_SOUND_STREAM_INDEX,
+       MM_CAM_DISPLAY_REUSE_HINT,
+       MM_CAM_DISPLAY_REUSE_ELEMENT,
        MM_CAM_ATTRIBUTE_NUM
 }MMCamcorderAttrsID;
 
index 77e1099..6b35d1c 100644 (file)
@@ -189,6 +189,24 @@ extern "C" {
                elist = g_list_append(elist, &(element[eid])); \
        }
 
+#define _MMCAMCORDER_ELEMENT_ADD(sub_context, element, eid, gst_element, elist, err) \
+       if (element[eid].gst != NULL) { \
+               _mmcam_dbg_err("The element is existed. element_id=[%d]", eid); \
+               gst_object_unref(element[eid].gst); \
+       } \
+       element[eid].gst = gst_element; \
+       if (element[eid].gst == NULL) { \
+               _mmcam_dbg_err("Element is NULL. element_id=[%d]", eid); \
+               err = MM_ERROR_CAMCORDER_RESOURCE_CREATION; \
+               goto pipeline_creation_error; \
+       } else { \
+               _mmcam_dbg_log("Adding Element is done. element_id=[%d] %p", eid, gst_element); \
+               element[eid].id = eid; \
+               g_object_weak_ref(G_OBJECT(element[eid].gst), (GWeakNotify)_mmcamcorder_element_release_noti, sub_context); \
+               err = MM_ERROR_NONE; \
+       } \
+       elist = g_list_append(elist, &(element[eid]));
+
 #define _MMCAMCORDER_ENCODEBIN_ELMGET(sub_context, eid, name /*char* */, err) \
        if (sub_context->encode_element[eid].gst != NULL) { \
                _mmcam_dbg_err("The element is existed. element_id=[%d], name=[%s]", eid, name); \
@@ -567,7 +585,7 @@ typedef enum {
  */
 typedef enum {
        _MMCAMCORDER_STATE_CHANGE_NORMAL = 0,
-       _MMCAMCORDER_STATE_CHANGE_BY_ASM,
+       _MMCAMCORDER_STATE_CHANGE_BY_FOCUS,
        _MMCAMCORDER_STATE_CHANGE_BY_RM,
        _MMCAMCORDER_STATE_CHANGE_BY_DPM
 } _MMCamcorderStateChange;
index 4a10fb8..6a72c7a 100644 (file)
@@ -29,9 +29,7 @@
 #include <gst/video/colorbalance.h>
 #include <gst/video/cameracontrol.h>
 #include <gst/video/videooverlay.h>
-#ifdef HAVE_WAYLAND
 #include <gst/wayland/wayland.h>
-#endif
 
 /*-----------------------------------------------------------------------
 |    MACRO DEFINITIONS:                                                        |
@@ -1556,6 +1554,28 @@ _mmcamcorder_alloc_attribute( MMHandleType handle, MMCamPreset *info )
                        {.int_min = -1},
                        {.int_max = _MMCAMCORDER_MAX_INT},
                        _mmcamcorder_commit_sound_stream_info,
+               },
+               {
+                       MM_CAM_DISPLAY_REUSE_HINT,
+                       "display-reuse-hint",
+                       MMF_VALUE_TYPE_INT,
+                       MM_ATTRS_FLAG_RW,
+                       {(void*)FALSE},
+                       MM_ATTRS_VALID_TYPE_INT_RANGE,
+                       {.int_min = FALSE},
+                       {.int_max = TRUE},
+                       NULL,
+               },
+               {
+                       MM_CAM_DISPLAY_REUSE_ELEMENT,
+                       "display-reuse-element",
+                       MMF_VALUE_TYPE_DATA,
+                       MM_ATTRS_FLAG_RW,
+                       {(void*)NULL},
+                       MM_ATTRS_VALID_TYPE_NONE,
+                       {0},
+                       {0},
+                       NULL,
                }
        };
 
@@ -3542,7 +3562,6 @@ bool _mmcamcorder_commit_display_handle(MMHandleType handle, int attr_idx, const
                           !strcmp(videosink_name, "evaspixmapsink")) {
                        _mmcam_dbg_log("Commit : Set evas object [%p]", p_handle);
                        MMCAMCORDER_G_OBJECT_SET_POINTER(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "evas-object", p_handle);
-#ifdef HAVE_WAYLAND
                } else if (!strcmp(videosink_name, "waylandsink")) {
                        MMCamWaylandInfo *wl_info = (MMCamWaylandInfo *)p_handle;
 
@@ -3551,7 +3570,6 @@ bool _mmcamcorder_commit_display_handle(MMHandleType handle, int attr_idx, const
                        gst_video_overlay_set_wl_window_wl_surface_id(GST_VIDEO_OVERLAY(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst), (guintptr)wl_info->global_surface_id);
                        gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst),
                                wl_info->window_x, wl_info->window_y, wl_info->window_width, wl_info->window_height);
-#endif /* HAVE_WAYLAND */
                } else {
                        _mmcam_dbg_warn("Commit : Nothing to commit with this element[%s]", videosink_name);
                        return FALSE;
index ac17df3..5d4c8ba 100644 (file)
@@ -25,9 +25,7 @@
 #include <gst/audio/audio-format.h>
 #include <gst/video/videooverlay.h>
 #include <gst/video/cameracontrol.h>
-#ifdef HAVE_WAYLAND
 #include <gst/wayland/wayland.h>
-#endif
 
 #include <sys/time.h>
 #include <unistd.h>
@@ -187,6 +185,8 @@ int _mmcamcorder_create_preview_elements(MMHandleType handle)
        int decoder_index = 0;
        char decoder_name[20] = {'\0',};
 #endif /* _MMCAMCORDER_RM_SUPPORT */
+       GstElement *sink_element = NULL;
+       int sink_element_size = 0;
 
        GList *element_list = NULL;
 
@@ -372,7 +372,6 @@ int _mmcamcorder_create_preview_elements(MMHandleType handle)
 
                g_object_set(G_OBJECT(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst), "socket-path", socket_path, NULL);
        } else {
-
                if (hcamcorder->use_videoconvert && !strcmp(videosink_name, "waylandsink")) {
                        /* get video convert name */
                        _mmcamcorder_conf_get_value_element_name(sc->VideoconvertElement, &videoconvert_name);
@@ -384,9 +383,36 @@ int _mmcamcorder_create_preview_elements(MMHandleType handle)
                                _mmcam_dbg_err("failed to get videoconvert element name");
                }
 
-               _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSINK_SINK, videosink_name, "videosink_sink", element_list, err);
+               /* check sink element in attribute */
+               mm_camcorder_get_attributes(handle, NULL,
+                       MMCAM_DISPLAY_REUSE_ELEMENT, &sink_element, &sink_element_size,
+                       NULL);
 
-               _mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, sc->VideosinkElement);
+               if (sink_element) {
+                       int attr_index = 0;
+                       mmf_attrs_t *attrs = MMF_CAMCORDER_ATTRS(handle);
+                       mmf_attribute_t *attr_item = NULL;
+
+                       _mmcam_dbg_log("reuse sink element %p in attribute", sink_element);
+
+                       _MMCAMCORDER_ELEMENT_ADD(sc, sc->element, _MMCAMCORDER_VIDEOSINK_SINK, sink_element, element_list, err);
+
+                       /* reset attribute */
+                       if (attrs) {
+                               mm_attrs_get_index((MMHandleType)attrs, MMCAM_DISPLAY_REUSE_ELEMENT, &attr_index);
+                               attr_item = &attrs->items[attr_index];
+                               mmf_attribute_set_data(attr_item, NULL, 0);
+                               mmf_attribute_commit(attr_item);
+                       } else {
+                               _mmcam_dbg_warn("attribute is NULL");
+                               err = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
+                               goto pipeline_creation_error;
+                       }
+               } else {
+                       _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSINK_SINK, videosink_name, "videosink_sink", element_list, err);
+
+                       _mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, sc->VideosinkElement);
+               }
 
                if (_mmcamcorder_videosink_window_set(handle, sc->VideosinkElement) != MM_ERROR_NONE) {
                        _mmcam_dbg_err("_mmcamcorder_videosink_window_set error");
@@ -1332,7 +1358,6 @@ int _mmcamcorder_videosink_window_set(MMHandleType handle, type_element* Videosi
                        _mmcam_dbg_err("display handle(eavs object) is NULL");
                        return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
                }
-#ifdef HAVE_WAYLAND
        } else if (!strcmp(videosink_name, "waylandsink")) {
                MMCamWaylandInfo *wl_info = (MMCamWaylandInfo *)overlay;
                if (wl_info) {
@@ -1341,15 +1366,14 @@ int _mmcamcorder_videosink_window_set(MMHandleType handle, type_element* Videosi
                        gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(vsink),
                                wl_info->window_x, wl_info->window_y, wl_info->window_width, wl_info->window_height);
 #ifdef _MMCAMCORDER_RM_SUPPORT
-               if (hcamcorder->request_resources.category_id[0] == RM_CATEGORY_VIDEO_DECODER_SUB)
-                       display_scaler = 1;
+                       if (hcamcorder->request_resources.category_id[0] == RM_CATEGORY_VIDEO_DECODER_SUB)
+                               display_scaler = 1;
 
-               MMCAMCORDER_G_OBJECT_SET(vsink, "device-scaler", display_scaler);
+                       MMCAMCORDER_G_OBJECT_SET(vsink, "device-scaler", display_scaler);
 #endif /* _MMCAMCORDER_RM_SUPPORT */
                } else {
                        _mmcam_dbg_warn("Handle is NULL. skip setting.");
                }
-#endif /* HAVE_WAYLAND */
        } else {
                _mmcam_dbg_warn("Who are you?? (Videosink: %s)", videosink_name);
        }
index 528f188..1115cc5 100644 (file)
@@ -638,6 +638,8 @@ int _mmcamcorder_destroy(MMHandleType handle)
 #ifdef _MMCAMCORDER_RM_SUPPORT
        int iret = RM_OK;
 #endif /* _MMCAMCORDER_RM_SUPPORT */
+       GstElement *sink_element = NULL;
+       int sink_element_size = 0;
 
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
@@ -669,6 +671,19 @@ int _mmcamcorder_destroy(MMHandleType handle)
        g_cond_signal(&hcamcorder->task_thread_cond);
        g_mutex_unlock(&hcamcorder->task_thread_lock);
 
+       /* remove kept, but not used sink element in attribute */
+       mm_camcorder_get_attributes(handle, NULL,
+               MMCAM_DISPLAY_REUSE_ELEMENT, &sink_element, &sink_element_size,
+               NULL);
+       if (sink_element) {
+               GstStateChangeReturn result = gst_element_set_state(sink_element, GST_STATE_NULL);
+
+               _mmcam_dbg_warn("remove sink element %p, set state NULL result %d", sink_element, result);
+
+               gst_object_unref(sink_element);
+               sink_element = NULL;
+       }
+
        /* wait for completion of sound play */
        _mmcamcorder_sound_solo_play_wait(handle);
 
@@ -1376,7 +1391,7 @@ int _mmcamcorder_unrealize(MMHandleType handle)
                               hcamcorder->state_change_by_system, hcamcorder->session_flags, hcamcorder->acquired_focus,
                               hcamcorder->sound_focus_id, hcamcorder->sound_focus_watch_id);
 
-               if (hcamcorder->state_change_by_system != _MMCAMCORDER_STATE_CHANGE_BY_ASM &&
+               if (hcamcorder->state_change_by_system != _MMCAMCORDER_STATE_CHANGE_BY_FOCUS &&
                    hcamcorder->sound_focus_watch_id > 0) {
                        ret_sound = mm_sound_unset_focus_watch_callback(hcamcorder->sound_focus_watch_id);
                        if (ret_sound != MM_ERROR_NONE) {
@@ -2552,7 +2567,7 @@ void _mmcamcorder_set_state(MMHandleType handle, int state)
 
                /* To discern who changes the state */
                switch (hcamcorder->state_change_by_system) {
-               case _MMCAMCORDER_STATE_CHANGE_BY_ASM:
+               case _MMCAMCORDER_STATE_CHANGE_BY_FOCUS:
                        msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED_BY_ASM;
                        msg.param.state.code = hcamcorder->interrupt_code;
                        break;
@@ -3297,7 +3312,7 @@ void _mmcamcorder_sound_focus_cb(int id, mm_sound_focus_type_e focus_type,
        _MMCAMCORDER_LOCK_ASM(hcamcorder);
 
        /* set value to inform a status is changed by asm */
-       hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_BY_ASM;
+       hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_BY_FOCUS;
 
        /* check the reason */
        if (!strncmp(reason_for_change, "ringtone-voip", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN) ||
@@ -3371,7 +3386,7 @@ void _mmcamcorder_sound_focus_watch_cb(mm_sound_focus_type_e focus_type, mm_soun
        _MMCAMCORDER_LOCK_ASM(hcamcorder);
 
        /* set value to inform a status is changed by asm */
-       hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_BY_ASM;
+       hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_BY_FOCUS;
 
        /* check the reason */
        if (!strncmp(reason_for_change, "ringtone-voip", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN) ||
@@ -4306,4 +4321,4 @@ rm_cb_result _mmcamcorder_rm_callback(int handle, rm_callback_type event_src,
 
     return cb_res;
 }
-#endif /* _MMCAMCORDER_RM_SUPPORT */
\ No newline at end of file
+#endif /* _MMCAMCORDER_RM_SUPPORT */
index c713058..648f3c1 100644 (file)
@@ -211,6 +211,11 @@ void _mmcamcorder_destroy_video_capture_pipeline(MMHandleType handle)
 {
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderSubContext *sc = NULL;
+       int display_reuse_hint = FALSE;
+       GstElement *sink_element = NULL;
+       mmf_attrs_t *attrs = NULL;
+       int attr_index = 0;
+       mmf_attribute_t *attr_item = NULL;
 
        mmf_return_if_fail(hcamcorder);
 
@@ -223,6 +228,50 @@ void _mmcamcorder_destroy_video_capture_pipeline(MMHandleType handle)
                MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_QUE].gst, "empty-buffers", TRUE);
                MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", TRUE);
 
+               /* check reuse flag for display element */
+               mm_camcorder_get_attributes(handle, NULL,
+                       MMCAM_DISPLAY_REUSE_HINT, &display_reuse_hint,
+                       NULL);
+
+               _mmcam_dbg_log("display reuse hint %d", display_reuse_hint);
+
+               if (!display_reuse_hint)
+                       goto _REUSE_CHECK_DONE;
+
+               sink_element = sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst;
+               if (!sink_element) {
+                       _mmcam_dbg_warn("sink element is NULL");
+                       goto _REUSE_CHECK_DONE;
+               }
+
+               attrs = (mmf_attrs_t *)MMF_CAMCORDER_ATTRS(handle);
+               if (!attrs) {
+                       _mmcam_dbg_warn("attribute is NULL");
+                       goto _REUSE_CHECK_DONE;
+               }
+
+               _mmcam_dbg_log("REF sink element %p and set it to attribute", sink_element);
+
+               /* ref element before remove it from pipeline */
+               gst_object_ref(sink_element);
+
+               if (!gst_bin_remove(GST_BIN(sc->element[_MMCAMCORDER_MAIN_PIPE].gst), sink_element)) {
+                       _mmcam_dbg_warn("failed to remove sink element from pipeline");
+               }
+
+               /* set sink element pointer to attribute */
+               mm_attrs_get_index((MMHandleType)attrs, MMCAM_DISPLAY_REUSE_ELEMENT, &attr_index);
+               attr_item = &attrs->items[attr_index];
+               mmf_attribute_set_data(attr_item, (void *)sink_element, sizeof(sink_element));
+               mmf_attribute_commit(attr_item);
+
+               /* remove notify callback */
+               g_object_weak_unref(G_OBJECT(sink_element), (GWeakNotify)_mmcamcorder_element_release_noti, sc);
+
+               sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst = NULL;
+               sc->element[_MMCAMCORDER_VIDEOSINK_SINK].id = _MMCAMCORDER_NONE;
+
+_REUSE_CHECK_DONE:
                traceBegin(TTRACE_TAG_CAMERA, "MMCAMCORDER:UNREALIZE:SET_NULL_TO_PIPELINE");
 
                _mmcamcorder_gst_set_state(handle, sc->element[_MMCAMCORDER_MAIN_PIPE].gst, GST_STATE_NULL);
@@ -796,6 +845,7 @@ int _mmcamcorder_image_cmd_preview_stop(MMHandleType handle)
        int ret = MM_ERROR_NONE;
        int strobe_mode = MM_CAMCORDER_STROBE_MODE_OFF;
        int set_strobe = 0;
+       int display_reuse_hint = FALSE;
        GstCameraControl *control = NULL;
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
@@ -840,8 +890,13 @@ int _mmcamcorder_image_cmd_preview_stop(MMHandleType handle)
                _mmcamcorder_remove_recorder_pipeline(handle);
        }
 
-       /* Disable skip flush buffer  */
-       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "enable-flush-buffer", FALSE);
+       mm_camcorder_get_attributes(handle, NULL,
+               MMCAM_DISPLAY_REUSE_HINT, &display_reuse_hint,
+               NULL);
+
+       _mmcam_dbg_log("display reuse hint %d", display_reuse_hint);
+
+       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "keep-camera-preview", display_reuse_hint);
 
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_QUE].gst, "empty-buffers", TRUE);
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", TRUE);
@@ -855,8 +910,8 @@ int _mmcamcorder_image_cmd_preview_stop(MMHandleType handle)
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_QUE].gst, "empty-buffers", FALSE);
 
-       /* Enable skip flush buffer  */
-       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "enable-flush-buffer", TRUE);
+       if (display_reuse_hint)
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "keep-camera-preview", FALSE);
 
        /* deregister sound status callback */
        if (sc->info_image->sound_status != _SOUND_STATUS_INIT) {
@@ -1247,7 +1302,7 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstSample *sampl
        }
 
        /* Screennail image buffer */
-       attrs = (mmf_attrs_t*)MMF_CAMCORDER_ATTRS(hcamcorder);
+       attrs = (mmf_attrs_t *)MMF_CAMCORDER_ATTRS(hcamcorder);
        mm_attrs_get_index((MMHandleType)attrs, MMCAM_CAPTURED_SCREENNAIL, &attr_index);
        item_screennail = &attrs->items[attr_index];
 
index 47fcb39..9013d21 100644 (file)
@@ -1135,7 +1135,7 @@ int _mmcamcorder_video_handle_eos(MMHandleType handle)
 
        _mmcam_dbg_err("");
 
-       if (hcamcorder->state_change_by_system != _MMCAMCORDER_STATE_CHANGE_BY_ASM) {
+       if (hcamcorder->state_change_by_system != _MMCAMCORDER_STATE_CHANGE_BY_FOCUS) {
                /* Play record stop sound */
                _mmcamcorder_sound_solo_play(handle, _MMCAMCORDER_SAMPLE_SOUND_NAME_REC_STOP, FALSE);
        } else {
@@ -1269,7 +1269,7 @@ int _mmcamcorder_video_handle_eos(MMHandleType handle)
        info->filesize = 0;
        info->b_commiting = FALSE;
 
-       if (hcamcorder->state_change_by_system != _MMCAMCORDER_STATE_CHANGE_BY_ASM) {
+       if (hcamcorder->state_change_by_system != _MMCAMCORDER_STATE_CHANGE_BY_FOCUS) {
                /* check recording stop sound */
                _mmcamcorder_sound_solo_play_wait(handle);
        }