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 Murashkinnamespace android {
28a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
29ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkinclass CameraDeviceBase;
30a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
31a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkinnamespace camera2 {
32a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
33a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin/* Output frame metadata processing thread.  This thread waits for new
34a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin * frames from the device, and analyzes them as necessary.
35a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin */
367b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass FrameProcessorBase: public Thread {
37a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin  public:
387b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala    FrameProcessorBase(wp<CameraDeviceBase> device);
397b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala    virtual ~FrameProcessorBase();
40a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
41a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    struct FilteredListener: virtual public RefBase {
42f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        virtual void onFrameAvailable(int32_t requestId,
43ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin                                      const CameraMetadata &frame) = 0;
44a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    };
45a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
46a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    // Register a listener for a range of IDs [minId, maxId). Multiple listeners
47184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala    // can be listening to the same range.
48184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala    // QUIRK: sendPartials controls whether partial results will be sent.
49ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin    status_t registerListener(int32_t minId, int32_t maxId,
50184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala                              wp<FilteredListener> listener,
51184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala                              bool quirkSendPartials = true);
52ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin    status_t removeListener(int32_t minId, int32_t maxId,
53ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin                            wp<FilteredListener> listener);
54a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
55a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    void dump(int fd, const Vector<String16>& args);
56ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin  protected:
57a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    static const nsecs_t kWaitDuration = 10000000; // 10 ms
58ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin    wp<CameraDeviceBase> mDevice;
59a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
60a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    virtual bool threadLoop();
61a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
62a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    Mutex mInputMutex;
63215bb3499c7eeea6303e55fac66452f2574c022aIgor Murashkin    Mutex mLastFrameMutex;
64a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
65a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    struct RangeListener {
66a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        int32_t minId;
67a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        int32_t maxId;
68a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        wp<FilteredListener> listener;
69184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala        bool quirkSendPartials;
70a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    };
71a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    List<RangeListener> mRangeListeners;
72a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
73ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin    void processNewFrames(const sp<CameraDeviceBase> &device);
74ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin
75ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin    virtual bool processSingleFrame(CameraMetadata &frame,
76ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin                                    const sp<CameraDeviceBase> &device);
77a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
78a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    status_t processListeners(const CameraMetadata &frame,
79ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin                              const sp<CameraDeviceBase> &device);
80a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
81a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    CameraMetadata mLastFrame;
82a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin};
83a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
84a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
85a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin}; //namespace camera2
86a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin}; //namespace android
87a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
88a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin#endif
89