Release version 0.10.16 97/51297/1 accepted/tizen/mobile/20151109.233936 accepted/tizen/tv/20151109.233947 accepted/tizen/wearable/20151109.233958 submit/tizen/20151109.084637 submit/tizen/20151109.102233
authorJeongmo Yang <jm80.yang@samsung.com>
Fri, 6 Nov 2015 09:30:33 +0000 (18:30 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Fri, 6 Nov 2015 09:30:33 +0000 (18:30 +0900)
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 <jm80.yang@samsung.com>
packaging/libmm-camcorder.spec
src/include/mm_camcorder_internal.h
src/include/mm_camcorder_platform.h
src/include/mm_camcorder_util.h
src/mm_camcorder_client.c
src/mm_camcorder_configure.c
src/mm_camcorder_gstcommon.c
src/mm_camcorder_internal.c
src/mm_camcorder_platform.c
src/mm_camcorder_util.c

index 3122e77..227c624 100644 (file)
@@ -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
index d186afc..e657e0b 100644 (file)
@@ -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 */
index c2196e6..d74c8cf 100644 (file)
@@ -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
 }
index 62a5821..7220a2d 100644 (file)
@@ -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);
 
index bde0d82..a57cb83 100644 (file)
 #include <storage.h>
 
 
+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);
 
index 4fa2fba..d42b5eb 100644 (file)
@@ -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;
index 8f47dca..5d4e253 100644 (file)
@@ -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);
 
index 37e41c9..dbe50eb 100644 (file)
@@ -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;
index 23bbfe9..992da88 100644 (file)
@@ -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 );
                */
index 5409586..dc0bbef 100644 (file)
@@ -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 {