Camera初始化流程
生活随笔
收集整理的這篇文章主要介紹了
Camera初始化流程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CameraService 啟動流程分析
本輪文章均使用sprd 12 設備進行分析
CameraService初始化于 cameraserver.rc文件
service cameraserver /system/bin/cameraserverclass mainuser cameraservergroup audio camera input drmrpcioprio rt 4task_profiles CameraServiceCapacity MaxPerformancerlimit rtprio 10 10在main_cameraservice創建時會實例一個CameraService,并會調用其中的publish方法,將該服務加入ServiceManager管理。
static status_t publish(bool allowIsolated = false,int dumpFlags = IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT) {sp<IServiceManager> sm(defaultServiceManager());return sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated,dumpFlags);}在獲取CameraService引用后會觸發onFirstRef方法
BnCameraService::onFirstRef(); // Update battery life tracking if service is restartingBatteryNotifier& notifier(BatteryNotifier::getInstance());notifier.noteResetCamera();notifier.noteResetFlashlight();status_t res = INVALID_OPERATION;res = enumerateProviders();if (res == OK) {mInitialized = true;}mUidPolicy = new UidPolicy(this);mUidPolicy->registerSelf();mSensorPrivacyPolicy = new SensorPrivacyPolicy(this);mSensorPrivacyPolicy->registerSelf();mInjectionStatusListener = new InjectionStatusListener(this);mAppOps.setCameraAudioRestriction(mAudioRestriction);sp<HidlCameraService> hcs = HidlCameraService::getInstance(this);繼續跟蹤enumerateProviders()方法
if (nullptr == mCameraProviderManager.get()) {mCameraProviderManager = new CameraProviderManager();//CameraProviderManager初始化res = mCameraProviderManager->initialize(this);if (res != OK) {ALOGE("%s: Unable to initialize camera provider manager: %s (%d)",__FUNCTION__, strerror(-res), res);logServiceError(String8::format("Unable to initialize camera provider manager"),ERROR_DISCONNECTED);return res;}}mCameraProviderManager->setUpVendorTags();if (nullptr == mFlashlight.get()) {mFlashlight = new CameraFlashlight(mCameraProviderManager, this);}//初始化閃光燈res = mFlashlight->findFlashUnits();if (res != OK) {ALOGE("Failed to enumerate flash units: %s (%d)", strerror(-res), res);}//獲取相機列表iddeviceIds = mCameraProviderManager->getCameraDeviceIds();...for (auto& cameraId : deviceIds) {String8 id8 = String8(cameraId.c_str());if (getCameraState(id8) == nullptr) {//初始化設備狀態onDeviceStatusChanged(id8, CameraDeviceStatus::PRESENT);}}比較關鍵的地方是
mCameraProviderManager->initialize(this);
CameraProviderManager初始化時會實例一個CameraProvider,并通過
addProviderLocked(instance)和Service綁定
執行mServiceProxy->registerForNotifications時會去實例化一個CameraProvider(具體怎么轉變過去的還不知道怎么分析)
LegacyCameraProviderImpl_2_4::LegacyCameraProviderImpl_2_4() :camera_module_callbacks_t({sCameraDeviceStatusChange,sTorchModeStatusChange}) {mInitFailed = initialize();} camera_module_t *rawModule;int err = hw_get_module(CAMERA_HARDWARE_MODULE_ID,(const hw_module_t **)&rawModule);if (err < 0) {ALOGE("Could not load camera HAL module: %d (%s)", err, strerror(-err));return true;}mModule = new CameraModule(rawModule);err = mModule->init();if (err != OK) {ALOGE("Could not initialize camera HAL module: %d (%s)", err, strerror(-err));mModule.clear();return true;}initialize中需要關注camera_module_t 這個結構體的定義位置,以及這個CameraModule
camera_module_t賦值的地方
可以看到
CameraModule實際上就是對SprdCamera3Factory SprdCameraImpl的一層封裝。
總結
以上是生活随笔為你收集整理的Camera初始化流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 185Echarts - 日历坐标系(C
- 下一篇: 学生修改信息之‘3021’问题