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>
26da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "CameraMetadata.h"
27da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "Parameters.h"
28da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "FrameProcessor.h"
29da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
30da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace android {
31da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
32da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass Camera2Client;
33da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
34da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace camera2 {
35da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
36da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass ZslProcessor;
37e538206d15282afbc5b168d60b1026a5dfcd13c0James Painterclass BurstCapture;
38da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
39da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/**
40da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Manages the still image capture process for
41da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * zero-shutter-lag, regular, and video snapshots.
42da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */
43da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass CaptureSequencer:
44da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            virtual public Thread,
45da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            virtual public FrameProcessor::FilteredListener {
46da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala  public:
47da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureSequencer(wp<Camera2Client> client);
48da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ~CaptureSequencer();
49da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
50da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Get reference to the ZslProcessor, which holds the ZSL buffers and frames
51da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    void setZslProcessor(wp<ZslProcessor> processor);
52da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
53da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Begin still image capture
54da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t startCapture();
55da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
56d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    // Wait until current image capture completes; returns immediately if no
57d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    // capture is active. Returns TIMED_OUT if capture does not complete during
58d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    // the specified duration.
59d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    status_t waitUntilIdle(nsecs_t timeout);
60d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala
61da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Notifications about AE state changes
62da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    void notifyAutoExposure(uint8_t newState, int triggerId);
63da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
64da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Notifications from the frame processor
654865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    virtual void onFrameAvailable(int32_t frameId, const CameraMetadata &frame);
66da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
67fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    // Notifications from the JPEG processor
68fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    void onCaptureAvailable(nsecs_t timestamp, sp<MemoryBase> captureBuffer);
69da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
70da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    void dump(int fd, const Vector<String16>& args);
71da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
72da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala  private:
73da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    /**
74da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Accessed by other threads
75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     */
76da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex mInputMutex;
77da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
78da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mStartCapture;
79da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mBusy;
80da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mStartCaptureSignal;
81da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
82da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mNewAEState;
83da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    uint8_t mAEState;
84da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mAETriggerId;
85da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mNewNotifySignal;
86da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
87da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mNewFrameReceived;
88da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t mNewFrameId;
89da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CameraMetadata mNewFrame;
90da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mNewFrameSignal;
91da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mNewCaptureReceived;
93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    nsecs_t mCaptureTimestamp;
94fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    sp<MemoryBase> mCaptureBuffer;
95da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mNewCaptureSignal;
96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
971e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala    bool mShutterNotified;
981e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala
99da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    /**
100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Internal to CaptureSequencer
101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     */
102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const nsecs_t kWaitDuration = 100000000; // 100 ms
103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const int kMaxTimeoutsForPrecaptureStart = 2; // 200 ms
104c55311869f1853c6814c9bcda8a4b60e43091c1aEino-Ville Talvala    static const int kMaxTimeoutsForPrecaptureEnd = 20;  // 2 sec
1051f266efe8ce2976b6531fab8698716354b2247f8Eino-Ville Talvala    static const int kMaxTimeoutsForCaptureEnd    = 40;  // 4 sec
106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    wp<Camera2Client> mClient;
108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    wp<ZslProcessor> mZslProcessor;
109e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    sp<BurstCapture> mBurstCapture;
110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    enum CaptureState {
112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        IDLE,
113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        START,
114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ZSL_START,
115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ZSL_WAITING,
116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ZSL_REPROCESSING,
117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_START,
118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_PRECAPTURE_WAIT,
119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_CAPTURE,
120da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_CAPTURE_WAIT,
121e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        BURST_CAPTURE_START,
122e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        BURST_CAPTURE_WAIT,
123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        DONE,
124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ERROR,
125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        NUM_CAPTURE_STATES
126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    } mCaptureState;
127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const char* kStateNames[];
128d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    Mutex mStateMutex; // Guards mCaptureState
129d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    Condition mStateChanged;
130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    typedef CaptureState (CaptureSequencer::*StateManager)(sp<Camera2Client> &client);
132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const StateManager kStateManagers[];
133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CameraMetadata mCaptureRequest;
135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mTriggerId;
137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mTimeoutCount;
138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mAeInPrecapture;
139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t mCaptureId;
141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
142da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Main internal methods
143da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    virtual bool threadLoop();
145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
146da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageIdle(sp<Camera2Client> &client);
147da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStart(sp<Camera2Client> &client);
148da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
149da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageZslStart(sp<Camera2Client> &client);
150da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageZslWaiting(sp<Camera2Client> &client);
151da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageZslReprocessing(sp<Camera2Client> &client);
152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardStart(sp<Camera2Client> &client);
154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardPrecaptureWait(sp<Camera2Client> &client);
155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardCapture(sp<Camera2Client> &client);
156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardCaptureWait(sp<Camera2Client> &client);
157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
158e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    CaptureState manageBurstCaptureStart(sp<Camera2Client> &client);
159e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    CaptureState manageBurstCaptureWait(sp<Camera2Client> &client);
160e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
161da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageDone(sp<Camera2Client> &client);
162da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
163da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Utility methods
164da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
165da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t updateCaptureRequest(const Parameters &params,
166da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            sp<Camera2Client> &client);
1671b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin
1681b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin    // Emit Shutter/Raw callback to java, and maybe play a shutter sound
1691b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin    static void shutterNotifyLocked(const Parameters &params,
1701b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin            sp<Camera2Client> client);
171da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala};
172da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
173da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace camera2
174da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace android
175da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
176da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#endif
177