CaptureSequencer.h revision da6665cbd06ca58d3357c3002b7366d13e23f152
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
20da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Thread.h>
21da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/String16.h>
22da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Vector.h>
23da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Mutex.h>
24da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Condition.h>
25da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "CameraMetadata.h"
26da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "Parameters.h"
27da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "FrameProcessor.h"
28da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
29da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace android {
30da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
31da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass Camera2Client;
32da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
33da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace camera2 {
34da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
35da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass ZslProcessor;
36da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
37da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/**
38da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Manages the still image capture process for
39da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * zero-shutter-lag, regular, and video snapshots.
40da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */
41da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass CaptureSequencer:
42da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            virtual public Thread,
43da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            virtual public FrameProcessor::FilteredListener {
44da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala  public:
45da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureSequencer(wp<Camera2Client> client);
46da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ~CaptureSequencer();
47da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
48da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Get reference to the ZslProcessor, which holds the ZSL buffers and frames
49da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    void setZslProcessor(wp<ZslProcessor> processor);
50da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
51da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Begin still image capture
52da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t startCapture();
53da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
54da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Notifications about AE state changes
55da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    void notifyAutoExposure(uint8_t newState, int triggerId);
56da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
57da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Notifications from the frame processor
58da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    virtual void onFrameAvailable(int32_t frameId, CameraMetadata &frame);
59da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
60da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Notifications from the capture processor
61da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    void onCaptureAvailable(nsecs_t timestamp);
62da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
63da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    void dump(int fd, const Vector<String16>& args);
64da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
65da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala  private:
66da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    /**
67da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Accessed by other threads
68da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     */
69da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex mInputMutex;
70da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
71da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mStartCapture;
72da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mBusy;
73da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mStartCaptureSignal;
74da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mNewAEState;
76da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    uint8_t mAEState;
77da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mAETriggerId;
78da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mNewNotifySignal;
79da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
80da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mNewFrameReceived;
81da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t mNewFrameId;
82da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CameraMetadata mNewFrame;
83da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mNewFrameSignal;
84da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
85da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mNewCaptureReceived;
86da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    nsecs_t mCaptureTimestamp;
87da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Condition mNewCaptureSignal;
88da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
89da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    /**
90da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Internal to CaptureSequencer
91da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     */
92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const nsecs_t kWaitDuration = 100000000; // 100 ms
93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const int kMaxTimeoutsForPrecaptureStart = 2; // 200 ms
94da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const int kMaxTimeoutsForPrecaptureEnd = 10;  // 1 sec
95da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const int kMaxTimeoutsForCaptureEnd    = 20;  // 2 sec
96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
97da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    wp<Camera2Client> mClient;
98da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    wp<ZslProcessor> mZslProcessor;
99da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    enum CaptureState {
101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        IDLE,
102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        START,
103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ZSL_START,
104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ZSL_WAITING,
105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ZSL_REPROCESSING,
106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_START,
107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_PRECAPTURE_WAIT,
108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_CAPTURE,
109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        STANDARD_CAPTURE_WAIT,
110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        DONE,
111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ERROR,
112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        NUM_CAPTURE_STATES
113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    } mCaptureState;
114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const char* kStateNames[];
115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    typedef CaptureState (CaptureSequencer::*StateManager)(sp<Camera2Client> &client);
117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const StateManager kStateManagers[];
118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CameraMetadata mCaptureRequest;
120da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mTriggerId;
122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mTimeoutCount;
123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool mAeInPrecapture;
124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t mCaptureId;
126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Main internal methods
128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    virtual bool threadLoop();
130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageIdle(sp<Camera2Client> &client);
132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStart(sp<Camera2Client> &client);
133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageZslStart(sp<Camera2Client> &client);
135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageZslWaiting(sp<Camera2Client> &client);
136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageZslReprocessing(sp<Camera2Client> &client);
137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardStart(sp<Camera2Client> &client);
139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardPrecaptureWait(sp<Camera2Client> &client);
140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardCapture(sp<Camera2Client> &client);
141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageStandardCaptureWait(sp<Camera2Client> &client);
142da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
143da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState manageDone(sp<Camera2Client> &client);
144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Utility methods
146da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
147da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t updateCaptureRequest(const Parameters &params,
148da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            sp<Camera2Client> &client);
149da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala};
150da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
151da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace camera2
152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace android
153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#endif
155