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

线程

camera frame work v3 note的更多相关文章

  1. iOS编程(双语版)-视图-Frame/Bounds/Center

    1. Frame 每个视图都有一个frame属性,它是CGRect结构,它描述了视图所在的矩形在其父视图中的位置. (屏幕坐标系默认的原点在左上角,x轴向右伸展,y轴向下伸展) 设置frame通常通过 ...

  2. Android 用MediaCodec实现视频硬解码(转)

    本文向你讲述如何用android标准的API (MediaCodec)实现视频的硬件编解码.例程将从摄像头采集视频开始,然后进行H264编码,再解码,然后显示.我将尽量讲得简短而清晰,不展示 那些不相 ...

  3. 解决OpenCV JavaCameraView相机preview方向问题

    网上找了很多解决都是有问题的,研究了半天源码解决了这个问题.我是从整个相机启动和数据传输的过程着手的,这里捡重点介绍一下,最后会贴上修改后的两个源文件. 首先要知道一个概念. 图里的小圆圈是Home按 ...

  4. VI ORB-SLAM初始化与VINS初始化对比(将vi orb-slam初始化方法移植到vins中)

    初始化时需要求出的变量:相机和imu外参r t.重力g.尺度s.陀螺仪和加速度计偏置ba bg. 下面对两种算法初始化的详细步骤进行对比: 求陀螺仪偏置bg 求解公式相同,求解方法不同.公式如下,VI ...

  5. Video for Linux Two API Specification Revision 2.6.32【转】

    转自:https://www.linuxtv.org/downloads/legacy/video4linux/API/V4L2_API/spec-single/v4l2.html Video for ...

  6. python库的tkinter带你进入GUI世界(计算器简单功能)

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 一个处女座的程序猿 PS:如有需要Python学习资料的小伙伴可以加 ...

  7. iOS的一些面试题分析总结(0)

    虽然一些东西在实际工作中我们是很少用到的,但是面试确实会经常问到一些我们不常用的东西,所以说有时候看一看还是有必要的,一方面面试也是很重要的一件事,另一方面某些情况下也能帮我们查漏补缺. 一.NSNo ...

  8. IOS TextField伴随键盘移动

    这篇文章介绍的是一个简单而又实用的小方法. 我想对于登陆时的一些效果大家应该都不会陌生. 今天就介绍一下,当开始输入TextField文本时键盘弹出TextField伴随键盘移动的实现. 先看一下演示 ...

  9. [iOS基础控件 - 6.9.1] 聊天界面Demo 代码

    框架:   所有代码文件:   Model: // // Message.h // QQChatDemo // // Created by hellovoidworld on 14/12/8. // ...

随机推荐

  1. libevent(2)

    client.cpp // App02.cpp : 定义控制台应用程序的入口点. // #include <string.h> #include <errno.h> #incl ...

  2. quartz定时任务配置

    参考:http://www.cnblogs.com/kay/archive/2007/11/02/947372.html Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quar ...

  3. 通过创建脚本代替"scrapy crawl Test"命令

    文件结构: 1.在命令行scrapy crawl Test正常运行的条件下在项目的根目录创建start.py文件(注意目录,同scrapy.cfg文件一个目录): start.py源代码: # -*- ...

  4. Sublime text找不到.so文件

    在使用Sublime text打开一个android项目的时候,你会发现找不到.so文件. 解决方法: 点击Sublime text的Preferences,然后点击Settings,这时候出现设置的 ...

  5. 转!!java序列化

    1.序列化是干什么的?       简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object st ...

  6. Linux安装redis数据库及添加环境变量

    1.下载安装包 [root@localhost opt]# yum install wget [root@localhost opt]# wget http://download.redis.io/r ...

  7. Django的模型层(1)- 单表操作(下)

    一.查询表记录 在学习查询表记录之前,先了解一下QuerySet,这是一种类似列表的数据类型,是由ORM创建的.我们学习查询表记录的方法时,一定要明确哪些方法返回了QuerySet类型,哪些方法返回m ...

  8. servlet 通过 FileItem 实现多文件上传

    [本文简介] 一个servlet 多文件上传的简单例子. [依赖包] commons-fileupload-1.3.1.jar commons-io-2.2.jar [依赖包下载] commons-f ...

  9. (4.8)SET ANSI_NULLS ON、SET QUOTED_IDENTIFIER ON

    T-SQL支持在与空值进行比较时,允许比较运算符返回 TRUE 或 FALSE. 通过设置 ANSI_NULLS OFF 可将此选项激活.当 ANSI_NULLS 为 OFF 时,如果 ColumnA ...

  10. Kettle-1-安装配置

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wl101yjx/article/details/32921691 写在前面一: 数据仓库ETL工具有 ...