summaryrefslogtreecommitdiffstats
path: root/services/camera/libcameraservice
diff options
context:
space:
mode:
authorIgor Murashkin <iam@google.com>2012-09-20 16:27:54 -0700
committerIgor Murashkin <iam@google.com>2012-09-21 13:22:08 -0700
commite7f256a4b1d2037a67ab139fc8131a6ca97bd405 (patch)
tree66fbcfb862f370f482c0dd65016e7f00cb52f057 /services/camera/libcameraservice
parentaa05a277e317ff224229c741bb97a6351d3c17db (diff)
downloadframeworks_av-e7f256a4b1d2037a67ab139fc8131a6ca97bd405.zip
frameworks_av-e7f256a4b1d2037a67ab139fc8131a6ca97bd405.tar.gz
frameworks_av-e7f256a4b1d2037a67ab139fc8131a6ca97bd405.tar.bz2
Camera2: Emit FaceDetection events for all except repeating 0-face frames
Bug: 7205311 Change-Id: I570209445acf3a26f2246c3fe886d56bb63bd2f8
Diffstat (limited to 'services/camera/libcameraservice')
-rw-r--r--services/camera/libcameraservice/camera2/FrameProcessor.cpp23
-rw-r--r--services/camera/libcameraservice/camera2/FrameProcessor.h7
2 files changed, 25 insertions, 5 deletions
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 android {
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::processListener(CameraMetadata &frame,
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 @@ status_t FrameProcessor::processFaceDetect(const CameraMetadata &frame,
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 @@ status_t FrameProcessor::processFaceDetect(const CameraMetadata &frame,
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 @@ class FrameProcessor: public Thread {
sp<Camera2Client> &client);
CameraMetadata mLastFrame;
+ int mLastFrameNumberOfFaces;
+
+ // Emit FaceDetection event to java if faces changed
+ void callbackFaceDetection(sp<Camera2Client> client,
+ camera_frame_metadata &metadata);
};