blob: c42df053d800569b11daa03b07272bdf70be479b [file] [log] [blame]
Eino-Ville Talvalada6665c2012-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 Talvalafe580e52012-09-19 17:09:15 -070020#include <binder/MemoryBase.h>
Eino-Ville Talvalada6665c2012-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 Paintere5382062012-09-05 18:02:32 -070037class BurstCapture;
Eino-Ville Talvalada6665c2012-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
Igor Murashkinaa9e3e02012-11-26 10:50:55 -080054 status_t startCapture(int msgType);
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -070055
Eino-Ville Talvalad5087f92012-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 Talvalada6665c2012-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 Talvala4865c522012-10-02 13:30:28 -070065 virtual void onFrameAvailable(int32_t frameId, const CameraMetadata &frame);
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -070066
Eino-Ville Talvalafe580e52012-09-19 17:09:15 -070067 // Notifications from the JPEG processor
68 void onCaptureAvailable(nsecs_t timestamp, sp<MemoryBase> captureBuffer);
Eino-Ville Talvalada6665c2012-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 Talvalafe580e52012-09-19 17:09:15 -070094 sp<MemoryBase> mCaptureBuffer;
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -070095 Condition mNewCaptureSignal;
96
Eino-Ville Talvala1e6ccd52012-10-07 22:43:48 -070097 bool mShutterNotified;
98
Eino-Ville Talvalada6665c2012-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 Talvalac5531182012-09-19 16:12:18 -0700104 static const int kMaxTimeoutsForPrecaptureEnd = 20; // 2 sec
Eino-Ville Talvala1f266ef2012-09-18 16:01:11 -0700105 static const int kMaxTimeoutsForCaptureEnd = 40; // 4 sec
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700106
107 wp<Camera2Client> mClient;
108 wp<ZslProcessor> mZslProcessor;
James Paintere5382062012-09-05 18:02:32 -0700109 sp<BurstCapture> mBurstCapture;
Eino-Ville Talvalada6665c2012-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 Paintere5382062012-09-05 18:02:32 -0700121 BURST_CAPTURE_START,
122 BURST_CAPTURE_WAIT,
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700123 DONE,
124 ERROR,
125 NUM_CAPTURE_STATES
126 } mCaptureState;
127 static const char* kStateNames[];
Eino-Ville Talvalad5087f92012-10-05 12:03:10 -0700128 Mutex mStateMutex; // Guards mCaptureState
129 Condition mStateChanged;
Eino-Ville Talvalada6665c2012-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;
Igor Murashkinaa9e3e02012-11-26 10:50:55 -0800141 int mMsgType;
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700142
143 // Main internal methods
144
145 virtual bool threadLoop();
146
147 CaptureState manageIdle(sp<Camera2Client> &client);
148 CaptureState manageStart(sp<Camera2Client> &client);
149
150 CaptureState manageZslStart(sp<Camera2Client> &client);
151 CaptureState manageZslWaiting(sp<Camera2Client> &client);
152 CaptureState manageZslReprocessing(sp<Camera2Client> &client);
153
154 CaptureState manageStandardStart(sp<Camera2Client> &client);
155 CaptureState manageStandardPrecaptureWait(sp<Camera2Client> &client);
156 CaptureState manageStandardCapture(sp<Camera2Client> &client);
157 CaptureState manageStandardCaptureWait(sp<Camera2Client> &client);
158
James Paintere5382062012-09-05 18:02:32 -0700159 CaptureState manageBurstCaptureStart(sp<Camera2Client> &client);
160 CaptureState manageBurstCaptureWait(sp<Camera2Client> &client);
161
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700162 CaptureState manageDone(sp<Camera2Client> &client);
163
164 // Utility methods
165
166 status_t updateCaptureRequest(const Parameters &params,
167 sp<Camera2Client> &client);
Igor Murashkin1b65ae92012-09-20 15:18:50 -0700168
169 // Emit Shutter/Raw callback to java, and maybe play a shutter sound
170 static void shutterNotifyLocked(const Parameters &params,
Igor Murashkinaa9e3e02012-11-26 10:50:55 -0800171 sp<Camera2Client> client, int msgType);
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700172};
173
174}; // namespace camera2
175}; // namespace android
176
177#endif