blob: 1609da1a490be2e6310a69a46d7ad9a8eb42f6d1 [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
29using namespace android;
30
31//constants shared between ACameraManager and CameraManagerGlobal
32namespace {
33 const int kMaxCameraIdLen = 32;
34}
35
36namespace android {
37// Static member definitions
38const char* CameraManagerGlobal::kCameraIdKey = "CameraId";
39const char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp";
40const char* CameraManagerGlobal::kContextKey = "CallbackContext";
41Mutex CameraManagerGlobal::sLock;
42CameraManagerGlobal* CameraManagerGlobal::sInstance = nullptr;
43
44CameraManagerGlobal&
45CameraManagerGlobal::getInstance() {
46 Mutex::Autolock _l(sLock);
47 CameraManagerGlobal* instance = sInstance;
48 if (instance == nullptr) {
49 instance = new CameraManagerGlobal();
50 sInstance = instance;
51 }
52 return *instance;
53}
54
55CameraManagerGlobal::~CameraManagerGlobal() {
56 // clear sInstance so next getInstance call knows to create a new one
57 Mutex::Autolock _sl(sLock);
58 sInstance = nullptr;
59 Mutex::Autolock _l(mLock);
60 if (mCameraService != nullptr) {
61 IInterface::asBinder(mCameraService)->unlinkToDeath(mDeathNotifier);
Yin-Chia Yehead91462016-01-06 16:45:08 -080062 mCameraService->removeListener(mCameraServiceListener);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080063 }
64 mDeathNotifier.clear();
65 if (mCbLooper != nullptr) {
66 mCbLooper->unregisterHandler(mHandler->id());
67 mCbLooper->stop();
68 }
69 mCbLooper.clear();
70 mHandler.clear();
71 mCameraServiceListener.clear();
72 mCameraService.clear();
73}
74
Ivan Podogovee844a82016-09-15 11:32:41 +010075static bool isCameraServiceDisabled() {
76 char value[PROPERTY_VALUE_MAX];
77 property_get("config.disable_cameraservice", value, "0");
78 return (strncmp(value, "0", 2) != 0 && strncasecmp(value, "false", 6) != 0);
79}
80
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080081sp<hardware::ICameraService> CameraManagerGlobal::getCameraService() {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080082 Mutex::Autolock _l(mLock);
83 if (mCameraService.get() == nullptr) {
Ivan Podogovee844a82016-09-15 11:32:41 +010084 if (isCameraServiceDisabled()) {
85 return mCameraService;
86 }
87
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080088 sp<IServiceManager> sm = defaultServiceManager();
89 sp<IBinder> binder;
90 do {
91 binder = sm->getService(String16(kCameraServiceName));
92 if (binder != nullptr) {
93 break;
94 }
95 ALOGW("CameraService not published, waiting...");
96 usleep(kCameraServicePollDelay);
97 } while(true);
98 if (mDeathNotifier == nullptr) {
99 mDeathNotifier = new DeathNotifier(this);
100 }
101 binder->linkToDeath(mDeathNotifier);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800102 mCameraService = interface_cast<hardware::ICameraService>(binder);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800103
104 // Setup looper thread to perfrom availiability callbacks
105 if (mCbLooper == nullptr) {
106 mCbLooper = new ALooper;
107 mCbLooper->setName("C2N-mgr-looper");
Eino-Ville Talvala02bf0322016-02-18 12:41:10 -0800108 status_t err = mCbLooper->start(
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800109 /*runOnCallingThread*/false,
110 /*canCallJava*/ true,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800111 PRIORITY_DEFAULT);
Eino-Ville Talvala02bf0322016-02-18 12:41:10 -0800112 if (err != OK) {
113 ALOGE("%s: Unable to start camera service listener looper: %s (%d)",
114 __FUNCTION__, strerror(-err), err);
115 mCbLooper.clear();
116 return nullptr;
117 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800118 if (mHandler == nullptr) {
119 mHandler = new CallbackHandler();
120 }
121 mCbLooper->registerHandler(mHandler);
122 }
123
124 // register ICameraServiceListener
125 if (mCameraServiceListener == nullptr) {
126 mCameraServiceListener = new CameraServiceListener(this);
127 }
128 mCameraService->addListener(mCameraServiceListener);
129
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()) {
135 status_t err = VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc);
136 if (err != OK) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800137 ALOGE("%s: Failed to set vendor tag descriptors, received error %s (%d)",
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800138 __FUNCTION__, strerror(-err), err);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800139 }
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800140 } else if (ret.serviceSpecificErrorCode() ==
141 hardware::ICameraService::ERROR_DEPRECATED_HAL) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800142 ALOGW("%s: Camera HAL too old; does not support vendor tags",
143 __FUNCTION__);
144 VendorTagDescriptor::clearGlobalVendorTagDescriptor();
145 } else {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800146 ALOGE("%s: Failed to get vendor tag descriptors: %s",
147 __FUNCTION__, ret.toString8().string());
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800148 }
149 }
150 ALOGE_IF(mCameraService == nullptr, "no CameraService!?");
151 return mCameraService;
152}
153
154void CameraManagerGlobal::DeathNotifier::binderDied(const wp<IBinder>&)
155{
156 ALOGE("Camera service binderDied!");
157 sp<CameraManagerGlobal> cm = mCameraManager.promote();
158 if (cm != nullptr) {
159 AutoMutex lock(cm->mLock);
160 for (auto pair : cm->mDeviceStatusMap) {
161 int32_t cameraId = pair.first;
162 cm->onStatusChangedLocked(
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800163 CameraServiceListener::STATUS_NOT_PRESENT, cameraId);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800164 }
165 cm->mCameraService.clear();
166 // TODO: consider adding re-connect call here?
167 }
168}
169
170void CameraManagerGlobal::registerAvailabilityCallback(
171 const ACameraManager_AvailabilityCallbacks *callback) {
172 Mutex::Autolock _l(mLock);
173 Callback cb(callback);
174 auto pair = mCallbacks.insert(cb);
175 // Send initial callbacks if callback is newly registered
176 if (pair.second) {
177 for (auto pair : mDeviceStatusMap) {
178 int32_t cameraId = pair.first;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800179 int32_t status = pair.second;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800180
181 sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
182 ACameraManager_AvailabilityCallback cb = isStatusAvailable(status) ?
183 callback->onCameraAvailable : callback->onCameraUnavailable;
184 msg->setPointer(kCallbackFpKey, (void *) cb);
185 msg->setPointer(kContextKey, callback->context);
186 msg->setInt32(kCameraIdKey, cameraId);
187 msg->post();
188 }
189 }
190}
191
192void CameraManagerGlobal::unregisterAvailabilityCallback(
193 const ACameraManager_AvailabilityCallbacks *callback) {
194 Mutex::Autolock _l(mLock);
195 Callback cb(callback);
196 mCallbacks.erase(cb);
197}
198
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800199bool CameraManagerGlobal::validStatus(int32_t status) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800200 switch (status) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800201 case hardware::ICameraServiceListener::STATUS_NOT_PRESENT:
202 case hardware::ICameraServiceListener::STATUS_PRESENT:
203 case hardware::ICameraServiceListener::STATUS_ENUMERATING:
204 case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800205 return true;
206 default:
207 return false;
208 }
209}
210
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800211bool CameraManagerGlobal::isStatusAvailable(int32_t status) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800212 switch (status) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800213 case hardware::ICameraServiceListener::STATUS_PRESENT:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800214 return true;
215 default:
216 return false;
217 }
218}
219
220void CameraManagerGlobal::CallbackHandler::sendSingleCallback(
221 int32_t cameraId, void* context,
222 ACameraManager_AvailabilityCallback cb) const {
223 char cameraIdStr[kMaxCameraIdLen];
224 snprintf(cameraIdStr, sizeof(cameraIdStr), "%d", cameraId);
225 (*cb)(context, cameraIdStr);
226}
227
228void CameraManagerGlobal::CallbackHandler::onMessageReceived(
229 const sp<AMessage> &msg) {
230 switch (msg->what()) {
231 case kWhatSendSingleCallback:
232 {
233 ACameraManager_AvailabilityCallback cb;
234 void* context;
235 int32_t cameraId;
236 bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
237 if (!found) {
238 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
239 return;
240 }
241 found = msg->findPointer(kContextKey, &context);
242 if (!found) {
243 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
244 return;
245 }
246 found = msg->findInt32(kCameraIdKey, &cameraId);
247 if (!found) {
248 ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
249 return;
250 }
251 sendSingleCallback(cameraId, context, cb);
252 break;
253 }
254 default:
255 ALOGE("%s: unknown message type %d", __FUNCTION__, msg->what());
256 break;
257 }
258}
259
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800260binder::Status CameraManagerGlobal::CameraServiceListener::onStatusChanged(
261 int32_t status, int32_t cameraId) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800262 sp<CameraManagerGlobal> cm = mCameraManager.promote();
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800263 if (cm != nullptr) {
264 cm->onStatusChanged(status, cameraId);
265 } else {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800266 ALOGE("Cannot deliver status change. Global camera manager died");
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800267 }
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800268 return binder::Status::ok();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800269}
270
271void CameraManagerGlobal::onStatusChanged(
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800272 int32_t status, int32_t cameraId) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800273 Mutex::Autolock _l(mLock);
274 onStatusChangedLocked(status, cameraId);
275}
276
277void CameraManagerGlobal::onStatusChangedLocked(
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800278 int32_t status, int32_t cameraId) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800279 if (!validStatus(status)) {
280 ALOGE("%s: Invalid status %d", __FUNCTION__, status);
281 return;
282 }
283
284 bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800285 int32_t oldStatus = firstStatus ?
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800286 status : // first status
287 mDeviceStatusMap[cameraId];
288
289 if (!firstStatus &&
290 isStatusAvailable(status) == isStatusAvailable(oldStatus)) {
291 // No status update. No need to send callback
292 return;
293 }
294
295 // Iterate through all registered callbacks
296 mDeviceStatusMap[cameraId] = status;
297 for (auto cb : mCallbacks) {
298 sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
299 ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ?
300 cb.mAvailable : cb.mUnavailable;
301 msg->setPointer(kCallbackFpKey, (void *) cbFp);
302 msg->setPointer(kContextKey, cb.mContext);
303 msg->setInt32(kCameraIdKey, cameraId);
304 msg->post();
305 }
306}
307
308} // namespace android
309
310/**
311 * ACameraManger Implementation
312 */
313camera_status_t
314ACameraManager::getOrCreateCameraIdListLocked(ACameraIdList** cameraIdList) {
315 if (mCachedCameraIdList.numCameras == kCameraIdListNotInit) {
Ivan Podogovee844a82016-09-15 11:32:41 +0100316 if (isCameraServiceDisabled()) {
317 mCachedCameraIdList.numCameras = 0;
318 mCachedCameraIdList.cameraIds = new const char*[0];
319 *cameraIdList = &mCachedCameraIdList;
320 return ACAMERA_OK;
321 }
322
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800323 int numCameras = 0;
324 Vector<char *> cameraIds;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800325 sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800326 if (cs == nullptr) {
327 ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
328 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
329 }
330 // Get number of cameras
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800331 int numAllCameras = 0;
332 binder::Status serviceRet = cs->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_ALL,
333 &numAllCameras);
334 if (!serviceRet.isOk()) {
335 ALOGE("%s: Error getting camera count: %s", __FUNCTION__,
336 serviceRet.toString8().string());
337 numAllCameras = 0;
338 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800339 // Filter API2 compatible cameras and push to cameraIds
340 for (int i = 0; i < numAllCameras; i++) {
341 // TODO: Only suppot HALs that supports API2 directly now
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800342 bool camera2Support = false;
343 serviceRet = cs->supportsCameraApi(i, hardware::ICameraService::API_VERSION_2,
344 &camera2Support);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800345 char buf[kMaxCameraIdLen];
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800346 if (camera2Support) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800347 numCameras++;
348 mCameraIds.insert(i);
349 snprintf(buf, sizeof(buf), "%d", i);
350 size_t cameraIdSize = strlen(buf) + 1;
351 char *cameraId = new char[cameraIdSize];
352 if (!cameraId) {
353 ALOGE("Allocate memory for ACameraIdList failed!");
354 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
355 }
356 strlcpy(cameraId, buf, cameraIdSize);
357 cameraIds.push(cameraId);
358 }
359 }
360 mCachedCameraIdList.numCameras = numCameras;
361 mCachedCameraIdList.cameraIds = new const char*[numCameras];
362 if (!mCachedCameraIdList.cameraIds) {
363 ALOGE("Allocate memory for ACameraIdList failed!");
364 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
365 }
366 for (int i = 0; i < numCameras; i++) {
367 mCachedCameraIdList.cameraIds[i] = cameraIds[i];
368 }
369 }
370 *cameraIdList = &mCachedCameraIdList;
371 return ACAMERA_OK;
372}
373
374camera_status_t
375ACameraManager::getCameraIdList(ACameraIdList** cameraIdList) {
376 Mutex::Autolock _l(mLock);
377 ACameraIdList* cachedList;
378 camera_status_t ret = getOrCreateCameraIdListLocked(&cachedList);
379 if (ret != ACAMERA_OK) {
380 ALOGE("Get camera ID list failed! err: %d", ret);
381 return ret;
382 }
383
384 int numCameras = cachedList->numCameras;
385 ACameraIdList *out = new ACameraIdList;
386 if (!out) {
387 ALOGE("Allocate memory for ACameraIdList failed!");
388 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
389 }
390 out->numCameras = numCameras;
391 out->cameraIds = new const char*[numCameras];
392 if (!out->cameraIds) {
393 ALOGE("Allocate memory for ACameraIdList failed!");
394 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
395 }
396 for (int i = 0; i < numCameras; i++) {
397 const char* src = cachedList->cameraIds[i];
398 size_t dstSize = strlen(src) + 1;
399 char* dst = new char[dstSize];
400 if (!dst) {
401 ALOGE("Allocate memory for ACameraIdList failed!");
402 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
403 }
404 strlcpy(dst, src, dstSize);
405 out->cameraIds[i] = dst;
406 }
407 *cameraIdList = out;
408 return ACAMERA_OK;
409}
410
411void
412ACameraManager::deleteCameraIdList(ACameraIdList* cameraIdList) {
413 if (cameraIdList != nullptr) {
414 if (cameraIdList->cameraIds != nullptr) {
415 for (int i = 0; i < cameraIdList->numCameras; i ++) {
416 delete[] cameraIdList->cameraIds[i];
417 }
418 delete[] cameraIdList->cameraIds;
419 }
420 delete cameraIdList;
421 }
422}
423
424camera_status_t ACameraManager::getCameraCharacteristics(
425 const char *cameraIdStr, ACameraMetadata **characteristics) {
426 Mutex::Autolock _l(mLock);
427 ACameraIdList* cachedList;
428 // Make sure mCameraIds is initialized
429 camera_status_t ret = getOrCreateCameraIdListLocked(&cachedList);
430 if (ret != ACAMERA_OK) {
431 ALOGE("%s: Get camera ID list failed! err: %d", __FUNCTION__, ret);
432 return ret;
433 }
434 int cameraId = atoi(cameraIdStr);
435 if (mCameraIds.count(cameraId) == 0) {
436 ALOGE("%s: Camera ID %s does not exist!", __FUNCTION__, cameraIdStr);
437 return ACAMERA_ERROR_INVALID_PARAMETER;
438 }
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800439 sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800440 if (cs == nullptr) {
441 ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
442 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
443 }
444 CameraMetadata rawMetadata;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800445 binder::Status serviceRet = cs->getCameraCharacteristics(cameraId, &rawMetadata);
446 if (!serviceRet.isOk()) {
447 ALOGE("Get camera characteristics from camera service failed: %s",
448 serviceRet.toString8().string());
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800449 return ACAMERA_ERROR_UNKNOWN; // should not reach here
450 }
451
452 *characteristics = new ACameraMetadata(
453 rawMetadata.release(), ACameraMetadata::ACM_CHARACTERISTICS);
454 return ACAMERA_OK;
455}
456
457camera_status_t
458ACameraManager::openCamera(
459 const char* cameraId,
460 ACameraDevice_StateCallbacks* callback,
461 /*out*/ACameraDevice** outDevice) {
462 ACameraMetadata* rawChars;
463 camera_status_t ret = getCameraCharacteristics(cameraId, &rawChars);
464 Mutex::Autolock _l(mLock);
465 if (ret != ACAMERA_OK) {
466 ALOGE("%s: cannot get camera characteristics for camera %s. err %d",
467 __FUNCTION__, cameraId, ret);
468 return ACAMERA_ERROR_INVALID_PARAMETER;
469 }
470 std::unique_ptr<ACameraMetadata> chars(rawChars);
471 rawChars = nullptr;
472
473 ACameraDevice* device = new ACameraDevice(cameraId, callback, std::move(chars));
474
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800475 sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800476 if (cs == nullptr) {
477 ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
Yunlian Jiangb01d8f72016-10-04 16:34:18 -0700478 delete device;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800479 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
480 }
481
482 int id = atoi(cameraId);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800483 sp<hardware::camera2::ICameraDeviceCallbacks> callbacks = device->getServiceCallback();
484 sp<hardware::camera2::ICameraDeviceUser> deviceRemote;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800485 // No way to get package name from native.
486 // Send a zero length package name and let camera service figure it out from UID
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800487 binder::Status serviceRet = cs->connectDevice(
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800488 callbacks, id, String16(""),
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800489 hardware::ICameraService::USE_CALLING_UID, /*out*/&deviceRemote);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800490
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800491 if (!serviceRet.isOk()) {
492 ALOGE("%s: connect camera device failed: %s", __FUNCTION__, serviceRet.toString8().string());
Yin-Chia Yeh3e49be12016-04-12 16:00:33 -0700493 // Convert serviceRet to camera_status_t
494 switch(serviceRet.serviceSpecificErrorCode()) {
495 case hardware::ICameraService::ERROR_DISCONNECTED:
496 ret = ACAMERA_ERROR_CAMERA_DISCONNECTED;
497 break;
498 case hardware::ICameraService::ERROR_CAMERA_IN_USE:
499 ret = ACAMERA_ERROR_CAMERA_IN_USE;
500 break;
501 case hardware::ICameraService::ERROR_MAX_CAMERAS_IN_USE:
502 ret = ACAMERA_ERROR_MAX_CAMERA_IN_USE;
503 break;
504 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
505 ret = ACAMERA_ERROR_INVALID_PARAMETER;
506 break;
507 case hardware::ICameraService::ERROR_DEPRECATED_HAL:
508 // Should not reach here since we filtered legacy HALs earlier
509 ret = ACAMERA_ERROR_INVALID_PARAMETER;
510 break;
511 case hardware::ICameraService::ERROR_DISABLED:
512 ret = ACAMERA_ERROR_CAMERA_DISABLED;
513 break;
514 case hardware::ICameraService::ERROR_PERMISSION_DENIED:
515 ret = ACAMERA_ERROR_PERMISSION_DENIED;
516 break;
517 case hardware::ICameraService::ERROR_INVALID_OPERATION:
518 default:
519 ret = ACAMERA_ERROR_UNKNOWN;
520 break;
521 }
522
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800523 delete device;
Yin-Chia Yeh3e49be12016-04-12 16:00:33 -0700524 return ret;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800525 }
526 if (deviceRemote == nullptr) {
527 ALOGE("%s: connect camera device failed! remote device is null", __FUNCTION__);
528 delete device;
529 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
530 }
531 device->setRemoteDevice(deviceRemote);
532 *outDevice = device;
533 return ACAMERA_OK;
534}
535
536ACameraManager::~ACameraManager() {
537 Mutex::Autolock _l(mLock);
538 if (mCachedCameraIdList.numCameras != kCameraIdListNotInit) {
539 for (int i = 0; i < mCachedCameraIdList.numCameras; i++) {
540 delete[] mCachedCameraIdList.cameraIds[i];
541 }
542 delete[] mCachedCameraIdList.cameraIds;
543 }
544}