Camera3: Add poll fd in QBUF as asynchronous call

Without this change, there is deadlock when both Data_notify and
Qbuf are coming at same time i.e, data_notify is waiting for buf_lock
mutex which acquired by qbuf and qbuf-> Add poll fd is waiting for
data_notify to finish.

Fix:
1) Adding Poll fd in asynchronous way i.e, POLL FD need not to wait for
data_notify cb's to finish.
2) Increase the Meta Data buffers to 18 to avoid the meta buffer starvation

Bug: 11053901
Bug: 11105095
Change-Id: I574b25378639f5bc10b753af06b6d729261ee11d
Signed-off-by: Ed Tam <etam@google.com>
diff --git a/camera/QCamera2/HAL3/QCamera3Channel.cpp b/camera/QCamera2/HAL3/QCamera3Channel.cpp
index 14a13c1..389b819 100755
--- a/camera/QCamera2/HAL3/QCamera3Channel.cpp
+++ b/camera/QCamera2/HAL3/QCamera3Channel.cpp
@@ -45,7 +45,7 @@
 
 using namespace android;
 
-#define MIN_STREAMING_BUFFER_NUM 7
+#define MIN_STREAMING_BUFFER_NUM 18
 
 namespace qcamera {
 static const char ExifAsciiPrefix[] =
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index c3ac7af..580f791 100755
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -459,7 +459,7 @@
 
     for (size_t i = 0; i < streamList->num_streams; i++) {
         camera3_stream_t *newStream = streamList->streams[i];
-        ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d",
+        ALOGD("%s: newStream type = %d, stream format = %d stream size : %d x %d",
                 __func__, newStream->stream_type, newStream->format,
                  newStream->width, newStream->height);
         //if the stream is in the mStreamList validate it
diff --git a/camera/QCamera2/stack/mm-camera-interface/inc/mm_camera.h b/camera/QCamera2/stack/mm-camera-interface/inc/mm_camera.h
old mode 100644
new mode 100755
index ce63827..52e6c24
--- a/camera/QCamera2/stack/mm-camera-interface/inc/mm_camera.h
+++ b/camera/QCamera2/stack/mm-camera-interface/inc/mm_camera.h
@@ -561,7 +561,8 @@
                                 uint32_t handler,
                                 int32_t fd,
                                 mm_camera_poll_notify_t nofity_cb,
-                                void *userdata);
+                                void *userdata,
+                                mm_camera_call_type_t);
 extern int32_t mm_camera_poll_thread_del_poll_fd(
                                 mm_camera_poll_thread_t * poll_cb,
                                 uint32_t handler,
diff --git a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c
old mode 100644
new mode 100755
index 1e138b6..afeb319
--- a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c
+++ b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c
@@ -1447,7 +1447,8 @@
                                                my_obj->my_hdl,
                                                my_obj->ctrl_fd,
                                                mm_camera_event_notify,
-                                               (void*)my_obj);
+                                               (void*)my_obj,
+                                               mm_camera_sync_call);
     }
     return rc;
 }
diff --git a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c
old mode 100644
new mode 100755
index 97d141c..dca17d6
--- a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c
+++ b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c
@@ -1166,7 +1166,8 @@
                 my_obj->my_hdl,
                 my_obj->fd,
                 mm_stream_data_notify,
-                (void*)my_obj);
+                (void*)my_obj,
+                mm_camera_async_call);
         CDBG_HIGH("%s: Started poll on stream %p type :%d", __func__, my_obj,my_obj->stream_info->stream_type);
         if (rc < 0) {
             ALOGE("%s: add poll fd error", __func__);
diff --git a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c
index dd627df..bac0168 100755
--- a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c
+++ b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c
@@ -368,6 +368,7 @@
  *   @fd        : file descriptor need to be added into polling thread
  *   @notify_cb : callback function to handle if any notify from fd
  *   @userdata  : user data ptr
+ *   @call_type : Whether its Synchronous or Asynchronous call
  *
  * RETURN     : none
  *==========================================================================*/
@@ -375,7 +376,8 @@
                                           uint32_t handler,
                                           int32_t fd,
                                           mm_camera_poll_notify_t notify_cb,
-                                          void* userdata)
+                                          void* userdata,
+                                          mm_camera_call_type_t call_type)
 {
     int32_t rc = -1;
     uint8_t idx = 0;
@@ -394,7 +396,11 @@
         poll_cb->poll_entries[idx].notify_cb = notify_cb;
         poll_cb->poll_entries[idx].user_data = userdata;
         /* send poll entries updated signal to poll thread */
-        rc = mm_camera_poll_sig(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED);
+        if (call_type == mm_camera_sync_call ) {
+            rc = mm_camera_poll_sig(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED);
+        } else {
+            rc = mm_camera_poll_sig_async(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED_ASYNC );
+        }
     } else {
         CDBG_ERROR("%s: invalid handler %d (%d)",
                    __func__, handler, idx);