CaptureSequencer.cpp revision 6b367f2a2bddfed60d63fa4da5e19ca13352a454
1da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/* 2da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 3da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * 4da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 5da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * you may not use this file except in compliance with the License. 6da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * You may obtain a copy of the License at 7da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * 8da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 9da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * 10da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 11da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 12da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * See the License for the specific language governing permissions and 14da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * limitations under the License. 15da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */ 16da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 17da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#define LOG_TAG "Camera2Client::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), 43da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mClient(client), 44da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureState(IDLE), 45da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTriggerId(0), 46da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount(0), 47da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureId(Camera2Client::kFirstCaptureRequestId) { 48e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGV("%s", __FUNCTION__); 49da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 50da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 51da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::~CaptureSequencer() { 52da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGV("%s: Exit", __FUNCTION__); 53da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 54da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 55da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::setZslProcessor(wp<ZslProcessor> processor) { 56da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 57da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslProcessor = processor; 58da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 59da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 60da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t CaptureSequencer::startCapture() { 61e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGV("%s", __FUNCTION__); 62da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 63da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 64da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mBusy) { 65da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Already busy capturing!", __FUNCTION__); 66da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return INVALID_OPERATION; 67da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 68da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (!mStartCapture) { 69da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mStartCapture = true; 70da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mStartCaptureSignal.signal(); 71da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 72da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 73da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 74da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::notifyAutoExposure(uint8_t newState, int triggerId) { 76da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 77da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 78da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mAEState = newState; 79da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mAETriggerId = triggerId; 80da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (!mNewAEState) { 81da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewAEState = true; 82da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewNotifySignal.signal(); 83da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 84da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 85da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 86da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::onFrameAvailable(int32_t frameId, 87da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CameraMetadata &frame) { 88e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGV("%s: Listener found new frame", __FUNCTION__); 89da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 90da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 91da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewFrameId = frameId; 92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewFrame.acquire(frame); 93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (!mNewFrameReceived) { 94da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewFrameReceived = true; 95da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewFrameSignal.signal(); 96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 97da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 98da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 99fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvalavoid CaptureSequencer::onCaptureAvailable(nsecs_t timestamp, 100fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala sp<MemoryBase> captureBuffer) { 101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 102e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGV("%s", __FUNCTION__); 103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureTimestamp = timestamp; 105fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala mCaptureBuffer = captureBuffer; 106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (!mNewCaptureReceived) { 107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewCaptureReceived = true; 108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewCaptureSignal.signal(); 109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::dump(int fd, const Vector<String16>& args) { 114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala String8 result; 115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mCaptureRequest.entryCount() != 0) { 116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala result = " Capture request:\n"; 117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala write(fd, result.string(), result.size()); 118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureRequest.dump(fd, 2, 6); 119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 120da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala result = " Capture request: undefined\n"; 121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala write(fd, result.string(), result.size()); 122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala result = String8::format(" Current capture state: %s\n", 124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala kStateNames[mCaptureState]); 125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala result.append(" Latest captured frame:\n"); 126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala write(fd, result.string(), result.size()); 127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewFrame.dump(fd, 2, 6); 128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/** Private members */ 131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaconst char* CaptureSequencer::kStateNames[CaptureSequencer::NUM_CAPTURE_STATES+1] = 133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala{ 134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "IDLE", 135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "START", 136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "ZSL_START", 137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "ZSL_WAITING", 138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "ZSL_REPROCESSING", 139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "STANDARD_START", 140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "STANDARD_PRECAPTURE", 141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "STANDARD_CAPTURING", 142e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter "BURST_CAPTURE_START", 143e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter "BURST_CAPTURE_WAIT", 144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "DONE", 145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "ERROR", 146da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "UNKNOWN" 147da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; 148da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 149da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaconst CaptureSequencer::StateManager 150da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = { 151da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageIdle, 152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageStart, 153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageZslStart, 154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageZslWaiting, 155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageZslReprocessing, 156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageStandardStart, 157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageStandardPrecaptureWait, 158da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageStandardCapture, 159da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageStandardCaptureWait, 160e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter &CaptureSequencer::manageBurstCaptureStart, 161e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter &CaptureSequencer::manageBurstCaptureWait, 162da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &CaptureSequencer::manageDone, 163da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; 164da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 165da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalabool CaptureSequencer::threadLoop() { 166da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 167da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 168da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 169da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (client == 0) return false; 170da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 171da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mCaptureState < ERROR) { 172da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureState = (this->*kStateManagers[mCaptureState])(client); 173da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 174da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Bad capture state: %s", 175da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, kStateNames[mCaptureState]); 176da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return false; 177da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 178da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 179da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return true; 180da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 181da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 182da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageIdle(sp<Camera2Client> &client) { 183da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 184da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 185da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 186da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala while (!mStartCapture) { 187da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mStartCaptureSignal.waitRelative(mInputMutex, 188da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala kWaitDuration); 189da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == TIMED_OUT) break; 190da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 191da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mStartCapture) { 192da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mStartCapture = false; 193da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mBusy = true; 194da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return START; 195da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 196da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return IDLE; 197da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 198da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 199da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageDone(sp<Camera2Client> &client) { 200fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala status_t res = OK; 201da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 202da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureId++; 203da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 204da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala { 205da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 206da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mBusy = false; 207da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 208da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 209fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala { 210fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 211fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala switch (l.mParameters.state) { 212fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala case Parameters::STILL_CAPTURE: 213fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala l.mParameters.state = Parameters::STOPPED; 214fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala break; 215fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 216fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala l.mParameters.state = Parameters::RECORD; 217fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala break; 218fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala default: 219fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala ALOGE("%s: Camera %d: Still image produced unexpectedly " 220fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala "in state %s!", 221fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala __FUNCTION__, client->getCameraId(), 222fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 223fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala res = INVALID_OPERATION; 224fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala } 225fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala } 226768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala sp<ZslProcessor> processor = mZslProcessor.promote(); 227768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala if (processor != 0) { 228768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala processor->clearZslQueue(); 229768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala } 230768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala 231fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala if (mCaptureBuffer != 0 && res == OK) { 232fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala Camera2Client::SharedCameraClient::Lock l(client->mSharedCameraClient); 233fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala ALOGV("%s: Sending still image to client", __FUNCTION__); 234fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala if (l.mCameraClient != 0) { 235fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala l.mCameraClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, 236fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala mCaptureBuffer, NULL); 237fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala } else { 238fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala ALOGV("%s: No client!", __FUNCTION__); 239fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala } 240da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 241fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala mCaptureBuffer.clear(); 242da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 243da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return IDLE; 244da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 245da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 246da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStart( 247da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 248e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGV("%s", __FUNCTION__); 249da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 250da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 251da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 252da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CaptureState nextState = DONE; 253da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 254da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = updateCaptureRequest(l.mParameters, client); 255da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK ) { 256da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Can't update still image capture request: %s (%d)", 257da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 258da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 259da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 260da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 261e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if(l.mParameters.lightFx != Parameters::LIGHTFX_NONE && 262e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter l.mParameters.state == Parameters::STILL_CAPTURE) { 263e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter nextState = BURST_CAPTURE_START; 264e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 265e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter else if (l.mParameters.zslMode && 2666b367f2a2bddfed60d63fa4da5e19ca13352a454Eino-Ville Talvala l.mParameters.state == Parameters::STILL_CAPTURE && 2676b367f2a2bddfed60d63fa4da5e19ca13352a454Eino-Ville Talvala l.mParameters.flashMode != Parameters::FLASH_MODE_ON) { 268da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala nextState = ZSL_START; 269da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 270da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala nextState = STANDARD_START; 271da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 272da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 273da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return nextState; 274da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 275da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 276da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslStart( 277da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 278bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGV("%s", __FUNCTION__); 279da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 280da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<ZslProcessor> processor = mZslProcessor.promote(); 281da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (processor == 0) { 282da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: No ZSL queue to use!", __FUNCTION__); 283da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 284da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 285da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 286da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->registerFrameListener(mCaptureId, 287da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala this); 288da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 289da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = client->getCameraDevice()->clearStreamingRequest(); 290da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 291da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop preview for ZSL capture: " 292da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", 293da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 294da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 295da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 296da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // TODO: Actually select the right thing here. 297bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala res = processor->pushToReprocess(mCaptureId); 298bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala if (res != OK) { 29997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (res == NOT_ENOUGH_DATA) { 30097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGV("%s: Camera %d: ZSL queue doesn't have good frame, " 30197b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala "falling back to normal capture", __FUNCTION__, 30297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala client->getCameraId()); 30397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } else { 30497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGE("%s: Camera %d: Error in ZSL queue: %s (%d)", 30597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 30697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 307bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala return STANDARD_START; 308bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } 309da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 310da1c5c15c2483cd41035e1a492c5963ac86bbcf5Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 311da1c5c15c2483cd41035e1a492c5963ac86bbcf5Eino-Ville Talvala if (l.mParameters.playShutterSound) { 312da1c5c15c2483cd41035e1a492c5963ac86bbcf5Eino-Ville Talvala client->getCameraService()->playSound(CameraService::SOUND_SHUTTER); 313da1c5c15c2483cd41035e1a492c5963ac86bbcf5Eino-Ville Talvala } 314da1c5c15c2483cd41035e1a492c5963ac86bbcf5Eino-Ville Talvala 315da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForCaptureEnd; 316da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 317da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 318da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 319da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslWaiting( 320da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 321bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGV("%s", __FUNCTION__); 322da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 323da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 324da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 325da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslReprocessing( 326da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 327bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGV("%s", __FUNCTION__); 328da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return START; 329da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 330da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 331da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardStart( 332da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 333da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 334da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->registerFrameListener(mCaptureId, 335da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala this); 336da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala { 337da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 338da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTriggerId = l.mParameters.precaptureTriggerCounter++; 339da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 340da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->getCameraDevice()->triggerPrecaptureMetering(mTriggerId); 341da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 342da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mAeInPrecapture = false; 343da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForPrecaptureStart; 344da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return STANDARD_PRECAPTURE_WAIT; 345da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 346da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 347da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardPrecaptureWait( 348da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 349da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 350da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 351da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 352da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala while (!mNewAEState) { 353da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mNewNotifySignal.waitRelative(mInputMutex, kWaitDuration); 354da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == TIMED_OUT) { 355da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount--; 356da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 357da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 358da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 359da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mTimeoutCount <= 0) { 360da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGW("Timed out waiting for precapture %s", 361da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mAeInPrecapture ? "end" : "start"); 362da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return STANDARD_CAPTURE; 363da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 364da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mNewAEState) { 365da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (!mAeInPrecapture) { 366da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Waiting to see PRECAPTURE state 367da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mAETriggerId == mTriggerId && 368da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mAEState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 369da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGV("%s: Got precapture start", __FUNCTION__); 370da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mAeInPrecapture = true; 371da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForPrecaptureEnd; 372da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 373da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 374da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Waiting to see PRECAPTURE state end 375da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mAETriggerId == mTriggerId && 376da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mAEState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 377da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGV("%s: Got precapture end", __FUNCTION__); 378da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return STANDARD_CAPTURE; 379da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 380da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 381da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewAEState = false; 382da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 383da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return STANDARD_PRECAPTURE_WAIT; 384da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 385da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 386da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture( 387da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 388da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 389da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 390da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 391da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Vector<uint8_t> outputStreams; 392da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 393da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala outputStreams.push(client->getPreviewStreamId()); 394da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala outputStreams.push(client->getCaptureStreamId()); 395da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 396da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (l.mParameters.previewCallbackFlags & 397da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) { 398da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala outputStreams.push(client->getCallbackStreamId()); 399da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 400da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 401da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) { 402da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala outputStreams.push(client->getRecordingStreamId()); 403da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 404da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 405da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS, 406da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala outputStreams); 407da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == OK) { 408da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_ID, 409da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &mCaptureId, 1); 410da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 411da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == OK) { 412da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.sort(); 413da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 414da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 415da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 416da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)", 417da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 418da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 419da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 420da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 421da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CameraMetadata captureCopy = mCaptureRequest; 422da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (captureCopy.entryCount() == 0) { 423da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 424da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, client->getCameraId()); 425da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 426da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 427da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 428da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (l.mParameters.state == Parameters::STILL_CAPTURE) { 429da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = client->getCameraDevice()->clearStreamingRequest(); 430da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 431da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop preview for still capture: " 432da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", 433da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 434da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 435da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 436da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 437da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // TODO: Capture should be atomic with setStreamingRequest here 438da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = client->getCameraDevice()->capture(captureCopy); 439da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 440da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to submit still image capture request: " 441da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", 442da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 443da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 444da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 445da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 446efb039e07c688c21122c938b008457bd4f555898Eino-Ville Talvala if (l.mParameters.playShutterSound && 447efb039e07c688c21122c938b008457bd4f555898Eino-Ville Talvala l.mParameters.state == Parameters::STILL_CAPTURE) { 448609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala client->getCameraService()->playSound(CameraService::SOUND_SHUTTER); 449609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala } 450609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala 451da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForCaptureEnd; 452da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 453da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 454da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 455da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCaptureWait( 456da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 457da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 458da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 459da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 460da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala while (!mNewFrameReceived) { 461da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mNewFrameSignal.waitRelative(mInputMutex, kWaitDuration); 462da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == TIMED_OUT) { 463da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount--; 464da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 465da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 466da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 467da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala while (!mNewCaptureReceived) { 468da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration); 469da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == TIMED_OUT) { 470da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mTimeoutCount--; 471da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 472da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 473da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 474da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mTimeoutCount <= 0) { 475da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGW("Timed out waiting for capture to complete"); 476da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 477da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 478da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mNewFrameReceived && mNewCaptureReceived) { 479da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mNewFrameId != mCaptureId) { 480da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGW("Mismatched capture frame IDs: Expected %d, got %d", 481da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mCaptureId, mNewFrameId); 482da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 483da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala camera_metadata_entry_t entry; 484da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala entry = mNewFrame.find(ANDROID_SENSOR_TIMESTAMP); 485da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (entry.count == 0) { 486da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("No timestamp field in capture frame!"); 487da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 488da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (entry.data.i64[0] != mCaptureTimestamp) { 489da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGW("Mismatched capture timestamps: Metadata frame %lld," 490da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala " captured buffer %lld", entry.data.i64[0], mCaptureTimestamp); 491da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 492da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->removeFrameListener(mCaptureId); 493da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 494da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewFrameReceived = false; 495da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mNewCaptureReceived = false; 496da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return DONE; 497da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 498da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 499da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 500da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 501e538206d15282afbc5b168d60b1026a5dfcd13c0James PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureStart( 502e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter sp<Camera2Client> &client) { 503e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGV("%s", __FUNCTION__); 504e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter status_t res; 505e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ATRACE_CALL(); 506e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 507e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter // check which burst mode is set, create respective burst object 508e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter { 509e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter SharedParameters::Lock l(client->getParameters()); 510e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 511e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter res = updateCaptureRequest(l.mParameters, client); 512e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if(res != OK) { 513e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return DONE; 514e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 515e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 516e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter // 517e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter // check for burst mode type in mParameters here 518e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter // 519e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter mBurstCapture = new BurstCapture(client, this); 520e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 521e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 522e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter res = mCaptureRequest.update(ANDROID_REQUEST_ID, &mCaptureId, 1); 523e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if (res == OK) { 524e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter res = mCaptureRequest.sort(); 525e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 526e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if (res != OK) { 527e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)", 528e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter __FUNCTION__, client->getCameraId(), strerror(-res), res); 529e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return DONE; 530e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 531e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 532e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter CameraMetadata captureCopy = mCaptureRequest; 533e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if (captureCopy.entryCount() == 0) { 534e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 535e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter __FUNCTION__, client->getCameraId()); 536e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return DONE; 537e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 538e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 539e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter Vector<CameraMetadata> requests; 540e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter requests.push(mCaptureRequest); 541e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter res = mBurstCapture->start(requests, mCaptureId); 542e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter mTimeoutCount = kMaxTimeoutsForCaptureEnd * 10; 543e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return BURST_CAPTURE_WAIT; 544e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter} 545e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 546e538206d15282afbc5b168d60b1026a5dfcd13c0James PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureWait( 547e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter sp<Camera2Client> &client) { 548e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter status_t res; 549e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ATRACE_CALL(); 550e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 551e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter while (!mNewCaptureReceived) { 552e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration); 553e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if (res == TIMED_OUT) { 554e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter mTimeoutCount--; 555e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter break; 556e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 557e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 558e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 559e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if (mTimeoutCount <= 0) { 560e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter ALOGW("Timed out waiting for burst capture to complete"); 561e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return DONE; 562e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 563e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter if (mNewCaptureReceived) { 564e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter mNewCaptureReceived = false; 565e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter // TODO: update mCaptureId to last burst's capture ID + 1? 566e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return DONE; 567e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter } 568e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 569e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return BURST_CAPTURE_WAIT; 570e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter} 571e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 572da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t CaptureSequencer::updateCaptureRequest(const Parameters ¶ms, 573da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> &client) { 574da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 575da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 576da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mCaptureRequest.entryCount() == 0) { 577da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = client->getCameraDevice()->createDefaultRequest( 578da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CAMERA2_TEMPLATE_STILL_CAPTURE, 579da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &mCaptureRequest); 580da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 581da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default still image request:" 582da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala " %s (%d)", __FUNCTION__, client->getCameraId(), 583da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala strerror(-res), res); 584da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 585da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 586da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 587da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 588da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = params.updateRequest(&mCaptureRequest); 589da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 590da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of capture " 591da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "request: %s (%d)", __FUNCTION__, client->getCameraId(), 592da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala strerror(-res), res); 593da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 594da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 595da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 596da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_SIZE, 597da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala params.jpegThumbSize, 2); 598da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 599da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_QUALITY, 600da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ¶ms.jpegThumbQuality, 1); 601da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 602da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_JPEG_QUALITY, 603da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ¶ms.jpegQuality, 1); 604da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 605da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.update( 606da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ANDROID_JPEG_ORIENTATION, 607da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ¶ms.jpegRotation, 1); 608da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 609da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 610da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (params.gpsEnabled) { 611da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.update( 612da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES, 613da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala params.gpsCoordinates, 3); 614da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 615da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.update( 616da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP, 617da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ¶ms.gpsTimestamp, 1); 618da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 619da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.update( 620da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD, 621da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala params.gpsProcessingMethod); 622da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 623da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 624da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.erase(ANDROID_JPEG_GPS_COORDINATES); 625da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 626da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.erase(ANDROID_JPEG_GPS_TIMESTAMP); 627da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 628da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mCaptureRequest.erase(ANDROID_JPEG_GPS_PROCESSING_METHOD); 629da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 630da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 631da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 632da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 633da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 634da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 635da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 636da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace camera2 637da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace android 638