OpenCamera 流程分析
打开相机流程从CameraService开始分析:
上层打开相机时会调用connectDevice函数,在其中构造CameraDeviceClient实例,并初始化。
bool overrideForPerfClass = SessionConfigurationUtils::targetPerfClassPrimaryCamera(
mPerfClassPrimaryCameraIds, cameraId.string(), targetSdkVersion);
if(!(ret = makeClient(this, cameraCb, clientPackageName, clientFeatureId,
cameraId, api1CameraId, facing, orientation,
clientPid, clientUid, getpid(),
deviceVersion, effectiveApiLevel, overrideForPerfClass,
/*out*/&tmp)).isOk()) {
return ret;
}
client = static_cast<CLIENT*>(tmp.get());
LOG_ALWAYS_FATAL_IF(client.get() == nullptr, "%s: CameraService in invalid state",
__FUNCTION__);
err = client->initialize(mCameraProviderManager, mMonitorTags);
在CameraDeviceClient构造方法中会创建一个Camera2ClientBase实例,mCameraDevice也会在Camera2ClientBase方法中构建。
Camera2ClientBase(cameraService, remoteCallback, clientPackageName, clientFeatureId,
cameraId, /*API1 camera ID*/ -1, cameraFacing, sensorOrientation,
clientPid, clientUid, servicePid, overrideForPerfClass),
mInputStream(),
mStreamingRequestId(REQUEST_ID_NONE),
mRequestIdCounter(0),
mOverrideForPerfClass(overrideForPerfClass) {
接着CameraDeviceClient的initilaze方法
//CameraDeivce的初始化方法就在这里,Hal层就是在这进入的
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);
//获取Deviceinfo
const CameraMetadata &deviceInfo = mDevice->info();
camera_metadata_ro_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);
}
CameraClientBase会调用Camera3Device的initialize()方法。
该方法主要做了2件事:
1.openSession
status_t res = manager->openSession(mId.string(), this,
/*out*/ &session);
2.new RequestThread
mRequestThread = new RequestThread(
this, mStatusTracker, mInterface, sessionParamKeys, mUseHalBufManager);
先分析openSession,new RequestThread后面再分析
openSession 通过CameraProvider最终会进入到CameraDeviceImpl中执行open()函数和CreateSession(),open回去执行CameraModule的open,然后会依次执行SprdCamera3Factory.open->SprdCamera3HWI.open,SprdCameraEMIf.startCameraIfNecessary(),最后会走到cmr_oem的camera_init_internal,之后就是各种硬件的初始化
ret = camera_sensor_init(oem_handle, is_autotest);
if (ret) {
CMR_LOGE("failed to init sensor %ld", ret);
goto exit;
}
ret = camera_grab_init(oem_handle);
if (ret) {
CMR_LOGE("failed to init grab %ld", ret);
goto sensor_deinit;
}
ret = camera_setting_init(oem_handle);
if (ret) {
CMR_LOGE("failed to init setting %ld", ret);
goto grab_deinit;
}
ret = camera_res_init(oem_handle);
if (ret) {
CMR_LOGE("failed to init res %ld", ret);
goto setting_deinit;
}
ret = camera_isp_init(oem_handle);
if (ret) {
CMR_LOGE("failed to init isp %ld", ret);
goto res_deinit;
}
打开相机大概就是这些,回过头来看openSession的地方
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();
}
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());
}
});
}
createSession()实际就是创建了一个CameraDeviceSession,看起来没什么特殊的。继续回溯到Camera3Device.cpp中
在成功创建session后,依次会创建3个对象 Camera3BufferManager,RequestThread,PreparerThread。
其中RequestThread是用于循环处理请求的的一个线程,PreparerThread线程尚未清楚是做什么的,后面一起分析。