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
65cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    // Notification from the frame processor
66cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual void onResultAvailable(const CaptureResult &result);
67da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
68fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    // Notifications from the JPEG processor
69fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    void onCaptureAvailable(nsecs_t timestamp, sp<MemoryBase> captureBuffer);
70da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
71da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    void dump(int fd, const Vector<String16>& args);
72da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
73da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala  private:
74da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    /**
75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Accessed by other threads
76da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     */
77da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex mInputMutex;
78da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
79da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mStartCapture;
80da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mBusy;
81da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mStartCaptureSignal;
82da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
83da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mNewAEState;
84da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    uint8_t mAEState;
85da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mAETriggerId;
86da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mNewNotifySignal;
87da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
88da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mNewFrameReceived;
89da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t mNewFrameId;
90da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CameraMetadata mNewFrame;
91da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mNewFrameSignal;
92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mNewCaptureReceived;
94da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    nsecs_t mCaptureTimestamp;
95fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    sp<MemoryBase> mCaptureBuffer;
96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mNewCaptureSignal;
97da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
981e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala    bool mShutterNotified;
991e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala
100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    /**
101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Internal to CaptureSequencer
102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     */
103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const nsecs_t kWaitDuration = 100000000; // 100 ms
1040a4df03542e7d7aab716a60e206dceaf5da178f3Eino-Ville Talvala    static const int kMaxTimeoutsForPrecaptureStart = 10; // 1 sec
105c55311869f1853c6814c9bcda8a4b60e43091c1aEino-Ville Talvala    static const int kMaxTimeoutsForPrecaptureEnd = 20;  // 2 sec
1061f266efe8ce2976b6531fab8698716354b2247f8Eino-Ville Talvala    static const int kMaxTimeoutsForCaptureEnd    = 40;  // 4 sec
107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    wp<Camera2Client> mClient;
109ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    wp<ZslProcessorInterface> mZslProcessor;
110e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    sp<BurstCapture> mBurstCapture;
111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    enum CaptureState {
113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        IDLE,
114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        START,
115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ZSL_START,
116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ZSL_WAITING,
117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ZSL_REPROCESSING,
118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_START,
119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_PRECAPTURE_WAIT,
120da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_CAPTURE,
121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_CAPTURE_WAIT,
122e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        BURST_CAPTURE_START,
123e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        BURST_CAPTURE_WAIT,
124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        DONE,
125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ERROR,
126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        NUM_CAPTURE_STATES
127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    } mCaptureState;
128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const char* kStateNames[];
1292b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    int mStateTransitionCount;
130d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    Mutex mStateMutex; // Guards mCaptureState
131d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    Condition mStateChanged;
132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    typedef CaptureState (CaptureSequencer::*StateManager)(sp<Camera2Client> &client);
134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const StateManager kStateManagers[];
135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CameraMetadata mCaptureRequest;
137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mTriggerId;
139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mTimeoutCount;
140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mAeInPrecapture;
141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
142da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t mCaptureId;
143aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin    int mMsgType;
144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Main internal methods
146da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
147da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    virtual bool threadLoop();
148da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
149da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageIdle(sp<Camera2Client> &client);
150da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStart(sp<Camera2Client> &client);
151da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageZslStart(sp<Camera2Client> &client);
153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageZslWaiting(sp<Camera2Client> &client);
154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageZslReprocessing(sp<Camera2Client> &client);
155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardStart(sp<Camera2Client> &client);
157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardPrecaptureWait(sp<Camera2Client> &client);
158da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardCapture(sp<Camera2Client> &client);
159da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardCaptureWait(sp<Camera2Client> &client);
160da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
161e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    CaptureState manageBurstCaptureStart(sp<Camera2Client> &client);
162e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    CaptureState manageBurstCaptureWait(sp<Camera2Client> &client);
163e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
164da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageDone(sp<Camera2Client> &client);
165da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
166da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Utility methods
167da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
168da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t updateCaptureRequest(const Parameters &params,
169da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            sp<Camera2Client> &client);
1701b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin
1711b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin    // Emit Shutter/Raw callback to java, and maybe play a shutter sound
1721b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin    static void shutterNotifyLocked(const Parameters &params,
173aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin            sp<Camera2Client> client, int msgType);
174da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala};
175da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
176da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace camera2
177da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace android
178da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
179da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#endif
180