ACameraCaptureSession.cpp revision 085dd0935c9cd19791a9a58a4df4a05e29eadca7
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 93ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia YehACameraCaptureSession::setRepeatingRequest( 94ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh /*optional*/ACameraCaptureSession_captureCallbacks* cbs, 95ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh int numRequests, ACaptureRequest** requests, 96ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh /*optional*/int* captureSequenceId) { 97ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh sp<CameraDevice> dev = getDeviceSp(); 98ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (dev == nullptr) { 99ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("Error: Device associated with session %p has been closed!", this); 100ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return ACAMERA_ERROR_SESSION_CLOSED; 101ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 102ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 103ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh camera_status_t ret; 104ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh dev->lockDeviceForSessionOps(); 105ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh { 106ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh Mutex::Autolock _l(mSessionLock); 107ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ret = dev->setRepeatingRequestsLocked( 108ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh this, cbs, numRequests, requests, captureSequenceId); 109ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 110ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh dev->unlockDevice(); 111ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return ret; 112ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh} 113ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 114ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehcamera_status_t ACameraCaptureSession::capture( 115ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh /*optional*/ACameraCaptureSession_captureCallbacks* cbs, 116ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh int numRequests, ACaptureRequest** requests, 117ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh /*optional*/int* captureSequenceId) { 118ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh sp<CameraDevice> dev = getDeviceSp(); 119ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (dev == nullptr) { 120ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("Error: Device associated with session %p has been closed!", this); 121ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return ACAMERA_ERROR_SESSION_CLOSED; 122ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 123ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh camera_status_t ret; 124ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh dev->lockDeviceForSessionOps(); 125ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh { 126ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh Mutex::Autolock _l(mSessionLock); 127ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ret = dev->captureLocked(this, cbs, numRequests, requests, captureSequenceId); 128ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 129ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh dev->unlockDevice(); 130ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return ret; 131ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh} 132ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 133ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia YehACameraDevice* 134ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia YehACameraCaptureSession::getDevice() { 135ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh Mutex::Autolock _l(mSessionLock); 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 nullptr; 140ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 141ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return dev->getWrapper(); 142ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh} 143ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 144ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehvoid 145ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia YehACameraCaptureSession::closeByDevice() { 146ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh Mutex::Autolock _l(mSessionLock); 147ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh mIsClosed = true; 148ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh} 149ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 150ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehsp<CameraDevice> 151ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia YehACameraCaptureSession::getDeviceSp() { 152ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh sp<CameraDevice> device = mDevice.promote(); 153ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (device == nullptr || device->isClosed()) { 154ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGW("Device is closed but session %d is not notified", mId); 155ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return nullptr; 156ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 157ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return device; 158ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh} 159ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 160ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh 161