CaptureSequencer.cpp revision 5a8fed0251b978388bcebd6f4d0c4e2773c7641e
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 9952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvalavoid CaptureSequencer::onCaptureAvailable(nsecs_t timestamp, 10052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala sp<MemoryBase> captureBuffer) { 10169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 102c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 10369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 10469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureTimestamp = timestamp; 10552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala mCaptureBuffer = captureBuffer; 10669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mNewCaptureReceived) { 10769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureReceived = true; 10869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureSignal.signal(); 10969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 11069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 11169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 11269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 11369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::dump(int fd, const Vector<String16>& args) { 11469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala String8 result; 11569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mCaptureRequest.entryCount() != 0) { 11669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result = " Capture request:\n"; 11769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 11869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureRequest.dump(fd, 2, 6); 11969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 12069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result = " Capture request: undefined\n"; 12169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 12269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 12369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result = String8::format(" Current capture state: %s\n", 12469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala kStateNames[mCaptureState]); 12569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result.append(" Latest captured frame:\n"); 12669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 12769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrame.dump(fd, 2, 6); 12869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 12969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 13069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Private members */ 13169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 13269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst char* CaptureSequencer::kStateNames[CaptureSequencer::NUM_CAPTURE_STATES+1] = 13369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala{ 13469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "IDLE", 13569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "START", 13669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ZSL_START", 13769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ZSL_WAITING", 13869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ZSL_REPROCESSING", 13969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "STANDARD_START", 14069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "STANDARD_PRECAPTURE", 14169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "STANDARD_CAPTURING", 142c3dbf1a40df85b75e5805382838a90416f69730fJames Painter "BURST_CAPTURE_START", 143c3dbf1a40df85b75e5805382838a90416f69730fJames Painter "BURST_CAPTURE_WAIT", 14469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "DONE", 14569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ERROR", 14669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "UNKNOWN" 14769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; 14869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 14969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst CaptureSequencer::StateManager 15069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = { 15169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageIdle, 15269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStart, 15369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageZslStart, 15469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageZslWaiting, 15569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageZslReprocessing, 15669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardStart, 15769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardPrecaptureWait, 15869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardCapture, 15969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardCaptureWait, 160c3dbf1a40df85b75e5805382838a90416f69730fJames Painter &CaptureSequencer::manageBurstCaptureStart, 161c3dbf1a40df85b75e5805382838a90416f69730fJames Painter &CaptureSequencer::manageBurstCaptureWait, 16269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageDone, 16369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; 16469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 16569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalabool CaptureSequencer::threadLoop() { 16669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 16769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 16869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 16969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (client == 0) return false; 17069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 17169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mCaptureState < ERROR) { 17269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureState = (this->*kStateManagers[mCaptureState])(client); 17369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 17469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Bad capture state: %s", 17569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, kStateNames[mCaptureState]); 17669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return false; 17769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 17869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 17969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return true; 18069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 18169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 18269230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageIdle(sp<Camera2Client> &client) { 18369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 18469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 18569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 18669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mStartCapture) { 18769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mStartCaptureSignal.waitRelative(mInputMutex, 18869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala kWaitDuration); 18969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) break; 19069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 19169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mStartCapture) { 19269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCapture = false; 19369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBusy = true; 19469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return START; 19569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 19669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return IDLE; 19769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 19869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 19969230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageDone(sp<Camera2Client> &client) { 20052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala status_t res = OK; 20169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 20269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureId++; 20369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 20469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala { 20569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 20669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBusy = false; 20769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 20869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 20952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala { 21052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 21152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala switch (l.mParameters.state) { 21252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala case Parameters::STILL_CAPTURE: 21352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala l.mParameters.state = Parameters::STOPPED; 21452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala break; 21552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 21652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala l.mParameters.state = Parameters::RECORD; 21752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala break; 21852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala default: 21952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala ALOGE("%s: Camera %d: Still image produced unexpectedly " 22052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala "in state %s!", 22152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala __FUNCTION__, client->getCameraId(), 22252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 22352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala res = INVALID_OPERATION; 22452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } 22552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } 2265a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala sp<ZslProcessor> processor = mZslProcessor.promote(); 2275a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala if (processor != 0) { 2285a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala processor->clearZslQueue(); 2295a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala } 2305a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala 23152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala if (mCaptureBuffer != 0 && res == OK) { 23252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala Camera2Client::SharedCameraClient::Lock l(client->mSharedCameraClient); 23352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala ALOGV("%s: Sending still image to client", __FUNCTION__); 23452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala if (l.mCameraClient != 0) { 23552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala l.mCameraClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, 23652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala mCaptureBuffer, NULL); 23752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } else { 23852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala ALOGV("%s: No client!", __FUNCTION__); 23952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } 24069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 24152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala mCaptureBuffer.clear(); 24269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 24369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return IDLE; 24469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 24569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 24669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStart( 24769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 248c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 24969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 25069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 25169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 25269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CaptureState nextState = DONE; 25369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 25469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = updateCaptureRequest(l.mParameters, client); 25569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK ) { 25669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Can't update still image capture request: %s (%d)", 25769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 25869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 25969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 26069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 261c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if(l.mParameters.lightFx != Parameters::LIGHTFX_NONE && 262c3dbf1a40df85b75e5805382838a90416f69730fJames Painter l.mParameters.state == Parameters::STILL_CAPTURE) { 263c3dbf1a40df85b75e5805382838a90416f69730fJames Painter nextState = BURST_CAPTURE_START; 264c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 265c3dbf1a40df85b75e5805382838a90416f69730fJames Painter else if (l.mParameters.zslMode && 26669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala l.mParameters.state == Parameters::STILL_CAPTURE) { 26769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala nextState = ZSL_START; 26869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 26969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala nextState = STANDARD_START; 27069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 27169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 27269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return nextState; 27369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 27469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 27569230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslStart( 27669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 2772954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala ALOGV("%s", __FUNCTION__); 27869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 27969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<ZslProcessor> processor = mZslProcessor.promote(); 28069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (processor == 0) { 28169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: No ZSL queue to use!", __FUNCTION__); 28269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 28369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 28469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 28569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala client->registerFrameListener(mCaptureId, 28669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala this); 28769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 28869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = client->getCameraDevice()->clearStreamingRequest(); 28969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 29069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop preview for ZSL capture: " 29169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "%s (%d)", 29269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 29369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 29469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 29569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // TODO: Actually select the right thing here. 2962954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala res = processor->pushToReprocess(mCaptureId); 2972954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala if (res != OK) { 2982274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala if (res == NOT_ENOUGH_DATA) { 2992274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala ALOGV("%s: Camera %d: ZSL queue doesn't have good frame, " 3002274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala "falling back to normal capture", __FUNCTION__, 3012274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala client->getCameraId()); 3022274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala } else { 3032274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala ALOGE("%s: Camera %d: Error in ZSL queue: %s (%d)", 3042274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 3052274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala } 3062954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala return STANDARD_START; 3072954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala } 30869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 309a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 310a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala if (l.mParameters.playShutterSound) { 311a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala client->getCameraService()->playSound(CameraService::SOUND_SHUTTER); 312a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala } 313a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala 31469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForCaptureEnd; 31569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 31669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 31769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 31869230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslWaiting( 31969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 3202954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala ALOGV("%s", __FUNCTION__); 32169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 32269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 32369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 32469230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslReprocessing( 32569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 3262954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala ALOGV("%s", __FUNCTION__); 32769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return START; 32869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 32969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 33069230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardStart( 33169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 33269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 33369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala client->registerFrameListener(mCaptureId, 33469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala this); 33569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala { 33669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 33769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTriggerId = l.mParameters.precaptureTriggerCounter++; 33869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 33969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala client->getCameraDevice()->triggerPrecaptureMetering(mTriggerId); 34069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 34169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAeInPrecapture = false; 34269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForPrecaptureStart; 34369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_PRECAPTURE_WAIT; 34469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 34569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 34669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardPrecaptureWait( 34769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 34869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 34969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 35069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 35169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mNewAEState) { 35269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mNewNotifySignal.waitRelative(mInputMutex, kWaitDuration); 35369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) { 35469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount--; 35569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 35669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 35769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 35869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mTimeoutCount <= 0) { 35969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Timed out waiting for precapture %s", 36069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAeInPrecapture ? "end" : "start"); 36169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE; 36269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 36369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mNewAEState) { 36469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mAeInPrecapture) { 36569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // Waiting to see PRECAPTURE state 36669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mAETriggerId == mTriggerId && 36769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAEState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 36869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Got precapture start", __FUNCTION__); 36969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAeInPrecapture = true; 37069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForPrecaptureEnd; 37169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 37269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 37369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // Waiting to see PRECAPTURE state end 37469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mAETriggerId == mTriggerId && 37569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAEState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 37669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Got precapture end", __FUNCTION__); 37769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE; 37869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 37969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 38069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewAEState = false; 38169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 38269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_PRECAPTURE_WAIT; 38369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 38469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 38569230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture( 38669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 38769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 38869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 38969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 39069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Vector<uint8_t> outputStreams; 39169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 39269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getPreviewStreamId()); 39369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getCaptureStreamId()); 39469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 39569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (l.mParameters.previewCallbackFlags & 39669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) { 39769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getCallbackStreamId()); 39869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 39969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 40069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) { 40169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getRecordingStreamId()); 40269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 40369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 40469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS, 40569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams); 40669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == OK) { 40769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_ID, 40869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &mCaptureId, 1); 40969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 41069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == OK) { 41169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.sort(); 41269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 41369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 41469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 41569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)", 41669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 41769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 41869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 41969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 42069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CameraMetadata captureCopy = mCaptureRequest; 42169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (captureCopy.entryCount() == 0) { 42269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 42369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId()); 42469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 42569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 42669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 42769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (l.mParameters.state == Parameters::STILL_CAPTURE) { 42869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = client->getCameraDevice()->clearStreamingRequest(); 42969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 43069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop preview for still capture: " 43169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "%s (%d)", 43269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 43369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 43469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 43569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 43669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // TODO: Capture should be atomic with setStreamingRequest here 43769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = client->getCameraDevice()->capture(captureCopy); 43869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 43969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to submit still image capture request: " 44069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "%s (%d)", 44169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 44269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 44369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 44469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 445bd3a81653a9bbdf7aa9394d99f2fc9b7dabf68dcEino-Ville Talvala if (l.mParameters.playShutterSound && 446bd3a81653a9bbdf7aa9394d99f2fc9b7dabf68dcEino-Ville Talvala l.mParameters.state == Parameters::STILL_CAPTURE) { 44733578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala client->getCameraService()->playSound(CameraService::SOUND_SHUTTER); 44833578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala } 44933578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala 45069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForCaptureEnd; 45169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 45269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 45369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 45469230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCaptureWait( 45569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 45669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 45769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 45869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 45969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mNewFrameReceived) { 46069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mNewFrameSignal.waitRelative(mInputMutex, kWaitDuration); 46169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) { 46269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount--; 46369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 46469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 46569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 46669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mNewCaptureReceived) { 46769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration); 46869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) { 46969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount--; 47069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 47169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 47269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 47369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mTimeoutCount <= 0) { 47469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Timed out waiting for capture to complete"); 47569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 47669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 47769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mNewFrameReceived && mNewCaptureReceived) { 47869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mNewFrameId != mCaptureId) { 47969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Mismatched capture frame IDs: Expected %d, got %d", 48069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureId, mNewFrameId); 48169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 48269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala camera_metadata_entry_t entry; 48369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala entry = mNewFrame.find(ANDROID_SENSOR_TIMESTAMP); 48469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (entry.count == 0) { 48569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("No timestamp field in capture frame!"); 48669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 48769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (entry.data.i64[0] != mCaptureTimestamp) { 48869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Mismatched capture timestamps: Metadata frame %lld," 48969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala " captured buffer %lld", entry.data.i64[0], mCaptureTimestamp); 49069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 49169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala client->removeFrameListener(mCaptureId); 49269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 49369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameReceived = false; 49469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureReceived = false; 49569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 49669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 49769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 49869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 49969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 500c3dbf1a40df85b75e5805382838a90416f69730fJames PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureStart( 501c3dbf1a40df85b75e5805382838a90416f69730fJames Painter sp<Camera2Client> &client) { 502c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 503c3dbf1a40df85b75e5805382838a90416f69730fJames Painter status_t res; 504c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ATRACE_CALL(); 505c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 506c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // check which burst mode is set, create respective burst object 507c3dbf1a40df85b75e5805382838a90416f69730fJames Painter { 508c3dbf1a40df85b75e5805382838a90416f69730fJames Painter SharedParameters::Lock l(client->getParameters()); 509c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 510c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = updateCaptureRequest(l.mParameters, client); 511c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if(res != OK) { 512c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 513c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 514c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 515c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // 516c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // check for burst mode type in mParameters here 517c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // 518c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mBurstCapture = new BurstCapture(client, this); 519c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 520c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 521c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mCaptureRequest.update(ANDROID_REQUEST_ID, &mCaptureId, 1); 522c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (res == OK) { 523c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mCaptureRequest.sort(); 524c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 525c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (res != OK) { 526c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)", 527c3dbf1a40df85b75e5805382838a90416f69730fJames Painter __FUNCTION__, client->getCameraId(), strerror(-res), res); 528c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 529c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 530c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 531c3dbf1a40df85b75e5805382838a90416f69730fJames Painter CameraMetadata captureCopy = mCaptureRequest; 532c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (captureCopy.entryCount() == 0) { 533c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 534c3dbf1a40df85b75e5805382838a90416f69730fJames Painter __FUNCTION__, client->getCameraId()); 535c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 536c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 537c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 538c3dbf1a40df85b75e5805382838a90416f69730fJames Painter Vector<CameraMetadata> requests; 539c3dbf1a40df85b75e5805382838a90416f69730fJames Painter requests.push(mCaptureRequest); 540c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mBurstCapture->start(requests, mCaptureId); 541c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mTimeoutCount = kMaxTimeoutsForCaptureEnd * 10; 542c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return BURST_CAPTURE_WAIT; 543c3dbf1a40df85b75e5805382838a90416f69730fJames Painter} 544c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 545c3dbf1a40df85b75e5805382838a90416f69730fJames PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureWait( 546c3dbf1a40df85b75e5805382838a90416f69730fJames Painter sp<Camera2Client> &client) { 547c3dbf1a40df85b75e5805382838a90416f69730fJames Painter status_t res; 548c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ATRACE_CALL(); 549c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 550c3dbf1a40df85b75e5805382838a90416f69730fJames Painter while (!mNewCaptureReceived) { 551c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration); 552c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (res == TIMED_OUT) { 553c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mTimeoutCount--; 554c3dbf1a40df85b75e5805382838a90416f69730fJames Painter break; 555c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 556c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 557c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 558c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (mTimeoutCount <= 0) { 559c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGW("Timed out waiting for burst capture to complete"); 560c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 561c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 562c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (mNewCaptureReceived) { 563c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mNewCaptureReceived = false; 564c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // TODO: update mCaptureId to last burst's capture ID + 1? 565c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 566c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 567c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 568c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return BURST_CAPTURE_WAIT; 569c3dbf1a40df85b75e5805382838a90416f69730fJames Painter} 570c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 57169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t CaptureSequencer::updateCaptureRequest(const Parameters ¶ms, 57269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 57369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 57469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 57569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mCaptureRequest.entryCount() == 0) { 57669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = client->getCameraDevice()->createDefaultRequest( 57769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CAMERA2_TEMPLATE_STILL_CAPTURE, 57869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &mCaptureRequest); 57969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 58069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default still image request:" 58169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala " %s (%d)", __FUNCTION__, client->getCameraId(), 58269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala strerror(-res), res); 58369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 58469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 58569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 58669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 58769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = params.updateRequest(&mCaptureRequest); 58869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 58969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of capture " 59069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "request: %s (%d)", __FUNCTION__, client->getCameraId(), 59169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala strerror(-res), res); 59269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 59369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 59469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 59569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_SIZE, 59669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala params.jpegThumbSize, 2); 59769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 59869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_QUALITY, 59969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ¶ms.jpegThumbQuality, 1); 60069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 60169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_JPEG_QUALITY, 60269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ¶ms.jpegQuality, 1); 60369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 60469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update( 60569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ANDROID_JPEG_ORIENTATION, 60669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ¶ms.jpegRotation, 1); 60769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 60869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 60969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (params.gpsEnabled) { 61069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update( 61169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES, 61269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala params.gpsCoordinates, 3); 61369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 61469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update( 61569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP, 61669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ¶ms.gpsTimestamp, 1); 61769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 61869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update( 61969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD, 62069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala params.gpsProcessingMethod); 62169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 62269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 62369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.erase(ANDROID_JPEG_GPS_COORDINATES); 62469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 62569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.erase(ANDROID_JPEG_GPS_TIMESTAMP); 62669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 62769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.erase(ANDROID_JPEG_GPS_PROCESSING_METHOD); 62869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 62969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 63069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 63169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 63269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 63369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 63469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 63569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace camera2 63669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace android 637