summaryrefslogtreecommitdiff
path: root/camera/mm-camera-interface
diff options
context:
space:
mode:
authorMekala Natarajan <mekalan@codeaurora.org>2014-01-16 13:50:18 -0800
committerVineeta Srivastava <vsrivastava@google.com>2014-01-16 15:11:26 -0800
commitedda38bcd3d3a3344e09925e7bb629b9e1361a36 (patch)
tree746a7b0d7a3d1757e9edf3d0c3ef8cc497ad1b07 /camera/mm-camera-interface
parentb8d393e7224d1cbd1fad5f9b819e71f092927cdf (diff)
downloadmako-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.c5
-rwxr-xr-x[-rw-r--r--]camera/mm-camera-interface/mm_camera_channel.c2
-rwxr-xr-x[-rw-r--r--]camera/mm-camera-interface/mm_camera_interface2.c30
-rwxr-xr-x[-rw-r--r--]camera/mm-camera-interface/mm_camera_interface2.h2
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,