CaptureSequencer.h revision 1f266efe8ce2976b6531fab8698716354b2247f8
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 20da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Thread.h> 21da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/String16.h> 22da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Vector.h> 23da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Mutex.h> 24da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Condition.h> 25da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "CameraMetadata.h" 26da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "Parameters.h" 27da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "FrameProcessor.h" 28da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 29da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace android { 30da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 31da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass Camera2Client; 32da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 33da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace camera2 { 34da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 35da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass ZslProcessor; 36e538206d15282afbc5b168d60b1026a5dfcd13c0James Painterclass BurstCapture; 37da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 38da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/** 39da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Manages the still image capture process for 40da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * zero-shutter-lag, regular, and video snapshots. 41da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */ 42da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass CaptureSequencer: 43da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual public Thread, 44da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual public FrameProcessor::FilteredListener { 45da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala public: 46da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureSequencer(wp<Camera2Client> client); 47da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ~CaptureSequencer(); 48da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 49da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Get reference to the ZslProcessor, which holds the ZSL buffers and frames 50da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala void setZslProcessor(wp<ZslProcessor> processor); 51da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 52da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Begin still image capture 53da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t startCapture(); 54da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 55da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Notifications about AE state changes 56da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala void notifyAutoExposure(uint8_t newState, int triggerId); 57da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 58da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Notifications from the frame processor 59da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual void onFrameAvailable(int32_t frameId, CameraMetadata &frame); 60da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 61da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Notifications from the capture processor 62da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala void onCaptureAvailable(nsecs_t timestamp); 63da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 64da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala void dump(int fd, const Vector<String16>& args); 65da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 66da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala private: 67da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala /** 68da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Accessed by other threads 69da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */ 70da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex mInputMutex; 71da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 72da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool mStartCapture; 73da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool mBusy; 74da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Condition mStartCaptureSignal; 75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 76da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool mNewAEState; 77da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t mAEState; 78da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int mAETriggerId; 79da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Condition mNewNotifySignal; 80da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 81da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool mNewFrameReceived; 82da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int32_t mNewFrameId; 83da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CameraMetadata mNewFrame; 84da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Condition mNewFrameSignal; 85da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 86da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool mNewCaptureReceived; 87da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala nsecs_t mCaptureTimestamp; 88da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Condition mNewCaptureSignal; 89da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 90da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala /** 91da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Internal to CaptureSequencer 92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */ 93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala static const nsecs_t kWaitDuration = 100000000; // 100 ms 94da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala static const int kMaxTimeoutsForPrecaptureStart = 2; // 200 ms 95da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala static const int kMaxTimeoutsForPrecaptureEnd = 10; // 1 sec 961f266efe8ce2976b6531fab8698716354b2247f8Eino-Ville Talvala static const int kMaxTimeoutsForCaptureEnd = 40; // 4 sec 97da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 98da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala wp<Camera2Client> mClient; 99da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala wp<ZslProcessor> mZslProcessor; 100e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter sp<BurstCapture> mBurstCapture; 101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala enum CaptureState { 103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala IDLE, 104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala START, 105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ZSL_START, 106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ZSL_WAITING, 107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ZSL_REPROCESSING, 108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala STANDARD_START, 109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala STANDARD_PRECAPTURE_WAIT, 110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala STANDARD_CAPTURE, 111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala STANDARD_CAPTURE_WAIT, 112e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter BURST_CAPTURE_START, 113e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter BURST_CAPTURE_WAIT, 114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala DONE, 115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ERROR, 116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala NUM_CAPTURE_STATES 117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } mCaptureState; 118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala static const char* kStateNames[]; 119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 120da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala typedef CaptureState (CaptureSequencer::*StateManager)(sp<Camera2Client> &client); 121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala static const StateManager kStateManagers[]; 122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CameraMetadata mCaptureRequest; 124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int mTriggerId; 126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int mTimeoutCount; 127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool mAeInPrecapture; 128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int32_t mCaptureId; 130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Main internal methods 132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual bool threadLoop(); 134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageIdle(sp<Camera2Client> &client); 136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageStart(sp<Camera2Client> &client); 137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageZslStart(sp<Camera2Client> &client); 139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageZslWaiting(sp<Camera2Client> &client); 140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageZslReprocessing(sp<Camera2Client> &client); 141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 142da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageStandardStart(sp<Camera2Client> &client); 143da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageStandardPrecaptureWait(sp<Camera2Client> &client); 144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageStandardCapture(sp<Camera2Client> &client); 145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageStandardCaptureWait(sp<Camera2Client> &client); 146da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 147e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter CaptureState manageBurstCaptureStart(sp<Camera2Client> &client); 148e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter CaptureState manageBurstCaptureWait(sp<Camera2Client> &client); 149e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 150da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState manageDone(sp<Camera2Client> &client); 151da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Utility methods 153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t updateCaptureRequest(const Parameters ¶ms, 155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client); 156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; 157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 158da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace camera2 159da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace android 160da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 161da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#endif 162