From 1f695c046648c0285a0e5cacd1f5655405f5a08c Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Fri, 6 Nov 2015 18:30:33 +0900 Subject: [PATCH] Release version 0.10.16 1. Remove build warnings 2. Disable idle callback 3. Add new code for client API - display setting 4. Support REMOTE display type Change-Id: Ida1b0b3c57906b331ac1a12b0e3935581e09715d Signed-off-by: Jeongmo Yang --- packaging/libmm-camcorder.spec | 10 +++--- src/include/mm_camcorder_internal.h | 2 ++ src/include/mm_camcorder_platform.h | 11 +++++- src/include/mm_camcorder_util.h | 2 ++ src/mm_camcorder_client.c | 71 ++++++++++++++++++++++++++++++++++--- src/mm_camcorder_configure.c | 11 +++++- src/mm_camcorder_gstcommon.c | 30 ++++++++++------ src/mm_camcorder_internal.c | 7 ++-- src/mm_camcorder_platform.c | 31 ++++++++-------- src/mm_camcorder_util.c | 50 ++++++++++++++++++++++++-- 10 files changed, 183 insertions(+), 42 deletions(-) diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index 3122e77..227c624 100644 --- a/packaging/libmm-camcorder.spec +++ b/packaging/libmm-camcorder.spec @@ -2,8 +2,8 @@ Name: libmm-camcorder Summary: Camera and recorder library -Version: 0.10.15 -Release: 1 +Version: 0.10.16 +Release: 0 Group: Multimedia/Libraries License: Apache-2.0 Source0: %{name}-%{version}.tar.gz @@ -32,17 +32,17 @@ BuildRequires: pkgconfig(libtbm) BuildRequires: pkgconfig(storage) %description -Camera and recorder library. +Camera and recorder function supported library. %package devel -Summary: Camera and recorder development library +Summary: Camera and recorder library for development Group: libdevel Version: %{version} Requires: %{name} = %{version}-%{release} %description devel -Camera and recorder development library. +Camera and recorder function supported library for development. %prep diff --git a/src/include/mm_camcorder_internal.h b/src/include/mm_camcorder_internal.h index d186afc..e657e0b 100644 --- a/src/include/mm_camcorder_internal.h +++ b/src/include/mm_camcorder_internal.h @@ -628,7 +628,9 @@ typedef struct mmf_camcorder { GList *buffer_probes; /**< a list of buffer probe handle */ GList *event_probes; /**< a list of event probe handle */ GList *signals; /**< a list of signal handle */ +#ifdef _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK GList *msg_data; /**< a list of msg data */ +#endif /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */ camera_conf *conf_main; /**< Camera configure Main structure */ camera_conf *conf_ctrl; /**< Camera configure Control structure */ guint pipeline_cb_event_id; /**< Event source ID of pipeline message callback */ diff --git a/src/include/mm_camcorder_platform.h b/src/include/mm_camcorder_platform.h index c2196e6..d74c8cf 100644 --- a/src/include/mm_camcorder_platform.h +++ b/src/include/mm_camcorder_platform.h @@ -37,6 +37,8 @@ extern "C" { /*======================================================================================= | GLOBAL DEFINITIONS AND DECLARATIONS FOR CAMCORDER | ========================================================================================*/ +#define MM_CAMCORDER_ATTR_NONE -1 + /*======================================================================================= | MACRO DEFINITIONS | @@ -182,6 +184,12 @@ typedef enum { ENUM_CONVERT_NUM } MMCamConvertingEnum; +typedef enum { + MM_CAMCONVERT_CATEGORY_CAMERA = 1 << 0, + MM_CAMCONVERT_CATEGORY_DISPLAY = 1 << 1, + MM_CAMCONVERT_CATEGORY_AUDIO = 1 << 2 +} MMCamConvertingCategory; + /*======================================================================================= | STRUCTURE DEFINITIONS | ========================================================================================*/ @@ -230,12 +238,13 @@ int _mmcamcorder_get_fps_array_by_resolution(MMHandleType handle, int width, int int _mmcamcorder_set_converted_value(MMHandleType handle, _MMCamcorderEnumConvert *convert); int _mmcamcorder_init_convert_table(MMHandleType handle); -int _mmcamcorder_init_attr_from_configure(MMHandleType handle, int type); +int _mmcamcorder_init_attr_from_configure(MMHandleType handle, MMCamConvertingCategory category); int _mmcamcorder_convert_brightness(int mslVal); int _mmcamcorder_convert_whitebalance(int mslVal); int _mmcamcorder_convert_colortone(int mslVal); double _mmcamcorder_convert_volume(int mslVal); +int __mmcamcorder_set_info_to_attr(MMHandleType handle, _MMCamcorderInfoConverting *info, int table_size); #ifdef __cplusplus } diff --git a/src/include/mm_camcorder_util.h b/src/include/mm_camcorder_util.h index 62a5821..7220a2d 100644 --- a/src/include/mm_camcorder_util.h +++ b/src/include/mm_camcorder_util.h @@ -234,7 +234,9 @@ gboolean _mmcamcorder_link_elements(GList *element_list); gboolean _mmcamcorder_filtered_link_elements(GList *element_list, GstCaps *caps); /* Message */ +#ifdef _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK gboolean _mmcamcorder_msg_callback(void *data); +#endif /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */ gboolean _mmcamcorder_send_message(MMHandleType handle, _MMCamcorderMsgItem *data); void _mmcamcorder_remove_message_all(MMHandleType handle); diff --git a/src/mm_camcorder_client.c b/src/mm_camcorder_client.c index bde0d82..a57cb83 100644 --- a/src/mm_camcorder_client.c +++ b/src/mm_camcorder_client.c @@ -47,6 +47,37 @@ #include +static _MMCamcorderInfoConverting g_client_display_info[] = { + { + CONFIGURE_TYPE_MAIN, + CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT, + MM_CAM_CLIENT_DISPLAY_DEVICE, + MM_CAMCORDER_ATTR_NONE, + "DisplayDevice", + MM_CAMCONVERT_TYPE_INT_ARRAY, + NULL, + }, + { + CONFIGURE_TYPE_MAIN, + CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT, + MM_CAM_CLIENT_DISPLAY_MODE, + MM_CAMCORDER_ATTR_NONE, + "DisplayMode", + MM_CAMCONVERT_TYPE_INT_ARRAY, + NULL, + }, + { + CONFIGURE_TYPE_MAIN, + CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT, + MM_CAM_CLIENT_DISPLAY_SURFACE, + MM_CAMCORDER_ATTR_NONE, + "Videosink", + MM_CAMCONVERT_TYPE_INT_ARRAY, + NULL, + }, +}; + + static int _storage_device_supported_cb(int storage_id, storage_type_e type, storage_state_e state, const char *path, void *user_data) { char **root_directory = (char **)user_data; @@ -702,8 +733,31 @@ int _mmcamcorder_client_videosink_window_set(MMHandleType handle, type_element* return MM_ERROR_NONE; } -MMHandleType -_mmcamcorder_client_alloc_attribute(MMHandleType handle) +int _mmcamcorder_client_init_attr_from_configure(MMHandleType handle) +{ + mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); + _MMCamcorderInfoConverting *info = NULL; + + int table_size = 0; + int ret = MM_ERROR_NONE; + + mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED); + + /* Initialize attribute related to display */ + info = g_client_display_info; + table_size = sizeof(g_client_display_info) / sizeof(_MMCamcorderInfoConverting); + ret = __mmcamcorder_set_info_to_attr(handle, info, table_size); + if (ret != MM_ERROR_NONE) { + _mmcam_dbg_err("display info set error : 0x%x", ret); + return ret; + } + + _mmcam_dbg_log("done"); + + return ret; +} + +MMHandleType _mmcamcorder_client_alloc_attribute(MMHandleType handle) { _mmcam_dbg_log( "" ); @@ -1178,9 +1232,9 @@ int _mmcamcorder_client_create_preview_elements(MMHandleType handle, const char _mmcam_dbg_err("shm src socket path : %s", socket_path); g_object_set(sc->element[_MMCAMCORDER_CLIENT_VIDEOSRC_SRC].gst, - "socket-path", socket_path, - "is-live", TRUE, - NULL); + "socket-path", socket_path, + "is-live", TRUE, + NULL); /* Making Video sink from here */ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_CLIENT_VIDEOSINK_QUE, "queue", "videosink_queue", element_list, ret); @@ -1501,6 +1555,13 @@ int mm_camcorder_client_create(MMHandleType *handle) goto _ERR_DEFAULT_VALUE_INIT; } + ret = _mmcamcorder_client_init_attr_from_configure((MMHandleType)hcamcorder); + if (ret != MM_ERROR_NONE) { + _mmcam_dbg_warn("client_init_attr_from_configure error!!"); + ret = MM_ERROR_CAMCORDER_INTERNAL; + goto _ERR_DEFAULT_VALUE_INIT; + } + /* Set initial state */ _mmcamcorder_set_state((MMHandleType)hcamcorder, MM_CAMCORDER_STATE_NULL); diff --git a/src/mm_camcorder_configure.c b/src/mm_camcorder_configure.c index 4fa2fba..d42b5eb 100644 --- a/src/mm_camcorder_configure.c +++ b/src/mm_camcorder_configure.c @@ -140,6 +140,14 @@ void _mmcamcorder_conf_init(MMHandleType handle, int type, camera_conf** configu __videosink_default_string_array, sizeof( __videosink_default_string_array ) / sizeof( type_string* ), }; + static type_element _videosink_element_remote_default = { + "VideosinkElementRemote", + "shmsink", + __videosink_default_int_array, + sizeof( __videosink_default_int_array ) / sizeof( type_int* ), + __videosink_default_string_array, + sizeof( __videosink_default_string_array ) / sizeof( type_string* ), + }; static type_element _videosink_element_null_default = { "VideosinkElementNull", "fakesink", @@ -635,6 +643,7 @@ void _mmcamcorder_conf_init(MMHandleType handle, int type, camera_conf** configu { "VideosinkElementX", CONFIGURE_VALUE_ELEMENT, {&_videosink_element_x_default} }, { "VideosinkElementEvas", CONFIGURE_VALUE_ELEMENT, {&_videosink_element_evas_default} }, { "VideosinkElementGL", CONFIGURE_VALUE_ELEMENT, {&_videosink_element_gl_default} }, + { "VideosinkElementRemote",CONFIGURE_VALUE_ELEMENT, {&_videosink_element_remote_default} }, { "VideosinkElementNull", CONFIGURE_VALUE_ELEMENT, {&_videosink_element_null_default} }, { "UseVideoscale", CONFIGURE_VALUE_INT, {.value_int = 0} }, { "VideoscaleElement", CONFIGURE_VALUE_ELEMENT, {&_videoscale_element_default} }, @@ -854,7 +863,7 @@ void _mmcamcorder_conf_init(MMHandleType handle, int type, camera_conf** configu (*configure_info)->info = (conf_detail**)g_malloc0( sizeof( conf_detail* ) * CONFIGURE_CATEGORY_MAIN_NUM ); for (i = 0 ; i < CONFIGURE_CATEGORY_MAIN_NUM ; i++) { - (*configure_info)->info[i] = NULL; + (*configure_info)->info[i] = NULL; } } else { hcamcorder->conf_ctrl_info_table[CONFIGURE_CATEGORY_CTRL_CAMERA] = conf_ctrl_camera_table; diff --git a/src/mm_camcorder_gstcommon.c b/src/mm_camcorder_gstcommon.c index 8f47dca..5d4e253 100644 --- a/src/mm_camcorder_gstcommon.c +++ b/src/mm_camcorder_gstcommon.c @@ -178,6 +178,7 @@ int _mmcamcorder_create_preview_elements(MMHandleType handle) int capture_jpg_quality = 100; int video_stabilization = 0; int anti_shake = 0; + int display_surface_type = MM_DISPLAY_SURFACE_NULL; const char *videosrc_name = NULL; const char *videosink_name = NULL; char *err_name = NULL; @@ -234,6 +235,7 @@ int _mmcamcorder_create_preview_elements(MMHandleType handle) MMCAM_IMAGE_ENCODER, &codectype, MMCAM_IMAGE_ENCODER_QUALITY, &capture_jpg_quality, MMCAM_DISPLAY_SHM_SOCKET_PATH, &socket_path, &socket_path_len, + MMCAM_DISPLAY_SURFACE, &display_surface_type, NULL); if (err != MM_ERROR_NONE) { _mmcam_dbg_warn("Get attrs fail. (%s:%x)", err_name, err); @@ -301,20 +303,26 @@ int _mmcamcorder_create_preview_elements(MMHandleType handle) _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSINK_QUE, "queue", "videosink_queue", element_list, err); _mmcam_dbg_log("videosink_name: %s", videosink_name); - if (strcmp(videosink_name, "fakesink") == 0) { - _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 (display_surface_type == MM_DISPLAY_SURFACE_REMOTE) { + _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSINK_SINK, videosink_name, "ipc_sink", element_list, err); + + err = mm_camcorder_get_attributes(handle, &err_name, + MMCAM_DISPLAY_SHM_SOCKET_PATH, &socket_path, &socket_path_len, + NULL); + if (err != MM_ERROR_NONE) { + _mmcam_dbg_warn("Get socket path failed 0x%x", err); + SAFE_FREE(err_name); + return err; + } + + g_object_set(G_OBJECT(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst), "socket-path", socket_path, NULL); } else { - _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSINK_SINK, "shmsink", "ipc_sink", element_list, err); - _mmcam_dbg_log("socket_path : %s", socket_path); - g_object_set(G_OBJECT(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst), - "socket-path", socket_path, - "wait-for-connection", FALSE, - "perms", 0777, - "sync", TRUE, - NULL); + _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); + /* Set caps by rotation */ _mmcamcorder_set_videosrc_rotation(handle, camera_rotate); diff --git a/src/mm_camcorder_internal.c b/src/mm_camcorder_internal.c index 37e41c9..dbe50eb 100644 --- a/src/mm_camcorder_internal.c +++ b/src/mm_camcorder_internal.c @@ -355,7 +355,7 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info) goto _ERR_DEFAULT_VALUE_INIT; } - ret = _mmcamcorder_init_attr_from_configure((MMHandleType)hcamcorder, info->videodev_type); + ret = _mmcamcorder_init_attr_from_configure((MMHandleType)hcamcorder, MM_CAMCONVERT_CATEGORY_CAMERA|MM_CAMCONVERT_CATEGORY_DISPLAY); if (ret != MM_ERROR_NONE) { _mmcam_dbg_warn("converting table initialize error!!"); ret = MM_ERROR_CAMCORDER_INTERNAL; @@ -493,7 +493,7 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info) goto _ERR_DEFAULT_VALUE_INIT; } - ret = _mmcamcorder_init_attr_from_configure((MMHandleType)hcamcorder, info->videodev_type); + ret = _mmcamcorder_init_attr_from_configure((MMHandleType)hcamcorder, MM_CAMCONVERT_CATEGORY_AUDIO); if (ret != MM_ERROR_NONE) { _mmcam_dbg_warn("init attribute from configure error : 0x%x", ret); ret = MM_ERROR_CAMCORDER_INTERNAL; @@ -1015,6 +1015,9 @@ int _mmcamcorder_realize(MMHandleType handle) case MM_DISPLAY_SURFACE_NULL: videosink_element_type = strdup("VideosinkElementNull"); break; + case MM_DISPLAY_SURFACE_REMOTE: + videosink_element_type = strdup("VideosinkElementRemote"); + break; default: videosink_element_type = strdup("VideosinkElementX"); break; diff --git a/src/mm_camcorder_platform.c b/src/mm_camcorder_platform.c index 23bbfe9..992da88 100644 --- a/src/mm_camcorder_platform.c +++ b/src/mm_camcorder_platform.c @@ -35,7 +35,6 @@ /*--------------------------------------------------------------------------- | LOCAL VARIABLE DEFINITIONS for internal | ---------------------------------------------------------------------------*/ -#define MM_CAMCORDER_ATTR_NONE -1 // Rule 1. 1:1 match except NONE. @@ -630,7 +629,6 @@ static _MMCamcorderInfoConverting g_caminfo_convert[CAMINFO_CONVERT_NUM] = { | LOCAL FUNCTION PROTOTYPES: | ---------------------------------------------------------------------------*/ /* STATIC INTERNAL FUNCTION */ -static int __mmcamcorder_set_info_to_attr( MMHandleType handle, _MMCamcorderInfoConverting *info, int table_size ); static int __mmcamcorder_get_valid_array(int * original_array, int original_count, int ** valid_array, int * valid_default ); /*=========================================================================================== @@ -838,7 +836,7 @@ __mmcamcorder_get_valid_array(int * original_array, int original_count, int ** v } -int _mmcamcorder_init_attr_from_configure(MMHandleType handle, int type) +int _mmcamcorder_init_attr_from_configure(MMHandleType handle, MMCamConvertingCategory category) { mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); _MMCamcorderInfoConverting *info = NULL; @@ -848,9 +846,9 @@ int _mmcamcorder_init_attr_from_configure(MMHandleType handle, int type) mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED); - _mmcam_dbg_log("type : %d", type); + _mmcam_dbg_log("category : %d", category); - if (type != MM_VIDEO_DEVICE_NONE) { + if (category & MM_CAMCONVERT_CATEGORY_CAMERA) { /* Initialize attribute related to camera control */ info = hcamcorder->caminfo_convert; table_size = sizeof(g_caminfo_convert) / sizeof(_MMCamcorderInfoConverting); @@ -859,7 +857,9 @@ int _mmcamcorder_init_attr_from_configure(MMHandleType handle, int type) _mmcam_dbg_err("camera info set error : 0x%x", ret); return ret; } + } + if (category & MM_CAMCONVERT_CATEGORY_DISPLAY) { /* Initialize attribute related to display */ info = g_display_info; table_size = sizeof(g_display_info) / sizeof(_MMCamcorderInfoConverting); @@ -870,13 +870,15 @@ int _mmcamcorder_init_attr_from_configure(MMHandleType handle, int type) } } - /* Initialize attribute related to audio */ - info = g_audio_info; - table_size = sizeof(g_audio_info) / sizeof(_MMCamcorderInfoConverting); - ret = __mmcamcorder_set_info_to_attr(handle, info, table_size); - if (ret != MM_ERROR_NONE) { - _mmcam_dbg_err("audio info set error : 0x%x", ret); - return ret; + if (category & MM_CAMCONVERT_CATEGORY_AUDIO) { + /* Initialize attribute related to audio */ + info = g_audio_info; + table_size = sizeof(g_audio_info) / sizeof(_MMCamcorderInfoConverting); + ret = __mmcamcorder_set_info_to_attr(handle, info, table_size); + if (ret != MM_ERROR_NONE) { + _mmcam_dbg_err("audio info set error : 0x%x", ret); + return ret; + } } _mmcam_dbg_log("done"); @@ -885,8 +887,7 @@ int _mmcamcorder_init_attr_from_configure(MMHandleType handle, int type) } -static int -__mmcamcorder_set_info_to_attr( MMHandleType handle, _MMCamcorderInfoConverting *info, int table_size ) +int __mmcamcorder_set_info_to_attr(MMHandleType handle, _MMCamcorderInfoConverting *info, int table_size) { mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); MMHandleType attrs = 0; @@ -908,7 +909,7 @@ __mmcamcorder_set_info_to_attr( MMHandleType handle, _MMCamcorderInfoConverting info[i].type, info[i].category, info[i].attr_idx, - info[i].attr_idx_sub, + info[i].attr_idx_pair, info[i].keyword, info[i].conv_type ); */ diff --git a/src/mm_camcorder_util.c b/src/mm_camcorder_util.c index 5409586..dc0bbef 100644 --- a/src/mm_camcorder_util.c +++ b/src/mm_camcorder_util.c @@ -987,6 +987,7 @@ void _mmcamcorder_element_release_noti(gpointer data, GObject *where_the_object_ } +#ifdef _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK gboolean _mmcamcorder_msg_callback(void *data) { _MMCamcorderMsgItem *item = (_MMCamcorderMsgItem*)data; @@ -1060,12 +1061,15 @@ MSG_CALLBACK_DONE: /* For not being called again */ return FALSE; } +#endif /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */ gboolean _mmcamcorder_send_message(MMHandleType handle, _MMCamcorderMsgItem *data) { mmf_camcorder_t* hcamcorder = MMF_CAMCORDER(handle); +#ifdef _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK _MMCamcorderMsgItem *item = NULL; +#endif /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */ mmf_return_val_if_fail(hcamcorder, FALSE); mmf_return_val_if_fail(data, FALSE); @@ -1099,6 +1103,7 @@ gboolean _mmcamcorder_send_message(MMHandleType handle, _MMCamcorderMsgItem *dat break; } +#ifdef _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK item = g_malloc(sizeof(_MMCamcorderMsgItem)); if (item) { memcpy(item, data, sizeof(_MMCamcorderMsgItem)); @@ -1107,7 +1112,7 @@ gboolean _mmcamcorder_send_message(MMHandleType handle, _MMCamcorderMsgItem *dat _MMCAMCORDER_LOCK(handle); hcamcorder->msg_data = g_list_append(hcamcorder->msg_data, item); -// _mmcam_dbg_log("item[%p]", item); + /*_mmcam_dbg_log("item[%p]", item);*/ /* Use DEFAULT priority */ g_idle_add_full(G_PRIORITY_DEFAULT, _mmcamcorder_msg_callback, item, NULL); @@ -1116,6 +1121,43 @@ gboolean _mmcamcorder_send_message(MMHandleType handle, _MMCamcorderMsgItem *dat } else { _mmcam_dbg_err("item[id:0x%x] malloc failed : %d", data->id, sizeof(_MMCamcorderMsgItem)); } +#else /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */ + _MMCAMCORDER_LOCK_MESSAGE_CALLBACK(hcamcorder); + + if (hcamcorder->msg_cb) { + hcamcorder->msg_cb(data->id, (MMMessageParamType*)(&(data->param)), hcamcorder->msg_cb_param); + } else { + _mmcam_dbg_log("message callback is NULL. message id %d", data->id); + } + + _MMCAMCORDER_UNLOCK_MESSAGE_CALLBACK(hcamcorder); + + /* release allocated memory */ + if (data->id == MM_MESSAGE_CAMCORDER_FACE_DETECT_INFO) { + MMCamFaceDetectInfo *cam_fd_info = (MMCamFaceDetectInfo *)data->param.data; + if (cam_fd_info) { + SAFE_FREE(cam_fd_info->face_info); + free(cam_fd_info); + cam_fd_info = NULL; + + data->param.data = NULL; + data->param.size = 0; + } + } else if (data->id == MM_MESSAGE_CAMCORDER_VIDEO_CAPTURED || + data->id == MM_MESSAGE_CAMCORDER_AUDIO_CAPTURED) { + MMCamRecordingReport *report = (MMCamRecordingReport *)data->param.data; + if (report) { + if (report->recording_filename) { + free(report->recording_filename); + report->recording_filename = NULL; + } + free(report); + report = NULL; + + data->param.data = NULL; + } + } +#endif /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */ return TRUE; } @@ -1124,18 +1166,21 @@ gboolean _mmcamcorder_send_message(MMHandleType handle, _MMCamcorderMsgItem *dat void _mmcamcorder_remove_message_all(MMHandleType handle) { mmf_camcorder_t* hcamcorder = MMF_CAMCORDER(handle); - _MMCamcorderMsgItem *item = NULL; gboolean ret = TRUE; +#ifdef _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK + _MMCamcorderMsgItem *item = NULL; GList *list = NULL; struct timespec timeout; struct timeval tv; struct timeval tv_to_add; struct timeval tv_result; +#endif /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */ mmf_return_if_fail(hcamcorder); _MMCAMCORDER_LOCK(handle); +#ifdef _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK if (!hcamcorder->msg_data) { _mmcam_dbg_log("No message data is remained."); } else { @@ -1219,6 +1264,7 @@ void _mmcamcorder_remove_message_all(MMHandleType handle) g_list_free(hcamcorder->msg_data); hcamcorder->msg_data = NULL; } +#endif /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */ /* remove idle function for playing capture sound */ do { -- 2.7.4