1da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/* 2da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 3da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * 4da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 5da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * you may not use this file except in compliance with the License. 6da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * You may obtain a copy of the License at 7da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * 8da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 9da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * 10da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 11da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 12da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * See the License for the specific language governing permissions and 14da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * limitations under the License. 15da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */ 16da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 174bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala#define LOG_TAG "Camera2-CaptureSequencer" 18da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA 19da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala//#define LOG_NDEBUG 0 20da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 21da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Log.h> 22da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Trace.h> 23da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Vector.h> 24da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 25da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "CaptureSequencer.h" 26e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter#include "BurstCapture.h" 27da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "../Camera2Device.h" 28da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "../Camera2Client.h" 29da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "Parameters.h" 30da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 31da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace android { 32da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace camera2 { 33da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 34da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/** Public members */ 35da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 36da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureSequencer(wp<Camera2Client> client): 37da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Thread(false), 38da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mStartCapture(false), 39da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mBusy(false), 40da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewAEState(false), 41da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewFrameReceived(false), 42da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewCaptureReceived(false), 431e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala mShutterNotified(false), 44da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mClient(client), 45da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureState(IDLE), 46da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTriggerId(0), 47da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount(0), 484865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala mCaptureId(Camera2Client::kCaptureRequestIdStart) { 49e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGV("%s", __FUNCTION__); 50da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 51da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 52da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::~CaptureSequencer() { 53da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGV("%s: Exit", __FUNCTION__); 54da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 55da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 56da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::setZslProcessor(wp<ZslProcessor> processor) { 57da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 58da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslProcessor = processor; 59da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 60da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 61da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t CaptureSequencer::startCapture() { 62e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGV("%s", __FUNCTION__); 63da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 64da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 65da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mBusy) { 66da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Already busy capturing!", __FUNCTION__); 67da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return INVALID_OPERATION; 68da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 69da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (!mStartCapture) { 70da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mStartCapture = true; 71da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mStartCaptureSignal.signal(); 72da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 73da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 74da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 76d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvalastatus_t CaptureSequencer::waitUntilIdle(nsecs_t timeout) { 77d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala ATRACE_CALL(); 78d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala ALOGV("%s: Waiting for idle", __FUNCTION__); 79d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala Mutex::Autolock l(mStateMutex); 80d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala status_t res = -1; 81d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala while (mCaptureState != IDLE) { 82d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala nsecs_t startTime = systemTime(); 83d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala 84d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala res = mStateChanged.waitRelative(mStateMutex, timeout); 85d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala if (res != OK) return res; 86d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala 87d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala timeout -= (systemTime() - startTime); 88d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala } 89d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala ALOGV("%s: Now idle", __FUNCTION__); 90d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala return OK; 91d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala} 92d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala 93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::notifyAutoExposure(uint8_t newState, int triggerId) { 94da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 95da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mAEState = newState; 97da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mAETriggerId = triggerId; 98da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (!mNewAEState) { 99da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewAEState = true; 100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewNotifySignal.signal(); 101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::onFrameAvailable(int32_t frameId, 1054865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala const CameraMetadata &frame) { 106e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGV("%s: Listener found new frame", __FUNCTION__); 107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewFrameId = frameId; 1104865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala mNewFrame = frame; 111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (!mNewFrameReceived) { 112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewFrameReceived = true; 113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewFrameSignal.signal(); 114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 117fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvalavoid CaptureSequencer::onCaptureAvailable(nsecs_t timestamp, 118fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala sp<MemoryBase> captureBuffer) { 119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 120e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGV("%s", __FUNCTION__); 121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureTimestamp = timestamp; 123fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala mCaptureBuffer = captureBuffer; 124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (!mNewCaptureReceived) { 125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewCaptureReceived = true; 126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewCaptureSignal.signal(); 127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::dump(int fd, const Vector<String16>& args) { 132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala String8 result; 133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mCaptureRequest.entryCount() != 0) { 134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala result = " Capture request:\n"; 135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala write(fd, result.string(), result.size()); 136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureRequest.dump(fd, 2, 6); 137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala result = " Capture request: undefined\n"; 139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala write(fd, result.string(), result.size()); 140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala result = String8::format(" Current capture state: %s\n", 142da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala kStateNames[mCaptureState]); 143da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala result.append(" Latest captured frame:\n"); 144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala write(fd, result.string(), result.size()); 145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewFrame.dump(fd, 2, 6); 146da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 147da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 148da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/** Private members */ 149da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 150da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaconst char* CaptureSequencer::kStateNames[CaptureSequencer::NUM_CAPTURE_STATES+1] = 151da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala{ 152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "IDLE", 153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "START", 154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "ZSL_START", 155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "ZSL_WAITING", 156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "ZSL_REPROCESSING", 157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "STANDARD_START", 158d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala "STANDARD_PRECAPTURE_WAIT", 159d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala "STANDARD_CAPTURE", 160d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala "STANDARD_CAPTURE_WAIT", 161e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter "BURST_CAPTURE_START", 162e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter "BURST_CAPTURE_WAIT", 163da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "DONE", 164da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "ERROR", 165da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "UNKNOWN" 166da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; 167da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 168da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaconst CaptureSequencer::StateManager 169da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = { 170da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageIdle, 171da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageStart, 172da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageZslStart, 173da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageZslWaiting, 174da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageZslReprocessing, 175da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageStandardStart, 176da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageStandardPrecaptureWait, 177da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageStandardCapture, 178da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageStandardCaptureWait, 179e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter &CaptureSequencer::manageBurstCaptureStart, 180e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter &CaptureSequencer::manageBurstCaptureWait, 181da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageDone, 182da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; 183da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 184da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalabool CaptureSequencer::threadLoop() { 185da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 186da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 187da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 188da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (client == 0) return false; 189da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 190d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala CaptureState currentState; 191d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala { 192d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala Mutex::Autolock l(mStateMutex); 193d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala currentState = mCaptureState; 194d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala } 195d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala 196d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala currentState = (this->*kStateManagers[currentState])(client); 197d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala 198d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala Mutex::Autolock l(mStateMutex); 199d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala if (currentState != mCaptureState) { 200d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala mCaptureState = currentState; 201d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala ATRACE_INT("cam2_capt_state", mCaptureState); 202d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala ALOGV("Camera %d: New capture state %s", 203d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala client->getCameraId(), kStateNames[mCaptureState]); 204d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala mStateChanged.signal(); 205d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala } 206d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala 207d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala if (mCaptureState == ERROR) { 208d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala ALOGE("Camera %d: Stopping capture sequencer due to error", 209d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala client->getCameraId()); 210da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return false; 211da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 212da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 213da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return true; 214da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 215da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 216da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageIdle(sp<Camera2Client> &client) { 217da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 218da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 219da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala while (!mStartCapture) { 220da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mStartCaptureSignal.waitRelative(mInputMutex, 221da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala kWaitDuration); 222da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == TIMED_OUT) break; 223da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 224da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mStartCapture) { 225da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mStartCapture = false; 226da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mBusy = true; 227da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return START; 228da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 229da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return IDLE; 230da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 231da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 232da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageDone(sp<Camera2Client> &client) { 233fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala status_t res = OK; 234da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 235da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureId++; 2364865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala if (mCaptureId >= Camera2Client::kCaptureRequestIdEnd) { 2374865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala mCaptureId = Camera2Client::kCaptureRequestIdStart; 2384865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala } 239da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala { 240da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 241da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mBusy = false; 242da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 243da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 244fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala { 245fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 246fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala switch (l.mParameters.state) { 247d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala case Parameters::DISCONNECTED: 248d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala ALOGW("%s: Camera %d: Discarding image data during shutdown ", 249d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala __FUNCTION__, client->getCameraId()); 250d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala res = INVALID_OPERATION; 251d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala break; 252fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala case Parameters::STILL_CAPTURE: 253fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala l.mParameters.state = Parameters::STOPPED; 254fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala break; 255fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 256fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala l.mParameters.state = Parameters::RECORD; 257fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala break; 258fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala default: 259fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala ALOGE("%s: Camera %d: Still image produced unexpectedly " 260fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala "in state %s!", 261fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala __FUNCTION__, client->getCameraId(), 262fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 263fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala res = INVALID_OPERATION; 264fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala } 265fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala } 266768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala sp<ZslProcessor> processor = mZslProcessor.promote(); 267768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala if (processor != 0) { 268768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala processor->clearZslQueue(); 269768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala } 270768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala 271fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala if (mCaptureBuffer != 0 && res == OK) { 272fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala Camera2Client::SharedCameraClient::Lock l(client->mSharedCameraClient); 273fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala ALOGV("%s: Sending still image to client", __FUNCTION__); 274fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala if (l.mCameraClient != 0) { 275fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala l.mCameraClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, 276fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala mCaptureBuffer, NULL); 277fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala } else { 278fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala ALOGV("%s: No client!", __FUNCTION__); 279fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala } 280da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 281fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala mCaptureBuffer.clear(); 282da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 283da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return IDLE; 284da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 285da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 286da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStart( 287da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 288e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGV("%s", __FUNCTION__); 289da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 290da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 291da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 292da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState nextState = DONE; 293da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 294da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = updateCaptureRequest(l.mParameters, client); 295da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK ) { 296da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Can't update still image capture request: %s (%d)", 297da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 298da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 299da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 300da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 301e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if(l.mParameters.lightFx != Parameters::LIGHTFX_NONE && 302e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter l.mParameters.state == Parameters::STILL_CAPTURE) { 303e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter nextState = BURST_CAPTURE_START; 304e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 305e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter else if (l.mParameters.zslMode && 3066b367f2a2bddfed60d63fa4da5e19ca13352a454Eino-Ville Talvala l.mParameters.state == Parameters::STILL_CAPTURE && 3076b367f2a2bddfed60d63fa4da5e19ca13352a454Eino-Ville Talvala l.mParameters.flashMode != Parameters::FLASH_MODE_ON) { 308da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala nextState = ZSL_START; 309da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 310da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala nextState = STANDARD_START; 311da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 3121e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala mShutterNotified = false; 313da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 314da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return nextState; 315da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 316da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 317da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslStart( 318da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 319bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGV("%s", __FUNCTION__); 320da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 321da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<ZslProcessor> processor = mZslProcessor.promote(); 322da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (processor == 0) { 323da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: No ZSL queue to use!", __FUNCTION__); 324da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 325da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 326da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 3274865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala client->registerFrameListener(mCaptureId, mCaptureId + 1, 328da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala this); 329da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 330da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // TODO: Actually select the right thing here. 331bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala res = processor->pushToReprocess(mCaptureId); 332bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala if (res != OK) { 33397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (res == NOT_ENOUGH_DATA) { 33497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGV("%s: Camera %d: ZSL queue doesn't have good frame, " 33597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala "falling back to normal capture", __FUNCTION__, 33697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala client->getCameraId()); 33797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } else { 33897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGE("%s: Camera %d: Error in ZSL queue: %s (%d)", 33997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 34097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 341bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala return STANDARD_START; 342bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } 343da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 344da1c5c15c2483cd41035e1a492c5963ac86bbcf5Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 3451b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin /* warning: this also locks a SharedCameraClient */ 3461b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin shutterNotifyLocked(l.mParameters, client); 3471e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala mShutterNotified = true; 348da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForCaptureEnd; 349da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 350da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 351da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 352da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslWaiting( 353da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 354bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGV("%s", __FUNCTION__); 355da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 356da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 357da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 358da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslReprocessing( 359da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 360bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGV("%s", __FUNCTION__); 361da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return START; 362da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 363da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 364da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardStart( 365da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 366da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 3674865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala client->registerFrameListener(mCaptureId, mCaptureId + 1, 368da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala this); 369da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala { 370da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 371da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTriggerId = l.mParameters.precaptureTriggerCounter++; 372da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 373da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->getCameraDevice()->triggerPrecaptureMetering(mTriggerId); 374da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 375da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mAeInPrecapture = false; 376da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForPrecaptureStart; 377da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return STANDARD_PRECAPTURE_WAIT; 378da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 379da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 380da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardPrecaptureWait( 381da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 382da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 383da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 384da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 385da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala while (!mNewAEState) { 386da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mNewNotifySignal.waitRelative(mInputMutex, kWaitDuration); 387da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == TIMED_OUT) { 388da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount--; 389da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 390da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 391da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 392da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mTimeoutCount <= 0) { 393da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGW("Timed out waiting for precapture %s", 394da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mAeInPrecapture ? "end" : "start"); 395da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return STANDARD_CAPTURE; 396da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 397da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mNewAEState) { 398da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (!mAeInPrecapture) { 399da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Waiting to see PRECAPTURE state 400da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mAETriggerId == mTriggerId && 401da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mAEState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 402da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGV("%s: Got precapture start", __FUNCTION__); 403da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mAeInPrecapture = true; 404da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForPrecaptureEnd; 405da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 406da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 407da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Waiting to see PRECAPTURE state end 408da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mAETriggerId == mTriggerId && 409da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mAEState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 410da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGV("%s: Got precapture end", __FUNCTION__); 411da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return STANDARD_CAPTURE; 412da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 413da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 414da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewAEState = false; 415da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 416da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return STANDARD_PRECAPTURE_WAIT; 417da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 418da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 419da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture( 420da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 421da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 422da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 423da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 424da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Vector<uint8_t> outputStreams; 425da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 426da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala outputStreams.push(client->getPreviewStreamId()); 427da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala outputStreams.push(client->getCaptureStreamId()); 428da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 429da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (l.mParameters.previewCallbackFlags & 430da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) { 431da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala outputStreams.push(client->getCallbackStreamId()); 432da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 433da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 434da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) { 435da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala outputStreams.push(client->getRecordingStreamId()); 436da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 437da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 438da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS, 439da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala outputStreams); 440da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == OK) { 441da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_ID, 442da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &mCaptureId, 1); 443da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 444da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == OK) { 445da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.sort(); 446da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 447da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 448da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 449da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)", 450da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 451da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 452da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 453da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 454da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CameraMetadata captureCopy = mCaptureRequest; 455da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (captureCopy.entryCount() == 0) { 456da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 457da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, client->getCameraId()); 458da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 459da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 460da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 461da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (l.mParameters.state == Parameters::STILL_CAPTURE) { 4624865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala res = client->stopStream(); 463da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 464da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop preview for still capture: " 465da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", 466da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 467da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 468da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 469da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 470da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // TODO: Capture should be atomic with setStreamingRequest here 471da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = client->getCameraDevice()->capture(captureCopy); 472da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 473da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to submit still image capture request: " 474da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", 475da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 476da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 477da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 478da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 479da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForCaptureEnd; 480da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 481da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 482da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 483da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCaptureWait( 484da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 485da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 486da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 487da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 488da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala while (!mNewFrameReceived) { 489da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mNewFrameSignal.waitRelative(mInputMutex, kWaitDuration); 490da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == TIMED_OUT) { 491da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount--; 492da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 493da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 494da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 4951e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala if (mNewFrameReceived && !mShutterNotified) { 4961e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 4971e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala /* warning: this also locks a SharedCameraClient */ 4981e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala shutterNotifyLocked(l.mParameters, client); 4991e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala mShutterNotified = true; 5001e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala } 5011e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala while (mNewFrameReceived && !mNewCaptureReceived) { 502da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration); 503da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == TIMED_OUT) { 504da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount--; 505da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 506da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 507da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 508da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mTimeoutCount <= 0) { 509da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGW("Timed out waiting for capture to complete"); 510da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 511da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 512da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mNewFrameReceived && mNewCaptureReceived) { 513da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mNewFrameId != mCaptureId) { 514da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGW("Mismatched capture frame IDs: Expected %d, got %d", 515da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureId, mNewFrameId); 516da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 517da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala camera_metadata_entry_t entry; 518da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala entry = mNewFrame.find(ANDROID_SENSOR_TIMESTAMP); 519da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (entry.count == 0) { 520da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("No timestamp field in capture frame!"); 521da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 522da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (entry.data.i64[0] != mCaptureTimestamp) { 523da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGW("Mismatched capture timestamps: Metadata frame %lld," 524da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala " captured buffer %lld", entry.data.i64[0], mCaptureTimestamp); 525da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 5264865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala client->removeFrameListener(mCaptureId, mCaptureId + 1, this); 527da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 528da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewFrameReceived = false; 529da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewCaptureReceived = false; 530da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 531da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 532da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 533da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 534da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 535e538206d15282afbc5b168d60b1026a5dfcd13c0James PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureStart( 536e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter sp<Camera2Client> &client) { 537e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGV("%s", __FUNCTION__); 538e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter status_t res; 539e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ATRACE_CALL(); 540e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 541e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter // check which burst mode is set, create respective burst object 542e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter { 543e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter SharedParameters::Lock l(client->getParameters()); 544e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 545e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter res = updateCaptureRequest(l.mParameters, client); 546e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if(res != OK) { 547e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return DONE; 548e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 549e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 550e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter // 551e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter // check for burst mode type in mParameters here 552e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter // 553e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter mBurstCapture = new BurstCapture(client, this); 554e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 555e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 556e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter res = mCaptureRequest.update(ANDROID_REQUEST_ID, &mCaptureId, 1); 557e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if (res == OK) { 558e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter res = mCaptureRequest.sort(); 559e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 560e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if (res != OK) { 561e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)", 562e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter __FUNCTION__, client->getCameraId(), strerror(-res), res); 563e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return DONE; 564e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 565e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 566e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter CameraMetadata captureCopy = mCaptureRequest; 567e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if (captureCopy.entryCount() == 0) { 568e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 569e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter __FUNCTION__, client->getCameraId()); 570e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return DONE; 571e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 572e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 573e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter Vector<CameraMetadata> requests; 574e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter requests.push(mCaptureRequest); 575e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter res = mBurstCapture->start(requests, mCaptureId); 576e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter mTimeoutCount = kMaxTimeoutsForCaptureEnd * 10; 577e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return BURST_CAPTURE_WAIT; 578e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter} 579e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 580e538206d15282afbc5b168d60b1026a5dfcd13c0James PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureWait( 581e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter sp<Camera2Client> &client) { 582e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter status_t res; 583e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ATRACE_CALL(); 584e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 585e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter while (!mNewCaptureReceived) { 586e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration); 587e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if (res == TIMED_OUT) { 588e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter mTimeoutCount--; 589e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter break; 590e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 591e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 592e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 593e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if (mTimeoutCount <= 0) { 594e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGW("Timed out waiting for burst capture to complete"); 595e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return DONE; 596e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 597e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if (mNewCaptureReceived) { 598e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter mNewCaptureReceived = false; 599e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter // TODO: update mCaptureId to last burst's capture ID + 1? 600e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return DONE; 601e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 602e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 603e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return BURST_CAPTURE_WAIT; 604e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter} 605e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 606da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t CaptureSequencer::updateCaptureRequest(const Parameters ¶ms, 607da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 608da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 609da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 610da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mCaptureRequest.entryCount() == 0) { 611da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = client->getCameraDevice()->createDefaultRequest( 612da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CAMERA2_TEMPLATE_STILL_CAPTURE, 613da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &mCaptureRequest); 614da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 615da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default still image request:" 616da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala " %s (%d)", __FUNCTION__, client->getCameraId(), 617da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala strerror(-res), res); 618da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 619da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 620da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 621da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 622da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = params.updateRequest(&mCaptureRequest); 623da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 624da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of capture " 625da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "request: %s (%d)", __FUNCTION__, client->getCameraId(), 626da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala strerror(-res), res); 627da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 628da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 629da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 630ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = params.updateRequestJpeg(&mCaptureRequest); 631ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) { 632ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ALOGE("%s: Camera %d: Unable to update JPEG entries of capture " 633ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala "request: %s (%d)", __FUNCTION__, client->getCameraId(), 634ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala strerror(-res), res); 635ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala return res; 636da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 637da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 638da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 639da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 640da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 6411b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin/*static*/ void CaptureSequencer::shutterNotifyLocked(const Parameters ¶ms, 6421b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin sp<Camera2Client> client) { 6431b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin ATRACE_CALL(); 6441b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin 6451b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin if (params.state == Parameters::STILL_CAPTURE && params.playShutterSound) { 6461b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin client->getCameraService()->playSound(CameraService::SOUND_SHUTTER); 6471b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin } 6481b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin 6491b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin { 6501b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin Camera2Client::SharedCameraClient::Lock l(client->mSharedCameraClient); 6511b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin 6521b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin ALOGV("%s: Notifying of shutter close to client", __FUNCTION__); 6531b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin if (l.mCameraClient != 0) { 6541b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin // ShutterCallback 6551b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin l.mCameraClient->notifyCallback(CAMERA_MSG_SHUTTER, 6561b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin /*ext1*/0, /*ext2*/0); 6571b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin 6581b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin // RawCallback with null buffer 6591b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin l.mCameraClient->notifyCallback(CAMERA_MSG_RAW_IMAGE_NOTIFY, 6601b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin /*ext1*/0, /*ext2*/0); 6611b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin } else { 6621b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin ALOGV("%s: No client!", __FUNCTION__); 6631b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin } 6641b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin } 6651b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin} 6661b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin 667da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 668da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace camera2 669da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace android 670