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);
         }