/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_SERVERS_CAMERA_CAMERA2_CAPTURESEQUENCER_H #define ANDROID_SERVERS_CAMERA_CAMERA2_CAPTURESEQUENCER_H #include <binder/MemoryBase.h> #include <utils/Thread.h> #include <utils/String16.h> #include <utils/Vector.h> #include <utils/Mutex.h> #include <utils/Condition.h> #include "camera/CameraMetadata.h" #include "camera/CaptureResult.h" #include "Parameters.h" #include "FrameProcessor.h" namespace android { class Camera2Client; namespace camera2 { class ZslProcessorInterface; class BurstCapture; /** * Manages the still image capture process for * zero-shutter-lag, regular, and video snapshots. */ class CaptureSequencer: virtual public Thread, virtual public FrameProcessor::FilteredListener { public: CaptureSequencer(wp<Camera2Client> client); ~CaptureSequencer(); // Get reference to the ZslProcessor, which holds the ZSL buffers and frames void setZslProcessor(wp<ZslProcessorInterface> processor); // Begin still image capture status_t startCapture(int msgType); // Wait until current image capture completes; returns immediately if no // capture is active. Returns TIMED_OUT if capture does not complete during // the specified duration. status_t waitUntilIdle(nsecs_t timeout); // Notifications about AE state changes void notifyAutoExposure(uint8_t newState, int triggerId); // Notifications about shutter (capture start) void notifyShutter(const CaptureResultExtras& resultExtras, nsecs_t timestamp); // Notification from the frame processor virtual void onResultAvailable(const CaptureResult &result); // Notifications from the JPEG processor void onCaptureAvailable(nsecs_t timestamp, sp<MemoryBase> captureBuffer); void dump(int fd, const Vector<String16>& args); private: /** * Accessed by other threads */ Mutex mInputMutex; bool mStartCapture; bool mBusy; Condition mStartCaptureSignal; bool mNewAEState; uint8_t mAEState; int mAETriggerId; Condition mNewNotifySignal; bool mNewFrameReceived; int32_t mNewFrameId; CameraMetadata mNewFrame; Condition mNewFrameSignal; bool mNewCaptureReceived; nsecs_t mCaptureTimestamp; sp<MemoryBase> mCaptureBuffer; Condition mNewCaptureSignal; bool mShutterNotified; // Has CaptureSequencer sent shutter to Client bool mHalNotifiedShutter; // Has HAL sent shutter to CaptureSequencer int32_t mShutterCaptureId; // The captureId which is waiting for shutter notification Condition mShutterNotifySignal; /** * Internal to CaptureSequencer */ static const nsecs_t kWaitDuration = 100000000; // 100 ms static const int kMaxTimeoutsForPrecaptureStart = 10; // 1 sec static const int kMaxTimeoutsForPrecaptureEnd = 20; // 2 sec static const int kMaxTimeoutsForCaptureEnd = 40; // 4 sec wp<Camera2Client> mClient; wp<ZslProcessorInterface> mZslProcessor; sp<BurstCapture> mBurstCapture; enum CaptureState { IDLE, START, ZSL_START, ZSL_WAITING, ZSL_REPROCESSING, STANDARD_START, STANDARD_PRECAPTURE_WAIT, STANDARD_CAPTURE, STANDARD_CAPTURE_WAIT, BURST_CAPTURE_START, BURST_CAPTURE_WAIT, DONE, ERROR, NUM_CAPTURE_STATES } mCaptureState; static const char* kStateNames[]; int mStateTransitionCount; Mutex mStateMutex; // Guards mCaptureState Condition mStateChanged; typedef CaptureState (CaptureSequencer::*StateManager)(sp<Camera2Client> &client); static const StateManager kStateManagers[]; CameraMetadata mCaptureRequest; int mTriggerId; int mTimeoutCount; bool mAeInPrecapture; int32_t mCaptureId; int mMsgType; // Main internal methods virtual bool threadLoop(); CaptureState manageIdle(sp<Camera2Client> &client); CaptureState manageStart(sp<Camera2Client> &client); CaptureState manageZslStart(sp<Camera2Client> &client); CaptureState manageZslWaiting(sp<Camera2Client> &client); CaptureState manageZslReprocessing(sp<Camera2Client> &client); CaptureState manageStandardStart(sp<Camera2Client> &client); CaptureState manageStandardPrecaptureWait(sp<Camera2Client> &client); CaptureState manageStandardCapture(sp<Camera2Client> &client); CaptureState manageStandardCaptureWait(sp<Camera2Client> &client); CaptureState manageBurstCaptureStart(sp<Camera2Client> &client); CaptureState manageBurstCaptureWait(sp<Camera2Client> &client); CaptureState manageDone(sp<Camera2Client> &client); // Utility methods status_t updateCaptureRequest(const Parameters ¶ms, sp<Camera2Client> &client); // Emit Shutter/Raw callback to java, and maybe play a shutter sound static void shutterNotifyLocked(const Parameters ¶ms, sp<Camera2Client> client, int msgType); }; }; // namespace camera2 }; // namespace android #endif