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>
26cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei#include <camera/CaptureResult.h>
27a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
28a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkinnamespace android {
29a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
30ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkinclass CameraDeviceBase;
31a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
32a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkinnamespace camera2 {
33a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
34a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin/* Output frame metadata processing thread.  This thread waits for new
35a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin * frames from the device, and analyzes them as necessary.
36a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin */
377b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass FrameProcessorBase: public Thread {
38a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin  public:
398b0b971b1416738f22488a80be726d1ec12552a8Chih-Hung Hsieh    explicit FrameProcessorBase(wp<CameraDeviceBase> device);
407b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala    virtual ~FrameProcessorBase();
41a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
42a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    struct FilteredListener: virtual public RefBase {
43cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        virtual void onResultAvailable(const CaptureResult &result) = 0;
44a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    };
45a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
46a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    // Register a listener for a range of IDs [minId, maxId). Multiple listeners
47954d248e02e19f8ecd165804b7d063d346154f4cGaurav Batra    // can be listening to the same range. Registering the same listener with
48954d248e02e19f8ecd165804b7d063d346154f4cGaurav Batra    // the same range of IDs has no effect.
4925a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    // sendPartials controls whether partial results will be sent.
50ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin    status_t registerListener(int32_t minId, int32_t maxId,
518b0b971b1416738f22488a80be726d1ec12552a8Chih-Hung Hsieh                              const wp<FilteredListener>& listener,
5225a0aef19e170d2695f64b4c48296e7914155a88Zhijun He                              bool sendPartials = true);
53ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin    status_t removeListener(int32_t minId, int32_t maxId,
548b0b971b1416738f22488a80be726d1ec12552a8Chih-Hung Hsieh                            const wp<FilteredListener>& listener);
55a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
56a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    void dump(int fd, const Vector<String16>& args);
57ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin  protected:
58a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    static const nsecs_t kWaitDuration = 10000000; // 10 ms
59ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin    wp<CameraDeviceBase> mDevice;
60a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
61a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    virtual bool threadLoop();
62a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
63a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    Mutex mInputMutex;
64215bb3499c7eeea6303e55fac66452f2574c022aIgor Murashkin    Mutex mLastFrameMutex;
65a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
66a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    struct RangeListener {
67a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        int32_t minId;
68a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        int32_t maxId;
69a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        wp<FilteredListener> listener;
7025a0aef19e170d2695f64b4c48296e7914155a88Zhijun He        bool sendPartials;
71a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    };
72a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    List<RangeListener> mRangeListeners;
73a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
74204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    // Number of partial result the HAL will potentially send.
75204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    int32_t mNumPartialResults;
76204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He
77ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin    void processNewFrames(const sp<CameraDeviceBase> &device);
78ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin
79cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual bool processSingleFrame(CaptureResult &result,
80ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin                                    const sp<CameraDeviceBase> &device);
81a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
82cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    status_t processListeners(const CaptureResult &result,
83ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin                              const sp<CameraDeviceBase> &device);
84a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
85a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    CameraMetadata mLastFrame;
86a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin};
87a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
88a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
89a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin}; //namespace camera2
90a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin}; //namespace android
91a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
92a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin#endif
93