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