CaptureSequencer.cpp revision a4247b833599882b23db39e9f773746dc2fd9693
169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/* 269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * 469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * you may not use this file except in compliance with the License. 669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * You may obtain a copy of the License at 769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * 869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * 1069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 1169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 1269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * See the License for the specific language governing permissions and 1469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * limitations under the License. 1569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala */ 1669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 1769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#define LOG_TAG "Camera2Client::CaptureSequencer" 1869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA 1969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala//#define LOG_NDEBUG 0 2069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 2169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Log.h> 2269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Trace.h> 2369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Vector.h> 2469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 2569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "CaptureSequencer.h" 26c3dbf1a40df85b75e5805382838a90416f69730fJames Painter#include "BurstCapture.h" 2769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "../Camera2Device.h" 2869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "../Camera2Client.h" 2969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "Parameters.h" 3069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace android { 3269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace camera2 { 3369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Public members */ 3569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureSequencer(wp<Camera2Client> client): 3769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Thread(false), 3869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCapture(false), 3969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBusy(false), 4069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewAEState(false), 4169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameReceived(false), 4269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureReceived(false), 4369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mClient(client), 4469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureState(IDLE), 4569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTriggerId(0), 4669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount(0), 4769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureId(Camera2Client::kFirstCaptureRequestId) { 48c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 4969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 5069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 5169230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::~CaptureSequencer() { 5269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Exit", __FUNCTION__); 5369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 5469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 5569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::setZslProcessor(wp<ZslProcessor> processor) { 5669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 5769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mZslProcessor = processor; 5869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 5969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 6069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t CaptureSequencer::startCapture() { 61c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 6269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 6369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 6469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mBusy) { 6569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Already busy capturing!", __FUNCTION__); 6669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return INVALID_OPERATION; 6769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 6869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mStartCapture) { 6969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCapture = true; 7069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCaptureSignal.signal(); 7169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 7269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 7369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 7469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 7569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::notifyAutoExposure(uint8_t newState, int triggerId) { 7669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 7769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 7869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAEState = newState; 7969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAETriggerId = triggerId; 8069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mNewAEState) { 8169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewAEState = true; 8269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewNotifySignal.signal(); 8369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 8469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 8569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 8669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::onFrameAvailable(int32_t frameId, 8769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CameraMetadata &frame) { 88c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s: Listener found new frame", __FUNCTION__); 8969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 9069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 9169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameId = frameId; 9269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrame.acquire(frame); 9369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mNewFrameReceived) { 9469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameReceived = true; 9569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameSignal.signal(); 9669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 9769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 9869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 9969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::onCaptureAvailable(nsecs_t timestamp) { 10069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 101c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 10269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 10369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureTimestamp = timestamp; 10469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mNewCaptureReceived) { 10569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureReceived = true; 10669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureSignal.signal(); 10769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 10869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 10969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 11069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 11169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::dump(int fd, const Vector<String16>& args) { 11269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala String8 result; 11369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mCaptureRequest.entryCount() != 0) { 11469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result = " Capture request:\n"; 11569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 11669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureRequest.dump(fd, 2, 6); 11769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 11869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result = " Capture request: undefined\n"; 11969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 12069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 12169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result = String8::format(" Current capture state: %s\n", 12269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala kStateNames[mCaptureState]); 12369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result.append(" Latest captured frame:\n"); 12469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 12569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrame.dump(fd, 2, 6); 12669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 12769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 12869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Private members */ 12969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 13069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst char* CaptureSequencer::kStateNames[CaptureSequencer::NUM_CAPTURE_STATES+1] = 13169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala{ 13269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "IDLE", 13369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "START", 13469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ZSL_START", 13569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ZSL_WAITING", 13669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ZSL_REPROCESSING", 13769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "STANDARD_START", 13869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "STANDARD_PRECAPTURE", 13969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "STANDARD_CAPTURING", 140c3dbf1a40df85b75e5805382838a90416f69730fJames Painter "BURST_CAPTURE_START", 141c3dbf1a40df85b75e5805382838a90416f69730fJames Painter "BURST_CAPTURE_WAIT", 14269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "DONE", 14369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ERROR", 14469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "UNKNOWN" 14569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; 14669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 14769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst CaptureSequencer::StateManager 14869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = { 14969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageIdle, 15069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStart, 15169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageZslStart, 15269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageZslWaiting, 15369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageZslReprocessing, 15469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardStart, 15569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardPrecaptureWait, 15669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardCapture, 15769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardCaptureWait, 158c3dbf1a40df85b75e5805382838a90416f69730fJames Painter &CaptureSequencer::manageBurstCaptureStart, 159c3dbf1a40df85b75e5805382838a90416f69730fJames Painter &CaptureSequencer::manageBurstCaptureWait, 16069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageDone, 16169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; 16269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 16369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalabool CaptureSequencer::threadLoop() { 16469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 16569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 16669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 16769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (client == 0) return false; 16869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 16969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mCaptureState < ERROR) { 17069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureState = (this->*kStateManagers[mCaptureState])(client); 17169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 17269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Bad capture state: %s", 17369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, kStateNames[mCaptureState]); 17469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return false; 17569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 17669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 17769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return true; 17869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 17969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 18069230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageIdle(sp<Camera2Client> &client) { 18169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 18269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 18369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 18469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mStartCapture) { 18569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mStartCaptureSignal.waitRelative(mInputMutex, 18669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala kWaitDuration); 18769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) break; 18869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 18969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mStartCapture) { 19069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCapture = false; 19169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBusy = true; 19269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return START; 19369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 19469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return IDLE; 19569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 19669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 19769230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageDone(sp<Camera2Client> &client) { 19869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 19969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 20069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureId++; 20169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 20269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala { 20369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 20469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBusy = false; 20569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 20669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 20769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 20869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala switch (l.mParameters.state) { 20969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala case Parameters::STILL_CAPTURE: 21069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala l.mParameters.state = Parameters::STOPPED; 21169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 21269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 21369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala l.mParameters.state = Parameters::RECORD; 21469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 21569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala default: 21669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Still image produced unexpectedly " 21769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "in state %s!", 21869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), 21969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 22069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 22169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 22269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return IDLE; 22369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 22469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 22569230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStart( 22669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 227c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 22869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 22969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 23069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 23169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CaptureState nextState = DONE; 23269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 23369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = updateCaptureRequest(l.mParameters, client); 23469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK ) { 23569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Can't update still image capture request: %s (%d)", 23669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 23769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 23869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 23969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 240c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if(l.mParameters.lightFx != Parameters::LIGHTFX_NONE && 241c3dbf1a40df85b75e5805382838a90416f69730fJames Painter l.mParameters.state == Parameters::STILL_CAPTURE) { 242c3dbf1a40df85b75e5805382838a90416f69730fJames Painter nextState = BURST_CAPTURE_START; 243c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 244c3dbf1a40df85b75e5805382838a90416f69730fJames Painter else if (l.mParameters.zslMode && 24569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala l.mParameters.state == Parameters::STILL_CAPTURE) { 24669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala nextState = ZSL_START; 24769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 24869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala nextState = STANDARD_START; 24969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 25069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 25169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return nextState; 25269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 25369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 25469230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslStart( 25569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 2562954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala ALOGV("%s", __FUNCTION__); 25769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 25869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<ZslProcessor> processor = mZslProcessor.promote(); 25969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (processor == 0) { 26069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: No ZSL queue to use!", __FUNCTION__); 26169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 26269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 26369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 26469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala client->registerFrameListener(mCaptureId, 26569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala this); 26669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 26769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = client->getCameraDevice()->clearStreamingRequest(); 26869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 26969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop preview for ZSL capture: " 27069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "%s (%d)", 27169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 27269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 27369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 27469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // TODO: Actually select the right thing here. 2752954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala res = processor->pushToReprocess(mCaptureId); 2762954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala if (res != OK) { 2772274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala if (res == NOT_ENOUGH_DATA) { 2782274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala ALOGV("%s: Camera %d: ZSL queue doesn't have good frame, " 2792274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala "falling back to normal capture", __FUNCTION__, 2802274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala client->getCameraId()); 2812274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala } else { 2822274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala ALOGE("%s: Camera %d: Error in ZSL queue: %s (%d)", 2832274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 2842274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala } 2852954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala return STANDARD_START; 2862954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala } 28769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 288a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 289a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala if (l.mParameters.playShutterSound) { 290a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala client->getCameraService()->playSound(CameraService::SOUND_SHUTTER); 291a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala } 292a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala 29369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForCaptureEnd; 29469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 29569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 29669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 29769230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslWaiting( 29869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 2992954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala ALOGV("%s", __FUNCTION__); 30069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 30169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 30269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 30369230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslReprocessing( 30469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 3052954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala ALOGV("%s", __FUNCTION__); 30669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return START; 30769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 30869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 30969230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardStart( 31069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 31169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 31269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala client->registerFrameListener(mCaptureId, 31369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala this); 31469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala { 31569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 31669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTriggerId = l.mParameters.precaptureTriggerCounter++; 31769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 31869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala client->getCameraDevice()->triggerPrecaptureMetering(mTriggerId); 31969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 32069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAeInPrecapture = false; 32169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForPrecaptureStart; 32269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_PRECAPTURE_WAIT; 32369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 32469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 32569230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardPrecaptureWait( 32669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 32769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 32869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 32969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 33069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mNewAEState) { 33169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mNewNotifySignal.waitRelative(mInputMutex, kWaitDuration); 33269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) { 33369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount--; 33469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 33569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 33669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 33769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mTimeoutCount <= 0) { 33869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Timed out waiting for precapture %s", 33969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAeInPrecapture ? "end" : "start"); 34069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE; 34169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 34269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mNewAEState) { 34369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mAeInPrecapture) { 34469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // Waiting to see PRECAPTURE state 34569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mAETriggerId == mTriggerId && 34669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAEState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 34769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Got precapture start", __FUNCTION__); 34869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAeInPrecapture = true; 34969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForPrecaptureEnd; 35069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 35169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 35269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // Waiting to see PRECAPTURE state end 35369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mAETriggerId == mTriggerId && 35469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAEState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 35569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Got precapture end", __FUNCTION__); 35669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE; 35769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 35869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 35969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewAEState = false; 36069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 36169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_PRECAPTURE_WAIT; 36269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 36369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 36469230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture( 36569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 36669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 36769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 36869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 36969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Vector<uint8_t> outputStreams; 37069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 37169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getPreviewStreamId()); 37269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getCaptureStreamId()); 37369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 37469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (l.mParameters.previewCallbackFlags & 37569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) { 37669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getCallbackStreamId()); 37769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 37869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 37969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) { 38069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getRecordingStreamId()); 38169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 38269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 38369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS, 38469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams); 38569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == OK) { 38669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_ID, 38769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &mCaptureId, 1); 38869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 38969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == OK) { 39069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.sort(); 39169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 39269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 39369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 39469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)", 39569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 39669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 39769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 39869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 39969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CameraMetadata captureCopy = mCaptureRequest; 40069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (captureCopy.entryCount() == 0) { 40169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 40269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId()); 40369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 40469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 40569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 40669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (l.mParameters.state == Parameters::STILL_CAPTURE) { 40769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = client->getCameraDevice()->clearStreamingRequest(); 40869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 40969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop preview for still capture: " 41069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "%s (%d)", 41169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 41269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 41369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 41469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 41569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // TODO: Capture should be atomic with setStreamingRequest here 41669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = client->getCameraDevice()->capture(captureCopy); 41769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 41869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to submit still image capture request: " 41969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "%s (%d)", 42069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 42169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 42269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 42369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 424bd3a81653a9bbdf7aa9394d99f2fc9b7dabf68dcEino-Ville Talvala if (l.mParameters.playShutterSound && 425bd3a81653a9bbdf7aa9394d99f2fc9b7dabf68dcEino-Ville Talvala l.mParameters.state == Parameters::STILL_CAPTURE) { 42633578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala client->getCameraService()->playSound(CameraService::SOUND_SHUTTER); 42733578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala } 42833578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala 42969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForCaptureEnd; 43069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 43169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 43269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 43369230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCaptureWait( 43469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 43569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 43669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 43769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 43869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mNewFrameReceived) { 43969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mNewFrameSignal.waitRelative(mInputMutex, kWaitDuration); 44069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) { 44169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount--; 44269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 44369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 44469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 44569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mNewCaptureReceived) { 44669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration); 44769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) { 44869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount--; 44969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 45069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 45169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 45269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mTimeoutCount <= 0) { 45369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Timed out waiting for capture to complete"); 45469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 45569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 45669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mNewFrameReceived && mNewCaptureReceived) { 45769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mNewFrameId != mCaptureId) { 45869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Mismatched capture frame IDs: Expected %d, got %d", 45969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureId, mNewFrameId); 46069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 46169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala camera_metadata_entry_t entry; 46269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala entry = mNewFrame.find(ANDROID_SENSOR_TIMESTAMP); 46369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (entry.count == 0) { 46469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("No timestamp field in capture frame!"); 46569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 46669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (entry.data.i64[0] != mCaptureTimestamp) { 46769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Mismatched capture timestamps: Metadata frame %lld," 46869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala " captured buffer %lld", entry.data.i64[0], mCaptureTimestamp); 46969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 47069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala client->removeFrameListener(mCaptureId); 47169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 47269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameReceived = false; 47369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureReceived = false; 47469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 47569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 47669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 47769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 47869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 479c3dbf1a40df85b75e5805382838a90416f69730fJames PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureStart( 480c3dbf1a40df85b75e5805382838a90416f69730fJames Painter sp<Camera2Client> &client) { 481c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 482c3dbf1a40df85b75e5805382838a90416f69730fJames Painter status_t res; 483c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ATRACE_CALL(); 484c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 485c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // check which burst mode is set, create respective burst object 486c3dbf1a40df85b75e5805382838a90416f69730fJames Painter { 487c3dbf1a40df85b75e5805382838a90416f69730fJames Painter SharedParameters::Lock l(client->getParameters()); 488c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 489c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = updateCaptureRequest(l.mParameters, client); 490c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if(res != OK) { 491c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 492c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 493c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 494c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // 495c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // check for burst mode type in mParameters here 496c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // 497c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mBurstCapture = new BurstCapture(client, this); 498c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 499c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 500c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mCaptureRequest.update(ANDROID_REQUEST_ID, &mCaptureId, 1); 501c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (res == OK) { 502c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mCaptureRequest.sort(); 503c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 504c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (res != OK) { 505c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)", 506c3dbf1a40df85b75e5805382838a90416f69730fJames Painter __FUNCTION__, client->getCameraId(), strerror(-res), res); 507c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 508c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 509c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 510c3dbf1a40df85b75e5805382838a90416f69730fJames Painter CameraMetadata captureCopy = mCaptureRequest; 511c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (captureCopy.entryCount() == 0) { 512c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 513c3dbf1a40df85b75e5805382838a90416f69730fJames Painter __FUNCTION__, client->getCameraId()); 514c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 515c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 516c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 517c3dbf1a40df85b75e5805382838a90416f69730fJames Painter Vector<CameraMetadata> requests; 518c3dbf1a40df85b75e5805382838a90416f69730fJames Painter requests.push(mCaptureRequest); 519c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mBurstCapture->start(requests, mCaptureId); 520c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mTimeoutCount = kMaxTimeoutsForCaptureEnd * 10; 521c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return BURST_CAPTURE_WAIT; 522c3dbf1a40df85b75e5805382838a90416f69730fJames Painter} 523c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 524c3dbf1a40df85b75e5805382838a90416f69730fJames PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureWait( 525c3dbf1a40df85b75e5805382838a90416f69730fJames Painter sp<Camera2Client> &client) { 526c3dbf1a40df85b75e5805382838a90416f69730fJames Painter status_t res; 527c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ATRACE_CALL(); 528c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 529c3dbf1a40df85b75e5805382838a90416f69730fJames Painter while (!mNewCaptureReceived) { 530c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration); 531c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (res == TIMED_OUT) { 532c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mTimeoutCount--; 533c3dbf1a40df85b75e5805382838a90416f69730fJames Painter break; 534c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 535c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 536c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 537c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (mTimeoutCount <= 0) { 538c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGW("Timed out waiting for burst capture to complete"); 539c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 540c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 541c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (mNewCaptureReceived) { 542c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mNewCaptureReceived = false; 543c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // TODO: update mCaptureId to last burst's capture ID + 1? 544c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 545c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 546c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 547c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return BURST_CAPTURE_WAIT; 548c3dbf1a40df85b75e5805382838a90416f69730fJames Painter} 549c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 55069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t CaptureSequencer::updateCaptureRequest(const Parameters ¶ms, 55169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 55269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 55369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 55469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mCaptureRequest.entryCount() == 0) { 55569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = client->getCameraDevice()->createDefaultRequest( 55669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CAMERA2_TEMPLATE_STILL_CAPTURE, 55769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &mCaptureRequest); 55869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 55969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default still image request:" 56069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala " %s (%d)", __FUNCTION__, client->getCameraId(), 56169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala strerror(-res), res); 56269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 56369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 56469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 56569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 56669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = params.updateRequest(&mCaptureRequest); 56769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 56869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of capture " 56969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "request: %s (%d)", __FUNCTION__, client->getCameraId(), 57069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala strerror(-res), res); 57169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 57269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 57369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 57469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_SIZE, 57569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala params.jpegThumbSize, 2); 57669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 57769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_QUALITY, 57869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ¶ms.jpegThumbQuality, 1); 57969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 58069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_JPEG_QUALITY, 58169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ¶ms.jpegQuality, 1); 58269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 58369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update( 58469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ANDROID_JPEG_ORIENTATION, 58569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ¶ms.jpegRotation, 1); 58669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 58769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 58869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (params.gpsEnabled) { 58969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update( 59069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES, 59169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala params.gpsCoordinates, 3); 59269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 59369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update( 59469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP, 59569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ¶ms.gpsTimestamp, 1); 59669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 59769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update( 59869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD, 59969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala params.gpsProcessingMethod); 60069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 60169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 60269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.erase(ANDROID_JPEG_GPS_COORDINATES); 60369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 60469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.erase(ANDROID_JPEG_GPS_TIMESTAMP); 60569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 60669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.erase(ANDROID_JPEG_GPS_PROCESSING_METHOD); 60769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 60869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 60969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 61069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 61169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 61269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 61369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 61469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace camera2 61569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace android 616