1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 //#define LOG_NDEBUG 0
18 #define LOG_TAG "ACameraCaptureSession"
19 
20 #include "ACameraCaptureSession.h"
21 
22 using namespace android;
23 
~ACameraCaptureSession()24 ACameraCaptureSession::~ACameraCaptureSession() {
25     ALOGV("~ACameraCaptureSession: %p notify device end of life", this);
26     sp<acam::CameraDevice> dev = getDeviceSp();
27     if (dev != nullptr && !dev->isClosed()) {
28         dev->lockDeviceForSessionOps();
29         {
30             Mutex::Autolock _l(mSessionLock);
31             dev->notifySessionEndOfLifeLocked(this);
32         }
33         dev->unlockDevice();
34     }
35     // Fire onClosed callback
36     (*mUserSessionCallback.onClosed)(mUserSessionCallback.context, this);
37     ALOGV("~ACameraCaptureSession: %p is deleted", this);
38 }
39 
40 void
closeByApp()41 ACameraCaptureSession::closeByApp() {
42     {
43         Mutex::Autolock _l(mSessionLock);
44         if (mClosedByApp) {
45             // Do not close twice
46             return;
47         }
48         mClosedByApp = true;
49     }
50 
51     sp<acam::CameraDevice> dev = getDeviceSp();
52     if (dev != nullptr) {
53         dev->lockDeviceForSessionOps();
54     }
55 
56     {
57         Mutex::Autolock _l(mSessionLock);
58 
59         if (!mIsClosed && dev != nullptr) {
60             camera_status_t ret = dev->stopRepeatingLocked();
61             if (ret != ACAMERA_OK) {
62                 ALOGE("Stop repeating request failed while closing session %p", this);
63             }
64         }
65         mIsClosed = true;
66     }
67 
68     if (dev != nullptr) {
69         dev->unlockDevice();
70     }
71     this->decStrong((void*) ACameraDevice_createCaptureSession);
72 }
73 
74 camera_status_t
stopRepeating()75 ACameraCaptureSession::stopRepeating() {
76     sp<acam::CameraDevice> dev = getDeviceSp();
77     if (dev == nullptr) {
78         ALOGE("Error: Device associated with session %p has been closed!", this);
79         return ACAMERA_ERROR_SESSION_CLOSED;
80     }
81 
82     camera_status_t ret;
83     dev->lockDeviceForSessionOps();
84     {
85         Mutex::Autolock _l(mSessionLock);
86         ret = dev->stopRepeatingLocked();
87     }
88     dev->unlockDevice();
89     return ret;
90 }
91 
92 camera_status_t
abortCaptures()93 ACameraCaptureSession::abortCaptures() {
94     sp<acam::CameraDevice> dev = getDeviceSp();
95     if (dev == nullptr) {
96         ALOGE("Error: Device associated with session %p has been closed!", this);
97         return ACAMERA_ERROR_SESSION_CLOSED;
98     }
99 
100     camera_status_t ret;
101     dev->lockDeviceForSessionOps();
102     {
103         Mutex::Autolock _l(mSessionLock);
104         ret = dev->flushLocked(this);
105     }
106     dev->unlockDevice();
107     return ret;
108 }
109 
updateOutputConfiguration(ACaptureSessionOutput * output)110 camera_status_t ACameraCaptureSession::updateOutputConfiguration(ACaptureSessionOutput *output) {
111     sp<acam::CameraDevice> dev = getDeviceSp();
112     if (dev == nullptr) {
113         ALOGE("Error: Device associated with session %p has been closed!", this);
114         return ACAMERA_ERROR_SESSION_CLOSED;
115     }
116 
117     camera_status_t ret;
118     dev->lockDeviceForSessionOps();
119     {
120         Mutex::Autolock _l(mSessionLock);
121         ret = dev->updateOutputConfigurationLocked(output);
122     }
123     dev->unlockDevice();
124     return ret;
125 }
126 
127 ACameraDevice*
getDevice()128 ACameraCaptureSession::getDevice() {
129     Mutex::Autolock _l(mSessionLock);
130     sp<acam::CameraDevice> dev = getDeviceSp();
131     if (dev == nullptr) {
132         ALOGE("Error: Device associated with session %p has been closed!", this);
133         return nullptr;
134     }
135     return dev->getWrapper();
136 }
137 
138 void
closeByDevice()139 ACameraCaptureSession::closeByDevice() {
140     Mutex::Autolock _l(mSessionLock);
141     mIsClosed = true;
142 }
143 
144 sp<acam::CameraDevice>
getDeviceSp()145 ACameraCaptureSession::getDeviceSp() {
146     sp<acam::CameraDevice> device = mDevice.promote();
147     if (device == nullptr || device->isClosed()) {
148         ALOGW("Device is closed but session %d is not notified", mId);
149         return nullptr;
150     }
151     return device;
152 }
153 
154 
155