Replace tbm_key by tbm_fd for buffer protection 25/199225/8 accepted/tizen/unified/20190221.084204 submit/tizen/20190219.074619 submit/tizen/20190220.092629
authorJeongmo Yang <jm80.yang@samsung.com>
Thu, 7 Feb 2019 10:32:52 +0000 (19:32 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Mon, 18 Feb 2019 08:55:30 +0000 (17:55 +0900)
- Any other process can access buffer if it knows its tbm_key,
  but, there is no way to access if it's replaced by tbm_fd.

[Version] 0.3.22
[Profile] Common
[Issue Type] Update
[Dependency module] mmsvc-recorder, capi-media-camera

Change-Id: I00cade818977f6a65836eb9a8b8c4064cfddc5c0
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
muse/include/muse_camera.h
muse/include/muse_camera_internal.h
muse/src/muse_camera_dispatcher.c
packaging/mmsvc-camera.spec

index 1b2834f..4ebdc14 100644 (file)
@@ -332,14 +332,6 @@ typedef enum {
        MUSE_CAMERA_GET_STRING_NUM
 } muse_camera_get_string_e;
 
-typedef struct {
-       tbm_bo bo;
-       int key;
-       void *internal_buffer;
-       tbm_bo data_bo;
-       bool is_capture;
-} muse_camera_export_data;
-
 
 /**
  * @brief The structure type for muse camera errors.
index 98958f1..656938f 100644 (file)
@@ -39,6 +39,17 @@ extern "C" {
 
 
 typedef struct {
+       tbm_bo bo;
+       tbm_bo data_bo;
+       tbm_fd fd;
+       tbm_fd data_fd;
+       tbm_fd buffer_fd[MUSE_NUM_FD];
+       int num_buffer_fd;
+       void *internal_buffer;
+       bool is_capture;
+} muse_camera_export_data;
+
+typedef struct {
        int api;
        int class;
        int value;
index 32c17cd..d8e3ebf 100644 (file)
@@ -38,9 +38,9 @@
 #define MUSED_KEY_FLASH_STATE_RETURN  "camera_get_flash_state_return"
 #define MUSED_KEY_FLASH_STATE_COUNT   "camera_get_flash_state_count"
 
-static int _camera_remove_export_data(muse_module_h module, int key, int remove_all);
+static int _camera_remove_export_data(muse_module_h module, tbm_fd fd, int remove_all);
 
-static void __camera_dispatcher_send_msg(muse_module_h module, char *msg)
+static void __camera_dispatcher_send_msg(muse_module_h module, char *msg, int *tfd)
 {
        int len = 0;
        int sock_fd = 0;
@@ -63,7 +63,7 @@ static void __camera_dispatcher_send_msg(muse_module_h module, char *msg)
                goto _DONE;
        }
 
-       len = muse_core_msg_send(sock_fd, msg);
+       len = muse_core_msg_send_fd(sock_fd, tfd, msg);
        if (len <= 0)
                LOGE("sending message[%s] failed. errno %d", msg, errno);
 
@@ -81,7 +81,7 @@ static void muse_camera_msg_return(int api, int class, int ret, muse_module_h mo
                MUSE_TYPE_INT, PARAM_GET_TYPE, MUSE_CAMERA_GET_TYPE_NONE,
                0);
 
-       __camera_dispatcher_send_msg(module, send_msg);
+       __camera_dispatcher_send_msg(module, send_msg, NULL);
 
        return;
 }
@@ -119,7 +119,7 @@ static void muse_camera_msg_return1(int api, int class, int ret, muse_module_h m
                LOGW("unknown type %d", get_type);
        }
 
-       __camera_dispatcher_send_msg(module, send_msg);
+       __camera_dispatcher_send_msg(module, send_msg, NULL);
 
        return;
 }
@@ -137,7 +137,7 @@ static void muse_camera_msg_return2(int api, int class, int ret, muse_module_h m
                MUSE_TYPE_INT, "get_value1", value1,
                0);
 
-       __camera_dispatcher_send_msg(module, send_msg);
+       __camera_dispatcher_send_msg(module, send_msg, NULL);
 
        return;
 }
@@ -151,7 +151,7 @@ static void muse_camera_msg_event1(int api, int event, int class, muse_module_h
                MUSE_TYPE_INT, name, value,
                0);
 
-       __camera_dispatcher_send_msg(module, send_msg);
+       __camera_dispatcher_send_msg(module, send_msg, NULL);
 
        return;
 }
@@ -167,7 +167,23 @@ static void muse_camera_msg_event2(int api, int event, int class, muse_module_h
                MUSE_TYPE_INT, name1, value1,
                0);
 
-       __camera_dispatcher_send_msg(module, send_msg);
+       __camera_dispatcher_send_msg(module, send_msg, NULL);
+
+       return;
+}
+
+
+static void muse_camera_msg_event2_fd(int api, int event, int class, muse_module_h module,
+       const char *name0, int value0, const char *name1, int value1, int *tfd)
+{
+       char *send_msg = muse_core_msg_new(api,
+               MUSE_TYPE_INT, PARAM_EVENT, event,
+               MUSE_TYPE_INT, PARAM_EVENT_CLASS, class,
+               MUSE_TYPE_INT, name0, value0,
+               MUSE_TYPE_INT, name1, value1,
+               0);
+
+       __camera_dispatcher_send_msg(module, send_msg, tfd);
 
        return;
 }
@@ -184,7 +200,24 @@ static void muse_camera_msg_event3(int api, int event, int class, muse_module_h
                MUSE_TYPE_INT, name2, value2,
                0);
 
-       __camera_dispatcher_send_msg(module, send_msg);
+       __camera_dispatcher_send_msg(module, send_msg, NULL);
+
+       return;
+}
+
+
+static void muse_camera_msg_event3_fd(int api, int event, int class, muse_module_h module,
+       const char *name0, int value0, const char *name1, int value1, const char *name2, int value2, int *tfd)
+{
+       char *send_msg = muse_core_msg_new(api,
+               MUSE_TYPE_INT, PARAM_EVENT, event,
+               MUSE_TYPE_INT, PARAM_EVENT_CLASS, class,
+               MUSE_TYPE_INT, name0, value0,
+               MUSE_TYPE_INT, name1, value1,
+               MUSE_TYPE_INT, name2, value2,
+               0);
+
+       __camera_dispatcher_send_msg(module, send_msg, tfd);
 
        return;
 }
@@ -484,14 +517,15 @@ bool _camera_dispatcher_callback_supported_ptz_type(int param1, void *user_data)
        return true;
 }
 
-static int _camera_remove_export_data(muse_module_h module, int key, int remove_all)
+static int _camera_remove_export_data(muse_module_h module, tbm_fd fd, int remove_all)
 {
+       int i = 0;
        muse_camera_handle_s *muse_camera = NULL;
        GList *tmp_list = NULL;
        muse_camera_export_data *export_data = NULL;
 
-       if (module == NULL || (key <= 0 && remove_all == FALSE)) {
-               LOGE("invalid parameter %p, %d", module, key);
+       if (module == NULL || (fd < 0 && remove_all == FALSE)) {
+               LOGE("invalid parameter %p, %d", module, fd);
                return FALSE;
        }
 
@@ -509,12 +543,12 @@ static int _camera_remove_export_data(muse_module_h module, int key, int remove_
                export_data = (muse_camera_export_data *)tmp_list->data;
                tmp_list = tmp_list->next;
                if (export_data) {
-                       if (export_data->key == key || remove_all) {
-                               /*LOGD("key %d matched, remove it (remove_all %d)", key, remove_all);*/
+                       if (export_data->fd == fd || remove_all) {
+                               /*LOGD("fd %d matched, remove it (remove_all %d)", fd, remove_all);*/
 
                                if (remove_all) {
-                                       LOGW("remove remained export data key %d, internal buffer %p",
-                                               export_data->key, export_data->internal_buffer);
+                                       LOGW("remove remained export data fd %d, internal buffer %p",
+                                               export_data->fd, export_data->internal_buffer);
                                }
 
                                if (export_data->is_capture) {
@@ -522,32 +556,50 @@ static int _camera_remove_export_data(muse_module_h module, int key, int remove_
                                        g_cond_signal(&muse_camera->list_cond);
                                }
 
+                               /* unref bo and close exported fd */
                                if (export_data->bo) {
+                                       /*LOGD("close export_data->fd %d", export_data->fd);*/
+
+                                       close(export_data->fd);
+                                       export_data->fd = -1;
+
                                        tbm_bo_unref(export_data->bo);
                                        export_data->bo = NULL;
                                } else {
-                                       LOGW("bo for key %d is NULL", key);
+                                       LOGW("bo for fd %d is NULL", fd);
                                }
 
-                               export_data->key = 0;
+                               /* unref data_bo and exported fd */
+                               if (export_data->data_bo) {
+                                       /*LOGD("close export_data->data_fd %d", export_data->data_fd);*/
 
-                               if (export_data->internal_buffer) {
-                                       gst_buffer_unref((GstBuffer *)export_data->internal_buffer);
-                                       export_data->internal_buffer = NULL;
-                               }
+                                       close(export_data->data_fd);
+                                       export_data->data_fd = -1;
 
-                               if (export_data->data_bo) {
                                        tbm_bo_unref(export_data->data_bo);
                                        export_data->data_bo = NULL;
                                }
 
+                               /* close exported fd for zero copy buffer */
+                               for (i = 0 ; i < export_data->num_buffer_fd ; i++) {
+                                       /*LOGD("close export_data->buffer_fd[%d] %d", i, export_data->buffer_fd[i]);*/
+                                       close(export_data->buffer_fd[i]);
+                                       export_data->buffer_fd[i] = -1;
+                               }
+
+                               /* unref GstBuffer */
+                               if (export_data->internal_buffer) {
+                                       gst_buffer_unref((GstBuffer *)export_data->internal_buffer);
+                                       export_data->internal_buffer = NULL;
+                               }
+
                                muse_camera->data_list = g_list_remove(muse_camera->data_list, export_data);
 
                                g_free(export_data);
                                export_data = NULL;
 
                                if (remove_all == FALSE) {
-                                       /*LOGD("key %d, remove done");*/
+                                       /*LOGD("fd %d, remove done", fd);*/
                                        g_mutex_unlock(&muse_camera->list_lock);
                                        return TRUE;
                                } else {
@@ -564,7 +616,7 @@ static int _camera_remove_export_data(muse_module_h module, int key, int remove_
        if (remove_all) {
                LOGW("remove all done");
        } else {
-               LOGE("should not be reached here - key %d", key);
+               LOGE("should not be reached here - fd %d", fd);
        }
 
        return FALSE;
@@ -574,6 +626,7 @@ static int _camera_remove_export_data(muse_module_h module, int key, int remove_
 void _camera_dispatcher_capturing_cb(camera_image_data_s* image, camera_image_data_s* postview, camera_image_data_s* thumbnail, void *user_data)
 {
        muse_camera_handle_s *muse_camera = NULL;
+       int tfd_index = 0;
        int data_size_main = 0;
        int data_size_post = 0;
        int data_size_thumb = 0;
@@ -586,9 +639,7 @@ void _camera_dispatcher_capturing_cb(camera_image_data_s* image, camera_image_da
        muse_camera_export_data *export_data_main = NULL;
        muse_camera_export_data *export_data_post = NULL;
        muse_camera_export_data *export_data_thumb = NULL;
-       int tbm_key_main = 0;
-       int tbm_key_post = 0;
-       int tbm_key_thumb = 0;
+       tbm_fd tfd[MUSE_NUM_FD] = {-1, -1, -1, -1};
        muse_module_h module = (muse_module_h)user_data;
        unsigned char *buf_pos = NULL;
        gint64 end_time = 0;
@@ -636,17 +687,17 @@ void _camera_dispatcher_capturing_cb(camera_image_data_s* image, camera_image_da
 
        tbm_bo_unmap(bo_main);
 
-       tbm_key_main = tbm_bo_export(bo_main);
-       if (tbm_key_main == 0) {
-               LOGE("Create key_info ERROR!!");
+       tfd[tfd_index] = tbm_bo_export_fd(bo_main);
+       if (tfd[tfd_index] < 0) {
+               LOGE("export main bo ERROR");
                goto main_image_error;
        }
 
-       LOGD("bo %p, vaddr %p, size %d, key %d",
-               bo_main, bo_main_handle.ptr, data_size_main, tbm_key_main);
+       LOGD("MAIN: bo %p, vaddr %p, size %d, fd %d",
+               bo_main, bo_main_handle.ptr, data_size_main, tfd[tfd_index]);
 
        /* set bo info */
-       export_data_main->key = tbm_key_main;
+       export_data_main->fd = tfd[tfd_index];
        export_data_main->bo = bo_main;
        export_data_main->is_capture = true;
 
@@ -679,14 +730,15 @@ void _camera_dispatcher_capturing_cb(camera_image_data_s* image, camera_image_da
                memcpy(buf_pos, postview->data, postview->size);
                tbm_bo_unmap(bo_post);
 
-               tbm_key_post = tbm_bo_export(bo_post);
-               if (tbm_key_post == 0) {
-                       LOGE("Create key_info ERROR!!");
+               tfd_index++;
+               tfd[tfd_index] = tbm_bo_export_fd(bo_post);
+               if (tfd[tfd_index] < 0) {
+                       LOGE("export postview ERROR");
                        goto postview_image_error;
                }
 
                /* set bo info */
-               export_data_post->key = tbm_key_post;
+               export_data_post->fd = tfd[tfd_index];
                export_data_post->bo = bo_post;
        }
 
@@ -719,14 +771,15 @@ void _camera_dispatcher_capturing_cb(camera_image_data_s* image, camera_image_da
                memcpy(buf_pos, thumbnail->data, thumbnail->size);
                tbm_bo_unmap(bo_thumb);
 
-               tbm_key_thumb = tbm_bo_export(bo_thumb);
-               if (tbm_key_thumb == 0) {
-                       LOGE("Create key_info ERROR!!");
+               tfd_index++;
+               tfd[tfd_index] = tbm_bo_export_fd(bo_thumb);
+               if (tfd[tfd_index] < 0) {
+                       LOGE("export thumb ERROR");
                        goto thumbnail_image_error;
                }
 
                /* set bo info */
-               export_data_thumb->key = tbm_key_thumb;
+               export_data_thumb->fd = tfd[tfd_index];
                export_data_thumb->bo = bo_thumb;
        }
 
@@ -742,10 +795,14 @@ void _camera_dispatcher_capturing_cb(camera_image_data_s* image, camera_image_da
                muse_camera->data_list = g_list_append(muse_camera->data_list, (gpointer)export_data_thumb);
 
        /* send message */
-       muse_camera_msg_event3(MUSE_CAMERA_CB_EVENT,
+       muse_camera_msg_event3_fd(MUSE_CAMERA_CB_EVENT,
                MUSE_CAMERA_EVENT_TYPE_CAPTURE,
                MUSE_CAMERA_EVENT_CLASS_THREAD_SUB,
-               module, "tbm_key_main", tbm_key_main, "tbm_key_post", tbm_key_post, "tbm_key_thumb", tbm_key_thumb);
+               module,
+               "capture_fd_main", export_data_main->fd,
+               "capture_fd_post", export_data_post ? export_data_post->fd : -1,
+               "capture_fd_thumb", export_data_thumb ? export_data_thumb->fd : -1,
+               (int *)tfd);
 
        /* wait for capture callback return */
        end_time = g_get_monotonic_time() + G_TIME_SPAN_SECOND * 3;
@@ -869,20 +926,21 @@ void _camera_dispatcher_interrupt_started_cb(camera_policy_e policy, camera_stat
 
 void _camera_dispatcher_preview_cb(MMCamcorderVideoStreamDataType *stream, void *user_data)
 {
-       muse_camera_handle_s *muse_camera = NULL;
+       int i = 0;
        int data_size = 0;
+       int send_ret = 0;
+       int sock_fd = 0;
+       muse_camera_handle_s *muse_camera = NULL;
        tbm_bo bo = NULL;
        tbm_bo data_bo = NULL;
        tbm_bo_handle bo_handle = {.ptr = NULL};
        tbm_bo_handle data_bo_handle = {.ptr = NULL};
+       /* 0: MMCamcorderVideoStreamDataType
+          1: data_bo or zero copy bo[0]
+          2: zero copy bo[1]
+          3: zero copy bo[2] */
+       tbm_fd tfd[MUSE_NUM_FD] = {-1, -1, -1, -1};
        muse_camera_export_data *export_data = NULL;
-       int i = 0;
-       int tbm_key = 0;
-       int data_key = 0;
-       int buffer_key[BUFFER_MAX_PLANE_NUM] = {0, };
-       int num_buffer_key = 0;
-       int send_ret = 0;
-       int sock_fd = 0;
        muse_module_h module = (muse_module_h)user_data;
        unsigned char *buf_pos = NULL;
        char *send_message = NULL;
@@ -906,6 +964,9 @@ void _camera_dispatcher_preview_cb(MMCamcorderVideoStreamDataType *stream, void
                return;
        }
 
+       export_data->fd = -1;
+       export_data->data_fd = -1;
+
        data_size = sizeof(MMCamcorderVideoStreamDataType);
 
        bo = tbm_bo_alloc(muse_camera->bufmgr, data_size, TBM_BO_DEFAULT);
@@ -1014,46 +1075,49 @@ void _camera_dispatcher_preview_cb(MMCamcorderVideoStreamDataType *stream, void
                tbm_bo_unmap(data_bo);
        } else {
                /* zero copy */
-               for (i = 0 ; i < BUFFER_MAX_PLANE_NUM ; i++) {
+               for (i = 0 ; i < MUSE_NUM_FD - 1 ; i++) {
                        if (stream->bo[i]) {
-                               buffer_key[i] = tbm_bo_export(stream->bo[i]);
-                               if (buffer_key[i] == 0) {
+                               tfd[i + 1] = tbm_bo_export_fd(stream->bo[i]);
+                               if (tfd[i + 1] < 0) {
                                        LOGE("failed to export bo %p", stream->bo[i]);
                                        goto _PREVIEW_CB_ERROR;
                                }
-                               num_buffer_key++;
+                               export_data->buffer_fd[i] = tfd[i + 1];
+                               export_data->num_buffer_fd++;
                        } else {
-                               /*LOGD("num_buffer_key %d", num_buffer_key);*/
+                               /*LOGD("num_buffer_fd %d", export_data->num_buffer_fd);*/
                                break;
                        }
                }
        }
 
-       tbm_key = tbm_bo_export(bo);
-       if (tbm_key == 0) {
-               LOGE("Create key_info ERROR!!");
+       tfd[0] = tbm_bo_export_fd(bo);
+       if (tfd[0] < 0) {
+               LOGE("export stream data ERROR");
                goto _PREVIEW_CB_ERROR;
        }
 
        /*
-       LOGD("bo %p, vaddr %p, size %d, key %d",
-            bo, bo_handle.ptr, data_size, tbm_key);
+       LOGD("bo %p, vaddr %p, size %d, fd %d",
+            bo, bo_handle.ptr, data_size, tfd[0]);
        */
 
        /* set bo info */
-       export_data->key = tbm_key;
+       export_data->fd = tfd[0];
        export_data->bo = bo;
        if (stream->internal_buffer) {
                export_data->internal_buffer = stream->internal_buffer;
                gst_buffer_ref((GstBuffer *)export_data->internal_buffer);
        }
+
        if (data_bo) {
                export_data->data_bo = data_bo;
-               data_key = tbm_bo_export(data_bo);
-               if (data_key == 0) {
-                       LOGE("Create key_info for data_bo ERROR!!");
+               tfd[1] = tbm_bo_export_fd(data_bo);
+               if (tfd[1] < 0) {
+                       LOGE("export data bo ERROR");
                        goto _PREVIEW_CB_ERROR;
                }
+               export_data->data_fd = tfd[1];
        }
 
        /* add bo info to list */
@@ -1064,7 +1128,7 @@ void _camera_dispatcher_preview_cb(MMCamcorderVideoStreamDataType *stream, void
        if (muse_camera->is_shutting_down) {
                LOGW("now shutting down.. skip this buffer");
                g_mutex_unlock(&muse_camera->list_lock);
-               _camera_remove_export_data(module, tbm_key, FALSE);
+               _camera_remove_export_data(module, tfd[0], FALSE);
                return;
        }
 
@@ -1076,10 +1140,8 @@ void _camera_dispatcher_preview_cb(MMCamcorderVideoStreamDataType *stream, void
        send_message = muse_core_msg_new(MUSE_CAMERA_CB_EVENT,
                MUSE_TYPE_INT, PARAM_EVENT, MUSE_CAMERA_EVENT_TYPE_PREVIEW,
                MUSE_TYPE_INT, PARAM_EVENT_CLASS, MUSE_CAMERA_EVENT_CLASS_THREAD_SUB,
-               MUSE_TYPE_INT, "tbm_key", tbm_key,
-               MUSE_TYPE_INT, "num_buffer_key", num_buffer_key,
-               MUSE_TYPE_INT, "data_key", data_key,
-               MUSE_TYPE_ARRAY, "buffer_key", BUFFER_MAX_PLANE_NUM, buffer_key,
+               MUSE_TYPE_INT, "preview_fd", tfd[0],
+               MUSE_TYPE_INT, "num_buffer_fd", export_data->num_buffer_fd,
                0);
 
        sock_fd = muse_server_module_get_msg_fd(module);
@@ -1087,7 +1149,7 @@ void _camera_dispatcher_preview_cb(MMCamcorderVideoStreamDataType *stream, void
                LOGE("failed to get socket fd from module %p", module);
                send_ret = 0;
        } else {
-               send_ret = muse_core_msg_send(sock_fd, send_message);
+               send_ret = muse_core_msg_send_fd(sock_fd, (int *)tfd, send_message);
        }
 
        muse_core_msg_free(send_message);
@@ -1113,11 +1175,33 @@ _PREVIEW_CB_ERROR:
                tbm_bo_unref(bo);
                bo = NULL;
        }
+
        if (data_bo) {
                tbm_bo_unref(data_bo);
                data_bo = NULL;
        }
+
        if (export_data) {
+               if (export_data->fd >= 0) {
+                       close(export_data->fd);
+                       export_data->fd = -1;
+               }
+
+               if (export_data->data_fd >= 0) {
+                       close(export_data->data_fd);
+                       export_data->data_fd = -1;
+               }
+
+               for (i = 0 ; i < export_data->num_buffer_fd ; i++) {
+                       close(export_data->buffer_fd[i]);
+                       export_data->buffer_fd[i] = -1;
+               }
+
+               if (export_data->internal_buffer) {
+                       gst_buffer_unref(export_data->internal_buffer);
+                       export_data->internal_buffer = NULL;
+               }
+
                g_free(export_data);
                export_data = NULL;
        }
@@ -1146,7 +1230,7 @@ void _camera_dispatcher_face_detected_cb(camera_detected_face_s *faces, int coun
        tbm_bo bo = NULL;
        tbm_bo_handle bo_handle = {NULL, };
        int bo_size = sizeof(camera_detected_face_s) * count;
-       int tbm_key = 0;
+       tbm_fd tfd[MUSE_NUM_FD] = {-1, -1, -1, -1};
        muse_camera_export_data *export_data = NULL;
 
        if (count >= 0) {
@@ -1197,8 +1281,8 @@ void _camera_dispatcher_face_detected_cb(camera_detected_face_s *faces, int coun
                        tbm_bo_unmap(bo);
 
                        /* export bo */
-                       tbm_key = tbm_bo_export(bo);
-                       if (tbm_key == 0) {
+                       tfd[0] = tbm_bo_export_fd(bo);
+                       if (tfd[0] < 0) {
                                LOGE("failed to export bo for face detection info");
 
                                tbm_bo_unref(bo);
@@ -1212,7 +1296,7 @@ void _camera_dispatcher_face_detected_cb(camera_detected_face_s *faces, int coun
 
                        /* set export data */
                        export_data->bo = bo;
-                       export_data->key = tbm_key;
+                       export_data->fd = tfd[0];
 
                        /* add bo info to list */
                        g_mutex_lock(&muse_camera->list_lock);
@@ -1220,13 +1304,16 @@ void _camera_dispatcher_face_detected_cb(camera_detected_face_s *faces, int coun
                        g_mutex_unlock(&muse_camera->list_lock);
                }
 
-               LOGD("face - count %d, buffer size %d, key %d", count, bo_size, tbm_key);
+               LOGD("face - count %d, buffer size %d, fd %d", count, bo_size, tfd[0]);
 
                /* send message */
-               muse_camera_msg_event2(MUSE_CAMERA_CB_EVENT,
+               muse_camera_msg_event2_fd(MUSE_CAMERA_CB_EVENT,
                        MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION,
                        MUSE_CAMERA_EVENT_CLASS_THREAD_MAIN,
-                       module, "count", count, "tbm_key", tbm_key);
+                       module,
+                       "count", count,
+                       "face_fd", tfd[0],
+                       (int *)tfd);
        } else {
                LOGW("invalid count for face detection - %d", count);
        }
@@ -1467,7 +1554,7 @@ static void _camera_dispatcher_release_resource(muse_module_h module)
 
        muse_camera = (muse_camera_handle_s *)muse_server_ipc_get_handle(module);
 
-       _camera_remove_export_data(module, 0, TRUE);
+       _camera_remove_export_data(module, -1, TRUE);
 
        g_mutex_clear(&muse_camera->list_lock);
        g_cond_clear(&muse_camera->list_cond);
@@ -4006,7 +4093,7 @@ int camera_dispatcher_attr_get_geotag(muse_module_h module)
                        MUSE_TYPE_ARRAY, "get_value", msg_array_size, get_value,
                        0);
 
-               __camera_dispatcher_send_msg(module, send_msg);
+               __camera_dispatcher_send_msg(module, send_msg, NULL);
        } else {
                muse_camera_msg_return(api, class, ret, module);
        }
@@ -5036,7 +5123,7 @@ int camera_dispatcher_attr_get_display_roi_area(muse_module_h module)
                        MUSE_TYPE_ARRAY, "get_value", 4, get_value,
                        0);
 
-               __camera_dispatcher_send_msg(module, send_msg);
+               __camera_dispatcher_send_msg(module, send_msg, NULL);
        } else {
                muse_camera_msg_return(api, class, ret, module);
        }
@@ -5047,17 +5134,17 @@ int camera_dispatcher_attr_get_display_roi_area(muse_module_h module)
 
 int camera_dispatcher_return_buffer(muse_module_h module)
 {
-       int tbm_key = 0;
+       int ret_fd = 0;
        muse_camera_handle_s *muse_camera = NULL;
 
        muse_camera = (muse_camera_handle_s *)muse_server_ipc_get_handle(module);
 
-       muse_camera_msg_get(tbm_key, muse_server_module_get_msg(module));
+       muse_camera_msg_get(ret_fd, muse_server_module_get_msg(module));
 
-       /*LOGD("handle : %p, key : %d", muse_camera, tbm_key);*/
+       /*LOGD("ret_fd : %d", ret_fd);*/
 
-       if (!_camera_remove_export_data(module, tbm_key, FALSE))
-               LOGE("remove export data failed : key %d", tbm_key);
+       if (!_camera_remove_export_data(module, (tbm_fd)ret_fd, FALSE))
+               LOGE("remove export data failed : fd %d", ret_fd);
 
        return MUSE_CAMERA_ERROR_NONE;
 }
@@ -5443,7 +5530,7 @@ again:
                legacy_camera_start_preview(muse_camera->camera_handle);
                /* fall through */
        case CAMERA_STATE_PREVIEW:
-               _camera_remove_export_data(module, 0, TRUE); /* force return buffer before stop preview */
+               _camera_remove_export_data(module, -1, TRUE); /* force return buffer before stop preview */
                legacy_camera_stop_preview(muse_camera->camera_handle);
                /* fall through */
        case CAMERA_STATE_CREATED:
index e6205a9..da45e8e 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mmsvc-camera
 Summary:    A Camera module for muse server
-Version:    0.3.21
+Version:    0.3.22
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0