blob: 8df6d95d3e7e92b2d9d7be190be5b0b863cf6b8a [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
54 status_t startCapture();
55
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
97 /**
98 * Internal to CaptureSequencer
99 */
100 static const nsecs_t kWaitDuration = 100000000; // 100 ms
101 static const int kMaxTimeoutsForPrecaptureStart = 2; // 200 ms
Eino-Ville Talvalac5531182012-09-19 16:12:18 -0700102 static const int kMaxTimeoutsForPrecaptureEnd = 20; // 2 sec
Eino-Ville Talvala1f266ef2012-09-18 16:01:11 -0700103 static const int kMaxTimeoutsForCaptureEnd = 40; // 4 sec
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700104
105 wp<Camera2Client> mClient;
106 wp<ZslProcessor> mZslProcessor;
James Paintere5382062012-09-05 18:02:32 -0700107 sp<BurstCapture> mBurstCapture;
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700108
109 enum CaptureState {
110 IDLE,
111 START,
112 ZSL_START,
113 ZSL_WAITING,
114 ZSL_REPROCESSING,
115 STANDARD_START,
116 STANDARD_PRECAPTURE_WAIT,
117 STANDARD_CAPTURE,
118 STANDARD_CAPTURE_WAIT,
James Paintere5382062012-09-05 18:02:32 -0700119 BURST_CAPTURE_START,
120 BURST_CAPTURE_WAIT,
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700121 DONE,
122 ERROR,
123 NUM_CAPTURE_STATES
124 } mCaptureState;
125 static const char* kStateNames[];
Eino-Ville Talvalad5087f92012-10-05 12:03:10 -0700126 Mutex mStateMutex; // Guards mCaptureState
127 Condition mStateChanged;
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700128
129 typedef CaptureState (CaptureSequencer::*StateManager)(sp<Camera2Client> &client);
130 static const StateManager kStateManagers[];
131
132 CameraMetadata mCaptureRequest;
133
134 int mTriggerId;
135 int mTimeoutCount;
136 bool mAeInPrecapture;
137
138 int32_t mCaptureId;
139
140 // Main internal methods
141
142 virtual bool threadLoop();
143
144 CaptureState manageIdle(sp<Camera2Client> &client);
145 CaptureState manageStart(sp<Camera2Client> &client);
146
147 CaptureState manageZslStart(sp<Camera2Client> &client);
148 CaptureState manageZslWaiting(sp<Camera2Client> &client);
149 CaptureState manageZslReprocessing(sp<Camera2Client> &client);
150
151 CaptureState manageStandardStart(sp<Camera2Client> &client);
152 CaptureState manageStandardPrecaptureWait(sp<Camera2Client> &client);
153 CaptureState manageStandardCapture(sp<Camera2Client> &client);
154 CaptureState manageStandardCaptureWait(sp<Camera2Client> &client);
155
James Paintere5382062012-09-05 18:02:32 -0700156 CaptureState manageBurstCaptureStart(sp<Camera2Client> &client);
157 CaptureState manageBurstCaptureWait(sp<Camera2Client> &client);
158
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700159 CaptureState manageDone(sp<Camera2Client> &client);
160
161 // Utility methods
162
163 status_t updateCaptureRequest(const Parameters &params,
164 sp<Camera2Client> &client);
Igor Murashkin1b65ae92012-09-20 15:18:50 -0700165
166 // Emit Shutter/Raw callback to java, and maybe play a shutter sound
167 static void shutterNotifyLocked(const Parameters &params,
168 sp<Camera2Client> client);
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700169};
170
171}; // namespace camera2
172}; // namespace android
173
174#endif