camera: fix the problem camera get stuck in live snapshot
Change-Id: I1af45f8ff2f670782325196dc2826b8bffed35a3
diff --git a/camera/mm-camera-interface/mm_camera_notify.c b/camera/mm-camera-interface/mm_camera_notify.c
index 3825820..e1f619d 100644
--- a/camera/mm-camera-interface/mm_camera_notify.c
+++ b/camera/mm-camera-interface/mm_camera_notify.c
@@ -52,6 +52,7 @@
int rc = 0;
int idx;
int i;
+ int cnt = 0;
mm_camera_stream_t *stream;
mm_camera_buf_cb_t buf_cb[MM_CAMERA_BUF_CB_MAX];
mm_camera_ch_data_buf_t data[MM_CAMERA_BUF_CB_MAX];
@@ -65,20 +66,20 @@
for( i=0;i<MM_CAMERA_BUF_CB_MAX;i++) {
if((my_obj->ch[MM_CAMERA_CH_RAW].buf_cb[i].cb) &&
(my_obj->poll_threads[MM_CAMERA_CH_RAW].data.used == 1)){
- data[i].type = MM_CAMERA_CH_RAW;
- data[i].def.idx = idx;
- data[i].def.frame = &my_obj->ch[MM_CAMERA_CH_RAW].raw.stream.frame.frame[idx].frame;
+ data[cnt].type = MM_CAMERA_CH_RAW;
+ data[cnt].def.idx = idx;
+ data[cnt].def.frame = &my_obj->ch[MM_CAMERA_CH_RAW].raw.stream.frame.frame[idx].frame;
my_obj->ch[MM_CAMERA_CH_RAW].raw.stream.frame.ref_count[idx]++;
CDBG("%s:calling data notify cb 0x%x, 0x%x\n", __func__,
(uint32_t)my_obj->ch[MM_CAMERA_CH_RAW].buf_cb[i].cb,
(uint32_t)my_obj->ch[MM_CAMERA_CH_RAW].buf_cb[i].user_data);
- memcpy(&buf_cb[i], &my_obj->ch[MM_CAMERA_CH_RAW].buf_cb[i],
- sizeof(mm_camera_buf_cb_t) * MM_CAMERA_BUF_CB_MAX);
+ memcpy(&buf_cb[cnt], &my_obj->ch[MM_CAMERA_CH_RAW].buf_cb[i], sizeof(mm_camera_buf_cb_t));
+ cnt++;
}
}
pthread_mutex_unlock(&my_obj->ch[MM_CAMERA_CH_RAW].mutex);
- for( i=0;i<MM_CAMERA_BUF_CB_MAX;i++) {
+ for( i=0;i<cnt;i++) {
if(buf_cb[i].cb != NULL && my_obj->poll_threads[MM_CAMERA_CH_RAW].data.used == 1){
buf_cb[i].cb(&data[i],buf_cb[i].user_data);
}
@@ -372,7 +373,7 @@
send_to_hal:
for( i=0;i < MM_CAMERA_BUF_CB_MAX;i++) {
if (buf_cb[i].cb && my_obj->poll_threads[MM_CAMERA_CH_SNAPSHOT].data.used == 1)
- buf_cb[i].cb(&data,buf_cb[i].user_data);
+ buf_cb[i].cb(&data,buf_cb[i].user_data);
}
if(deliver_done > 0) {
mm_camera_event_t data_evt;
@@ -390,6 +391,7 @@
int rc = 0;
int idx;
int i;
+ int cnt = 0;
mm_camera_stream_t *stream;
mm_camera_buf_cb_t buf_cb[MM_CAMERA_BUF_CB_MAX];
mm_camera_ch_data_buf_t data[MM_CAMERA_BUF_CB_MAX];
@@ -408,9 +410,9 @@
for( i=0;i<MM_CAMERA_BUF_CB_MAX;i++) {
if((my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb[i].cb) &&
(my_obj->poll_threads[MM_CAMERA_CH_PREVIEW].data.used == 1)) {
- data[i].type = MM_CAMERA_CH_PREVIEW;
- data[i].def.idx = idx;
- data[i].def.frame = &my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream.frame.frame[idx].frame;
+ data[cnt].type = MM_CAMERA_CH_PREVIEW;
+ data[cnt].def.idx = idx;
+ data[cnt].def.frame = &my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream.frame.frame[idx].frame;
/* Since the frame is originating here, reset the ref count to either
* 2(ZSL case) or 1(non-ZSL case). */
if(my_obj->op_mode == MM_CAMERA_OP_MODE_ZSL)
@@ -422,13 +424,14 @@
(uint32_t)my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb[i].user_data);
/*my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb[i].cb(&data,
my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb[i].user_data);*/
- memcpy(&buf_cb[i], &my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb[i],
- sizeof(mm_camera_buf_cb_t) * MM_CAMERA_BUF_CB_MAX);
+ memcpy(&buf_cb[cnt], &my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb[i],
+ sizeof(mm_camera_buf_cb_t));
+ cnt++;
}
}
pthread_mutex_unlock(&my_obj->ch[MM_CAMERA_CH_PREVIEW].mutex);
- for( i=0;i<MM_CAMERA_BUF_CB_MAX;i++) {
+ for( i=0;i<cnt;i++) {
if(buf_cb[i].cb != NULL && my_obj->poll_threads[MM_CAMERA_CH_PREVIEW].data.used == 1) {
buf_cb[i].cb(&data[i],buf_cb[i].user_data);
}
@@ -449,6 +452,7 @@
int delivered = 0;
mm_camera_frame_queue_t *s_q;
int i;
+ int cnt = 0;
// mm_camera_frame_queue_t *s_q, *t_q;
mm_camera_buf_cb_t buf_cb[MM_CAMERA_BUF_CB_MAX];
mm_camera_ch_data_buf_t data[MM_CAMERA_BUF_CB_MAX];
@@ -459,16 +463,18 @@
for( i=0;i<MM_CAMERA_BUF_CB_MAX;i++) {
if(s_q->cnt && my_obj->ch[MM_CAMERA_CH_SNAPSHOT].buf_cb[i].cb) {
- data[i].type = MM_CAMERA_CH_SNAPSHOT;
+ data[cnt].type = MM_CAMERA_CH_SNAPSHOT;
frame = mm_camera_stream_frame_deq(s_q);
- data[i].snapshot.main.frame = &frame->frame;
- data[i].snapshot.main.idx = frame->idx;
- data[i].snapshot.thumbnail.frame = NULL;
- my_obj->ch[MM_CAMERA_CH_SNAPSHOT].snapshot.main.frame.ref_count[data[i].snapshot.main.idx]++;
+ data[cnt].snapshot.main.frame = &frame->frame;
+ data[cnt].snapshot.main.idx = frame->idx;
+ data[cnt].snapshot.thumbnail.frame = NULL;
+ my_obj->ch[MM_CAMERA_CH_SNAPSHOT].snapshot.main.frame.ref_count[data[cnt].snapshot.main.idx]++;
/*my_obj->ch[MM_CAMERA_CH_SNAPSHOT].buf_cb[i].cb(&data,
my_obj->ch[MM_CAMERA_CH_SNAPSHOT].buf_cb[i].user_data);*/
- memcpy(&buf_cb[i], &my_obj->ch[MM_CAMERA_CH_SNAPSHOT].buf_cb[i],
- sizeof(mm_camera_buf_cb_t) * MM_CAMERA_BUF_CB_MAX);
+ memcpy(&buf_cb[cnt], &my_obj->ch[MM_CAMERA_CH_SNAPSHOT].buf_cb[i],
+ sizeof(mm_camera_buf_cb_t));
+ cnt++;
+
my_obj->snap_burst_num_by_user -= 1;
CDBG("%s: burst number =%d", __func__, my_obj->snap_burst_num_by_user);
delivered = 1;
@@ -476,7 +482,7 @@
}
pthread_mutex_unlock(&my_obj->ch[MM_CAMERA_CH_SNAPSHOT].mutex);
- for( i=0;i<MM_CAMERA_BUF_CB_MAX;i++) {
+ for( i=0;i<cnt;i++) {
if(buf_cb[i].cb != NULL && my_obj->poll_threads[MM_CAMERA_CH_SNAPSHOT].data.used == 1) {
buf_cb[i].cb(&data[i],buf_cb[i].user_data);
}
@@ -495,6 +501,7 @@
{
int delivered = 0;
int i;
+ int cnt = 0;
mm_camera_frame_queue_t *s_q, *t_q;
mm_camera_frame_t *frame;
//mm_camera_buf_cb_t buf_cb;
@@ -514,29 +521,30 @@
my_obj->poll_threads[MM_CAMERA_CH_SNAPSHOT].data.used);
if((s_q->cnt && t_q->cnt && my_obj->ch[MM_CAMERA_CH_SNAPSHOT].buf_cb[i].cb) &&
(my_obj->poll_threads[MM_CAMERA_CH_SNAPSHOT].data.used == 1)) {
- data[i].type = MM_CAMERA_CH_SNAPSHOT;
+ data[cnt].type = MM_CAMERA_CH_SNAPSHOT;
frame = mm_camera_stream_frame_deq(s_q);
- data[i].snapshot.main.frame = &frame->frame;
- data[i].snapshot.main.idx = frame->idx;
+ data[cnt].snapshot.main.frame = &frame->frame;
+ data[cnt].snapshot.main.idx = frame->idx;
frame = mm_camera_stream_frame_deq(t_q);
- data[i].snapshot.thumbnail.frame = &frame->frame;
- data[i].snapshot.thumbnail.idx = frame->idx;
+ data[cnt].snapshot.thumbnail.frame = &frame->frame;
+ data[cnt].snapshot.thumbnail.idx = frame->idx;
my_obj->ch[MM_CAMERA_CH_SNAPSHOT].snapshot.main.frame.ref_count[data[i].snapshot.main.idx]++;
my_obj->ch[MM_CAMERA_CH_SNAPSHOT].snapshot.thumbnail.frame.ref_count[data[i].snapshot.thumbnail.idx]++;
- if(my_obj->poll_threads[MM_CAMERA_CH_SNAPSHOT].data.used == 1){
- //bu = my_obj->ch[MM_CAMERA_CH_SNAPSHOT].buf_cb[i];
- memcpy(&buf_cb[i], &my_obj->ch[MM_CAMERA_CH_SNAPSHOT].buf_cb[i],
- sizeof(mm_camera_buf_cb_t) * MM_CAMERA_BUF_CB_MAX);
- //buf_cb.cb(&data,buf_cb.user_data);
- my_obj->snap_burst_num_by_user -= 1;
- CDBG("%s: burst number =%d", __func__, my_obj->snap_burst_num_by_user);
- delivered = 1;
- }
+
+ //bu = my_obj->ch[MM_CAMERA_CH_SNAPSHOT].buf_cb[i];
+ memcpy(&buf_cb[cnt], &my_obj->ch[MM_CAMERA_CH_SNAPSHOT].buf_cb[i],
+ sizeof(mm_camera_buf_cb_t));
+ cnt++;
+
+ //buf_cb.cb(&data,buf_cb.user_data);
+ my_obj->snap_burst_num_by_user -= 1;
+ CDBG("%s: burst number =%d", __func__, my_obj->snap_burst_num_by_user);
+ delivered = 1;
}
}
pthread_mutex_unlock(&my_obj->ch[MM_CAMERA_CH_SNAPSHOT].mutex);
- for( i=0;i<MM_CAMERA_BUF_CB_MAX;i++) {
+ for( i=0;i<cnt;i++) {
if(buf_cb[i].cb != NULL && my_obj->poll_threads[MM_CAMERA_CH_SNAPSHOT].data.used == 1) {
buf_cb[i].cb(&data[i],buf_cb[i].user_data);
}
@@ -622,6 +630,7 @@
mm_camera_stream_t *stream;
mm_camera_frame_queue_t *q;
int i;
+ int cnt = 0;
mm_camera_buf_cb_t buf_cb[MM_CAMERA_BUF_CB_MAX];
mm_camera_ch_data_buf_t data[MM_CAMERA_BUF_CB_MAX];
@@ -633,23 +642,26 @@
idx = mm_camera_read_msm_frame(my_obj,stream);
if (idx < 0)
return;
+
ALOGE("Video thread locked");
pthread_mutex_lock(&my_obj->ch[MM_CAMERA_CH_VIDEO].mutex);
for( i=0;i<MM_CAMERA_BUF_CB_MAX;i++) {
if((my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].cb) &&
(my_obj->poll_threads[MM_CAMERA_CH_VIDEO].data.used == 1)){
- data[i].type = MM_CAMERA_CH_VIDEO;
- data[i].video.main.frame = NULL;
- data[i].video.main.idx = -1;
- data[i].video.video.idx = idx;
- data[i].video.video.frame = &my_obj->ch[MM_CAMERA_CH_VIDEO].video.video.
+ data[cnt].type = MM_CAMERA_CH_VIDEO;
+ data[cnt].video.main.frame = NULL;
+ data[cnt].video.main.idx = -1;
+ data[cnt].video.video.idx = idx;
+ data[cnt].video.video.frame = &my_obj->ch[MM_CAMERA_CH_VIDEO].video.video.
frame.frame[idx].frame;
my_obj->ch[MM_CAMERA_CH_VIDEO].video.video.frame.ref_count[idx]++;
ALOGE("Video thread callback issued");
//my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].cb(&data,
// my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].user_data);
- memcpy(&buf_cb[i], &my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i],
- sizeof(mm_camera_buf_cb_t) * MM_CAMERA_BUF_CB_MAX);
+ memcpy(&buf_cb[cnt], &my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i],
+ sizeof(mm_camera_buf_cb_t));
+ cnt++;
+
ALOGE("Video thread callback returned");
if( my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].cb_type==MM_CAMERA_BUF_CB_COUNT ) {
ALOGE("<DEBUG>:%s: Additional cb called for buffer %p:%d",__func__,stream,idx);
@@ -660,7 +672,7 @@
}
pthread_mutex_unlock(&my_obj->ch[MM_CAMERA_CH_VIDEO].mutex);
- for( i=0;i<MM_CAMERA_BUF_CB_MAX;i++) {
+ for( i=0;i<cnt;i++) {
if(buf_cb[i].cb != NULL && my_obj->poll_threads[MM_CAMERA_CH_VIDEO].data.used == 1) {
buf_cb[i].cb(&data[i],buf_cb[i].user_data);
}