美文网首页
Android 11 C++层Camer2打开调用流程

Android 11 C++层Camer2打开调用流程

作者: Lazy1 | 来源:发表于2022-05-18 16:52 被阅读0次

    在connectHelper方法中的makeClient中创建 CameraDeviceClient

    Status CameraService::makeClient(const sp<CameraService>& cameraService,
            const sp<IInterface>& cameraCb, const String16& packageName,
            const std::unique_ptr<String16>& featureId, const String8& cameraId, int api1CameraId,
            
        if (halVersion < 0 || halVersion == deviceVersion) {
        
             // Camera2 API route  走到了这里创建了CameraDeviceClient
                    sp<hardware::camera2::ICameraDeviceCallbacks> tmp =
                            static_cast<hardware::camera2::ICameraDeviceCallbacks*>(cameraCb.get());
                    *client = new CameraDeviceClient(cameraService, tmp, packageName, featureId,
                            cameraId, facing, clientPid, clientUid, servicePid);
                }
                break;
              default:
                // Should not be reachable
                ALOGE("Unknown camera device HAL version: %d", deviceVersion);
                return STATUS_ERROR_FMT(ERROR_INVALID_OPERATION,
                        "Camera device \"%s\" has unknown HAL version %d",
                        cameraId.string(), deviceVersion);
            }
        } 
        return Status::ok();
    }
    

    CameraDeviceClient 类中调用初始化了 Camera2ClientBase 的initialize方法

    
    
    status_t CameraDeviceClient::initializeImpl(TProviderPtr providerPtr, const String8& monitorTags) {
        ATRACE_CALL();
        status_t res;
        // 初始化了 Camera2ClientBase  ,  模板 TProviderPtr 在此处即是 CameraProviderManager 类。
        res = Camera2ClientBase::initialize(providerPtr, monitorTags);
        if (res != OK) {
            return res;
        }
    
        String8 threadName;
      // 处理图像返回
        mFrameProcessor = new FrameProcessorBase(mDevice);
        threadName = String8::format("CDU-%s-FrameProc", mCameraIdStr.string());
        mFrameProcessor->run(threadName.string());
    
        mFrameProcessor->registerListener(camera2::FrameProcessorBase::FRAME_PROCESSOR_LISTENER_MIN_ID,
                                          camera2::FrameProcessorBase::FRAME_PROCESSOR_LISTENER_MAX_ID,
                                          /*listener*/this,
                                          /*sendPartials*/true);
    
        auto deviceInfo = mDevice->info();
        camera_metadata_entry_t physicalKeysEntry = deviceInfo.find(
                ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS);
        if (physicalKeysEntry.count > 0) {
            mSupportedPhysicalRequestKeys.insert(mSupportedPhysicalRequestKeys.begin(),
                    physicalKeysEntry.data.i32,
                    physicalKeysEntry.data.i32 + physicalKeysEntry.count);
        }
    
        mProviderManager = providerPtr;
        return OK;
    }
    
    

    Camera2ClientBase 的 initializeImpl 方法

    template <typename TClientBase>    //对应 CameraDeviceClientBase
    template <typename TProviderPtr>  // CameraProviderManager
    status_t Camera2ClientBase<TClientBase>::initializeImpl(TProviderPtr providerPtr,
            const String8& monitorTags) {
        ATRACE_CALL();
        ALOGV("%s: Initializing client for camera %s", __FUNCTION__,
              TClientBase::mCameraIdStr.string());
        status_t res;
    
        // 检查相机的ops 权限
        res = TClientBase::startCameraOps();
        if (res != OK) {
            return res;
        }
    
        if (mDevice == NULL) {
            ALOGE("%s: Camera %s: No device connected",
                    __FUNCTION__, TClientBase::mCameraIdStr.string());
            return NO_INIT;
        }
        //  初始化 Camera3Device 的实例,注意此处传入了 CameraProviderManager。
        res = mDevice->initialize(providerPtr, monitorTags);
        if (res != OK) {
            ALOGE("%s: Camera %s: unable to initialize device: %s (%d)",
                    __FUNCTION__, TClientBase::mCameraIdStr.string(), strerror(-res), res);
            return res;
        }
    
        wp<NotificationListener> weakThis(this);
        // Camera3Device  中设置回调通知
        res = mDevice->setNotifyCallback(weakThis);
    
        return OK;
    }
    

    Camera3Device 中的initialize方法

    status_t Camera3Device::initialize(sp<CameraProviderManager> manager, const String8& monitorTags) {
        ATRACE_CALL();
        Mutex::Autolock il(mInterfaceLock);
        Mutex::Autolock l(mLock);
    
        ALOGV("%s: Initializing HIDL device for camera %s", __FUNCTION__, mId.string());
        if (mStatus != STATUS_UNINITIALIZED) {
            CLOGE("Already initialized!");
            return INVALID_OPERATION;
        }
        if (manager == nullptr) return INVALID_OPERATION;
    
        sp<ICameraDeviceSession> session;
        ATRACE_BEGIN("CameraHal::openSession");
      //  这里便进入到  CameraProviderManager 的openSession 中去了
        status_t res = manager->openSession(mId.string(), this,
                /*out*/ &session);
        ATRACE_END();
        if (res != OK) {
            SET_ERR_L("Could not open camera session: %s (%d)", strerror(-res), res);
            return res;
        }
    }
    

    CameraProviderManager

    status_t CameraProviderManager::openSession(const std::string &id,
            const sp<device::V1_0::ICameraDeviceCallback>& callback,
            /*out*/
            sp<device::V1_0::ICameraDevice> *session) {
    
        std::lock_guard<std::mutex> lock(mInterfaceMutex);
    
        auto deviceInfo = findDeviceInfoLocked(id,
                /*minVersion*/ {1,0}, /*maxVersion*/ {2,0});
        if (deviceInfo == nullptr) return NAME_NOT_FOUND;
    
        auto *deviceInfo1 = static_cast<ProviderInfo::DeviceInfo1*>(deviceInfo);
        sp<ProviderInfo> parentProvider = deviceInfo->mParentProvider.promote();
        if (parentProvider == nullptr) {
            return DEAD_OBJECT;
        }
        const sp<provider::V2_4::ICameraProvider> provider = parentProvider->startProviderInterface();
        if (provider == nullptr) {
            return DEAD_OBJECT;
        }
        saveRef(DeviceMode::CAMERA, id, provider);
    
        auto interface = deviceInfo1->startDeviceInterface<
                CameraProviderManager::ProviderInfo::DeviceInfo1::InterfaceT>();
        if (interface == nullptr) {
            return DEAD_OBJECT;
        }
    
       // 在这一层调用到 HAl 层的  对应的CameraDevice2 的open
        hardware::Return<Status> status = interface->open(callback);
        if (!status.isOk()) {
            removeRef(DeviceMode::CAMERA, id);
            ALOGE("%s: Transaction error opening a session for camera device %s: %s",
                    __FUNCTION__, id.c_str(), status.description().c_str());
            return DEAD_OBJECT;
        }
        if (status == Status::OK) {
            *session = interface;
        }
        return mapToStatusT(status);
    }
    

    HAL Service CameraDevice

    CameraDevice 的实例实际上在初始化在HAL 层 LegacyCameraProviderImpl 初始化的时候,已经初始化相应的版本了

    Return<void> CameraDevice::open(const sp<ICameraDeviceCallback>& callback,
            ICameraDevice::open_cb _hidl_cb)  {
        Status status = initStatus();
        sp<CameraDeviceSession> session = nullptr;
    
        if (callback == nullptr) {
            ALOGE("%s: cannot open camera %s. callback is null!",
                    __FUNCTION__, mCameraId.c_str());
            _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);
            return Void();
        }
    
        if (status != Status::OK) {
            // Provider will never pass initFailed device to client, so
            // this must be a disconnected camera
            ALOGE("%s: cannot open camera %s. camera is disconnected!",
                    __FUNCTION__, mCameraId.c_str());
            _hidl_cb(Status::CAMERA_DISCONNECTED, nullptr);
            return Void();
        } else {
            mLock.lock();
    
            ALOGV("%s: Initializing device for camera %d", __FUNCTION__, mCameraIdInt);
            session = mSession.promote();
            if (session != nullptr && !session->isClosed()) {
                ALOGE("%s: cannot open an already opened camera!", __FUNCTION__);
                mLock.unlock();
                _hidl_cb(Status::CAMERA_IN_USE, nullptr);
                return Void();
            }
    
            /** Open HAL device */
            status_t res;
            camera3_device_t *device;
    
            ATRACE_BEGIN("camera3->open");
            // 这里就是拿到的驱动 对象封装,然后调用open 打开camera
            res = mModule->open(mCameraId.c_str(),
                    reinterpret_cast<hw_device_t**>(&device));
            ATRACE_END();
    
            if (res != OK) {
                ALOGE("%s: cannot open camera %s!", __FUNCTION__, mCameraId.c_str());
                mLock.unlock();
                _hidl_cb(getHidlStatus(res), nullptr);
                return Void();
            }
    
            /** Cross-check device version */
            if (device->common.version < CAMERA_DEVICE_API_VERSION_3_2) {
                ALOGE("%s: Could not open camera: "
                        "Camera device should be at least %x, reports %x instead",
                        __FUNCTION__,
                        CAMERA_DEVICE_API_VERSION_3_2,
                        device->common.version);
                device->common.close(&device->common);
                mLock.unlock();
                _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);
                return Void();
            }
    
            struct camera_info info;
            res = mModule->getCameraInfo(mCameraIdInt, &info);
            if (res != OK) {
                ALOGE("%s: Could not open camera: getCameraInfo failed", __FUNCTION__);
                device->common.close(&device->common);
                mLock.unlock();
                _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);
                return Void();
            }
           // 创建了 CameraDeviceSession
            session = createSession(
                    device, info.static_camera_characteristics, callback);
            if (session == nullptr) {
                ALOGE("%s: camera device session allocation failed", __FUNCTION__);
                mLock.unlock();
                _hidl_cb(Status::INTERNAL_ERROR, nullptr);
                return Void();
            }
            if (session->isInitFailed()) {
                ALOGE("%s: camera device session init failed", __FUNCTION__);
                session = nullptr;
                mLock.unlock();
                _hidl_cb(Status::INTERNAL_ERROR, nullptr);
                return Void();
            }
            mSession = session;
    
            IF_ALOGV() {
                session->getInterface()->interfaceChain([](
                    ::android::hardware::hidl_vec<::android::hardware::hidl_string> interfaceChain) {
                        ALOGV("Session interface chain:");
                        for (const auto& iface : interfaceChain) {
                            ALOGV("  %s", iface.c_str());
                        }
                    });
            }
            mLock.unlock();
        }
        _hidl_cb(status, session->getInterface());
        return Void();
    }
    
    

    相关文章

      网友评论

          本文标题:Android 11 C++层Camer2打开调用流程

          本文链接:https://www.haomeiwen.com/subject/qtqaurtx.html