CameraService啓動流程-獲取ICameraProvider服務代理對象BpHwCameraProvider並由此獲取所有相機設備代理對象BpHwCameraDevice的流程

本文分析下CameraService獲取ICameraProvider代理對象BpHwCameraProvider的流程,以方便後邊分析CameraService與ICameraProvider的通訊方式及探究下其他進程是否也可以獲取ICameraProvider,直接與ICameraProvider通訊(即直接和HAL通訊)

cameraService啓動時,調用的方法第一個方法:

//frameworks\av\services\camera\libcameraservice\CameraService.cpp
void CameraService::onFirstRef()
{
    ALOGI("CameraService process starting");

    BnCameraService::onFirstRef();

    // Update battery life tracking if service is restarting
    BatteryNotifier& notifier(BatteryNotifier::getInstance());
    notifier.noteResetCamera();
    notifier.noteResetFlashlight();

    status_t res = INVALID_OPERATION;
    //和ICameraProvider通訊獲取設備上所有的機器
    res = enumerateProviders();
    if (res == OK) {
        mInitialized = true;
    }

    CameraService::pingCameraServiceProxy();
}

enumerateProviders()函數會與ICameraProvider通訊已獲取所有的相機設備

status_t CameraService::enumerateProviders() {
    status_t res;
    Mutex::Autolock l(mServiceLock);

    if (nullptr == mCameraProviderManager.get()) {
        mCameraProviderManager = new CameraProviderManager();
        //initialize會與ICameraProvider通訊,獲取所有相機設備
        res = mCameraProviderManager->initialize(this);
    }

    mNumberOfCameras = mCameraProviderManager->getCameraCount();
    mNumberOfNormalCameras =
            mCameraProviderManager->getAPI1CompatibleCameraCount();

    // 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();

    ...
}

enumerateProviders()函數首先創建了CameraProviderManager對象,然後調用其初始話函數initialize,
initialize有兩個形參:

//frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.h
  //proxy 默認值&sHardwareServiceInteractionProxy
    status_t initialize(wp<StatusListener> listener,
            ServiceInteractionProxy *proxy = &sHardwareServiceInteractionProxy);

initialize函數的第二個形參存在默認值 &sHardwareServiceInteractionProxy,CameraService就是使用了該默認值,下邊分析下sHardwareServiceInteractionProxy:
其類圖:
在這裏插入圖片描述
其實現代碼:

//frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.h
    struct HardwareServiceInteractionProxy : public ServiceInteractionProxy {
        virtual bool registerForNotifications(
                const std::string &serviceName,
                const sp<hidl::manager::V1_0::IServiceNotification>
                &notification) override {
       //是通過hardware::camera::provider::V2_4::ICameraProvider的靜態方法registerForNotifications
       //註冊Notifications的
            return hardware::camera::provider::V2_4::ICameraProvider::registerForNotifications(
                    serviceName, notification);
        }
        virtual sp<hardware::camera::provider::V2_4::ICameraProvider> getService(
                const std::string &serviceName) override {
             //是通過hardware::camera::provider::V2_4::ICameraProvider的靜態方法getService
             //以Transport::HWBINDER方式獲取ICameraProvider代理對象BpHwCameraProvider
            return hardware::camera::provider::V2_4::ICameraProvider::getService(serviceName);
        }
    }

接續分析下mCameraProviderManager->initialize(this)

//frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.cpp
status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener,
        ServiceInteractionProxy* proxy) {
    std::lock_guard<std::mutex> lock(mInterfaceMutex);
    if (proxy == nullptr) {
        ALOGE("%s: No valid service interaction proxy provided", __FUNCTION__);
        return BAD_VALUE;
    }
    //是CameraService對象指針
    mListener = listener;
    //mServiceProxy 就是&sHardwareServiceInteractionProxy靜態變量
    mServiceProxy = proxy;
     ...
    // See if there's a passthrough HAL, but let's not complain if there's not
    //addProviderLocked首先獲取ICameraProvider服務,然後開始遍歷所有相機設備,kLegacyProviderName爲"legacy/0"
    addProviderLocked(kLegacyProviderName, /*expected*/ false);

    return OK;
}

繼續分析下addProviderLocked

//frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.cpp
//newProvider爲"legacy/0";expected爲false
status_t CameraProviderManager::addProviderLocked(const std::string& newProvider, bool expected) {
    for (const auto& providerInfo : mProviders) {
        if (providerInfo->mProviderName == newProvider) {
            ALOGW("%s: Camera provider HAL with name '%s' already registered", __FUNCTION__,
                    newProvider.c_str());
            return ALREADY_EXISTS;
        }
    }
    //通過sHardwareServiceInteractionProxy對象獲取ICameraProvider服務代理BpHwCameraProvider
    //實際是執行的是hardware::camera::provider::V2_4::ICameraProvider::getService("legacy/0")
    sp<provider::V2_4::ICameraProvider> interface;
    interface = mServiceProxy->getService(newProvider);

   ...
    //封裝上一步獲取的ICameraProvider代理對象BpHwCameraProvider爲interface爲ProviderInfo對象
    //newProvider爲"legacy/0";interface爲BpHwCameraProvider代理對象;this爲CameraProviderManager對象
    sp<ProviderInfo> providerInfo =
            new ProviderInfo(newProvider, interface/*provider::V2_4::ICameraProvider*/, this);
     //調用ProviderInfo的initialize方法
    status_t res = providerInfo->initialize();
    if (res != OK) {
        return res;
    }

    mProviders.push_back(providerInfo);

    return OK;
}

首先接着分析下getService

//out\soong\.intermediates\hardware\interfaces\camera\provider\2.4\[email protected]_genc++\gen\android\hardware\camera\provider\2.4\CameraProviderAll.cpp
// static
//getStub的默認值是false
::android::sp<ICameraProvider> ICameraProvider::getService(const std::string &serviceName, const bool getStub) {
    using ::android::hardware::defaultServiceManager;
    using ::android::hardware::details::waitForHwService;
    using ::android::hardware::getPassthroughServiceManager;
    using ::android::hardware::Return;
    using ::android::sp;
    using Transport = ::android::hidl::manager::V1_0::IServiceManager::Transport;

    sp<ICameraProvider> iface = nullptr;
   //獲取hwservicemanager代理對象BpHwServiceManager
    const sp<::android::hidl::manager::V1_0::IServiceManager> sm = defaultServiceManager();
    if (sm == nullptr) {
        ALOGE("getService: defaultServiceManager() is null");
        return nullptr;
    }
   //獲取Transport屬性
   //CameraProvider的transport屬性爲Transport::HWBINDER
   //屬性定義在device\qcom\projectName\manifest.xml
    Return<Transport> transportRet = sm->getTransport(ICameraProvider::descriptor, serviceName);

    if (!transportRet.isOk()) {
        ALOGE("getService: defaultServiceManager()->getTransport returns %s", transportRet.description().c_str());
        return nullptr;
    }
    //通過上一步分析可知vintfHwbinder爲true、vintfPassthru爲false
    Transport transport = transportRet;
    const bool vintfHwbinder = (transport == Transport::HWBINDER);
    const bool vintfPassthru = (transport == Transport::PASSTHROUGH);

...
//getStub爲false,vintfHwbinder爲true,滿足該條件
    for (int tries = 0; !getStub && (vintfHwbinder || (vintfLegacy && tries == 0)); tries++) {
        if (tries > 1) {
            ALOGI("getService: Will do try %d for %s/%s in 1s...", tries, ICameraProvider::descriptor, serviceName.c_str());
            sleep(1);
        }
        if (vintfHwbinder && tries > 0) {
            waitForHwService(ICameraProvider::descriptor, serviceName);
        }
        //通過BpHwServiceManager代理對象sm的get方法獲取CameraProvider代理對象BpHwCameraProvider
        //ICameraProvider::descriptor爲[email protected]::ICameraProvider
        //serviceName爲legacy/0
        Return<sp<::android::hidl::base::V1_0::IBase>> ret = 
                sm->get(ICameraProvider::descriptor, serviceName);
        if (!ret.isOk()) {
            ALOGE("ICameraProvider: defaultServiceManager()->get returns %s", ret.description().c_str());
            break;
        }
        sp<::android::hidl::base::V1_0::IBase> base = ret;
        if (base == nullptr) {
            if (tries > 0) {
                ALOGW("ICameraProvider: found null hwbinder interface");
            }continue;
        }
        //通過ICameraProvider::castFrom將base轉換爲BpHwCameraProvider,稍後重點分析下
        Return<sp<ICameraProvider>> castRet = ICameraProvider::castFrom(base, true /* emitError */);
        ...
        iface = castRet;
        if (iface == nullptr) {
            ALOGW("ICameraProvider: received incompatible service; bug in hwservicemanager?");
            break;
        }
        return iface;
    }
...
}

接着分析下ICameraProvider::castFrom

//out\soong\.intermediates\hardware\interfaces\camera\provider\2.4\[email protected]_genc++\gen\android\hardware\camera\provider\2.4\CameraProviderAll.cpp
// static 
::android::hardware::Return<::android::sp<ICameraProvider>> ICameraProvider::castFrom(const ::android::sp<::android::hidl::base::V1_0::IBase>& parent, bool emitError) {
    return ::android::hardware::details::castInterface<ICameraProvider, ::android::hidl::base::V1_0::IBase, BpHwCameraProvider>(
            parent, "[email protected]::ICameraProvider", emitError);
}

接着分析下castInterface

//system\libhidl\transport\include\hidl\HidlTransportSupport.h
//IChild爲ICameraProvider;IParent爲IBase;BpChild爲BpHwCameraProvider
//parent爲BpHwServiceManager::get方法獲的IBase代理對象BpHwBase
//childIndicator爲[email protected]::ICameraProvider
//emitError爲true
template <typename IChild, typename IParent, typename BpChild>
Return<sp<IChild>> castInterface(sp<IParent> parent, const char* childIndicator, bool emitError) {
    if (parent.get() == nullptr) {
        // casts always succeed with nullptrs.
        return nullptr;
    }
    //判斷是否可以轉換
    Return<bool> canCastRet = details::canCastInterface(parent.get(), childIndicator, emitError);
    if (!canCastRet.isOk()) {
        // call fails, propagate the error if emitError
        return emitError
                ? details::StatusOf<bool, sp<IChild>>(canCastRet)
                : Return<sp<IChild>>(sp<IChild>(nullptr));
    }

    if (!canCastRet) {
        return sp<IChild>(nullptr); // cast failed.
    }
    //該處parent->isRemote()爲true
    //將parent封裝爲BpHwCameraProvider對象
    // TODO b/32001926 Needs to be fixed for socket mode.
    if (parent->isRemote()) {
        // binderized mode. Got BpChild. grab the remote and wrap it.
        return sp<IChild>(new BpChild(toBinder<IParent>(parent)));
    }
    // Passthrough mode. Got BnChild and BsChild.
    return sp<IChild>(static_cast<IChild *>(parent.get()));
}

通過上邊的分析,可以知道CameraService調用ICameraProvider::getService("legacy/0")
最終獲得是ICameraProvider代理對象BpHwCameraProvider

接着繼續分析下ProviderInfo::initialize()

//frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.cpp
status_t CameraProviderManager::ProviderInfo::initialize() {
    status_t res = parseProviderName(mProviderName, &mType, &mId);

    ALOGI("Connecting to new camera provider: %s, isRemote? %d",
            mProviderName.c_str(), mInterface->isRemote());
    //mInterface是上一步通過mServiceProxy->getService(newProvider)
    //獲取的provider::V2_4::ICameraProvider代理對象BpHwCameraProvider
    hardware::Return<Status> status = mInterface->setCallback(this);

    ...
    hardware::Return<bool> linked = mInterface->linkToDeath(this, /*cookie*/ mId);

    //獲取所有相機設備的idStatus和cameraDeviceNames(即camera ID??待確定),
    //然後賦值給status和devices
    // Get initial list of camera devices, 
    //if any
    std::vector<std::string> devices;
    hardware::Return<void> ret = mInterface->getCameraIdList([&status, &devices](
            Status idStatus,
            const hardware::hidl_vec<hardware::hidl_string>& cameraDeviceNames) {
        status = idStatus;
        if (status == Status::OK) {
            for (size_t i = 0; i < cameraDeviceNames.size(); i++) {
                devices.push_back(cameraDeviceNames[i]);
            }
        } });

    ...
    sp<StatusListener> listener = mManager->getStatusListener();
    //遍歷上一步獲取的設備
    for (auto& device : devices) {
        std::string id;
        status_t res = addDevice(device,
                hardware::camera::common::V1_0::CameraDeviceStatus::PRESENT, &id);
    }
    ...
    return OK;
}

繼續分析下addDevice

status_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name,
        CameraDeviceStatus initialStatus, /*out*/ std::string* parsedId) {

    ALOGI("Enumerating new camera device: %s", name.c_str());

    uint16_t major, minor;
    std::string type, id;
    //根據獲取的cameraDeviceNames,解析出其major,minor,type,id四個變量
    status_t res = parseDeviceName(name, &major, &minor, &type, &id);
    ....

    std::unique_ptr<DeviceInfo> deviceInfo;
    //sdm845 的major 爲3(待確定??)
    switch (major) {
        case 1:
            deviceInfo = initializeDeviceInfo<DeviceInfo1>(name, mProviderTagid,
                    id, minor);
            break;
        case 3:
            //根據上一步獲取的name,id等信息,創建DeviceInfo對象指針
            deviceInfo = initializeDeviceInfo<DeviceInfo3>(name, mProviderTagid,
                    id, minor);
            break;
        default:
            ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__,
                    name.c_str(), major);
            return BAD_VALUE;
    }
    if (deviceInfo == nullptr) return BAD_VALUE;
    deviceInfo->mStatus = initialStatus;

    mDevices.push_back(std::move(deviceInfo));
    //如果所有的都成功,在返回解析出的id作爲camera ID使用
    if (parsedId != nullptr) {
        *parsedId = id;
    }
    return OK;
}

先分析下deviceInfo,它其實是父類
定義如下:

        // Basic device information, common to all camera devices
        struct DeviceInfo {
            const std::string mName;  // Full instance name
            const std::string mId;    // ID section of full name
            const hardware::hidl_version mVersion;
            const metadata_vendor_id_t mProviderTagid;

            const hardware::camera::common::V1_0::CameraResourceCost mResourceCost;

            hardware::camera::common::V1_0::CameraDeviceStatus mStatus;

            bool hasFlashUnit() const { return mHasFlashUnit; }
            virtual status_t setTorchMode(bool enabled) = 0;
            virtual status_t getCameraInfo(hardware::CameraInfo *info) const = 0;
            virtual bool isAPI1Compatible() const = 0;
            virtual status_t getCameraCharacteristics(CameraMetadata *characteristics) const {
                (void) characteristics;
                return INVALID_OPERATION;
            }

            DeviceInfo(const std::string& name, const metadata_vendor_id_t tagId,
                    const std::string &id, const hardware::hidl_version& version,
                    const hardware::camera::common::V1_0::CameraResourceCost& resourceCost) :
                    mName(name), mId(id), mVersion(version), mProviderTagid(tagId),
                    mResourceCost(resourceCost),
                    mStatus(hardware::camera::common::V1_0::CameraDeviceStatus::PRESENT),
                    mHasFlashUnit(false) {}
            virtual ~DeviceInfo();
        protected:
            bool mHasFlashUnit;

            template<class InterfaceT>
            static status_t setTorchMode(InterfaceT& interface, bool enabled);
        }

其兩個子類DeviceInfo1 和DeviceInfo3
DeviceInfo1 定義如下:

        // HALv1-specific camera fields, including the actual device interface
        struct DeviceInfo1 : public DeviceInfo {
            //類型定義InterfaceT爲hardware::camera::device::V1_0::ICameraDevice,之後會用到
            typedef hardware::camera::device::V1_0::ICameraDevice InterfaceT;
            const sp<InterfaceT> mInterface;

            virtual status_t setTorchMode(bool enabled) override;
            virtual status_t getCameraInfo(hardware::CameraInfo *info) const override;
            //In case of Device1Info assume that we are always API1 compatible
            virtual bool isAPI1Compatible() const override { return true; }
            DeviceInfo1(const std::string& name, const metadata_vendor_id_t tagId,
                    const std::string &id, uint16_t minorVersion,
                    const hardware::camera::common::V1_0::CameraResourceCost& resourceCost,
                    sp<InterfaceT> interface);
            virtual ~DeviceInfo1();
        private:
            CameraParameters2 mDefaultParameters;
        }

DeviceInfo3 定義如下:

        struct DeviceInfo3 : public DeviceInfo {
        //類型定義InterfaceT 爲hardware::camera::device::V3_2::ICameraDevice,之後會用到
            typedef hardware::camera::device::V3_2::ICameraDevice InterfaceT;
            const sp<InterfaceT> mInterface;

            virtual status_t setTorchMode(bool enabled) override;
            virtual status_t getCameraInfo(hardware::CameraInfo *info) const override;
            virtual bool isAPI1Compatible() const override;
            virtual status_t getCameraCharacteristics(
                    CameraMetadata *characteristics) const override;

            DeviceInfo3(const std::string& name, const metadata_vendor_id_t tagId,
                    const std::string &id, uint16_t minorVersion,
                    const hardware::camera::common::V1_0::CameraResourceCost& resourceCost,
                    sp<InterfaceT> interface);
            virtual ~DeviceInfo3();
        private:
            CameraMetadata mCameraCharacteristics;
        }

接着繼續這隻分析下initializeDeviceInfo

//是一個模板函數,上一步調用傳入的類型參數是DeviceInfo3
template<class DeviceInfoT>
std::unique_ptr<CameraProviderManager::ProviderInfo::DeviceInfo>
    CameraProviderManager::ProviderInfo::initializeDeviceInfo(
        const std::string &name, const metadata_vendor_id_t tagId,
        const std::string &id, uint16_t minorVersion) const {
    Status status;
    //獲取ICameraDevice對象(auto 的類型是device::V3_2::ICameraDevice)
    // DeviceInfoT::InterfaceT的類型是hardware::camera::device::V3_2::ICameraDevice
    auto cameraInterface = getDeviceInterface<typename DeviceInfoT::InterfaceT>(name);
    if (cameraInterface == nullptr) return nullptr;
    //通過上一步獲取的device::V3_2::ICameraDevice的代理對象
    //獲取getResourceCost
    CameraResourceCost resourceCost;
    cameraInterface->getResourceCost([&status, &resourceCost](
        Status s, CameraResourceCost cost) {
                status = s;
                resourceCost = cost;
            });

    //根據獲得name,id,device::V3_2::ICameraDevice代理對象cameraInterface,
    //封裝爲一個DeviceInfo3對象
    return std::unique_ptr<DeviceInfo>(
        new DeviceInfoT(name, tagId, id, minorVersion, resourceCost,
                cameraInterface));
}

接着分析下 auto cameraInterface = getDeviceInterface<typename DeviceInfoT::InterfaceT>(name);
根據上一步分析,調用的模板函數的具體化如下

template<>
sp<device::V3_2::ICameraDevice>
CameraProviderManager::ProviderInfo::getDeviceInterface
        <device::V3_2::ICameraDevice>(const std::string &name) const {
    Status status;
    sp<device::V3_2::ICameraDevice> cameraInterface;
    hardware::Return<void> ret;
     //mInterface是上一步通過mServiceProxy->getService(newProvider)
    //獲取的provider::V2_4::ICameraProvider代理對象BpHwCameraProvider
    // getCameraDeviceInterface_V3_x獲取的是device::V3_2::ICameraDevice代理對象BpHwCameraDevice
    ret = mInterface->getCameraDeviceInterface_V3_x(name, [&status, &cameraInterface](
        Status s, sp<device::V3_2::ICameraDevice> interface) {
                status = s;
                cameraInterface = interface;
            });
....
返回獲取的device::V3_2::ICameraDevice代理對象BpHwCameraDevice
    return cameraInterface;
}

至此分析完成了cameraservice獲取ICameraProvider服務代理對象BpHwCameraProvider並由此獲取所有相機設備ICameraDevice代理對象BpHwCameraDevice流程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章