Android camera open 流程( 五 )


而在打开相机时,该层的完整连路会被创建出来 。这一部分的主要调用逻辑如下图:

Android camera open 流程

文章插图
在 :: 中,实例化了一个。现在我们就从它的构造函数开始,继续探索打开相机的流程 。这一部分主要活动在层,这里分成与 HAL两侧来分析:
//av////api2/.cpp
CameraDeviceClient::CameraDeviceClient(const sp& cameraService,81const sp& remoteCallback,82const String16& clientPackageName,83const std::unique_ptr& clientFeatureId,84const String8& cameraId,85int cameraFacing,86int clientPid,87uid_t clientUid,88int servicePid) :89Camera2ClientBase(cameraService, remoteCallback, clientPackageName, clientFeatureId,90cameraId, /*API1 camera ID*/ -1,91cameraFacing, clientPid, clientUid, servicePid),92mInputStream(),93mStreamingRequestId(REQUEST_ID_NONE),94mRequestIdCounter(0) {9596ATRACE_CALL();97ALOGI("CameraDeviceClient %s: Opened", cameraId.string());}
//av/////.cpp
42template 43Camera2ClientBase::Camera2ClientBase(44const sp& cameraService,45const sp& remoteCallback,46const String16& clientPackageName,47const std::unique_ptr& clientFeatureId,48const String8& cameraId,49int api1CameraId,50int cameraFacing,51int clientPid,52uid_t clientUid,53int servicePid)://模板 TClientBase,在 CameraDeviceClient 继承 Camera2ClientBase 时被指定为 CameraDeviceClientBase54TClientBase(cameraService, remoteCallback, clientPackageName, clientFeatureId,55cameraId, api1CameraId, cameraFacing, clientPid, clientUid, servicePid),56mSharedCameraCallbacks(remoteCallback),57mDeviceVersion(cameraService->getDeviceVersion(TClientBase::mCameraIdStr)),//创建了一个 Camera3Device58mDevice(new Camera3Device(cameraId)),59mDeviceActive(false), mApi1CameraId(api1CameraId)60{61ALOGI("Camera %s: Opened. Client: %s (PID %d, UID %d)", cameraId.string(),62String8(clientPackageName).string(), clientPid, clientUid);6364mInitialClientPid = clientPid;65LOG_ALWAYS_FATAL_IF(mDevice == 0, "Device should never be NULL here.");66}
再回到类的方法,->(er)逻辑的实现,这里的就是了 。
在创建之后,会调用它的初始化函数:
//对外提供调用的初始化函数接口 initializestatus_t CameraDeviceClient::initialize(sp manager) {return initializeImpl(manager);}//初始化的具体实现函数,模板 TProviderPtr 在此处即是 CameraProviderManager 类templatestatus_t CameraDeviceClient::initializeImpl(TProviderPtr providerPtr) {ATRACE_CALL();status_t res;//首先将父类初始化,注意此处传入了 CameraProviderManagerres = Camera2ClientBase::initialize(providerPtr);if (res != OK) {return res;}String8 threadName;//给成员变量 mFrameProcessor赋值//它就是用来处理预览帧的,它继承了Thread类,相机的预览实际就是在一个无限循环当中不断的处理request来完成的 。mFrameProcessor = new FrameProcessorBase(mDevice);threadName = String8::format("CDU-%s-FrameProc", mCameraIdStr.string());mFrameProcessor->run(threadName.string());mFrameProcessor->registerListener(FRAME_PROCESSOR_LISTENER_MIN_ID,FRAME_PROCESSOR_LISTENER_MAX_ID,/*listener*/this,/*sendPartials*/true);return OK;}
Android camera open 流程

文章插图
接下来再看:::
80template 81status_t Camera2ClientBase::initialize(sp manager,82const String8& monitorTags) {83return initializeImpl(manager, monitorTags);84}85//TClientBase 对应 CameraDeviceClientBase,而 TProviderPtr 对应的是 CameraProviderManager86template 87template 88status_t Camera2ClientBase::initializeImpl(TProviderPtr providerPtr,89const String8& monitorTags) {90ATRACE_CALL();91ALOGV("%s: Initializing client for camera %s", __FUNCTION__,92TClientBase::mCameraIdStr.string());93status_t res;94//调用 CameraDeviceClientBase 的 startCameraOps 方法,检查 ops 的权限95// Verify ops permissions96res = TClientBase::startCameraOps();97if (res != OK) {98return res;99}100101if (mDevice == NULL) {102ALOGE("%s: Camera %s: No device connected",103__FUNCTION__, TClientBase::mCameraIdStr.string());104return NO_INIT;105}106//初始化 Camera3Device 的实例,注意此处传入了 CameraProviderManager107res = mDevice->initialize(providerPtr, monitorTags);108if (res != OK) {109ALOGE("%s: Camera %s: unable to initialize device: %s (%d)",110__FUNCTION__, TClientBase::mCameraIdStr.string(), strerror(-res), res);111return res;112}113114wp weakThis(this);//在 Camera3Device 实例中设置 Notify 回调115res = mDevice->setNotifyCallback(weakThis);116117return OK;118}