CaptureSequencer.h revision 1b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8
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
56da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Notifications about AE state changes
57da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    void notifyAutoExposure(uint8_t newState, int triggerId);
58da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
59da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Notifications from the frame processor
60da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    virtual void onFrameAvailable(int32_t frameId, CameraMetadata &frame);
61da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
62fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    // Notifications from the JPEG processor
63fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    void onCaptureAvailable(nsecs_t timestamp, sp<MemoryBase> captureBuffer);
64da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
65da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    void dump(int fd, const Vector<String16>& args);
66da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
67da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala  private:
68da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    /**
69da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Accessed by other threads
70da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     */
71da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex mInputMutex;
72da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
73da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mStartCapture;
74da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mBusy;
75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mStartCaptureSignal;
76da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
77da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mNewAEState;
78da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    uint8_t mAEState;
79da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mAETriggerId;
80da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mNewNotifySignal;
81da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
82da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mNewFrameReceived;
83da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t mNewFrameId;
84da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CameraMetadata mNewFrame;
85da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mNewFrameSignal;
86da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
87da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mNewCaptureReceived;
88da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    nsecs_t mCaptureTimestamp;
89fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    sp<MemoryBase> mCaptureBuffer;
90da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mNewCaptureSignal;
91da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    /**
93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Internal to CaptureSequencer
94da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     */
95da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const nsecs_t kWaitDuration = 100000000; // 100 ms
96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const int kMaxTimeoutsForPrecaptureStart = 2; // 200 ms
97c55311869f1853c6814c9bcda8a4b60e43091c1aEino-Ville Talvala    static const int kMaxTimeoutsForPrecaptureEnd = 20;  // 2 sec
981f266efe8ce2976b6531fab8698716354b2247f8Eino-Ville Talvala    static const int kMaxTimeoutsForCaptureEnd    = 40;  // 4 sec
99da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    wp<Camera2Client> mClient;
101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    wp<ZslProcessor> mZslProcessor;
102e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    sp<BurstCapture> mBurstCapture;
103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    enum CaptureState {
105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        IDLE,
106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        START,
107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ZSL_START,
108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ZSL_WAITING,
109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ZSL_REPROCESSING,
110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_START,
111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_PRECAPTURE_WAIT,
112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_CAPTURE,
113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_CAPTURE_WAIT,
114e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        BURST_CAPTURE_START,
115e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        BURST_CAPTURE_WAIT,
116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        DONE,
117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ERROR,
118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        NUM_CAPTURE_STATES
119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    } mCaptureState;
120da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const char* kStateNames[];
121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    typedef CaptureState (CaptureSequencer::*StateManager)(sp<Camera2Client> &client);
123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const StateManager kStateManagers[];
124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CameraMetadata mCaptureRequest;
126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mTriggerId;
128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mTimeoutCount;
129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mAeInPrecapture;
130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t mCaptureId;
132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Main internal methods
134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    virtual bool threadLoop();
136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageIdle(sp<Camera2Client> &client);
138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStart(sp<Camera2Client> &client);
139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageZslStart(sp<Camera2Client> &client);
141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageZslWaiting(sp<Camera2Client> &client);
142da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageZslReprocessing(sp<Camera2Client> &client);
143da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardStart(sp<Camera2Client> &client);
145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardPrecaptureWait(sp<Camera2Client> &client);
146da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardCapture(sp<Camera2Client> &client);
147da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardCaptureWait(sp<Camera2Client> &client);
148da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
149e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    CaptureState manageBurstCaptureStart(sp<Camera2Client> &client);
150e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    CaptureState manageBurstCaptureWait(sp<Camera2Client> &client);
151e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageDone(sp<Camera2Client> &client);
153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Utility methods
155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t updateCaptureRequest(const Parameters &params,
157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            sp<Camera2Client> &client);
1581b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin
1591b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin    // Emit Shutter/Raw callback to java, and maybe play a shutter sound
1601b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin    static void shutterNotifyLocked(const Parameters &params,
1611b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin            sp<Camera2Client> client);
162da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala};
163da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
164da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace camera2
165da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace android
166da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
167da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#endif
168