blob: b9f1224179ca2f3d7622fdc4ad19a412a8b60287 [file] [log] [blame]
Avichal Rakeshfcb78cb2022-10-27 15:45:54 -07001/*
2 * Copyright (C) 2022 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 "AidlCameraDeviceUser"
18
19#include "AidlCameraDeviceUser.h"
20#include <aidl/AidlUtils.h>
21#include <aidl/android/frameworks/cameraservice/device/CaptureMetadataInfo.h>
22
23namespace android::frameworks::cameraservice::device::implementation {
24
25// VNDK classes
26using SCaptureMetadataInfo = ::aidl::android::frameworks::cameraservice::device::CaptureMetadataInfo;
27// NDK classes
28using UOutputConfiguration = ::android::hardware::camera2::params::OutputConfiguration;
29using USessionConfiguration = ::android::hardware::camera2::params::SessionConfiguration;
30using UStatus = ::android::binder::Status;
31using USubmitInfo = ::android::hardware::camera2::utils::SubmitInfo;
32
33using ::android::CameraMetadata;
34using ::android::hardware::cameraservice::utils::conversion::aidl::cloneFromAidl;
35using ::android::hardware::cameraservice::utils::conversion::aidl::cloneToAidl;
36using ::android::hardware::cameraservice::utils::conversion::aidl::convertFromAidl;
37using ::android::hardware::cameraservice::utils::conversion::aidl::convertToAidl;
38using ::android::hardware::cameraservice::utils::conversion::aidl::convertToAidl;
39using ::ndk::ScopedAStatus;
40
41namespace {
42constexpr int32_t CAMERA_REQUEST_METADATA_QUEUE_SIZE = 1 << 20 /* 1 MB */;
43constexpr int32_t CAMERA_RESULT_METADATA_QUEUE_SIZE = 1 << 20 /* 1 MB */;
44
45inline ScopedAStatus fromSStatus(const SStatus& s) {
46 return s == SStatus::NO_ERROR ? ScopedAStatus::ok()
47 : ScopedAStatus::fromServiceSpecificError(
48 static_cast<int32_t>(s));
49}
50inline ScopedAStatus fromUStatus(const UStatus& status) {
51 return status.isOk() ? ScopedAStatus::ok() : fromSStatus(convertToAidl(status));
52}
53} // anonymous namespace
54
55AidlCameraDeviceUser::AidlCameraDeviceUser(const sp<UICameraDeviceUser>& deviceRemote):
56 mDeviceRemote(deviceRemote) {
57 mInitSuccess = initDevice();
58}
Jayant Chowdhary09b368b2023-02-13 06:53:05 +000059
Avichal Rakeshfcb78cb2022-10-27 15:45:54 -070060bool AidlCameraDeviceUser::initDevice() {
61 // TODO: Get request and result metadata queue size from a system property.
62 int32_t reqFMQSize = CAMERA_REQUEST_METADATA_QUEUE_SIZE;
63
64 mCaptureRequestMetadataQueue =
65 std::make_unique<CaptureRequestMetadataQueue>(static_cast<size_t>(reqFMQSize),
66 false /* non blocking */);
67 if (!mCaptureRequestMetadataQueue->isValid()) {
68 ALOGE("%s: invalid request fmq", __FUNCTION__);
69 return false;
70 }
71
72 int32_t resFMQSize = CAMERA_RESULT_METADATA_QUEUE_SIZE;
73 mCaptureResultMetadataQueue =
74 std::make_shared<CaptureResultMetadataQueue>(static_cast<size_t>(resFMQSize),
75 false /* non blocking */);
76 if (!mCaptureResultMetadataQueue->isValid()) {
77 ALOGE("%s: invalid result fmq", __FUNCTION__);
78 return false;
79 }
80 return true;
81}
82
83ndk::ScopedAStatus AidlCameraDeviceUser::getCaptureRequestMetadataQueue(
84 MQDescriptor<int8_t, SynchronizedReadWrite>* _aidl_return) {
85 if (mInitSuccess) {
86 *_aidl_return = mCaptureRequestMetadataQueue->dupeDesc();
87 }
88 return ScopedAStatus::ok();
89}
90
91ndk::ScopedAStatus AidlCameraDeviceUser::getCaptureResultMetadataQueue(
92 MQDescriptor<int8_t, SynchronizedReadWrite>* _aidl_return) {
93 if (mInitSuccess) {
94 *_aidl_return = mCaptureResultMetadataQueue->dupeDesc();
95 }
96 return ScopedAStatus::ok();
97}
98
Jayant Chowdhary09b368b2023-02-13 06:53:05 +000099ndk::ScopedAStatus AidlCameraDeviceUser::prepare(int32_t in_streamId) {
100 UStatus ret = mDeviceRemote->prepare(in_streamId);
101 return fromUStatus(ret);
102}
103
Avichal Rakeshfcb78cb2022-10-27 15:45:54 -0700104ndk::ScopedAStatus AidlCameraDeviceUser::submitRequestList(
105 const std::vector<SCaptureRequest>& in_requestList, bool in_isRepeating,
106 SSubmitInfo* _aidl_return) {
107 USubmitInfo submitInfo;
108 std::vector<UCaptureRequest> requests;
109 for (const auto& req: in_requestList) {
110 requests.emplace_back();
111 if (!convertRequestFromAidl(req, &requests.back())) {
112 ALOGE("%s: Failed to convert AIDL CaptureRequest.", __FUNCTION__);
113 return fromSStatus(SStatus::ILLEGAL_ARGUMENT);
114 }
115 }
116 UStatus ret = mDeviceRemote->submitRequestList(requests,
117 in_isRepeating, &submitInfo);
118 if (!ret.isOk()) {
119 ALOGE("%s: Failed submitRequestList to cameraservice: %s",
120 __FUNCTION__, ret.toString8().string());
121 return fromUStatus(ret);
122 }
123 mRequestId = submitInfo.mRequestId;
124 convertToAidl(submitInfo, _aidl_return);
125 return ScopedAStatus::ok();
126}
127
128ndk::ScopedAStatus AidlCameraDeviceUser::cancelRepeatingRequest(int64_t* _aidl_return) {
129 UStatus ret = mDeviceRemote->cancelRequest(mRequestId, _aidl_return);
130 return fromUStatus(ret);
131}
132
133ScopedAStatus AidlCameraDeviceUser::beginConfigure() {
134 UStatus ret = mDeviceRemote->beginConfigure();
135 return fromUStatus(ret);
136}
137
138ndk::ScopedAStatus AidlCameraDeviceUser::endConfigure(SStreamConfigurationMode in_operatingMode,
139 const SCameraMetadata& in_sessionParams,
140 int64_t in_startTimeNs) {
141 CameraMetadata metadata;
142 if (!cloneFromAidl(in_sessionParams, &metadata)) {
143 return fromSStatus(SStatus::ILLEGAL_ARGUMENT);
144 }
145
146 std::vector<int32_t> offlineStreamIds;
147 UStatus ret = mDeviceRemote->endConfigure(convertFromAidl(in_operatingMode),
148 metadata, in_startTimeNs,
149 &offlineStreamIds);
150 return fromUStatus(ret);
151}
152
153ndk::ScopedAStatus AidlCameraDeviceUser::createStream(
154 const SOutputConfiguration& in_outputConfiguration, int32_t* _aidl_return) {
155 UOutputConfiguration outputConfig = convertFromAidl(in_outputConfiguration);
156 int32_t newStreamId;
157 UStatus ret = mDeviceRemote->createStream(outputConfig, &newStreamId);
158 if (!ret.isOk()) {
159 ALOGE("%s: Failed to create stream: %s", __FUNCTION__, ret.toString8().string());
160 }
161 *_aidl_return = newStreamId;
162 return fromUStatus(ret);
163}
164
165ndk::ScopedAStatus AidlCameraDeviceUser::createDefaultRequest(STemplateId in_templateId,
166 SCameraMetadata* _aidl_return) {
167 CameraMetadata metadata;
168 UStatus ret = mDeviceRemote->createDefaultRequest(convertFromAidl(in_templateId),
169 &metadata);
170 if (!ret.isOk()) {
171 ALOGE("%s: Failed to create default request: %s", __FUNCTION__, ret.toString8().string());
172 return fromUStatus(ret);
173 }
174 const camera_metadata_t* rawMetadata = metadata.getAndLock();
175 cloneToAidl(rawMetadata, _aidl_return);
176 metadata.unlock(rawMetadata);
177 return ScopedAStatus::ok();
178}
179
180ndk::ScopedAStatus AidlCameraDeviceUser::waitUntilIdle() {
181 UStatus ret = mDeviceRemote->waitUntilIdle();
182 return fromUStatus(ret);
183}
184
185ndk::ScopedAStatus AidlCameraDeviceUser::flush(int64_t* _aidl_return) {
186 UStatus ret = mDeviceRemote->flush(_aidl_return);
187 return fromUStatus(ret);
188}
189
190ndk::ScopedAStatus AidlCameraDeviceUser::updateOutputConfiguration(
191 int32_t in_streamId, const SOutputConfiguration& in_outputConfiguration) {
192 UOutputConfiguration outputConfig = convertFromAidl(in_outputConfiguration);
193 UStatus ret = mDeviceRemote->updateOutputConfiguration(in_streamId, outputConfig);
194 if (!ret.isOk()) {
195 ALOGE("%s: Failed to update output config for stream id: %d: %s",
196 __FUNCTION__, in_streamId, ret.toString8().string());
197 }
198 return fromUStatus(ret);
199}
200ndk::ScopedAStatus AidlCameraDeviceUser::isSessionConfigurationSupported(
201 const SSessionConfiguration& in_sessionConfiguration, bool* _aidl_return) {
202 USessionConfiguration sessionConfig = convertFromAidl(in_sessionConfiguration);
203 UStatus ret = mDeviceRemote->isSessionConfigurationSupported(sessionConfig,
204 _aidl_return);
205 return fromUStatus(ret);
206}
207ndk::ScopedAStatus AidlCameraDeviceUser::deleteStream(int32_t in_streamId) {
208 UStatus ret = mDeviceRemote->deleteStream(in_streamId);
209 return fromUStatus(ret);
210}
211ndk::ScopedAStatus AidlCameraDeviceUser::disconnect() {
212 UStatus ret = mDeviceRemote->disconnect();
213 return fromUStatus(ret);
214}
215bool AidlCameraDeviceUser::convertRequestFromAidl(
216 const SCaptureRequest& src, UCaptureRequest* dst) {
217 dst->mIsReprocess = false;
218 for (const auto& streamAndWindowId : src.streamAndWindowIds) {
219 dst->mStreamIdxList.push_back(streamAndWindowId.streamId);
220 dst->mSurfaceIdxList.push_back(streamAndWindowId.windowId);
221 }
222
223 return copyPhysicalCameraSettings(src.physicalCameraSettings,
224 &(dst->mPhysicalCameraSettings));
225}
226bool AidlCameraDeviceUser::copyPhysicalCameraSettings(
227 const std::vector<SPhysicalCameraSettings>& src,
228 std::vector<UCaptureRequest::PhysicalCameraSettings>* dst) {
229 bool converted = false;
230 for (auto &e : src) {
231 dst->emplace_back();
232 CaptureRequest::PhysicalCameraSettings &physicalCameraSetting =
233 dst->back();
234 physicalCameraSetting.id = e.id;
235
236 // Read the settings either from the fmq or straightaway from the
237 // request. We don't need any synchronization, since submitRequestList
238 // is guaranteed to be called serially by the client if it decides to
239 // use fmq.
240 if (e.settings.getTag() == SCaptureMetadataInfo::fmqMetadataSize) {
241 /**
242 * Get settings from the fmq.
243 */
244 SCameraMetadata settingsFmq;
245 int64_t metadataSize = e.settings.get<SCaptureMetadataInfo::fmqMetadataSize>();
246 settingsFmq.metadata.resize(metadataSize);
247 int8_t* metadataPtr = (int8_t*) settingsFmq.metadata.data();
248 bool read = mCaptureRequestMetadataQueue->read(metadataPtr,
249 metadataSize);
250 if (!read) {
251 ALOGE("%s capture request settings could't be read from fmq size", __FUNCTION__);
252 converted = false;
253 } else {
254 converted = cloneFromAidl(settingsFmq, &physicalCameraSetting.settings);
255 }
256 } else {
257 /**
258 * The settings metadata is contained in request settings field.
259 */
260 converted = cloneFromAidl(e.settings.get<SCaptureMetadataInfo::metadata>(),
261 &physicalCameraSetting.settings);
262 }
263 if (!converted) {
264 ALOGE("%s: Unable to convert physicalCameraSettings from HIDL to AIDL.", __FUNCTION__);
265 return false;
266 }
267 }
268 return true;
269}
270
271} // namespace android::frameworks::cameraservice::device::implementation