Merge "Camera2: Don't use ZSL when flash is on force fire mode." into jb-mr1-dev
diff --git a/services/camera/libcameraservice/camera2/FrameProcessor.cpp b/services/camera/libcameraservice/camera2/FrameProcessor.cpp
index a7d19aa..d3d7b3e 100644
--- a/services/camera/libcameraservice/camera2/FrameProcessor.cpp
+++ b/services/camera/libcameraservice/camera2/FrameProcessor.cpp
@@ -29,7 +29,7 @@
 namespace camera2 {
 
 FrameProcessor::FrameProcessor(wp<Camera2Client> client):
-        Thread(false), mClient(client) {
+        Thread(false), mClient(client), mLastFrameNumberOfFaces(0) {
 }
 
 FrameProcessor::~FrameProcessor() {
@@ -148,7 +148,7 @@
 
 status_t FrameProcessor::processFaceDetect(const CameraMetadata &frame,
         sp<Camera2Client> &client) {
-    status_t res;
+    status_t res = BAD_VALUE;
     ATRACE_CALL();
     camera_metadata_ro_entry_t entry;
     bool enableFaceDetect;
@@ -175,7 +175,9 @@
         entry = frame.find(ANDROID_STATS_FACE_RECTANGLES);
         if (entry.count == 0) {
             // No faces this frame
-            return res;
+            /* warning: locks SharedCameraClient */
+            callbackFaceDetection(client, metadata);
+            return OK;
         }
         metadata.number_of_faces = entry.count / 4;
         if (metadata.number_of_faces >
@@ -260,14 +262,25 @@
         metadata.faces = faces.editArray();
     }
 
-    if (metadata.number_of_faces != 0) {
+    /* warning: locks SharedCameraClient */
+    callbackFaceDetection(client, metadata);
+
+    return OK;
+}
+
+void FrameProcessor::callbackFaceDetection(sp<Camera2Client> client,
+                               /*in*/camera_frame_metadata &metadata) {
+
+    /* Filter out repeated 0-face callbacks, but not when the last frame was >0 */
+    if (metadata.number_of_faces != 0 || mLastFrameNumberOfFaces != metadata.number_of_faces) {
         Camera2Client::SharedCameraClient::Lock l(client->mSharedCameraClient);
         if (l.mCameraClient != NULL) {
             l.mCameraClient->dataCallback(CAMERA_MSG_PREVIEW_METADATA,
                     NULL, &metadata);
         }
     }
-    return OK;
+
+    mLastFrameNumberOfFaces = metadata.number_of_faces;
 }
 
 }; // namespace camera2
diff --git a/services/camera/libcameraservice/camera2/FrameProcessor.h b/services/camera/libcameraservice/camera2/FrameProcessor.h
index 25d489a..cc8c128 100644
--- a/services/camera/libcameraservice/camera2/FrameProcessor.h
+++ b/services/camera/libcameraservice/camera2/FrameProcessor.h
@@ -23,6 +23,8 @@
 #include <utils/KeyedVector.h>
 #include "CameraMetadata.h"
 
+struct camera_frame_metadata;
+
 namespace android {
 
 class Camera2Client;
@@ -67,6 +69,11 @@
             sp<Camera2Client> &client);
 
     CameraMetadata mLastFrame;
+    int mLastFrameNumberOfFaces;
+
+    // Emit FaceDetection event to java if faces changed
+    void callbackFaceDetection(sp<Camera2Client> client,
+                               camera_frame_metadata &metadata);
 };