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