Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9846
  • 博文数量: 3
  • 博客积分: 55
  • 博客等级: 民兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-18 19:15
文章分类
文章存档

2012年(2)

2011年(1)

我的朋友

分类: LINUX

2012-12-11 14:57:47



(该图转自他人,源作者不详)
该图很清晰的说明了Camera启动时从上到下的调用过程。
ICameraClient/ICameraSerice/ICamera是接口类,其功能真正实现是在继承了BnCamera*的Camera*中,而BpCamera*对象是在远程端用Binder来和Camera*对象通信的。

第四步比较复杂,解释如下:
init.rc脚本会加载mediaserver,mediaserver中会创建CameraService。
getCameraService时会创建sp类型,其实就是在CameraClient端创建CameraService的proxy,创建sp强引用类型会调用CameraService::onFirstRef->hw_get_module
->hw_get_module_by_class(class_id:a string “Camera” orother name):
It will search variant_keys[i].camera.so in HAL_LIBRARY_PATH, then load(dlopen) it, and set hw_module_t.
static const char *variant_keys[] = {"ro.hardware", "ro.product.board","ro.board.platform","ro.arch"};
从以上看出在getCameraService时会加载板子支持的Camera lib

c->mCamera = cs->connect,是BpCameraService->Connect,在其内部会创建BpCamera,BpCamera由CameraService的内部类Client来继承并实现;下面再说Client。
BpCameraService->Connect中同样会通过binder机制调用BnCameraService->Connect其 是虚函数,最终会调用BnCameraService的真正实现CameraService->connect,connect里会new client,并将该client的proxy返回给c->mCamera,而在构造Client时会使用创建CameraSerice时得到的 hw_module_t来get_camera_info,并new CameraHardwareInterface,initialize(真正openhardware),因此说CameraService中的 Client对象真正实现了camera需要和HAL打交道到部分。

通过以上步骤,CameraClient就真正和Client(真正实现了camera需要和HAL打交道到部分)端联系起来了

哇哦,好拐!别把CameraClient和Client搞混。
总结:
1. 系统启动创建CameraService
2. 启动camera时创建CameraClient(即Camera的实例)
3. getCameraServiceCameraClient取得CameraService的proxy
4. 创建sp时会调用onFirstRef->hw_get_module->hw_get_module_by_class,来加载Camera Library取得hw_module_t
5. CameraService通过connect, 首先会取得CameraClient的proxy(),保存mCameraClient,然后根据CameraID之前取得的结构体hw_module_t调用libraryt创建CameraHardwareInterface,并initialize(open hardware),再用hardware这个参数new其对应的Client,每个Client对应一个真实sensor
6. CameraClient通过cs->Connect会取得Client的proxy
7. 上层CameraClient会通过Client的proxy来执行StartPreview等各种动作,Client会通过CameraClient的proxy来handlePreviewData等

下图是参考Camera为另一个项目画的各层类的继承关系图,将WaveManager改为Camera,该图即为Camera各层类的继承和通信关系红色双箭头表示Binder通信,黑色箭头表示继承自,绿色箭头表示持有。



阅读(3007) | 评论(0) | 转发(1) |
0

上一篇:Linux Multi-Core boot up and Hotplug

下一篇:没有了

给主人留下些什么吧!~~