blob: ceca0f8ac938e2176d60b4532fd3e773b3756107 [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,
266 const sp<hardware::camera::device::V3_2::ICameraDeviceCallback>& callback,
267 /*out*/
268 sp<hardware::camera::device::V3_2::ICameraDeviceSession> *session) {
269
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,
296 const sp<hardware::camera::device::V1_0::ICameraDeviceCallback>& callback,
297 /*out*/
298 sp<hardware::camera::device::V1_0::ICameraDevice> *session) {
299
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;
714 status_t res = addDevice(device,
715 hardware::camera::common::V1_0::CameraDeviceStatus::PRESENT, &id);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800716 if (res != OK) {
717 ALOGE("%s: Unable to enumerate camera device '%s': %s (%d)",
718 __FUNCTION__, device.c_str(), strerror(-res), res);
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700719 continue;
720 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800721 }
722
Peter Kalauskas1b3c9072018-11-07 12:41:53 -0800723 res = setUpVendorTags();
724 if (res != OK) {
725 ALOGE("%s: Unable to set up vendor tags from provider '%s'",
726 __FUNCTION__, mProviderName.c_str());
727 return res;
728 }
729
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800730 ALOGI("Camera provider %s ready with %zu camera devices",
731 mProviderName.c_str(), mDevices.size());
732
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800733 mInitialized = true;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800734 return OK;
735}
736
737const std::string& CameraProviderManager::ProviderInfo::getType() const {
738 return mType;
739}
740
741status_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name,
742 CameraDeviceStatus initialStatus, /*out*/ std::string* parsedId) {
743
744 ALOGI("Enumerating new camera device: %s", name.c_str());
745
746 uint16_t major, minor;
747 std::string type, id;
748
749 status_t res = parseDeviceName(name, &major, &minor, &type, &id);
750 if (res != OK) {
751 return res;
752 }
753 if (type != mType) {
754 ALOGE("%s: Device type %s does not match provider type %s", __FUNCTION__,
755 type.c_str(), mType.c_str());
756 return BAD_VALUE;
757 }
758 if (mManager->isValidDeviceLocked(id, major)) {
759 ALOGE("%s: Device %s: ID %s is already in use for device major version %d", __FUNCTION__,
760 name.c_str(), id.c_str(), major);
761 return BAD_VALUE;
762 }
763
764 std::unique_ptr<DeviceInfo> deviceInfo;
765 switch (major) {
766 case 1:
Emilian Peev71c73a22017-03-21 16:35:51 +0000767 deviceInfo = initializeDeviceInfo<DeviceInfo1>(name, mProviderTagid,
768 id, minor);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800769 break;
770 case 3:
Emilian Peev71c73a22017-03-21 16:35:51 +0000771 deviceInfo = initializeDeviceInfo<DeviceInfo3>(name, mProviderTagid,
772 id, minor);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800773 break;
774 default:
775 ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__,
776 name.c_str(), major);
777 return BAD_VALUE;
778 }
779 if (deviceInfo == nullptr) return BAD_VALUE;
780 deviceInfo->mStatus = initialStatus;
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800781 bool isAPI1Compatible = deviceInfo->isAPI1Compatible();
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800782
783 mDevices.push_back(std::move(deviceInfo));
784
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800785 mUniqueCameraIds.insert(id);
786 if (isAPI1Compatible) {
Shuzhen Wang975a39e2018-06-27 14:35:46 -0700787 // addDevice can be called more than once for the same camera id if HAL
788 // supports openLegacy.
789 if (std::find(mUniqueAPI1CompatibleCameraIds.begin(), mUniqueAPI1CompatibleCameraIds.end(),
790 id) == mUniqueAPI1CompatibleCameraIds.end()) {
791 mUniqueAPI1CompatibleCameraIds.push_back(id);
792 }
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800793 }
794
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800795 if (parsedId != nullptr) {
796 *parsedId = id;
797 }
798 return OK;
799}
800
Guennadi Liakhovetski6034bf52017-12-07 10:28:29 +0100801void CameraProviderManager::ProviderInfo::removeDevice(std::string id) {
802 for (auto it = mDevices.begin(); it != mDevices.end(); it++) {
803 if ((*it)->mId == id) {
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800804 mUniqueCameraIds.erase(id);
805 if ((*it)->isAPI1Compatible()) {
Shuzhen Wange8aceb52018-05-21 12:00:56 -0700806 mUniqueAPI1CompatibleCameraIds.erase(std::remove(
807 mUniqueAPI1CompatibleCameraIds.begin(),
808 mUniqueAPI1CompatibleCameraIds.end(), id));
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800809 }
Guennadi Liakhovetski6034bf52017-12-07 10:28:29 +0100810 mDevices.erase(it);
811 break;
812 }
813 }
814}
815
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800816status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const {
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700817 dprintf(fd, "== Camera Provider HAL %s (v2.4, %s) static info: %zu devices: ==\n",
818 mProviderName.c_str(), mInterface->isRemote() ? "remote" : "passthrough",
819 mDevices.size());
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800820
821 for (auto& device : mDevices) {
Eino-Ville Talvalad00111e2017-01-31 11:59:12 -0800822 dprintf(fd, "== Camera HAL device %s (v%d.%d) static information: ==\n", device->mName.c_str(),
823 device->mVersion.get_major(), device->mVersion.get_minor());
824 dprintf(fd, " Resource cost: %d\n", device->mResourceCost.resourceCost);
825 if (device->mResourceCost.conflictingDevices.size() == 0) {
826 dprintf(fd, " Conflicting devices: None\n");
827 } else {
828 dprintf(fd, " Conflicting devices:\n");
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800829 for (size_t i = 0; i < device->mResourceCost.conflictingDevices.size(); i++) {
Eino-Ville Talvalad00111e2017-01-31 11:59:12 -0800830 dprintf(fd, " %s\n",
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800831 device->mResourceCost.conflictingDevices[i].c_str());
832 }
833 }
Eino-Ville Talvalad00111e2017-01-31 11:59:12 -0800834 dprintf(fd, " API1 info:\n");
835 dprintf(fd, " Has a flash unit: %s\n",
836 device->hasFlashUnit() ? "true" : "false");
837 hardware::CameraInfo info;
838 status_t res = device->getCameraInfo(&info);
839 if (res != OK) {
840 dprintf(fd, " <Error reading camera info: %s (%d)>\n",
841 strerror(-res), res);
842 } else {
843 dprintf(fd, " Facing: %s\n",
844 info.facing == hardware::CAMERA_FACING_BACK ? "Back" : "Front");
845 dprintf(fd, " Orientation: %d\n", info.orientation);
846 }
847 CameraMetadata info2;
848 res = device->getCameraCharacteristics(&info2);
849 if (res == INVALID_OPERATION) {
850 dprintf(fd, " API2 not directly supported\n");
851 } else if (res != OK) {
852 dprintf(fd, " <Error reading camera characteristics: %s (%d)>\n",
853 strerror(-res), res);
854 } else {
855 dprintf(fd, " API2 camera characteristics:\n");
856 info2.dump(fd, /*verbosity*/ 2, /*indentation*/ 4);
857 }
Yin-Chia Yeh487785a2018-01-02 12:06:57 -0800858
Shuzhen Wangf9d2c022018-08-21 12:07:35 -0700859 // Dump characteristics of non-standalone physical camera
Shuzhen Wang03d8cc12018-09-12 14:17:09 -0700860 if (device->mIsLogicalCamera) {
861 for (auto& id : device->mPhysicalIds) {
Shuzhen Wangf9d2c022018-08-21 12:07:35 -0700862 // Skip if physical id is an independent camera
863 if (std::find(mProviderPublicCameraIds.begin(), mProviderPublicCameraIds.end(), id)
864 != mProviderPublicCameraIds.end()) {
865 continue;
866 }
867
868 CameraMetadata physicalInfo;
869 status_t status = device->getPhysicalCameraCharacteristics(id, &physicalInfo);
870 if (status == OK) {
871 dprintf(fd, " Physical camera %s characteristics:\n", id.c_str());
872 physicalInfo.dump(fd, /*verbosity*/ 2, /*indentation*/ 4);
873 }
874 }
875 }
876
Yin-Chia Yeh487785a2018-01-02 12:06:57 -0800877 dprintf(fd, "== Camera HAL device %s (v%d.%d) dumpState: ==\n", device->mName.c_str(),
878 device->mVersion.get_major(), device->mVersion.get_minor());
879 res = device->dumpState(fd);
880 if (res != OK) {
881 dprintf(fd, " <Error dumping device %s state: %s (%d)>\n",
882 device->mName.c_str(), strerror(-res), res);
883 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800884 }
885 return OK;
886}
887
888hardware::Return<void> CameraProviderManager::ProviderInfo::cameraDeviceStatusChange(
889 const hardware::hidl_string& cameraDeviceName,
890 CameraDeviceStatus newStatus) {
891 sp<StatusListener> listener;
892 std::string id;
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800893 bool initialized = false;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800894 {
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700895 std::lock_guard<std::mutex> lock(mLock);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800896 bool known = false;
897 for (auto& deviceInfo : mDevices) {
898 if (deviceInfo->mName == cameraDeviceName) {
899 ALOGI("Camera device %s status is now %s, was %s", cameraDeviceName.c_str(),
900 deviceStatusToString(newStatus), deviceStatusToString(deviceInfo->mStatus));
901 deviceInfo->mStatus = newStatus;
902 // TODO: Handle device removal (NOT_PRESENT)
903 id = deviceInfo->mId;
904 known = true;
905 break;
906 }
907 }
908 // Previously unseen device; status must not be NOT_PRESENT
909 if (!known) {
910 if (newStatus == CameraDeviceStatus::NOT_PRESENT) {
911 ALOGW("Camera provider %s says an unknown camera device %s is not present. Curious.",
912 mProviderName.c_str(), cameraDeviceName.c_str());
913 return hardware::Void();
914 }
915 addDevice(cameraDeviceName, newStatus, &id);
Guennadi Liakhovetski6034bf52017-12-07 10:28:29 +0100916 } else if (newStatus == CameraDeviceStatus::NOT_PRESENT) {
917 removeDevice(id);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800918 }
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700919 listener = mManager->getStatusListener();
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800920 initialized = mInitialized;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800921 }
922 // Call without lock held to allow reentrancy into provider manager
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800923 // Don't send the callback if providerInfo hasn't been initialized.
924 // CameraService will initialize device status after provider is
925 // initialized
926 if (listener != nullptr && initialized) {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800927 listener->onDeviceStatusChanged(String8(id.c_str()), newStatus);
928 }
929 return hardware::Void();
930}
931
932hardware::Return<void> CameraProviderManager::ProviderInfo::torchModeStatusChange(
933 const hardware::hidl_string& cameraDeviceName,
934 TorchModeStatus newStatus) {
935 sp<StatusListener> listener;
936 std::string id;
937 {
Yin-Chia Yeh52778d42016-12-22 18:20:43 -0800938 std::lock_guard<std::mutex> lock(mManager->mStatusListenerMutex);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800939 bool known = false;
940 for (auto& deviceInfo : mDevices) {
941 if (deviceInfo->mName == cameraDeviceName) {
942 ALOGI("Camera device %s torch status is now %s", cameraDeviceName.c_str(),
943 torchStatusToString(newStatus));
944 id = deviceInfo->mId;
945 known = true;
946 break;
947 }
948 }
949 if (!known) {
950 ALOGW("Camera provider %s says an unknown camera %s now has torch status %d. Curious.",
951 mProviderName.c_str(), cameraDeviceName.c_str(), newStatus);
952 return hardware::Void();
953 }
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700954 listener = mManager->getStatusListener();
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800955 }
956 // Call without lock held to allow reentrancy into provider manager
957 if (listener != nullptr) {
958 listener->onTorchStatusChanged(String8(id.c_str()), newStatus);
959 }
960 return hardware::Void();
961}
962
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700963void CameraProviderManager::ProviderInfo::serviceDied(uint64_t cookie,
964 const wp<hidl::base::V1_0::IBase>& who) {
965 (void) who;
966 ALOGI("Camera provider '%s' has died; removing it", mProviderName.c_str());
967 if (cookie != mId) {
968 ALOGW("%s: Unexpected serviceDied cookie %" PRIu64 ", expected %" PRIu32,
969 __FUNCTION__, cookie, mId);
970 }
971 mManager->removeProvider(mProviderName);
972}
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800973
Peter Kalauskas1b3c9072018-11-07 12:41:53 -0800974status_t CameraProviderManager::ProviderInfo::setUpVendorTags() {
975 if (mVendorTagDescriptor != nullptr)
976 return OK;
977
978 hardware::hidl_vec<VendorTagSection> vts;
979 Status status;
980 hardware::Return<void> ret;
981 ret = mInterface->getVendorTags(
982 [&](auto s, const auto& vendorTagSecs) {
983 status = s;
984 if (s == Status::OK) {
985 vts = vendorTagSecs;
986 }
987 });
988 if (!ret.isOk()) {
989 ALOGE("%s: Transaction error getting vendor tags from provider '%s': %s",
990 __FUNCTION__, mProviderName.c_str(), ret.description().c_str());
991 return DEAD_OBJECT;
992 }
993 if (status != Status::OK) {
994 return mapToStatusT(status);
995 }
996
997 // Read all vendor tag definitions into a descriptor
998 status_t res;
999 if ((res = HidlVendorTagDescriptor::createDescriptorFromHidl(vts, /*out*/mVendorTagDescriptor))
1000 != OK) {
1001 ALOGE("%s: Could not generate descriptor from vendor tag operations,"
1002 "received error %s (%d). Camera clients will not be able to use"
1003 "vendor tags", __FUNCTION__, strerror(res), res);
1004 return res;
1005 }
1006
1007 return OK;
1008}
1009
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001010template<class DeviceInfoT>
1011std::unique_ptr<CameraProviderManager::ProviderInfo::DeviceInfo>
1012 CameraProviderManager::ProviderInfo::initializeDeviceInfo(
Emilian Peev71c73a22017-03-21 16:35:51 +00001013 const std::string &name, const metadata_vendor_id_t tagId,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001014 const std::string &id, uint16_t minorVersion) const {
1015 Status status;
1016
1017 auto cameraInterface =
1018 getDeviceInterface<typename DeviceInfoT::InterfaceT>(name);
1019 if (cameraInterface == nullptr) return nullptr;
1020
1021 CameraResourceCost resourceCost;
1022 cameraInterface->getResourceCost([&status, &resourceCost](
1023 Status s, CameraResourceCost cost) {
1024 status = s;
1025 resourceCost = cost;
1026 });
1027 if (status != Status::OK) {
1028 ALOGE("%s: Unable to obtain resource costs for camera device %s: %s", __FUNCTION__,
1029 name.c_str(), statusToString(status));
1030 return nullptr;
1031 }
Shuzhen Wang47283692018-04-24 18:05:02 -07001032
1033 for (auto& conflictName : resourceCost.conflictingDevices) {
1034 uint16_t major, minor;
1035 std::string type, id;
1036 status_t res = parseDeviceName(conflictName, &major, &minor, &type, &id);
1037 if (res != OK) {
1038 ALOGE("%s: Failed to parse conflicting device %s", __FUNCTION__, conflictName.c_str());
1039 return nullptr;
1040 }
1041 conflictName = id;
1042 }
1043
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001044 return std::unique_ptr<DeviceInfo>(
Emilian Peev71c73a22017-03-21 16:35:51 +00001045 new DeviceInfoT(name, tagId, id, minorVersion, resourceCost,
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001046 mProviderPublicCameraIds, cameraInterface));
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001047}
1048
1049template<class InterfaceT>
1050sp<InterfaceT>
1051CameraProviderManager::ProviderInfo::getDeviceInterface(const std::string &name) const {
1052 ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__,
1053 name.c_str(), InterfaceT::version.get_major());
1054 return nullptr;
1055}
1056
1057template<>
1058sp<device::V1_0::ICameraDevice>
1059CameraProviderManager::ProviderInfo::getDeviceInterface
1060 <device::V1_0::ICameraDevice>(const std::string &name) const {
1061 Status status;
1062 sp<device::V1_0::ICameraDevice> cameraInterface;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001063 hardware::Return<void> ret;
1064 ret = mInterface->getCameraDeviceInterface_V1_x(name, [&status, &cameraInterface](
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001065 Status s, sp<device::V1_0::ICameraDevice> interface) {
1066 status = s;
1067 cameraInterface = interface;
1068 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001069 if (!ret.isOk()) {
1070 ALOGE("%s: Transaction error trying to obtain interface for camera device %s: %s",
1071 __FUNCTION__, name.c_str(), ret.description().c_str());
1072 return nullptr;
1073 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001074 if (status != Status::OK) {
1075 ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__,
1076 name.c_str(), statusToString(status));
1077 return nullptr;
1078 }
1079 return cameraInterface;
1080}
1081
1082template<>
1083sp<device::V3_2::ICameraDevice>
1084CameraProviderManager::ProviderInfo::getDeviceInterface
1085 <device::V3_2::ICameraDevice>(const std::string &name) const {
1086 Status status;
1087 sp<device::V3_2::ICameraDevice> cameraInterface;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001088 hardware::Return<void> ret;
1089 ret = mInterface->getCameraDeviceInterface_V3_x(name, [&status, &cameraInterface](
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001090 Status s, sp<device::V3_2::ICameraDevice> interface) {
1091 status = s;
1092 cameraInterface = interface;
1093 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001094 if (!ret.isOk()) {
1095 ALOGE("%s: Transaction error trying to obtain interface for camera device %s: %s",
1096 __FUNCTION__, name.c_str(), ret.description().c_str());
1097 return nullptr;
1098 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001099 if (status != Status::OK) {
1100 ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__,
1101 name.c_str(), statusToString(status));
1102 return nullptr;
1103 }
1104 return cameraInterface;
1105}
1106
1107CameraProviderManager::ProviderInfo::DeviceInfo::~DeviceInfo() {}
1108
1109template<class InterfaceT>
1110status_t CameraProviderManager::ProviderInfo::DeviceInfo::setTorchMode(InterfaceT& interface,
1111 bool enabled) {
1112 Status s = interface->setTorchMode(enabled ? TorchMode::ON : TorchMode::OFF);
1113 return mapToStatusT(s);
1114}
1115
1116CameraProviderManager::ProviderInfo::DeviceInfo1::DeviceInfo1(const std::string& name,
Emilian Peev71c73a22017-03-21 16:35:51 +00001117 const metadata_vendor_id_t tagId, const std::string &id,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001118 uint16_t minorVersion,
1119 const CameraResourceCost& resourceCost,
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001120 const std::vector<std::string>& publicCameraIds,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001121 sp<InterfaceT> interface) :
Emilian Peev71c73a22017-03-21 16:35:51 +00001122 DeviceInfo(name, tagId, id, hardware::hidl_version{1, minorVersion},
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001123 publicCameraIds, resourceCost),
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001124 mInterface(interface) {
1125 // Get default parameters and initialize flash unit availability
1126 // Requires powering on the camera device
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001127 hardware::Return<Status> status = mInterface->open(nullptr);
1128 if (!status.isOk()) {
1129 ALOGE("%s: Transaction error opening camera device %s to check for a flash unit: %s",
1130 __FUNCTION__, mId.c_str(), status.description().c_str());
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001131 return;
1132 }
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001133 if (status != Status::OK) {
1134 ALOGE("%s: Unable to open camera device %s to check for a flash unit: %s", __FUNCTION__,
1135 mId.c_str(), CameraProviderManager::statusToString(status));
1136 return;
1137 }
1138 hardware::Return<void> ret;
1139 ret = mInterface->getParameters([this](const hardware::hidl_string& parms) {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001140 mDefaultParameters.unflatten(String8(parms.c_str()));
1141 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001142 if (!ret.isOk()) {
1143 ALOGE("%s: Transaction error reading camera device %s params to check for a flash unit: %s",
1144 __FUNCTION__, mId.c_str(), status.description().c_str());
1145 return;
1146 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001147 const char *flashMode =
1148 mDefaultParameters.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES);
1149 if (flashMode && strstr(flashMode, CameraParameters::FLASH_MODE_TORCH)) {
1150 mHasFlashUnit = true;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001151 }
1152
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001153 ret = mInterface->close();
1154 if (!ret.isOk()) {
1155 ALOGE("%s: Transaction error closing camera device %s after check for a flash unit: %s",
1156 __FUNCTION__, mId.c_str(), status.description().c_str());
1157 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001158}
1159
1160CameraProviderManager::ProviderInfo::DeviceInfo1::~DeviceInfo1() {}
1161
1162status_t CameraProviderManager::ProviderInfo::DeviceInfo1::setTorchMode(bool enabled) {
1163 return DeviceInfo::setTorchMode(mInterface, enabled);
1164}
1165
1166status_t CameraProviderManager::ProviderInfo::DeviceInfo1::getCameraInfo(
1167 hardware::CameraInfo *info) const {
1168 if (info == nullptr) return BAD_VALUE;
1169
1170 Status status;
1171 device::V1_0::CameraInfo cInfo;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001172 hardware::Return<void> ret;
1173 ret = mInterface->getCameraInfo([&status, &cInfo](Status s, device::V1_0::CameraInfo camInfo) {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001174 status = s;
1175 cInfo = camInfo;
1176 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001177 if (!ret.isOk()) {
1178 ALOGE("%s: Transaction error reading camera info from device %s: %s",
1179 __FUNCTION__, mId.c_str(), ret.description().c_str());
1180 return DEAD_OBJECT;
1181 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001182 if (status != Status::OK) {
1183 return mapToStatusT(status);
1184 }
1185
1186 switch(cInfo.facing) {
1187 case device::V1_0::CameraFacing::BACK:
1188 info->facing = hardware::CAMERA_FACING_BACK;
1189 break;
1190 case device::V1_0::CameraFacing::EXTERNAL:
1191 // Map external to front for legacy API
1192 case device::V1_0::CameraFacing::FRONT:
1193 info->facing = hardware::CAMERA_FACING_FRONT;
1194 break;
1195 default:
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001196 ALOGW("%s: Device %s: Unknown camera facing: %d",
1197 __FUNCTION__, mId.c_str(), cInfo.facing);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001198 info->facing = hardware::CAMERA_FACING_BACK;
1199 }
1200 info->orientation = cInfo.orientation;
1201
1202 return OK;
1203}
1204
Yin-Chia Yeh487785a2018-01-02 12:06:57 -08001205status_t CameraProviderManager::ProviderInfo::DeviceInfo1::dumpState(int fd) const {
1206 native_handle_t* handle = native_handle_create(1,0);
1207 handle->data[0] = fd;
1208 hardware::Return<Status> s = mInterface->dumpState(handle);
1209 native_handle_delete(handle);
1210 if (!s.isOk()) {
1211 return INVALID_OPERATION;
1212 }
1213 return mapToStatusT(s);
1214}
1215
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001216CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string& name,
Emilian Peev71c73a22017-03-21 16:35:51 +00001217 const metadata_vendor_id_t tagId, const std::string &id,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001218 uint16_t minorVersion,
1219 const CameraResourceCost& resourceCost,
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001220 const std::vector<std::string>& publicCameraIds,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001221 sp<InterfaceT> interface) :
Emilian Peev71c73a22017-03-21 16:35:51 +00001222 DeviceInfo(name, tagId, id, hardware::hidl_version{3, minorVersion},
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001223 publicCameraIds, resourceCost),
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001224 mInterface(interface) {
1225 // Get camera characteristics and initialize flash unit availability
1226 Status status;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001227 hardware::Return<void> ret;
1228 ret = mInterface->getCameraCharacteristics([&status, this](Status s,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001229 device::V3_2::CameraMetadata metadata) {
1230 status = s;
1231 if (s == Status::OK) {
1232 camera_metadata_t *buffer =
1233 reinterpret_cast<camera_metadata_t*>(metadata.data());
Yin-Chia Yeh238ef5f2017-04-18 15:01:15 -07001234 size_t expectedSize = metadata.size();
1235 int res = validate_camera_metadata_structure(buffer, &expectedSize);
1236 if (res == OK || res == CAMERA_METADATA_VALIDATION_SHIFTED) {
1237 set_camera_metadata_vendor_id(buffer, mProviderTagid);
1238 mCameraCharacteristics = buffer;
1239 } else {
1240 ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__);
1241 status = Status::INTERNAL_ERROR;
1242 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001243 }
1244 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -07001245 if (!ret.isOk()) {
1246 ALOGE("%s: Transaction error getting camera characteristics for device %s"
1247 " to check for a flash unit: %s", __FUNCTION__, mId.c_str(),
1248 ret.description().c_str());
1249 return;
1250 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001251 if (status != Status::OK) {
1252 ALOGE("%s: Unable to get camera characteristics for device %s: %s (%d)",
1253 __FUNCTION__, mId.c_str(), CameraProviderManager::statusToString(status), status);
1254 return;
1255 }
Shuzhen Wang268a1362018-10-16 16:32:59 -07001256 status_t res = fixupMonochromeTags();
1257 if (OK != res) {
1258 ALOGE("%s: Unable to fix up monochrome tags based for older HAL version: %s (%d)",
1259 __FUNCTION__, strerror(-res), res);
1260 return;
1261 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001262 camera_metadata_entry flashAvailable =
1263 mCameraCharacteristics.find(ANDROID_FLASH_INFO_AVAILABLE);
1264 if (flashAvailable.count == 1 &&
1265 flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE) {
1266 mHasFlashUnit = true;
1267 } else {
1268 mHasFlashUnit = false;
1269 }
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001270
Shuzhen Wang03d8cc12018-09-12 14:17:09 -07001271 queryPhysicalCameraIds();
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001272 // Get physical camera characteristics if applicable
1273 auto castResult = device::V3_5::ICameraDevice::castFrom(mInterface);
1274 if (!castResult.isOk()) {
1275 ALOGV("%s: Unable to convert ICameraDevice instance to version 3.5", __FUNCTION__);
1276 return;
1277 }
1278 sp<hardware::camera::device::V3_5::ICameraDevice> interface_3_5 = castResult;
1279 if (interface_3_5 == nullptr) {
1280 ALOGE("%s: Converted ICameraDevice instance to nullptr", __FUNCTION__);
1281 return;
1282 }
1283
Shuzhen Wang03d8cc12018-09-12 14:17:09 -07001284 if (mIsLogicalCamera) {
1285 for (auto& id : mPhysicalIds) {
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001286 if (std::find(mPublicCameraIds.begin(), mPublicCameraIds.end(), id) !=
1287 mPublicCameraIds.end()) {
1288 continue;
1289 }
1290
1291 hardware::hidl_string hidlId(id);
1292 ret = interface_3_5->getPhysicalCameraCharacteristics(hidlId,
1293 [&status, &id, this](Status s, device::V3_2::CameraMetadata metadata) {
1294 status = s;
1295 if (s == Status::OK) {
1296 camera_metadata_t *buffer =
1297 reinterpret_cast<camera_metadata_t*>(metadata.data());
1298 size_t expectedSize = metadata.size();
1299 int res = validate_camera_metadata_structure(buffer, &expectedSize);
1300 if (res == OK || res == CAMERA_METADATA_VALIDATION_SHIFTED) {
1301 set_camera_metadata_vendor_id(buffer, mProviderTagid);
1302 mPhysicalCameraCharacteristics[id] = buffer;
1303 } else {
1304 ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__);
1305 status = Status::INTERNAL_ERROR;
1306 }
1307 }
1308 });
1309
1310 if (!ret.isOk()) {
1311 ALOGE("%s: Transaction error getting physical camera %s characteristics for %s: %s",
1312 __FUNCTION__, id.c_str(), mId.c_str(), ret.description().c_str());
1313 return;
1314 }
1315 if (status != Status::OK) {
1316 ALOGE("%s: Unable to get physical camera %s characteristics for device %s: %s (%d)",
1317 __FUNCTION__, id.c_str(), mId.c_str(),
1318 CameraProviderManager::statusToString(status), status);
1319 return;
1320 }
1321 }
1322 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001323}
1324
1325CameraProviderManager::ProviderInfo::DeviceInfo3::~DeviceInfo3() {}
1326
1327status_t CameraProviderManager::ProviderInfo::DeviceInfo3::setTorchMode(bool enabled) {
1328 return DeviceInfo::setTorchMode(mInterface, enabled);
1329}
1330
1331status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraInfo(
1332 hardware::CameraInfo *info) const {
1333 if (info == nullptr) return BAD_VALUE;
1334
1335 camera_metadata_ro_entry facing =
1336 mCameraCharacteristics.find(ANDROID_LENS_FACING);
1337 if (facing.count == 1) {
1338 switch (facing.data.u8[0]) {
1339 case ANDROID_LENS_FACING_BACK:
1340 info->facing = hardware::CAMERA_FACING_BACK;
1341 break;
1342 case ANDROID_LENS_FACING_EXTERNAL:
1343 // Map external to front for legacy API
1344 case ANDROID_LENS_FACING_FRONT:
1345 info->facing = hardware::CAMERA_FACING_FRONT;
1346 break;
1347 }
1348 } else {
1349 ALOGE("%s: Unable to find android.lens.facing static metadata", __FUNCTION__);
1350 return NAME_NOT_FOUND;
1351 }
1352
1353 camera_metadata_ro_entry orientation =
1354 mCameraCharacteristics.find(ANDROID_SENSOR_ORIENTATION);
1355 if (orientation.count == 1) {
1356 info->orientation = orientation.data.i32[0];
1357 } else {
1358 ALOGE("%s: Unable to find android.sensor.orientation static metadata", __FUNCTION__);
1359 return NAME_NOT_FOUND;
1360 }
1361
1362 return OK;
1363}
Emilian Peevf53f66e2017-04-11 14:29:43 +01001364bool CameraProviderManager::ProviderInfo::DeviceInfo3::isAPI1Compatible() const {
1365 bool isBackwardCompatible = false;
1366 camera_metadata_ro_entry_t caps = mCameraCharacteristics.find(
1367 ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
1368 for (size_t i = 0; i < caps.count; i++) {
1369 if (caps.data.u8[i] ==
1370 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) {
1371 isBackwardCompatible = true;
1372 break;
1373 }
1374 }
1375
1376 return isBackwardCompatible;
1377}
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001378
Yin-Chia Yeh487785a2018-01-02 12:06:57 -08001379status_t CameraProviderManager::ProviderInfo::DeviceInfo3::dumpState(int fd) const {
1380 native_handle_t* handle = native_handle_create(1,0);
1381 handle->data[0] = fd;
1382 auto ret = mInterface->dumpState(handle);
1383 native_handle_delete(handle);
1384 if (!ret.isOk()) {
1385 return INVALID_OPERATION;
1386 }
1387 return OK;
1388}
1389
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001390status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraCharacteristics(
1391 CameraMetadata *characteristics) const {
1392 if (characteristics == nullptr) return BAD_VALUE;
1393
1394 *characteristics = mCameraCharacteristics;
1395 return OK;
1396}
1397
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001398status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getPhysicalCameraCharacteristics(
1399 const std::string& physicalCameraId, CameraMetadata *characteristics) const {
1400 if (characteristics == nullptr) return BAD_VALUE;
1401 if (mPhysicalCameraCharacteristics.find(physicalCameraId) ==
1402 mPhysicalCameraCharacteristics.end()) {
1403 return NAME_NOT_FOUND;
1404 }
1405
1406 *characteristics = mPhysicalCameraCharacteristics.at(physicalCameraId);
1407 return OK;
1408}
1409
Emilian Peev35ae8262018-11-08 13:11:32 +00001410status_t CameraProviderManager::ProviderInfo::DeviceInfo3::isSessionConfigurationSupported(
1411 const hardware::camera::device::V3_4::StreamConfiguration &configuration,
1412 bool *status /*out*/) const {
1413 auto castResult = device::V3_5::ICameraDevice::castFrom(mInterface);
1414 sp<hardware::camera::device::V3_5::ICameraDevice> interface_3_5 = castResult;
1415 if (interface_3_5 == nullptr) {
1416 return INVALID_OPERATION;
1417 }
1418
1419 status_t res;
1420 Status callStatus;
1421 auto ret = interface_3_5->isStreamCombinationSupported(configuration,
1422 [&callStatus, &status] (Status s, bool combStatus) {
1423 callStatus = s;
1424 *status = combStatus;
1425 });
1426 if (ret.isOk()) {
1427 switch (callStatus) {
1428 case Status::OK:
1429 // Expected case, do nothing.
1430 res = OK;
1431 break;
1432 case Status::METHOD_NOT_SUPPORTED:
1433 res = INVALID_OPERATION;
1434 break;
1435 default:
1436 ALOGE("%s: Session configuration query failed: %d", __FUNCTION__, callStatus);
1437 res = UNKNOWN_ERROR;
1438 }
1439 } else {
1440 ALOGE("%s: Unexpected binder error: %s", __FUNCTION__, ret.description().c_str());
1441 res = UNKNOWN_ERROR;
1442 }
1443
1444 return res;
1445}
1446
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001447status_t CameraProviderManager::ProviderInfo::parseProviderName(const std::string& name,
1448 std::string *type, uint32_t *id) {
1449 // Format must be "<type>/<id>"
1450#define ERROR_MSG_PREFIX "%s: Invalid provider name '%s'. " \
1451 "Should match '<type>/<id>' - "
1452
1453 if (!type || !id) return INVALID_OPERATION;
1454
1455 std::string::size_type slashIdx = name.find('/');
1456 if (slashIdx == std::string::npos || slashIdx == name.size() - 1) {
1457 ALOGE(ERROR_MSG_PREFIX
1458 "does not have / separator between type and id",
1459 __FUNCTION__, name.c_str());
1460 return BAD_VALUE;
1461 }
1462
1463 std::string typeVal = name.substr(0, slashIdx);
1464
1465 char *endPtr;
1466 errno = 0;
1467 long idVal = strtol(name.c_str() + slashIdx + 1, &endPtr, 10);
1468 if (errno != 0) {
1469 ALOGE(ERROR_MSG_PREFIX
1470 "cannot parse provider id as an integer: %s (%d)",
1471 __FUNCTION__, name.c_str(), strerror(errno), errno);
1472 return BAD_VALUE;
1473 }
1474 if (endPtr != name.c_str() + name.size()) {
1475 ALOGE(ERROR_MSG_PREFIX
1476 "provider id has unexpected length",
1477 __FUNCTION__, name.c_str());
1478 return BAD_VALUE;
1479 }
1480 if (idVal < 0) {
1481 ALOGE(ERROR_MSG_PREFIX
1482 "id is negative: %ld",
1483 __FUNCTION__, name.c_str(), idVal);
1484 return BAD_VALUE;
1485 }
1486
1487#undef ERROR_MSG_PREFIX
1488
1489 *type = typeVal;
1490 *id = static_cast<uint32_t>(idVal);
1491
1492 return OK;
1493}
1494
Emilian Peev71c73a22017-03-21 16:35:51 +00001495metadata_vendor_id_t CameraProviderManager::ProviderInfo::generateVendorTagId(
1496 const std::string &name) {
1497 metadata_vendor_id_t ret = std::hash<std::string> {} (name);
1498 // CAMERA_METADATA_INVALID_VENDOR_ID is not a valid hash value
1499 if (CAMERA_METADATA_INVALID_VENDOR_ID == ret) {
1500 ret = 0;
1501 }
1502
1503 return ret;
1504}
1505
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001506status_t CameraProviderManager::ProviderInfo::parseDeviceName(const std::string& name,
1507 uint16_t *major, uint16_t *minor, std::string *type, std::string *id) {
1508
1509 // Format must be "device@<major>.<minor>/<type>/<id>"
1510
1511#define ERROR_MSG_PREFIX "%s: Invalid device name '%s'. " \
1512 "Should match 'device@<major>.<minor>/<type>/<id>' - "
1513
1514 if (!major || !minor || !type || !id) return INVALID_OPERATION;
1515
1516 // Verify starting prefix
1517 const char expectedPrefix[] = "device@";
1518
1519 if (name.find(expectedPrefix) != 0) {
1520 ALOGE(ERROR_MSG_PREFIX
1521 "does not start with '%s'",
1522 __FUNCTION__, name.c_str(), expectedPrefix);
1523 return BAD_VALUE;
1524 }
1525
1526 // Extract major/minor versions
1527 constexpr std::string::size_type atIdx = sizeof(expectedPrefix) - 2;
1528 std::string::size_type dotIdx = name.find('.', atIdx);
1529 if (dotIdx == std::string::npos) {
1530 ALOGE(ERROR_MSG_PREFIX
1531 "does not have @<major>. version section",
1532 __FUNCTION__, name.c_str());
1533 return BAD_VALUE;
1534 }
1535 std::string::size_type typeSlashIdx = name.find('/', dotIdx);
1536 if (typeSlashIdx == std::string::npos) {
1537 ALOGE(ERROR_MSG_PREFIX
1538 "does not have .<minor>/ version section",
1539 __FUNCTION__, name.c_str());
1540 return BAD_VALUE;
1541 }
1542
1543 char *endPtr;
1544 errno = 0;
1545 long majorVal = strtol(name.c_str() + atIdx + 1, &endPtr, 10);
1546 if (errno != 0) {
1547 ALOGE(ERROR_MSG_PREFIX
1548 "cannot parse major version: %s (%d)",
1549 __FUNCTION__, name.c_str(), strerror(errno), errno);
1550 return BAD_VALUE;
1551 }
1552 if (endPtr != name.c_str() + dotIdx) {
1553 ALOGE(ERROR_MSG_PREFIX
1554 "major version has unexpected length",
1555 __FUNCTION__, name.c_str());
1556 return BAD_VALUE;
1557 }
1558 long minorVal = strtol(name.c_str() + dotIdx + 1, &endPtr, 10);
1559 if (errno != 0) {
1560 ALOGE(ERROR_MSG_PREFIX
1561 "cannot parse minor version: %s (%d)",
1562 __FUNCTION__, name.c_str(), strerror(errno), errno);
1563 return BAD_VALUE;
1564 }
1565 if (endPtr != name.c_str() + typeSlashIdx) {
1566 ALOGE(ERROR_MSG_PREFIX
1567 "minor version has unexpected length",
1568 __FUNCTION__, name.c_str());
1569 return BAD_VALUE;
1570 }
1571 if (majorVal < 0 || majorVal > UINT16_MAX || minorVal < 0 || minorVal > UINT16_MAX) {
1572 ALOGE(ERROR_MSG_PREFIX
1573 "major/minor version is out of range of uint16_t: %ld.%ld",
1574 __FUNCTION__, name.c_str(), majorVal, minorVal);
1575 return BAD_VALUE;
1576 }
1577
1578 // Extract type and id
1579
1580 std::string::size_type instanceSlashIdx = name.find('/', typeSlashIdx + 1);
1581 if (instanceSlashIdx == std::string::npos) {
1582 ALOGE(ERROR_MSG_PREFIX
1583 "does not have /<type>/ component",
1584 __FUNCTION__, name.c_str());
1585 return BAD_VALUE;
1586 }
1587 std::string typeVal = name.substr(typeSlashIdx + 1, instanceSlashIdx - typeSlashIdx - 1);
1588
1589 if (instanceSlashIdx == name.size() - 1) {
1590 ALOGE(ERROR_MSG_PREFIX
1591 "does not have an /<id> component",
1592 __FUNCTION__, name.c_str());
1593 return BAD_VALUE;
1594 }
1595 std::string idVal = name.substr(instanceSlashIdx + 1);
1596
1597#undef ERROR_MSG_PREFIX
1598
1599 *major = static_cast<uint16_t>(majorVal);
1600 *minor = static_cast<uint16_t>(minorVal);
1601 *type = typeVal;
1602 *id = idVal;
1603
1604 return OK;
1605}
1606
1607
1608
1609CameraProviderManager::ProviderInfo::~ProviderInfo() {
1610 // Destruction of ProviderInfo is only supposed to happen when the respective
1611 // CameraProvider interface dies, so do not unregister callbacks.
1612
1613}
1614
1615status_t CameraProviderManager::mapToStatusT(const Status& s) {
1616 switch(s) {
1617 case Status::OK:
1618 return OK;
1619 case Status::ILLEGAL_ARGUMENT:
1620 return BAD_VALUE;
1621 case Status::CAMERA_IN_USE:
1622 return -EBUSY;
1623 case Status::MAX_CAMERAS_IN_USE:
1624 return -EUSERS;
1625 case Status::METHOD_NOT_SUPPORTED:
1626 return UNKNOWN_TRANSACTION;
1627 case Status::OPERATION_NOT_SUPPORTED:
1628 return INVALID_OPERATION;
1629 case Status::CAMERA_DISCONNECTED:
1630 return DEAD_OBJECT;
1631 case Status::INTERNAL_ERROR:
1632 return INVALID_OPERATION;
1633 }
1634 ALOGW("Unexpected HAL status code %d", s);
1635 return INVALID_OPERATION;
1636}
1637
1638const char* CameraProviderManager::statusToString(const Status& s) {
1639 switch(s) {
1640 case Status::OK:
1641 return "OK";
1642 case Status::ILLEGAL_ARGUMENT:
1643 return "ILLEGAL_ARGUMENT";
1644 case Status::CAMERA_IN_USE:
1645 return "CAMERA_IN_USE";
1646 case Status::MAX_CAMERAS_IN_USE:
1647 return "MAX_CAMERAS_IN_USE";
1648 case Status::METHOD_NOT_SUPPORTED:
1649 return "METHOD_NOT_SUPPORTED";
1650 case Status::OPERATION_NOT_SUPPORTED:
1651 return "OPERATION_NOT_SUPPORTED";
1652 case Status::CAMERA_DISCONNECTED:
1653 return "CAMERA_DISCONNECTED";
1654 case Status::INTERNAL_ERROR:
1655 return "INTERNAL_ERROR";
1656 }
1657 ALOGW("Unexpected HAL status code %d", s);
1658 return "UNKNOWN_ERROR";
1659}
1660
1661const char* CameraProviderManager::deviceStatusToString(const CameraDeviceStatus& s) {
1662 switch(s) {
1663 case CameraDeviceStatus::NOT_PRESENT:
1664 return "NOT_PRESENT";
1665 case CameraDeviceStatus::PRESENT:
1666 return "PRESENT";
1667 case CameraDeviceStatus::ENUMERATING:
1668 return "ENUMERATING";
1669 }
1670 ALOGW("Unexpected HAL device status code %d", s);
1671 return "UNKNOWN_STATUS";
1672}
1673
1674const char* CameraProviderManager::torchStatusToString(const TorchModeStatus& s) {
1675 switch(s) {
1676 case TorchModeStatus::NOT_AVAILABLE:
1677 return "NOT_AVAILABLE";
1678 case TorchModeStatus::AVAILABLE_OFF:
1679 return "AVAILABLE_OFF";
1680 case TorchModeStatus::AVAILABLE_ON:
1681 return "AVAILABLE_ON";
1682 }
1683 ALOGW("Unexpected HAL torch mode status code %d", s);
1684 return "UNKNOWN_STATUS";
1685}
1686
Yin-Chia Yeh067428c2017-01-13 15:19:24 -08001687
1688status_t HidlVendorTagDescriptor::createDescriptorFromHidl(
1689 const hardware::hidl_vec<hardware::camera::common::V1_0::VendorTagSection>& vts,
1690 /*out*/
1691 sp<VendorTagDescriptor>& descriptor) {
1692
1693 int tagCount = 0;
1694
1695 for (size_t s = 0; s < vts.size(); s++) {
1696 tagCount += vts[s].tags.size();
1697 }
1698
1699 if (tagCount < 0 || tagCount > INT32_MAX) {
1700 ALOGE("%s: tag count %d from vendor tag sections is invalid.", __FUNCTION__, tagCount);
1701 return BAD_VALUE;
1702 }
1703
1704 Vector<uint32_t> tagArray;
1705 LOG_ALWAYS_FATAL_IF(tagArray.resize(tagCount) != tagCount,
1706 "%s: too many (%u) vendor tags defined.", __FUNCTION__, tagCount);
1707
1708
1709 sp<HidlVendorTagDescriptor> desc = new HidlVendorTagDescriptor();
1710 desc->mTagCount = tagCount;
1711
1712 SortedVector<String8> sections;
1713 KeyedVector<uint32_t, String8> tagToSectionMap;
1714
1715 int idx = 0;
1716 for (size_t s = 0; s < vts.size(); s++) {
1717 const hardware::camera::common::V1_0::VendorTagSection& section = vts[s];
1718 const char *sectionName = section.sectionName.c_str();
1719 if (sectionName == NULL) {
1720 ALOGE("%s: no section name defined for vendor tag section %zu.", __FUNCTION__, s);
1721 return BAD_VALUE;
1722 }
1723 String8 sectionString(sectionName);
1724 sections.add(sectionString);
1725
1726 for (size_t j = 0; j < section.tags.size(); j++) {
1727 uint32_t tag = section.tags[j].tagId;
1728 if (tag < CAMERA_METADATA_VENDOR_TAG_BOUNDARY) {
1729 ALOGE("%s: vendor tag %d not in vendor tag section.", __FUNCTION__, tag);
1730 return BAD_VALUE;
1731 }
1732
1733 tagArray.editItemAt(idx++) = section.tags[j].tagId;
1734
1735 const char *tagName = section.tags[j].tagName.c_str();
1736 if (tagName == NULL) {
1737 ALOGE("%s: no tag name defined for vendor tag %d.", __FUNCTION__, tag);
1738 return BAD_VALUE;
1739 }
1740 desc->mTagToNameMap.add(tag, String8(tagName));
1741 tagToSectionMap.add(tag, sectionString);
1742
1743 int tagType = (int) section.tags[j].tagType;
1744 if (tagType < 0 || tagType >= NUM_TYPES) {
1745 ALOGE("%s: tag type %d from vendor ops does not exist.", __FUNCTION__, tagType);
1746 return BAD_VALUE;
1747 }
1748 desc->mTagToTypeMap.add(tag, tagType);
1749 }
1750 }
1751
1752 desc->mSections = sections;
1753
1754 for (size_t i = 0; i < tagArray.size(); ++i) {
1755 uint32_t tag = tagArray[i];
1756 String8 sectionString = tagToSectionMap.valueFor(tag);
1757
1758 // Set up tag to section index map
1759 ssize_t index = sections.indexOf(sectionString);
1760 LOG_ALWAYS_FATAL_IF(index < 0, "index %zd must be non-negative", index);
1761 desc->mTagToSectionMap.add(tag, static_cast<uint32_t>(index));
1762
1763 // Set up reverse mapping
1764 ssize_t reverseIndex = -1;
1765 if ((reverseIndex = desc->mReverseMapping.indexOfKey(sectionString)) < 0) {
1766 KeyedVector<String8, uint32_t>* nameMapper = new KeyedVector<String8, uint32_t>();
1767 reverseIndex = desc->mReverseMapping.add(sectionString, nameMapper);
1768 }
1769 desc->mReverseMapping[reverseIndex]->add(desc->mTagToNameMap.valueFor(tag), tag);
1770 }
1771
George Burgess IVa0b84962017-08-29 17:46:19 -07001772 descriptor = std::move(desc);
Yin-Chia Yeh067428c2017-01-13 15:19:24 -08001773 return OK;
1774}
1775
Shuzhen Wange8aceb52018-05-21 12:00:56 -07001776status_t CameraProviderManager::getCameraCharacteristicsLocked(const std::string &id,
1777 CameraMetadata* characteristics) const {
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001778 auto deviceInfo = findDeviceInfoLocked(id, /*minVersion*/ {3,0}, /*maxVersion*/ {5,0});
1779 if (deviceInfo != nullptr) {
1780 return deviceInfo->getCameraCharacteristics(characteristics);
1781 }
Shuzhen Wange8aceb52018-05-21 12:00:56 -07001782
Shuzhen Wangf9d2c022018-08-21 12:07:35 -07001783 // Find hidden physical camera characteristics
1784 for (auto& provider : mProviders) {
1785 for (auto& deviceInfo : provider->mDevices) {
1786 status_t res = deviceInfo->getPhysicalCameraCharacteristics(id, characteristics);
1787 if (res != NAME_NOT_FOUND) return res;
1788 }
1789 }
1790
1791 return NAME_NOT_FOUND;
Shuzhen Wange8aceb52018-05-21 12:00:56 -07001792}
1793
1794void CameraProviderManager::filterLogicalCameraIdsLocked(
1795 std::vector<std::string>& deviceIds) const
1796{
1797 std::unordered_set<std::string> removedIds;
1798
1799 for (auto& deviceId : deviceIds) {
Shuzhen Wang03d8cc12018-09-12 14:17:09 -07001800 auto deviceInfo = findDeviceInfoLocked(deviceId);
1801 if (deviceInfo == nullptr) continue;
Shuzhen Wange8aceb52018-05-21 12:00:56 -07001802
Shuzhen Wang03d8cc12018-09-12 14:17:09 -07001803 if (!deviceInfo->mIsLogicalCamera) {
Shuzhen Wange8aceb52018-05-21 12:00:56 -07001804 continue;
1805 }
Shuzhen Wang03d8cc12018-09-12 14:17:09 -07001806 // idCombo contains the ids of a logical camera and its physical cameras
1807 std::vector<std::string> idCombo = deviceInfo->mPhysicalIds;
Shuzhen Wange8aceb52018-05-21 12:00:56 -07001808 idCombo.push_back(deviceId);
1809
1810 for (auto& id : deviceIds) {
1811 auto foundId = std::find(idCombo.begin(), idCombo.end(), id);
1812 if (foundId == idCombo.end()) {
1813 continue;
1814 }
1815
1816 idCombo.erase(foundId);
1817 removedIds.insert(idCombo.begin(), idCombo.end());
1818 break;
1819 }
1820 }
1821
1822 deviceIds.erase(std::remove_if(deviceIds.begin(), deviceIds.end(),
1823 [&removedIds](const std::string& s) {return removedIds.find(s) != removedIds.end();}),
1824 deviceIds.end());
1825}
Yin-Chia Yeh067428c2017-01-13 15:19:24 -08001826
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001827} // namespace android