blob: 51d08ff604eea315425421424f48d689519b1ac6 [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
17#include <hidl/Convert.h>
18#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
Jayant Chowdharye0bb61b2018-11-14 23:59:12 -080019#include <cutils/native_handle.h>
20#include <mediautils/AImageReaderUtils.h>
Jayant Chowdharybe543d42018-08-15 13:16:14 -070021
22namespace android {
23namespace hardware {
24namespace cameraservice {
25namespace utils {
26namespace conversion {
27
28using hardware::graphics::bufferqueue::V1_0::utils::H2BGraphicBufferProducer;
Jayant Chowdharye0bb61b2018-11-14 23:59:12 -080029using aimg::AImageReader_getHGBPFromHandle;
Jayant Chowdharybe543d42018-08-15 13:16:14 -070030
31// Note: existing data in dst will be gone. Caller still owns the memory of src
32void convertToHidl(const camera_metadata_t *src, HCameraMetadata* dst) {
33 if (src == nullptr) {
34 ALOGW("%s:attempt to convert empty metadata to Hidl", __FUNCTION__);
35 return;
36 }
37 size_t size = get_camera_metadata_size(src);
38 dst->setToExternal((uint8_t *) src, size);
39 return;
40}
41
42int32_t convertFromHidl(HStreamConfigurationMode streamConfigurationMode) {
43 switch (streamConfigurationMode) {
44 case HStreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE:
45 return camera2::ICameraDeviceUser::CONSTRAINED_HIGH_SPEED_MODE;
46 case HStreamConfigurationMode::NORMAL_MODE:
47 return camera2::ICameraDeviceUser::NORMAL_MODE;
48 default:
49 // TODO: Fix this
50 return camera2::ICameraDeviceUser::VENDOR_MODE_START;
51 }
52}
53
54int32_t convertFromHidl(HTemplateId templateId) {
55 switch(templateId) {
56 case HTemplateId::PREVIEW:
57 return camera2::ICameraDeviceUser::TEMPLATE_PREVIEW;
58 case HTemplateId::STILL_CAPTURE:
59 return camera2::ICameraDeviceUser::TEMPLATE_STILL_CAPTURE;
60 case HTemplateId::RECORD:
61 return camera2::ICameraDeviceUser::TEMPLATE_RECORD;
62 case HTemplateId::VIDEO_SNAPSHOT:
63 return camera2::ICameraDeviceUser::TEMPLATE_VIDEO_SNAPSHOT;
64 case HTemplateId::ZERO_SHUTTER_LAG:
65 return camera2::ICameraDeviceUser::TEMPLATE_ZERO_SHUTTER_LAG;
66 case HTemplateId::MANUAL:
67 return camera2::ICameraDeviceUser::TEMPLATE_MANUAL;
68 }
69}
70
71int convertFromHidl(HOutputConfiguration::Rotation rotation) {
72 switch(rotation) {
73 case HOutputConfiguration::Rotation::R0:
74 return 0;
75 case HOutputConfiguration::Rotation::R90:
76 return 1;
77 case HOutputConfiguration::Rotation::R180:
78 return 2;
79 case HOutputConfiguration::Rotation::R270:
80 return 3;
81 }
82}
83
84hardware::camera2::params::OutputConfiguration convertFromHidl(
85 const HOutputConfiguration &hOutputConfiguration) {
86 std::vector<sp<IGraphicBufferProducer>> iGBPs;
87 auto &windowHandles = hOutputConfiguration.windowHandles;
88 iGBPs.reserve(windowHandles.size());
89 for (auto &handle : windowHandles) {
90 iGBPs.push_back(new H2BGraphicBufferProducer(AImageReader_getHGBPFromHandle(handle)));
91 }
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080092 String16 physicalCameraId16(hOutputConfiguration.physicalCameraId.c_str());
Jayant Chowdharybe543d42018-08-15 13:16:14 -070093 hardware::camera2::params::OutputConfiguration outputConfiguration(
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080094 iGBPs, convertFromHidl(hOutputConfiguration.rotation), physicalCameraId16,
Jayant Chowdharybe543d42018-08-15 13:16:14 -070095 hOutputConfiguration.windowGroupId, OutputConfiguration::SURFACE_TYPE_UNKNOWN, 0, 0,
96 (windowHandles.size() > 1));
97 return outputConfiguration;
98}
99
100// The camera metadata here is cloned. Since we're reading metadata over
101// hwbinder we would need to clone it in order to avoid aligment issues.
102bool convertFromHidl(const HCameraMetadata &src, CameraMetadata *dst) {
103 const camera_metadata_t *buffer = reinterpret_cast<const camera_metadata_t*>(src.data());
104 size_t expectedSize = src.size();
Shuzhen Wang639ed122018-12-06 14:42:52 -0800105 if (buffer != nullptr) {
106 int res = validate_camera_metadata_structure(buffer, &expectedSize);
107 if (res == OK || res == CAMERA_METADATA_VALIDATION_SHIFTED) {
108 *dst = buffer;
109 } else {
110 ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__);
111 return false;
112 }
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700113 }
114 return true;
115}
116
117HCameraDeviceStatus convertToHidlCameraDeviceStatus(int32_t status) {
118 HCameraDeviceStatus deviceStatus = HCameraDeviceStatus::STATUS_UNKNOWN;
119 switch(status) {
120 case hardware::ICameraServiceListener::STATUS_NOT_PRESENT:
121 deviceStatus = HCameraDeviceStatus::STATUS_NOT_PRESENT;
122 break;
123 case hardware::ICameraServiceListener::STATUS_PRESENT:
124 deviceStatus = HCameraDeviceStatus::STATUS_PRESENT;
125 break;
126 case hardware::ICameraServiceListener::STATUS_ENUMERATING:
127 deviceStatus = HCameraDeviceStatus::STATUS_ENUMERATING;
128 break;
129 case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE:
130 deviceStatus = HCameraDeviceStatus::STATUS_NOT_AVAILABLE;
131 break;
132 default:
133 break;
134 }
135 return deviceStatus;
136}
137
138HCaptureResultExtras convertToHidl(const CaptureResultExtras &captureResultExtras) {
139 HCaptureResultExtras hCaptureResultExtras;
Jayant Chowdhary70da5772018-11-20 18:50:31 -0800140 hCaptureResultExtras.requestId = captureResultExtras.requestId;
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700141 hCaptureResultExtras.burstId = captureResultExtras.burstId;
142 hCaptureResultExtras.frameNumber = captureResultExtras.frameNumber;
143 hCaptureResultExtras.partialResultCount = captureResultExtras.partialResultCount;
144 hCaptureResultExtras.errorStreamId = captureResultExtras.errorStreamId;
Emilian Peevedec62d2019-03-19 17:59:24 -0700145 hCaptureResultExtras.errorPhysicalCameraId = hidl_string(String8(
146 captureResultExtras.errorPhysicalCameraId).string());
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700147 return hCaptureResultExtras;
148}
149
150HErrorCode convertToHidl(int32_t errorCode) {
151 switch(errorCode) {
152 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISCONNECTED:
153 return HErrorCode::CAMERA_DISCONNECTED;
154 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE :
155 return HErrorCode::CAMERA_DEVICE;
156 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_SERVICE:
157 return HErrorCode::CAMERA_SERVICE;
158 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST:
159 return HErrorCode::CAMERA_REQUEST;
160 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT:
161 return HErrorCode::CAMERA_RESULT;
162 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER:
163 return HErrorCode::CAMERA_BUFFER;
164 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISABLED:
165 return HErrorCode::CAMERA_DISABLED;
166 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_INVALID_ERROR:
167 return HErrorCode::CAMERA_INVALID_ERROR;
168 default:
169 return HErrorCode::CAMERA_UNKNOWN_ERROR;
170 }
171}
172
173void convertToHidl(const std::vector<hardware::CameraStatus> &src,
174 hidl_vec<HCameraStatusAndId>* dst) {
175 dst->resize(src.size());
176 size_t i = 0;
177 for (auto &statusAndId : src) {
178 auto &a = (*dst)[i++];
179 a.cameraId = statusAndId.cameraId.c_str();
180 a.deviceStatus = convertToHidlCameraDeviceStatus(statusAndId.status);
181 }
182 return;
183}
184
185void convertToHidl(
186 const hardware::camera2::utils::SubmitInfo &submitInfo,
187 frameworks::cameraservice::device::V2_0::SubmitInfo *hSubmitInfo) {
188 hSubmitInfo->requestId = submitInfo.mRequestId;
189 hSubmitInfo->lastFrameNumber = submitInfo.mLastFrameNumber;
190}
191
192HStatus B2HStatus(const binder::Status &bStatus) {
193 HStatus status = HStatus::NO_ERROR;
194 if (bStatus.isOk()) {
195 // NO Error here
196 return status;
197 }
198 switch(bStatus.serviceSpecificErrorCode()) {
199 case hardware::ICameraService::ERROR_DISCONNECTED:
200 status = HStatus::DISCONNECTED;
201 break;
202 case hardware::ICameraService::ERROR_CAMERA_IN_USE:
203 status = HStatus::CAMERA_IN_USE;
204 break;
205 case hardware::ICameraService::ERROR_MAX_CAMERAS_IN_USE:
206 status = HStatus::MAX_CAMERAS_IN_USE;
207 break;
208 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
209 status = HStatus::ILLEGAL_ARGUMENT;
210 break;
211 case hardware::ICameraService::ERROR_DEPRECATED_HAL:
212 // Should not reach here since we filtered legacy HALs earlier
213 status = HStatus::DEPRECATED_HAL;
214 break;
215 case hardware::ICameraService::ERROR_DISABLED:
216 status = HStatus::DISABLED;
217 break;
218 case hardware::ICameraService::ERROR_PERMISSION_DENIED:
219 status = HStatus::PERMISSION_DENIED;
220 break;
221 case hardware::ICameraService::ERROR_INVALID_OPERATION:
222 status = HStatus::INVALID_OPERATION;
223 break;
224 default:
225 status = HStatus::UNKNOWN_ERROR;
226 break;
227 }
228 return status;
229}
230
Jayant Chowdhary0c947272018-08-15 14:42:04 -0700231HPhysicalCaptureResultInfo convertToHidl(
232 const PhysicalCaptureResultInfo &physicalCaptureResultInfo,
233 std::shared_ptr<CaptureResultMetadataQueue> &captureResultMetadataQueue) {
234 HPhysicalCaptureResultInfo hPhysicalCaptureResultInfo;
235 hPhysicalCaptureResultInfo.physicalCameraId =
236 String8(physicalCaptureResultInfo.mPhysicalCameraId).string();
237 const camera_metadata_t *rawMetadata =
238 physicalCaptureResultInfo.mPhysicalCameraMetadata.getAndLock();
239 // Try using fmq at first.
240 size_t metadata_size = get_camera_metadata_size(rawMetadata);
241 if ((metadata_size > 0) && (captureResultMetadataQueue->availableToWrite() > 0)) {
242 if (captureResultMetadataQueue->write((uint8_t *)rawMetadata, metadata_size)) {
243 hPhysicalCaptureResultInfo.physicalCameraMetadata.fmqMetadataSize(metadata_size);
244 } else {
245 ALOGW("%s Couldn't use fmq, falling back to hwbinder", __FUNCTION__);
246 HCameraMetadata metadata;
247 convertToHidl(rawMetadata, &metadata);
248 hPhysicalCaptureResultInfo.physicalCameraMetadata.metadata(std::move(metadata));
249 }
250 }
251 physicalCaptureResultInfo.mPhysicalCameraMetadata.unlock(rawMetadata);
252 return hPhysicalCaptureResultInfo;
253}
254
255hidl_vec<HPhysicalCaptureResultInfo> convertToHidl(
256 const std::vector<PhysicalCaptureResultInfo> &physicalCaptureResultInfos,
257 std::shared_ptr<CaptureResultMetadataQueue> &captureResultMetadataQueue) {
258 hidl_vec<HPhysicalCaptureResultInfo> hPhysicalCaptureResultInfos;
259 hPhysicalCaptureResultInfos.resize(physicalCaptureResultInfos.size());
260 size_t i = 0;
261 for (auto &physicalCaptureResultInfo : physicalCaptureResultInfos) {
262 hPhysicalCaptureResultInfos[i++] = convertToHidl(physicalCaptureResultInfo,
263 captureResultMetadataQueue);
264 }
265 return hPhysicalCaptureResultInfos;
266}
267
Jayant Chowdharybe543d42018-08-15 13:16:14 -0700268} //conversion
269} // utils
270} //cameraservice
271} // hardware
272} // android