blob: 7d6ecacbb42ca52b0e8f13ac90162eef4bcfd86b [file] [log] [blame]
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001/*
2 * Copyright (C) 2015 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_NDEBUG 0
18#define LOG_TAG "ACameraManager"
19
20#include <memory>
21#include "ACameraManager.h"
22#include "ACameraMetadata.h"
23#include "ACameraDevice.h"
24#include <utils/Vector.h>
Ivan Podogovee844a82016-09-15 11:32:41 +010025#include <cutils/properties.h>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080026#include <stdlib.h>
27#include <camera/VendorTagDescriptor.h>
28
Jayant Chowdhary6df26072018-11-06 23:55:12 -080029using namespace android::acam;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080030
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080031namespace android {
Jayant Chowdhary6df26072018-11-06 23:55:12 -080032namespace acam {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080033// Static member definitions
34const char* CameraManagerGlobal::kCameraIdKey = "CameraId";
35const char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp";
36const char* CameraManagerGlobal::kContextKey = "CallbackContext";
37Mutex CameraManagerGlobal::sLock;
38CameraManagerGlobal* CameraManagerGlobal::sInstance = nullptr;
39
40CameraManagerGlobal&
41CameraManagerGlobal::getInstance() {
42 Mutex::Autolock _l(sLock);
43 CameraManagerGlobal* instance = sInstance;
44 if (instance == nullptr) {
45 instance = new CameraManagerGlobal();
46 sInstance = instance;
47 }
48 return *instance;
49}
50
51CameraManagerGlobal::~CameraManagerGlobal() {
52 // clear sInstance so next getInstance call knows to create a new one
53 Mutex::Autolock _sl(sLock);
54 sInstance = nullptr;
55 Mutex::Autolock _l(mLock);
56 if (mCameraService != nullptr) {
57 IInterface::asBinder(mCameraService)->unlinkToDeath(mDeathNotifier);
Yin-Chia Yehead91462016-01-06 16:45:08 -080058 mCameraService->removeListener(mCameraServiceListener);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080059 }
60 mDeathNotifier.clear();
61 if (mCbLooper != nullptr) {
62 mCbLooper->unregisterHandler(mHandler->id());
63 mCbLooper->stop();
64 }
65 mCbLooper.clear();
66 mHandler.clear();
67 mCameraServiceListener.clear();
68 mCameraService.clear();
69}
70
Ivan Podogovee844a82016-09-15 11:32:41 +010071static bool isCameraServiceDisabled() {
72 char value[PROPERTY_VALUE_MAX];
73 property_get("config.disable_cameraservice", value, "0");
74 return (strncmp(value, "0", 2) != 0 && strncasecmp(value, "false", 6) != 0);
75}
76
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080077sp<hardware::ICameraService> CameraManagerGlobal::getCameraService() {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080078 Mutex::Autolock _l(mLock);
79 if (mCameraService.get() == nullptr) {
Ivan Podogovee844a82016-09-15 11:32:41 +010080 if (isCameraServiceDisabled()) {
81 return mCameraService;
82 }
83
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080084 sp<IServiceManager> sm = defaultServiceManager();
85 sp<IBinder> binder;
86 do {
87 binder = sm->getService(String16(kCameraServiceName));
88 if (binder != nullptr) {
89 break;
90 }
91 ALOGW("CameraService not published, waiting...");
92 usleep(kCameraServicePollDelay);
93 } while(true);
94 if (mDeathNotifier == nullptr) {
95 mDeathNotifier = new DeathNotifier(this);
96 }
97 binder->linkToDeath(mDeathNotifier);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080098 mCameraService = interface_cast<hardware::ICameraService>(binder);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080099
100 // Setup looper thread to perfrom availiability callbacks
101 if (mCbLooper == nullptr) {
102 mCbLooper = new ALooper;
103 mCbLooper->setName("C2N-mgr-looper");
Eino-Ville Talvala02bf0322016-02-18 12:41:10 -0800104 status_t err = mCbLooper->start(
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800105 /*runOnCallingThread*/false,
106 /*canCallJava*/ true,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800107 PRIORITY_DEFAULT);
Eino-Ville Talvala02bf0322016-02-18 12:41:10 -0800108 if (err != OK) {
109 ALOGE("%s: Unable to start camera service listener looper: %s (%d)",
110 __FUNCTION__, strerror(-err), err);
111 mCbLooper.clear();
112 return nullptr;
113 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800114 if (mHandler == nullptr) {
115 mHandler = new CallbackHandler();
116 }
117 mCbLooper->registerHandler(mHandler);
118 }
119
120 // register ICameraServiceListener
121 if (mCameraServiceListener == nullptr) {
122 mCameraServiceListener = new CameraServiceListener(this);
123 }
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800124 std::vector<hardware::CameraStatus> cameraStatuses{};
125 mCameraService->addListener(mCameraServiceListener, &cameraStatuses);
126 for (auto& c : cameraStatuses) {
127 onStatusChangedLocked(c.status, c.cameraId);
128 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800129
130 // setup vendor tags
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800131 sp<VendorTagDescriptor> desc = new VendorTagDescriptor();
132 binder::Status ret = mCameraService->getCameraVendorTagDescriptor(/*out*/desc.get());
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800133
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800134 if (ret.isOk()) {
Emilian Peev71c73a22017-03-21 16:35:51 +0000135 if (0 < desc->getTagCount()) {
136 status_t err = VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc);
137 if (err != OK) {
138 ALOGE("%s: Failed to set vendor tag descriptors, received error %s (%d)",
139 __FUNCTION__, strerror(-err), err);
140 }
141 } else {
142 sp<VendorTagDescriptorCache> cache =
143 new VendorTagDescriptorCache();
144 binder::Status res =
145 mCameraService->getCameraVendorTagCache(
146 /*out*/cache.get());
147 if (res.serviceSpecificErrorCode() ==
148 hardware::ICameraService::ERROR_DISCONNECTED) {
149 // No camera module available, not an error on devices with no cameras
150 VendorTagDescriptorCache::clearGlobalVendorTagCache();
151 } else if (res.isOk()) {
152 status_t err =
153 VendorTagDescriptorCache::setAsGlobalVendorTagCache(
154 cache);
155 if (err != OK) {
156 ALOGE("%s: Failed to set vendor tag cache,"
157 "received error %s (%d)", __FUNCTION__,
158 strerror(-err), err);
159 }
160 } else {
161 VendorTagDescriptorCache::clearGlobalVendorTagCache();
162 ALOGE("%s: Failed to setup vendor tag cache: %s",
163 __FUNCTION__, res.toString8().string());
164 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800165 }
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800166 } else if (ret.serviceSpecificErrorCode() ==
167 hardware::ICameraService::ERROR_DEPRECATED_HAL) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800168 ALOGW("%s: Camera HAL too old; does not support vendor tags",
169 __FUNCTION__);
170 VendorTagDescriptor::clearGlobalVendorTagDescriptor();
171 } else {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800172 ALOGE("%s: Failed to get vendor tag descriptors: %s",
173 __FUNCTION__, ret.toString8().string());
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800174 }
175 }
176 ALOGE_IF(mCameraService == nullptr, "no CameraService!?");
177 return mCameraService;
178}
179
180void CameraManagerGlobal::DeathNotifier::binderDied(const wp<IBinder>&)
181{
182 ALOGE("Camera service binderDied!");
183 sp<CameraManagerGlobal> cm = mCameraManager.promote();
184 if (cm != nullptr) {
185 AutoMutex lock(cm->mLock);
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800186 for (auto& pair : cm->mDeviceStatusMap) {
187 const String8 &cameraId = pair.first;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800188 cm->onStatusChangedLocked(
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800189 CameraServiceListener::STATUS_NOT_PRESENT, cameraId);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800190 }
191 cm->mCameraService.clear();
192 // TODO: consider adding re-connect call here?
193 }
194}
195
196void CameraManagerGlobal::registerAvailabilityCallback(
197 const ACameraManager_AvailabilityCallbacks *callback) {
198 Mutex::Autolock _l(mLock);
199 Callback cb(callback);
200 auto pair = mCallbacks.insert(cb);
201 // Send initial callbacks if callback is newly registered
202 if (pair.second) {
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800203 for (auto& pair : mDeviceStatusMap) {
204 const String8& cameraId = pair.first;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800205 int32_t status = pair.second;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800206
207 sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
208 ACameraManager_AvailabilityCallback cb = isStatusAvailable(status) ?
209 callback->onCameraAvailable : callback->onCameraUnavailable;
210 msg->setPointer(kCallbackFpKey, (void *) cb);
211 msg->setPointer(kContextKey, callback->context);
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800212 msg->setString(kCameraIdKey, AString(cameraId));
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800213 msg->post();
214 }
215 }
216}
217
218void CameraManagerGlobal::unregisterAvailabilityCallback(
219 const ACameraManager_AvailabilityCallbacks *callback) {
220 Mutex::Autolock _l(mLock);
221 Callback cb(callback);
222 mCallbacks.erase(cb);
223}
224
Yin-Chia Yeh03f55752018-03-14 15:28:02 -0700225void CameraManagerGlobal::getCameraIdList(std::vector<String8>* cameraIds) {
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800226 // Ensure that we have initialized/refreshed the list of available devices
227 auto cs = getCameraService();
228 Mutex::Autolock _l(mLock);
229
230 for(auto& deviceStatus : mDeviceStatusMap) {
231 if (deviceStatus.second == hardware::ICameraServiceListener::STATUS_NOT_PRESENT ||
232 deviceStatus.second == hardware::ICameraServiceListener::STATUS_ENUMERATING) {
233 continue;
234 }
235 bool camera2Support = false;
236 binder::Status serviceRet = cs->supportsCameraApi(String16(deviceStatus.first),
237 hardware::ICameraService::API_VERSION_2, &camera2Support);
238 if (!serviceRet.isOk() || !camera2Support) {
239 continue;
240 }
241 cameraIds->push_back(deviceStatus.first);
242 }
243}
244
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800245bool CameraManagerGlobal::validStatus(int32_t status) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800246 switch (status) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800247 case hardware::ICameraServiceListener::STATUS_NOT_PRESENT:
248 case hardware::ICameraServiceListener::STATUS_PRESENT:
249 case hardware::ICameraServiceListener::STATUS_ENUMERATING:
250 case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800251 return true;
252 default:
253 return false;
254 }
255}
256
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800257bool CameraManagerGlobal::isStatusAvailable(int32_t status) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800258 switch (status) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800259 case hardware::ICameraServiceListener::STATUS_PRESENT:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800260 return true;
261 default:
262 return false;
263 }
264}
265
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800266void CameraManagerGlobal::CallbackHandler::onMessageReceived(
267 const sp<AMessage> &msg) {
268 switch (msg->what()) {
269 case kWhatSendSingleCallback:
270 {
271 ACameraManager_AvailabilityCallback cb;
272 void* context;
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800273 AString cameraId;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800274 bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
275 if (!found) {
276 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
277 return;
278 }
279 found = msg->findPointer(kContextKey, &context);
280 if (!found) {
281 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
282 return;
283 }
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800284 found = msg->findString(kCameraIdKey, &cameraId);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800285 if (!found) {
286 ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
287 return;
288 }
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800289 (*cb)(context, cameraId.c_str());
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800290 break;
291 }
292 default:
293 ALOGE("%s: unknown message type %d", __FUNCTION__, msg->what());
294 break;
295 }
296}
297
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800298binder::Status CameraManagerGlobal::CameraServiceListener::onStatusChanged(
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800299 int32_t status, const String16& cameraId) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800300 sp<CameraManagerGlobal> cm = mCameraManager.promote();
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800301 if (cm != nullptr) {
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800302 cm->onStatusChanged(status, String8(cameraId));
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800303 } else {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800304 ALOGE("Cannot deliver status change. Global camera manager died");
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800305 }
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800306 return binder::Status::ok();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800307}
308
309void CameraManagerGlobal::onStatusChanged(
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800310 int32_t status, const String8& cameraId) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800311 Mutex::Autolock _l(mLock);
312 onStatusChangedLocked(status, cameraId);
313}
314
315void CameraManagerGlobal::onStatusChangedLocked(
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800316 int32_t status, const String8& cameraId) {
317 if (!validStatus(status)) {
318 ALOGE("%s: Invalid status %d", __FUNCTION__, status);
319 return;
320 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800321
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800322 bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0);
323 int32_t oldStatus = firstStatus ?
324 status : // first status
325 mDeviceStatusMap[cameraId];
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800326
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800327 if (!firstStatus &&
328 isStatusAvailable(status) == isStatusAvailable(oldStatus)) {
329 // No status update. No need to send callback
330 return;
331 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800332
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800333 // Iterate through all registered callbacks
334 mDeviceStatusMap[cameraId] = status;
335 for (auto cb : mCallbacks) {
336 sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
337 ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ?
338 cb.mAvailable : cb.mUnavailable;
339 msg->setPointer(kCallbackFpKey, (void *) cbFp);
340 msg->setPointer(kContextKey, cb.mContext);
341 msg->setString(kCameraIdKey, AString(cameraId));
342 msg->post();
343 }
Guennadi Liakhovetski6034bf52017-12-07 10:28:29 +0100344 if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT) {
345 mDeviceStatusMap.erase(cameraId);
346 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800347}
348
Jayant Chowdhary6df26072018-11-06 23:55:12 -0800349} // namespace acam
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800350} // namespace android
351
352/**
353 * ACameraManger Implementation
354 */
355camera_status_t
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800356ACameraManager::getCameraIdList(ACameraIdList** cameraIdList) {
357 Mutex::Autolock _l(mLock);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800358
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800359 std::vector<String8> idList;
360 CameraManagerGlobal::getInstance().getCameraIdList(&idList);
361
362 int numCameras = idList.size();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800363 ACameraIdList *out = new ACameraIdList;
364 if (!out) {
365 ALOGE("Allocate memory for ACameraIdList failed!");
366 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
367 }
368 out->numCameras = numCameras;
Bjoern Johansson1a5954c2017-01-10 10:30:18 -0800369 out->cameraIds = new const char*[numCameras];
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800370 if (!out->cameraIds) {
371 ALOGE("Allocate memory for ACameraIdList failed!");
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800372 deleteCameraIdList(out);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800373 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
374 }
375 for (int i = 0; i < numCameras; i++) {
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800376 const char* src = idList[i].string();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800377 size_t dstSize = strlen(src) + 1;
378 char* dst = new char[dstSize];
379 if (!dst) {
380 ALOGE("Allocate memory for ACameraIdList failed!");
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800381 deleteCameraIdList(out);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800382 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
383 }
384 strlcpy(dst, src, dstSize);
385 out->cameraIds[i] = dst;
386 }
387 *cameraIdList = out;
388 return ACAMERA_OK;
389}
390
391void
392ACameraManager::deleteCameraIdList(ACameraIdList* cameraIdList) {
393 if (cameraIdList != nullptr) {
394 if (cameraIdList->cameraIds != nullptr) {
395 for (int i = 0; i < cameraIdList->numCameras; i ++) {
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800396 if (cameraIdList->cameraIds[i] != nullptr) {
397 delete[] cameraIdList->cameraIds[i];
398 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800399 }
400 delete[] cameraIdList->cameraIds;
401 }
402 delete cameraIdList;
403 }
404}
405
406camera_status_t ACameraManager::getCameraCharacteristics(
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -0700407 const char* cameraIdStr, sp<ACameraMetadata>* characteristics) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800408 Mutex::Autolock _l(mLock);
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800409
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800410 sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800411 if (cs == nullptr) {
412 ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
413 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
414 }
415 CameraMetadata rawMetadata;
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800416 binder::Status serviceRet = cs->getCameraCharacteristics(String16(cameraIdStr), &rawMetadata);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800417 if (!serviceRet.isOk()) {
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800418 switch(serviceRet.serviceSpecificErrorCode()) {
419 case hardware::ICameraService::ERROR_DISCONNECTED:
420 ALOGE("%s: Camera %s has been disconnected", __FUNCTION__, cameraIdStr);
421 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
422 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
423 ALOGE("%s: Camera ID %s does not exist!", __FUNCTION__, cameraIdStr);
424 return ACAMERA_ERROR_INVALID_PARAMETER;
425 default:
426 ALOGE("Get camera characteristics from camera service failed: %s",
427 serviceRet.toString8().string());
428 return ACAMERA_ERROR_UNKNOWN; // should not reach here
429 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800430 }
431
432 *characteristics = new ACameraMetadata(
433 rawMetadata.release(), ACameraMetadata::ACM_CHARACTERISTICS);
434 return ACAMERA_OK;
435}
436
437camera_status_t
438ACameraManager::openCamera(
439 const char* cameraId,
440 ACameraDevice_StateCallbacks* callback,
441 /*out*/ACameraDevice** outDevice) {
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -0700442 sp<ACameraMetadata> chars;
443 camera_status_t ret = getCameraCharacteristics(cameraId, &chars);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800444 Mutex::Autolock _l(mLock);
445 if (ret != ACAMERA_OK) {
446 ALOGE("%s: cannot get camera characteristics for camera %s. err %d",
447 __FUNCTION__, cameraId, ret);
448 return ACAMERA_ERROR_INVALID_PARAMETER;
449 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800450
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -0700451 ACameraDevice* device = new ACameraDevice(cameraId, callback, chars);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800452
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800453 sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800454 if (cs == nullptr) {
455 ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
Yunlian Jiangb01d8f72016-10-04 16:34:18 -0700456 delete device;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800457 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
458 }
459
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800460 sp<hardware::camera2::ICameraDeviceCallbacks> callbacks = device->getServiceCallback();
461 sp<hardware::camera2::ICameraDeviceUser> deviceRemote;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800462 // No way to get package name from native.
463 // Send a zero length package name and let camera service figure it out from UID
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800464 binder::Status serviceRet = cs->connectDevice(
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800465 callbacks, String16(cameraId), String16(""),
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800466 hardware::ICameraService::USE_CALLING_UID, /*out*/&deviceRemote);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800467
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800468 if (!serviceRet.isOk()) {
469 ALOGE("%s: connect camera device failed: %s", __FUNCTION__, serviceRet.toString8().string());
Yin-Chia Yeh3e49be12016-04-12 16:00:33 -0700470 // Convert serviceRet to camera_status_t
471 switch(serviceRet.serviceSpecificErrorCode()) {
472 case hardware::ICameraService::ERROR_DISCONNECTED:
473 ret = ACAMERA_ERROR_CAMERA_DISCONNECTED;
474 break;
475 case hardware::ICameraService::ERROR_CAMERA_IN_USE:
476 ret = ACAMERA_ERROR_CAMERA_IN_USE;
477 break;
478 case hardware::ICameraService::ERROR_MAX_CAMERAS_IN_USE:
479 ret = ACAMERA_ERROR_MAX_CAMERA_IN_USE;
480 break;
481 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
482 ret = ACAMERA_ERROR_INVALID_PARAMETER;
483 break;
484 case hardware::ICameraService::ERROR_DEPRECATED_HAL:
485 // Should not reach here since we filtered legacy HALs earlier
486 ret = ACAMERA_ERROR_INVALID_PARAMETER;
487 break;
488 case hardware::ICameraService::ERROR_DISABLED:
489 ret = ACAMERA_ERROR_CAMERA_DISABLED;
490 break;
491 case hardware::ICameraService::ERROR_PERMISSION_DENIED:
492 ret = ACAMERA_ERROR_PERMISSION_DENIED;
493 break;
494 case hardware::ICameraService::ERROR_INVALID_OPERATION:
495 default:
496 ret = ACAMERA_ERROR_UNKNOWN;
497 break;
498 }
499
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800500 delete device;
Yin-Chia Yeh3e49be12016-04-12 16:00:33 -0700501 return ret;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800502 }
503 if (deviceRemote == nullptr) {
504 ALOGE("%s: connect camera device failed! remote device is null", __FUNCTION__);
505 delete device;
506 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
507 }
508 device->setRemoteDevice(deviceRemote);
509 *outDevice = device;
510 return ACAMERA_OK;
511}
512
513ACameraManager::~ACameraManager() {
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800514
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800515}