CameraAPI2分析.docx
- 文档编号:6970824
- 上传时间:2023-01-13
- 格式:DOCX
- 页数:86
- 大小:655.94KB
CameraAPI2分析.docx
《CameraAPI2分析.docx》由会员分享,可在线阅读,更多相关《CameraAPI2分析.docx(86页珍藏版)》请在冰豆网上搜索。
CameraAPI2分析
Camera-API2分析
D
Camera通信,而其中的通信通过ICameraDeviceUser来实现,接下来分析ICameraDeviceUser的实现。
3、ICameraDeviceUser.aidl的通信实现
Java层与C++CameraService层之间的通信,通过封装了一个CameraDeviceUser来实现,它只是在Java层使用了AIDL技术来实现Client,即在Java层维护了一个CameraDevice,这样的好处是响应速度更快,因为这样不需要通过每次进入Native层来完成通信,而可以通过Java层的IPCBinder机制即可完成。
即API2.0通过AIDL实现一个接口ICameraDeviceUser,从而在Java层维护一个Cameraproxy,之后的通信都是通过此代理CameraDeviceImpl来实现。
相关代码及目录:
ICameraDeviceUser.aidl:
frameworks/base/core/java/android/hardware/camera2
ICameraDeviceUser.cpp:
frameworks/av/camera/camera2
CameraDeviceImpl.java:
frameworks/base/core/java/android/hardware/camera2/impl
获取CameraDevice的Java层代理的核心代码如下:
//CameraManager.java
privateCameraDeviceopenCameraDeviceUserAsync(...){
//初始化CameraJava层代理对象
CameraDevicedevice=null;
try{
synchronized(mLock){
//初始化ICameraDeviceUser
ICameraDeviceUsercameraUser=null;
//初始化具体的CameraDevice代理
android.hardware.camera2.impl.CameraDeviceImpldeviceImpl=newandroid.hardware.
camera2.impl.CameraDeviceImpl(cameraId,callback,handler,characteristics);
BinderHolderholder=newBinderHolder();
ICameraDeviceCallbackscallbacks=deviceImpl.getCallbacks();
...
try{
//如果支持HAL3.2+的devices
if(supportsCamera2ApiLocked(cameraId)){
//获取CameraService
ICameraServicecameraService=CameraManagerGlobal.get().getCameraService();
...
//连接设备
cameraService.connectDevice(callbacks,id,mContextgetOpPackageName()
USE_CALLING_UID,holder);
//通过Binder获得打开的Camera设备返回的Camera代理
cameraUser=ICameraDeviceUser.Stub.asInterface(holder.getBinder());
}else{//否则用遗产API
cameraUser=CameraDeviceUserShim.connectBinderShim(callbacks,id);
}
}catch(...){
...
}
//包装代理对象
deviceImpl.setRemoteDevice(cameraUser);
device=deviceImpl;
}
}catch(...){
...
}
返回Camera代理
returndevice;
}
由代码可知,首先获取CameraService,然后通过它来开启Camera,而开启成功后,C++层会返回一个Cameradevice代理对象,此处即为ICameraDeviceUser,所以在Java层对其进行相应的封装,变成一个CameraDeviceImpl对象,此后,只要需要对Camera进行操作,都会调用CameraDeviceImpl对象的相关方法,并通过ICameraDeviceUser以及JavaIPCBinder来与本地的Cameradevice进行通信,至此,CameraAPI2.0的框架就分析结束了,具体的操作,如Camera的初始化,preview,capture等流程的分析,请看文章开始时,所列出的分析链接。
二.android6.0源码分析之Camera2HAL分析
在上一篇文章对CameraAPI2.0的框架进行了简单的介绍,其中CameraHAL屏蔽了底层的实现细节,并且为上层提供了相应的接口,具体的HAL的原理,个人觉得老罗的文章Android硬件抽象层(HAL)概要介绍和学习计划分析的很详细,这里不做分析,本文将只分析CameraHAL的初始化等相关流程。
1、CameraHAL的初始化
CameraHAL的初始加载是在Native的CameraService初始化流程中的,而CameraService初始化是在Main_mediaServer.cpp的main方法开始的:
//Main_mediaServer.cpp
intmain(intargc__unused,char**argv){
…
sp
:
self());
//获取ServieManager
sp
ALOGI("ServiceManager:
%p",sm.get());
AudioFlinger:
:
instantiate();
//初始化media服务
MediaPlayerService:
:
instantiate();
//初始化资源管理服务
ResourceManagerService:
:
instantiate();
//初始化Camera服务
CameraService:
:
instantiate();
//初始化音频服务
AudioPolicyService:
:
instantiate();
SoundTriggerHwService:
:
instantiate();
//初始化Radio服务
RadioService:
:
instantiate();
registerExtensions();
//开始线程池
ProcessState:
:
self()->startThreadPool();
IPCThreadState:
:
self()->joinThreadPool();
}
其中,CameraService继承自BinderService,instantiate也是在BinderService中定义的,此方法就是调用publish方法,所以来看publish方法:
//BinderService.h
staticstatus_tpublish(boolallowIsolated=false){
sp
//将服务添加到ServiceManager
returnsm->addService(String16(SERVICE:
:
getServiceName()),newSERVICE(),allowIsolated);
}
这里,将会把CameraService服务加入到ServiceManager进行管理。
而在前面的文章android6.0源码分析之CameraAPI2.0简介中,需要通过Java层的IPCBinder来获取此CameraService对象,在此过程中会初始CameraService的sp类型的对象,而对于sp,此处不做过多的分析,具体的可以查看深入理解Android卷Ⅰ中的第五章中的相关内容。
此处,在CameraService的构造时,会调用CameraService的onFirstRef方法:
//CameraService.cpp
voidCameraService:
:
onFirstRef()
{
BnCameraService:
:
onFirstRef();
...
camera_module_t*rawModule;
//根据CAMERA_HARDWARE_MODULE_ID(字符串camera)来获取camera_module_t对象
interr=hw_get_module(CAMERA_HARDWARE_MODULE_ID,
(consthw_module_t**)&rawModule);
//创建CameraModule对象
mModule=newCameraModule(rawModule);
//模块初始化
err=mModule->init();
...
//通过Module获取Camera的数量
mNumberOfCameras=mModule->getNumberOfCameras();
mNumberOfNormalCameras=mNumberOfCameras;
//初始化闪光灯
mFlashlight=newCameraFlashlight(*mModule,*this);
status_tres=mFlashlight->findFlashUnits();
intlatestStrangeCameraId=INT_MAX;
for(inti=0;i //初始化CameraID String8cameraId=String8: : format("%d",i); structcamera_infoinfo; boolhaveInfo=true; //获取Camera信息 status_trc=mModule->getCameraInfo(i,&info); ... //如果Module版本高于2.4,找出冲突的设备参数 if(mModule->getModuleApiVersion()>=CAMERA_MODULE_API_VERSION_2_4&&haveInfo){ cost=info.resource_cost; conflicting_devices=info.conflicting_devices; conflicting_devices_length=info.conflicting_devices_length; } //将冲突设备加入冲突set集中 std: : set for(size_ti=0;i conflicting.emplace(String8(conflicting_devices[i])); } ... } //如果Module的API大于2.1,则设置回调 if(mModule->getModuleApiVersion()>=CAMERA_MODULE_API_VERSION_2_1){ mModule->setCallbacks(this); } //若大于2.2,则设置供应商的Tag if(mModule->getModuleApiVersion()>=CAMERA_MODULE_API_VERSION_2_2){ setUpVendorTags(); } //将此服务注册到CameraDeviceFactory CameraDeviceFactory: : registerService(this); CameraService: : pingCameraServiceProxy(); } onFirstRef方法中,首先会通过HAL框架的hw_get_module来获取CameraModule对象,然后会对其进行相应的初始化,并会进行一些参数的设置,如camera的数量,闪光灯的初始化,以及回调函数的设置等,到这里,Camera2HAL的模块就初始化结束了,下面给出初始化时序图: 2、CameraHAL的open流程分析 通过阅读android6.0源码发现,它提供了高通的Camera实现,并且提供了高通的Camera库,也实现了高通的CameraHAL的相应接口,对于高通的Camera,它在后台会有一个守护进程daemon,daemon是介于应用和驱动之间翻译ioctl的中间层(委托处理)。 本节将以Camera中的open流程为例,来分析CameraHAL的工作过程,在应用对硬件发出open请求后,会通过CameraHAL来发起open请求,而CameraHAL的open入口在QCamera2Hal.cpp进行了定义: //QCamera2Hal.cpp camera_module_tHAL_MODULE_INFO_SYM={ //它里面包含模块的公共方法信息 common: camera_common, get_number_of_cameras: qcamera: : QCamera2Factory: : get_number_of_cameras, get_camera_info: qcamera: : QCamera2Factory: : get_camera_info, set_callbacks: qcamera: : QCamera2Factory: : set_callbacks, get_vendor_tag_ops: qcamera: : QCamera3VendorTags: : get_vendor_tag_ops, open_legacy: qcamera: : QCamera2Factory: : open_legacy, set_torch_mode: NULL, init: NULL, reserved: {0} }; statichw_module_tcamera_common={ tag: HARDWARE_MODULE_TAG, module_api_version: CAMERA_MODULE_API_VERSION_2_3, hal_api_version: HARDWARE_HAL_API_VERSION, id: CAMERA_HARDWARE_MODULE_ID, name: "QCameraModule", author: "QualcommInnovationCenterInc", //它的方法数组里绑定了open接口 methods: &qcamera: : QCamera2Factory: : mModuleMethods, dso: NULL, reserved: {0} }; structhw_module_methods_tQCamera2Factory: : mModuleMethods={ //open方法的绑定 open: QCamera2Factory: : camera_device_open, }; CameraHAL层的open入口其实就是camera_device_open方法: //QCamera2Factory.cpp intQCamera2Factory: : camera_device_open(conststructhw_module_t*module,constchar*id, structhw_device_t**hw_device){ ... returngQCamera2Factory->cameraDeviceOpen(atoi(id),hw_device); } 它调用了cameraDeviceOpen方法,而其中的hw_device就是最后要返回给应用层的CameraDeviceImpl在CameraHAL层的对象,继续分析cameraDeviceOpen方法: //QCamera2Factory.cpp intQCamera2Factory: : cameraDeviceOpen(intcamera_id,structhw_device_t**hw_device){ ... //Camera2采用的CameraHAL版本为HAL3.0 if(mHalDescriptors[camera_id].device_version==CAMERA_DEVICE_API_VERSION_3_0){ //初始化QCamera3HardwareInterface对象,这里构造函数里将会进行configure_streams以及 //process_capture_result等的绑定 QCamera3HardwareInterface*hw=newQCamera3HardwareInterface( mHalDescriptors[camera_id].cameraId,mCallbacks); //通过QCamera3HardwareInterface来打开Camera rc=hw->openCamera(hw_device); ... }elseif(mHalDescriptors[camera_id].device_version==CAMERA_DEVICE_API_VERSION_1_0){ //HALAPI为2.0 QCamera2HardwareInterface*hw=newQCamera2HardwareInterface((uint32_t)camera_id); rc=hw->openCamera(hw_device); ... }else{ ... } returnrc; } 此方法有两个关键点: 一个是QCamera3HardwareInterface对象的创建,它是用户空间与内核空间进行交互的接口;另一个是调用它的openCamera方法来打开Camera,下面将分别进行分析。 2.1QCamera3HardwareInterface构造函数分析 在它的构造函数里面有一个关键的初始化,即mCameraDevice.ops=&mCameraOps,它会定义Device操作的接口: //QCamera3HWI.cpp camera3_device_ops_tQCamera3HardwareInterface: : mCameraOps={ initialize: QCamera3HardwareInterface: : initialize, //配置流数据的相关处理 configure_streams: QCamera3HardwareInterface: : configure_streams, register_stream_buffers: NULL, construct_default_request_settings: QCamera3HardwareInterface: : construct_default_request_settings, //处理结果的接口 process_capture_request: QCamera3HardwareInterface: : process_capture_request, get_metadata_vendor_tag_ops: NULL, dump: QCamera3HardwareInterface: : dump, flush: QCamera3HardwareInterface: : flush, reserved: {0}, }; 其中,会在configure_streams中配置好流的处理handle: //QCamera3HWI.cpp intQCamera3HardwareInterface: : configure_streams(conststructcamera3_device*device, camera3_stream_configuration_t*stream_list){ //获得QCamera3HardwareInterface对象 QCamera3HardwareInterface*hw=reinterpret_cast ... //调用它的configureStreams进行配置 intrc=hw->configureStreams(stream_list); .. returnrc; } 继续追踪configureStream方法: //QCamera3HWI.cpp intQCamera3HardwareInterface: : configureStreams(camera3_stream_configuration_t*streamList){ ... //初始化Camera版本 al_version=CAM_HAL_V3; ... //开始配置stream ... //初始化相关Channel为NULL if(mMetadataChannel){ deletemMetadataChannel; mMetadataChannel=NULL; } if(mSupportChannel){ deletemSupportChannel; mSupportChannel=NULL; } if(mAnalysisChannel){ deletemAnalysisChannel; mAnalysisChannel=NULL; } //创建MetadataChannel,并对其进行初始化 mMetadataChannel=newQCamera3MetadataChannel(mCameraHandle->camera_handle, mCameraHandle->ops,captureResultCb,&gCamCapability[mCameraId]->padding_info, CAM_QCOM_FEATURE_NONE,this); ... //初始化
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CameraAPI2 分析