Android camera open 流程( 八 )

< CAMERA_DEVICE_API_VERSION_3_2) {225ALOGE("%s: Could not open camera: "226"Camera device should be at least %x, reports %x instead",227__FUNCTION__,228CAMERA_DEVICE_API_VERSION_3_2,229device->common.version);230device->common.close(&device->common);231mLock.unlock();232_hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);233return Void();234}235236struct camera_info info;237res = mModule->getCameraInfo(mCameraIdInt, &info);238if (res != OK) {239ALOGE("%s: Could not open camera: getCameraInfo failed", __FUNCTION__);240device->common.close(&device->common);241mLock.unlock();242_hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);243return Void();244}245246session = createSession(247device, info.static_camera_characteristics, callback);248if (session == nullptr) {249ALOGE("%s: camera device session allocation failed", __FUNCTION__);250mLock.unlock();251_hidl_cb(Status::INTERNAL_ERROR, nullptr);252return Void();253}254if (session->isInitFailed()) {255ALOGE("%s: camera device session init failed", __FUNCTION__);256session = nullptr;257mLock.unlock();258_hidl_cb(Status::INTERNAL_ERROR, nullptr);259return Void();260}261mSession = session;262263IF_ALOGV() {264session->getInterface()->interfaceChain([](265::android::hardware::hidl_vec<::android::hardware::hidl_string> interfaceChain) {266ALOGV("Session interface chain:");267for (const auto& iface : interfaceChain) {268ALOGV("%s", iface.c_str());269}270});271}272mLock.unlock();273}274_hidl_cb(status, session->getInterface());275return Void();}
该方法的参数,第一个是对象,它的使用方法和我们之前讲的应用层调用时在中传入的类型的是一样的,端拿到这个之后,就可以针对需要的节点事件回调应用层,而这里是在回调,道理是一样的 。这个参数最终赋值给HAL层中的类的成员变量了;第二个参数是类型,从它的命名中可以看出来,它也是一个回调函数,非常方便,就像一个函数指针一样,它在r一侧中像一个结构体一样传了过来,当类中的open执行完成后,就会将对象作为参数回传到r这一侧,我们就拿到了,后续对的操作都是通过这个对象来进行中转完成的 。
是在 HAL初始化时就已经配置好的,它对从库中加载的HAL 接口进行了一层封装 。从这里往下就会一路走到 HWL的构造流程去
211ATRACE_BEGIN("camera3->open");212res = mModule->open(mCameraId.c_str(),213reinterpret_cast(&device));214ATRACE_END();
创建并让内部成员持有,具体实现的函数为
246session = createSession(247device, info.static_camera_characteristics, callback);248if (session == nullptr) {249ALOGE("%s: camera device session allocation failed", __FUNCTION__);250mLock.unlock();251_hidl_cb(Status::INTERNAL_ERROR, nullptr);252return Void();253}254if (session->isInitFailed()) {255ALOGE("%s: camera device session init failed", __FUNCTION__);256session = nullptr;257mLock.unlock();258_hidl_cb(Status::INTERNAL_ERROR, nullptr);259return Void();260}261mSession = session;
??????????????中的实现是直接创建了一个。当然在其构造函数中会调用内部的初始化函数,然后会进入 HAL 接口层 HWL 的初始化流程

Android camera open 流程

文章插图
HAL连接到HAL
Android camera open 流程

文章插图

Android camera open 流程

文章插图
( to:)