1 android_atomic_write(level, &gLogLevel);

原子写操作。

2 构造函数和onFirstRef

onFirstRef 会在构造函数运行后执行,这个是在mediaserver 这个进程启动时运行的,具体为何可查看代码。

3  ICameraServiceListener

class ICameraServiceListener : public IInterface

定义了接口,一定会有构建bp和bn,形成进程间通讯。

bn 是具体的实现, bp 则是通过binder 调用bn实现功能。

这个实现就是

onStatusChanged(Status status, int32_t cameraId)=0

BpCameraServiceListener 实现了onStatusChanged,而BnCameraServiceListener 没有实现,所以,所有从BnCameraServiceListener继承的累都必须

实现这个函数。也就是说,我们调用的一直是bp,但好像bn在执行。一般这样的调用都有一个明显的特征

listener->onStatusChanged(mStatusList[i], i);
而lisrener 是
const sp<ICameraServiceListener>& listener

这样调用的是bp,那么就得找到bn,来看这个函数。一般是到ICameraServiceListener.c 中找BnCameraServiceListener 然后找到谁继承BnCameraServiceListener,在这里找到onStatusChanged。

4 连接到camera

android_hardware_Camera_native_setup---->

    sp<Camera> camera = Camera::connect(cameraId, clientName,
Camera::USE_CALLING_UID);

调用到cameraserver的conect

status_t CameraService::connect(
const sp<ICameraClient>& cameraClient,
int cameraId,
const String16& clientPackageName,
int clientUid,
/*out*/
sp<ICamera>& device)

比较有意思的是第一个和最后一个参数。

第一个参数是回调函数的bp, 最后一个函数竟然是camera的bp

连接的主要工作就是

client = new Camera2Client(this, cameraClient,
                    clientPackageName, cameraId,
                    facing, callingPid, clientUid, getpid(),
                    deviceVersion);

mClient[cameraId] = client;

client->initialize(mModule)

构造时调函数的bp会被保存。

这样camera 就连接上了,并返回了camera cloass obj。

camera.cpp 是icamera的一个bp,同时也是回调的bn

Camera2Client.cpp 是icamera的bn,是回调的bp。

5 设备的创建

CameraDeviceFactory::createDevice  Camera2Client 构造中调用

根据设备api的不同,有Camera3Device  Camera2Device

camera 设备构造时camera3_callback_ops 被赋值,之后会交给hal 用的。

这个结构有连个操作,一个是通知,用于error 和 shutter ,另一个是返回请求结果 sProcessCaptureResult

6 设备的初始化

Camera2Client::initialize  --------->

Camera2ClientBase::initialize --->mDevice->initialize

然后

mStatusTracker = new StatusTracker(this);

mRequestThread = new RequestThread(this, mStatusTracker, device);

这是两个线程。

Camera2Client::initialize  里启动了

mStreamingProcessor

mFrameProcessor

mCaptureSequencer

mJpegProcessor

mZslProcessorThread

mCallbackProcessor

线程

最新文章

  1. ASP.NET Core应用针对静态文件请求的处理[5]: DefaultFilesMiddleware中间件如何显示默认页面
  2. Quartz.net开源作业调度框架使用详解
  3. css3美化复选框checkbox
  4. Those who are not capable of Control their moods are not supposed to be ready for their baby.
  5. MyEclipse/Eclipse中修改包的显示结构
  6. jquery 源码解析
  7. ZOJ Monthly, July 2015
  8. MVC 菜鸟学习记录1
  9. ubuntu 14.04链接无线路由,建立无线和有线链接
  10. Mindjet.MindManager“参数错误”解决办法,适用于9.0、10.0和14.0
  11. hibernate annotation注解 主键ID自增长
  12. python mongodb 读写CSV文件
  13. 第 15 章 组合模式【Composite Pattern】
  14. Java基础知识强化06:使用BigDecimal计算阶乘1+1/2!+1/3!+……
  15. 转:2014年最酷的30个JavaScript库
  16. 在Tableau中自定义版块地图 (Polygon)
  17. Java学习之二分查找算法
  18. HDU 5624 KK&#39;s Reconstruction
  19. SQL---索引---创建索引
  20. 微信小程序手机预览请求不到数据(最后一条不明所以)

热门文章

  1. 【BZOJ4503】两个串 FFT
  2. oracle用于判断时间条件为当天的写法(当前日期加一天)
  3. Java Json API:Gson使用简单入门
  4. tomcat8以上管理页面提示403问题
  5. CentOS7防火墙firewalld
  6. pycharm调试scrapy
  7. Linux(3)- 用户管理、文件与目录权限、常用命令、Linux软件包管理
  8. 1 TensorFlow入门笔记之基础架构
  9. xlrd、xlwt操作execl表格
  10. Mac 一键显示所有隐藏文件 不要那么六好吧