From: Jeongmo Yang Date: Thu, 7 Jul 2016 07:20:09 +0000 (+0900) Subject: [Release version 0.10.62] Add new attributes for reuse display, Remove unnecessary... X-Git-Tag: submit/tizen/20160712.021942~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d998f554c0855ac2043deeb005ea9a960a933b34;p=platform%2Fcore%2Fmultimedia%2Flibmm-camcorder.git [Release version 0.10.62] Add new attributes for reuse display, Remove unnecessary feature Change-Id: Ia5550be9c333ea839bf8028c0bc76bea502307fd Signed-off-by: Jeongmo Yang --- diff --git a/configure.ac b/configure.ac index 11e4a98..c9444a7 100644 --- a/configure.ac +++ b/configure.ac @@ -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) diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index 2efda55..2967b69 100644 --- a/packaging/libmm-camcorder.spec +++ b/packaging/libmm-camcorder.spec @@ -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 diff --git a/src/Makefile.am b/src/Makefile.am index 6e10e96..752719c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 diff --git a/src/include/mm_camcorder.h b/src/include/mm_camcorder.h index 494d517..c9ad54e 100644 --- a/src/include/mm_camcorder.h +++ b/src/include/mm_camcorder.h @@ -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 | diff --git a/src/include/mm_camcorder_attribute.h b/src/include/mm_camcorder_attribute.h index fc63974..65601e6 100644 --- a/src/include/mm_camcorder_attribute.h +++ b/src/include/mm_camcorder_attribute.h @@ -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; diff --git a/src/include/mm_camcorder_internal.h b/src/include/mm_camcorder_internal.h index 77e1099..6b35d1c 100644 --- a/src/include/mm_camcorder_internal.h +++ b/src/include/mm_camcorder_internal.h @@ -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; diff --git a/src/mm_camcorder_attribute.c b/src/mm_camcorder_attribute.c index 4a10fb8..6a72c7a 100644 --- a/src/mm_camcorder_attribute.c +++ b/src/mm_camcorder_attribute.c @@ -29,9 +29,7 @@ #include #include #include -#ifdef HAVE_WAYLAND #include -#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; diff --git a/src/mm_camcorder_gstcommon.c b/src/mm_camcorder_gstcommon.c index ac17df3..5d4c8ba 100644 --- a/src/mm_camcorder_gstcommon.c +++ b/src/mm_camcorder_gstcommon.c @@ -25,9 +25,7 @@ #include #include #include -#ifdef HAVE_WAYLAND #include -#endif #include #include @@ -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); } diff --git a/src/mm_camcorder_internal.c b/src/mm_camcorder_internal.c index 528f188..1115cc5 100644 --- a/src/mm_camcorder_internal.c +++ b/src/mm_camcorder_internal.c @@ -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 */ diff --git a/src/mm_camcorder_stillshot.c b/src/mm_camcorder_stillshot.c index c713058..648f3c1 100644 --- a/src/mm_camcorder_stillshot.c +++ b/src/mm_camcorder_stillshot.c @@ -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]; diff --git a/src/mm_camcorder_videorec.c b/src/mm_camcorder_videorec.c index 47fcb39..9013d21 100644 --- a/src/mm_camcorder_videorec.c +++ b/src/mm_camcorder_videorec.c @@ -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); }