1 /* 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 20 #include <binder/MemoryBase.h> 21 #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 "camera/CameraMetadata.h" 27 #include "Parameters.h" 28 #include "FrameProcessor.h" 29 30 namespace android { 31 32 class Camera2Client; 33 34 namespace camera2 { 35 36 class ZslProcessorInterface; 37 class BurstCapture; 38 39 /** 40 * Manages the still image capture process for 41 * zero-shutter-lag, regular, and video snapshots. 42 */ 43 class 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<ZslProcessorInterface> processor); 52 53 // Begin still image capture 54 status_t startCapture(int msgType); 55 56 // 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 61 // Notifications about AE state changes 62 void notifyAutoExposure(uint8_t newState, int triggerId); 63 64 // Notifications from the frame processor 65 virtual void onFrameAvailable(int32_t frameId, const CameraMetadata &frame); 66 67 // Notifications from the JPEG processor 68 void onCaptureAvailable(nsecs_t timestamp, sp<MemoryBase> captureBuffer); 69 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; 94 sp<MemoryBase> mCaptureBuffer; 95 Condition mNewCaptureSignal; 96 97 bool mShutterNotified; 98 99 /** 100 * Internal to CaptureSequencer 101 */ 102 static const nsecs_t kWaitDuration = 100000000; // 100 ms 103 static const int kMaxTimeoutsForPrecaptureStart = 2; // 200 ms 104 static const int kMaxTimeoutsForPrecaptureEnd = 20; // 2 sec 105 static const int kMaxTimeoutsForCaptureEnd = 40; // 4 sec 106 107 wp<Camera2Client> mClient; 108 wp<ZslProcessorInterface> mZslProcessor; 109 sp<BurstCapture> mBurstCapture; 110 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, 121 BURST_CAPTURE_START, 122 BURST_CAPTURE_WAIT, 123 DONE, 124 ERROR, 125 NUM_CAPTURE_STATES 126 } mCaptureState; 127 static const char* kStateNames[]; 128 Mutex mStateMutex; // Guards mCaptureState 129 Condition mStateChanged; 130 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 int mMsgType; 142 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 159 CaptureState manageBurstCaptureStart(sp<Camera2Client> &client); 160 CaptureState manageBurstCaptureWait(sp<Camera2Client> &client); 161 162 CaptureState manageDone(sp<Camera2Client> &client); 163 164 // Utility methods 165 166 status_t updateCaptureRequest(const Parameters ¶ms, 167 sp<Camera2Client> &client); 168 169 // Emit Shutter/Raw callback to java, and maybe play a shutter sound 170 static void shutterNotifyLocked(const Parameters ¶ms, 171 sp<Camera2Client> client, int msgType); 172 }; 173 174 }; // namespace camera2 175 }; // namespace android 176 177 #endif 178