ACameraManager.cpp revision 3e49be17d8c8c53f50bb0d39affbbc36f6a12488
10dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh/* 20dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Copyright (C) 2015 The Android Open Source Project 30dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * 40dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Licensed under the Apache License, Version 2.0 (the "License"); 50dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * you may not use this file except in compliance with the License. 60dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * You may obtain a copy of the License at 70dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * 80dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * http://www.apache.org/licenses/LICENSE-2.0 90dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * 100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Unless required by applicable law or agreed to in writing, software 110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * distributed under the License is distributed on an "AS IS" BASIS, 120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * See the License for the specific language governing permissions and 140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * limitations under the License. 150dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh */ 160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh//#define LOG_NDEBUG 0 180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#define LOG_TAG "ACameraManager" 190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 200dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <memory> 210dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include "ACameraManager.h" 220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include "ACameraMetadata.h" 230dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include "ACameraDevice.h" 240dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <utils/Vector.h> 250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <stdlib.h> 260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <camera/VendorTagDescriptor.h> 270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehusing namespace android; 290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh//constants shared between ACameraManager and CameraManagerGlobal 310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehnamespace { 320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const int kMaxCameraIdLen = 32; 330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehnamespace android { 360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh// Static member definitions 370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehconst char* CameraManagerGlobal::kCameraIdKey = "CameraId"; 380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehconst char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp"; 390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehconst char* CameraManagerGlobal::kContextKey = "CallbackContext"; 400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehMutex CameraManagerGlobal::sLock; 410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehCameraManagerGlobal* CameraManagerGlobal::sInstance = nullptr; 420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehCameraManagerGlobal& 440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehCameraManagerGlobal::getInstance() { 450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(sLock); 460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh CameraManagerGlobal* instance = sInstance; 470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (instance == nullptr) { 480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh instance = new CameraManagerGlobal(); 490dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sInstance = instance; 500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return *instance; 520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehCameraManagerGlobal::~CameraManagerGlobal() { 550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // clear sInstance so next getInstance call knows to create a new one 560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _sl(sLock); 570dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sInstance = nullptr; 580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mCameraService != nullptr) { 600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh IInterface::asBinder(mCameraService)->unlinkToDeath(mDeathNotifier); 61ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh mCameraService->removeListener(mCameraServiceListener); 620dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mDeathNotifier.clear(); 640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mCbLooper != nullptr) { 650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCbLooper->unregisterHandler(mHandler->id()); 660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCbLooper->stop(); 670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCbLooper.clear(); 690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mHandler.clear(); 700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCameraServiceListener.clear(); 710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCameraService.clear(); 720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 74d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalasp<hardware::ICameraService> CameraManagerGlobal::getCameraService() { 750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mCameraService.get() == nullptr) { 770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<IServiceManager> sm = defaultServiceManager(); 780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<IBinder> binder; 790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh do { 800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh binder = sm->getService(String16(kCameraServiceName)); 810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (binder != nullptr) { 820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh break; 830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGW("CameraService not published, waiting..."); 850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh usleep(kCameraServicePollDelay); 860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } while(true); 870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mDeathNotifier == nullptr) { 880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mDeathNotifier = new DeathNotifier(this); 890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh binder->linkToDeath(mDeathNotifier); 91d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mCameraService = interface_cast<hardware::ICameraService>(binder); 920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Setup looper thread to perfrom availiability callbacks 940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mCbLooper == nullptr) { 950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCbLooper = new ALooper; 960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCbLooper->setName("C2N-mgr-looper"); 9702bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala status_t err = mCbLooper->start( 980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh /*runOnCallingThread*/false, 990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh /*canCallJava*/ true, 100ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh PRIORITY_DEFAULT); 10102bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala if (err != OK) { 10202bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala ALOGE("%s: Unable to start camera service listener looper: %s (%d)", 10302bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala __FUNCTION__, strerror(-err), err); 10402bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala mCbLooper.clear(); 10502bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala return nullptr; 10602bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala } 1070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mHandler == nullptr) { 1080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mHandler = new CallbackHandler(); 1090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCbLooper->registerHandler(mHandler); 1110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // register ICameraServiceListener 1140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mCameraServiceListener == nullptr) { 1150dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCameraServiceListener = new CameraServiceListener(this); 1160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCameraService->addListener(mCameraServiceListener); 1180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // setup vendor tags 120d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<VendorTagDescriptor> desc = new VendorTagDescriptor(); 121d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status ret = mCameraService->getCameraVendorTagDescriptor(/*out*/desc.get()); 1220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 123d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (ret.isOk()) { 124d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala status_t err = VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc); 125d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (err != OK) { 1260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Failed to set vendor tag descriptors, received error %s (%d)", 127d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala __FUNCTION__, strerror(-err), err); 1280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 129d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } else if (ret.serviceSpecificErrorCode() == 130d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::ICameraService::ERROR_DEPRECATED_HAL) { 1310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGW("%s: Camera HAL too old; does not support vendor tags", 1320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh __FUNCTION__); 1330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh VendorTagDescriptor::clearGlobalVendorTagDescriptor(); 1340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } else { 135d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ALOGE("%s: Failed to get vendor tag descriptors: %s", 136d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala __FUNCTION__, ret.toString8().string()); 1370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE_IF(mCameraService == nullptr, "no CameraService!?"); 1400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return mCameraService; 1410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::DeathNotifier::binderDied(const wp<IBinder>&) 1440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh{ 1450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("Camera service binderDied!"); 1460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<CameraManagerGlobal> cm = mCameraManager.promote(); 1470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (cm != nullptr) { 1480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh AutoMutex lock(cm->mLock); 1490dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (auto pair : cm->mDeviceStatusMap) { 1500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int32_t cameraId = pair.first; 1510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh cm->onStatusChangedLocked( 152d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala CameraServiceListener::STATUS_NOT_PRESENT, cameraId); 1530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh cm->mCameraService.clear(); 1550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // TODO: consider adding re-connect call here? 1560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1570dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::registerAvailabilityCallback( 1600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const ACameraManager_AvailabilityCallbacks *callback) { 1610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 1620dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Callback cb(callback); 1630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh auto pair = mCallbacks.insert(cb); 1640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Send initial callbacks if callback is newly registered 1650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (pair.second) { 1660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (auto pair : mDeviceStatusMap) { 1670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int32_t cameraId = pair.first; 168d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t status = pair.second; 1690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler); 1710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager_AvailabilityCallback cb = isStatusAvailable(status) ? 1720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh callback->onCameraAvailable : callback->onCameraUnavailable; 1730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->setPointer(kCallbackFpKey, (void *) cb); 1740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->setPointer(kContextKey, callback->context); 1750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->setInt32(kCameraIdKey, cameraId); 1760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->post(); 1770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::unregisterAvailabilityCallback( 1820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const ACameraManager_AvailabilityCallbacks *callback) { 1830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 1840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Callback cb(callback); 1850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCallbacks.erase(cb); 1860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 188d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalabool CameraManagerGlobal::validStatus(int32_t status) { 1890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh switch (status) { 190d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::ICameraServiceListener::STATUS_NOT_PRESENT: 191d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::ICameraServiceListener::STATUS_PRESENT: 192d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::ICameraServiceListener::STATUS_ENUMERATING: 193d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE: 1940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return true; 1950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh default: 1960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return false; 1970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 200d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalabool CameraManagerGlobal::isStatusAvailable(int32_t status) { 2010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh switch (status) { 202d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::ICameraServiceListener::STATUS_PRESENT: 2030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return true; 2040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh default: 2050dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return false; 2060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 2080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::CallbackHandler::sendSingleCallback( 2100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int32_t cameraId, void* context, 2110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager_AvailabilityCallback cb) const { 2120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh char cameraIdStr[kMaxCameraIdLen]; 2130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh snprintf(cameraIdStr, sizeof(cameraIdStr), "%d", cameraId); 2140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh (*cb)(context, cameraIdStr); 2150dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 2160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::CallbackHandler::onMessageReceived( 2180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const sp<AMessage> &msg) { 2190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh switch (msg->what()) { 2200dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh case kWhatSendSingleCallback: 2210dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh { 2220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager_AvailabilityCallback cb; 2230dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh void* context; 2240dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int32_t cameraId; 2250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh bool found = msg->findPointer(kCallbackFpKey, (void**) &cb); 2260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!found) { 2270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__); 2280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return; 2290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh found = msg->findPointer(kContextKey, &context); 2310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!found) { 2320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Cannot find callback context!", __FUNCTION__); 2330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return; 2340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh found = msg->findInt32(kCameraIdKey, &cameraId); 2360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!found) { 2370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Cannot find camera ID!", __FUNCTION__); 2380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return; 2390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sendSingleCallback(cameraId, context, cb); 2410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh break; 2420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh default: 2440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: unknown message type %d", __FUNCTION__, msg->what()); 2450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh break; 2460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 2480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 249d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalabinder::Status CameraManagerGlobal::CameraServiceListener::onStatusChanged( 250d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t status, int32_t cameraId) { 2510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<CameraManagerGlobal> cm = mCameraManager.promote(); 252d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (cm != nullptr) { 253d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala cm->onStatusChanged(status, cameraId); 254d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } else { 255ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("Cannot deliver status change. Global camera manager died"); 2560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 257d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return binder::Status::ok(); 2580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 2590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::onStatusChanged( 261d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t status, int32_t cameraId) { 2620dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 2630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh onStatusChangedLocked(status, cameraId); 2640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 2650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::onStatusChangedLocked( 267d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t status, int32_t cameraId) { 2680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!validStatus(status)) { 2690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Invalid status %d", __FUNCTION__, status); 2700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return; 2710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0); 274d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t oldStatus = firstStatus ? 2750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh status : // first status 2760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mDeviceStatusMap[cameraId]; 2770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!firstStatus && 2790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh isStatusAvailable(status) == isStatusAvailable(oldStatus)) { 2800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // No status update. No need to send callback 2810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return; 2820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Iterate through all registered callbacks 2850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mDeviceStatusMap[cameraId] = status; 2860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (auto cb : mCallbacks) { 2870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler); 2880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ? 2890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh cb.mAvailable : cb.mUnavailable; 2900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->setPointer(kCallbackFpKey, (void *) cbFp); 2910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->setPointer(kContextKey, cb.mContext); 2920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->setInt32(kCameraIdKey, cameraId); 2930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->post(); 2940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 2960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} // namespace android 2980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh/** 3000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * ACameraManger Implementation 3010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh */ 3020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t 3030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager::getOrCreateCameraIdListLocked(ACameraIdList** cameraIdList) { 3040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mCachedCameraIdList.numCameras == kCameraIdListNotInit) { 3050dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int numCameras = 0; 3060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Vector<char *> cameraIds; 307d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService(); 3080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (cs == nullptr) { 3090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Cannot reach camera service!", __FUNCTION__); 3100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_CAMERA_DISCONNECTED; 3110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Get number of cameras 313d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int numAllCameras = 0; 314d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status serviceRet = cs->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_ALL, 315d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala &numAllCameras); 316d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (!serviceRet.isOk()) { 317d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ALOGE("%s: Error getting camera count: %s", __FUNCTION__, 318d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala serviceRet.toString8().string()); 319d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala numAllCameras = 0; 320d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } 3210dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Filter API2 compatible cameras and push to cameraIds 3220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (int i = 0; i < numAllCameras; i++) { 3230dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // TODO: Only suppot HALs that supports API2 directly now 324d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala bool camera2Support = false; 325d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala serviceRet = cs->supportsCameraApi(i, hardware::ICameraService::API_VERSION_2, 326d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala &camera2Support); 3270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh char buf[kMaxCameraIdLen]; 328d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (camera2Support) { 3290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh numCameras++; 3300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCameraIds.insert(i); 3310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh snprintf(buf, sizeof(buf), "%d", i); 3320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh size_t cameraIdSize = strlen(buf) + 1; 3330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh char *cameraId = new char[cameraIdSize]; 3340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!cameraId) { 3350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("Allocate memory for ACameraIdList failed!"); 3360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_NOT_ENOUGH_MEMORY; 3370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh strlcpy(cameraId, buf, cameraIdSize); 3390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh cameraIds.push(cameraId); 3400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCachedCameraIdList.numCameras = numCameras; 3430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCachedCameraIdList.cameraIds = new const char*[numCameras]; 3440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!mCachedCameraIdList.cameraIds) { 3450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("Allocate memory for ACameraIdList failed!"); 3460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_NOT_ENOUGH_MEMORY; 3470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (int i = 0; i < numCameras; i++) { 3490dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCachedCameraIdList.cameraIds[i] = cameraIds[i]; 3500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *cameraIdList = &mCachedCameraIdList; 3530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_OK; 3540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 3550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 3560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t 3570dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager::getCameraIdList(ACameraIdList** cameraIdList) { 3580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 3590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraIdList* cachedList; 3600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh camera_status_t ret = getOrCreateCameraIdListLocked(&cachedList); 3610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (ret != ACAMERA_OK) { 3620dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("Get camera ID list failed! err: %d", ret); 3630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ret; 3640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 3660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int numCameras = cachedList->numCameras; 3670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraIdList *out = new ACameraIdList; 3680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!out) { 3690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("Allocate memory for ACameraIdList failed!"); 3700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_NOT_ENOUGH_MEMORY; 3710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh out->numCameras = numCameras; 3730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh out->cameraIds = new const char*[numCameras]; 3740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!out->cameraIds) { 3750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("Allocate memory for ACameraIdList failed!"); 3760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_NOT_ENOUGH_MEMORY; 3770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (int i = 0; i < numCameras; i++) { 3790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const char* src = cachedList->cameraIds[i]; 3800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh size_t dstSize = strlen(src) + 1; 3810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh char* dst = new char[dstSize]; 3820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!dst) { 3830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("Allocate memory for ACameraIdList failed!"); 3840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_NOT_ENOUGH_MEMORY; 3850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh strlcpy(dst, src, dstSize); 3870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh out->cameraIds[i] = dst; 3880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *cameraIdList = out; 3900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_OK; 3910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 3920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 3930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid 3940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager::deleteCameraIdList(ACameraIdList* cameraIdList) { 3950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (cameraIdList != nullptr) { 3960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (cameraIdList->cameraIds != nullptr) { 3970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (int i = 0; i < cameraIdList->numCameras; i ++) { 3980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete[] cameraIdList->cameraIds[i]; 3990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete[] cameraIdList->cameraIds; 4010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete cameraIdList; 4030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 4050dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 4060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACameraManager::getCameraCharacteristics( 4070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const char *cameraIdStr, ACameraMetadata **characteristics) { 4080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 4090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraIdList* cachedList; 4100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Make sure mCameraIds is initialized 4110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh camera_status_t ret = getOrCreateCameraIdListLocked(&cachedList); 4120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (ret != ACAMERA_OK) { 4130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Get camera ID list failed! err: %d", __FUNCTION__, ret); 4140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ret; 4150dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int cameraId = atoi(cameraIdStr); 4170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mCameraIds.count(cameraId) == 0) { 4180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Camera ID %s does not exist!", __FUNCTION__, cameraIdStr); 4190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 4200dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 421d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService(); 4220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (cs == nullptr) { 4230dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Cannot reach camera service!", __FUNCTION__); 4240dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_CAMERA_DISCONNECTED; 4250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh CameraMetadata rawMetadata; 427d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status serviceRet = cs->getCameraCharacteristics(cameraId, &rawMetadata); 428d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (!serviceRet.isOk()) { 429d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ALOGE("Get camera characteristics from camera service failed: %s", 430d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala serviceRet.toString8().string()); 4310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_UNKNOWN; // should not reach here 4320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 4340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *characteristics = new ACameraMetadata( 4350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh rawMetadata.release(), ACameraMetadata::ACM_CHARACTERISTICS); 4360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_OK; 4370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 4380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 4390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t 4400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager::openCamera( 4410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const char* cameraId, 4420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraDevice_StateCallbacks* callback, 4430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh /*out*/ACameraDevice** outDevice) { 4440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraMetadata* rawChars; 4450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh camera_status_t ret = getCameraCharacteristics(cameraId, &rawChars); 4460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 4470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (ret != ACAMERA_OK) { 4480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: cannot get camera characteristics for camera %s. err %d", 4490dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh __FUNCTION__, cameraId, ret); 4500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 4510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh std::unique_ptr<ACameraMetadata> chars(rawChars); 4530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh rawChars = nullptr; 4540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 4550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraDevice* device = new ACameraDevice(cameraId, callback, std::move(chars)); 4560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 457d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService(); 4580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (cs == nullptr) { 4590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Cannot reach camera service!", __FUNCTION__); 4600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_CAMERA_DISCONNECTED; 4610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4620dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 4630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int id = atoi(cameraId); 464d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::camera2::ICameraDeviceCallbacks> callbacks = device->getServiceCallback(); 465d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::camera2::ICameraDeviceUser> deviceRemote; 4660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // No way to get package name from native. 4670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Send a zero length package name and let camera service figure it out from UID 468d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status serviceRet = cs->connectDevice( 4690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh callbacks, id, String16(""), 470d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::ICameraService::USE_CALLING_UID, /*out*/&deviceRemote); 4710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 472d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (!serviceRet.isOk()) { 473d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ALOGE("%s: connect camera device failed: %s", __FUNCTION__, serviceRet.toString8().string()); 4743e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh // Convert serviceRet to camera_status_t 4753e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh switch(serviceRet.serviceSpecificErrorCode()) { 4763e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh case hardware::ICameraService::ERROR_DISCONNECTED: 4773e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh ret = ACAMERA_ERROR_CAMERA_DISCONNECTED; 4783e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh break; 4793e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh case hardware::ICameraService::ERROR_CAMERA_IN_USE: 4803e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh ret = ACAMERA_ERROR_CAMERA_IN_USE; 4813e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh break; 4823e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh case hardware::ICameraService::ERROR_MAX_CAMERAS_IN_USE: 4833e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh ret = ACAMERA_ERROR_MAX_CAMERA_IN_USE; 4843e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh break; 4853e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT: 4863e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh ret = ACAMERA_ERROR_INVALID_PARAMETER; 4873e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh break; 4883e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh case hardware::ICameraService::ERROR_DEPRECATED_HAL: 4893e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh // Should not reach here since we filtered legacy HALs earlier 4903e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh ret = ACAMERA_ERROR_INVALID_PARAMETER; 4913e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh break; 4923e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh case hardware::ICameraService::ERROR_DISABLED: 4933e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh ret = ACAMERA_ERROR_CAMERA_DISABLED; 4943e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh break; 4953e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh case hardware::ICameraService::ERROR_PERMISSION_DENIED: 4963e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh ret = ACAMERA_ERROR_PERMISSION_DENIED; 4973e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh break; 4983e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh case hardware::ICameraService::ERROR_INVALID_OPERATION: 4993e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh default: 5003e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh ret = ACAMERA_ERROR_UNKNOWN; 5013e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh break; 5023e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh } 5033e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh 5040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete device; 5053e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh return ret; 5060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 5070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (deviceRemote == nullptr) { 5080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: connect camera device failed! remote device is null", __FUNCTION__); 5090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete device; 5100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_CAMERA_DISCONNECTED; 5110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 5120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh device->setRemoteDevice(deviceRemote); 5130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *outDevice = device; 5140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_OK; 5150dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 5160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 5170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager::~ACameraManager() { 5180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 5190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mCachedCameraIdList.numCameras != kCameraIdListNotInit) { 5200dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (int i = 0; i < mCachedCameraIdList.numCameras; i++) { 5210dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete[] mCachedCameraIdList.cameraIds[i]; 5220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 5230dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete[] mCachedCameraIdList.cameraIds; 5240dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 5250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 526