blob: 4cde9c8341693e1b9e7cfc1e4cc5d568d982b09a [file] [log] [blame]
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_SERVERS_CAMERA_CAMERA2_CAPTURESEQUENCER_H
18#define ANDROID_SERVERS_CAMERA_CAMERA2_CAPTURESEQUENCER_H
19
Eino-Ville Talvala52e9ad42012-09-19 17:09:15 -070020#include <binder/MemoryBase.h>
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070021#include <utils/Thread.h>
22#include <utils/String16.h>
23#include <utils/Vector.h>
24#include <utils/Mutex.h>
25#include <utils/Condition.h>
26#include "CameraMetadata.h"
27#include "Parameters.h"
28#include "FrameProcessor.h"
29
30namespace android {
31
32class Camera2Client;
33
34namespace camera2 {
35
36class ZslProcessor;
James Painterc3dbf1a2012-09-05 18:02:32 -070037class BurstCapture;
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070038
39/**
40 * Manages the still image capture process for
41 * zero-shutter-lag, regular, and video snapshots.
42 */
43class CaptureSequencer:
44 virtual public Thread,
45 virtual public FrameProcessor::FilteredListener {
46 public:
47 CaptureSequencer(wp<Camera2Client> client);
48 ~CaptureSequencer();
49
50 // Get reference to the ZslProcessor, which holds the ZSL buffers and frames
51 void setZslProcessor(wp<ZslProcessor> processor);
52
53 // Begin still image capture
54 status_t startCapture();
55
Eino-Ville Talvalae0493842012-10-05 12:03:10 -070056 // Wait until current image capture completes; returns immediately if no
57 // capture is active. Returns TIMED_OUT if capture does not complete during
58 // the specified duration.
59 status_t waitUntilIdle(nsecs_t timeout);
60
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070061 // Notifications about AE state changes
62 void notifyAutoExposure(uint8_t newState, int triggerId);
63
64 // Notifications from the frame processor
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -070065 virtual void onFrameAvailable(int32_t frameId, const CameraMetadata &frame);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070066
Eino-Ville Talvala52e9ad42012-09-19 17:09:15 -070067 // Notifications from the JPEG processor
68 void onCaptureAvailable(nsecs_t timestamp, sp<MemoryBase> captureBuffer);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070069
70 void dump(int fd, const Vector<String16>& args);
71
72 private:
73 /**
74 * Accessed by other threads
75 */
76 Mutex mInputMutex;
77
78 bool mStartCapture;
79 bool mBusy;
80 Condition mStartCaptureSignal;
81
82 bool mNewAEState;
83 uint8_t mAEState;
84 int mAETriggerId;
85 Condition mNewNotifySignal;
86
87 bool mNewFrameReceived;
88 int32_t mNewFrameId;
89 CameraMetadata mNewFrame;
90 Condition mNewFrameSignal;
91
92 bool mNewCaptureReceived;
93 nsecs_t mCaptureTimestamp;
Eino-Ville Talvala52e9ad42012-09-19 17:09:15 -070094 sp<MemoryBase> mCaptureBuffer;
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070095 Condition mNewCaptureSignal;
96
Eino-Ville Talvalaad21da92012-10-07 22:43:48 -070097 bool mShutterNotified;
98
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070099 /**
100 * Internal to CaptureSequencer
101 */
102 static const nsecs_t kWaitDuration = 100000000; // 100 ms
103 static const int kMaxTimeoutsForPrecaptureStart = 2; // 200 ms
Eino-Ville Talvala9d5f5c22012-09-19 16:12:18 -0700104 static const int kMaxTimeoutsForPrecaptureEnd = 20; // 2 sec
Eino-Ville Talvala59ab0442012-09-18 16:01:11 -0700105 static const int kMaxTimeoutsForCaptureEnd = 40; // 4 sec
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700106
107 wp<Camera2Client> mClient;
108 wp<ZslProcessor> mZslProcessor;
James Painterc3dbf1a2012-09-05 18:02:32 -0700109 sp<BurstCapture> mBurstCapture;
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700110
111 enum CaptureState {
112 IDLE,
113 START,
114 ZSL_START,
115 ZSL_WAITING,
116 ZSL_REPROCESSING,
117 STANDARD_START,
118 STANDARD_PRECAPTURE_WAIT,
119 STANDARD_CAPTURE,
120 STANDARD_CAPTURE_WAIT,
James Painterc3dbf1a2012-09-05 18:02:32 -0700121 BURST_CAPTURE_START,
122 BURST_CAPTURE_WAIT,
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700123 DONE,
124 ERROR,
125 NUM_CAPTURE_STATES
126 } mCaptureState;
127 static const char* kStateNames[];
Eino-Ville Talvalae0493842012-10-05 12:03:10 -0700128 Mutex mStateMutex; // Guards mCaptureState
129 Condition mStateChanged;
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700130
131 typedef CaptureState (CaptureSequencer::*StateManager)(sp<Camera2Client> &client);
132 static const StateManager kStateManagers[];
133
134 CameraMetadata mCaptureRequest;
135
136 int mTriggerId;
137 int mTimeoutCount;
138 bool mAeInPrecapture;
139
140 int32_t mCaptureId;
141
142 // Main internal methods
143
144 virtual bool threadLoop();
145
146 CaptureState manageIdle(sp<Camera2Client> &client);
147 CaptureState manageStart(sp<Camera2Client> &client);
148
149 CaptureState manageZslStart(sp<Camera2Client> &client);
150 CaptureState manageZslWaiting(sp<Camera2Client> &client);
151 CaptureState manageZslReprocessing(sp<Camera2Client> &client);
152
153 CaptureState manageStandardStart(sp<Camera2Client> &client);
154 CaptureState manageStandardPrecaptureWait(sp<Camera2Client> &client);
155 CaptureState manageStandardCapture(sp<Camera2Client> &client);
156 CaptureState manageStandardCaptureWait(sp<Camera2Client> &client);
157
James Painterc3dbf1a2012-09-05 18:02:32 -0700158 CaptureState manageBurstCaptureStart(sp<Camera2Client> &client);
159 CaptureState manageBurstCaptureWait(sp<Camera2Client> &client);
160
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700161 CaptureState manageDone(sp<Camera2Client> &client);
162
163 // Utility methods
164
165 status_t updateCaptureRequest(const Parameters &params,
166 sp<Camera2Client> &client);
Igor Murashkin707c3e32012-09-20 15:18:50 -0700167
168 // Emit Shutter/Raw callback to java, and maybe play a shutter sound
169 static void shutterNotifyLocked(const Parameters &params,
170 sp<Camera2Client> client);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700171};
172
173}; // namespace camera2
174}; // namespace android
175
176#endif