#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;
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);
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;
}
LOGW("unknown type %d", get_type);
}
- __camera_dispatcher_send_msg(module, send_msg);
+ __camera_dispatcher_send_msg(module, send_msg, NULL);
return;
}
MUSE_TYPE_INT, "get_value1", value1,
0);
- __camera_dispatcher_send_msg(module, send_msg);
+ __camera_dispatcher_send_msg(module, send_msg, NULL);
return;
}
MUSE_TYPE_INT, name, value,
0);
- __camera_dispatcher_send_msg(module, send_msg);
+ __camera_dispatcher_send_msg(module, send_msg, NULL);
return;
}
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;
}
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;
}
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;
}
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) {
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 {
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;
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;
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;
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;
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;
}
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;
}
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;
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;
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);
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 */
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;
}
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);
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);
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;
}
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) {
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);
/* 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);
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);
}
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);
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);
}
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);
}
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;
}
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: