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/Parameters.h" 30d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala#include "api1/client2/ZslProcessor.h" 3169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace android { 3369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace camera2 { 3469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Public members */ 3669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3769230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureSequencer(wp<Camera2Client> client): 3869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Thread(false), 3969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCapture(false), 4069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBusy(false), 4169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewAEState(false), 4269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameReceived(false), 4369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureReceived(false), 44b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang mNewCaptureErrorCnt(0), 45ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala mShutterNotified(false), 46216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh mHalNotifiedShutter(false), 47216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh mShutterCaptureId(-1), 4869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mClient(client), 4969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureState(IDLE), 502b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala mStateTransitionCount(0), 5169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTriggerId(0), 5269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount(0), 53786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin mCaptureId(Camera2Client::kCaptureRequestIdStart), 54786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin mMsgType(0) { 55c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 5669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 5769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 5869230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::~CaptureSequencer() { 5969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Exit", __FUNCTION__); 6069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 6169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 62d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvalavoid CaptureSequencer::setZslProcessor(wp<ZslProcessor> processor) { 6369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 6469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mZslProcessor = processor; 6569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 6669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 67786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkinstatus_t CaptureSequencer::startCapture(int msgType) { 68c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 6969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 7069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 7169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mBusy) { 7269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Already busy capturing!", __FUNCTION__); 7369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return INVALID_OPERATION; 7469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 7569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mStartCapture) { 76786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin mMsgType = msgType; 7769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCapture = true; 7869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCaptureSignal.signal(); 7969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 8069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 8169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 8269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 83e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvalastatus_t CaptureSequencer::waitUntilIdle(nsecs_t timeout) { 84e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ATRACE_CALL(); 85e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ALOGV("%s: Waiting for idle", __FUNCTION__); 86e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala Mutex::Autolock l(mStateMutex); 87e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala status_t res = -1; 88e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala while (mCaptureState != IDLE) { 89e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala nsecs_t startTime = systemTime(); 90e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 91e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala res = mStateChanged.waitRelative(mStateMutex, timeout); 92e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala if (res != OK) return res; 93e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 94e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala timeout -= (systemTime() - startTime); 95e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala } 96e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ALOGV("%s: Now idle", __FUNCTION__); 97e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala return OK; 98e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala} 99e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 10069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::notifyAutoExposure(uint8_t newState, int triggerId) { 10169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 10269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 10369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAEState = newState; 10469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAETriggerId = triggerId; 10569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mNewAEState) { 10669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewAEState = true; 10769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewNotifySignal.signal(); 10869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 10969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 11069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 111216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yehvoid CaptureSequencer::notifyShutter(const CaptureResultExtras& resultExtras, 112216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh nsecs_t timestamp) { 113216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh ATRACE_CALL(); 114d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala (void) timestamp; 115216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh Mutex::Autolock l(mInputMutex); 116216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh if (!mHalNotifiedShutter && resultExtras.requestId == mShutterCaptureId) { 117216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh mHalNotifiedShutter = true; 118216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh mShutterNotifySignal.signal(); 119216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh } 120216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh} 121216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh 122cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weivoid CaptureSequencer::onResultAvailable(const CaptureResult &result) { 12369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 124cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGV("%s: New result available.", __FUNCTION__); 12569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 126cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei mNewFrameId = result.mResultExtras.requestId; 127cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei mNewFrame = result.mMetadata; 12869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mNewFrameReceived) { 12969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameReceived = true; 13069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameSignal.signal(); 13169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 13269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 13369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 13452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvalavoid CaptureSequencer::onCaptureAvailable(nsecs_t timestamp, 135b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang sp<MemoryBase> captureBuffer, bool captureError) { 13669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 137c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 13869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 13969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureTimestamp = timestamp; 14052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala mCaptureBuffer = captureBuffer; 14169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mNewCaptureReceived) { 14269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureReceived = true; 143b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang if (captureError) { 144b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang mNewCaptureErrorCnt++; 145b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang } else { 146b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang mNewCaptureErrorCnt = 0; 147b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang } 14869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureSignal.signal(); 14969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 15069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 15169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 15269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 153ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkinvoid CaptureSequencer::dump(int fd, const Vector<String16>& /*args*/) { 15469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala String8 result; 15569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mCaptureRequest.entryCount() != 0) { 15669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result = " Capture request:\n"; 15769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 15869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureRequest.dump(fd, 2, 6); 15969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 16069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result = " Capture request: undefined\n"; 16169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 16269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 16369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result = String8::format(" Current capture state: %s\n", 16469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala kStateNames[mCaptureState]); 16569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result.append(" Latest captured frame:\n"); 16669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 16769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrame.dump(fd, 2, 6); 16869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 16969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 17069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Private members */ 17169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 17269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst char* CaptureSequencer::kStateNames[CaptureSequencer::NUM_CAPTURE_STATES+1] = 17369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala{ 17469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "IDLE", 17569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "START", 17669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ZSL_START", 17769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ZSL_WAITING", 17869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ZSL_REPROCESSING", 17969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "STANDARD_START", 180e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala "STANDARD_PRECAPTURE_WAIT", 181e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala "STANDARD_CAPTURE", 182e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala "STANDARD_CAPTURE_WAIT", 18369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "DONE", 18469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ERROR", 18569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "UNKNOWN" 18669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; 18769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 18869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst CaptureSequencer::StateManager 18969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = { 19069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageIdle, 19169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStart, 19269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageZslStart, 19369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageZslWaiting, 19469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageZslReprocessing, 19569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardStart, 19669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardPrecaptureWait, 19769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardCapture, 19869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardCaptureWait, 19969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageDone, 20069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; 20169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 20269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalabool CaptureSequencer::threadLoop() { 20369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 20469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 20569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (client == 0) return false; 20669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 207e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala CaptureState currentState; 208e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala { 209e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala Mutex::Autolock l(mStateMutex); 210e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala currentState = mCaptureState; 211e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala } 212e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 213e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala currentState = (this->*kStateManagers[currentState])(client); 214e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 215e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala Mutex::Autolock l(mStateMutex); 216e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala if (currentState != mCaptureState) { 2172b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala if (mCaptureState != IDLE) { 2182b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala ATRACE_ASYNC_END(kStateNames[mCaptureState], mStateTransitionCount); 2192b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala } 220e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala mCaptureState = currentState; 2212b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala mStateTransitionCount++; 2222b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala if (mCaptureState != IDLE) { 2232b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala ATRACE_ASYNC_BEGIN(kStateNames[mCaptureState], mStateTransitionCount); 2242b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala } 225e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ALOGV("Camera %d: New capture state %s", 226e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala client->getCameraId(), kStateNames[mCaptureState]); 227e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala mStateChanged.signal(); 228e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala } 229e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 230e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala if (mCaptureState == ERROR) { 231e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ALOGE("Camera %d: Stopping capture sequencer due to error", 232e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala client->getCameraId()); 23369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return false; 23469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 23569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 23669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return true; 23769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 23869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 239ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor MurashkinCaptureSequencer::CaptureState CaptureSequencer::manageIdle( 240ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin sp<Camera2Client> &/*client*/) { 24169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 24269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 24369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mStartCapture) { 24469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mStartCaptureSignal.waitRelative(mInputMutex, 24569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala kWaitDuration); 24669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) break; 24769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 24869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mStartCapture) { 24969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCapture = false; 25069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBusy = true; 25169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return START; 25269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 25369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return IDLE; 25469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 25569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 25669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageDone(sp<Camera2Client> &client) { 25752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala status_t res = OK; 25869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 25969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureId++; 2604c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (mCaptureId >= Camera2Client::kCaptureRequestIdEnd) { 2614c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mCaptureId = Camera2Client::kCaptureRequestIdStart; 2624c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 26369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala { 26469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 26569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBusy = false; 26669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 26769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 2682b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala int takePictureCounter = 0; 26952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala { 27052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 27152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala switch (l.mParameters.state) { 272e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala case Parameters::DISCONNECTED: 273e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ALOGW("%s: Camera %d: Discarding image data during shutdown ", 274e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala __FUNCTION__, client->getCameraId()); 275e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala res = INVALID_OPERATION; 276e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala break; 27752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala case Parameters::STILL_CAPTURE: 27826bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala res = client->getCameraDevice()->waitUntilDrained(); 27926bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala if (res != OK) { 28026bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala ALOGE("%s: Camera %d: Can't idle after still capture: " 28126bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala "%s (%d)", __FUNCTION__, client->getCameraId(), 28226bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala strerror(-res), res); 28326bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala } 28452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala l.mParameters.state = Parameters::STOPPED; 28552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala break; 28652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 28752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala l.mParameters.state = Parameters::RECORD; 28852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala break; 28952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala default: 29052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala ALOGE("%s: Camera %d: Still image produced unexpectedly " 29152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala "in state %s!", 29252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala __FUNCTION__, client->getCameraId(), 29352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 29452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala res = INVALID_OPERATION; 29552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } 2962b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala takePictureCounter = l.mParameters.takePictureCounter; 29752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } 298d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala sp<ZslProcessor> processor = mZslProcessor.promote(); 2995a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala if (processor != 0) { 3002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: Memory optimization, clearing ZSL queue", 3012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__); 3025a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala processor->clearZslQueue(); 3035a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala } 3045a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala 3054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 3064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Fire the jpegCallback in Camera#takePicture(..., jpegCallback) 3074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 30852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala if (mCaptureBuffer != 0 && res == OK) { 3092b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala ATRACE_ASYNC_END(Camera2Client::kTakepictureLabel, takePictureCounter); 3102b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 311a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Camera2Client::SharedCameraCallbacks::Lock 312a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l(client->mSharedCameraCallbacks); 31352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala ALOGV("%s: Sending still image to client", __FUNCTION__); 314a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin if (l.mRemoteCallback != 0) { 315a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l.mRemoteCallback->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, 31652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala mCaptureBuffer, NULL); 31752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } else { 31852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala ALOGV("%s: No client!", __FUNCTION__); 31952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } 32069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 32152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala mCaptureBuffer.clear(); 32269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 32369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return IDLE; 32469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 32569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 32669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStart( 32769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 328c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 32969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 33069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 33169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 33269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CaptureState nextState = DONE; 33369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 33469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = updateCaptureRequest(l.mParameters, client); 33569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK ) { 33669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Can't update still image capture request: %s (%d)", 33769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 33869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 33969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 34069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 341c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala else if (l.mParameters.useZeroShutterLag() && 3425a07a62123d3e630d739e790528273c1c09e3490Eino-Ville Talvala l.mParameters.state == Parameters::STILL_CAPTURE && 3435a07a62123d3e630d739e790528273c1c09e3490Eino-Ville Talvala l.mParameters.flashMode != Parameters::FLASH_MODE_ON) { 34469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala nextState = ZSL_START; 34569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 34669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala nextState = STANDARD_START; 34769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 348216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh { 349216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh Mutex::Autolock l(mInputMutex); 350216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh mShutterCaptureId = mCaptureId; 351216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh mHalNotifiedShutter = false; 352216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh } 353ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala mShutterNotified = false; 35469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 35569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return nextState; 35669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 35769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 35869230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslStart( 35969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 3602954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala ALOGV("%s", __FUNCTION__); 36169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 362d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala sp<ZslProcessor> processor = mZslProcessor.promote(); 36369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (processor == 0) { 36469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: No ZSL queue to use!", __FUNCTION__); 36569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 36669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 36769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 36825a0aef19e170d2695f64b4c48296e7914155a88Zhijun He // We don't want to get partial results for ZSL capture. 3694c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala client->registerFrameListener(mCaptureId, mCaptureId + 1, 37025a0aef19e170d2695f64b4c48296e7914155a88Zhijun He this, 37125a0aef19e170d2695f64b4c48296e7914155a88Zhijun He /*sendPartials*/false); 37269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 37369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // TODO: Actually select the right thing here. 3742954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala res = processor->pushToReprocess(mCaptureId); 3752954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala if (res != OK) { 3762274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala if (res == NOT_ENOUGH_DATA) { 3772274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala ALOGV("%s: Camera %d: ZSL queue doesn't have good frame, " 3782274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala "falling back to normal capture", __FUNCTION__, 3792274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala client->getCameraId()); 3802274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala } else { 3812274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala ALOGE("%s: Camera %d: Error in ZSL queue: %s (%d)", 3822274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 3832274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala } 3842954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala return STANDARD_START; 3852954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala } 38669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 387a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 388a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin /* warning: this also locks a SharedCameraCallbacks */ 389786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin shutterNotifyLocked(l.mParameters, client, mMsgType); 390ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala mShutterNotified = true; 39169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForCaptureEnd; 39269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 39369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 39469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 39569230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslWaiting( 396ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin sp<Camera2Client> &/*client*/) { 3972954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala ALOGV("%s", __FUNCTION__); 39869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 39969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 40069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 40169230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslReprocessing( 402ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin sp<Camera2Client> &/*client*/) { 4032954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala ALOGV("%s", __FUNCTION__); 40469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return START; 40569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 40669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 40769230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardStart( 40869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 40969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 4104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 411b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He bool isAeConverged = false; 4124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Get the onFrameAvailable callback when the requestID == mCaptureId 41325a0aef19e170d2695f64b4c48296e7914155a88Zhijun He // We don't want to get partial results for normal capture, as we need 41425a0aef19e170d2695f64b4c48296e7914155a88Zhijun He // Get ANDROID_SENSOR_TIMESTAMP from the capture result, but partial 41525a0aef19e170d2695f64b4c48296e7914155a88Zhijun He // result doesn't have to have this metadata available. 41625a0aef19e170d2695f64b4c48296e7914155a88Zhijun He // TODO: Update to use the HALv3 shutter notification for remove the 41725a0aef19e170d2695f64b4c48296e7914155a88Zhijun He // need for this listener and make it faster. see bug 12530628. 4184c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala client->registerFrameListener(mCaptureId, mCaptureId + 1, 41925a0aef19e170d2695f64b4c48296e7914155a88Zhijun He this, 42025a0aef19e170d2695f64b4c48296e7914155a88Zhijun He /*sendPartials*/false); 421b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He 422b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He { 423b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He Mutex::Autolock l(mInputMutex); 424b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He isAeConverged = (mAEState == ANDROID_CONTROL_AE_STATE_CONVERGED); 425b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He } 426b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He 42769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala { 42869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 429b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He // Skip AE precapture when it is already converged and not in force flash mode. 430b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He if (l.mParameters.flashMode != Parameters::FLASH_MODE_ON && isAeConverged) { 431b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He return STANDARD_CAPTURE; 432b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He } 433b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He 43469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTriggerId = l.mParameters.precaptureTriggerCounter++; 43569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 43669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala client->getCameraDevice()->triggerPrecaptureMetering(mTriggerId); 43769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 43869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAeInPrecapture = false; 43969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForPrecaptureStart; 44069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_PRECAPTURE_WAIT; 44169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 44269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 44369230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardPrecaptureWait( 444ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin sp<Camera2Client> &/*client*/) { 44569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 44669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 44769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 44869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mNewAEState) { 44969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mNewNotifySignal.waitRelative(mInputMutex, kWaitDuration); 45069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) { 45169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount--; 45269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 45369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 45469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 45569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mTimeoutCount <= 0) { 45669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Timed out waiting for precapture %s", 45769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAeInPrecapture ? "end" : "start"); 45869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE; 45969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 46069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mNewAEState) { 46169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mAeInPrecapture) { 46269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // Waiting to see PRECAPTURE state 463e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He if (mAETriggerId == mTriggerId) { 464e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He if (mAEState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 465e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He ALOGV("%s: Got precapture start", __FUNCTION__); 466e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He mAeInPrecapture = true; 467e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He mTimeoutCount = kMaxTimeoutsForPrecaptureEnd; 468e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He } else if (mAEState == ANDROID_CONTROL_AE_STATE_CONVERGED || 469e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He mAEState == ANDROID_CONTROL_AE_STATE_FLASH_REQUIRED) { 470e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He // It is legal to transit to CONVERGED or FLASH_REQUIRED 471e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He // directly after a trigger. 472e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He ALOGV("%s: AE is already in good state, start capture", __FUNCTION__); 473e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He return STANDARD_CAPTURE; 474e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He } 47569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 47669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 47769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // Waiting to see PRECAPTURE state end 47869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mAETriggerId == mTriggerId && 47969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAEState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 48069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Got precapture end", __FUNCTION__); 48169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE; 48269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 48369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 48469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewAEState = false; 48569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 48669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_PRECAPTURE_WAIT; 48769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 48869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 48969230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture( 49069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 49169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 49269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 49369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 494d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He Vector<int32_t> outputStreams; 49584b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He uint8_t captureIntent = static_cast<uint8_t>(ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE); 49669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 4974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 4984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Set up output streams in the request 4994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * - preview 5004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * - capture/jpeg 5014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * - callback (if preview callbacks enabled) 5024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * - recording (if recording enabled) 5034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 50469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getPreviewStreamId()); 505355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 506355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh int captureStreamId = client->getCaptureStreamId(); 507355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (captureStreamId == Camera2Client::NO_STREAM) { 508355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh res = client->createJpegStreamL(l.mParameters); 509355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (res != OK || client->getCaptureStreamId() == Camera2Client::NO_STREAM) { 510355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh ALOGE("%s: Camera %d: cannot create jpeg stream for slowJpeg mode: %s (%d)", 511355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh __FUNCTION__, client->getCameraId(), strerror(-res), res); 512355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh return DONE; 513355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 514355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 515355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 51669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getCaptureStreamId()); 51769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 51869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (l.mParameters.previewCallbackFlags & 51969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) { 52069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getCallbackStreamId()); 52169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 52269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 52369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) { 52469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getRecordingStreamId()); 52584b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He captureIntent = static_cast<uint8_t>(ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT); 52669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 52769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 52869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS, 52969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams); 53069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == OK) { 53169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_ID, 53269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &mCaptureId, 1); 53369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 53469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == OK) { 53584b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He res = mCaptureRequest.update(ANDROID_CONTROL_CAPTURE_INTENT, 53684b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He &captureIntent, 1); 53784b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He } 53884b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He if (res == OK) { 53969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.sort(); 54069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 54169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 54269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 54369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)", 54469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 54569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 54669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 54769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 5484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Create a capture copy since CameraDeviceBase#capture takes ownership 54969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CameraMetadata captureCopy = mCaptureRequest; 55069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (captureCopy.entryCount() == 0) { 55169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 55269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId()); 55369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 55469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 55569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 5564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 5574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Clear the streaming request for still-capture pictures 5584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * (as opposed to i.e. video snapshots) 5594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 56069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (l.mParameters.state == Parameters::STILL_CAPTURE) { 5614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // API definition of takePicture() - stop preview before taking pic 5624c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala res = client->stopStream(); 56369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 56469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop preview for still capture: " 56569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "%s (%d)", 56669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 56769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 56869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 56969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 570216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh 57169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // TODO: Capture should be atomic with setStreamingRequest here 57269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = client->getCameraDevice()->capture(captureCopy); 57369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 57469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to submit still image capture request: " 57569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "%s (%d)", 57669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 57769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 57869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 57969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 58069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForCaptureEnd; 58169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 58269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 58369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 58469230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCaptureWait( 58569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 58669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 58769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 58869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 5894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 590216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh 591216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh // Wait for shutter callback 592216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh while (!mHalNotifiedShutter) { 593216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh if (mTimeoutCount <= 0) { 594216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh break; 595216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh } 596216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh res = mShutterNotifySignal.waitRelative(mInputMutex, kWaitDuration); 597216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh if (res == TIMED_OUT) { 598216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh mTimeoutCount--; 599216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh return STANDARD_CAPTURE_WAIT; 600216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh } 601216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh } 602216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh 603216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh if (mHalNotifiedShutter) { 604216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh if (!mShutterNotified) { 605216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh SharedParameters::Lock l(client->getParameters()); 606216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh /* warning: this also locks a SharedCameraCallbacks */ 607216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh shutterNotifyLocked(l.mParameters, client, mMsgType); 608216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh mShutterNotified = true; 609216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh } 610216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh } else if (mTimeoutCount <= 0) { 611216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh ALOGW("Timed out waiting for shutter notification"); 612216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh return DONE; 613216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh } 614216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh 6154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Wait for new metadata result (mNewFrame) 61669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mNewFrameReceived) { 61769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mNewFrameSignal.waitRelative(mInputMutex, kWaitDuration); 61869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) { 61969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount--; 62069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 62169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 62269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 6234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 6244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Wait until jpeg was captured by JpegProcessor 625ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala while (mNewFrameReceived && !mNewCaptureReceived) { 62669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration); 62769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) { 62869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount--; 62969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 63069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 63169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 632b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang if (mNewCaptureReceived) { 633b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang if (mNewCaptureErrorCnt > kMaxRetryCount) { 634b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang ALOGW("Exceeding multiple retry limit of %d due to buffer drop", kMaxRetryCount); 635b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang return DONE; 636b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang } else if (mNewCaptureErrorCnt > 0) { 637b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang ALOGW("Capture error happened, retry %d...", mNewCaptureErrorCnt); 638b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang mNewCaptureReceived = false; 639b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang return STANDARD_CAPTURE; 640b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang } 641b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang } 642b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang 64369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mTimeoutCount <= 0) { 64469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Timed out waiting for capture to complete"); 64569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 64669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 64769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mNewFrameReceived && mNewCaptureReceived) { 648216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh 64969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mNewFrameId != mCaptureId) { 65069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Mismatched capture frame IDs: Expected %d, got %d", 65169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureId, mNewFrameId); 65269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 65369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala camera_metadata_entry_t entry; 65469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala entry = mNewFrame.find(ANDROID_SENSOR_TIMESTAMP); 65569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (entry.count == 0) { 65669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("No timestamp field in capture frame!"); 6576056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He } else if (entry.count == 1) { 6586056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He if (entry.data.i64[0] != mCaptureTimestamp) { 6596056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He ALOGW("Mismatched capture timestamps: Metadata frame %" PRId64 "," 6606056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He " captured buffer %" PRId64, 6616056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He entry.data.i64[0], 6626056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He mCaptureTimestamp); 6636056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He } 6646056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He } else { 6656056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He ALOGE("Timestamp metadata is malformed!"); 66669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 6674c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala client->removeFrameListener(mCaptureId, mCaptureId + 1, this); 66869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 66969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameReceived = false; 67069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureReceived = false; 67169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 67269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 67369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 67469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 67569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 67669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t CaptureSequencer::updateCaptureRequest(const Parameters ¶ms, 67769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 67869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 67969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 68069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mCaptureRequest.entryCount() == 0) { 68169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = client->getCameraDevice()->createDefaultRequest( 68269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CAMERA2_TEMPLATE_STILL_CAPTURE, 68369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &mCaptureRequest); 68469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 68569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default still image request:" 68669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala " %s (%d)", __FUNCTION__, client->getCameraId(), 68769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala strerror(-res), res); 68869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 68969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 69069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 69169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 69269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = params.updateRequest(&mCaptureRequest); 69369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 69469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of capture " 69569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "request: %s (%d)", __FUNCTION__, client->getCameraId(), 69669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala strerror(-res), res); 69769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 69869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 69969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 700db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala res = params.updateRequestJpeg(&mCaptureRequest); 701db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala if (res != OK) { 702db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update JPEG entries of capture " 703db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala "request: %s (%d)", __FUNCTION__, client->getCameraId(), 704db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala strerror(-res), res); 705db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala return res; 70669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 70769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 70869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 70969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 71069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 711707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin/*static*/ void CaptureSequencer::shutterNotifyLocked(const Parameters ¶ms, 712786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin sp<Camera2Client> client, int msgType) { 713707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin ATRACE_CALL(); 714707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin 715786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin if (params.state == Parameters::STILL_CAPTURE 716786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin && params.playShutterSound 717786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin && (msgType & CAMERA_MSG_SHUTTER)) { 718707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin client->getCameraService()->playSound(CameraService::SOUND_SHUTTER); 719707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin } 720707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin 721707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin { 722a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Camera2Client::SharedCameraCallbacks::Lock 723a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l(client->mSharedCameraCallbacks); 724707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin 725707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin ALOGV("%s: Notifying of shutter close to client", __FUNCTION__); 726a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin if (l.mRemoteCallback != 0) { 727707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin // ShutterCallback 728a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_SHUTTER, 729707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin /*ext1*/0, /*ext2*/0); 730707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin 731707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin // RawCallback with null buffer 732a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_RAW_IMAGE_NOTIFY, 733707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin /*ext1*/0, /*ext2*/0); 734707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin } else { 735707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin ALOGV("%s: No client!", __FUNCTION__); 736707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin } 737707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin } 738707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin} 739707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin 74069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 74169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace camera2 74269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace android 743