Android camera open 流程( 七 )

< capabilities.count; i++) {221uint8_t capability = capabilities.data.u8[i];222if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_OFFLINE_PROCESSING) {223mSupportOfflineProcessing = true;224}225}226227mInterface = new HalInterface(session, queue, mUseHalBufManager, mSupportOfflineProcessing);228std::string providerType;229mVendorTagId = manager->getProviderTagIdLocked(mId.string());230mTagMonitor.initialize(mVendorTagId);231if (!monitorTags.isEmpty()) {232mTagMonitor.parseTagsToMonitor(String8(monitorTags));233}234235// Metadata tags needs fixup for monochrome camera device version less236// than 3.5.237hardware::hidl_version maxVersion{0,0};238res = manager->getHighestSupportedVersion(mId.string(), &maxVersion);239if (res != OK) {240ALOGE("%s: Error in getting camera device version id: %s (%d)",241__FUNCTION__, strerror(-res), res);242return res;243}244int deviceVersion = HARDWARE_DEVICE_API_VERSION(245maxVersion.get_major(), maxVersion.get_minor());246247bool isMonochrome = false;248for (size_t i = 0; i < capabilities.count; i++) {249uint8_t capability = capabilities.data.u8[i];250if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) {251isMonochrome = true;252}253}254mNeedFixupMonochromeTags = (isMonochrome && deviceVersion < CAMERA_DEVICE_API_VERSION_3_5);255256return initializeCommonLocked();257}
初始化函数调用了 r 的方法,开启了远端的 ,最后继续调用ed完成初始化 。
r
//av/////r.cpp
status_t CameraProviderManager::openSession(const std::string &id,375const sp& callback,376/*out*/377sp *session) {378379std::lock_guard lock(mInterfaceMutex);//首先调用 findDeviceInfoLocked,获取 HAL3 相关的 DeviceInfo3,//这个东西在服务启动与初始化的时候就已经创建出来,并保存下来了 。//具体说就是它是在CameraService进行启动时,初始化CameraProviderManager对象的逻辑中,//通过addProviderLocked方法生成具体的DeviceInfo对象,添加到mProviders成员变量中的381auto deviceInfo = findDeviceInfoLocked(id,382/*minVersion*/ {3,0}, /*maxVersion*/ {4,0});383if (deviceInfo == nullptr) return NAME_NOT_FOUND;384385auto *deviceInfo3 = static_cast(deviceInfo);386sp parentProvider = deviceInfo->mParentProvider.promote();387if (parentProvider == nullptr) {388return DEAD_OBJECT;389}390const sp provider = parentProvider->startProviderInterface();391if (provider == nullptr) {392return DEAD_OBJECT;393}394saveRef(DeviceMode::CAMERA, id, provider);395396Status status;397hardware::Return ret;398auto interface = deviceInfo3->startDeviceInterface<399CameraProviderManager::ProviderInfo::DeviceInfo3::InterfaceT>();400if (interface == nullptr) {401return DEAD_OBJECT;402}//通过远端调用 CameraDevice 的 open 方法,创建 CameraDeviceSession 实例//并将其本地调用接口通过入参session返回//DeviceInfo3 这个类的 mInterface 成员类型是 ICameraDevice,通过它可以调用远端 CameraDevice404ret = interface->open(callback, [&status, &session]405(Status s, const sp& cameraSession) {406status = s;407if (status == Status::OK) {408*session = cameraSession;409}410});411if (!ret.isOk()) {412removeRef(DeviceMode::CAMERA, id);413ALOGE("%s: Transaction error opening a session for camera device %s: %s",414__FUNCTION__, id.c_str(), ret.description().c_str());415return DEAD_OBJECT;416}417return mapToStatusT(status);}
HAL
/\\\\3.2\\.cpp
的实例实际上在初始化 HAL之后就存在了 。
前面说到,通过 r 中的接口,调用远端实例的 open 方法:
Return CameraDevice::open(const sp& callback,177ICameraDevice::open_cb _hidl_cb){178Status status = initStatus();179sp session = nullptr;180181if (callback == nullptr) {182ALOGE("%s: cannot open camera %s. callback is null!",183__FUNCTION__, mCameraId.c_str());184_hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);185return Void();186}187188if (status != Status::OK) {189// Provider will never pass initFailed device to client, so190// this must be a disconnected camera191ALOGE("%s: cannot open camera %s. camera is disconnected!",192__FUNCTION__, mCameraId.c_str());193_hidl_cb(Status::CAMERA_DISCONNECTED, nullptr);194return Void();195} else {196mLock.lock();197198ALOGV("%s: Initializing device for camera %d", __FUNCTION__, mCameraIdInt);199session = mSession.promote();200if (session != nullptr && !session->isClosed()) {201ALOGE("%s: cannot open an already opened camera!", __FUNCTION__);202mLock.unlock();203_hidl_cb(Status::CAMERA_IN_USE, nullptr);204return Void();205}206207/** Open HAL device */208status_t res;209camera3_device_t *device;210211ATRACE_BEGIN("camera3->open");212res = mModule->open(mCameraId.c_str(),213reinterpret_cast(&device));214ATRACE_END();215216if (res != OK) {217ALOGE("%s: cannot open camera %s!", __FUNCTION__, mCameraId.c_str());218mLock.unlock();219_hidl_cb(getHidlStatus(res), nullptr);220return Void();221}222223/** Cross-check device version */224if (device->common.version