blob: 62b4f82389e1915fc00269b561ec50c295a36935 [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
Austin Borger0fb3ad92023-06-01 16:51:35 -070017#include <camera/StringUtils.h>
Carlos Martinez Romeroc45bc932024-10-09 15:04:51 -070018#include <cutils/native_handle.h>
19#include <gui/Flags.h> // remove with WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
20#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
21#include <hidl/Utils.h>
22#include <mediautils/AImageReaderUtils.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) {
Carlos Martinez Romeroc45bc932024-10-09 15:04:51 -070088 std::vector<ParcelableSurfaceType> surfaces;
89 auto& windowHandles = hOutputConfiguration.windowHandles;
90 surfaces.reserve(windowHandles.size());
Jayant Chowdharybe543d42018-08-15 13:16:14 -070091 for (auto &handle : windowHandles) {
Avichal Rakeshb8610162023-11-08 18:21:10 -080092 auto igbp = AImageReader_getHGBPFromHandle(handle);
93 if (igbp == nullptr) {
94 ALOGE("%s: Could not get HGBP from native_handle: %p. Skipping.",
95 __FUNCTION__, handle.getNativeHandle());
96 continue;
97 }
Carlos Martinez Romeroc45bc932024-10-09 15:04:51 -070098#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
99 view::Surface surface;
100 surface.graphicBufferProducer = new H2BGraphicBufferProducer(igbp);
101 surfaces.push_back(surface);
102#else
103 surfaces.push_back(new H2BGraphicBufferProducer(igbp));
104#endif
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700105 }
106 hardware::camera2::params::OutputConfiguration outputConfiguration(
Carlos Martinez Romeroc45bc932024-10-09 15:04:51 -0700107 surfaces, convertFromHidl(hOutputConfiguration.rotation),
Austin Borger0fb3ad92023-06-01 16:51:35 -0700108 hOutputConfiguration.physicalCameraId,
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700109 hOutputConfiguration.windowGroupId, OutputConfiguration::SURFACE_TYPE_UNKNOWN, 0, 0,
110 (windowHandles.size() > 1));
111 return outputConfiguration;
112}
113
Shuzhen Wang24810e72019-03-18 10:55:01 -0700114hardware::camera2::params::SessionConfiguration convertFromHidl(
115 const HSessionConfiguration &hSessionConfiguration) {
116 hardware::camera2::params::SessionConfiguration sessionConfig(
117 hSessionConfiguration.inputWidth, hSessionConfiguration.inputHeight,
118 hSessionConfiguration.inputFormat,
119 static_cast<int>(hSessionConfiguration.operationMode));
120
121 for (const auto& hConfig : hSessionConfiguration.outputStreams) {
122 hardware::camera2::params::OutputConfiguration config = convertFromHidl(hConfig);
123 sessionConfig.addOutputConfiguration(config);
124 }
125
126 return sessionConfig;
127}
128
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700129// The camera metadata here is cloned. Since we're reading metadata over
130// hwbinder we would need to clone it in order to avoid aligment issues.
131bool convertFromHidl(const HCameraMetadata &src, CameraMetadata *dst) {
132 const camera_metadata_t *buffer = reinterpret_cast<const camera_metadata_t*>(src.data());
133 size_t expectedSize = src.size();
Shuzhen Wang639ed122018-12-06 14:42:52 -0800134 if (buffer != nullptr) {
135 int res = validate_camera_metadata_structure(buffer, &expectedSize);
136 if (res == OK || res == CAMERA_METADATA_VALIDATION_SHIFTED) {
137 *dst = buffer;
138 } else {
139 ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__);
140 return false;
141 }
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700142 }
143 return true;
144}
145
146HCameraDeviceStatus convertToHidlCameraDeviceStatus(int32_t status) {
147 HCameraDeviceStatus deviceStatus = HCameraDeviceStatus::STATUS_UNKNOWN;
148 switch(status) {
149 case hardware::ICameraServiceListener::STATUS_NOT_PRESENT:
150 deviceStatus = HCameraDeviceStatus::STATUS_NOT_PRESENT;
151 break;
152 case hardware::ICameraServiceListener::STATUS_PRESENT:
153 deviceStatus = HCameraDeviceStatus::STATUS_PRESENT;
154 break;
155 case hardware::ICameraServiceListener::STATUS_ENUMERATING:
156 deviceStatus = HCameraDeviceStatus::STATUS_ENUMERATING;
157 break;
158 case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE:
159 deviceStatus = HCameraDeviceStatus::STATUS_NOT_AVAILABLE;
160 break;
161 default:
162 break;
163 }
164 return deviceStatus;
165}
166
167HCaptureResultExtras convertToHidl(const CaptureResultExtras &captureResultExtras) {
168 HCaptureResultExtras hCaptureResultExtras;
Jayant Chowdhary70da5772018-11-20 18:50:31 -0800169 hCaptureResultExtras.requestId = captureResultExtras.requestId;
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700170 hCaptureResultExtras.burstId = captureResultExtras.burstId;
171 hCaptureResultExtras.frameNumber = captureResultExtras.frameNumber;
172 hCaptureResultExtras.partialResultCount = captureResultExtras.partialResultCount;
173 hCaptureResultExtras.errorStreamId = captureResultExtras.errorStreamId;
Austin Borger0fb3ad92023-06-01 16:51:35 -0700174 hCaptureResultExtras.errorPhysicalCameraId = hidl_string(
175 captureResultExtras.errorPhysicalCameraId.c_str());
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700176 return hCaptureResultExtras;
177}
178
179HErrorCode convertToHidl(int32_t errorCode) {
180 switch(errorCode) {
181 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISCONNECTED:
182 return HErrorCode::CAMERA_DISCONNECTED;
183 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE :
184 return HErrorCode::CAMERA_DEVICE;
185 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_SERVICE:
186 return HErrorCode::CAMERA_SERVICE;
187 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST:
188 return HErrorCode::CAMERA_REQUEST;
189 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT:
190 return HErrorCode::CAMERA_RESULT;
191 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER:
192 return HErrorCode::CAMERA_BUFFER;
193 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISABLED:
194 return HErrorCode::CAMERA_DISABLED;
195 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_INVALID_ERROR:
196 return HErrorCode::CAMERA_INVALID_ERROR;
197 default:
198 return HErrorCode::CAMERA_UNKNOWN_ERROR;
199 }
200}
201
202void convertToHidl(const std::vector<hardware::CameraStatus> &src,
203 hidl_vec<HCameraStatusAndId>* dst) {
204 dst->resize(src.size());
205 size_t i = 0;
206 for (auto &statusAndId : src) {
207 auto &a = (*dst)[i++];
Austin Borger0fb3ad92023-06-01 16:51:35 -0700208 a.cameraId = statusAndId.cameraId;
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700209 a.deviceStatus = convertToHidlCameraDeviceStatus(statusAndId.status);
210 }
211 return;
212}
213
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800214void convertToHidl(const std::vector<hardware::CameraStatus> &src,
215 hidl_vec<frameworks::cameraservice::service::V2_1::CameraStatusAndId>* dst) {
216 dst->resize(src.size());
217 size_t i = 0;
218 for (const auto &statusAndId : src) {
219 auto &a = (*dst)[i++];
Austin Borger0fb3ad92023-06-01 16:51:35 -0700220 a.v2_0.cameraId = statusAndId.cameraId;
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800221 a.v2_0.deviceStatus = convertToHidlCameraDeviceStatus(statusAndId.status);
222 size_t numUnvailPhysicalCameras = statusAndId.unavailablePhysicalIds.size();
223 a.unavailPhysicalCameraIds.resize(numUnvailPhysicalCameras);
224 for (size_t j = 0; j < numUnvailPhysicalCameras; j++) {
Austin Borger0fb3ad92023-06-01 16:51:35 -0700225 a.unavailPhysicalCameraIds[j] = statusAndId.unavailablePhysicalIds[j];
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800226 }
227 }
228 return;
229}
230
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700231void convertToHidl(
232 const hardware::camera2::utils::SubmitInfo &submitInfo,
233 frameworks::cameraservice::device::V2_0::SubmitInfo *hSubmitInfo) {
234 hSubmitInfo->requestId = submitInfo.mRequestId;
235 hSubmitInfo->lastFrameNumber = submitInfo.mLastFrameNumber;
236}
237
238HStatus B2HStatus(const binder::Status &bStatus) {
239 HStatus status = HStatus::NO_ERROR;
240 if (bStatus.isOk()) {
241 // NO Error here
242 return status;
243 }
244 switch(bStatus.serviceSpecificErrorCode()) {
245 case hardware::ICameraService::ERROR_DISCONNECTED:
246 status = HStatus::DISCONNECTED;
247 break;
248 case hardware::ICameraService::ERROR_CAMERA_IN_USE:
249 status = HStatus::CAMERA_IN_USE;
250 break;
251 case hardware::ICameraService::ERROR_MAX_CAMERAS_IN_USE:
252 status = HStatus::MAX_CAMERAS_IN_USE;
253 break;
254 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
255 status = HStatus::ILLEGAL_ARGUMENT;
256 break;
257 case hardware::ICameraService::ERROR_DEPRECATED_HAL:
258 // Should not reach here since we filtered legacy HALs earlier
259 status = HStatus::DEPRECATED_HAL;
260 break;
261 case hardware::ICameraService::ERROR_DISABLED:
262 status = HStatus::DISABLED;
263 break;
264 case hardware::ICameraService::ERROR_PERMISSION_DENIED:
265 status = HStatus::PERMISSION_DENIED;
266 break;
267 case hardware::ICameraService::ERROR_INVALID_OPERATION:
268 status = HStatus::INVALID_OPERATION;
269 break;
270 default:
271 status = HStatus::UNKNOWN_ERROR;
272 break;
273 }
274 return status;
275}
276
Jayant Chowdhary0c947272018-08-15 14:42:04 -0700277HPhysicalCaptureResultInfo convertToHidl(
278 const PhysicalCaptureResultInfo &physicalCaptureResultInfo,
279 std::shared_ptr<CaptureResultMetadataQueue> &captureResultMetadataQueue) {
280 HPhysicalCaptureResultInfo hPhysicalCaptureResultInfo;
281 hPhysicalCaptureResultInfo.physicalCameraId =
Austin Borger0fb3ad92023-06-01 16:51:35 -0700282 toString8(physicalCaptureResultInfo.mPhysicalCameraId);
Jayant Chowdhary0c947272018-08-15 14:42:04 -0700283 const camera_metadata_t *rawMetadata =
284 physicalCaptureResultInfo.mPhysicalCameraMetadata.getAndLock();
285 // Try using fmq at first.
286 size_t metadata_size = get_camera_metadata_size(rawMetadata);
287 if ((metadata_size > 0) && (captureResultMetadataQueue->availableToWrite() > 0)) {
288 if (captureResultMetadataQueue->write((uint8_t *)rawMetadata, metadata_size)) {
289 hPhysicalCaptureResultInfo.physicalCameraMetadata.fmqMetadataSize(metadata_size);
290 } else {
291 ALOGW("%s Couldn't use fmq, falling back to hwbinder", __FUNCTION__);
292 HCameraMetadata metadata;
293 convertToHidl(rawMetadata, &metadata);
294 hPhysicalCaptureResultInfo.physicalCameraMetadata.metadata(std::move(metadata));
295 }
296 }
297 physicalCaptureResultInfo.mPhysicalCameraMetadata.unlock(rawMetadata);
298 return hPhysicalCaptureResultInfo;
299}
300
301hidl_vec<HPhysicalCaptureResultInfo> convertToHidl(
302 const std::vector<PhysicalCaptureResultInfo> &physicalCaptureResultInfos,
303 std::shared_ptr<CaptureResultMetadataQueue> &captureResultMetadataQueue) {
304 hidl_vec<HPhysicalCaptureResultInfo> hPhysicalCaptureResultInfos;
305 hPhysicalCaptureResultInfos.resize(physicalCaptureResultInfos.size());
306 size_t i = 0;
307 for (auto &physicalCaptureResultInfo : physicalCaptureResultInfos) {
308 hPhysicalCaptureResultInfos[i++] = convertToHidl(physicalCaptureResultInfo,
309 captureResultMetadataQueue);
310 }
311 return hPhysicalCaptureResultInfos;
312}
313
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700314} //conversion
315} // utils
316} //cameraservice
317} // hardware
318} // android