ACameraCaptureSession.cpp revision 309d05d030903e7849affd60c58d4236147aa390
1ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh/* 2ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh * Copyright (C) 2016 The Android Open Source Project 3ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh * 4ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh * Licensed under the Apache License, Version 2.0 (the "License"); 5ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh * you may not use this file except in compliance with the License. 6ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh * You may obtain a copy of the License at 7ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh * 8ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh * http://www.apache.org/licenses/LICENSE-2.0 9ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh * 10ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh * Unless required by applicable law or agreed to in writing, software 11ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh * distributed under the License is distributed on an "AS IS" BASIS, 12ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh * See the License for the specific language governing permissions and 14ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh * limitations under the License. 15ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh */ 16ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 17ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh//#define LOG_NDEBUG 0 18ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh#define LOG_TAG "ACameraCaptureSession" 19ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 20ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh#include "ACameraCaptureSession.h" 21ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 22ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehusing namespace android; 23ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 24ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia YehACameraCaptureSession::~ACameraCaptureSession() { 25ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGV("~ACameraCaptureSession: %p notify device end of life", this); 26ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh sp<CameraDevice> dev = getDeviceSp(); 27ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (dev != nullptr && !dev->isClosed()) { 28ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh dev->lockDeviceForSessionOps(); 29ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh { 30ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh Mutex::Autolock _l(mSessionLock); 31ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh dev->notifySessionEndOfLifeLocked(this); 32ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 33ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh dev->unlockDevice(); 34ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 35ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh // Fire onClosed callback 36ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh (*mUserSessionCallback.onClosed)(mUserSessionCallback.context, this); 37ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGV("~ACameraCaptureSession: %p is deleted", this); 38ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh} 39ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 40ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehvoid 41ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia YehACameraCaptureSession::closeByApp() { 42085dd0935c9cd19791a9a58a4df4a05e29eadca7Yin-Chia Yeh { 43085dd0935c9cd19791a9a58a4df4a05e29eadca7Yin-Chia Yeh Mutex::Autolock _l(mSessionLock); 44085dd0935c9cd19791a9a58a4df4a05e29eadca7Yin-Chia Yeh if (mClosedByApp) { 45085dd0935c9cd19791a9a58a4df4a05e29eadca7Yin-Chia Yeh // Do not close twice 46085dd0935c9cd19791a9a58a4df4a05e29eadca7Yin-Chia Yeh return; 47085dd0935c9cd19791a9a58a4df4a05e29eadca7Yin-Chia Yeh } 48085dd0935c9cd19791a9a58a4df4a05e29eadca7Yin-Chia Yeh mClosedByApp = true; 49085dd0935c9cd19791a9a58a4df4a05e29eadca7Yin-Chia Yeh } 50085dd0935c9cd19791a9a58a4df4a05e29eadca7Yin-Chia Yeh 51ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh sp<CameraDevice> dev = getDeviceSp(); 52ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (dev != nullptr) { 53ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh dev->lockDeviceForSessionOps(); 54ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 55ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 56ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh { 57ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh Mutex::Autolock _l(mSessionLock); 58ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 59ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (!mIsClosed && dev != nullptr) { 60ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh camera_status_t ret = dev->stopRepeatingLocked(); 61ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (ret != ACAMERA_OK) { 62ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("Stop repeating request failed while closing session %p", this); 63ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 64ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 65ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh mIsClosed = true; 66ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 67ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 68ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (dev != nullptr) { 69ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh dev->unlockDevice(); 70ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 71ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh this->decStrong((void*) ACameraDevice_createCaptureSession); 72ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh} 73ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 74ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehcamera_status_t 75ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia YehACameraCaptureSession::stopRepeating() { 76ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh sp<CameraDevice> dev = getDeviceSp(); 77ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (dev == nullptr) { 78ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("Error: Device associated with session %p has been closed!", this); 79ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return ACAMERA_ERROR_SESSION_CLOSED; 80ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 81ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 82ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh camera_status_t ret; 83ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh dev->lockDeviceForSessionOps(); 84ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh { 85ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh Mutex::Autolock _l(mSessionLock); 86ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ret = dev->stopRepeatingLocked(); 87ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 88ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh dev->unlockDevice(); 89ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return ret; 90ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh} 91ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 92ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehcamera_status_t 93309d05d030903e7849affd60c58d4236147aa390Yin-Chia YehACameraCaptureSession::abortCaptures() { 94309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh sp<CameraDevice> dev = getDeviceSp(); 95309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh if (dev == nullptr) { 96309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh ALOGE("Error: Device associated with session %p has been closed!", this); 97309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh return ACAMERA_ERROR_SESSION_CLOSED; 98309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh } 99309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh 100309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh camera_status_t ret; 101309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh dev->lockDeviceForSessionOps(); 102309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh { 103309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh Mutex::Autolock _l(mSessionLock); 104309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh ret = dev->flushLocked(this); 105309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh } 106309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh dev->unlockDevice(); 107309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh return ret; 108309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh} 109309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yeh 110309d05d030903e7849affd60c58d4236147aa390Yin-Chia Yehcamera_status_t 111ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia YehACameraCaptureSession::setRepeatingRequest( 112ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh /*optional*/ACameraCaptureSession_captureCallbacks* cbs, 113ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh int numRequests, ACaptureRequest** requests, 114ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh /*optional*/int* captureSequenceId) { 115ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh sp<CameraDevice> dev = getDeviceSp(); 116ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (dev == nullptr) { 117ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("Error: Device associated with session %p has been closed!", this); 118ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return ACAMERA_ERROR_SESSION_CLOSED; 119ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 120ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 121ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh camera_status_t ret; 122ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh dev->lockDeviceForSessionOps(); 123ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh { 124ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh Mutex::Autolock _l(mSessionLock); 125ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ret = dev->setRepeatingRequestsLocked( 126ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh this, cbs, numRequests, requests, captureSequenceId); 127ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 128ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh dev->unlockDevice(); 129ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return ret; 130ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh} 131ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 132ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehcamera_status_t ACameraCaptureSession::capture( 133ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh /*optional*/ACameraCaptureSession_captureCallbacks* cbs, 134ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh int numRequests, ACaptureRequest** requests, 135ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh /*optional*/int* captureSequenceId) { 136ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh sp<CameraDevice> dev = getDeviceSp(); 137ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (dev == nullptr) { 138ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("Error: Device associated with session %p has been closed!", this); 139ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return ACAMERA_ERROR_SESSION_CLOSED; 140ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 141ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh camera_status_t ret; 142ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh dev->lockDeviceForSessionOps(); 143ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh { 144ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh Mutex::Autolock _l(mSessionLock); 145ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ret = dev->captureLocked(this, cbs, numRequests, requests, captureSequenceId); 146ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 147ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh dev->unlockDevice(); 148ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return ret; 149ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh} 150ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 151ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia YehACameraDevice* 152ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia YehACameraCaptureSession::getDevice() { 153ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh Mutex::Autolock _l(mSessionLock); 154ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh sp<CameraDevice> dev = getDeviceSp(); 155ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (dev == nullptr) { 156ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("Error: Device associated with session %p has been closed!", this); 157ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return nullptr; 158ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 159ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return dev->getWrapper(); 160ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh} 161ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 162ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehvoid 163ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia YehACameraCaptureSession::closeByDevice() { 164ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh Mutex::Autolock _l(mSessionLock); 165ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh mIsClosed = true; 166ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh} 167ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 168ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehsp<CameraDevice> 169ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia YehACameraCaptureSession::getDeviceSp() { 170ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh sp<CameraDevice> device = mDevice.promote(); 171ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (device == nullptr || device->isClosed()) { 172ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGW("Device is closed but session %d is not notified", mId); 173ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return nullptr; 174ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 175ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return device; 176ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh} 177ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 178ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 179