diff options
author | Mekala Natarajan <mekalan@codeaurora.org> | 2014-01-16 13:50:18 -0800 |
---|---|---|
committer | Vineeta Srivastava <vsrivastava@google.com> | 2014-01-16 15:11:26 -0800 |
commit | edda38bcd3d3a3344e09925e7bb629b9e1361a36 (patch) | |
tree | 746a7b0d7a3d1757e9edf3d0c3ef8cc497ad1b07 /camera/mm-camera-interface | |
parent | b8d393e7224d1cbd1fad5f9b819e71f092927cdf (diff) | |
download | mako-edda38bcd3d3a3344e09925e7bb629b9e1361a36.tar.gz |
camera: Fixes for race conditions in abnormal snapshot stop.
Change-Id: Iba20800baee92dcd59ae6edb96e7dc1953c83a88
Bug: 12467743
Bug: 11021907
Diffstat (limited to 'camera/mm-camera-interface')
-rw-r--r-- | camera/mm-camera-interface/mm_camera.c | 5 | ||||
-rwxr-xr-x[-rw-r--r--] | camera/mm-camera-interface/mm_camera_channel.c | 2 | ||||
-rwxr-xr-x[-rw-r--r--] | camera/mm-camera-interface/mm_camera_interface2.c | 30 | ||||
-rwxr-xr-x[-rw-r--r--] | camera/mm-camera-interface/mm_camera_interface2.h | 2 |
4 files changed, 32 insertions, 7 deletions
diff --git a/camera/mm-camera-interface/mm_camera.c b/camera/mm-camera-interface/mm_camera.c index 6cfb9b2..145fdb2 100644 --- a/camera/mm-camera-interface/mm_camera.c +++ b/camera/mm-camera-interface/mm_camera.c @@ -1087,11 +1087,6 @@ int32_t mm_camera_close(mm_camera_obj_t *my_obj) MM_CAMERA_STATE_EVT_RELEASE, NULL); } - CDBG("%s : Close Threads in Cam Close",__func__); - for(i = 0; i < MM_CAMERA_CH_MAX; i++) { - mm_camera_poll_thread_release(my_obj,(mm_camera_channel_type_t)i); - } - mm_camera_poll_threads_deinit(my_obj); my_obj->op_mode = MM_CAMERA_OP_MODE_NOTUSED; if(my_obj->ctrl_fd > 0) { rc = close(my_obj->ctrl_fd); diff --git a/camera/mm-camera-interface/mm_camera_channel.c b/camera/mm-camera-interface/mm_camera_channel.c index 6e01c8d..40f3fb0 100644..100755 --- a/camera/mm-camera-interface/mm_camera_channel.c +++ b/camera/mm-camera-interface/mm_camera_channel.c @@ -443,7 +443,7 @@ static int32_t mm_camera_ch_util_qbuf(mm_camera_obj_t *my_obj, cache_frame = val->snapshot.main.frame; CDBG("buffer fd = %d, length = %d, vaddr = %p\n", val->snapshot.main.frame->fd, val->snapshot.main.frame->ion_alloc.len, val->snapshot.main.frame->buffer); - if(!rc) { + if(!rc && (!my_obj->full_liveshot)) { if (my_obj->op_mode == MM_CAMERA_OP_MODE_ZSL) stream = &my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream; else diff --git a/camera/mm-camera-interface/mm_camera_interface2.c b/camera/mm-camera-interface/mm_camera_interface2.c index 433c612..f6ccca9 100644..100755 --- a/camera/mm-camera-interface/mm_camera_interface2.c +++ b/camera/mm-camera-interface/mm_camera_interface2.c @@ -384,7 +384,7 @@ static void mm_camera_ops_close (mm_camera_t * camera) if(my_obj->ref_count > 0) { CDBG("%s: ref_count=%d\n", __func__, my_obj->ref_count); } else { - mm_camera_poll_thread_release(my_obj, MM_CAMERA_CH_MAX); + // mm_camera_poll_thread_release(my_obj, MM_CAMERA_CH_MAX); (void)mm_camera_close(g_cam_ctrl.cam_obj[camera_id]); pthread_mutex_destroy(&my_obj->mutex); free(my_obj); @@ -394,6 +394,25 @@ static void mm_camera_ops_close (mm_camera_t * camera) pthread_mutex_unlock(&g_mutex); } +static void mm_camera_ops_stop (mm_camera_t * camera) +{ + mm_camera_obj_t * my_obj; + int i; + int8_t camera_id = camera->camera_info.camera_id; + + pthread_mutex_lock(&g_mutex); + my_obj = g_cam_ctrl.cam_obj[camera_id]; + if(my_obj) { + CDBG("%s : Close Threads in mm_camera_ops_stop",__func__); + for(i = 0; i <= MM_CAMERA_CH_MAX; i++) { + mm_camera_poll_thread_release(my_obj,(mm_camera_channel_type_t)i); + } + mm_camera_poll_threads_deinit(my_obj); + } + pthread_mutex_unlock(&g_mutex); +} + + static int32_t mm_camera_ops_ch_acquire(mm_camera_t * camera, mm_camera_channel_type_t ch_type) { @@ -464,6 +483,7 @@ static mm_camera_ops_t mm_camera_ops = { .action = mm_camera_ops_action, .open = mm_camera_ops_open, .close = mm_camera_ops_close, + .stop = mm_camera_ops_stop, .ch_acquire = mm_camera_ops_ch_acquire, .ch_release = mm_camera_ops_ch_release, .ch_set_attr = mm_camera_ops_ch_attr, @@ -850,6 +870,14 @@ void cam_ops_close(int cam_id) } } +void cam_ops_stop(int cam_id) +{ + mm_camera_t * mm_cam = get_camera_by_id(cam_id); + if (mm_cam) { + mm_cam->ops->stop(mm_cam); + } +} + int32_t cam_ops_ch_acquire(int cam_id, mm_camera_channel_type_t ch_type) { int32_t rc = -1; diff --git a/camera/mm-camera-interface/mm_camera_interface2.h b/camera/mm-camera-interface/mm_camera_interface2.h index e674d79..ba4dcd5 100644..100755 --- a/camera/mm-camera-interface/mm_camera_interface2.h +++ b/camera/mm-camera-interface/mm_camera_interface2.h @@ -295,6 +295,7 @@ typedef struct { mm_camera_ops_type_t opcode, void *val); int32_t (*open)(mm_camera_t * camera, mm_camera_op_mode_type_t op_mode); void (*close)(mm_camera_t * camera); + void (*stop)(mm_camera_t * camera); int32_t (*ch_acquire)(mm_camera_t * camera, mm_camera_channel_type_t ch_type); void (*ch_release)(mm_camera_t * camera, mm_camera_channel_type_t ch_type); int32_t (*ch_set_attr)(mm_camera_t * camera, mm_camera_channel_type_t ch_type, @@ -473,6 +474,7 @@ int32_t cam_ops_action(int cam_id, uint8_t start, mm_camera_ops_type_t opcode, void *val); int32_t cam_ops_open(int cam_id, mm_camera_op_mode_type_t op_mode); void cam_ops_close(int cam_id); +void cam_ops_stop(int cam_id); int32_t cam_ops_ch_acquire(int cam_id, mm_camera_channel_type_t ch_type); void cam_ops_ch_release(int cam_id, mm_camera_channel_type_t ch_type); int32_t cam_ops_ch_set_attr(int cam_id, mm_camera_channel_type_t ch_type, |