FrameProcessorBase.h revision a91537e268f2b35f9f0dfdc0c4f84655c93285ae
1a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin/*
2a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin * Copyright (C) 2013 The Android Open Source Project
3a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin *
4a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin * you may not use this file except in compliance with the License.
6a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin * You may obtain a copy of the License at
7a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin *
8a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin *
10a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin * Unless required by applicable law or agreed to in writing, software
11a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin * See the License for the specific language governing permissions and
14a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin * limitations under the License.
15a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin */
16a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
17a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin#ifndef ANDROID_SERVERS_CAMERA_CAMERA2_PROFRAMEPROCESSOR_H
18a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin#define ANDROID_SERVERS_CAMERA_CAMERA2_PROFRAMEPROCESSOR_H
19a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
20a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin#include <utils/Thread.h>
21a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin#include <utils/String16.h>
22a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin#include <utils/Vector.h>
23a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin#include <utils/KeyedVector.h>
24a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin#include <utils/List.h>
25a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin#include <camera/CameraMetadata.h>
26a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
27a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkinstruct camera_frame_metadata;
28a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
29a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkinnamespace android {
30a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
31a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkinclass ProCamera2Client;
32a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
33a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkinnamespace camera2 {
34a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
35a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin/* Output frame metadata processing thread.  This thread waits for new
36a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin * frames from the device, and analyzes them as necessary.
37a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin */
38a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkinclass ProFrameProcessor: public Thread {
39a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin  public:
40a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    ProFrameProcessor(wp<ProCamera2Client> client);
41a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    ~ProFrameProcessor();
42a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
43a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    struct FilteredListener: virtual public RefBase {
44a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        virtual void onFrameAvailable(int32_t frameId,
45a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin                const CameraMetadata &frame) = 0;
46a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    };
47a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
48a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    // Register a listener for a range of IDs [minId, maxId). Multiple listeners
49a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    // can be listening to the same range
50a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    status_t registerListener(int32_t minId, int32_t maxId, wp<FilteredListener> listener);
51a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    status_t removeListener(int32_t minId, int32_t maxId, wp<FilteredListener> listener);
52a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
53a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    void dump(int fd, const Vector<String16>& args);
54a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin  private:
55a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    static const nsecs_t kWaitDuration = 10000000; // 10 ms
56a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    wp<ProCamera2Client> mClient;
57a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
58a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    virtual bool threadLoop();
59a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
60a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    Mutex mInputMutex;
61a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
62a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    struct RangeListener {
63a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        int32_t minId;
64a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        int32_t maxId;
65a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        wp<FilteredListener> listener;
66a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    };
67a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    List<RangeListener> mRangeListeners;
68a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
69a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    void processNewFrames(sp<ProCamera2Client> &client);
70a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
71a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    status_t processListeners(const CameraMetadata &frame,
72a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin            sp<ProCamera2Client> &client);
73a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
74a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    CameraMetadata mLastFrame;
75a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin};
76a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
77a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
78a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin}; //namespace camera2
79a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin}; //namespace android
80a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
81a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin#endif
82