blob: 2b3fe9e1d3e61896ab8c11d290ae24897f456152 [file] [log] [blame]
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001/*
2 * Copyright (C) 2016 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 "CameraProviderManager"
18#define ATRACE_TAG ATRACE_TAG_CAMERA
19//#define LOG_NDEBUG 0
20
21#include "CameraProviderManager.h"
22
Shuzhen Wangf9d2c022018-08-21 12:07:35 -070023#include <android/hardware/camera/device/3.5/ICameraDevice.h>
24
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -080025#include <algorithm>
Yin-Chia Yeh65405092017-01-13 15:42:28 -080026#include <chrono>
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -070027#include <inttypes.h>
Shuzhen Wangf9d2c022018-08-21 12:07:35 -070028#include <hardware/camera_common.h>
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080029#include <hidl/ServiceManagement.h>
Emilian Peev71c73a22017-03-21 16:35:51 +000030#include <functional>
31#include <camera_metadata_hidden.h>
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -080032#include <android-base/parseint.h>
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080033
34namespace android {
35
36using namespace ::android::hardware::camera;
37using namespace ::android::hardware::camera::common::V1_0;
38
39namespace {
40// Hardcoded name for the passthrough HAL implementation, since it can't be discovered via the
41// service manager
42const std::string kLegacyProviderName("legacy/0");
Yin-Chia Yehd78041a2018-01-20 13:45:38 -080043const std::string kExternalProviderName("external/0");
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080044
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080045} // anonymous namespace
46
47CameraProviderManager::HardwareServiceInteractionProxy
48CameraProviderManager::sHardwareServiceInteractionProxy{};
49
50CameraProviderManager::~CameraProviderManager() {
51}
52
53status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener,
54 ServiceInteractionProxy* proxy) {
Yin-Chia Yeh4c5b1c72017-01-31 13:20:56 -080055 std::lock_guard<std::mutex> lock(mInterfaceMutex);
56 if (proxy == nullptr) {
57 ALOGE("%s: No valid service interaction proxy provided", __FUNCTION__);
58 return BAD_VALUE;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080059 }
Yin-Chia Yeh4c5b1c72017-01-31 13:20:56 -080060 mListener = listener;
61 mServiceProxy = proxy;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080062
Yin-Chia Yeh4c5b1c72017-01-31 13:20:56 -080063 // Registering will trigger notifications for all already-known providers
64 bool success = mServiceProxy->registerForNotifications(
65 /* instance name, empty means no filter */ "",
66 this);
67 if (!success) {
68 ALOGE("%s: Unable to register with hardware service manager for notifications "
69 "about camera providers", __FUNCTION__);
70 return INVALID_OPERATION;
Yin-Chia Yeh65405092017-01-13 15:42:28 -080071 }
Emilian Peev5d7e5152017-02-22 15:37:48 +000072
Eino-Ville Talvala65665362017-02-24 13:07:56 -080073 // See if there's a passthrough HAL, but let's not complain if there's not
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -070074 addProviderLocked(kLegacyProviderName, /*expected*/ false);
Yin-Chia Yehd78041a2018-01-20 13:45:38 -080075 addProviderLocked(kExternalProviderName, /*expected*/ false);
Eino-Ville Talvala65665362017-02-24 13:07:56 -080076
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080077 return OK;
78}
79
80int CameraProviderManager::getCameraCount() const {
81 std::lock_guard<std::mutex> lock(mInterfaceMutex);
82 int count = 0;
83 for (auto& provider : mProviders) {
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -080084 count += provider->mUniqueCameraIds.size();
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080085 }
86 return count;
87}
88
89std::vector<std::string> CameraProviderManager::getCameraDeviceIds() const {
90 std::lock_guard<std::mutex> lock(mInterfaceMutex);
91 std::vector<std::string> deviceIds;
92 for (auto& provider : mProviders) {
Yin-Chia Yehdc3134e2017-03-23 15:26:59 -070093 for (auto& id : provider->mUniqueCameraIds) {
94 deviceIds.push_back(id);
95 }
96 }
97 return deviceIds;
98}
99
Emilian Peevf53f66e2017-04-11 14:29:43 +0100100std::vector<std::string> CameraProviderManager::getAPI1CompatibleCameraDeviceIds() const {
Yin-Chia Yehdc3134e2017-03-23 15:26:59 -0700101 std::lock_guard<std::mutex> lock(mInterfaceMutex);
102 std::vector<std::string> deviceIds;
103 for (auto& provider : mProviders) {
Shuzhen Wange8aceb52018-05-21 12:00:56 -0700104 std::vector<std::string> providerDeviceIds = provider->mUniqueAPI1CompatibleCameraIds;
105
106 // API1 app doesn't handle logical and physical camera devices well. So
107 // for each [logical, physical1, physical2, ...] id combo, only take the
108 // first id advertised by HAL, and filter out the rest.
109 filterLogicalCameraIdsLocked(providerDeviceIds);
110
111 deviceIds.insert(deviceIds.end(), providerDeviceIds.begin(), providerDeviceIds.end());
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800112 }
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800113
114 std::sort(deviceIds.begin(), deviceIds.end(),
115 [](const std::string& a, const std::string& b) -> bool {
116 uint32_t aUint = 0, bUint = 0;
117 bool aIsUint = base::ParseUint(a, &aUint);
118 bool bIsUint = base::ParseUint(b, &bUint);
119
120 // Uint device IDs first
121 if (aIsUint && bIsUint) {
122 return aUint < bUint;
123 } else if (aIsUint) {
124 return true;
125 } else if (bIsUint) {
126 return false;
127 }
128 // Simple string compare if both id are not uint
129 return a < b;
130 });
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800131 return deviceIds;
132}
133
134bool CameraProviderManager::isValidDevice(const std::string &id, uint16_t majorVersion) const {
135 std::lock_guard<std::mutex> lock(mInterfaceMutex);
136 return isValidDeviceLocked(id, majorVersion);
137}
138
139bool CameraProviderManager::isValidDeviceLocked(const std::string &id, uint16_t majorVersion) const {
140 for (auto& provider : mProviders) {
141 for (auto& deviceInfo : provider->mDevices) {
142 if (deviceInfo->mId == id && deviceInfo->mVersion.get_major() == majorVersion) {
143 return true;
144 }
145 }
146 }
147 return false;
148}
149
150bool CameraProviderManager::hasFlashUnit(const std::string &id) const {
151 std::lock_guard<std::mutex> lock(mInterfaceMutex);
152
153 auto deviceInfo = findDeviceInfoLocked(id);
154 if (deviceInfo == nullptr) return false;
155
156 return deviceInfo->hasFlashUnit();
157}
158
159status_t CameraProviderManager::getResourceCost(const std::string &id,
160 CameraResourceCost* cost) const {
161 std::lock_guard<std::mutex> lock(mInterfaceMutex);
162
163 auto deviceInfo = findDeviceInfoLocked(id);
164 if (deviceInfo == nullptr) return NAME_NOT_FOUND;
165
166 *cost = deviceInfo->mResourceCost;
167 return OK;
168}
169
170status_t CameraProviderManager::getCameraInfo(const std::string &id,
171 hardware::CameraInfo* info) const {
172 std::lock_guard<std::mutex> lock(mInterfaceMutex);
173
174 auto deviceInfo = findDeviceInfoLocked(id);
175 if (deviceInfo == nullptr) return NAME_NOT_FOUND;
176
177 return deviceInfo->getCameraInfo(info);
178}
179
Emilian Peev35ae8262018-11-08 13:11:32 +0000180status_t CameraProviderManager::isSessionConfigurationSupported(const std::string& id,
181 const hardware::camera::device::V3_4::StreamConfiguration &configuration,
182 bool *status /*out*/) const {
183 std::lock_guard<std::mutex> lock(mInterfaceMutex);
184
185 auto deviceInfo = findDeviceInfoLocked(id);
186 if (deviceInfo == nullptr) {
187 return NAME_NOT_FOUND;
188 }
189
190 return deviceInfo->isSessionConfigurationSupported(configuration, status);
191}
192
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800193status_t CameraProviderManager::getCameraCharacteristics(const std::string &id,
194 CameraMetadata* characteristics) const {
195 std::lock_guard<std::mutex> lock(mInterfaceMutex);
Shuzhen Wange8aceb52018-05-21 12:00:56 -0700196 return getCameraCharacteristicsLocked(id, characteristics);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800197}
198
199status_t CameraProviderManager::getHighestSupportedVersion(const std::string &id,
200 hardware::hidl_version *v) {
201 std::lock_guard<std::mutex> lock(mInterfaceMutex);
202
203 hardware::hidl_version maxVersion{0,0};
204 bool found = false;
205 for (auto& provider : mProviders) {
206 for (auto& deviceInfo : provider->mDevices) {
207 if (deviceInfo->mId == id) {
208 if (deviceInfo->mVersion > maxVersion) {
209 maxVersion = deviceInfo->mVersion;
210 found = true;
211 }
212 }
213 }
214 }
215 if (!found) {
216 return NAME_NOT_FOUND;
217 }
218 *v = maxVersion;
219 return OK;
220}
221
Yin-Chia Yehdc3134e2017-03-23 15:26:59 -0700222bool CameraProviderManager::supportSetTorchMode(const std::string &id) {
223 std::lock_guard<std::mutex> lock(mInterfaceMutex);
224 bool support = false;
225 for (auto& provider : mProviders) {
226 auto deviceInfo = findDeviceInfoLocked(id);
227 if (deviceInfo != nullptr) {
Yin-Chia Yeh73d03742017-09-29 12:01:02 -0700228 auto ret = provider->mInterface->isSetTorchModeSupported(
Yin-Chia Yehdc3134e2017-03-23 15:26:59 -0700229 [&support](auto status, bool supported) {
230 if (status == Status::OK) {
231 support = supported;
232 }
233 });
Yin-Chia Yeh73d03742017-09-29 12:01:02 -0700234 if (!ret.isOk()) {
235 ALOGE("%s: Transaction error checking torch mode support '%s': %s",
236 __FUNCTION__, provider->mProviderName.c_str(), ret.description().c_str());
237 }
238 break;
Yin-Chia Yehdc3134e2017-03-23 15:26:59 -0700239 }
240 }
241 return support;
242}
243
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800244status_t CameraProviderManager::setTorchMode(const std::string &id, bool enabled) {
245 std::lock_guard<std::mutex> lock(mInterfaceMutex);
246
247 auto deviceInfo = findDeviceInfoLocked(id);
248 if (deviceInfo == nullptr) return NAME_NOT_FOUND;
249
250 return deviceInfo->setTorchMode(enabled);
251}
252
Yin-Chia Yeh067428c2017-01-13 15:19:24 -0800253status_t CameraProviderManager::setUpVendorTags() {
Emilian Peev71c73a22017-03-21 16:35:51 +0000254 sp<VendorTagDescriptorCache> tagCache = new VendorTagDescriptorCache();
255
Yin-Chia Yeh067428c2017-01-13 15:19:24 -0800256 for (auto& provider : mProviders) {
Peter Kalauskas1b3c9072018-11-07 12:41:53 -0800257 tagCache->addVendorDescriptor(provider->mProviderTagid, provider->mVendorTagDescriptor);
Yin-Chia Yeh067428c2017-01-13 15:19:24 -0800258 }
Emilian Peev71c73a22017-03-21 16:35:51 +0000259
260 VendorTagDescriptorCache::setAsGlobalVendorTagCache(tagCache);
261
Yin-Chia Yeh067428c2017-01-13 15:19:24 -0800262 return OK;
263}
264
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800265status_t CameraProviderManager::openSession(const std::string &id,
Peter Kalauskasb7bd4382018-11-15 17:19:48 -0800266 const sp<device::V3_2::ICameraDeviceCallback>& callback,
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800267 /*out*/
Peter Kalauskasb7bd4382018-11-15 17:19:48 -0800268 sp<device::V3_2::ICameraDeviceSession> *session) {
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800269
270 std::lock_guard<std::mutex> lock(mInterfaceMutex);
271
272 auto deviceInfo = findDeviceInfoLocked(id,
273 /*minVersion*/ {3,0}, /*maxVersion*/ {4,0});
274 if (deviceInfo == nullptr) return NAME_NOT_FOUND;
275
276 auto *deviceInfo3 = static_cast<ProviderInfo::DeviceInfo3*>(deviceInfo);
277
278 Status status;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700279 hardware::Return<void> ret;
280 ret = deviceInfo3->mInterface->open(callback, [&status, &session]
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800281 (Status s, const sp<device::V3_2::ICameraDeviceSession>& cameraSession) {
282 status = s;
283 if (status == Status::OK) {
284 *session = cameraSession;
285 }
286 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700287 if (!ret.isOk()) {
288 ALOGE("%s: Transaction error opening a session for camera device %s: %s",
289 __FUNCTION__, id.c_str(), ret.description().c_str());
290 return DEAD_OBJECT;
291 }
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800292 return mapToStatusT(status);
293}
294
295status_t CameraProviderManager::openSession(const std::string &id,
Peter Kalauskasb7bd4382018-11-15 17:19:48 -0800296 const sp<device::V1_0::ICameraDeviceCallback>& callback,
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800297 /*out*/
Peter Kalauskasb7bd4382018-11-15 17:19:48 -0800298 sp<device::V1_0::ICameraDevice> *session) {
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800299
300 std::lock_guard<std::mutex> lock(mInterfaceMutex);
301
302 auto deviceInfo = findDeviceInfoLocked(id,
303 /*minVersion*/ {1,0}, /*maxVersion*/ {2,0});
304 if (deviceInfo == nullptr) return NAME_NOT_FOUND;
305
306 auto *deviceInfo1 = static_cast<ProviderInfo::DeviceInfo1*>(deviceInfo);
307
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700308 hardware::Return<Status> status = deviceInfo1->mInterface->open(callback);
309 if (!status.isOk()) {
310 ALOGE("%s: Transaction error opening a session for camera device %s: %s",
311 __FUNCTION__, id.c_str(), status.description().c_str());
312 return DEAD_OBJECT;
313 }
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800314 if (status == Status::OK) {
315 *session = deviceInfo1->mInterface;
316 }
317 return mapToStatusT(status);
318}
319
320
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800321hardware::Return<void> CameraProviderManager::onRegistration(
322 const hardware::hidl_string& /*fqName*/,
323 const hardware::hidl_string& name,
324 bool /*preexisting*/) {
Shuzhen Wang6ba8eb22018-07-08 13:10:44 -0700325 std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
Emilian Peevaee727d2017-05-04 16:35:48 +0100326 {
327 std::lock_guard<std::mutex> lock(mInterfaceMutex);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800328
Emilian Peevaee727d2017-05-04 16:35:48 +0100329 addProviderLocked(name);
330 }
331
332 sp<StatusListener> listener = getStatusListener();
333 if (nullptr != listener.get()) {
334 listener->onNewProviderRegistered();
335 }
336
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800337 return hardware::Return<void>();
338}
339
340status_t CameraProviderManager::dump(int fd, const Vector<String16>& args) {
341 std::lock_guard<std::mutex> lock(mInterfaceMutex);
342
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800343 for (auto& provider : mProviders) {
344 provider->dump(fd, args);
345 }
346 return OK;
347}
348
349CameraProviderManager::ProviderInfo::DeviceInfo* CameraProviderManager::findDeviceInfoLocked(
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800350 const std::string& id,
351 hardware::hidl_version minVersion, hardware::hidl_version maxVersion) const {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800352 for (auto& provider : mProviders) {
353 for (auto& deviceInfo : provider->mDevices) {
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800354 if (deviceInfo->mId == id &&
355 minVersion <= deviceInfo->mVersion && maxVersion >= deviceInfo->mVersion) {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800356 return deviceInfo.get();
357 }
358 }
359 }
360 return nullptr;
361}
362
Emilian Peev71c73a22017-03-21 16:35:51 +0000363metadata_vendor_id_t CameraProviderManager::getProviderTagIdLocked(
364 const std::string& id, hardware::hidl_version minVersion,
365 hardware::hidl_version maxVersion) const {
366 metadata_vendor_id_t ret = CAMERA_METADATA_INVALID_VENDOR_ID;
367
368 std::lock_guard<std::mutex> lock(mInterfaceMutex);
369 for (auto& provider : mProviders) {
370 for (auto& deviceInfo : provider->mDevices) {
371 if (deviceInfo->mId == id &&
372 minVersion <= deviceInfo->mVersion &&
373 maxVersion >= deviceInfo->mVersion) {
374 return provider->mProviderTagid;
375 }
376 }
377 }
378
379 return ret;
380}
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800381
Shuzhen Wang03d8cc12018-09-12 14:17:09 -0700382void CameraProviderManager::ProviderInfo::DeviceInfo3::queryPhysicalCameraIds() {
383 camera_metadata_entry_t entryCap;
Shuzhen Wange8aceb52018-05-21 12:00:56 -0700384
Shuzhen Wang03d8cc12018-09-12 14:17:09 -0700385 entryCap = mCameraCharacteristics.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
Shuzhen Wange8aceb52018-05-21 12:00:56 -0700386 for (size_t i = 0; i < entryCap.count; ++i) {
387 uint8_t capability = entryCap.data.u8[i];
388 if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA) {
Shuzhen Wang03d8cc12018-09-12 14:17:09 -0700389 mIsLogicalCamera = true;
Shuzhen Wange8aceb52018-05-21 12:00:56 -0700390 break;
391 }
392 }
Shuzhen Wang03d8cc12018-09-12 14:17:09 -0700393 if (!mIsLogicalCamera) {
394 return;
Shuzhen Wange8aceb52018-05-21 12:00:56 -0700395 }
396
Shuzhen Wang03d8cc12018-09-12 14:17:09 -0700397 camera_metadata_entry_t entryIds = mCameraCharacteristics.find(
398 ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS);
Shuzhen Wange8aceb52018-05-21 12:00:56 -0700399 const uint8_t* ids = entryIds.data.u8;
400 size_t start = 0;
401 for (size_t i = 0; i < entryIds.count; ++i) {
402 if (ids[i] == '\0') {
403 if (start != i) {
Shuzhen Wang03d8cc12018-09-12 14:17:09 -0700404 mPhysicalIds.push_back((const char*)ids+start);
Shuzhen Wange8aceb52018-05-21 12:00:56 -0700405 }
406 start = i+1;
407 }
408 }
Shuzhen Wang03d8cc12018-09-12 14:17:09 -0700409}
410
Shuzhen Wang268a1362018-10-16 16:32:59 -0700411status_t CameraProviderManager::ProviderInfo::DeviceInfo3::fixupMonochromeTags() {
412 status_t res = OK;
413 auto& c = mCameraCharacteristics;
414
415 // Override static metadata for MONOCHROME camera with older device version
416 if (mVersion.get_major() == 3 && mVersion.get_minor() < 5) {
417 camera_metadata_entry cap = c.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
418 for (size_t i = 0; i < cap.count; i++) {
419 if (cap.data.u8[i] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) {
420 // ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
421 uint8_t cfa = ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_MONO;
422 res = c.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, &cfa, 1);
423 if (res != OK) {
424 ALOGE("%s: Failed to update COLOR_FILTER_ARRANGEMENT: %s (%d)",
425 __FUNCTION__, strerror(-res), res);
426 return res;
427 }
428
429 // ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS
430 const std::vector<uint32_t> sKeys = {
431 ANDROID_SENSOR_REFERENCE_ILLUMINANT1,
432 ANDROID_SENSOR_REFERENCE_ILLUMINANT2,
433 ANDROID_SENSOR_CALIBRATION_TRANSFORM1,
434 ANDROID_SENSOR_CALIBRATION_TRANSFORM2,
435 ANDROID_SENSOR_COLOR_TRANSFORM1,
436 ANDROID_SENSOR_COLOR_TRANSFORM2,
437 ANDROID_SENSOR_FORWARD_MATRIX1,
438 ANDROID_SENSOR_FORWARD_MATRIX2,
439 };
440 res = removeAvailableKeys(c, sKeys,
441 ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS);
442 if (res != OK) {
443 ALOGE("%s: Failed to update REQUEST_AVAILABLE_CHARACTERISTICS_KEYS: %s (%d)",
444 __FUNCTION__, strerror(-res), res);
445 return res;
446 }
447
448 // ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS
449 const std::vector<uint32_t> reqKeys = {
450 ANDROID_COLOR_CORRECTION_MODE,
451 ANDROID_COLOR_CORRECTION_TRANSFORM,
452 ANDROID_COLOR_CORRECTION_GAINS,
453 };
454 res = removeAvailableKeys(c, reqKeys, ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS);
455 if (res != OK) {
456 ALOGE("%s: Failed to update REQUEST_AVAILABLE_REQUEST_KEYS: %s (%d)",
457 __FUNCTION__, strerror(-res), res);
458 return res;
459 }
460
461 // ANDROID_REQUEST_AVAILABLE_RESULT_KEYS
462 const std::vector<uint32_t> resKeys = {
463 ANDROID_SENSOR_GREEN_SPLIT,
464 ANDROID_SENSOR_NEUTRAL_COLOR_POINT,
465 ANDROID_COLOR_CORRECTION_MODE,
466 ANDROID_COLOR_CORRECTION_TRANSFORM,
467 ANDROID_COLOR_CORRECTION_GAINS,
468 };
469 res = removeAvailableKeys(c, resKeys, ANDROID_REQUEST_AVAILABLE_RESULT_KEYS);
470 if (res != OK) {
471 ALOGE("%s: Failed to update REQUEST_AVAILABLE_RESULT_KEYS: %s (%d)",
472 __FUNCTION__, strerror(-res), res);
473 return res;
474 }
475
476 // ANDROID_SENSOR_BLACK_LEVEL_PATTERN
477 camera_metadata_entry blEntry = c.find(ANDROID_SENSOR_BLACK_LEVEL_PATTERN);
478 for (size_t j = 1; j < blEntry.count; j++) {
479 blEntry.data.i32[j] = blEntry.data.i32[0];
480 }
481 }
482 }
483 }
484 return res;
485}
486
487status_t CameraProviderManager::ProviderInfo::DeviceInfo3::removeAvailableKeys(
488 CameraMetadata& c, const std::vector<uint32_t>& keys, uint32_t keyTag) {
489 status_t res = OK;
490
491 camera_metadata_entry keysEntry = c.find(keyTag);
492 if (keysEntry.count == 0) {
493 ALOGE("%s: Failed to find tag %u: %s (%d)", __FUNCTION__, keyTag, strerror(-res), res);
494 return res;
495 }
496 std::vector<int32_t> vKeys;
497 vKeys.reserve(keysEntry.count);
498 for (size_t i = 0; i < keysEntry.count; i++) {
499 if (std::find(keys.begin(), keys.end(), keysEntry.data.i32[i]) == keys.end()) {
500 vKeys.push_back(keysEntry.data.i32[i]);
501 }
502 }
503 res = c.update(keyTag, vKeys.data(), vKeys.size());
504 return res;
505}
506
Shuzhen Wang03d8cc12018-09-12 14:17:09 -0700507bool CameraProviderManager::isLogicalCamera(const std::string& id,
508 std::vector<std::string>* physicalCameraIds) {
509 std::lock_guard<std::mutex> lock(mInterfaceMutex);
510
511 auto deviceInfo = findDeviceInfoLocked(id);
512 if (deviceInfo == nullptr) return false;
513
514 if (deviceInfo->mIsLogicalCamera && physicalCameraIds != nullptr) {
515 *physicalCameraIds = deviceInfo->mPhysicalIds;
516 }
517 return deviceInfo->mIsLogicalCamera;
Shuzhen Wange8aceb52018-05-21 12:00:56 -0700518}
519
Shuzhen Wangf9d2c022018-08-21 12:07:35 -0700520bool CameraProviderManager::isHiddenPhysicalCamera(const std::string& cameraId) {
521 for (auto& provider : mProviders) {
522 for (auto& deviceInfo : provider->mDevices) {
523 if (deviceInfo->mId == cameraId) {
524 // cameraId is found in public camera IDs advertised by the
525 // provider.
526 return false;
527 }
528 }
529 }
530
531 for (auto& provider : mProviders) {
532 for (auto& deviceInfo : provider->mDevices) {
533 CameraMetadata info;
534 status_t res = deviceInfo->getCameraCharacteristics(&info);
535 if (res != OK) {
536 ALOGE("%s: Failed to getCameraCharacteristics for id %s", __FUNCTION__,
537 deviceInfo->mId.c_str());
538 return false;
539 }
540
541 std::vector<std::string> physicalIds;
Shuzhen Wang03d8cc12018-09-12 14:17:09 -0700542 if (deviceInfo->mIsLogicalCamera) {
543 if (std::find(deviceInfo->mPhysicalIds.begin(), deviceInfo->mPhysicalIds.end(),
544 cameraId) != deviceInfo->mPhysicalIds.end()) {
Shuzhen Wangf9d2c022018-08-21 12:07:35 -0700545 int deviceVersion = HARDWARE_DEVICE_API_VERSION(
546 deviceInfo->mVersion.get_major(), deviceInfo->mVersion.get_minor());
547 if (deviceVersion < CAMERA_DEVICE_API_VERSION_3_5) {
548 ALOGE("%s: Wrong deviceVersion %x for hiddenPhysicalCameraId %s",
549 __FUNCTION__, deviceVersion, cameraId.c_str());
550 return false;
551 } else {
552 return true;
553 }
554 }
555 }
556 }
557 }
558
559 return false;
560}
561
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700562status_t CameraProviderManager::addProviderLocked(const std::string& newProvider, bool expected) {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800563 for (const auto& providerInfo : mProviders) {
564 if (providerInfo->mProviderName == newProvider) {
565 ALOGW("%s: Camera provider HAL with name '%s' already registered", __FUNCTION__,
566 newProvider.c_str());
567 return ALREADY_EXISTS;
568 }
569 }
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700570
571 sp<provider::V2_4::ICameraProvider> interface;
572 interface = mServiceProxy->getService(newProvider);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800573
574 if (interface == nullptr) {
575 if (expected) {
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700576 ALOGE("%s: Camera provider HAL '%s' is not actually available", __FUNCTION__,
577 newProvider.c_str());
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800578 return BAD_VALUE;
579 } else {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800580 return OK;
581 }
582 }
583
584 sp<ProviderInfo> providerInfo =
585 new ProviderInfo(newProvider, interface, this);
586 status_t res = providerInfo->initialize();
587 if (res != OK) {
588 return res;
589 }
590
591 mProviders.push_back(providerInfo);
592
593 return OK;
594}
595
596status_t CameraProviderManager::removeProvider(const std::string& provider) {
Shuzhen Wang6ba8eb22018-07-08 13:10:44 -0700597 std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700598 std::unique_lock<std::mutex> lock(mInterfaceMutex);
599 std::vector<String8> removedDeviceIds;
600 status_t res = NAME_NOT_FOUND;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800601 for (auto it = mProviders.begin(); it != mProviders.end(); it++) {
602 if ((*it)->mProviderName == provider) {
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700603 removedDeviceIds.reserve((*it)->mDevices.size());
604 for (auto& deviceInfo : (*it)->mDevices) {
605 removedDeviceIds.push_back(String8(deviceInfo->mId.c_str()));
606 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800607 mProviders.erase(it);
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700608 res = OK;
609 break;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800610 }
611 }
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700612 if (res != OK) {
613 ALOGW("%s: Camera provider HAL with name '%s' is not registered", __FUNCTION__,
614 provider.c_str());
615 } else {
616 // Inform camera service of loss of presence for all the devices from this provider,
617 // without lock held for reentrancy
618 sp<StatusListener> listener = getStatusListener();
619 if (listener != nullptr) {
620 lock.unlock();
621 for (auto& id : removedDeviceIds) {
622 listener->onDeviceStatusChanged(id, CameraDeviceStatus::NOT_PRESENT);
623 }
624 }
625 }
626 return res;
627}
628
629sp<CameraProviderManager::StatusListener> CameraProviderManager::getStatusListener() const {
630 return mListener.promote();
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800631}
632
633/**** Methods for ProviderInfo ****/
634
635
636CameraProviderManager::ProviderInfo::ProviderInfo(
637 const std::string &providerName,
638 sp<provider::V2_4::ICameraProvider>& interface,
639 CameraProviderManager *manager) :
640 mProviderName(providerName),
641 mInterface(interface),
Emilian Peev71c73a22017-03-21 16:35:51 +0000642 mProviderTagid(generateVendorTagId(providerName)),
Emilian Peevcdb74a62017-05-11 20:29:52 +0100643 mUniqueDeviceCount(0),
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800644 mManager(manager) {
645 (void) mManager;
646}
647
648status_t CameraProviderManager::ProviderInfo::initialize() {
649 status_t res = parseProviderName(mProviderName, &mType, &mId);
650 if (res != OK) {
651 ALOGE("%s: Invalid provider name, ignoring", __FUNCTION__);
652 return BAD_VALUE;
653 }
Yin-Chia Yeh65405092017-01-13 15:42:28 -0800654 ALOGI("Connecting to new camera provider: %s, isRemote? %d",
655 mProviderName.c_str(), mInterface->isRemote());
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800656 // cameraDeviceStatusChange callbacks may be called (and causing new devices added)
657 // before setCallback returns
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700658 hardware::Return<Status> status = mInterface->setCallback(this);
659 if (!status.isOk()) {
660 ALOGE("%s: Transaction error setting up callbacks with camera provider '%s': %s",
661 __FUNCTION__, mProviderName.c_str(), status.description().c_str());
662 return DEAD_OBJECT;
663 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800664 if (status != Status::OK) {
665 ALOGE("%s: Unable to register callbacks with camera provider '%s'",
666 __FUNCTION__, mProviderName.c_str());
667 return mapToStatusT(status);
668 }
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700669
670 hardware::Return<bool> linked = mInterface->linkToDeath(this, /*cookie*/ mId);
671 if (!linked.isOk()) {
672 ALOGE("%s: Transaction error in linking to camera provider '%s' death: %s",
673 __FUNCTION__, mProviderName.c_str(), linked.description().c_str());
674 return DEAD_OBJECT;
675 } else if (!linked) {
676 ALOGW("%s: Unable to link to provider '%s' death notifications",
677 __FUNCTION__, mProviderName.c_str());
678 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800679
680 // Get initial list of camera devices, if any
681 std::vector<std::string> devices;
Shuzhen Wangf9d2c022018-08-21 12:07:35 -0700682 hardware::Return<void> ret = mInterface->getCameraIdList([&status, this, &devices](
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800683 Status idStatus,
684 const hardware::hidl_vec<hardware::hidl_string>& cameraDeviceNames) {
685 status = idStatus;
686 if (status == Status::OK) {
Shuzhen Wangf9d2c022018-08-21 12:07:35 -0700687 for (auto& name : cameraDeviceNames) {
688 uint16_t major, minor;
689 std::string type, id;
690 status_t res = parseDeviceName(name, &major, &minor, &type, &id);
691 if (res != OK) {
692 ALOGE("%s: Error parsing deviceName: %s: %d", __FUNCTION__, name.c_str(), res);
693 status = Status::INTERNAL_ERROR;
694 } else {
695 devices.push_back(name);
696 mProviderPublicCameraIds.push_back(id);
697 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800698 }
699 } });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700700 if (!ret.isOk()) {
701 ALOGE("%s: Transaction error in getting camera ID list from provider '%s': %s",
702 __FUNCTION__, mProviderName.c_str(), linked.description().c_str());
703 return DEAD_OBJECT;
704 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800705 if (status != Status::OK) {
706 ALOGE("%s: Unable to query for camera devices from provider '%s'",
707 __FUNCTION__, mProviderName.c_str());
708 return mapToStatusT(status);
709 }
710
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700711 sp<StatusListener> listener = mManager->getStatusListener();
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800712 for (auto& device : devices) {
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700713 std::string id;
Peter Kalauskasb7bd4382018-11-15 17:19:48 -0800714 status_t res = addDevice(device, common::V1_0::CameraDeviceStatus::PRESENT, &id);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800715 if (res != OK) {
716 ALOGE("%s: Unable to enumerate camera device '%s': %s (%d)",
717 __FUNCTION__, device.c_str(), strerror(-res), res);
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700718 continue;
719 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800720 }
721
Peter Kalauskas1b3c9072018-11-07 12:41:53 -0800722 res = setUpVendorTags();
723 if (res != OK) {
724 ALOGE("%s: Unable to set up vendor tags from provider '%s'",
725 __FUNCTION__, mProviderName.c_str());
726 return res;
727 }
728
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800729 ALOGI("Camera provider %s ready with %zu camera devices",
730 mProviderName.c_str(), mDevices.size());
731
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800732 mInitialized = true;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800733 return OK;
734}
735
736const std::string& CameraProviderManager::ProviderInfo::getType() const {
737 return mType;
738}
739
740status_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name,
741 CameraDeviceStatus initialStatus, /*out*/ std::string* parsedId) {
742
743 ALOGI("Enumerating new camera device: %s", name.c_str());
744
745 uint16_t major, minor;
746 std::string type, id;
747
748 status_t res = parseDeviceName(name, &major, &minor, &type, &id);
749 if (res != OK) {
750 return res;
751 }
752 if (type != mType) {
753 ALOGE("%s: Device type %s does not match provider type %s", __FUNCTION__,
754 type.c_str(), mType.c_str());
755 return BAD_VALUE;
756 }
757 if (mManager->isValidDeviceLocked(id, major)) {
758 ALOGE("%s: Device %s: ID %s is already in use for device major version %d", __FUNCTION__,
759 name.c_str(), id.c_str(), major);
760 return BAD_VALUE;
761 }
762
763 std::unique_ptr<DeviceInfo> deviceInfo;
764 switch (major) {
765 case 1:
Emilian Peev71c73a22017-03-21 16:35:51 +0000766 deviceInfo = initializeDeviceInfo<DeviceInfo1>(name, mProviderTagid,
767 id, minor);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800768 break;
769 case 3:
Emilian Peev71c73a22017-03-21 16:35:51 +0000770 deviceInfo = initializeDeviceInfo<DeviceInfo3>(name, mProviderTagid,
771 id, minor);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800772 break;
773 default:
774 ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__,
775 name.c_str(), major);
776 return BAD_VALUE;
777 }
778 if (deviceInfo == nullptr) return BAD_VALUE;
779 deviceInfo->mStatus = initialStatus;
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800780 bool isAPI1Compatible = deviceInfo->isAPI1Compatible();
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800781
782 mDevices.push_back(std::move(deviceInfo));
783
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800784 mUniqueCameraIds.insert(id);
785 if (isAPI1Compatible) {
Shuzhen Wang975a39e2018-06-27 14:35:46 -0700786 // addDevice can be called more than once for the same camera id if HAL
787 // supports openLegacy.
788 if (std::find(mUniqueAPI1CompatibleCameraIds.begin(), mUniqueAPI1CompatibleCameraIds.end(),
789 id) == mUniqueAPI1CompatibleCameraIds.end()) {
790 mUniqueAPI1CompatibleCameraIds.push_back(id);
791 }
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800792 }
793
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800794 if (parsedId != nullptr) {
795 *parsedId = id;
796 }
797 return OK;
798}
799
Guennadi Liakhovetski6034bf52017-12-07 10:28:29 +0100800void CameraProviderManager::ProviderInfo::removeDevice(std::string id) {
801 for (auto it = mDevices.begin(); it != mDevices.end(); it++) {
802 if ((*it)->mId == id) {
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800803 mUniqueCameraIds.erase(id);
804 if ((*it)->isAPI1Compatible()) {
Shuzhen Wange8aceb52018-05-21 12:00:56 -0700805 mUniqueAPI1CompatibleCameraIds.erase(std::remove(
806 mUniqueAPI1CompatibleCameraIds.begin(),
807 mUniqueAPI1CompatibleCameraIds.end(), id));
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800808 }
Guennadi Liakhovetski6034bf52017-12-07 10:28:29 +0100809 mDevices.erase(it);
810 break;
811 }
812 }
813}
814
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800815status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const {
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700816 dprintf(fd, "== Camera Provider HAL %s (v2.4, %s) static info: %zu devices: ==\n",
817 mProviderName.c_str(), mInterface->isRemote() ? "remote" : "passthrough",
818 mDevices.size());
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800819
820 for (auto& device : mDevices) {
Eino-Ville Talvalad00111e2017-01-31 11:59:12 -0800821 dprintf(fd, "== Camera HAL device %s (v%d.%d) static information: ==\n", device->mName.c_str(),
822 device->mVersion.get_major(), device->mVersion.get_minor());
823 dprintf(fd, " Resource cost: %d\n", device->mResourceCost.resourceCost);
824 if (device->mResourceCost.conflictingDevices.size() == 0) {
825 dprintf(fd, " Conflicting devices: None\n");
826 } else {
827 dprintf(fd, " Conflicting devices:\n");
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800828 for (size_t i = 0; i < device->mResourceCost.conflictingDevices.size(); i++) {
Eino-Ville Talvalad00111e2017-01-31 11:59:12 -0800829 dprintf(fd, " %s\n",
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800830 device->mResourceCost.conflictingDevices[i].c_str());
831 }
832 }
Eino-Ville Talvalad00111e2017-01-31 11:59:12 -0800833 dprintf(fd, " API1 info:\n");
834 dprintf(fd, " Has a flash unit: %s\n",
835 device->hasFlashUnit() ? "true" : "false");
836 hardware::CameraInfo info;
837 status_t res = device->getCameraInfo(&info);
838 if (res != OK) {
839 dprintf(fd, " <Error reading camera info: %s (%d)>\n",
840 strerror(-res), res);
841 } else {
842 dprintf(fd, " Facing: %s\n",
843 info.facing == hardware::CAMERA_FACING_BACK ? "Back" : "Front");
844 dprintf(fd, " Orientation: %d\n", info.orientation);
845 }
846 CameraMetadata info2;
847 res = device->getCameraCharacteristics(&info2);
848 if (res == INVALID_OPERATION) {
849 dprintf(fd, " API2 not directly supported\n");
850 } else if (res != OK) {
851 dprintf(fd, " <Error reading camera characteristics: %s (%d)>\n",
852 strerror(-res), res);
853 } else {
854 dprintf(fd, " API2 camera characteristics:\n");
855 info2.dump(fd, /*verbosity*/ 2, /*indentation*/ 4);
856 }
Yin-Chia Yeh487785a2018-01-02 12:06:57 -0800857
Shuzhen Wangf9d2c022018-08-21 12:07:35 -0700858 // Dump characteristics of non-standalone physical camera
Shuzhen Wang03d8cc12018-09-12 14:17:09 -0700859 if (device->mIsLogicalCamera) {
860 for (auto& id : device->mPhysicalIds) {
Shuzhen Wangf9d2c022018-08-21 12:07:35 -0700861 // Skip if physical id is an independent camera
862 if (std::find(mProviderPublicCameraIds.begin(), mProviderPublicCameraIds.end(), id)
863 != mProviderPublicCameraIds.end()) {
864 continue;
865 }
866
867 CameraMetadata physicalInfo;
868 status_t status = device->getPhysicalCameraCharacteristics(id, &physicalInfo);
869 if (status == OK) {
870 dprintf(fd, " Physical camera %s characteristics:\n", id.c_str());
871 physicalInfo.dump(fd, /*verbosity*/ 2, /*indentation*/ 4);
872 }
873 }
874 }
875
Yin-Chia Yeh487785a2018-01-02 12:06:57 -0800876 dprintf(fd, "== Camera HAL device %s (v%d.%d) dumpState: ==\n", device->mName.c_str(),
877 device->mVersion.get_major(), device->mVersion.get_minor());
878 res = device->dumpState(fd);
879 if (res != OK) {
880 dprintf(fd, " <Error dumping device %s state: %s (%d)>\n",
881 device->mName.c_str(), strerror(-res), res);
882 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800883 }
884 return OK;
885}
886
887hardware::Return<void> CameraProviderManager::ProviderInfo::cameraDeviceStatusChange(
888 const hardware::hidl_string& cameraDeviceName,
889 CameraDeviceStatus newStatus) {
890 sp<StatusListener> listener;
891 std::string id;
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800892 bool initialized = false;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800893 {
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700894 std::lock_guard<std::mutex> lock(mLock);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800895 bool known = false;
896 for (auto& deviceInfo : mDevices) {
897 if (deviceInfo->mName == cameraDeviceName) {
898 ALOGI("Camera device %s status is now %s, was %s", cameraDeviceName.c_str(),
899 deviceStatusToString(newStatus), deviceStatusToString(deviceInfo->mStatus));
900 deviceInfo->mStatus = newStatus;
901 // TODO: Handle device removal (NOT_PRESENT)
902 id = deviceInfo->mId;
903 known = true;
904 break;
905 }
906 }
907 // Previously unseen device; status must not be NOT_PRESENT
908 if (!known) {
909 if (newStatus == CameraDeviceStatus::NOT_PRESENT) {
910 ALOGW("Camera provider %s says an unknown camera device %s is not present. Curious.",
911 mProviderName.c_str(), cameraDeviceName.c_str());
912 return hardware::Void();
913 }
914 addDevice(cameraDeviceName, newStatus, &id);
Guennadi Liakhovetski6034bf52017-12-07 10:28:29 +0100915 } else if (newStatus == CameraDeviceStatus::NOT_PRESENT) {
916 removeDevice(id);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800917 }
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700918 listener = mManager->getStatusListener();
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800919 initialized = mInitialized;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800920 }
921 // Call without lock held to allow reentrancy into provider manager
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800922 // Don't send the callback if providerInfo hasn't been initialized.
923 // CameraService will initialize device status after provider is
924 // initialized
925 if (listener != nullptr && initialized) {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800926 listener->onDeviceStatusChanged(String8(id.c_str()), newStatus);
927 }
928 return hardware::Void();
929}
930
931hardware::Return<void> CameraProviderManager::ProviderInfo::torchModeStatusChange(
932 const hardware::hidl_string& cameraDeviceName,
933 TorchModeStatus newStatus) {
934 sp<StatusListener> listener;
935 std::string id;
936 {
Yin-Chia Yeh52778d42016-12-22 18:20:43 -0800937 std::lock_guard<std::mutex> lock(mManager->mStatusListenerMutex);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800938 bool known = false;
939 for (auto& deviceInfo : mDevices) {
940 if (deviceInfo->mName == cameraDeviceName) {
941 ALOGI("Camera device %s torch status is now %s", cameraDeviceName.c_str(),
942 torchStatusToString(newStatus));
943 id = deviceInfo->mId;
944 known = true;
945 break;
946 }
947 }
948 if (!known) {
949 ALOGW("Camera provider %s says an unknown camera %s now has torch status %d. Curious.",
950 mProviderName.c_str(), cameraDeviceName.c_str(), newStatus);
951 return hardware::Void();
952 }
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700953 listener = mManager->getStatusListener();
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800954 }
955 // Call without lock held to allow reentrancy into provider manager
956 if (listener != nullptr) {
957 listener->onTorchStatusChanged(String8(id.c_str()), newStatus);
958 }
959 return hardware::Void();
960}
961
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700962void CameraProviderManager::ProviderInfo::serviceDied(uint64_t cookie,
963 const wp<hidl::base::V1_0::IBase>& who) {
964 (void) who;
965 ALOGI("Camera provider '%s' has died; removing it", mProviderName.c_str());
966 if (cookie != mId) {
967 ALOGW("%s: Unexpected serviceDied cookie %" PRIu64 ", expected %" PRIu32,
968 __FUNCTION__, cookie, mId);
969 }
970 mManager->removeProvider(mProviderName);
971}
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800972
Peter Kalauskas1b3c9072018-11-07 12:41:53 -0800973status_t CameraProviderManager::ProviderInfo::setUpVendorTags() {
974 if (mVendorTagDescriptor != nullptr)
975 return OK;
976
977 hardware::hidl_vec<VendorTagSection> vts;
978 Status status;
979 hardware::Return<void> ret;
980 ret = mInterface->getVendorTags(
981 [&](auto s, const auto& vendorTagSecs) {
982 status = s;
983 if (s == Status::OK) {
984 vts = vendorTagSecs;
985 }
986 });
987 if (!ret.isOk()) {
988 ALOGE("%s: Transaction error getting vendor tags from provider '%s': %s",
989 __FUNCTION__, mProviderName.c_str(), ret.description().c_str());
990 return DEAD_OBJECT;
991 }
992 if (status != Status::OK) {
993 return mapToStatusT(status);
994 }
995
996 // Read all vendor tag definitions into a descriptor
997 status_t res;
998 if ((res = HidlVendorTagDescriptor::createDescriptorFromHidl(vts, /*out*/mVendorTagDescriptor))
999 != OK) {
1000 ALOGE("%s: Could not generate descriptor from vendor tag operations,"
1001 "received error %s (%d). Camera clients will not be able to use"
1002 "vendor tags", __FUNCTION__, strerror(res), res);
1003 return res;
1004 }
1005
1006 return OK;
1007}
1008
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001009template<class DeviceInfoT>
1010std::unique_ptr<CameraProviderManager::ProviderInfo::DeviceInfo>
1011 CameraProviderManager::ProviderInfo::initializeDeviceInfo(
Emilian Peev71c73a22017-03-21 16:35:51 +00001012 const std::string &name, const metadata_vendor_id_t tagId,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001013 const std::string &id, uint16_t minorVersion) const {
1014 Status status;
1015
1016 auto cameraInterface =
1017 getDeviceInterface<typename DeviceInfoT::InterfaceT>(name);
1018 if (cameraInterface == nullptr) return nullptr;
1019
1020 CameraResourceCost resourceCost;
1021 cameraInterface->getResourceCost([&status, &resourceCost](
1022 Status s, CameraResourceCost cost) {
1023 status = s;
1024 resourceCost = cost;
1025 });
1026 if (status != Status::OK) {
1027 ALOGE("%s: Unable to obtain resource costs for camera device %s: %s", __FUNCTION__,
1028 name.c_str(), statusToString(status));
1029 return nullptr;
1030 }
Shuzhen Wang47283692018-04-24 18:05:02 -07001031
1032 for (auto& conflictName : resourceCost.conflictingDevices) {
1033 uint16_t major, minor;
1034 std::string type, id;
1035 status_t res = parseDeviceName(conflictName, &major, &minor, &type, &id);
1036 if (res != OK) {
1037 ALOGE("%s: Failed to parse conflicting device %s", __FUNCTION__, conflictName.c_str());
1038 return nullptr;
1039 }
1040 conflictName = id;
1041 }
1042
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001043 return std::unique_ptr<DeviceInfo>(
Emilian Peev71c73a22017-03-21 16:35:51 +00001044 new DeviceInfoT(name, tagId, id, minorVersion, resourceCost,
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001045 mProviderPublicCameraIds, cameraInterface));
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001046}
1047
1048template<class InterfaceT>
1049sp<InterfaceT>
1050CameraProviderManager::ProviderInfo::getDeviceInterface(const std::string &name) const {
1051 ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__,
1052 name.c_str(), InterfaceT::version.get_major());
1053 return nullptr;
1054}
1055
1056template<>
1057sp<device::V1_0::ICameraDevice>
1058CameraProviderManager::ProviderInfo::getDeviceInterface
1059 <device::V1_0::ICameraDevice>(const std::string &name) const {
1060 Status status;
1061 sp<device::V1_0::ICameraDevice> cameraInterface;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001062 hardware::Return<void> ret;
1063 ret = mInterface->getCameraDeviceInterface_V1_x(name, [&status, &cameraInterface](
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001064 Status s, sp<device::V1_0::ICameraDevice> interface) {
1065 status = s;
1066 cameraInterface = interface;
1067 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001068 if (!ret.isOk()) {
1069 ALOGE("%s: Transaction error trying to obtain interface for camera device %s: %s",
1070 __FUNCTION__, name.c_str(), ret.description().c_str());
1071 return nullptr;
1072 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001073 if (status != Status::OK) {
1074 ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__,
1075 name.c_str(), statusToString(status));
1076 return nullptr;
1077 }
1078 return cameraInterface;
1079}
1080
1081template<>
1082sp<device::V3_2::ICameraDevice>
1083CameraProviderManager::ProviderInfo::getDeviceInterface
1084 <device::V3_2::ICameraDevice>(const std::string &name) const {
1085 Status status;
1086 sp<device::V3_2::ICameraDevice> cameraInterface;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001087 hardware::Return<void> ret;
1088 ret = mInterface->getCameraDeviceInterface_V3_x(name, [&status, &cameraInterface](
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001089 Status s, sp<device::V3_2::ICameraDevice> interface) {
1090 status = s;
1091 cameraInterface = interface;
1092 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001093 if (!ret.isOk()) {
1094 ALOGE("%s: Transaction error trying to obtain interface for camera device %s: %s",
1095 __FUNCTION__, name.c_str(), ret.description().c_str());
1096 return nullptr;
1097 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001098 if (status != Status::OK) {
1099 ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__,
1100 name.c_str(), statusToString(status));
1101 return nullptr;
1102 }
1103 return cameraInterface;
1104}
1105
1106CameraProviderManager::ProviderInfo::DeviceInfo::~DeviceInfo() {}
1107
1108template<class InterfaceT>
1109status_t CameraProviderManager::ProviderInfo::DeviceInfo::setTorchMode(InterfaceT& interface,
1110 bool enabled) {
1111 Status s = interface->setTorchMode(enabled ? TorchMode::ON : TorchMode::OFF);
1112 return mapToStatusT(s);
1113}
1114
1115CameraProviderManager::ProviderInfo::DeviceInfo1::DeviceInfo1(const std::string& name,
Emilian Peev71c73a22017-03-21 16:35:51 +00001116 const metadata_vendor_id_t tagId, const std::string &id,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001117 uint16_t minorVersion,
1118 const CameraResourceCost& resourceCost,
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001119 const std::vector<std::string>& publicCameraIds,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001120 sp<InterfaceT> interface) :
Emilian Peev71c73a22017-03-21 16:35:51 +00001121 DeviceInfo(name, tagId, id, hardware::hidl_version{1, minorVersion},
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001122 publicCameraIds, resourceCost),
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001123 mInterface(interface) {
1124 // Get default parameters and initialize flash unit availability
1125 // Requires powering on the camera device
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001126 hardware::Return<Status> status = mInterface->open(nullptr);
1127 if (!status.isOk()) {
1128 ALOGE("%s: Transaction error opening camera device %s to check for a flash unit: %s",
1129 __FUNCTION__, mId.c_str(), status.description().c_str());
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001130 return;
1131 }
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001132 if (status != Status::OK) {
1133 ALOGE("%s: Unable to open camera device %s to check for a flash unit: %s", __FUNCTION__,
1134 mId.c_str(), CameraProviderManager::statusToString(status));
1135 return;
1136 }
1137 hardware::Return<void> ret;
1138 ret = mInterface->getParameters([this](const hardware::hidl_string& parms) {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001139 mDefaultParameters.unflatten(String8(parms.c_str()));
1140 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001141 if (!ret.isOk()) {
1142 ALOGE("%s: Transaction error reading camera device %s params to check for a flash unit: %s",
1143 __FUNCTION__, mId.c_str(), status.description().c_str());
1144 return;
1145 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001146 const char *flashMode =
1147 mDefaultParameters.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES);
1148 if (flashMode && strstr(flashMode, CameraParameters::FLASH_MODE_TORCH)) {
1149 mHasFlashUnit = true;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001150 }
1151
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001152 ret = mInterface->close();
1153 if (!ret.isOk()) {
1154 ALOGE("%s: Transaction error closing camera device %s after check for a flash unit: %s",
1155 __FUNCTION__, mId.c_str(), status.description().c_str());
1156 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001157}
1158
1159CameraProviderManager::ProviderInfo::DeviceInfo1::~DeviceInfo1() {}
1160
1161status_t CameraProviderManager::ProviderInfo::DeviceInfo1::setTorchMode(bool enabled) {
1162 return DeviceInfo::setTorchMode(mInterface, enabled);
1163}
1164
1165status_t CameraProviderManager::ProviderInfo::DeviceInfo1::getCameraInfo(
1166 hardware::CameraInfo *info) const {
1167 if (info == nullptr) return BAD_VALUE;
1168
1169 Status status;
1170 device::V1_0::CameraInfo cInfo;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001171 hardware::Return<void> ret;
1172 ret = mInterface->getCameraInfo([&status, &cInfo](Status s, device::V1_0::CameraInfo camInfo) {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001173 status = s;
1174 cInfo = camInfo;
1175 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001176 if (!ret.isOk()) {
1177 ALOGE("%s: Transaction error reading camera info from device %s: %s",
1178 __FUNCTION__, mId.c_str(), ret.description().c_str());
1179 return DEAD_OBJECT;
1180 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001181 if (status != Status::OK) {
1182 return mapToStatusT(status);
1183 }
1184
1185 switch(cInfo.facing) {
1186 case device::V1_0::CameraFacing::BACK:
1187 info->facing = hardware::CAMERA_FACING_BACK;
1188 break;
1189 case device::V1_0::CameraFacing::EXTERNAL:
1190 // Map external to front for legacy API
1191 case device::V1_0::CameraFacing::FRONT:
1192 info->facing = hardware::CAMERA_FACING_FRONT;
1193 break;
1194 default:
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001195 ALOGW("%s: Device %s: Unknown camera facing: %d",
1196 __FUNCTION__, mId.c_str(), cInfo.facing);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001197 info->facing = hardware::CAMERA_FACING_BACK;
1198 }
1199 info->orientation = cInfo.orientation;
1200
1201 return OK;
1202}
1203
Yin-Chia Yeh487785a2018-01-02 12:06:57 -08001204status_t CameraProviderManager::ProviderInfo::DeviceInfo1::dumpState(int fd) const {
1205 native_handle_t* handle = native_handle_create(1,0);
1206 handle->data[0] = fd;
1207 hardware::Return<Status> s = mInterface->dumpState(handle);
1208 native_handle_delete(handle);
1209 if (!s.isOk()) {
1210 return INVALID_OPERATION;
1211 }
1212 return mapToStatusT(s);
1213}
1214
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001215CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string& name,
Emilian Peev71c73a22017-03-21 16:35:51 +00001216 const metadata_vendor_id_t tagId, const std::string &id,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001217 uint16_t minorVersion,
1218 const CameraResourceCost& resourceCost,
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001219 const std::vector<std::string>& publicCameraIds,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001220 sp<InterfaceT> interface) :
Emilian Peev71c73a22017-03-21 16:35:51 +00001221 DeviceInfo(name, tagId, id, hardware::hidl_version{3, minorVersion},
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001222 publicCameraIds, resourceCost),
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001223 mInterface(interface) {
1224 // Get camera characteristics and initialize flash unit availability
1225 Status status;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001226 hardware::Return<void> ret;
1227 ret = mInterface->getCameraCharacteristics([&status, this](Status s,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001228 device::V3_2::CameraMetadata metadata) {
1229 status = s;
1230 if (s == Status::OK) {
1231 camera_metadata_t *buffer =
1232 reinterpret_cast<camera_metadata_t*>(metadata.data());
Yin-Chia Yeh238ef5f2017-04-18 15:01:15 -07001233 size_t expectedSize = metadata.size();
1234 int res = validate_camera_metadata_structure(buffer, &expectedSize);
1235 if (res == OK || res == CAMERA_METADATA_VALIDATION_SHIFTED) {
1236 set_camera_metadata_vendor_id(buffer, mProviderTagid);
1237 mCameraCharacteristics = buffer;
1238 } else {
1239 ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__);
1240 status = Status::INTERNAL_ERROR;
1241 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001242 }
1243 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001244 if (!ret.isOk()) {
1245 ALOGE("%s: Transaction error getting camera characteristics for device %s"
1246 " to check for a flash unit: %s", __FUNCTION__, mId.c_str(),
1247 ret.description().c_str());
1248 return;
1249 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001250 if (status != Status::OK) {
1251 ALOGE("%s: Unable to get camera characteristics for device %s: %s (%d)",
1252 __FUNCTION__, mId.c_str(), CameraProviderManager::statusToString(status), status);
1253 return;
1254 }
Shuzhen Wang268a1362018-10-16 16:32:59 -07001255 status_t res = fixupMonochromeTags();
1256 if (OK != res) {
1257 ALOGE("%s: Unable to fix up monochrome tags based for older HAL version: %s (%d)",
1258 __FUNCTION__, strerror(-res), res);
1259 return;
1260 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001261 camera_metadata_entry flashAvailable =
1262 mCameraCharacteristics.find(ANDROID_FLASH_INFO_AVAILABLE);
1263 if (flashAvailable.count == 1 &&
1264 flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE) {
1265 mHasFlashUnit = true;
1266 } else {
1267 mHasFlashUnit = false;
1268 }
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001269
Shuzhen Wang03d8cc12018-09-12 14:17:09 -07001270 queryPhysicalCameraIds();
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001271 // Get physical camera characteristics if applicable
1272 auto castResult = device::V3_5::ICameraDevice::castFrom(mInterface);
1273 if (!castResult.isOk()) {
1274 ALOGV("%s: Unable to convert ICameraDevice instance to version 3.5", __FUNCTION__);
1275 return;
1276 }
Peter Kalauskasb7bd4382018-11-15 17:19:48 -08001277 sp<device::V3_5::ICameraDevice> interface_3_5 = castResult;
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001278 if (interface_3_5 == nullptr) {
1279 ALOGE("%s: Converted ICameraDevice instance to nullptr", __FUNCTION__);
1280 return;
1281 }
1282
Shuzhen Wang03d8cc12018-09-12 14:17:09 -07001283 if (mIsLogicalCamera) {
1284 for (auto& id : mPhysicalIds) {
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001285 if (std::find(mPublicCameraIds.begin(), mPublicCameraIds.end(), id) !=
1286 mPublicCameraIds.end()) {
1287 continue;
1288 }
1289
1290 hardware::hidl_string hidlId(id);
1291 ret = interface_3_5->getPhysicalCameraCharacteristics(hidlId,
1292 [&status, &id, this](Status s, device::V3_2::CameraMetadata metadata) {
1293 status = s;
1294 if (s == Status::OK) {
1295 camera_metadata_t *buffer =
1296 reinterpret_cast<camera_metadata_t*>(metadata.data());
1297 size_t expectedSize = metadata.size();
1298 int res = validate_camera_metadata_structure(buffer, &expectedSize);
1299 if (res == OK || res == CAMERA_METADATA_VALIDATION_SHIFTED) {
1300 set_camera_metadata_vendor_id(buffer, mProviderTagid);
1301 mPhysicalCameraCharacteristics[id] = buffer;
1302 } else {
1303 ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__);
1304 status = Status::INTERNAL_ERROR;
1305 }
1306 }
1307 });
1308
1309 if (!ret.isOk()) {
1310 ALOGE("%s: Transaction error getting physical camera %s characteristics for %s: %s",
1311 __FUNCTION__, id.c_str(), mId.c_str(), ret.description().c_str());
1312 return;
1313 }
1314 if (status != Status::OK) {
1315 ALOGE("%s: Unable to get physical camera %s characteristics for device %s: %s (%d)",
1316 __FUNCTION__, id.c_str(), mId.c_str(),
1317 CameraProviderManager::statusToString(status), status);
1318 return;
1319 }
1320 }
1321 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001322}
1323
1324CameraProviderManager::ProviderInfo::DeviceInfo3::~DeviceInfo3() {}
1325
1326status_t CameraProviderManager::ProviderInfo::DeviceInfo3::setTorchMode(bool enabled) {
1327 return DeviceInfo::setTorchMode(mInterface, enabled);
1328}
1329
1330status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraInfo(
1331 hardware::CameraInfo *info) const {
1332 if (info == nullptr) return BAD_VALUE;
1333
1334 camera_metadata_ro_entry facing =
1335 mCameraCharacteristics.find(ANDROID_LENS_FACING);
1336 if (facing.count == 1) {
1337 switch (facing.data.u8[0]) {
1338 case ANDROID_LENS_FACING_BACK:
1339 info->facing = hardware::CAMERA_FACING_BACK;
1340 break;
1341 case ANDROID_LENS_FACING_EXTERNAL:
1342 // Map external to front for legacy API
1343 case ANDROID_LENS_FACING_FRONT:
1344 info->facing = hardware::CAMERA_FACING_FRONT;
1345 break;
1346 }
1347 } else {
1348 ALOGE("%s: Unable to find android.lens.facing static metadata", __FUNCTION__);
1349 return NAME_NOT_FOUND;
1350 }
1351
1352 camera_metadata_ro_entry orientation =
1353 mCameraCharacteristics.find(ANDROID_SENSOR_ORIENTATION);
1354 if (orientation.count == 1) {
1355 info->orientation = orientation.data.i32[0];
1356 } else {
1357 ALOGE("%s: Unable to find android.sensor.orientation static metadata", __FUNCTION__);
1358 return NAME_NOT_FOUND;
1359 }
1360
1361 return OK;
1362}
Emilian Peevf53f66e2017-04-11 14:29:43 +01001363bool CameraProviderManager::ProviderInfo::DeviceInfo3::isAPI1Compatible() const {
1364 bool isBackwardCompatible = false;
1365 camera_metadata_ro_entry_t caps = mCameraCharacteristics.find(
1366 ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
1367 for (size_t i = 0; i < caps.count; i++) {
1368 if (caps.data.u8[i] ==
1369 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) {
1370 isBackwardCompatible = true;
1371 break;
1372 }
1373 }
1374
1375 return isBackwardCompatible;
1376}
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001377
Yin-Chia Yeh487785a2018-01-02 12:06:57 -08001378status_t CameraProviderManager::ProviderInfo::DeviceInfo3::dumpState(int fd) const {
1379 native_handle_t* handle = native_handle_create(1,0);
1380 handle->data[0] = fd;
1381 auto ret = mInterface->dumpState(handle);
1382 native_handle_delete(handle);
1383 if (!ret.isOk()) {
1384 return INVALID_OPERATION;
1385 }
1386 return OK;
1387}
1388
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001389status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraCharacteristics(
1390 CameraMetadata *characteristics) const {
1391 if (characteristics == nullptr) return BAD_VALUE;
1392
1393 *characteristics = mCameraCharacteristics;
1394 return OK;
1395}
1396
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001397status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getPhysicalCameraCharacteristics(
1398 const std::string& physicalCameraId, CameraMetadata *characteristics) const {
1399 if (characteristics == nullptr) return BAD_VALUE;
1400 if (mPhysicalCameraCharacteristics.find(physicalCameraId) ==
1401 mPhysicalCameraCharacteristics.end()) {
1402 return NAME_NOT_FOUND;
1403 }
1404
1405 *characteristics = mPhysicalCameraCharacteristics.at(physicalCameraId);
1406 return OK;
1407}
1408
Emilian Peev35ae8262018-11-08 13:11:32 +00001409status_t CameraProviderManager::ProviderInfo::DeviceInfo3::isSessionConfigurationSupported(
1410 const hardware::camera::device::V3_4::StreamConfiguration &configuration,
1411 bool *status /*out*/) const {
1412 auto castResult = device::V3_5::ICameraDevice::castFrom(mInterface);
1413 sp<hardware::camera::device::V3_5::ICameraDevice> interface_3_5 = castResult;
1414 if (interface_3_5 == nullptr) {
1415 return INVALID_OPERATION;
1416 }
1417
1418 status_t res;
1419 Status callStatus;
1420 auto ret = interface_3_5->isStreamCombinationSupported(configuration,
1421 [&callStatus, &status] (Status s, bool combStatus) {
1422 callStatus = s;
1423 *status = combStatus;
1424 });
1425 if (ret.isOk()) {
1426 switch (callStatus) {
1427 case Status::OK:
1428 // Expected case, do nothing.
1429 res = OK;
1430 break;
1431 case Status::METHOD_NOT_SUPPORTED:
1432 res = INVALID_OPERATION;
1433 break;
1434 default:
1435 ALOGE("%s: Session configuration query failed: %d", __FUNCTION__, callStatus);
1436 res = UNKNOWN_ERROR;
1437 }
1438 } else {
1439 ALOGE("%s: Unexpected binder error: %s", __FUNCTION__, ret.description().c_str());
1440 res = UNKNOWN_ERROR;
1441 }
1442
1443 return res;
1444}
1445
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001446status_t CameraProviderManager::ProviderInfo::parseProviderName(const std::string& name,
1447 std::string *type, uint32_t *id) {
1448 // Format must be "<type>/<id>"
1449#define ERROR_MSG_PREFIX "%s: Invalid provider name '%s'. " \
1450 "Should match '<type>/<id>' - "
1451
1452 if (!type || !id) return INVALID_OPERATION;
1453
1454 std::string::size_type slashIdx = name.find('/');
1455 if (slashIdx == std::string::npos || slashIdx == name.size() - 1) {
1456 ALOGE(ERROR_MSG_PREFIX
1457 "does not have / separator between type and id",
1458 __FUNCTION__, name.c_str());
1459 return BAD_VALUE;
1460 }
1461
1462 std::string typeVal = name.substr(0, slashIdx);
1463
1464 char *endPtr;
1465 errno = 0;
1466 long idVal = strtol(name.c_str() + slashIdx + 1, &endPtr, 10);
1467 if (errno != 0) {
1468 ALOGE(ERROR_MSG_PREFIX
1469 "cannot parse provider id as an integer: %s (%d)",
1470 __FUNCTION__, name.c_str(), strerror(errno), errno);
1471 return BAD_VALUE;
1472 }
1473 if (endPtr != name.c_str() + name.size()) {
1474 ALOGE(ERROR_MSG_PREFIX
1475 "provider id has unexpected length",
1476 __FUNCTION__, name.c_str());
1477 return BAD_VALUE;
1478 }
1479 if (idVal < 0) {
1480 ALOGE(ERROR_MSG_PREFIX
1481 "id is negative: %ld",
1482 __FUNCTION__, name.c_str(), idVal);
1483 return BAD_VALUE;
1484 }
1485
1486#undef ERROR_MSG_PREFIX
1487
1488 *type = typeVal;
1489 *id = static_cast<uint32_t>(idVal);
1490
1491 return OK;
1492}
1493
Emilian Peev71c73a22017-03-21 16:35:51 +00001494metadata_vendor_id_t CameraProviderManager::ProviderInfo::generateVendorTagId(
1495 const std::string &name) {
1496 metadata_vendor_id_t ret = std::hash<std::string> {} (name);
1497 // CAMERA_METADATA_INVALID_VENDOR_ID is not a valid hash value
1498 if (CAMERA_METADATA_INVALID_VENDOR_ID == ret) {
1499 ret = 0;
1500 }
1501
1502 return ret;
1503}
1504
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001505status_t CameraProviderManager::ProviderInfo::parseDeviceName(const std::string& name,
1506 uint16_t *major, uint16_t *minor, std::string *type, std::string *id) {
1507
1508 // Format must be "device@<major>.<minor>/<type>/<id>"
1509
1510#define ERROR_MSG_PREFIX "%s: Invalid device name '%s'. " \
1511 "Should match 'device@<major>.<minor>/<type>/<id>' - "
1512
1513 if (!major || !minor || !type || !id) return INVALID_OPERATION;
1514
1515 // Verify starting prefix
1516 const char expectedPrefix[] = "device@";
1517
1518 if (name.find(expectedPrefix) != 0) {
1519 ALOGE(ERROR_MSG_PREFIX
1520 "does not start with '%s'",
1521 __FUNCTION__, name.c_str(), expectedPrefix);
1522 return BAD_VALUE;
1523 }
1524
1525 // Extract major/minor versions
1526 constexpr std::string::size_type atIdx = sizeof(expectedPrefix) - 2;
1527 std::string::size_type dotIdx = name.find('.', atIdx);
1528 if (dotIdx == std::string::npos) {
1529 ALOGE(ERROR_MSG_PREFIX
1530 "does not have @<major>. version section",
1531 __FUNCTION__, name.c_str());
1532 return BAD_VALUE;
1533 }
1534 std::string::size_type typeSlashIdx = name.find('/', dotIdx);
1535 if (typeSlashIdx == std::string::npos) {
1536 ALOGE(ERROR_MSG_PREFIX
1537 "does not have .<minor>/ version section",
1538 __FUNCTION__, name.c_str());
1539 return BAD_VALUE;
1540 }
1541
1542 char *endPtr;
1543 errno = 0;
1544 long majorVal = strtol(name.c_str() + atIdx + 1, &endPtr, 10);
1545 if (errno != 0) {
1546 ALOGE(ERROR_MSG_PREFIX
1547 "cannot parse major version: %s (%d)",
1548 __FUNCTION__, name.c_str(), strerror(errno), errno);
1549 return BAD_VALUE;
1550 }
1551 if (endPtr != name.c_str() + dotIdx) {
1552 ALOGE(ERROR_MSG_PREFIX
1553 "major version has unexpected length",
1554 __FUNCTION__, name.c_str());
1555 return BAD_VALUE;
1556 }
1557 long minorVal = strtol(name.c_str() + dotIdx + 1, &endPtr, 10);
1558 if (errno != 0) {
1559 ALOGE(ERROR_MSG_PREFIX
1560 "cannot parse minor version: %s (%d)",
1561 __FUNCTION__, name.c_str(), strerror(errno), errno);
1562 return BAD_VALUE;
1563 }
1564 if (endPtr != name.c_str() + typeSlashIdx) {
1565 ALOGE(ERROR_MSG_PREFIX
1566 "minor version has unexpected length",
1567 __FUNCTION__, name.c_str());
1568 return BAD_VALUE;
1569 }
1570 if (majorVal < 0 || majorVal > UINT16_MAX || minorVal < 0 || minorVal > UINT16_MAX) {
1571 ALOGE(ERROR_MSG_PREFIX
1572 "major/minor version is out of range of uint16_t: %ld.%ld",
1573 __FUNCTION__, name.c_str(), majorVal, minorVal);
1574 return BAD_VALUE;
1575 }
1576
1577 // Extract type and id
1578
1579 std::string::size_type instanceSlashIdx = name.find('/', typeSlashIdx + 1);
1580 if (instanceSlashIdx == std::string::npos) {
1581 ALOGE(ERROR_MSG_PREFIX
1582 "does not have /<type>/ component",
1583 __FUNCTION__, name.c_str());
1584 return BAD_VALUE;
1585 }
1586 std::string typeVal = name.substr(typeSlashIdx + 1, instanceSlashIdx - typeSlashIdx - 1);
1587
1588 if (instanceSlashIdx == name.size() - 1) {
1589 ALOGE(ERROR_MSG_PREFIX
1590 "does not have an /<id> component",
1591 __FUNCTION__, name.c_str());
1592 return BAD_VALUE;
1593 }
1594 std::string idVal = name.substr(instanceSlashIdx + 1);
1595
1596#undef ERROR_MSG_PREFIX
1597
1598 *major = static_cast<uint16_t>(majorVal);
1599 *minor = static_cast<uint16_t>(minorVal);
1600 *type = typeVal;
1601 *id = idVal;
1602
1603 return OK;
1604}
1605
1606
1607
1608CameraProviderManager::ProviderInfo::~ProviderInfo() {
1609 // Destruction of ProviderInfo is only supposed to happen when the respective
1610 // CameraProvider interface dies, so do not unregister callbacks.
1611
1612}
1613
1614status_t CameraProviderManager::mapToStatusT(const Status& s) {
1615 switch(s) {
1616 case Status::OK:
1617 return OK;
1618 case Status::ILLEGAL_ARGUMENT:
1619 return BAD_VALUE;
1620 case Status::CAMERA_IN_USE:
1621 return -EBUSY;
1622 case Status::MAX_CAMERAS_IN_USE:
1623 return -EUSERS;
1624 case Status::METHOD_NOT_SUPPORTED:
1625 return UNKNOWN_TRANSACTION;
1626 case Status::OPERATION_NOT_SUPPORTED:
1627 return INVALID_OPERATION;
1628 case Status::CAMERA_DISCONNECTED:
1629 return DEAD_OBJECT;
1630 case Status::INTERNAL_ERROR:
1631 return INVALID_OPERATION;
1632 }
1633 ALOGW("Unexpected HAL status code %d", s);
1634 return INVALID_OPERATION;
1635}
1636
1637const char* CameraProviderManager::statusToString(const Status& s) {
1638 switch(s) {
1639 case Status::OK:
1640 return "OK";
1641 case Status::ILLEGAL_ARGUMENT:
1642 return "ILLEGAL_ARGUMENT";
1643 case Status::CAMERA_IN_USE:
1644 return "CAMERA_IN_USE";
1645 case Status::MAX_CAMERAS_IN_USE:
1646 return "MAX_CAMERAS_IN_USE";
1647 case Status::METHOD_NOT_SUPPORTED:
1648 return "METHOD_NOT_SUPPORTED";
1649 case Status::OPERATION_NOT_SUPPORTED:
1650 return "OPERATION_NOT_SUPPORTED";
1651 case Status::CAMERA_DISCONNECTED:
1652 return "CAMERA_DISCONNECTED";
1653 case Status::INTERNAL_ERROR:
1654 return "INTERNAL_ERROR";
1655 }
1656 ALOGW("Unexpected HAL status code %d", s);
1657 return "UNKNOWN_ERROR";
1658}
1659
1660const char* CameraProviderManager::deviceStatusToString(const CameraDeviceStatus& s) {
1661 switch(s) {
1662 case CameraDeviceStatus::NOT_PRESENT:
1663 return "NOT_PRESENT";
1664 case CameraDeviceStatus::PRESENT:
1665 return "PRESENT";
1666 case CameraDeviceStatus::ENUMERATING:
1667 return "ENUMERATING";
1668 }
1669 ALOGW("Unexpected HAL device status code %d", s);
1670 return "UNKNOWN_STATUS";
1671}
1672
1673const char* CameraProviderManager::torchStatusToString(const TorchModeStatus& s) {
1674 switch(s) {
1675 case TorchModeStatus::NOT_AVAILABLE:
1676 return "NOT_AVAILABLE";
1677 case TorchModeStatus::AVAILABLE_OFF:
1678 return "AVAILABLE_OFF";
1679 case TorchModeStatus::AVAILABLE_ON:
1680 return "AVAILABLE_ON";
1681 }
1682 ALOGW("Unexpected HAL torch mode status code %d", s);
1683 return "UNKNOWN_STATUS";
1684}
1685
Yin-Chia Yeh067428c2017-01-13 15:19:24 -08001686
1687status_t HidlVendorTagDescriptor::createDescriptorFromHidl(
Peter Kalauskasb7bd4382018-11-15 17:19:48 -08001688 const hardware::hidl_vec<common::V1_0::VendorTagSection>& vts,
Yin-Chia Yeh067428c2017-01-13 15:19:24 -08001689 /*out*/
1690 sp<VendorTagDescriptor>& descriptor) {
1691
1692 int tagCount = 0;
1693
1694 for (size_t s = 0; s < vts.size(); s++) {
1695 tagCount += vts[s].tags.size();
1696 }
1697
1698 if (tagCount < 0 || tagCount > INT32_MAX) {
1699 ALOGE("%s: tag count %d from vendor tag sections is invalid.", __FUNCTION__, tagCount);
1700 return BAD_VALUE;
1701 }
1702
1703 Vector<uint32_t> tagArray;
1704 LOG_ALWAYS_FATAL_IF(tagArray.resize(tagCount) != tagCount,
1705 "%s: too many (%u) vendor tags defined.", __FUNCTION__, tagCount);
1706
1707
1708 sp<HidlVendorTagDescriptor> desc = new HidlVendorTagDescriptor();
1709 desc->mTagCount = tagCount;
1710
1711 SortedVector<String8> sections;
1712 KeyedVector<uint32_t, String8> tagToSectionMap;
1713
1714 int idx = 0;
1715 for (size_t s = 0; s < vts.size(); s++) {
Peter Kalauskasb7bd4382018-11-15 17:19:48 -08001716 const common::V1_0::VendorTagSection& section = vts[s];
Yin-Chia Yeh067428c2017-01-13 15:19:24 -08001717 const char *sectionName = section.sectionName.c_str();
1718 if (sectionName == NULL) {
1719 ALOGE("%s: no section name defined for vendor tag section %zu.", __FUNCTION__, s);
1720 return BAD_VALUE;
1721 }
1722 String8 sectionString(sectionName);
1723 sections.add(sectionString);
1724
1725 for (size_t j = 0; j < section.tags.size(); j++) {
1726 uint32_t tag = section.tags[j].tagId;
1727 if (tag < CAMERA_METADATA_VENDOR_TAG_BOUNDARY) {
1728 ALOGE("%s: vendor tag %d not in vendor tag section.", __FUNCTION__, tag);
1729 return BAD_VALUE;
1730 }
1731
1732 tagArray.editItemAt(idx++) = section.tags[j].tagId;
1733
1734 const char *tagName = section.tags[j].tagName.c_str();
1735 if (tagName == NULL) {
1736 ALOGE("%s: no tag name defined for vendor tag %d.", __FUNCTION__, tag);
1737 return BAD_VALUE;
1738 }
1739 desc->mTagToNameMap.add(tag, String8(tagName));
1740 tagToSectionMap.add(tag, sectionString);
1741
1742 int tagType = (int) section.tags[j].tagType;
1743 if (tagType < 0 || tagType >= NUM_TYPES) {
1744 ALOGE("%s: tag type %d from vendor ops does not exist.", __FUNCTION__, tagType);
1745 return BAD_VALUE;
1746 }
1747 desc->mTagToTypeMap.add(tag, tagType);
1748 }
1749 }
1750
1751 desc->mSections = sections;
1752
1753 for (size_t i = 0; i < tagArray.size(); ++i) {
1754 uint32_t tag = tagArray[i];
1755 String8 sectionString = tagToSectionMap.valueFor(tag);
1756
1757 // Set up tag to section index map
1758 ssize_t index = sections.indexOf(sectionString);
1759 LOG_ALWAYS_FATAL_IF(index < 0, "index %zd must be non-negative", index);
1760 desc->mTagToSectionMap.add(tag, static_cast<uint32_t>(index));
1761
1762 // Set up reverse mapping
1763 ssize_t reverseIndex = -1;
1764 if ((reverseIndex = desc->mReverseMapping.indexOfKey(sectionString)) < 0) {
1765 KeyedVector<String8, uint32_t>* nameMapper = new KeyedVector<String8, uint32_t>();
1766 reverseIndex = desc->mReverseMapping.add(sectionString, nameMapper);
1767 }
1768 desc->mReverseMapping[reverseIndex]->add(desc->mTagToNameMap.valueFor(tag), tag);
1769 }
1770
George Burgess IVa0b84962017-08-29 17:46:19 -07001771 descriptor = std::move(desc);
Yin-Chia Yeh067428c2017-01-13 15:19:24 -08001772 return OK;
1773}
1774
Shuzhen Wange8aceb52018-05-21 12:00:56 -07001775status_t CameraProviderManager::getCameraCharacteristicsLocked(const std::string &id,
1776 CameraMetadata* characteristics) const {
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001777 auto deviceInfo = findDeviceInfoLocked(id, /*minVersion*/ {3,0}, /*maxVersion*/ {5,0});
1778 if (deviceInfo != nullptr) {
1779 return deviceInfo->getCameraCharacteristics(characteristics);
1780 }
Shuzhen Wange8aceb52018-05-21 12:00:56 -07001781
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001782 // Find hidden physical camera characteristics
1783 for (auto& provider : mProviders) {
1784 for (auto& deviceInfo : provider->mDevices) {
1785 status_t res = deviceInfo->getPhysicalCameraCharacteristics(id, characteristics);
1786 if (res != NAME_NOT_FOUND) return res;
1787 }
1788 }
1789
1790 return NAME_NOT_FOUND;
Shuzhen Wange8aceb52018-05-21 12:00:56 -07001791}
1792
1793void CameraProviderManager::filterLogicalCameraIdsLocked(
1794 std::vector<std::string>& deviceIds) const
1795{
1796 std::unordered_set<std::string> removedIds;
1797
1798 for (auto& deviceId : deviceIds) {
Shuzhen Wang03d8cc12018-09-12 14:17:09 -07001799 auto deviceInfo = findDeviceInfoLocked(deviceId);
1800 if (deviceInfo == nullptr) continue;
Shuzhen Wange8aceb52018-05-21 12:00:56 -07001801
Shuzhen Wang03d8cc12018-09-12 14:17:09 -07001802 if (!deviceInfo->mIsLogicalCamera) {
Shuzhen Wange8aceb52018-05-21 12:00:56 -07001803 continue;
1804 }
Shuzhen Wang03d8cc12018-09-12 14:17:09 -07001805 // idCombo contains the ids of a logical camera and its physical cameras
1806 std::vector<std::string> idCombo = deviceInfo->mPhysicalIds;
Shuzhen Wange8aceb52018-05-21 12:00:56 -07001807 idCombo.push_back(deviceId);
1808
1809 for (auto& id : deviceIds) {
1810 auto foundId = std::find(idCombo.begin(), idCombo.end(), id);
1811 if (foundId == idCombo.end()) {
1812 continue;
1813 }
1814
1815 idCombo.erase(foundId);
1816 removedIds.insert(idCombo.begin(), idCombo.end());
1817 break;
1818 }
1819 }
1820
1821 deviceIds.erase(std::remove_if(deviceIds.begin(), deviceIds.end(),
1822 [&removedIds](const std::string& s) {return removedIds.find(s) != removedIds.end();}),
1823 deviceIds.end());
1824}
Yin-Chia Yeh067428c2017-01-13 15:19:24 -08001825
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001826} // namespace android