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 20fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala#include <binder/MemoryBase.h> 21da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Thread.h> 22da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/String16.h> 23da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Vector.h> 24da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Mutex.h> 25da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Condition.h> 267efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin#include "camera/CameraMetadata.h" 27cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei#include "camera/CaptureResult.h" 28da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "Parameters.h" 29da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "FrameProcessor.h" 30da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 31da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace android { 32da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 33da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass Camera2Client; 34da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 35da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace camera2 { 36da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 37ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkinclass ZslProcessorInterface; 38e538206d15282afbc5b168d60b1026a5dfcd13c0James Painterclass BurstCapture; 39da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 40da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/** 41da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Manages the still image capture process for 42da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * zero-shutter-lag, regular, and video snapshots. 43da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */ 44da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass CaptureSequencer: 45da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual public Thread, 46da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual public FrameProcessor::FilteredListener { 47da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala public: 48da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureSequencer(wp<Camera2Client> client); 49da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ~CaptureSequencer(); 50da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 51da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Get reference to the ZslProcessor, which holds the ZSL buffers and frames 52ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin void setZslProcessor(wp<ZslProcessorInterface> processor); 53da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 54da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Begin still image capture 55aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin status_t startCapture(int msgType); 56da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 57d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala // Wait until current image capture completes; returns immediately if no 58d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala // capture is active. Returns TIMED_OUT if capture does not complete during 59d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala // the specified duration. 60d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala status_t waitUntilIdle(nsecs_t timeout); 61d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala 62da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Notifications about AE state changes 63da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala void notifyAutoExposure(uint8_t newState, int triggerId); 64da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 65216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh // Notifications about shutter (capture start) 66216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh void notifyShutter(const CaptureResultExtras& resultExtras, 67216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh nsecs_t timestamp); 68216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh 69cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // Notification from the frame processor 70cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual void onResultAvailable(const CaptureResult &result); 71da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 72fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala // Notifications from the JPEG processor 73fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala void onCaptureAvailable(nsecs_t timestamp, sp<MemoryBase> captureBuffer); 74da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala void dump(int fd, const Vector<String16>& args); 76da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 77da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala private: 78da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala /** 79da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Accessed by other threads 80da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */ 81da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex mInputMutex; 82da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 83da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool mStartCapture; 84da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool mBusy; 85da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Condition mStartCaptureSignal; 86da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 87da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool mNewAEState; 88da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t mAEState; 89da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int mAETriggerId; 90da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Condition mNewNotifySignal; 91da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool mNewFrameReceived; 93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int32_t mNewFrameId; 94da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CameraMetadata mNewFrame; 95da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Condition mNewFrameSignal; 96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 97da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool mNewCaptureReceived; 98da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala nsecs_t mCaptureTimestamp; 99fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala sp<MemoryBase> mCaptureBuffer; 100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Condition mNewCaptureSignal; 101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 102216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh bool mShutterNotified; // Has CaptureSequencer sent shutter to Client 103216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh bool mHalNotifiedShutter; // Has HAL sent shutter to CaptureSequencer 104216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh int32_t mShutterCaptureId; // The captureId which is waiting for shutter notification 105216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh Condition mShutterNotifySignal; 1061e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala 107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala /** 108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Internal to CaptureSequencer 109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */ 110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala static const nsecs_t kWaitDuration = 100000000; // 100 ms 1110a4df03542e7d7aab716a60e206dceaf5da178f3Eino-Ville Talvala static const int kMaxTimeoutsForPrecaptureStart = 10; // 1 sec 112c55311869f1853c6814c9bcda8a4b60e43091c1aEino-Ville Talvala static const int kMaxTimeoutsForPrecaptureEnd = 20; // 2 sec 1131f266efe8ce2976b6531fab8698716354b2247f8Eino-Ville Talvala static const int kMaxTimeoutsForCaptureEnd = 40; // 4 sec 114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala wp<Camera2Client> mClient; 116ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin wp<ZslProcessorInterface> mZslProcessor; 117e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter sp<BurstCapture> mBurstCapture; 118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala enum CaptureState { 120da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala IDLE, 121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala START, 122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ZSL_START, 123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ZSL_WAITING, 124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ZSL_REPROCESSING, 125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala STANDARD_START, 126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala STANDARD_PRECAPTURE_WAIT, 127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala STANDARD_CAPTURE, 128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala STANDARD_CAPTURE_WAIT, 129e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter BURST_CAPTURE_START, 130e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter BURST_CAPTURE_WAIT, 131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala DONE, 132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ERROR, 133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala NUM_CAPTURE_STATES 134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } mCaptureState; 135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala static const char* kStateNames[]; 1362b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala int mStateTransitionCount; 137d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala Mutex mStateMutex; // Guards mCaptureState 138d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala Condition mStateChanged; 139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala typedef CaptureState (CaptureSequencer::*StateManager)(sp<Camera2Client> &client); 141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala static const StateManager kStateManagers[]; 142da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 143da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CameraMetadata mCaptureRequest; 144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int mTriggerId; 146da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int mTimeoutCount; 147da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool mAeInPrecapture; 148da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 149da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int32_t mCaptureId; 150aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin int mMsgType; 151da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Main internal methods 153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual bool threadLoop(); 155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageIdle(sp<Camera2Client> &client); 157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageStart(sp<Camera2Client> &client); 158da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 159da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageZslStart(sp<Camera2Client> &client); 160da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageZslWaiting(sp<Camera2Client> &client); 161da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageZslReprocessing(sp<Camera2Client> &client); 162da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 163da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageStandardStart(sp<Camera2Client> &client); 164da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageStandardPrecaptureWait(sp<Camera2Client> &client); 165da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageStandardCapture(sp<Camera2Client> &client); 166da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageStandardCaptureWait(sp<Camera2Client> &client); 167da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 168e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter CaptureState manageBurstCaptureStart(sp<Camera2Client> &client); 169e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter CaptureState manageBurstCaptureWait(sp<Camera2Client> &client); 170e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 171da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageDone(sp<Camera2Client> &client); 172da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 173da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Utility methods 174da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 175da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t updateCaptureRequest(const Parameters ¶ms, 176da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client); 1771b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin 1781b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin // Emit Shutter/Raw callback to java, and maybe play a shutter sound 1791b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin static void shutterNotifyLocked(const Parameters ¶ms, 180aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin sp<Camera2Client> client, int msgType); 181da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; 182da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 183da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace camera2 184da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace android 185da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 186da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#endif 187