还没想好标题起什么,先暂时记录一下看代码的过程中的一些老旧疑难,一起解决掉。
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的构造,以模板参数IMPL为ExternalCameraProvider_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结构(这个结论未经证实)。