Android camera: camera initialize

frameworks/base/core/java/android/app/SystemServiceRegistry.java

registerService(Context.CAMERA_SERVICE, CameraManager.class,
                new CachedServiceFetcher<CameraManager>() {
           @Override
            public CameraManager createService(ContextImpl ctx) {
                return new CameraManager(ctx);
            }});
 
 

注册了系统服务CAMERA_SERVICE:实现了camera API2

camera API2 -> camera service -> camera-provider->hw_module(CAMERA_HARDWARE_MODULE_ID)->---

camera的初始化包括两部分:camera-provide初始化和camera service初始化

camera-provider的初始化获得了camera numbers和camera info等。


设备状态的改变使怎样通知到framework层的
struct  CameraProvider : public ICameraProvider, public camera_module_callbacks_t {

}

/**
* Callback functions for the camera HAL module to use to inform the framework
* of changes to the camera subsystem.
void (*camera_device_status_change)(const struct camera_module_callbacks*,
int camera_id,
int new_status);
   
void (*torch_mode_status_change)(const struct camera_module_callbacks*,
const char* camera_id,int new_status);

      */

CameraProvider::CameraProvider() :
        camera_module_callbacks_t({sCameraDeviceStatusChange,
                                   sTorchModeStatusChange}) {
    mInitFailed = initialize();
}
设置了两个在固定的函数sCameraDeviceStatusChange/ sTorchModeStatusChange
 
 

把hal层固定的函数设置到底层,当camera改变时调用这里设置的固定函数。
mModule->setCallbacks(this);
 
 
void CameraProvider::sCameraDeviceStatusChange(
        const struct camera_module_callbacks* callbacks,
        int camera_id,
        int new_status) {/×强制类型转换:根据继承关系得到CameraProvide的指针×/
    CameraProvider* cp = const_cast<CameraProvider*>(
            static_cast<const CameraProvider*>(callbacks));

    char cameraId[kMaxCameraIdLen];
    snprintf(cameraId, sizeof(cameraId), "%d", camera_id);
    std::string cameraIdStr(cameraId);
    cp->mCameraStatusMap[cameraIdStr] = (camera_device_status_t) new_status;
    if (cp->mCallbacks != nullptr) {
        CameraDeviceStatus status = (CameraDeviceStatus) new_status;
        for (auto const& deviceNamePair : cp->mCameraDeviceNames) {
            if (cameraIdStr.compare(deviceNamePair.first) == 0) {
                cp->mCallbacks->cameraDeviceStatusChange(
                        deviceNamePair.second, status);
            }
        }
    }
}

CameraProvider的调用依赖mCallbacks变量,它是怎样赋值的?
// Methods from ::android::hardware::camera::provider::V2_4::ICameraProvider follow.
Return<Status> CameraProvider::setCallback(const sp<ICameraProviderCallback>& callback)  {
    Mutex::Autolock _l(mCbLock);
    mCallbacks = callback;
    return Status::OK;
}
mCallbacks的赋值是通过binder接口ICameraProvider的setCallback。

看先mCallbacks是怎样赋值的?也就是setCallback是怎样被调用的。

frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp

CameraProviderManager::ProviderInfo::initialize()
->  mInterface -> setCallback ( this );就把camera service 层实现的device/torch status change传递到camera HAL层

camera service层的cameraDeviceStatusChange的实现又调用了framework层注册的listener:

cameraDeviceStatusChange-> listener->onDeviceStatusChanged

camera service的初始化:获得底层服务camera-provider并获得底层camera信息


status_t CameraProviderManager::addProviderLocked(const std::string& newProvider, bool expected) {
    /*获得访问HIDL的binder接口*/
    sp<provider::V2_4::ICameraProvider> interface;
    interface = mServiceProxy->getService(newProvider);

    sp<ProviderInfo> providerInfo = new ProviderInfo(newProvider, interface, this);
    status_t res = providerInfo->initialize();

    mProviders.push_back(providerInfo);

    return OK;
}

赋值mInterface 通过mInterface访问hidl层代码
CameraProviderManager::ProviderInfo::ProviderInfo(
        const std::string &providerName,
        sp<provider::V2_4::ICameraProvider>& interface,
        CameraProviderManager *manager) :
        mProviderName(providerName),
        mInterface(interface),
        mProviderTagid(generateVendorTagId(providerName)),
        mUniqueDeviceCount(0),
        mManager(manager) {
    (void) mManager;
}

如上面mInterface->setCallback(this);

猜你喜欢

转载自blog.csdn.net/u011279649/article/details/80063794