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#ifndef _ACAMERA_MANAGER_H 180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#define _ACAMERA_MANAGER_H 190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 207e8d4ba5887affda749978d787b898bf31fda729Colin Cross#include <camera/NdkCameraManager.h> 210dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2203f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh#include <android-base/parseint.h> 23d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/ICameraService.h> 24d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/BnCameraServiceListener.h> 250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <camera/CameraMetadata.h> 260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <binder/IServiceManager.h> 270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <utils/StrongPointer.h> 280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <utils/Mutex.h> 290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <media/stagefright/foundation/ALooper.h> 310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <media/stagefright/foundation/AHandler.h> 320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <media/stagefright/foundation/AMessage.h> 330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <set> 350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <map> 360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehnamespace android { 380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh/** 400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Per-process singleton instance of CameraManger. Shared by all ACameraManager 410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * instances. Created when first ACameraManager is created and destroyed when 420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * all ACameraManager instances are deleted. 430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * 44f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala * TODO: maybe CameraManagerGlobal is better suited in libcameraclient? 450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh */ 460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehclass CameraManagerGlobal final : public RefBase { 470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh public: 480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh static CameraManagerGlobal& getInstance(); 49d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::ICameraService> getCameraService(); 500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh void registerAvailabilityCallback( 520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const ACameraManager_AvailabilityCallbacks *callback); 530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh void unregisterAvailabilityCallback( 540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const ACameraManager_AvailabilityCallbacks *callback); 550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 56f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala /** 57f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala * Return camera IDs that support camera2 58f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala */ 59f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala void getCameraIdList(std::vector<String8> *cameraIds); 60f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala 610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh private: 62d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::ICameraService> mCameraService; 630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const int kCameraServicePollDelay = 500000; // 0.5s 640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const char* kCameraServiceName = "media.camera"; 650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex mLock; 660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh class DeathNotifier : public IBinder::DeathRecipient { 680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh public: 69d19d994770a04f02c204affd29985c5aeaa58baaChih-Hung Hsieh explicit DeathNotifier(CameraManagerGlobal* cm) : mCameraManager(cm) {} 700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh protected: 710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // IBinder::DeathRecipient implementation 720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh virtual void binderDied(const wp<IBinder>& who); 730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh private: 740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const wp<CameraManagerGlobal> mCameraManager; 750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh }; 760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<DeathNotifier> mDeathNotifier; 770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 78d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala class CameraServiceListener final : public hardware::BnCameraServiceListener { 790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh public: 80d19d994770a04f02c204affd29985c5aeaa58baaChih-Hung Hsieh explicit CameraServiceListener(CameraManagerGlobal* cm) : mCameraManager(cm) {} 81f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala virtual binder::Status onStatusChanged(int32_t status, const String16& cameraId); 820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Torch API not implemented yet 84d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status onTorchStatusChanged(int32_t, const String16&) { 85d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return binder::Status::ok(); 86d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } 87d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh private: 890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const wp<CameraManagerGlobal> mCameraManager; 900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh }; 910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<CameraServiceListener> mCameraServiceListener; 920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Wrapper of ACameraManager_AvailabilityCallbacks so we can store it in std::set 940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh struct Callback { 95d19d994770a04f02c204affd29985c5aeaa58baaChih-Hung Hsieh explicit Callback(const ACameraManager_AvailabilityCallbacks *callback) : 960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mAvailable(callback->onCameraAvailable), 970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mUnavailable(callback->onCameraUnavailable), 980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mContext(callback->context) {} 990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh bool operator == (const Callback& other) const { 1010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return (mAvailable == other.mAvailable && 1020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mUnavailable == other.mUnavailable && 1030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh mContext == other.mContext); 1040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1050dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh bool operator != (const Callback& other) const { 1060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return !(*this == other); 1070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh bool operator < (const Callback& other) const { 1090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (*this == other) return false; 1100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mContext != other.mContext) return mContext < other.mContext; 1110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mAvailable != other.mAvailable) return mAvailable < other.mAvailable; 1120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return mUnavailable < other.mUnavailable; 1130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh bool operator > (const Callback& other) const { 1150dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return (*this != other && !(*this < other)); 1160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager_AvailabilityCallback mAvailable; 1180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager_AvailabilityCallback mUnavailable; 1190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh void* mContext; 1200dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh }; 1210dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh std::set<Callback> mCallbacks; 1220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1230dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // definition of handler and message 1240dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh enum { 1250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh kWhatSendSingleCallback 1260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh }; 1270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh static const char* kCameraIdKey; 1280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh static const char* kCallbackFpKey; 1290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh static const char* kContextKey; 1300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh class CallbackHandler : public AHandler { 1310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh public: 1320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh CallbackHandler() {} 1330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh void onMessageReceived(const sp<AMessage> &msg) override; 1340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh }; 1350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<CallbackHandler> mHandler; 1360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<ALooper> mCbLooper; // Looper thread where callbacks actually happen on 1370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 138f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala void onStatusChanged(int32_t status, const String8& cameraId); 139f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala void onStatusChangedLocked(int32_t status, const String8& cameraId); 1400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Utils for status 141d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala static bool validStatus(int32_t status); 142d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala static bool isStatusAvailable(int32_t status); 1430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 14403f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh // The sort logic must match the logic in 14503f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh // libcameraservice/common/CameraProviderManager.cpp::getAPI1CompatibleCameraDeviceIds 14603f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh struct CameraIdComparator { 14703f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh bool operator()(const String8& a, const String8& b) const { 14803f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh uint32_t aUint = 0, bUint = 0; 14903f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh bool aIsUint = base::ParseUint(a.c_str(), &aUint); 15003f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh bool bIsUint = base::ParseUint(b.c_str(), &bUint); 15103f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh 15203f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh // Uint device IDs first 15303f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh if (aIsUint && bIsUint) { 15403f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh return aUint < bUint; 15503f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh } else if (aIsUint) { 15603f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh return true; 15703f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh } else if (bIsUint) { 15803f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh return false; 15903f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh } 16003f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh // Simple string compare if both id are not uint 16103f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh return a < b; 16203f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh } 16303f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh }; 16403f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh 1650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // Map camera_id -> status 16603f5575dc5c1a4de41dd2f327e59c1938b2a25d1Yin-Chia Yeh std::map<String8, int32_t, CameraIdComparator> mDeviceStatusMap; 1670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh // For the singleton instance 1690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh static Mutex sLock; 1700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh static CameraManagerGlobal* sInstance; 1710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh CameraManagerGlobal() {}; 1720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ~CameraManagerGlobal(); 1730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}; 1740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} // namespace android; 1760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh/** 1780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * ACameraManager opaque struct definition 1790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Leave outside of android namespace because it's NDK struct 1800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh */ 1810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehstruct ACameraManager { 1820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager() : 183d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mGlobalManager(&(android::CameraManagerGlobal::getInstance())) {} 1840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ~ACameraManager(); 1850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh camera_status_t getCameraIdList(ACameraIdList** cameraIdList); 1860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh static void deleteCameraIdList(ACameraIdList* cameraIdList); 1870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh camera_status_t getCameraCharacteristics( 1890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const char *cameraId, ACameraMetadata **characteristics); 1900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh camera_status_t openCamera(const char* cameraId, 1910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraDevice_StateCallbacks* callback, 1920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh /*out*/ACameraDevice** device); 1930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh private: 1950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh enum { 1960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh kCameraIdListNotInit = -1 1970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh }; 198d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala android::Mutex mLock; 199d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala android::sp<android::CameraManagerGlobal> mGlobalManager; 2000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}; 2010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#endif //_ACAMERA_MANAGER_H 203