1da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/*
2da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
3da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala *
4da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
5da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * you may not use this file except in compliance with the License.
6da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * You may obtain a copy of the License at
7da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala *
8da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
9da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala *
10da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
11da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
12da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * See the License for the specific language governing permissions and
14da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * limitations under the License.
15da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */
16da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
17da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#ifndef ANDROID_SERVERS_CAMERA_CAMERA2_CAPTURESEQUENCER_H
18da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#define ANDROID_SERVERS_CAMERA_CAMERA2_CAPTURESEQUENCER_H
19da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
20fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala#include <binder/MemoryBase.h>
21da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Thread.h>
22da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/String16.h>
23da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Vector.h>
24da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Mutex.h>
25da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Condition.h>
267efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin#include "camera/CameraMetadata.h"
27cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei#include "camera/CaptureResult.h"
28da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "Parameters.h"
29da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "FrameProcessor.h"
30da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
31da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace android {
32da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
33da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass Camera2Client;
34da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
35da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace camera2 {
36da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
37ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkinclass ZslProcessorInterface;
38e538206d15282afbc5b168d60b1026a5dfcd13c0James Painterclass BurstCapture;
39da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
40da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/**
41da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Manages the still image capture process for
42da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * zero-shutter-lag, regular, and video snapshots.
43da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */
44da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass CaptureSequencer:
45da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            virtual public Thread,
46da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            virtual public FrameProcessor::FilteredListener {
47da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala  public:
48da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureSequencer(wp<Camera2Client> client);
49da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ~CaptureSequencer();
50da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
51da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Get reference to the ZslProcessor, which holds the ZSL buffers and frames
52ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    void setZslProcessor(wp<ZslProcessorInterface> processor);
53da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
54da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Begin still image capture
55aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin    status_t startCapture(int msgType);
56da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
57d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    // Wait until current image capture completes; returns immediately if no
58d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    // capture is active. Returns TIMED_OUT if capture does not complete during
59d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    // the specified duration.
60d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    status_t waitUntilIdle(nsecs_t timeout);
61d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala
62da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Notifications about AE state changes
63da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    void notifyAutoExposure(uint8_t newState, int triggerId);
64da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
65216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    // Notifications about shutter (capture start)
66216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    void notifyShutter(const CaptureResultExtras& resultExtras,
67216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh                       nsecs_t timestamp);
68216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh
69cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    // Notification from the frame processor
70cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual void onResultAvailable(const CaptureResult &result);
71da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
72fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    // Notifications from the JPEG processor
73fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    void onCaptureAvailable(nsecs_t timestamp, sp<MemoryBase> captureBuffer);
74da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    void dump(int fd, const Vector<String16>& args);
76da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
77da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala  private:
78da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    /**
79da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Accessed by other threads
80da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     */
81da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex mInputMutex;
82da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
83da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mStartCapture;
84da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mBusy;
85da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mStartCaptureSignal;
86da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
87da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mNewAEState;
88da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    uint8_t mAEState;
89da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mAETriggerId;
90da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mNewNotifySignal;
91da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mNewFrameReceived;
93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t mNewFrameId;
94da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CameraMetadata mNewFrame;
95da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mNewFrameSignal;
96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
97da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mNewCaptureReceived;
98da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    nsecs_t mCaptureTimestamp;
99fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    sp<MemoryBase> mCaptureBuffer;
100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mNewCaptureSignal;
101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
102216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    bool mShutterNotified; // Has CaptureSequencer sent shutter to Client
103216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    bool mHalNotifiedShutter; // Has HAL sent shutter to CaptureSequencer
104216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    int32_t mShutterCaptureId; // The captureId which is waiting for shutter notification
105216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    Condition mShutterNotifySignal;
1061e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala
107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    /**
108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Internal to CaptureSequencer
109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     */
110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const nsecs_t kWaitDuration = 100000000; // 100 ms
1110a4df03542e7d7aab716a60e206dceaf5da178f3Eino-Ville Talvala    static const int kMaxTimeoutsForPrecaptureStart = 10; // 1 sec
112c55311869f1853c6814c9bcda8a4b60e43091c1aEino-Ville Talvala    static const int kMaxTimeoutsForPrecaptureEnd = 20;  // 2 sec
1131f266efe8ce2976b6531fab8698716354b2247f8Eino-Ville Talvala    static const int kMaxTimeoutsForCaptureEnd    = 40;  // 4 sec
114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    wp<Camera2Client> mClient;
116ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    wp<ZslProcessorInterface> mZslProcessor;
117e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    sp<BurstCapture> mBurstCapture;
118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    enum CaptureState {
120da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        IDLE,
121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        START,
122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ZSL_START,
123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ZSL_WAITING,
124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ZSL_REPROCESSING,
125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_START,
126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_PRECAPTURE_WAIT,
127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_CAPTURE,
128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_CAPTURE_WAIT,
129e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        BURST_CAPTURE_START,
130e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        BURST_CAPTURE_WAIT,
131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        DONE,
132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ERROR,
133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        NUM_CAPTURE_STATES
134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    } mCaptureState;
135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const char* kStateNames[];
1362b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    int mStateTransitionCount;
137d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    Mutex mStateMutex; // Guards mCaptureState
138d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    Condition mStateChanged;
139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    typedef CaptureState (CaptureSequencer::*StateManager)(sp<Camera2Client> &client);
141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const StateManager kStateManagers[];
142da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
143da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CameraMetadata mCaptureRequest;
144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mTriggerId;
146da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mTimeoutCount;
147da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mAeInPrecapture;
148da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
149da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t mCaptureId;
150aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin    int mMsgType;
151da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Main internal methods
153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    virtual bool threadLoop();
155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageIdle(sp<Camera2Client> &client);
157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStart(sp<Camera2Client> &client);
158da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
159da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageZslStart(sp<Camera2Client> &client);
160da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageZslWaiting(sp<Camera2Client> &client);
161da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageZslReprocessing(sp<Camera2Client> &client);
162da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
163da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardStart(sp<Camera2Client> &client);
164da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardPrecaptureWait(sp<Camera2Client> &client);
165da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardCapture(sp<Camera2Client> &client);
166da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardCaptureWait(sp<Camera2Client> &client);
167da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
168e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    CaptureState manageBurstCaptureStart(sp<Camera2Client> &client);
169e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    CaptureState manageBurstCaptureWait(sp<Camera2Client> &client);
170e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
171da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageDone(sp<Camera2Client> &client);
172da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
173da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Utility methods
174da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
175da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t updateCaptureRequest(const Parameters &params,
176da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            sp<Camera2Client> &client);
1771b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin
1781b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin    // Emit Shutter/Raw callback to java, and maybe play a shutter sound
1791b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin    static void shutterNotifyLocked(const Parameters &params,
180aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin            sp<Camera2Client> client, int msgType);
181da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala};
182da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
183da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace camera2
184da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace android
185da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
186da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#endif
187