1 /* 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> 19 #include <cutils/native_handle.h> 20 #include <mediautils/AImageReaderUtils.h> 21 22 namespace android { 23 namespace hardware { 24 namespace cameraservice { 25 namespace utils { 26 namespace conversion { 27 28 using hardware::graphics::bufferqueue::V1_0::utils::H2BGraphicBufferProducer; 29 using aimg::AImageReader_getHGBPFromHandle; 30 31 // Note: existing data in dst will be gone. Caller still owns the memory of src 32 void 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 42 int32_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 54 int32_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 71 int 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 84 hardware::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 } 92 String16 physicalCameraId16(hOutputConfiguration.physicalCameraId.c_str()); 93 hardware::camera2::params::OutputConfiguration outputConfiguration( 94 iGBPs, convertFromHidl(hOutputConfiguration.rotation), physicalCameraId16, 95 hOutputConfiguration.windowGroupId, OutputConfiguration::SURFACE_TYPE_UNKNOWN, 0, 0, 96 (windowHandles.size() > 1)); 97 return outputConfiguration; 98 } 99 100 hardware::camera2::params::SessionConfiguration convertFromHidl( 101 const HSessionConfiguration &hSessionConfiguration) { 102 hardware::camera2::params::SessionConfiguration sessionConfig( 103 hSessionConfiguration.inputWidth, hSessionConfiguration.inputHeight, 104 hSessionConfiguration.inputFormat, 105 static_cast<int>(hSessionConfiguration.operationMode)); 106 107 for (const auto& hConfig : hSessionConfiguration.outputStreams) { 108 hardware::camera2::params::OutputConfiguration config = convertFromHidl(hConfig); 109 sessionConfig.addOutputConfiguration(config); 110 } 111 112 return sessionConfig; 113 } 114 115 // The camera metadata here is cloned. Since we're reading metadata over 116 // hwbinder we would need to clone it in order to avoid aligment issues. 117 bool convertFromHidl(const HCameraMetadata &src, CameraMetadata *dst) { 118 const camera_metadata_t *buffer = reinterpret_cast<const camera_metadata_t*>(src.data()); 119 size_t expectedSize = src.size(); 120 if (buffer != nullptr) { 121 int res = validate_camera_metadata_structure(buffer, &expectedSize); 122 if (res == OK || res == CAMERA_METADATA_VALIDATION_SHIFTED) { 123 *dst = buffer; 124 } else { 125 ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__); 126 return false; 127 } 128 } 129 return true; 130 } 131 132 HCameraDeviceStatus convertToHidlCameraDeviceStatus(int32_t status) { 133 HCameraDeviceStatus deviceStatus = HCameraDeviceStatus::STATUS_UNKNOWN; 134 switch(status) { 135 case hardware::ICameraServiceListener::STATUS_NOT_PRESENT: 136 deviceStatus = HCameraDeviceStatus::STATUS_NOT_PRESENT; 137 break; 138 case hardware::ICameraServiceListener::STATUS_PRESENT: 139 deviceStatus = HCameraDeviceStatus::STATUS_PRESENT; 140 break; 141 case hardware::ICameraServiceListener::STATUS_ENUMERATING: 142 deviceStatus = HCameraDeviceStatus::STATUS_ENUMERATING; 143 break; 144 case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE: 145 deviceStatus = HCameraDeviceStatus::STATUS_NOT_AVAILABLE; 146 break; 147 default: 148 break; 149 } 150 return deviceStatus; 151 } 152 153 HCaptureResultExtras convertToHidl(const CaptureResultExtras &captureResultExtras) { 154 HCaptureResultExtras hCaptureResultExtras; 155 hCaptureResultExtras.requestId = captureResultExtras.requestId; 156 hCaptureResultExtras.burstId = captureResultExtras.burstId; 157 hCaptureResultExtras.frameNumber = captureResultExtras.frameNumber; 158 hCaptureResultExtras.partialResultCount = captureResultExtras.partialResultCount; 159 hCaptureResultExtras.errorStreamId = captureResultExtras.errorStreamId; 160 hCaptureResultExtras.errorPhysicalCameraId = hidl_string(String8( 161 captureResultExtras.errorPhysicalCameraId).string()); 162 return hCaptureResultExtras; 163 } 164 165 HErrorCode convertToHidl(int32_t errorCode) { 166 switch(errorCode) { 167 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISCONNECTED: 168 return HErrorCode::CAMERA_DISCONNECTED; 169 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE : 170 return HErrorCode::CAMERA_DEVICE; 171 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_SERVICE: 172 return HErrorCode::CAMERA_SERVICE; 173 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST: 174 return HErrorCode::CAMERA_REQUEST; 175 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT: 176 return HErrorCode::CAMERA_RESULT; 177 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER: 178 return HErrorCode::CAMERA_BUFFER; 179 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISABLED: 180 return HErrorCode::CAMERA_DISABLED; 181 case camera2::ICameraDeviceCallbacks::ERROR_CAMERA_INVALID_ERROR: 182 return HErrorCode::CAMERA_INVALID_ERROR; 183 default: 184 return HErrorCode::CAMERA_UNKNOWN_ERROR; 185 } 186 } 187 188 void convertToHidl(const std::vector<hardware::CameraStatus> &src, 189 hidl_vec<HCameraStatusAndId>* dst) { 190 dst->resize(src.size()); 191 size_t i = 0; 192 for (auto &statusAndId : src) { 193 auto &a = (*dst)[i++]; 194 a.cameraId = statusAndId.cameraId.c_str(); 195 a.deviceStatus = convertToHidlCameraDeviceStatus(statusAndId.status); 196 } 197 return; 198 } 199 200 void convertToHidl( 201 const hardware::camera2::utils::SubmitInfo &submitInfo, 202 frameworks::cameraservice::device::V2_0::SubmitInfo *hSubmitInfo) { 203 hSubmitInfo->requestId = submitInfo.mRequestId; 204 hSubmitInfo->lastFrameNumber = submitInfo.mLastFrameNumber; 205 } 206 207 HStatus B2HStatus(const binder::Status &bStatus) { 208 HStatus status = HStatus::NO_ERROR; 209 if (bStatus.isOk()) { 210 // NO Error here 211 return status; 212 } 213 switch(bStatus.serviceSpecificErrorCode()) { 214 case hardware::ICameraService::ERROR_DISCONNECTED: 215 status = HStatus::DISCONNECTED; 216 break; 217 case hardware::ICameraService::ERROR_CAMERA_IN_USE: 218 status = HStatus::CAMERA_IN_USE; 219 break; 220 case hardware::ICameraService::ERROR_MAX_CAMERAS_IN_USE: 221 status = HStatus::MAX_CAMERAS_IN_USE; 222 break; 223 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT: 224 status = HStatus::ILLEGAL_ARGUMENT; 225 break; 226 case hardware::ICameraService::ERROR_DEPRECATED_HAL: 227 // Should not reach here since we filtered legacy HALs earlier 228 status = HStatus::DEPRECATED_HAL; 229 break; 230 case hardware::ICameraService::ERROR_DISABLED: 231 status = HStatus::DISABLED; 232 break; 233 case hardware::ICameraService::ERROR_PERMISSION_DENIED: 234 status = HStatus::PERMISSION_DENIED; 235 break; 236 case hardware::ICameraService::ERROR_INVALID_OPERATION: 237 status = HStatus::INVALID_OPERATION; 238 break; 239 default: 240 status = HStatus::UNKNOWN_ERROR; 241 break; 242 } 243 return status; 244 } 245 246 HPhysicalCaptureResultInfo convertToHidl( 247 const PhysicalCaptureResultInfo &physicalCaptureResultInfo, 248 std::shared_ptr<CaptureResultMetadataQueue> &captureResultMetadataQueue) { 249 HPhysicalCaptureResultInfo hPhysicalCaptureResultInfo; 250 hPhysicalCaptureResultInfo.physicalCameraId = 251 String8(physicalCaptureResultInfo.mPhysicalCameraId).string(); 252 const camera_metadata_t *rawMetadata = 253 physicalCaptureResultInfo.mPhysicalCameraMetadata.getAndLock(); 254 // Try using fmq at first. 255 size_t metadata_size = get_camera_metadata_size(rawMetadata); 256 if ((metadata_size > 0) && (captureResultMetadataQueue->availableToWrite() > 0)) { 257 if (captureResultMetadataQueue->write((uint8_t *)rawMetadata, metadata_size)) { 258 hPhysicalCaptureResultInfo.physicalCameraMetadata.fmqMetadataSize(metadata_size); 259 } else { 260 ALOGW("%s Couldn't use fmq, falling back to hwbinder", __FUNCTION__); 261 HCameraMetadata metadata; 262 convertToHidl(rawMetadata, &metadata); 263 hPhysicalCaptureResultInfo.physicalCameraMetadata.metadata(std::move(metadata)); 264 } 265 } 266 physicalCaptureResultInfo.mPhysicalCameraMetadata.unlock(rawMetadata); 267 return hPhysicalCaptureResultInfo; 268 } 269 270 hidl_vec<HPhysicalCaptureResultInfo> convertToHidl( 271 const std::vector<PhysicalCaptureResultInfo> &physicalCaptureResultInfos, 272 std::shared_ptr<CaptureResultMetadataQueue> &captureResultMetadataQueue) { 273 hidl_vec<HPhysicalCaptureResultInfo> hPhysicalCaptureResultInfos; 274 hPhysicalCaptureResultInfos.resize(physicalCaptureResultInfos.size()); 275 size_t i = 0; 276 for (auto &physicalCaptureResultInfo : physicalCaptureResultInfos) { 277 hPhysicalCaptureResultInfos[i++] = convertToHidl(physicalCaptureResultInfo, 278 captureResultMetadataQueue); 279 } 280 return hPhysicalCaptureResultInfos; 281 } 282 283 } //conversion 284 } // utils 285 } //cameraservice 286 } // hardware 287 } // android 288