Update shutdown cmd for remained buffer release 14/117614/3 accepted/tizen/common/20170309.174911 accepted/tizen/ivi/20170308.120224 accepted/tizen/mobile/20170308.120144 accepted/tizen/tv/20170308.120202 accepted/tizen/unified/20170310.080652 accepted/tizen/wearable/20170308.120214 submit/tizen/20170307.122057 submit/tizen_unified/20170310.011402
authorJeongmo Yang <jm80.yang@samsung.com>
Mon, 27 Feb 2017 06:00:16 +0000 (15:00 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Tue, 7 Mar 2017 02:57:55 +0000 (18:57 -0800)
[Version] 0.2.73
[Profile] Common
[Issue Type] Bug fix
[Dependency module] N/A

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

index dc85d9f..fed14a1 100644 (file)
@@ -60,6 +60,7 @@ typedef struct {
        GQueue task_queue;
        gboolean task_run;
        muse_module_h module;
+       gboolean is_shutting_down;
 } muse_camera_handle_s;
 
 
index 299bfcd..37c6c0b 100644 (file)
@@ -423,10 +423,16 @@ static int _camera_remove_export_data(muse_module_h module, int key, int remove_
 
        while (tmp_list) {
                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 (remove_all) {
+                                       LOGW("remove remained export data key %d, internal buffer %p",
+                                               export_data->key, export_data->internal_buffer);
+                               }
+
                                if (export_data->is_capture) {
                                        LOGD("capture callback is done");
                                        g_cond_signal(&muse_camera->list_cond);
@@ -438,7 +444,9 @@ static int _camera_remove_export_data(muse_module_h module, int key, int remove_
                                } else {
                                        LOGW("bo for key %d is NULL", key);
                                }
+
                                export_data->key = 0;
+
                                if (export_data->internal_buffer) {
                                        gst_buffer_unref((GstBuffer *)export_data->internal_buffer);
                                        export_data->internal_buffer = NULL;
@@ -465,14 +473,12 @@ static int _camera_remove_export_data(muse_module_h module, int key, int remove_
                } else {
                        LOGW("NULL data");
                }
-
-               tmp_list = tmp_list->next;
        }
 
        g_mutex_unlock(&muse_camera->list_lock);
 
        if (remove_all) {
-               LOGD("remove all done");
+               LOGW("remove all done");
        } else {
                LOGE("should not be reached here - key %d", key);
        }
@@ -776,6 +782,7 @@ void _camera_dispatcher_preview_cb(MMCamcorderVideoStreamDataType *stream, void
        int data_key = 0;
        int buffer_key[BUFFER_MAX_PLANE_NUM] = {0, };
        int num_buffer_key = 0;
+       int send_ret = 0;
        muse_module_h module = (muse_module_h)user_data;
        unsigned char *buf_pos = NULL;
        char *send_message = NULL;
@@ -939,7 +946,16 @@ void _camera_dispatcher_preview_cb(MMCamcorderVideoStreamDataType *stream, void
 
        /* add bo info to list */
        g_mutex_lock(&muse_camera->list_lock);
+
        muse_camera->data_list = g_list_append(muse_camera->data_list, (gpointer)export_data);
+
+       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);
+               return;
+       }
+
        g_mutex_unlock(&muse_camera->list_lock);
 
        g_mutex_lock(&muse_camera->preview_cb_lock);
@@ -954,13 +970,13 @@ void _camera_dispatcher_preview_cb(MMCamcorderVideoStreamDataType *stream, void
                MUSE_TYPE_ARRAY, "buffer_key", BUFFER_MAX_PLANE_NUM, buffer_key,
                0);
 
-       muse_core_ipc_send_msg(muse_core_client_get_msg_fd(module), send_message);
+       send_ret = muse_core_ipc_send_msg(muse_core_client_get_msg_fd(module), send_message);
 
        muse_core_msg_json_factory_free(send_message);
 
        /*LOGD("wait preview callback return message");*/
 
-       if (!CHECK_PREVIEW_CB(muse_camera, PREVIEW_CB_TYPE_EVAS)) {
+       if (!CHECK_PREVIEW_CB(muse_camera, PREVIEW_CB_TYPE_EVAS) && send_ret > 0) {
                gint64 end_time = g_get_monotonic_time() + G_TIME_SPAN_SECOND;
 
                if (!g_cond_wait_until(&muse_camera->preview_cb_cond, &muse_camera->preview_cb_lock, end_time)) {
@@ -1297,7 +1313,7 @@ static void *_camera_dispatcher_task_func(gpointer data)
 }
 
 
-_camera_dispatcher_release_resource(muse_module_h module)
+static void _camera_dispatcher_release_resource(muse_module_h module)
 {
        muse_camera_handle_s *muse_camera = NULL;
 
@@ -1341,6 +1357,10 @@ _camera_dispatcher_release_resource(muse_module_h module)
 
        free(muse_camera);
        muse_camera = NULL;
+
+       LOGW("leave");
+
+       return;
 }
 
 
@@ -5141,6 +5161,8 @@ static int camera_cmd_dispatcher_shutdown(muse_module_h module)
 
        legacy_camera_lock(muse_camera->camera_handle, false);
 
+       muse_camera->is_shutting_down = true;
+
 again:
        legacy_camera_get_state(muse_camera->camera_handle, &state);
 
@@ -5161,6 +5183,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 */
                legacy_camera_stop_preview(muse_camera->camera_handle);
                /* fall through */
        case CAMERA_STATE_CREATED:
index 989139b..79d254a 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mmsvc-camera
 Summary:    A Camera module for muse server
-Version:    0.2.72
+Version:    0.2.73
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0