diff options
author | Igor Murashkin <iam@google.com> | 2012-09-20 16:27:54 -0700 |
---|---|---|
committer | Igor Murashkin <iam@google.com> | 2012-09-21 13:22:08 -0700 |
commit | e7f256a4b1d2037a67ab139fc8131a6ca97bd405 (patch) | |
tree | 66fbcfb862f370f482c0dd65016e7f00cb52f057 /services/camera/libcameraservice | |
parent | aa05a277e317ff224229c741bb97a6351d3c17db (diff) | |
download | frameworks_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.cpp | 23 | ||||
-rw-r--r-- | services/camera/libcameraservice/camera2/FrameProcessor.h | 7 |
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); }; |