blob: 562e6c930cc6f9d2fef2a95aa1058a4198ed386c [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
Yin-Chia Yeh65405092017-01-13 15:42:28 -080023#include <chrono>
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -070024#include <inttypes.h>
Yin-Chia Yehe8e9e192017-03-16 15:23:51 -070025#include <set>
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080026#include <hidl/ServiceManagement.h>
27
28namespace android {
29
30using namespace ::android::hardware::camera;
31using namespace ::android::hardware::camera::common::V1_0;
32
33namespace {
34// Hardcoded name for the passthrough HAL implementation, since it can't be discovered via the
35// service manager
36const std::string kLegacyProviderName("legacy/0");
37
38// Slash-separated list of provider types to consider for use via the old camera API
39const std::string kStandardProviderTypes("internal/legacy");
40
41} // anonymous namespace
42
43CameraProviderManager::HardwareServiceInteractionProxy
44CameraProviderManager::sHardwareServiceInteractionProxy{};
45
46CameraProviderManager::~CameraProviderManager() {
47}
48
49status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener,
50 ServiceInteractionProxy* proxy) {
Yin-Chia Yeh4c5b1c72017-01-31 13:20:56 -080051 std::lock_guard<std::mutex> lock(mInterfaceMutex);
52 if (proxy == nullptr) {
53 ALOGE("%s: No valid service interaction proxy provided", __FUNCTION__);
54 return BAD_VALUE;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080055 }
Yin-Chia Yeh4c5b1c72017-01-31 13:20:56 -080056 mListener = listener;
57 mServiceProxy = proxy;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080058
Yin-Chia Yeh4c5b1c72017-01-31 13:20:56 -080059 // Registering will trigger notifications for all already-known providers
60 bool success = mServiceProxy->registerForNotifications(
61 /* instance name, empty means no filter */ "",
62 this);
63 if (!success) {
64 ALOGE("%s: Unable to register with hardware service manager for notifications "
65 "about camera providers", __FUNCTION__);
66 return INVALID_OPERATION;
Yin-Chia Yeh65405092017-01-13 15:42:28 -080067 }
Emilian Peev5d7e5152017-02-22 15:37:48 +000068
Eino-Ville Talvala65665362017-02-24 13:07:56 -080069 // See if there's a passthrough HAL, but let's not complain if there's not
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -070070 addProviderLocked(kLegacyProviderName, /*expected*/ false);
Eino-Ville Talvala65665362017-02-24 13:07:56 -080071
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080072 return OK;
73}
74
75int CameraProviderManager::getCameraCount() const {
76 std::lock_guard<std::mutex> lock(mInterfaceMutex);
77 int count = 0;
78 for (auto& provider : mProviders) {
Yin-Chia Yehe8e9e192017-03-16 15:23:51 -070079 count += provider->mUniqueDeviceCount;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080080 }
81 return count;
82}
83
84int CameraProviderManager::getStandardCameraCount() const {
85 std::lock_guard<std::mutex> lock(mInterfaceMutex);
86 int count = 0;
87 for (auto& provider : mProviders) {
88 if (kStandardProviderTypes.find(provider->getType()) != std::string::npos) {
Yin-Chia Yehe8e9e192017-03-16 15:23:51 -070089 count += provider->mUniqueDeviceCount;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080090 }
91 }
92 return count;
93}
94
95std::vector<std::string> CameraProviderManager::getCameraDeviceIds() const {
96 std::lock_guard<std::mutex> lock(mInterfaceMutex);
97 std::vector<std::string> deviceIds;
98 for (auto& provider : mProviders) {
99 for (auto& deviceInfo : provider->mDevices) {
100 deviceIds.push_back(deviceInfo->mId);
101 }
102 }
103 return deviceIds;
104}
105
106bool CameraProviderManager::isValidDevice(const std::string &id, uint16_t majorVersion) const {
107 std::lock_guard<std::mutex> lock(mInterfaceMutex);
108 return isValidDeviceLocked(id, majorVersion);
109}
110
111bool CameraProviderManager::isValidDeviceLocked(const std::string &id, uint16_t majorVersion) const {
112 for (auto& provider : mProviders) {
113 for (auto& deviceInfo : provider->mDevices) {
114 if (deviceInfo->mId == id && deviceInfo->mVersion.get_major() == majorVersion) {
115 return true;
116 }
117 }
118 }
119 return false;
120}
121
122bool CameraProviderManager::hasFlashUnit(const std::string &id) const {
123 std::lock_guard<std::mutex> lock(mInterfaceMutex);
124
125 auto deviceInfo = findDeviceInfoLocked(id);
126 if (deviceInfo == nullptr) return false;
127
128 return deviceInfo->hasFlashUnit();
129}
130
131status_t CameraProviderManager::getResourceCost(const std::string &id,
132 CameraResourceCost* cost) const {
133 std::lock_guard<std::mutex> lock(mInterfaceMutex);
134
135 auto deviceInfo = findDeviceInfoLocked(id);
136 if (deviceInfo == nullptr) return NAME_NOT_FOUND;
137
138 *cost = deviceInfo->mResourceCost;
139 return OK;
140}
141
142status_t CameraProviderManager::getCameraInfo(const std::string &id,
143 hardware::CameraInfo* info) const {
144 std::lock_guard<std::mutex> lock(mInterfaceMutex);
145
146 auto deviceInfo = findDeviceInfoLocked(id);
147 if (deviceInfo == nullptr) return NAME_NOT_FOUND;
148
149 return deviceInfo->getCameraInfo(info);
150}
151
152status_t CameraProviderManager::getCameraCharacteristics(const std::string &id,
153 CameraMetadata* characteristics) const {
154 std::lock_guard<std::mutex> lock(mInterfaceMutex);
155
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800156 auto deviceInfo = findDeviceInfoLocked(id, /*minVersion*/ {3,0}, /*maxVersion*/ {4,0});
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800157 if (deviceInfo == nullptr) return NAME_NOT_FOUND;
158
159 return deviceInfo->getCameraCharacteristics(characteristics);
160}
161
162status_t CameraProviderManager::getHighestSupportedVersion(const std::string &id,
163 hardware::hidl_version *v) {
164 std::lock_guard<std::mutex> lock(mInterfaceMutex);
165
166 hardware::hidl_version maxVersion{0,0};
167 bool found = false;
168 for (auto& provider : mProviders) {
169 for (auto& deviceInfo : provider->mDevices) {
170 if (deviceInfo->mId == id) {
171 if (deviceInfo->mVersion > maxVersion) {
172 maxVersion = deviceInfo->mVersion;
173 found = true;
174 }
175 }
176 }
177 }
178 if (!found) {
179 return NAME_NOT_FOUND;
180 }
181 *v = maxVersion;
182 return OK;
183}
184
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800185status_t CameraProviderManager::setTorchMode(const std::string &id, bool enabled) {
186 std::lock_guard<std::mutex> lock(mInterfaceMutex);
187
188 auto deviceInfo = findDeviceInfoLocked(id);
189 if (deviceInfo == nullptr) return NAME_NOT_FOUND;
190
191 return deviceInfo->setTorchMode(enabled);
192}
193
Yin-Chia Yeh067428c2017-01-13 15:19:24 -0800194status_t CameraProviderManager::setUpVendorTags() {
195 // TODO (b/34275821): support aggregating vendor tags for more than one provider
196 for (auto& provider : mProviders) {
197 hardware::hidl_vec<VendorTagSection> vts;
198 Status status;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700199 hardware::Return<void> ret;
200 ret = provider->mInterface->getVendorTags(
Yin-Chia Yeh067428c2017-01-13 15:19:24 -0800201 [&](auto s, const auto& vendorTagSecs) {
202 status = s;
203 if (s == Status::OK) {
204 vts = vendorTagSecs;
205 }
206 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700207 if (!ret.isOk()) {
208 ALOGE("%s: Transaction error getting vendor tags from provider '%s': %s",
209 __FUNCTION__, provider->mProviderName.c_str(), ret.description().c_str());
210 return DEAD_OBJECT;
211 }
Yin-Chia Yeh067428c2017-01-13 15:19:24 -0800212 if (status != Status::OK) {
213 return mapToStatusT(status);
214 }
215
216 VendorTagDescriptor::clearGlobalVendorTagDescriptor();
217
218 // Read all vendor tag definitions into a descriptor
219 sp<VendorTagDescriptor> desc;
220 status_t res;
221 if ((res = HidlVendorTagDescriptor::createDescriptorFromHidl(vts, /*out*/desc))
222 != OK) {
223 ALOGE("%s: Could not generate descriptor from vendor tag operations,"
224 "received error %s (%d). Camera clients will not be able to use"
225 "vendor tags", __FUNCTION__, strerror(res), res);
226 return res;
227 }
228
229 // Set the global descriptor to use with camera metadata
230 VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc);
231 }
232 return OK;
233}
234
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800235status_t CameraProviderManager::openSession(const std::string &id,
236 const sp<hardware::camera::device::V3_2::ICameraDeviceCallback>& callback,
237 /*out*/
238 sp<hardware::camera::device::V3_2::ICameraDeviceSession> *session) {
239
240 std::lock_guard<std::mutex> lock(mInterfaceMutex);
241
242 auto deviceInfo = findDeviceInfoLocked(id,
243 /*minVersion*/ {3,0}, /*maxVersion*/ {4,0});
244 if (deviceInfo == nullptr) return NAME_NOT_FOUND;
245
246 auto *deviceInfo3 = static_cast<ProviderInfo::DeviceInfo3*>(deviceInfo);
247
248 Status status;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700249 hardware::Return<void> ret;
250 ret = deviceInfo3->mInterface->open(callback, [&status, &session]
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800251 (Status s, const sp<device::V3_2::ICameraDeviceSession>& cameraSession) {
252 status = s;
253 if (status == Status::OK) {
254 *session = cameraSession;
255 }
256 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700257 if (!ret.isOk()) {
258 ALOGE("%s: Transaction error opening a session for camera device %s: %s",
259 __FUNCTION__, id.c_str(), ret.description().c_str());
260 return DEAD_OBJECT;
261 }
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800262 return mapToStatusT(status);
263}
264
265status_t CameraProviderManager::openSession(const std::string &id,
266 const sp<hardware::camera::device::V1_0::ICameraDeviceCallback>& callback,
267 /*out*/
268 sp<hardware::camera::device::V1_0::ICameraDevice> *session) {
269
270 std::lock_guard<std::mutex> lock(mInterfaceMutex);
271
272 auto deviceInfo = findDeviceInfoLocked(id,
273 /*minVersion*/ {1,0}, /*maxVersion*/ {2,0});
274 if (deviceInfo == nullptr) return NAME_NOT_FOUND;
275
276 auto *deviceInfo1 = static_cast<ProviderInfo::DeviceInfo1*>(deviceInfo);
277
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700278 hardware::Return<Status> status = deviceInfo1->mInterface->open(callback);
279 if (!status.isOk()) {
280 ALOGE("%s: Transaction error opening a session for camera device %s: %s",
281 __FUNCTION__, id.c_str(), status.description().c_str());
282 return DEAD_OBJECT;
283 }
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800284 if (status == Status::OK) {
285 *session = deviceInfo1->mInterface;
286 }
287 return mapToStatusT(status);
288}
289
290
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800291hardware::Return<void> CameraProviderManager::onRegistration(
292 const hardware::hidl_string& /*fqName*/,
293 const hardware::hidl_string& name,
294 bool /*preexisting*/) {
295 std::lock_guard<std::mutex> lock(mInterfaceMutex);
296
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700297 addProviderLocked(name);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800298 return hardware::Return<void>();
299}
300
301status_t CameraProviderManager::dump(int fd, const Vector<String16>& args) {
302 std::lock_guard<std::mutex> lock(mInterfaceMutex);
303
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800304 for (auto& provider : mProviders) {
305 provider->dump(fd, args);
306 }
307 return OK;
308}
309
310CameraProviderManager::ProviderInfo::DeviceInfo* CameraProviderManager::findDeviceInfoLocked(
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800311 const std::string& id,
312 hardware::hidl_version minVersion, hardware::hidl_version maxVersion) const {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800313 for (auto& provider : mProviders) {
314 for (auto& deviceInfo : provider->mDevices) {
Eino-Ville Talvala0b1cb142016-12-19 16:29:17 -0800315 if (deviceInfo->mId == id &&
316 minVersion <= deviceInfo->mVersion && maxVersion >= deviceInfo->mVersion) {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800317 return deviceInfo.get();
318 }
319 }
320 }
321 return nullptr;
322}
323
324
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700325status_t CameraProviderManager::addProviderLocked(const std::string& newProvider, bool expected) {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800326 for (const auto& providerInfo : mProviders) {
327 if (providerInfo->mProviderName == newProvider) {
328 ALOGW("%s: Camera provider HAL with name '%s' already registered", __FUNCTION__,
329 newProvider.c_str());
330 return ALREADY_EXISTS;
331 }
332 }
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700333
334 sp<provider::V2_4::ICameraProvider> interface;
335 interface = mServiceProxy->getService(newProvider);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800336
337 if (interface == nullptr) {
338 if (expected) {
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700339 ALOGE("%s: Camera provider HAL '%s' is not actually available", __FUNCTION__,
340 newProvider.c_str());
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800341 return BAD_VALUE;
342 } else {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800343 return OK;
344 }
345 }
346
347 sp<ProviderInfo> providerInfo =
348 new ProviderInfo(newProvider, interface, this);
349 status_t res = providerInfo->initialize();
350 if (res != OK) {
351 return res;
352 }
353
354 mProviders.push_back(providerInfo);
355
356 return OK;
357}
358
359status_t CameraProviderManager::removeProvider(const std::string& provider) {
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700360 std::unique_lock<std::mutex> lock(mInterfaceMutex);
361 std::vector<String8> removedDeviceIds;
362 status_t res = NAME_NOT_FOUND;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800363 for (auto it = mProviders.begin(); it != mProviders.end(); it++) {
364 if ((*it)->mProviderName == provider) {
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700365 removedDeviceIds.reserve((*it)->mDevices.size());
366 for (auto& deviceInfo : (*it)->mDevices) {
367 removedDeviceIds.push_back(String8(deviceInfo->mId.c_str()));
368 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800369 mProviders.erase(it);
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700370 res = OK;
371 break;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800372 }
373 }
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700374 if (res != OK) {
375 ALOGW("%s: Camera provider HAL with name '%s' is not registered", __FUNCTION__,
376 provider.c_str());
377 } else {
378 // Inform camera service of loss of presence for all the devices from this provider,
379 // without lock held for reentrancy
380 sp<StatusListener> listener = getStatusListener();
381 if (listener != nullptr) {
382 lock.unlock();
383 for (auto& id : removedDeviceIds) {
384 listener->onDeviceStatusChanged(id, CameraDeviceStatus::NOT_PRESENT);
385 }
386 }
387 }
388 return res;
389}
390
391sp<CameraProviderManager::StatusListener> CameraProviderManager::getStatusListener() const {
392 return mListener.promote();
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800393}
394
395/**** Methods for ProviderInfo ****/
396
397
398CameraProviderManager::ProviderInfo::ProviderInfo(
399 const std::string &providerName,
400 sp<provider::V2_4::ICameraProvider>& interface,
401 CameraProviderManager *manager) :
402 mProviderName(providerName),
403 mInterface(interface),
404 mManager(manager) {
405 (void) mManager;
406}
407
408status_t CameraProviderManager::ProviderInfo::initialize() {
409 status_t res = parseProviderName(mProviderName, &mType, &mId);
410 if (res != OK) {
411 ALOGE("%s: Invalid provider name, ignoring", __FUNCTION__);
412 return BAD_VALUE;
413 }
Yin-Chia Yeh65405092017-01-13 15:42:28 -0800414 ALOGI("Connecting to new camera provider: %s, isRemote? %d",
415 mProviderName.c_str(), mInterface->isRemote());
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700416 hardware::Return<Status> status = mInterface->setCallback(this);
417 if (!status.isOk()) {
418 ALOGE("%s: Transaction error setting up callbacks with camera provider '%s': %s",
419 __FUNCTION__, mProviderName.c_str(), status.description().c_str());
420 return DEAD_OBJECT;
421 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800422 if (status != Status::OK) {
423 ALOGE("%s: Unable to register callbacks with camera provider '%s'",
424 __FUNCTION__, mProviderName.c_str());
425 return mapToStatusT(status);
426 }
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700427
428 hardware::Return<bool> linked = mInterface->linkToDeath(this, /*cookie*/ mId);
429 if (!linked.isOk()) {
430 ALOGE("%s: Transaction error in linking to camera provider '%s' death: %s",
431 __FUNCTION__, mProviderName.c_str(), linked.description().c_str());
432 return DEAD_OBJECT;
433 } else if (!linked) {
434 ALOGW("%s: Unable to link to provider '%s' death notifications",
435 __FUNCTION__, mProviderName.c_str());
436 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800437
438 // Get initial list of camera devices, if any
439 std::vector<std::string> devices;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700440 hardware::Return<void> ret = mInterface->getCameraIdList([&status, &devices](
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800441 Status idStatus,
442 const hardware::hidl_vec<hardware::hidl_string>& cameraDeviceNames) {
443 status = idStatus;
444 if (status == Status::OK) {
445 for (size_t i = 0; i < cameraDeviceNames.size(); i++) {
446 devices.push_back(cameraDeviceNames[i]);
447 }
448 } });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700449 if (!ret.isOk()) {
450 ALOGE("%s: Transaction error in getting camera ID list from provider '%s': %s",
451 __FUNCTION__, mProviderName.c_str(), linked.description().c_str());
452 return DEAD_OBJECT;
453 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800454 if (status != Status::OK) {
455 ALOGE("%s: Unable to query for camera devices from provider '%s'",
456 __FUNCTION__, mProviderName.c_str());
457 return mapToStatusT(status);
458 }
459
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700460 sp<StatusListener> listener = mManager->getStatusListener();
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800461 for (auto& device : devices) {
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700462 std::string id;
463 status_t res = addDevice(device,
464 hardware::camera::common::V1_0::CameraDeviceStatus::PRESENT, &id);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800465 if (res != OK) {
466 ALOGE("%s: Unable to enumerate camera device '%s': %s (%d)",
467 __FUNCTION__, device.c_str(), strerror(-res), res);
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700468 continue;
469 }
470 if (listener != nullptr) {
471 listener->onDeviceStatusChanged(String8(id.c_str()), CameraDeviceStatus::PRESENT);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800472 }
473 }
474
Yin-Chia Yehe8e9e192017-03-16 15:23:51 -0700475 std::set<std::string> uniqueCameraIds;
476 for (auto& device : mDevices) {
477 uniqueCameraIds.insert(device->mId);
478 }
479 mUniqueDeviceCount = uniqueCameraIds.size();
480
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800481 ALOGI("Camera provider %s ready with %zu camera devices",
482 mProviderName.c_str(), mDevices.size());
483
484 return OK;
485}
486
487const std::string& CameraProviderManager::ProviderInfo::getType() const {
488 return mType;
489}
490
491status_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name,
492 CameraDeviceStatus initialStatus, /*out*/ std::string* parsedId) {
493
494 ALOGI("Enumerating new camera device: %s", name.c_str());
495
496 uint16_t major, minor;
497 std::string type, id;
498
499 status_t res = parseDeviceName(name, &major, &minor, &type, &id);
500 if (res != OK) {
501 return res;
502 }
503 if (type != mType) {
504 ALOGE("%s: Device type %s does not match provider type %s", __FUNCTION__,
505 type.c_str(), mType.c_str());
506 return BAD_VALUE;
507 }
508 if (mManager->isValidDeviceLocked(id, major)) {
509 ALOGE("%s: Device %s: ID %s is already in use for device major version %d", __FUNCTION__,
510 name.c_str(), id.c_str(), major);
511 return BAD_VALUE;
512 }
513
514 std::unique_ptr<DeviceInfo> deviceInfo;
515 switch (major) {
516 case 1:
517 deviceInfo = initializeDeviceInfo<DeviceInfo1>(name, id, minor);
518 break;
519 case 3:
520 deviceInfo = initializeDeviceInfo<DeviceInfo3>(name, id, minor);
521 break;
522 default:
523 ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__,
524 name.c_str(), major);
525 return BAD_VALUE;
526 }
527 if (deviceInfo == nullptr) return BAD_VALUE;
528 deviceInfo->mStatus = initialStatus;
529
530 mDevices.push_back(std::move(deviceInfo));
531
532 if (parsedId != nullptr) {
533 *parsedId = id;
534 }
535 return OK;
536}
537
538status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const {
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700539 dprintf(fd, "== Camera Provider HAL %s (v2.4, %s) static info: %zu devices: ==\n",
540 mProviderName.c_str(), mInterface->isRemote() ? "remote" : "passthrough",
541 mDevices.size());
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800542
543 for (auto& device : mDevices) {
Eino-Ville Talvalad00111e2017-01-31 11:59:12 -0800544 dprintf(fd, "== Camera HAL device %s (v%d.%d) static information: ==\n", device->mName.c_str(),
545 device->mVersion.get_major(), device->mVersion.get_minor());
546 dprintf(fd, " Resource cost: %d\n", device->mResourceCost.resourceCost);
547 if (device->mResourceCost.conflictingDevices.size() == 0) {
548 dprintf(fd, " Conflicting devices: None\n");
549 } else {
550 dprintf(fd, " Conflicting devices:\n");
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800551 for (size_t i = 0; i < device->mResourceCost.conflictingDevices.size(); i++) {
Eino-Ville Talvalad00111e2017-01-31 11:59:12 -0800552 dprintf(fd, " %s\n",
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800553 device->mResourceCost.conflictingDevices[i].c_str());
554 }
555 }
Eino-Ville Talvalad00111e2017-01-31 11:59:12 -0800556 dprintf(fd, " API1 info:\n");
557 dprintf(fd, " Has a flash unit: %s\n",
558 device->hasFlashUnit() ? "true" : "false");
559 hardware::CameraInfo info;
560 status_t res = device->getCameraInfo(&info);
561 if (res != OK) {
562 dprintf(fd, " <Error reading camera info: %s (%d)>\n",
563 strerror(-res), res);
564 } else {
565 dprintf(fd, " Facing: %s\n",
566 info.facing == hardware::CAMERA_FACING_BACK ? "Back" : "Front");
567 dprintf(fd, " Orientation: %d\n", info.orientation);
568 }
569 CameraMetadata info2;
570 res = device->getCameraCharacteristics(&info2);
571 if (res == INVALID_OPERATION) {
572 dprintf(fd, " API2 not directly supported\n");
573 } else if (res != OK) {
574 dprintf(fd, " <Error reading camera characteristics: %s (%d)>\n",
575 strerror(-res), res);
576 } else {
577 dprintf(fd, " API2 camera characteristics:\n");
578 info2.dump(fd, /*verbosity*/ 2, /*indentation*/ 4);
579 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800580 }
581 return OK;
582}
583
584hardware::Return<void> CameraProviderManager::ProviderInfo::cameraDeviceStatusChange(
585 const hardware::hidl_string& cameraDeviceName,
586 CameraDeviceStatus newStatus) {
587 sp<StatusListener> listener;
588 std::string id;
589 {
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700590 std::lock_guard<std::mutex> lock(mLock);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800591 bool known = false;
592 for (auto& deviceInfo : mDevices) {
593 if (deviceInfo->mName == cameraDeviceName) {
594 ALOGI("Camera device %s status is now %s, was %s", cameraDeviceName.c_str(),
595 deviceStatusToString(newStatus), deviceStatusToString(deviceInfo->mStatus));
596 deviceInfo->mStatus = newStatus;
597 // TODO: Handle device removal (NOT_PRESENT)
598 id = deviceInfo->mId;
599 known = true;
600 break;
601 }
602 }
603 // Previously unseen device; status must not be NOT_PRESENT
604 if (!known) {
605 if (newStatus == CameraDeviceStatus::NOT_PRESENT) {
606 ALOGW("Camera provider %s says an unknown camera device %s is not present. Curious.",
607 mProviderName.c_str(), cameraDeviceName.c_str());
608 return hardware::Void();
609 }
610 addDevice(cameraDeviceName, newStatus, &id);
611 }
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700612 listener = mManager->getStatusListener();
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800613 }
614 // Call without lock held to allow reentrancy into provider manager
615 if (listener != nullptr) {
616 listener->onDeviceStatusChanged(String8(id.c_str()), newStatus);
617 }
618 return hardware::Void();
619}
620
621hardware::Return<void> CameraProviderManager::ProviderInfo::torchModeStatusChange(
622 const hardware::hidl_string& cameraDeviceName,
623 TorchModeStatus newStatus) {
624 sp<StatusListener> listener;
625 std::string id;
626 {
Yin-Chia Yeh52778d42016-12-22 18:20:43 -0800627 std::lock_guard<std::mutex> lock(mManager->mStatusListenerMutex);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800628 bool known = false;
629 for (auto& deviceInfo : mDevices) {
630 if (deviceInfo->mName == cameraDeviceName) {
631 ALOGI("Camera device %s torch status is now %s", cameraDeviceName.c_str(),
632 torchStatusToString(newStatus));
633 id = deviceInfo->mId;
634 known = true;
635 break;
636 }
637 }
638 if (!known) {
639 ALOGW("Camera provider %s says an unknown camera %s now has torch status %d. Curious.",
640 mProviderName.c_str(), cameraDeviceName.c_str(), newStatus);
641 return hardware::Void();
642 }
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700643 listener = mManager->getStatusListener();
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800644 }
645 // Call without lock held to allow reentrancy into provider manager
646 if (listener != nullptr) {
647 listener->onTorchStatusChanged(String8(id.c_str()), newStatus);
648 }
649 return hardware::Void();
650}
651
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700652void CameraProviderManager::ProviderInfo::serviceDied(uint64_t cookie,
653 const wp<hidl::base::V1_0::IBase>& who) {
654 (void) who;
655 ALOGI("Camera provider '%s' has died; removing it", mProviderName.c_str());
656 if (cookie != mId) {
657 ALOGW("%s: Unexpected serviceDied cookie %" PRIu64 ", expected %" PRIu32,
658 __FUNCTION__, cookie, mId);
659 }
660 mManager->removeProvider(mProviderName);
661}
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800662
663template<class DeviceInfoT>
664std::unique_ptr<CameraProviderManager::ProviderInfo::DeviceInfo>
665 CameraProviderManager::ProviderInfo::initializeDeviceInfo(
666 const std::string &name,
667 const std::string &id, uint16_t minorVersion) const {
668 Status status;
669
670 auto cameraInterface =
671 getDeviceInterface<typename DeviceInfoT::InterfaceT>(name);
672 if (cameraInterface == nullptr) return nullptr;
673
674 CameraResourceCost resourceCost;
675 cameraInterface->getResourceCost([&status, &resourceCost](
676 Status s, CameraResourceCost cost) {
677 status = s;
678 resourceCost = cost;
679 });
680 if (status != Status::OK) {
681 ALOGE("%s: Unable to obtain resource costs for camera device %s: %s", __FUNCTION__,
682 name.c_str(), statusToString(status));
683 return nullptr;
684 }
685 return std::unique_ptr<DeviceInfo>(
686 new DeviceInfoT(name, id, minorVersion, resourceCost, cameraInterface));
687}
688
689template<class InterfaceT>
690sp<InterfaceT>
691CameraProviderManager::ProviderInfo::getDeviceInterface(const std::string &name) const {
692 ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__,
693 name.c_str(), InterfaceT::version.get_major());
694 return nullptr;
695}
696
697template<>
698sp<device::V1_0::ICameraDevice>
699CameraProviderManager::ProviderInfo::getDeviceInterface
700 <device::V1_0::ICameraDevice>(const std::string &name) const {
701 Status status;
702 sp<device::V1_0::ICameraDevice> cameraInterface;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700703 hardware::Return<void> ret;
704 ret = mInterface->getCameraDeviceInterface_V1_x(name, [&status, &cameraInterface](
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800705 Status s, sp<device::V1_0::ICameraDevice> interface) {
706 status = s;
707 cameraInterface = interface;
708 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700709 if (!ret.isOk()) {
710 ALOGE("%s: Transaction error trying to obtain interface for camera device %s: %s",
711 __FUNCTION__, name.c_str(), ret.description().c_str());
712 return nullptr;
713 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800714 if (status != Status::OK) {
715 ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__,
716 name.c_str(), statusToString(status));
717 return nullptr;
718 }
719 return cameraInterface;
720}
721
722template<>
723sp<device::V3_2::ICameraDevice>
724CameraProviderManager::ProviderInfo::getDeviceInterface
725 <device::V3_2::ICameraDevice>(const std::string &name) const {
726 Status status;
727 sp<device::V3_2::ICameraDevice> cameraInterface;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700728 hardware::Return<void> ret;
729 ret = mInterface->getCameraDeviceInterface_V3_x(name, [&status, &cameraInterface](
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800730 Status s, sp<device::V3_2::ICameraDevice> interface) {
731 status = s;
732 cameraInterface = interface;
733 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700734 if (!ret.isOk()) {
735 ALOGE("%s: Transaction error trying to obtain interface for camera device %s: %s",
736 __FUNCTION__, name.c_str(), ret.description().c_str());
737 return nullptr;
738 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800739 if (status != Status::OK) {
740 ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__,
741 name.c_str(), statusToString(status));
742 return nullptr;
743 }
744 return cameraInterface;
745}
746
747CameraProviderManager::ProviderInfo::DeviceInfo::~DeviceInfo() {}
748
749template<class InterfaceT>
750status_t CameraProviderManager::ProviderInfo::DeviceInfo::setTorchMode(InterfaceT& interface,
751 bool enabled) {
752 Status s = interface->setTorchMode(enabled ? TorchMode::ON : TorchMode::OFF);
753 return mapToStatusT(s);
754}
755
756CameraProviderManager::ProviderInfo::DeviceInfo1::DeviceInfo1(const std::string& name,
757 const std::string &id,
758 uint16_t minorVersion,
759 const CameraResourceCost& resourceCost,
760 sp<InterfaceT> interface) :
761 DeviceInfo(name, id, hardware::hidl_version{1, minorVersion}, resourceCost),
762 mInterface(interface) {
763 // Get default parameters and initialize flash unit availability
764 // Requires powering on the camera device
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700765 hardware::Return<Status> status = mInterface->open(nullptr);
766 if (!status.isOk()) {
767 ALOGE("%s: Transaction error opening camera device %s to check for a flash unit: %s",
768 __FUNCTION__, mId.c_str(), status.description().c_str());
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800769 return;
770 }
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700771 if (status != Status::OK) {
772 ALOGE("%s: Unable to open camera device %s to check for a flash unit: %s", __FUNCTION__,
773 mId.c_str(), CameraProviderManager::statusToString(status));
774 return;
775 }
776 hardware::Return<void> ret;
777 ret = mInterface->getParameters([this](const hardware::hidl_string& parms) {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800778 mDefaultParameters.unflatten(String8(parms.c_str()));
779 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700780 if (!ret.isOk()) {
781 ALOGE("%s: Transaction error reading camera device %s params to check for a flash unit: %s",
782 __FUNCTION__, mId.c_str(), status.description().c_str());
783 return;
784 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800785 const char *flashMode =
786 mDefaultParameters.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES);
787 if (flashMode && strstr(flashMode, CameraParameters::FLASH_MODE_TORCH)) {
788 mHasFlashUnit = true;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800789 }
790
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700791 ret = mInterface->close();
792 if (!ret.isOk()) {
793 ALOGE("%s: Transaction error closing camera device %s after check for a flash unit: %s",
794 __FUNCTION__, mId.c_str(), status.description().c_str());
795 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800796}
797
798CameraProviderManager::ProviderInfo::DeviceInfo1::~DeviceInfo1() {}
799
800status_t CameraProviderManager::ProviderInfo::DeviceInfo1::setTorchMode(bool enabled) {
801 return DeviceInfo::setTorchMode(mInterface, enabled);
802}
803
804status_t CameraProviderManager::ProviderInfo::DeviceInfo1::getCameraInfo(
805 hardware::CameraInfo *info) const {
806 if (info == nullptr) return BAD_VALUE;
807
808 Status status;
809 device::V1_0::CameraInfo cInfo;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700810 hardware::Return<void> ret;
811 ret = mInterface->getCameraInfo([&status, &cInfo](Status s, device::V1_0::CameraInfo camInfo) {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800812 status = s;
813 cInfo = camInfo;
814 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700815 if (!ret.isOk()) {
816 ALOGE("%s: Transaction error reading camera info from device %s: %s",
817 __FUNCTION__, mId.c_str(), ret.description().c_str());
818 return DEAD_OBJECT;
819 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800820 if (status != Status::OK) {
821 return mapToStatusT(status);
822 }
823
824 switch(cInfo.facing) {
825 case device::V1_0::CameraFacing::BACK:
826 info->facing = hardware::CAMERA_FACING_BACK;
827 break;
828 case device::V1_0::CameraFacing::EXTERNAL:
829 // Map external to front for legacy API
830 case device::V1_0::CameraFacing::FRONT:
831 info->facing = hardware::CAMERA_FACING_FRONT;
832 break;
833 default:
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700834 ALOGW("%s: Device %s: Unknown camera facing: %d",
835 __FUNCTION__, mId.c_str(), cInfo.facing);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800836 info->facing = hardware::CAMERA_FACING_BACK;
837 }
838 info->orientation = cInfo.orientation;
839
840 return OK;
841}
842
843CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string& name,
844 const std::string &id,
845 uint16_t minorVersion,
846 const CameraResourceCost& resourceCost,
847 sp<InterfaceT> interface) :
848 DeviceInfo(name, id, hardware::hidl_version{3, minorVersion}, resourceCost),
849 mInterface(interface) {
850 // Get camera characteristics and initialize flash unit availability
851 Status status;
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700852 hardware::Return<void> ret;
853 ret = mInterface->getCameraCharacteristics([&status, this](Status s,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800854 device::V3_2::CameraMetadata metadata) {
855 status = s;
856 if (s == Status::OK) {
857 camera_metadata_t *buffer =
858 reinterpret_cast<camera_metadata_t*>(metadata.data());
859 mCameraCharacteristics = buffer;
860 }
861 });
Eino-Ville Talvala8d942f92017-03-13 10:09:51 -0700862 if (!ret.isOk()) {
863 ALOGE("%s: Transaction error getting camera characteristics for device %s"
864 " to check for a flash unit: %s", __FUNCTION__, mId.c_str(),
865 ret.description().c_str());
866 return;
867 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800868 if (status != Status::OK) {
869 ALOGE("%s: Unable to get camera characteristics for device %s: %s (%d)",
870 __FUNCTION__, mId.c_str(), CameraProviderManager::statusToString(status), status);
871 return;
872 }
873 camera_metadata_entry flashAvailable =
874 mCameraCharacteristics.find(ANDROID_FLASH_INFO_AVAILABLE);
875 if (flashAvailable.count == 1 &&
876 flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE) {
877 mHasFlashUnit = true;
878 } else {
879 mHasFlashUnit = false;
880 }
881}
882
883CameraProviderManager::ProviderInfo::DeviceInfo3::~DeviceInfo3() {}
884
885status_t CameraProviderManager::ProviderInfo::DeviceInfo3::setTorchMode(bool enabled) {
886 return DeviceInfo::setTorchMode(mInterface, enabled);
887}
888
889status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraInfo(
890 hardware::CameraInfo *info) const {
891 if (info == nullptr) return BAD_VALUE;
892
893 camera_metadata_ro_entry facing =
894 mCameraCharacteristics.find(ANDROID_LENS_FACING);
895 if (facing.count == 1) {
896 switch (facing.data.u8[0]) {
897 case ANDROID_LENS_FACING_BACK:
898 info->facing = hardware::CAMERA_FACING_BACK;
899 break;
900 case ANDROID_LENS_FACING_EXTERNAL:
901 // Map external to front for legacy API
902 case ANDROID_LENS_FACING_FRONT:
903 info->facing = hardware::CAMERA_FACING_FRONT;
904 break;
905 }
906 } else {
907 ALOGE("%s: Unable to find android.lens.facing static metadata", __FUNCTION__);
908 return NAME_NOT_FOUND;
909 }
910
911 camera_metadata_ro_entry orientation =
912 mCameraCharacteristics.find(ANDROID_SENSOR_ORIENTATION);
913 if (orientation.count == 1) {
914 info->orientation = orientation.data.i32[0];
915 } else {
916 ALOGE("%s: Unable to find android.sensor.orientation static metadata", __FUNCTION__);
917 return NAME_NOT_FOUND;
918 }
919
920 return OK;
921}
922
923status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraCharacteristics(
924 CameraMetadata *characteristics) const {
925 if (characteristics == nullptr) return BAD_VALUE;
926
927 *characteristics = mCameraCharacteristics;
928 return OK;
929}
930
931status_t CameraProviderManager::ProviderInfo::parseProviderName(const std::string& name,
932 std::string *type, uint32_t *id) {
933 // Format must be "<type>/<id>"
934#define ERROR_MSG_PREFIX "%s: Invalid provider name '%s'. " \
935 "Should match '<type>/<id>' - "
936
937 if (!type || !id) return INVALID_OPERATION;
938
939 std::string::size_type slashIdx = name.find('/');
940 if (slashIdx == std::string::npos || slashIdx == name.size() - 1) {
941 ALOGE(ERROR_MSG_PREFIX
942 "does not have / separator between type and id",
943 __FUNCTION__, name.c_str());
944 return BAD_VALUE;
945 }
946
947 std::string typeVal = name.substr(0, slashIdx);
948
949 char *endPtr;
950 errno = 0;
951 long idVal = strtol(name.c_str() + slashIdx + 1, &endPtr, 10);
952 if (errno != 0) {
953 ALOGE(ERROR_MSG_PREFIX
954 "cannot parse provider id as an integer: %s (%d)",
955 __FUNCTION__, name.c_str(), strerror(errno), errno);
956 return BAD_VALUE;
957 }
958 if (endPtr != name.c_str() + name.size()) {
959 ALOGE(ERROR_MSG_PREFIX
960 "provider id has unexpected length",
961 __FUNCTION__, name.c_str());
962 return BAD_VALUE;
963 }
964 if (idVal < 0) {
965 ALOGE(ERROR_MSG_PREFIX
966 "id is negative: %ld",
967 __FUNCTION__, name.c_str(), idVal);
968 return BAD_VALUE;
969 }
970
971#undef ERROR_MSG_PREFIX
972
973 *type = typeVal;
974 *id = static_cast<uint32_t>(idVal);
975
976 return OK;
977}
978
979status_t CameraProviderManager::ProviderInfo::parseDeviceName(const std::string& name,
980 uint16_t *major, uint16_t *minor, std::string *type, std::string *id) {
981
982 // Format must be "device@<major>.<minor>/<type>/<id>"
983
984#define ERROR_MSG_PREFIX "%s: Invalid device name '%s'. " \
985 "Should match 'device@<major>.<minor>/<type>/<id>' - "
986
987 if (!major || !minor || !type || !id) return INVALID_OPERATION;
988
989 // Verify starting prefix
990 const char expectedPrefix[] = "device@";
991
992 if (name.find(expectedPrefix) != 0) {
993 ALOGE(ERROR_MSG_PREFIX
994 "does not start with '%s'",
995 __FUNCTION__, name.c_str(), expectedPrefix);
996 return BAD_VALUE;
997 }
998
999 // Extract major/minor versions
1000 constexpr std::string::size_type atIdx = sizeof(expectedPrefix) - 2;
1001 std::string::size_type dotIdx = name.find('.', atIdx);
1002 if (dotIdx == std::string::npos) {
1003 ALOGE(ERROR_MSG_PREFIX
1004 "does not have @<major>. version section",
1005 __FUNCTION__, name.c_str());
1006 return BAD_VALUE;
1007 }
1008 std::string::size_type typeSlashIdx = name.find('/', dotIdx);
1009 if (typeSlashIdx == std::string::npos) {
1010 ALOGE(ERROR_MSG_PREFIX
1011 "does not have .<minor>/ version section",
1012 __FUNCTION__, name.c_str());
1013 return BAD_VALUE;
1014 }
1015
1016 char *endPtr;
1017 errno = 0;
1018 long majorVal = strtol(name.c_str() + atIdx + 1, &endPtr, 10);
1019 if (errno != 0) {
1020 ALOGE(ERROR_MSG_PREFIX
1021 "cannot parse major version: %s (%d)",
1022 __FUNCTION__, name.c_str(), strerror(errno), errno);
1023 return BAD_VALUE;
1024 }
1025 if (endPtr != name.c_str() + dotIdx) {
1026 ALOGE(ERROR_MSG_PREFIX
1027 "major version has unexpected length",
1028 __FUNCTION__, name.c_str());
1029 return BAD_VALUE;
1030 }
1031 long minorVal = strtol(name.c_str() + dotIdx + 1, &endPtr, 10);
1032 if (errno != 0) {
1033 ALOGE(ERROR_MSG_PREFIX
1034 "cannot parse minor version: %s (%d)",
1035 __FUNCTION__, name.c_str(), strerror(errno), errno);
1036 return BAD_VALUE;
1037 }
1038 if (endPtr != name.c_str() + typeSlashIdx) {
1039 ALOGE(ERROR_MSG_PREFIX
1040 "minor version has unexpected length",
1041 __FUNCTION__, name.c_str());
1042 return BAD_VALUE;
1043 }
1044 if (majorVal < 0 || majorVal > UINT16_MAX || minorVal < 0 || minorVal > UINT16_MAX) {
1045 ALOGE(ERROR_MSG_PREFIX
1046 "major/minor version is out of range of uint16_t: %ld.%ld",
1047 __FUNCTION__, name.c_str(), majorVal, minorVal);
1048 return BAD_VALUE;
1049 }
1050
1051 // Extract type and id
1052
1053 std::string::size_type instanceSlashIdx = name.find('/', typeSlashIdx + 1);
1054 if (instanceSlashIdx == std::string::npos) {
1055 ALOGE(ERROR_MSG_PREFIX
1056 "does not have /<type>/ component",
1057 __FUNCTION__, name.c_str());
1058 return BAD_VALUE;
1059 }
1060 std::string typeVal = name.substr(typeSlashIdx + 1, instanceSlashIdx - typeSlashIdx - 1);
1061
1062 if (instanceSlashIdx == name.size() - 1) {
1063 ALOGE(ERROR_MSG_PREFIX
1064 "does not have an /<id> component",
1065 __FUNCTION__, name.c_str());
1066 return BAD_VALUE;
1067 }
1068 std::string idVal = name.substr(instanceSlashIdx + 1);
1069
1070#undef ERROR_MSG_PREFIX
1071
1072 *major = static_cast<uint16_t>(majorVal);
1073 *minor = static_cast<uint16_t>(minorVal);
1074 *type = typeVal;
1075 *id = idVal;
1076
1077 return OK;
1078}
1079
1080
1081
1082CameraProviderManager::ProviderInfo::~ProviderInfo() {
1083 // Destruction of ProviderInfo is only supposed to happen when the respective
1084 // CameraProvider interface dies, so do not unregister callbacks.
1085
1086}
1087
1088status_t CameraProviderManager::mapToStatusT(const Status& s) {
1089 switch(s) {
1090 case Status::OK:
1091 return OK;
1092 case Status::ILLEGAL_ARGUMENT:
1093 return BAD_VALUE;
1094 case Status::CAMERA_IN_USE:
1095 return -EBUSY;
1096 case Status::MAX_CAMERAS_IN_USE:
1097 return -EUSERS;
1098 case Status::METHOD_NOT_SUPPORTED:
1099 return UNKNOWN_TRANSACTION;
1100 case Status::OPERATION_NOT_SUPPORTED:
1101 return INVALID_OPERATION;
1102 case Status::CAMERA_DISCONNECTED:
1103 return DEAD_OBJECT;
1104 case Status::INTERNAL_ERROR:
1105 return INVALID_OPERATION;
1106 }
1107 ALOGW("Unexpected HAL status code %d", s);
1108 return INVALID_OPERATION;
1109}
1110
1111const char* CameraProviderManager::statusToString(const Status& s) {
1112 switch(s) {
1113 case Status::OK:
1114 return "OK";
1115 case Status::ILLEGAL_ARGUMENT:
1116 return "ILLEGAL_ARGUMENT";
1117 case Status::CAMERA_IN_USE:
1118 return "CAMERA_IN_USE";
1119 case Status::MAX_CAMERAS_IN_USE:
1120 return "MAX_CAMERAS_IN_USE";
1121 case Status::METHOD_NOT_SUPPORTED:
1122 return "METHOD_NOT_SUPPORTED";
1123 case Status::OPERATION_NOT_SUPPORTED:
1124 return "OPERATION_NOT_SUPPORTED";
1125 case Status::CAMERA_DISCONNECTED:
1126 return "CAMERA_DISCONNECTED";
1127 case Status::INTERNAL_ERROR:
1128 return "INTERNAL_ERROR";
1129 }
1130 ALOGW("Unexpected HAL status code %d", s);
1131 return "UNKNOWN_ERROR";
1132}
1133
1134const char* CameraProviderManager::deviceStatusToString(const CameraDeviceStatus& s) {
1135 switch(s) {
1136 case CameraDeviceStatus::NOT_PRESENT:
1137 return "NOT_PRESENT";
1138 case CameraDeviceStatus::PRESENT:
1139 return "PRESENT";
1140 case CameraDeviceStatus::ENUMERATING:
1141 return "ENUMERATING";
1142 }
1143 ALOGW("Unexpected HAL device status code %d", s);
1144 return "UNKNOWN_STATUS";
1145}
1146
1147const char* CameraProviderManager::torchStatusToString(const TorchModeStatus& s) {
1148 switch(s) {
1149 case TorchModeStatus::NOT_AVAILABLE:
1150 return "NOT_AVAILABLE";
1151 case TorchModeStatus::AVAILABLE_OFF:
1152 return "AVAILABLE_OFF";
1153 case TorchModeStatus::AVAILABLE_ON:
1154 return "AVAILABLE_ON";
1155 }
1156 ALOGW("Unexpected HAL torch mode status code %d", s);
1157 return "UNKNOWN_STATUS";
1158}
1159
Yin-Chia Yeh067428c2017-01-13 15:19:24 -08001160
1161status_t HidlVendorTagDescriptor::createDescriptorFromHidl(
1162 const hardware::hidl_vec<hardware::camera::common::V1_0::VendorTagSection>& vts,
1163 /*out*/
1164 sp<VendorTagDescriptor>& descriptor) {
1165
1166 int tagCount = 0;
1167
1168 for (size_t s = 0; s < vts.size(); s++) {
1169 tagCount += vts[s].tags.size();
1170 }
1171
1172 if (tagCount < 0 || tagCount > INT32_MAX) {
1173 ALOGE("%s: tag count %d from vendor tag sections is invalid.", __FUNCTION__, tagCount);
1174 return BAD_VALUE;
1175 }
1176
1177 Vector<uint32_t> tagArray;
1178 LOG_ALWAYS_FATAL_IF(tagArray.resize(tagCount) != tagCount,
1179 "%s: too many (%u) vendor tags defined.", __FUNCTION__, tagCount);
1180
1181
1182 sp<HidlVendorTagDescriptor> desc = new HidlVendorTagDescriptor();
1183 desc->mTagCount = tagCount;
1184
1185 SortedVector<String8> sections;
1186 KeyedVector<uint32_t, String8> tagToSectionMap;
1187
1188 int idx = 0;
1189 for (size_t s = 0; s < vts.size(); s++) {
1190 const hardware::camera::common::V1_0::VendorTagSection& section = vts[s];
1191 const char *sectionName = section.sectionName.c_str();
1192 if (sectionName == NULL) {
1193 ALOGE("%s: no section name defined for vendor tag section %zu.", __FUNCTION__, s);
1194 return BAD_VALUE;
1195 }
1196 String8 sectionString(sectionName);
1197 sections.add(sectionString);
1198
1199 for (size_t j = 0; j < section.tags.size(); j++) {
1200 uint32_t tag = section.tags[j].tagId;
1201 if (tag < CAMERA_METADATA_VENDOR_TAG_BOUNDARY) {
1202 ALOGE("%s: vendor tag %d not in vendor tag section.", __FUNCTION__, tag);
1203 return BAD_VALUE;
1204 }
1205
1206 tagArray.editItemAt(idx++) = section.tags[j].tagId;
1207
1208 const char *tagName = section.tags[j].tagName.c_str();
1209 if (tagName == NULL) {
1210 ALOGE("%s: no tag name defined for vendor tag %d.", __FUNCTION__, tag);
1211 return BAD_VALUE;
1212 }
1213 desc->mTagToNameMap.add(tag, String8(tagName));
1214 tagToSectionMap.add(tag, sectionString);
1215
1216 int tagType = (int) section.tags[j].tagType;
1217 if (tagType < 0 || tagType >= NUM_TYPES) {
1218 ALOGE("%s: tag type %d from vendor ops does not exist.", __FUNCTION__, tagType);
1219 return BAD_VALUE;
1220 }
1221 desc->mTagToTypeMap.add(tag, tagType);
1222 }
1223 }
1224
1225 desc->mSections = sections;
1226
1227 for (size_t i = 0; i < tagArray.size(); ++i) {
1228 uint32_t tag = tagArray[i];
1229 String8 sectionString = tagToSectionMap.valueFor(tag);
1230
1231 // Set up tag to section index map
1232 ssize_t index = sections.indexOf(sectionString);
1233 LOG_ALWAYS_FATAL_IF(index < 0, "index %zd must be non-negative", index);
1234 desc->mTagToSectionMap.add(tag, static_cast<uint32_t>(index));
1235
1236 // Set up reverse mapping
1237 ssize_t reverseIndex = -1;
1238 if ((reverseIndex = desc->mReverseMapping.indexOfKey(sectionString)) < 0) {
1239 KeyedVector<String8, uint32_t>* nameMapper = new KeyedVector<String8, uint32_t>();
1240 reverseIndex = desc->mReverseMapping.add(sectionString, nameMapper);
1241 }
1242 desc->mReverseMapping[reverseIndex]->add(desc->mTagToNameMap.valueFor(tag), tag);
1243 }
1244
1245 descriptor = desc;
1246 return OK;
1247}
1248
1249
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001250} // namespace android