169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/* 269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * 469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * you may not use this file except in compliance with the License. 669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * You may obtain a copy of the License at 769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * 869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * 1069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 1169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 1269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * See the License for the specific language governing permissions and 1469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * limitations under the License. 1569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala */ 1669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 17852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala#define LOG_TAG "Camera2-CaptureSequencer" 1869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA 1969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala//#define LOG_NDEBUG 0 2069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 21e5729fac81c8a984e984fefc90afc64135817d4fColin Cross#include <inttypes.h> 22e5729fac81c8a984e984fefc90afc64135817d4fColin Cross 2369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Log.h> 2469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Trace.h> 2569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Vector.h> 2669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/Camera2Client.h" 287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/CaptureSequencer.h" 297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/BurstCapture.h" 307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/Parameters.h" 317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/ZslProcessorInterface.h" 3269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace android { 3469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace camera2 { 3569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Public members */ 3769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3869230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureSequencer(wp<Camera2Client> client): 3969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Thread(false), 4069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCapture(false), 4169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBusy(false), 4269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewAEState(false), 4369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameReceived(false), 4469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureReceived(false), 45ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala mShutterNotified(false), 4669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mClient(client), 4769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureState(IDLE), 482b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala mStateTransitionCount(0), 4969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTriggerId(0), 5069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount(0), 51786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin mCaptureId(Camera2Client::kCaptureRequestIdStart), 52786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin mMsgType(0) { 53c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 5469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 5569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 5669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::~CaptureSequencer() { 5769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Exit", __FUNCTION__); 5869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 5969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinvoid CaptureSequencer::setZslProcessor(wp<ZslProcessorInterface> processor) { 6169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 6269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mZslProcessor = processor; 6369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 6469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 65786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkinstatus_t CaptureSequencer::startCapture(int msgType) { 66c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 6769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 6869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 6969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mBusy) { 7069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Already busy capturing!", __FUNCTION__); 7169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return INVALID_OPERATION; 7269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 7369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mStartCapture) { 74786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin mMsgType = msgType; 7569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCapture = true; 7669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCaptureSignal.signal(); 7769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 7869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 7969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 8069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 81e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvalastatus_t CaptureSequencer::waitUntilIdle(nsecs_t timeout) { 82e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ATRACE_CALL(); 83e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ALOGV("%s: Waiting for idle", __FUNCTION__); 84e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala Mutex::Autolock l(mStateMutex); 85e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala status_t res = -1; 86e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala while (mCaptureState != IDLE) { 87e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala nsecs_t startTime = systemTime(); 88e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 89e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala res = mStateChanged.waitRelative(mStateMutex, timeout); 90e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala if (res != OK) return res; 91e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 92e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala timeout -= (systemTime() - startTime); 93e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala } 94e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ALOGV("%s: Now idle", __FUNCTION__); 95e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala return OK; 96e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala} 97e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 9869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::notifyAutoExposure(uint8_t newState, int triggerId) { 9969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 10069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 10169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAEState = newState; 10269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAETriggerId = triggerId; 10369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mNewAEState) { 10469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewAEState = true; 10569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewNotifySignal.signal(); 10669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 10769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 10869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 109cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weivoid CaptureSequencer::onResultAvailable(const CaptureResult &result) { 11069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 111cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGV("%s: New result available.", __FUNCTION__); 11269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 113cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei mNewFrameId = result.mResultExtras.requestId; 114cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei mNewFrame = result.mMetadata; 11569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mNewFrameReceived) { 11669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameReceived = true; 11769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameSignal.signal(); 11869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 11969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 12069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 12152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvalavoid CaptureSequencer::onCaptureAvailable(nsecs_t timestamp, 12252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala sp<MemoryBase> captureBuffer) { 12369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 124c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 12569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 12669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureTimestamp = timestamp; 12752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala mCaptureBuffer = captureBuffer; 12869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mNewCaptureReceived) { 12969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureReceived = true; 13069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureSignal.signal(); 13169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 13269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 13369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 13469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 135ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkinvoid CaptureSequencer::dump(int fd, const Vector<String16>& /*args*/) { 13669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala String8 result; 13769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mCaptureRequest.entryCount() != 0) { 13869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result = " Capture request:\n"; 13969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 14069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureRequest.dump(fd, 2, 6); 14169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 14269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result = " Capture request: undefined\n"; 14369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 14469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 14569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result = String8::format(" Current capture state: %s\n", 14669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala kStateNames[mCaptureState]); 14769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result.append(" Latest captured frame:\n"); 14869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 14969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrame.dump(fd, 2, 6); 15069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 15169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 15269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Private members */ 15369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 15469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst char* CaptureSequencer::kStateNames[CaptureSequencer::NUM_CAPTURE_STATES+1] = 15569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala{ 15669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "IDLE", 15769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "START", 15869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ZSL_START", 15969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ZSL_WAITING", 16069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ZSL_REPROCESSING", 16169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "STANDARD_START", 162e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala "STANDARD_PRECAPTURE_WAIT", 163e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala "STANDARD_CAPTURE", 164e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala "STANDARD_CAPTURE_WAIT", 165c3dbf1a40df85b75e5805382838a90416f69730fJames Painter "BURST_CAPTURE_START", 166c3dbf1a40df85b75e5805382838a90416f69730fJames Painter "BURST_CAPTURE_WAIT", 16769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "DONE", 16869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ERROR", 16969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "UNKNOWN" 17069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; 17169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 17269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst CaptureSequencer::StateManager 17369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = { 17469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageIdle, 17569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStart, 17669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageZslStart, 17769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageZslWaiting, 17869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageZslReprocessing, 17969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardStart, 18069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardPrecaptureWait, 18169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardCapture, 18269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardCaptureWait, 183c3dbf1a40df85b75e5805382838a90416f69730fJames Painter &CaptureSequencer::manageBurstCaptureStart, 184c3dbf1a40df85b75e5805382838a90416f69730fJames Painter &CaptureSequencer::manageBurstCaptureWait, 18569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageDone, 18669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; 18769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 18869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalabool CaptureSequencer::threadLoop() { 18969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 19069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 19169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (client == 0) return false; 19269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 193e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala CaptureState currentState; 194e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala { 195e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala Mutex::Autolock l(mStateMutex); 196e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala currentState = mCaptureState; 197e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala } 198e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 199e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala currentState = (this->*kStateManagers[currentState])(client); 200e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 201e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala Mutex::Autolock l(mStateMutex); 202e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala if (currentState != mCaptureState) { 2032b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala if (mCaptureState != IDLE) { 2042b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala ATRACE_ASYNC_END(kStateNames[mCaptureState], mStateTransitionCount); 2052b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala } 206e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala mCaptureState = currentState; 2072b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala mStateTransitionCount++; 2082b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala if (mCaptureState != IDLE) { 2092b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala ATRACE_ASYNC_BEGIN(kStateNames[mCaptureState], mStateTransitionCount); 2102b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala } 211e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ALOGV("Camera %d: New capture state %s", 212e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala client->getCameraId(), kStateNames[mCaptureState]); 213e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala mStateChanged.signal(); 214e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala } 215e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 216e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala if (mCaptureState == ERROR) { 217e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ALOGE("Camera %d: Stopping capture sequencer due to error", 218e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala client->getCameraId()); 21969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return false; 22069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 22169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 22269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return true; 22369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 22469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 225ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor MurashkinCaptureSequencer::CaptureState CaptureSequencer::manageIdle( 226ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin sp<Camera2Client> &/*client*/) { 22769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 22869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 22969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mStartCapture) { 23069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mStartCaptureSignal.waitRelative(mInputMutex, 23169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala kWaitDuration); 23269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) break; 23369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 23469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mStartCapture) { 23569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCapture = false; 23669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBusy = true; 23769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return START; 23869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 23969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return IDLE; 24069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 24169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 24269230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageDone(sp<Camera2Client> &client) { 24352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala status_t res = OK; 24469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 24569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureId++; 2464c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (mCaptureId >= Camera2Client::kCaptureRequestIdEnd) { 2474c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mCaptureId = Camera2Client::kCaptureRequestIdStart; 2484c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 24969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala { 25069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 25169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBusy = false; 25269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 25369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 2542b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala int takePictureCounter = 0; 25552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala { 25652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 25752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala switch (l.mParameters.state) { 258e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala case Parameters::DISCONNECTED: 259e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ALOGW("%s: Camera %d: Discarding image data during shutdown ", 260e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala __FUNCTION__, client->getCameraId()); 261e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala res = INVALID_OPERATION; 262e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala break; 26352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala case Parameters::STILL_CAPTURE: 26426bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala res = client->getCameraDevice()->waitUntilDrained(); 26526bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala if (res != OK) { 26626bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala ALOGE("%s: Camera %d: Can't idle after still capture: " 26726bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala "%s (%d)", __FUNCTION__, client->getCameraId(), 26826bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala strerror(-res), res); 26926bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala } 27052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala l.mParameters.state = Parameters::STOPPED; 27152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala break; 27252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 27352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala l.mParameters.state = Parameters::RECORD; 27452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala break; 27552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala default: 27652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala ALOGE("%s: Camera %d: Still image produced unexpectedly " 27752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala "in state %s!", 27852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala __FUNCTION__, client->getCameraId(), 27952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 28052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala res = INVALID_OPERATION; 28152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } 2822b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala takePictureCounter = l.mParameters.takePictureCounter; 28352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } 2842fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<ZslProcessorInterface> processor = mZslProcessor.promote(); 2855a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala if (processor != 0) { 2862fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: Memory optimization, clearing ZSL queue", 2872fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__); 2885a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala processor->clearZslQueue(); 2895a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala } 2905a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala 2914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 2924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Fire the jpegCallback in Camera#takePicture(..., jpegCallback) 2934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 29452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala if (mCaptureBuffer != 0 && res == OK) { 2952b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala ATRACE_ASYNC_END(Camera2Client::kTakepictureLabel, takePictureCounter); 2962b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 297a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Camera2Client::SharedCameraCallbacks::Lock 298a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l(client->mSharedCameraCallbacks); 29952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala ALOGV("%s: Sending still image to client", __FUNCTION__); 300a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin if (l.mRemoteCallback != 0) { 301a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l.mRemoteCallback->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, 30252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala mCaptureBuffer, NULL); 30352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } else { 30452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala ALOGV("%s: No client!", __FUNCTION__); 30552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } 30669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 30752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala mCaptureBuffer.clear(); 30869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 30969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return IDLE; 31069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 31169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 31269230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStart( 31369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 314c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 31569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 31669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 31769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 31869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CaptureState nextState = DONE; 31969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 32069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = updateCaptureRequest(l.mParameters, client); 32169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK ) { 32269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Can't update still image capture request: %s (%d)", 32369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 32469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 32569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 32669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 327c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if(l.mParameters.lightFx != Parameters::LIGHTFX_NONE && 328c3dbf1a40df85b75e5805382838a90416f69730fJames Painter l.mParameters.state == Parameters::STILL_CAPTURE) { 329c3dbf1a40df85b75e5805382838a90416f69730fJames Painter nextState = BURST_CAPTURE_START; 330c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 331c3dbf1a40df85b75e5805382838a90416f69730fJames Painter else if (l.mParameters.zslMode && 3325a07a62123d3e630d739e790528273c1c09e3490Eino-Ville Talvala l.mParameters.state == Parameters::STILL_CAPTURE && 3335a07a62123d3e630d739e790528273c1c09e3490Eino-Ville Talvala l.mParameters.flashMode != Parameters::FLASH_MODE_ON) { 33469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala nextState = ZSL_START; 33569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 33669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala nextState = STANDARD_START; 33769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 338ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala mShutterNotified = false; 33969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 34069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return nextState; 34169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 34269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 34369230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslStart( 34469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 3452954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala ALOGV("%s", __FUNCTION__); 34669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 3472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<ZslProcessorInterface> processor = mZslProcessor.promote(); 34869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (processor == 0) { 34969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: No ZSL queue to use!", __FUNCTION__); 35069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 35169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 35269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 35325a0aef19e170d2695f64b4c48296e7914155a88Zhijun He // We don't want to get partial results for ZSL capture. 3544c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala client->registerFrameListener(mCaptureId, mCaptureId + 1, 35525a0aef19e170d2695f64b4c48296e7914155a88Zhijun He this, 35625a0aef19e170d2695f64b4c48296e7914155a88Zhijun He /*sendPartials*/false); 35769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 35869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // TODO: Actually select the right thing here. 3592954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala res = processor->pushToReprocess(mCaptureId); 3602954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala if (res != OK) { 3612274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala if (res == NOT_ENOUGH_DATA) { 3622274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala ALOGV("%s: Camera %d: ZSL queue doesn't have good frame, " 3632274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala "falling back to normal capture", __FUNCTION__, 3642274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala client->getCameraId()); 3652274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala } else { 3662274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala ALOGE("%s: Camera %d: Error in ZSL queue: %s (%d)", 3672274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 3682274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala } 3692954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala return STANDARD_START; 3702954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala } 37169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 372a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 373a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin /* warning: this also locks a SharedCameraCallbacks */ 374786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin shutterNotifyLocked(l.mParameters, client, mMsgType); 375ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala mShutterNotified = true; 37669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForCaptureEnd; 37769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 37869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 37969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 38069230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslWaiting( 381ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin sp<Camera2Client> &/*client*/) { 3822954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala ALOGV("%s", __FUNCTION__); 38369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 38469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 38569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 38669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslReprocessing( 387ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin sp<Camera2Client> &/*client*/) { 3882954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala ALOGV("%s", __FUNCTION__); 38969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return START; 39069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 39169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 39269230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardStart( 39369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 39469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 3954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 396b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He bool isAeConverged = false; 3974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Get the onFrameAvailable callback when the requestID == mCaptureId 39825a0aef19e170d2695f64b4c48296e7914155a88Zhijun He // We don't want to get partial results for normal capture, as we need 39925a0aef19e170d2695f64b4c48296e7914155a88Zhijun He // Get ANDROID_SENSOR_TIMESTAMP from the capture result, but partial 40025a0aef19e170d2695f64b4c48296e7914155a88Zhijun He // result doesn't have to have this metadata available. 40125a0aef19e170d2695f64b4c48296e7914155a88Zhijun He // TODO: Update to use the HALv3 shutter notification for remove the 40225a0aef19e170d2695f64b4c48296e7914155a88Zhijun He // need for this listener and make it faster. see bug 12530628. 4034c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala client->registerFrameListener(mCaptureId, mCaptureId + 1, 40425a0aef19e170d2695f64b4c48296e7914155a88Zhijun He this, 40525a0aef19e170d2695f64b4c48296e7914155a88Zhijun He /*sendPartials*/false); 406b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He 407b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He { 408b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He Mutex::Autolock l(mInputMutex); 409b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He isAeConverged = (mAEState == ANDROID_CONTROL_AE_STATE_CONVERGED); 410b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He } 411b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He 41269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala { 41369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 414b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He // Skip AE precapture when it is already converged and not in force flash mode. 415b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He if (l.mParameters.flashMode != Parameters::FLASH_MODE_ON && isAeConverged) { 416b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He return STANDARD_CAPTURE; 417b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He } 418b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He 41969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTriggerId = l.mParameters.precaptureTriggerCounter++; 42069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 42169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala client->getCameraDevice()->triggerPrecaptureMetering(mTriggerId); 42269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 42369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAeInPrecapture = false; 42469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForPrecaptureStart; 42569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_PRECAPTURE_WAIT; 42669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 42769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 42869230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardPrecaptureWait( 429ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin sp<Camera2Client> &/*client*/) { 43069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 43169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 43269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 43369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mNewAEState) { 43469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mNewNotifySignal.waitRelative(mInputMutex, kWaitDuration); 43569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) { 43669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount--; 43769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 43869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 43969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 44069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mTimeoutCount <= 0) { 44169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Timed out waiting for precapture %s", 44269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAeInPrecapture ? "end" : "start"); 44369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE; 44469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 44569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mNewAEState) { 44669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mAeInPrecapture) { 44769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // Waiting to see PRECAPTURE state 448e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He if (mAETriggerId == mTriggerId) { 449e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He if (mAEState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 450e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He ALOGV("%s: Got precapture start", __FUNCTION__); 451e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He mAeInPrecapture = true; 452e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He mTimeoutCount = kMaxTimeoutsForPrecaptureEnd; 453e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He } else if (mAEState == ANDROID_CONTROL_AE_STATE_CONVERGED || 454e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He mAEState == ANDROID_CONTROL_AE_STATE_FLASH_REQUIRED) { 455e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He // It is legal to transit to CONVERGED or FLASH_REQUIRED 456e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He // directly after a trigger. 457e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He ALOGV("%s: AE is already in good state, start capture", __FUNCTION__); 458e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He return STANDARD_CAPTURE; 459e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He } 46069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 46169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 46269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // Waiting to see PRECAPTURE state end 46369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mAETriggerId == mTriggerId && 46469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAEState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 46569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Got precapture end", __FUNCTION__); 46669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE; 46769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 46869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 46969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewAEState = false; 47069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 47169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_PRECAPTURE_WAIT; 47269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 47369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 47469230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture( 47569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 47669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 47769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 47869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 479d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He Vector<int32_t> outputStreams; 48084b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He uint8_t captureIntent = static_cast<uint8_t>(ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE); 48169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 4824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 4834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Set up output streams in the request 4844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * - preview 4854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * - capture/jpeg 4864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * - callback (if preview callbacks enabled) 4874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * - recording (if recording enabled) 4884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 48969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getPreviewStreamId()); 49069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getCaptureStreamId()); 49169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 49269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (l.mParameters.previewCallbackFlags & 49369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) { 49469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getCallbackStreamId()); 49569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 49669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 49769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) { 49869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getRecordingStreamId()); 49984b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He captureIntent = static_cast<uint8_t>(ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT); 50069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 50169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 50269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS, 50369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams); 50469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == OK) { 50569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_ID, 50669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &mCaptureId, 1); 50769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 50869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == OK) { 50984b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He res = mCaptureRequest.update(ANDROID_CONTROL_CAPTURE_INTENT, 51084b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He &captureIntent, 1); 51184b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He } 51284b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He if (res == OK) { 51369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.sort(); 51469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 51569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 51669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 51769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)", 51869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 51969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 52069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 52169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 5224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Create a capture copy since CameraDeviceBase#capture takes ownership 52369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CameraMetadata captureCopy = mCaptureRequest; 52469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (captureCopy.entryCount() == 0) { 52569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 52669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId()); 52769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 52869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 52969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 5304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 5314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Clear the streaming request for still-capture pictures 5324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * (as opposed to i.e. video snapshots) 5334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 53469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (l.mParameters.state == Parameters::STILL_CAPTURE) { 5354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // API definition of takePicture() - stop preview before taking pic 5364c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala res = client->stopStream(); 53769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 53869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop preview for still capture: " 53969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "%s (%d)", 54069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 54169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 54269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 54369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 54469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // TODO: Capture should be atomic with setStreamingRequest here 54569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = client->getCameraDevice()->capture(captureCopy); 54669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 54769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to submit still image capture request: " 54869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "%s (%d)", 54969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 55069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 55169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 55269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 55369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForCaptureEnd; 55469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 55569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 55669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 55769230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCaptureWait( 55869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 55969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 56069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 56169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 5624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 5634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Wait for new metadata result (mNewFrame) 56469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mNewFrameReceived) { 56569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mNewFrameSignal.waitRelative(mInputMutex, kWaitDuration); 56669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) { 56769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount--; 56869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 56969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 57069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 5714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 5724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Approximation of the shutter being closed 5734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // - TODO: use the hal3 exposure callback in Camera3Device instead 574ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala if (mNewFrameReceived && !mShutterNotified) { 575ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 576a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin /* warning: this also locks a SharedCameraCallbacks */ 577786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin shutterNotifyLocked(l.mParameters, client, mMsgType); 578ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala mShutterNotified = true; 579ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala } 5804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 5814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Wait until jpeg was captured by JpegProcessor 582ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala while (mNewFrameReceived && !mNewCaptureReceived) { 58369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration); 58469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) { 58569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount--; 58669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 58769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 58869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 58969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mTimeoutCount <= 0) { 59069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Timed out waiting for capture to complete"); 59169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 59269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 59369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mNewFrameReceived && mNewCaptureReceived) { 59469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mNewFrameId != mCaptureId) { 59569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Mismatched capture frame IDs: Expected %d, got %d", 59669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureId, mNewFrameId); 59769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 59869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala camera_metadata_entry_t entry; 59969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala entry = mNewFrame.find(ANDROID_SENSOR_TIMESTAMP); 60069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (entry.count == 0) { 60169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("No timestamp field in capture frame!"); 6026056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He } else if (entry.count == 1) { 6036056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He if (entry.data.i64[0] != mCaptureTimestamp) { 6046056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He ALOGW("Mismatched capture timestamps: Metadata frame %" PRId64 "," 6056056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He " captured buffer %" PRId64, 6066056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He entry.data.i64[0], 6076056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He mCaptureTimestamp); 6086056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He } 6096056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He } else { 6106056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He ALOGE("Timestamp metadata is malformed!"); 61169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 6124c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala client->removeFrameListener(mCaptureId, mCaptureId + 1, this); 61369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 61469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameReceived = false; 61569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureReceived = false; 61669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 61769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 61869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 61969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 62069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 621c3dbf1a40df85b75e5805382838a90416f69730fJames PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureStart( 622c3dbf1a40df85b75e5805382838a90416f69730fJames Painter sp<Camera2Client> &client) { 623c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 624c3dbf1a40df85b75e5805382838a90416f69730fJames Painter status_t res; 625c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ATRACE_CALL(); 626c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 627c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // check which burst mode is set, create respective burst object 628c3dbf1a40df85b75e5805382838a90416f69730fJames Painter { 629c3dbf1a40df85b75e5805382838a90416f69730fJames Painter SharedParameters::Lock l(client->getParameters()); 630c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 631c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = updateCaptureRequest(l.mParameters, client); 632c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if(res != OK) { 633c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 634c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 635c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 636c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // 637c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // check for burst mode type in mParameters here 638c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // 639c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mBurstCapture = new BurstCapture(client, this); 640c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 641c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 642c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mCaptureRequest.update(ANDROID_REQUEST_ID, &mCaptureId, 1); 643c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (res == OK) { 644c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mCaptureRequest.sort(); 645c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 646c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (res != OK) { 647c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)", 648c3dbf1a40df85b75e5805382838a90416f69730fJames Painter __FUNCTION__, client->getCameraId(), strerror(-res), res); 649c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 650c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 651c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 652c3dbf1a40df85b75e5805382838a90416f69730fJames Painter CameraMetadata captureCopy = mCaptureRequest; 653c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (captureCopy.entryCount() == 0) { 654c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 655c3dbf1a40df85b75e5805382838a90416f69730fJames Painter __FUNCTION__, client->getCameraId()); 656c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 657c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 658c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 659c3dbf1a40df85b75e5805382838a90416f69730fJames Painter Vector<CameraMetadata> requests; 660c3dbf1a40df85b75e5805382838a90416f69730fJames Painter requests.push(mCaptureRequest); 661c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mBurstCapture->start(requests, mCaptureId); 662c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mTimeoutCount = kMaxTimeoutsForCaptureEnd * 10; 663c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return BURST_CAPTURE_WAIT; 664c3dbf1a40df85b75e5805382838a90416f69730fJames Painter} 665c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 666c3dbf1a40df85b75e5805382838a90416f69730fJames PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureWait( 667ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin sp<Camera2Client> &/*client*/) { 668c3dbf1a40df85b75e5805382838a90416f69730fJames Painter status_t res; 669c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ATRACE_CALL(); 670c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 671c3dbf1a40df85b75e5805382838a90416f69730fJames Painter while (!mNewCaptureReceived) { 672c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration); 673c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (res == TIMED_OUT) { 674c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mTimeoutCount--; 675c3dbf1a40df85b75e5805382838a90416f69730fJames Painter break; 676c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 677c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 678c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 679c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (mTimeoutCount <= 0) { 680c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGW("Timed out waiting for burst capture to complete"); 681c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 682c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 683c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (mNewCaptureReceived) { 684c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mNewCaptureReceived = false; 685c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // TODO: update mCaptureId to last burst's capture ID + 1? 686c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 687c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 688c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 689c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return BURST_CAPTURE_WAIT; 690c3dbf1a40df85b75e5805382838a90416f69730fJames Painter} 691c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 69269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t CaptureSequencer::updateCaptureRequest(const Parameters ¶ms, 69369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 69469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 69569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 69669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mCaptureRequest.entryCount() == 0) { 69769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = client->getCameraDevice()->createDefaultRequest( 69869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CAMERA2_TEMPLATE_STILL_CAPTURE, 69969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &mCaptureRequest); 70069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 70169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default still image request:" 70269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala " %s (%d)", __FUNCTION__, client->getCameraId(), 70369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala strerror(-res), res); 70469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 70569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 70669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 70769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 70869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = params.updateRequest(&mCaptureRequest); 70969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 71069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of capture " 71169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "request: %s (%d)", __FUNCTION__, client->getCameraId(), 71269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala strerror(-res), res); 71369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 71469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 71569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 716db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala res = params.updateRequestJpeg(&mCaptureRequest); 717db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala if (res != OK) { 718db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update JPEG entries of capture " 719db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala "request: %s (%d)", __FUNCTION__, client->getCameraId(), 720db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala strerror(-res), res); 721db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala return res; 72269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 72369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 72469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 72569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 72669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 727707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin/*static*/ void CaptureSequencer::shutterNotifyLocked(const Parameters ¶ms, 728786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin sp<Camera2Client> client, int msgType) { 729707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin ATRACE_CALL(); 730707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin 731786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin if (params.state == Parameters::STILL_CAPTURE 732786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin && params.playShutterSound 733786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin && (msgType & CAMERA_MSG_SHUTTER)) { 734707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin client->getCameraService()->playSound(CameraService::SOUND_SHUTTER); 735707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin } 736707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin 737707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin { 738a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Camera2Client::SharedCameraCallbacks::Lock 739a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l(client->mSharedCameraCallbacks); 740707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin 741707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin ALOGV("%s: Notifying of shutter close to client", __FUNCTION__); 742a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin if (l.mRemoteCallback != 0) { 743707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin // ShutterCallback 744a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_SHUTTER, 745707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin /*ext1*/0, /*ext2*/0); 746707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin 747707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin // RawCallback with null buffer 748a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_RAW_IMAGE_NOTIFY, 749707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin /*ext1*/0, /*ext2*/0); 750707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin } else { 751707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin ALOGV("%s: No client!", __FUNCTION__); 752707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin } 753707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin } 754707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin} 755707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin 75669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 75769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace camera2 75869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace android 759