1 /*
2 * Copyright (C) 2017 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_TAG "CamDevSession@3.3-impl"
18 #include <android/log.h>
19
20 #include <set>
21 #include <utils/Trace.h>
22 #include <hardware/gralloc.h>
23 #include <hardware/gralloc1.h>
24 #include "CameraDeviceSession.h"
25
26 namespace android {
27 namespace hardware {
28 namespace camera {
29 namespace device {
30 namespace V3_3 {
31 namespace implementation {
32
CameraDeviceSession(camera3_device_t * device,const camera_metadata_t * deviceInfo,const sp<V3_2::ICameraDeviceCallback> & callback)33 CameraDeviceSession::CameraDeviceSession(
34 camera3_device_t* device,
35 const camera_metadata_t* deviceInfo,
36 const sp<V3_2::ICameraDeviceCallback>& callback) :
37 V3_2::implementation::CameraDeviceSession(device, deviceInfo, callback) {
38 }
39
~CameraDeviceSession()40 CameraDeviceSession::~CameraDeviceSession() {
41 }
42
configureStreams_3_3(const StreamConfiguration & requestedConfiguration,ICameraDeviceSession::configureStreams_3_3_cb _hidl_cb)43 Return<void> CameraDeviceSession::configureStreams_3_3(
44 const StreamConfiguration& requestedConfiguration,
45 ICameraDeviceSession::configureStreams_3_3_cb _hidl_cb) {
46 Status status = initStatus();
47 HalStreamConfiguration outStreams;
48
49 // hold the inflight lock for entire configureStreams scope since there must not be any
50 // inflight request/results during stream configuration.
51 Mutex::Autolock _l(mInflightLock);
52 if (!mInflightBuffers.empty()) {
53 ALOGE("%s: trying to configureStreams while there are still %zu inflight buffers!",
54 __FUNCTION__, mInflightBuffers.size());
55 _hidl_cb(Status::INTERNAL_ERROR, outStreams);
56 return Void();
57 }
58
59 if (!mInflightAETriggerOverrides.empty()) {
60 ALOGE("%s: trying to configureStreams while there are still %zu inflight"
61 " trigger overrides!", __FUNCTION__,
62 mInflightAETriggerOverrides.size());
63 _hidl_cb(Status::INTERNAL_ERROR, outStreams);
64 return Void();
65 }
66
67 if (!mInflightRawBoostPresent.empty()) {
68 ALOGE("%s: trying to configureStreams while there are still %zu inflight"
69 " boost overrides!", __FUNCTION__,
70 mInflightRawBoostPresent.size());
71 _hidl_cb(Status::INTERNAL_ERROR, outStreams);
72 return Void();
73 }
74
75 if (status != Status::OK) {
76 _hidl_cb(status, outStreams);
77 return Void();
78 }
79
80 camera3_stream_configuration_t stream_list{};
81 hidl_vec<camera3_stream_t*> streams;
82 if (!preProcessConfigurationLocked(requestedConfiguration, &stream_list, &streams)) {
83 _hidl_cb(Status::INTERNAL_ERROR, outStreams);
84 return Void();
85 }
86
87 ATRACE_BEGIN("camera3->configure_streams");
88 status_t ret = mDevice->ops->configure_streams(mDevice, &stream_list);
89 ATRACE_END();
90
91 // In case Hal returns error most likely it was not able to release
92 // the corresponding resources of the deleted streams.
93 if (ret == OK) {
94 postProcessConfigurationLocked(requestedConfiguration);
95 } else {
96 postProcessConfigurationFailureLocked(requestedConfiguration);
97 }
98
99 if (ret == -EINVAL) {
100 status = Status::ILLEGAL_ARGUMENT;
101 } else if (ret != OK) {
102 status = Status::INTERNAL_ERROR;
103 } else {
104 convertToHidl(stream_list, &outStreams);
105 mFirstRequest = true;
106 }
107
108 _hidl_cb(status, outStreams);
109 return Void();
110 }
111
112 } // namespace implementation
113 } // namespace V3_3
114 } // namespace device
115 } // namespace camera
116 } // namespace hardware
117 } // namespace android
118