blob: ea05636534d3fecdb579412bed80bf856875976c [file] [log] [blame]
Jayant Chowdharybe543d42018-08-15 13:16:14 -07001/*
2 * Copyright (C) 2018 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
Jayant Chowdhary2f686522022-05-09 14:52:16 +000017#include <hidl/Utils.h>
18#include <hidl/VndkVersionMetadataTags.h>
Jayant Chowdharybe543d42018-08-15 13:16:14 -070019#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
Jayant Chowdharye0bb61b2018-11-14 23:59:12 -080020#include <cutils/native_handle.h>
21#include <mediautils/AImageReaderUtils.h>
Austin Borger0fb3ad92023-06-01 16:51:35 -070022#include <camera/StringUtils.h>
Jayant Chowdharybe543d42018-08-15 13:16:14 -070023
24namespace android {
25namespace hardware {
26namespace cameraservice {
27namespace utils {
28namespace conversion {
29
30using hardware::graphics::bufferqueue::V1_0::utils::H2BGraphicBufferProducer;
Jayant Chowdharye0bb61b2018-11-14 23:59:12 -080031using aimg::AImageReader_getHGBPFromHandle;
Jayant Chowdharybe543d42018-08-15 13:16:14 -070032
33// Note: existing data in dst will be gone. Caller still owns the memory of src
34void convertToHidl(const camera_metadata_t *src, HCameraMetadata* dst) {
35 if (src == nullptr) {
36 ALOGW("%s:attempt to convert empty metadata to Hidl", __FUNCTION__);
37 return;
38 }
39 size_t size = get_camera_metadata_size(src);
40 dst->setToExternal((uint8_t *) src, size);
41 return;
42}
43
44int32_t convertFromHidl(HStreamConfigurationMode streamConfigurationMode) {
45 switch (streamConfigurationMode) {
46 case HStreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE:
47 return camera2::ICameraDeviceUser::CONSTRAINED_HIGH_SPEED_MODE;
48 case HStreamConfigurationMode::NORMAL_MODE:
49 return camera2::ICameraDeviceUser::NORMAL_MODE;
50 default:
51 // TODO: Fix this
52 return camera2::ICameraDeviceUser::VENDOR_MODE_START;
53 }
54}
55
56int32_t convertFromHidl(HTemplateId templateId) {
57 switch(templateId) {
58 case HTemplateId::PREVIEW:
59 return camera2::ICameraDeviceUser::TEMPLATE_PREVIEW;
60 case HTemplateId::STILL_CAPTURE:
61 return camera2::ICameraDeviceUser::TEMPLATE_STILL_CAPTURE;
62 case HTemplateId::RECORD:
63 return camera2::ICameraDeviceUser::TEMPLATE_RECORD;
64 case HTemplateId::VIDEO_SNAPSHOT:
65 return camera2::ICameraDeviceUser::TEMPLATE_VIDEO_SNAPSHOT;
66 case HTemplateId::ZERO_SHUTTER_LAG:
67 return camera2::ICameraDeviceUser::TEMPLATE_ZERO_SHUTTER_LAG;
68 case HTemplateId::MANUAL:
69 return camera2::ICameraDeviceUser::TEMPLATE_MANUAL;
70 }
71}
72
73int convertFromHidl(HOutputConfiguration::Rotation rotation) {
74 switch(rotation) {
75 case HOutputConfiguration::Rotation::R0:
76 return 0;
77 case HOutputConfiguration::Rotation::R90:
78 return 1;
79 case HOutputConfiguration::Rotation::R180:
80 return 2;
81 case HOutputConfiguration::Rotation::R270:
82 return 3;
83 }
84}
85
86hardware::camera2::params::OutputConfiguration convertFromHidl(
87 const HOutputConfiguration &hOutputConfiguration) {
88 std::vector<sp<IGraphicBufferProducer>> iGBPs;
89 auto &windowHandles = hOutputConfiguration.windowHandles;
90 iGBPs.reserve(windowHandles.size());
91 for (auto &handle : windowHandles) {
92 iGBPs.push_back(new H2BGraphicBufferProducer(AImageReader_getHGBPFromHandle(handle)));
93 }
94 hardware::camera2::params::OutputConfiguration outputConfiguration(
Austin Borger0fb3ad92023-06-01 16:51:35 -070095 iGBPs, convertFromHidl(hOutputConfiguration.rotation),
96 hOutputConfiguration.physicalCameraId,
Jayant Chowdharybe543d42018-08-15 13:16:14 -070097 hOutputConfiguration.windowGroupId, OutputConfiguration::SURFACE_TYPE_UNKNOWN, 0, 0,
98 (windowHandles.size() > 1));
99 return outputConfiguration;
100}
101
Shuzhen Wang24810e72019-03-18 10:55:01 -0700102hardware::camera2::params::SessionConfiguration convertFromHidl(
103 const HSessionConfiguration &hSessionConfiguration) {
104 hardware::camera2::params::SessionConfiguration sessionConfig(
105 hSessionConfiguration.inputWidth, hSessionConfiguration.inputHeight,
106 hSessionConfiguration.inputFormat,
107 static_cast<int>(hSessionConfiguration.operationMode));
108
109 for (const auto& hConfig : hSessionConfiguration.outputStreams) {
110 hardware::camera2::params::OutputConfiguration config = convertFromHidl(hConfig);
111 sessionConfig.addOutputConfiguration(config);
112 }
113
114 return sessionConfig;
115}
116
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700117// The camera metadata here is cloned. Since we're reading metadata over
118// hwbinder we would need to clone it in order to avoid aligment issues.
119bool convertFromHidl(const HCameraMetadata &src, CameraMetadata *dst) {
120 const camera_metadata_t *buffer = reinterpret_cast<const camera_metadata_t*>(src.data());
121 size_t expectedSize = src.size();
Shuzhen Wang639ed122018-12-06 14:42:52 -0800122 if (buffer != nullptr) {
123 int res = validate_camera_metadata_structure(buffer, &expectedSize);
124 if (res == OK || res == CAMERA_METADATA_VALIDATION_SHIFTED) {
125 *dst = buffer;
126 } else {
127 ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__);
128 return false;
129 }
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700130 }
131 return true;
132}
133
134HCameraDeviceStatus convertToHidlCameraDeviceStatus(int32_t status) {
135 HCameraDeviceStatus deviceStatus = HCameraDeviceStatus::STATUS_UNKNOWN;
136 switch(status) {
137 case hardware::ICameraServiceListener::STATUS_NOT_PRESENT:
138 deviceStatus = HCameraDeviceStatus::STATUS_NOT_PRESENT;
139 break;
140 case hardware::ICameraServiceListener::STATUS_PRESENT:
141 deviceStatus = HCameraDeviceStatus::STATUS_PRESENT;
142 break;
143 case hardware::ICameraServiceListener::STATUS_ENUMERATING:
144 deviceStatus = HCameraDeviceStatus::STATUS_ENUMERATING;
145 break;
146 case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE:
147 deviceStatus = HCameraDeviceStatus::STATUS_NOT_AVAILABLE;
148 break;
149 default:
150 break;
151 }
152 return deviceStatus;
153}
154
155HCaptureResultExtras convertToHidl(const CaptureResultExtras &captureResultExtras) {
156 HCaptureResultExtras hCaptureResultExtras;
Jayant Chowdhary70da5772018-11-20 18:50:31 -0800157 hCaptureResultExtras.requestId = captureResultExtras.requestId;
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700158 hCaptureResultExtras.burstId = captureResultExtras.burstId;
159 hCaptureResultExtras.frameNumber = captureResultExtras.frameNumber;
160 hCaptureResultExtras.partialResultCount = captureResultExtras.partialResultCount;
161 hCaptureResultExtras.errorStreamId = captureResultExtras.errorStreamId;
Austin Borger0fb3ad92023-06-01 16:51:35 -0700162 hCaptureResultExtras.errorPhysicalCameraId = hidl_string(
163 captureResultExtras.errorPhysicalCameraId.c_str());
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700164 return hCaptureResultExtras;
165}
166
167HErrorCode convertToHidl(int32_t errorCode) {
168 switch(errorCode) {
169 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISCONNECTED:
170 return HErrorCode::CAMERA_DISCONNECTED;
171 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE :
172 return HErrorCode::CAMERA_DEVICE;
173 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_SERVICE:
174 return HErrorCode::CAMERA_SERVICE;
175 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST:
176 return HErrorCode::CAMERA_REQUEST;
177 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT:
178 return HErrorCode::CAMERA_RESULT;
179 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER:
180 return HErrorCode::CAMERA_BUFFER;
181 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISABLED:
182 return HErrorCode::CAMERA_DISABLED;
183 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_INVALID_ERROR:
184 return HErrorCode::CAMERA_INVALID_ERROR;
185 default:
186 return HErrorCode::CAMERA_UNKNOWN_ERROR;
187 }
188}
189
190void convertToHidl(const std::vector<hardware::CameraStatus> &src,
191 hidl_vec<HCameraStatusAndId>* dst) {
192 dst->resize(src.size());
193 size_t i = 0;
194 for (auto &statusAndId : src) {
195 auto &a = (*dst)[i++];
Austin Borger0fb3ad92023-06-01 16:51:35 -0700196 a.cameraId = statusAndId.cameraId;
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700197 a.deviceStatus = convertToHidlCameraDeviceStatus(statusAndId.status);
198 }
199 return;
200}
201
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800202void convertToHidl(const std::vector<hardware::CameraStatus> &src,
203 hidl_vec<frameworks::cameraservice::service::V2_1::CameraStatusAndId>* dst) {
204 dst->resize(src.size());
205 size_t i = 0;
206 for (const auto &statusAndId : src) {
207 auto &a = (*dst)[i++];
Austin Borger0fb3ad92023-06-01 16:51:35 -0700208 a.v2_0.cameraId = statusAndId.cameraId;
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800209 a.v2_0.deviceStatus = convertToHidlCameraDeviceStatus(statusAndId.status);
210 size_t numUnvailPhysicalCameras = statusAndId.unavailablePhysicalIds.size();
211 a.unavailPhysicalCameraIds.resize(numUnvailPhysicalCameras);
212 for (size_t j = 0; j < numUnvailPhysicalCameras; j++) {
Austin Borger0fb3ad92023-06-01 16:51:35 -0700213 a.unavailPhysicalCameraIds[j] = statusAndId.unavailablePhysicalIds[j];
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800214 }
215 }
216 return;
217}
218
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700219void convertToHidl(
220 const hardware::camera2::utils::SubmitInfo &submitInfo,
221 frameworks::cameraservice::device::V2_0::SubmitInfo *hSubmitInfo) {
222 hSubmitInfo->requestId = submitInfo.mRequestId;
223 hSubmitInfo->lastFrameNumber = submitInfo.mLastFrameNumber;
224}
225
226HStatus B2HStatus(const binder::Status &bStatus) {
227 HStatus status = HStatus::NO_ERROR;
228 if (bStatus.isOk()) {
229 // NO Error here
230 return status;
231 }
232 switch(bStatus.serviceSpecificErrorCode()) {
233 case hardware::ICameraService::ERROR_DISCONNECTED:
234 status = HStatus::DISCONNECTED;
235 break;
236 case hardware::ICameraService::ERROR_CAMERA_IN_USE:
237 status = HStatus::CAMERA_IN_USE;
238 break;
239 case hardware::ICameraService::ERROR_MAX_CAMERAS_IN_USE:
240 status = HStatus::MAX_CAMERAS_IN_USE;
241 break;
242 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
243 status = HStatus::ILLEGAL_ARGUMENT;
244 break;
245 case hardware::ICameraService::ERROR_DEPRECATED_HAL:
246 // Should not reach here since we filtered legacy HALs earlier
247 status = HStatus::DEPRECATED_HAL;
248 break;
249 case hardware::ICameraService::ERROR_DISABLED:
250 status = HStatus::DISABLED;
251 break;
252 case hardware::ICameraService::ERROR_PERMISSION_DENIED:
253 status = HStatus::PERMISSION_DENIED;
254 break;
255 case hardware::ICameraService::ERROR_INVALID_OPERATION:
256 status = HStatus::INVALID_OPERATION;
257 break;
258 default:
259 status = HStatus::UNKNOWN_ERROR;
260 break;
261 }
262 return status;
263}
264
Jayant Chowdhary0c947272018-08-15 14:42:04 -0700265HPhysicalCaptureResultInfo convertToHidl(
266 const PhysicalCaptureResultInfo &physicalCaptureResultInfo,
267 std::shared_ptr<CaptureResultMetadataQueue> &captureResultMetadataQueue) {
268 HPhysicalCaptureResultInfo hPhysicalCaptureResultInfo;
269 hPhysicalCaptureResultInfo.physicalCameraId =
Austin Borger0fb3ad92023-06-01 16:51:35 -0700270 toString8(physicalCaptureResultInfo.mPhysicalCameraId);
Jayant Chowdhary0c947272018-08-15 14:42:04 -0700271 const camera_metadata_t *rawMetadata =
272 physicalCaptureResultInfo.mPhysicalCameraMetadata.getAndLock();
273 // Try using fmq at first.
274 size_t metadata_size = get_camera_metadata_size(rawMetadata);
275 if ((metadata_size > 0) && (captureResultMetadataQueue->availableToWrite() > 0)) {
276 if (captureResultMetadataQueue->write((uint8_t *)rawMetadata, metadata_size)) {
277 hPhysicalCaptureResultInfo.physicalCameraMetadata.fmqMetadataSize(metadata_size);
278 } else {
279 ALOGW("%s Couldn't use fmq, falling back to hwbinder", __FUNCTION__);
280 HCameraMetadata metadata;
281 convertToHidl(rawMetadata, &metadata);
282 hPhysicalCaptureResultInfo.physicalCameraMetadata.metadata(std::move(metadata));
283 }
284 }
285 physicalCaptureResultInfo.mPhysicalCameraMetadata.unlock(rawMetadata);
286 return hPhysicalCaptureResultInfo;
287}
288
289hidl_vec<HPhysicalCaptureResultInfo> convertToHidl(
290 const std::vector<PhysicalCaptureResultInfo> &physicalCaptureResultInfos,
291 std::shared_ptr<CaptureResultMetadataQueue> &captureResultMetadataQueue) {
292 hidl_vec<HPhysicalCaptureResultInfo> hPhysicalCaptureResultInfos;
293 hPhysicalCaptureResultInfos.resize(physicalCaptureResultInfos.size());
294 size_t i = 0;
295 for (auto &physicalCaptureResultInfo : physicalCaptureResultInfos) {
296 hPhysicalCaptureResultInfos[i++] = convertToHidl(physicalCaptureResultInfo,
297 captureResultMetadataQueue);
298 }
299 return hPhysicalCaptureResultInfos;
300}
301
Jayant Chowdhary2f686522022-05-09 14:52:16 +0000302status_t filterVndkKeys(int vndkVersion, CameraMetadata &metadata, bool isStatic) {
303 if (vndkVersion == __ANDROID_API_FUTURE__) {
304 // VNDK version in ro.vndk.version is a version code-name that
305 // corresponds to the current version.
306 return OK;
307 }
308 const auto &apiLevelToKeys =
309 isStatic ? static_api_level_to_keys : dynamic_api_level_to_keys;
310 // Find the vndk versions above the given vndk version. All the vndk
311 // versions above the given one, need to have their keys filtered from the
312 // metadata in order to avoid metadata invalidation.
313 auto it = apiLevelToKeys.upper_bound(vndkVersion);
314 while (it != apiLevelToKeys.end()) {
315 for (const auto &key : it->second) {
316 status_t res = metadata.erase(key);
317 if (res != OK) {
318 ALOGE("%s metadata key %d could not be erased", __FUNCTION__, key);
319 return res;
320 }
321 }
322 it++;
323 }
324 return OK;
325}
326
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700327} //conversion
328} // utils
329} //cameraservice
330} // hardware
331} // android