1a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala/* 2a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 3a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * 4a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 5a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * you may not use this file except in compliance with the License. 6a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * You may obtain a copy of the License at 7a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * 8a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 9a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * 10a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 11a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 12a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * See the License for the specific language governing permissions and 14a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * limitations under the License. 15a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala */ 16a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 17a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala#ifndef ANDROID_SERVERS_CAMERA_CAMERA2_FRAMEPROCESSOR_H 18a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala#define ANDROID_SERVERS_CAMERA_CAMERA2_FRAMEPROCESSOR_H 19a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 20a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala#include <utils/Thread.h> 21a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala#include <utils/String16.h> 22a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala#include <utils/Vector.h> 23da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/KeyedVector.h> 244865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala#include <utils/List.h> 25a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala#include "CameraMetadata.h" 26a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 27e7f256a4b1d2037a67ab139fc8131a6ca97bd405Igor Murashkinstruct camera_frame_metadata; 28e7f256a4b1d2037a67ab139fc8131a6ca97bd405Igor Murashkin 29a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalanamespace android { 30a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 31a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalaclass Camera2Client; 32a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 33a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalanamespace camera2 { 34a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 35a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala/* Output frame metadata processing thread. This thread waits for new 36a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * frames from the device, and analyzes them as necessary. 37a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala */ 38a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalaclass FrameProcessor: public Thread { 39a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala public: 40a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala FrameProcessor(wp<Camera2Client> client); 41a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala ~FrameProcessor(); 42a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 43da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala struct FilteredListener: virtual public RefBase { 444865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala virtual void onFrameAvailable(int32_t frameId, 454865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala const CameraMetadata &frame) = 0; 46da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala }; 47da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 484865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala // Register a listener for a range of IDs [minId, maxId). Multiple listeners 494865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala // can be listening to the same range 504865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala status_t registerListener(int32_t minId, int32_t maxId, wp<FilteredListener> listener); 514865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala status_t removeListener(int32_t minId, int32_t maxId, wp<FilteredListener> listener); 52da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 53a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala void dump(int fd, const Vector<String16>& args); 54a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala private: 55a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala static const nsecs_t kWaitDuration = 10000000; // 10 ms 56a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala wp<Camera2Client> mClient; 57a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 58a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala virtual bool threadLoop(); 59a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 60da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex mInputMutex; 614865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 624865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala struct RangeListener { 634865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala int32_t minId; 644865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala int32_t maxId; 654865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala wp<FilteredListener> listener; 664865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala }; 674865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala List<RangeListener> mRangeListeners; 68da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 69a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala void processNewFrames(sp<Camera2Client> &client); 70da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 71a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala status_t processFaceDetect(const CameraMetadata &frame, 72a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala sp<Camera2Client> &client); 73a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 744865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala status_t processListeners(const CameraMetadata &frame, 75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client); 76da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 77a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala CameraMetadata mLastFrame; 78e7f256a4b1d2037a67ab139fc8131a6ca97bd405Igor Murashkin int mLastFrameNumberOfFaces; 79e7f256a4b1d2037a67ab139fc8131a6ca97bd405Igor Murashkin 80e7f256a4b1d2037a67ab139fc8131a6ca97bd405Igor Murashkin // Emit FaceDetection event to java if faces changed 81e7f256a4b1d2037a67ab139fc8131a6ca97bd405Igor Murashkin void callbackFaceDetection(sp<Camera2Client> client, 82e7f256a4b1d2037a67ab139fc8131a6ca97bd405Igor Murashkin camera_frame_metadata &metadata); 83a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala}; 84a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 85a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 86a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala}; //namespace camera2 87a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala}; //namespace android 88a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 89a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala#endif 90