日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Camera初始化流程

發布時間:2024/1/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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綁定

//在此注冊CameraProviderbool success = mServiceProxy->registerForNotifications(/* instance name, empty means no filter */ "",this);if (!success) {ALOGE("%s: Unable to register with hardware service manager for notifications ""about camera providers", __FUNCTION__);return INVALID_OPERATION;}for (const auto& instance : mServiceProxy->listServices()) {將CameraProvider添加進來this->addProviderLocked(instance);}

執行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賦值的地方

camera_module_t HAL_MODULE_INFO_SYM = {.common ={.tag = HARDWARE_MODULE_TAG,.module_api_version = CAMERA_MODULE_API_VERSION_2_5,.hal_api_version = HARDWARE_HAL_API_VERSION,.id = CAMERA_HARDWARE_MODULE_ID,.name = "Sprd Camera HAL3",.author = "Spreadtrum Corporation",.methods = &methods,.dso = NULL,},.get_number_of_cameras =sprdcamera::SprdCamera3Factory::get_number_of_cameras,.get_camera_info = sprdcamera::SprdCamera3Factory::get_camera_info,.set_callbacks = sprdcamera::SprdCamera3Factory::set_callbacks,.get_vendor_tag_ops = sprdcamera::SprdCamera3Factory::get_vendor_tag_ops,.open_legacy = sprdcamera::SprdCamera3Factory::open_legacy,.set_torch_mode = sprdcamera::SprdCamera3Factory::set_torch_mode,.init = sprdcamera::SprdCamera3Factory::init,.get_physical_camera_info =sprdcamera::SprdCamera3Factory::get_physical_camera_info,.is_stream_combination_supported =sprdcamera::SprdCamera3Factory::is_stream_combination_supported,.notify_device_state_change =sprdcamera::SprdCamera3Factory::notify_device_state_change, };

可以看到
CameraModule實際上就是對SprdCamera3Factory SprdCameraImpl的一層封裝。

總結

以上是生活随笔為你收集整理的Camera初始化流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。