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>
2369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/KeyedVector.h>
244c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala#include <utils/List.h>
2571381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin#include <camera/CameraMetadata.h>
2671381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin
277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/FrameProcessorBase.h"
28a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala
2946dee9da04e80971c93cf23d772355217c88bb6aIgor Murashkinstruct camera_frame_metadata;
3046dee9da04e80971c93cf23d772355217c88bb6aIgor Murashkin
31a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalanamespace android {
32a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala
33a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalaclass Camera2Client;
34a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala
35a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalanamespace camera2 {
36a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala
37a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala/* Output frame metadata processing thread.  This thread waits for new
38a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * frames from the device, and analyzes them as necessary.
39a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala */
407b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass FrameProcessor : public FrameProcessorBase {
41a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala  public:
42fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    FrameProcessor(wp<CameraDeviceBase> device, sp<Camera2Client> client);
43a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    ~FrameProcessor();
44a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala
45a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala  private:
46a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    wp<Camera2Client> mClient;
4746910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala
4846910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    bool mSynthesize3ANotify;
4946910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala
5071381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin    int mLastFrameNumberOfFaces;
51a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala
5271381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin    void processNewFrames(const sp<Camera2Client> &client);
5369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
54cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual bool processSingleFrame(CaptureResult &frame,
5571381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin                                    const sp<CameraDeviceBase> &device);
5669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
57a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    status_t processFaceDetect(const CameraMetadata &frame,
5871381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin            const sp<Camera2Client> &client);
5946dee9da04e80971c93cf23d772355217c88bb6aIgor Murashkin
6046910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    // Send 3A state change notifications to client based on frame metadata
61741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh    status_t process3aState(const CaptureResult &frame,
6246910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala            const sp<Camera2Client> &client);
6346910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala
64fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // Helper for process3aState
65fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    template<typename Src, typename T>
66fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool get3aResult(const CameraMetadata& result, int32_t tag, T* value,
67fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            int32_t frameNumber, int cameraId);
68fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
69fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
7046910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    struct AlgState {
71fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        // TODO: also track AE mode
72fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        camera_metadata_enum_android_control_af_mode   afMode;
73fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        camera_metadata_enum_android_control_awb_mode  awbMode;
74fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
7546910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala        camera_metadata_enum_android_control_ae_state  aeState;
7646910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala        camera_metadata_enum_android_control_af_state  afState;
7746910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala        camera_metadata_enum_android_control_awb_state awbState;
7846910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala
79fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        int32_t                                        afTriggerId;
80fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        int32_t                                        aeTriggerId;
81fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
82fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        // These defaults need to match those in Parameters.cpp
8346910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala        AlgState() :
84fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                afMode(ANDROID_CONTROL_AF_MODE_AUTO),
85fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                awbMode(ANDROID_CONTROL_AWB_MODE_AUTO),
8646910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala                aeState(ANDROID_CONTROL_AE_STATE_INACTIVE),
8746910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala                afState(ANDROID_CONTROL_AF_STATE_INACTIVE),
88fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                awbState(ANDROID_CONTROL_AWB_STATE_INACTIVE),
89fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                afTriggerId(0),
90fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                aeTriggerId(0) {
9146910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala        }
9246910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    } m3aState;
9346910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala
94204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    // Whether the partial result is enabled for this device
95204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    bool mUsePartialResult;
96fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
97fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // Track most recent frame number for which 3A notifications were sent for.
98fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // Used to filter against sending 3A notifications for the same frame
99fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // several times.
100fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    int32_t mLast3AFrameNumber;
101fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
10246dee9da04e80971c93cf23d772355217c88bb6aIgor Murashkin    // Emit FaceDetection event to java if faces changed
10346dee9da04e80971c93cf23d772355217c88bb6aIgor Murashkin    void callbackFaceDetection(sp<Camera2Client> client,
10471381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin                               const camera_frame_metadata &metadata);
105a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala};
106a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala
107a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala
108a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala}; //namespace camera2
109a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala}; //namespace android
110a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala
111a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala#endif
112