第8讲 cameraserver进程启动之enumerateProviders概述

https://deepinout.com/android-camera-native-framework/cameraserver-process-startup-enumerateproviders-overview.html

1 Android Camera HAL接口简介

Android Camera HAL接口分成HIDL和AIDL两种,谷歌之后会强推AIDL。
核心接口如下:
在这里插入图片描述

  • ICameraProvider管理多个ICameraDevice
  • ICameraDevice管理和维护某一颗CameraDevice
  • 通过ICameraProvider获取到ICameraDevice
  • 通过ICameraDevice获取到ICameraDeviceSession
  • 初始化时,ICameraProvider和ICameraDevice的实例就会被创建起来,
    ICameraDeviceSession要open camera时才创建,close camera时销毁

HIDL代码路径:
/hardware/interfaces/camera/common/1.0
/hardware/interfaces/camera/device/1.0
/hardware/interfaces/camera/metadata/1.0
/hardware/interfaces/camera/provider/1.0

AIDL代码路径:
/hardware/interfaces/camera/common/aidl
/hardware/interfaces/camera/device/aidl
/hardware/interfaces/camera/metadata/aidl
/hardware/interfaces/camera/provider/aidl

2 CameraService与CameraProviderManager的关系

2.1 CameraService

ICameraService的实现,CameraService与HAL Provider的交互要通过
CameraProviderManager

2.2 CameraProviderManager

负责管理 Camera HAL Providers
在这里插入图片描述

3 CameraProviderManager中的ProviderInfo

CameraProviderManager抽象出ProviderInfo来屏蔽HIDL和AIDL Provider的差异
将差异部分交给HidlProviderInfo和AidlProviderInfo去处理。
在这里插入图片描述

4 enumerateProviders总体流程介绍

4.1 有哪些情况会调用到

  1. CameraServer进程启动时(onFirstRef)
  2. CameraServer进程启动后,有新的Provider注册到ServiceManager时(onNewProviderRegistered)

4.2 enumerateProviders流程介绍

  1. 创建CameraProviderManager,并调用initialize完成初始化
  2. 初始化 VendorTags
  3. 初始化Flashlight并完成枚举动作
  4. 针对主前/后摄,为SPerfClass过滤CameraCharacteristics

frameworks/av/services/camera/libcameraservice/CameraService.cpp

status_t CameraService::enumerateProviders() {
    status_t res;

    std::vector deviceIds;
    {
        Mutex::Autolock l(mServiceLock);

        if (nullptr == mCameraProviderManager.get()) {
            mCameraProviderManager = new 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;
            }
        }

        // Setup vendor tags before we call get_camera_info the first time
        // because HAL might need to setup static vendor keys in get_camera_info
        // TODO: maybe put this into CameraProviderManager::initialize()?
        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);
        }

        deviceIds = mCameraProviderManager->getCameraDeviceIds();
    }

    for (auto& cameraId : deviceIds) {
        String8 id8 = String8(cameraId.c_str());
        if (getCameraState(id8) == nullptr) {
            onDeviceStatusChanged(id8, CameraDeviceStatus::PRESENT);
        }
    }

    // Derive primary rear/front cameras, and filter their charactierstics.
    // This needs to be done after all cameras are enumerated and camera ids are sorted.
    if (SessionConfigurationUtils::IS_PERF_CLASS) {
        // Assume internal cameras are advertised from the same
        // provider. If multiple providers are registered at different time,
        // and each provider contains multiple internal color cameras, the current
        // logic may filter the characteristics of more than one front/rear color
        // cameras.
        Mutex::Autolock l(mServiceLock);
        filterSPerfClassCharacteristicsLocked();
    }

    return OK;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值