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