ACameraManager.cpp revision d56db1d2bee182d1851097a9c712712fc094d117
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"); 970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh status_t ret = mCbLooper->start( 980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh /*runOnCallingThread*/false, 990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh /*canCallJava*/ true, 100ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh PRIORITY_DEFAULT); 1010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mHandler == nullptr) { 1020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mHandler = new CallbackHandler(); 1030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCbLooper->registerHandler(mHandler); 1050dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // register ICameraServiceListener 1080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mCameraServiceListener == nullptr) { 1090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCameraServiceListener = new CameraServiceListener(this); 1100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCameraService->addListener(mCameraServiceListener); 1120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // setup vendor tags 114d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<VendorTagDescriptor> desc = new VendorTagDescriptor(); 115d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status ret = mCameraService->getCameraVendorTagDescriptor(/*out*/desc.get()); 1160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 117d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (ret.isOk()) { 118d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala status_t err = VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc); 119d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (err != OK) { 1200dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Failed to set vendor tag descriptors, received error %s (%d)", 121d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala __FUNCTION__, strerror(-err), err); 1220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 123d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } else if (ret.serviceSpecificErrorCode() == 124d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::ICameraService::ERROR_DEPRECATED_HAL) { 1250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGW("%s: Camera HAL too old; does not support vendor tags", 1260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh __FUNCTION__); 1270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh VendorTagDescriptor::clearGlobalVendorTagDescriptor(); 1280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } else { 129d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ALOGE("%s: Failed to get vendor tag descriptors: %s", 130d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala __FUNCTION__, ret.toString8().string()); 1310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE_IF(mCameraService == nullptr, "no CameraService!?"); 1340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return mCameraService; 1350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::DeathNotifier::binderDied(const wp<IBinder>&) 1380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh{ 1390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("Camera service binderDied!"); 1400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<CameraManagerGlobal> cm = mCameraManager.promote(); 1410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (cm != nullptr) { 1420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh AutoMutex lock(cm->mLock); 1430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (auto pair : cm->mDeviceStatusMap) { 1440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int32_t cameraId = pair.first; 1450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh cm->onStatusChangedLocked( 146d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala CameraServiceListener::STATUS_NOT_PRESENT, cameraId); 1470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh cm->mCameraService.clear(); 1490dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // TODO: consider adding re-connect call here? 1500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::registerAvailabilityCallback( 1540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const ACameraManager_AvailabilityCallbacks *callback) { 1550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 1560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Callback cb(callback); 1570dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh auto pair = mCallbacks.insert(cb); 1580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Send initial callbacks if callback is newly registered 1590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (pair.second) { 1600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (auto pair : mDeviceStatusMap) { 1610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int32_t cameraId = pair.first; 162d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t status = pair.second; 1630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler); 1650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager_AvailabilityCallback cb = isStatusAvailable(status) ? 1660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh callback->onCameraAvailable : callback->onCameraUnavailable; 1670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->setPointer(kCallbackFpKey, (void *) cb); 1680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->setPointer(kContextKey, callback->context); 1690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->setInt32(kCameraIdKey, cameraId); 1700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->post(); 1710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::unregisterAvailabilityCallback( 1760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const ACameraManager_AvailabilityCallbacks *callback) { 1770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 1780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Callback cb(callback); 1790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCallbacks.erase(cb); 1800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 182d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalabool CameraManagerGlobal::validStatus(int32_t status) { 1830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh switch (status) { 184d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::ICameraServiceListener::STATUS_NOT_PRESENT: 185d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::ICameraServiceListener::STATUS_PRESENT: 186d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::ICameraServiceListener::STATUS_ENUMERATING: 187d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE: 1880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return true; 1890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh default: 1900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return false; 1910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 194d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalabool CameraManagerGlobal::isStatusAvailable(int32_t status) { 1950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh switch (status) { 196d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::ICameraServiceListener::STATUS_PRESENT: 1970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return true; 1980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh default: 1990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return false; 2000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 2020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::CallbackHandler::sendSingleCallback( 2040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int32_t cameraId, void* context, 2050dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager_AvailabilityCallback cb) const { 2060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh char cameraIdStr[kMaxCameraIdLen]; 2070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh snprintf(cameraIdStr, sizeof(cameraIdStr), "%d", cameraId); 2080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh (*cb)(context, cameraIdStr); 2090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 2100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::CallbackHandler::onMessageReceived( 2120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const sp<AMessage> &msg) { 2130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh switch (msg->what()) { 2140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh case kWhatSendSingleCallback: 2150dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh { 2160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager_AvailabilityCallback cb; 2170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh void* context; 2180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int32_t cameraId; 2190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh bool found = msg->findPointer(kCallbackFpKey, (void**) &cb); 2200dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!found) { 2210dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__); 2220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return; 2230dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2240dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh found = msg->findPointer(kContextKey, &context); 2250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!found) { 2260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Cannot find callback context!", __FUNCTION__); 2270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return; 2280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh found = msg->findInt32(kCameraIdKey, &cameraId); 2300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!found) { 2310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Cannot find camera ID!", __FUNCTION__); 2320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return; 2330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sendSingleCallback(cameraId, context, cb); 2350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh break; 2360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh default: 2380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: unknown message type %d", __FUNCTION__, msg->what()); 2390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh break; 2400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 2420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 243d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalabinder::Status CameraManagerGlobal::CameraServiceListener::onStatusChanged( 244d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t status, int32_t cameraId) { 2450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<CameraManagerGlobal> cm = mCameraManager.promote(); 246d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (cm != nullptr) { 247d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala cm->onStatusChanged(status, cameraId); 248d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } else { 249ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("Cannot deliver status change. Global camera manager died"); 2500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 251d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return binder::Status::ok(); 2520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 2530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::onStatusChanged( 255d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t status, int32_t cameraId) { 2560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 2570dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh onStatusChangedLocked(status, cameraId); 2580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 2590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid CameraManagerGlobal::onStatusChangedLocked( 261d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t status, int32_t cameraId) { 2620dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!validStatus(status)) { 2630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Invalid status %d", __FUNCTION__, status); 2640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return; 2650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0); 268d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t oldStatus = firstStatus ? 2690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh status : // first status 2700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mDeviceStatusMap[cameraId]; 2710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!firstStatus && 2730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh isStatusAvailable(status) == isStatusAvailable(oldStatus)) { 2740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // No status update. No need to send callback 2750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return; 2760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Iterate through all registered callbacks 2790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mDeviceStatusMap[cameraId] = status; 2800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (auto cb : mCallbacks) { 2810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler); 2820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ? 2830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh cb.mAvailable : cb.mUnavailable; 2840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->setPointer(kCallbackFpKey, (void *) cbFp); 2850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->setPointer(kContextKey, cb.mContext); 2860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->setInt32(kCameraIdKey, cameraId); 2870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh msg->post(); 2880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 2900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} // namespace android 2920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh/** 2940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * ACameraManger Implementation 2950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh */ 2960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t 2970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager::getOrCreateCameraIdListLocked(ACameraIdList** cameraIdList) { 2980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mCachedCameraIdList.numCameras == kCameraIdListNotInit) { 2990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int numCameras = 0; 3000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Vector<char *> cameraIds; 301d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService(); 3020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (cs == nullptr) { 3030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Cannot reach camera service!", __FUNCTION__); 3040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_CAMERA_DISCONNECTED; 3050dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Get number of cameras 307d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int numAllCameras = 0; 308d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status serviceRet = cs->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_ALL, 309d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala &numAllCameras); 310d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (!serviceRet.isOk()) { 311d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ALOGE("%s: Error getting camera count: %s", __FUNCTION__, 312d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala serviceRet.toString8().string()); 313d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala numAllCameras = 0; 314d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } 3150dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Filter API2 compatible cameras and push to cameraIds 3160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (int i = 0; i < numAllCameras; i++) { 3170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // TODO: Only suppot HALs that supports API2 directly now 318d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala bool camera2Support = false; 319d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala serviceRet = cs->supportsCameraApi(i, hardware::ICameraService::API_VERSION_2, 320d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala &camera2Support); 3210dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh char buf[kMaxCameraIdLen]; 322d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (camera2Support) { 3230dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh numCameras++; 3240dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCameraIds.insert(i); 3250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh snprintf(buf, sizeof(buf), "%d", i); 3260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh size_t cameraIdSize = strlen(buf) + 1; 3270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh char *cameraId = new char[cameraIdSize]; 3280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!cameraId) { 3290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("Allocate memory for ACameraIdList failed!"); 3300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_NOT_ENOUGH_MEMORY; 3310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh strlcpy(cameraId, buf, cameraIdSize); 3330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh cameraIds.push(cameraId); 3340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCachedCameraIdList.numCameras = numCameras; 3370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCachedCameraIdList.cameraIds = new const char*[numCameras]; 3380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!mCachedCameraIdList.cameraIds) { 3390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("Allocate memory for ACameraIdList failed!"); 3400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_NOT_ENOUGH_MEMORY; 3410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (int i = 0; i < numCameras; i++) { 3430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mCachedCameraIdList.cameraIds[i] = cameraIds[i]; 3440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *cameraIdList = &mCachedCameraIdList; 3470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_OK; 3480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 3490dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 3500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t 3510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager::getCameraIdList(ACameraIdList** cameraIdList) { 3520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 3530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraIdList* cachedList; 3540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh camera_status_t ret = getOrCreateCameraIdListLocked(&cachedList); 3550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (ret != ACAMERA_OK) { 3560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("Get camera ID list failed! err: %d", ret); 3570dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ret; 3580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 3600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int numCameras = cachedList->numCameras; 3610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraIdList *out = new ACameraIdList; 3620dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!out) { 3630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("Allocate memory for ACameraIdList failed!"); 3640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_NOT_ENOUGH_MEMORY; 3650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh out->numCameras = numCameras; 3670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh out->cameraIds = new const char*[numCameras]; 3680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!out->cameraIds) { 3690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("Allocate memory for ACameraIdList failed!"); 3700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_NOT_ENOUGH_MEMORY; 3710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (int i = 0; i < numCameras; i++) { 3730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const char* src = cachedList->cameraIds[i]; 3740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh size_t dstSize = strlen(src) + 1; 3750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh char* dst = new char[dstSize]; 3760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (!dst) { 3770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("Allocate memory for ACameraIdList failed!"); 3780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_NOT_ENOUGH_MEMORY; 3790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh strlcpy(dst, src, dstSize); 3810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh out->cameraIds[i] = dst; 3820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *cameraIdList = out; 3840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_OK; 3850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 3860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 3870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid 3880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager::deleteCameraIdList(ACameraIdList* cameraIdList) { 3890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (cameraIdList != nullptr) { 3900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (cameraIdList->cameraIds != nullptr) { 3910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (int i = 0; i < cameraIdList->numCameras; i ++) { 3920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete[] cameraIdList->cameraIds[i]; 3930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete[] cameraIdList->cameraIds; 3950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete cameraIdList; 3970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 3990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 4000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACameraManager::getCameraCharacteristics( 4010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const char *cameraIdStr, ACameraMetadata **characteristics) { 4020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 4030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraIdList* cachedList; 4040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Make sure mCameraIds is initialized 4050dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh camera_status_t ret = getOrCreateCameraIdListLocked(&cachedList); 4060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (ret != ACAMERA_OK) { 4070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Get camera ID list failed! err: %d", __FUNCTION__, ret); 4080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ret; 4090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int cameraId = atoi(cameraIdStr); 4110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mCameraIds.count(cameraId) == 0) { 4120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Camera ID %s does not exist!", __FUNCTION__, cameraIdStr); 4130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 4140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 415d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService(); 4160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (cs == nullptr) { 4170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Cannot reach camera service!", __FUNCTION__); 4180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_CAMERA_DISCONNECTED; 4190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4200dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh CameraMetadata rawMetadata; 421d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status serviceRet = cs->getCameraCharacteristics(cameraId, &rawMetadata); 422d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (!serviceRet.isOk()) { 423d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ALOGE("Get camera characteristics from camera service failed: %s", 424d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala serviceRet.toString8().string()); 4250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_UNKNOWN; // should not reach here 4260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 4280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *characteristics = new ACameraMetadata( 4290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh rawMetadata.release(), ACameraMetadata::ACM_CHARACTERISTICS); 4300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_OK; 4310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 4320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 4330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t 4340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager::openCamera( 4350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const char* cameraId, 4360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraDevice_StateCallbacks* callback, 4370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh /*out*/ACameraDevice** outDevice) { 4380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraMetadata* rawChars; 4390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh camera_status_t ret = getCameraCharacteristics(cameraId, &rawChars); 4400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 4410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (ret != ACAMERA_OK) { 4420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: cannot get camera characteristics for camera %s. err %d", 4430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh __FUNCTION__, cameraId, ret); 4440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 4450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh std::unique_ptr<ACameraMetadata> chars(rawChars); 4470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh rawChars = nullptr; 4480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 4490dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraDevice* device = new ACameraDevice(cameraId, callback, std::move(chars)); 4500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 451d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService(); 4520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (cs == nullptr) { 4530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: Cannot reach camera service!", __FUNCTION__); 4540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_CAMERA_DISCONNECTED; 4550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 4570dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh int id = atoi(cameraId); 458d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::camera2::ICameraDeviceCallbacks> callbacks = device->getServiceCallback(); 459d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::camera2::ICameraDeviceUser> deviceRemote; 4600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // No way to get package name from native. 4610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Send a zero length package name and let camera service figure it out from UID 462d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status serviceRet = cs->connectDevice( 4630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh callbacks, id, String16(""), 464d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::ICameraService::USE_CALLING_UID, /*out*/&deviceRemote); 4650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 466d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (!serviceRet.isOk()) { 467d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ALOGE("%s: connect camera device failed: %s", __FUNCTION__, serviceRet.toString8().string()); 4680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete device; 4690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_CAMERA_DISCONNECTED; 4700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (deviceRemote == nullptr) { 4720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: connect camera device failed! remote device is null", __FUNCTION__); 4730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete device; 4740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_CAMERA_DISCONNECTED; 4750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh device->setRemoteDevice(deviceRemote); 4770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *outDevice = device; 4780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_OK; 4790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 4800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 4810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager::~ACameraManager() { 4820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(mLock); 4830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mCachedCameraIdList.numCameras != kCameraIdListNotInit) { 4840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh for (int i = 0; i < mCachedCameraIdList.numCameras; i++) { 4850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete[] mCachedCameraIdList.cameraIds[i]; 4860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete[] mCachedCameraIdList.cameraIds; 4880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 4890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 490