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