android camera hal3架构难点分析

还没想好标题起什么,先暂时记录一下看代码的过程中的一些老旧疑难,一起解决掉。

1.mtk更新了新的hal,新的架构似乎和google原生的比较像,有点难懂,尝试理解一下。

不清楚mtk代码是否需要保密,所以下面还是用google 原生的代码来理解:

先来看看熟悉的地方,provider对象的构造:\hardware\interfaces\camera\provider\2.4\default\CameraProvider_2_4.cpp

using android::hardware::camera::provider::V2_4::ICameraProvider;

extern "C" ICameraProvider* HIDL_FETCH_ICameraProvider(const char* name);

template<typename IMPL>
CameraProvider<IMPL>* getProviderImpl() {
    CameraProvider<IMPL> *provider = new CameraProvider<IMPL>();
    if (provider == nullptr) {
        ALOGE("%s: cannot allocate camera provider!", __FUNCTION__);
        return nullptr;
    }
    if (provider->isInitFailed()) {
        ALOGE("%s: camera provider init failed!", __FUNCTION__);
        delete provider;
        return nullptr;
    }
    return provider;
}

ICameraProvider* HIDL_FETCH_ICameraProvider(const char* name) {
    using namespace android::hardware::camera::provider::V2_4::implementation;
    ICameraProvider* provider = nullptr;
    if (strcmp(name, kLegacyProviderName) == 0) {
        provider = getProviderImpl<LegacyCameraProviderImpl_2_4>();
    } else if (strcmp(name, kExternalProviderName) == 0) {
        provider = getProviderImpl<ExternalCameraProviderImpl_2_4>();
    } else {
        ALOGE("%s: unknown instance name: %s", __FUNCTION__, name);
    }

    return provider;
}

熟悉的入口,不同的实现。可以发现构造provider的实现和之前稍有不同,这里是采用了构造模板类对象的方式来构造provider对象。之前的构造方式可以看这篇:

CameraProvider启动流程梳理_Evayangelion的博客-CSDN博客

接下来详细理解一下,这次provider对象是通过调用getProviderImpl函数返回的,可以看到getProviderImpl返回一个CameraProvider*的对象,这个对象通过构造CameraProvider模板类来实例化,同时传入的模板参数是ExternalCameraProvider_2_4或LegacyCameraProviderImpl_2_4,于是关注一下CameraProvider的构造,以模板参数IMPLExternalCameraProvider_2_4时为例继续下面的研究

template<typename IMPL>
struct CameraProvider : public ICameraProvider {
    CameraProvider() : impl() {}
    ~CameraProvider() {}

    // Caller must use this method to check if CameraProvider ctor failed
    bool isInitFailed() { return impl.isInitFailed(); }

    // Methods from ::android::hardware::camera::provider::V2_4::ICameraProvider follow.
    Return<Status> setCallback(const sp<ICameraProviderCallback>& callback) override {
        return impl.setCallback(callback);
    }

    Return<void> getVendorTags(getVendorTags_cb _hidl_cb) override {
        return impl.getVendorTags(_hidl_cb);
    }

    Return<void> getCameraIdList(getCameraIdList_cb _hidl_cb) override {
        return impl.getCameraIdList(_hidl_cb);
    }

    Return<void> isSetTorchModeSupported(isSetTorchModeSupported_cb _hidl_cb) override {
        return impl.isSetTorchModeSupported(_hidl_cb);
    }

    Return<void> getCameraDeviceInterface_V1_x(
            const hidl_string& cameraDeviceName,
            getCameraDeviceInterface_V1_x_cb _hidl_cb) override {
        return impl.getCameraDeviceInterface_V1_x(cameraDeviceName, _hidl_cb);
    }

    Return<void> getCameraDeviceInterface_V3_x(
            const hidl_string& cameraDeviceName,
            getCameraDeviceInterface_V3_x_cb _hidl_cb) override {
        return impl.getCameraDeviceInterface_V3_x(cameraDeviceName, _hidl_cb);
    }

private:
    IMPL impl;
};

首先可以可以看到CameraProvider类中有一个私有成员ExternalCameraProvider_2_4(模板参数IMPL)的对象,且这个对象在CameraProvider构造的时候在成员初始化列表中被初始化,CameraProvider中的所有函数也都是通过impl(也就是模板类ExternalCameraProvider_2_4的对象)来实现。相当于给ExternalCameraProvider_2_4包了一层MtkCameraProvider的壳,为什么要这样写呢,个人理解是为了让google原生的HAL实现保持原样,如果vendor需要添加自己的逻辑和函数的话,在自己的壳里添加和实现,从而避免破坏原生的HAL结构(这个结论未经证实)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值