camera frame work v3 note
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的更多相关文章
- iOS编程(双语版)-视图-Frame/Bounds/Center
1. Frame 每个视图都有一个frame属性,它是CGRect结构,它描述了视图所在的矩形在其父视图中的位置. (屏幕坐标系默认的原点在左上角,x轴向右伸展,y轴向下伸展) 设置frame通常通过 ...
- Android 用MediaCodec实现视频硬解码(转)
本文向你讲述如何用android标准的API (MediaCodec)实现视频的硬件编解码.例程将从摄像头采集视频开始,然后进行H264编码,再解码,然后显示.我将尽量讲得简短而清晰,不展示 那些不相 ...
- 解决OpenCV JavaCameraView相机preview方向问题
网上找了很多解决都是有问题的,研究了半天源码解决了这个问题.我是从整个相机启动和数据传输的过程着手的,这里捡重点介绍一下,最后会贴上修改后的两个源文件. 首先要知道一个概念. 图里的小圆圈是Home按 ...
- VI ORB-SLAM初始化与VINS初始化对比(将vi orb-slam初始化方法移植到vins中)
初始化时需要求出的变量:相机和imu外参r t.重力g.尺度s.陀螺仪和加速度计偏置ba bg. 下面对两种算法初始化的详细步骤进行对比: 求陀螺仪偏置bg 求解公式相同,求解方法不同.公式如下,VI ...
- 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 ...
- python库的tkinter带你进入GUI世界(计算器简单功能)
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 一个处女座的程序猿 PS:如有需要Python学习资料的小伙伴可以加 ...
- iOS的一些面试题分析总结(0)
虽然一些东西在实际工作中我们是很少用到的,但是面试确实会经常问到一些我们不常用的东西,所以说有时候看一看还是有必要的,一方面面试也是很重要的一件事,另一方面某些情况下也能帮我们查漏补缺. 一.NSNo ...
- IOS TextField伴随键盘移动
这篇文章介绍的是一个简单而又实用的小方法. 我想对于登陆时的一些效果大家应该都不会陌生. 今天就介绍一下,当开始输入TextField文本时键盘弹出TextField伴随键盘移动的实现. 先看一下演示 ...
- [iOS基础控件 - 6.9.1] 聊天界面Demo 代码
框架: 所有代码文件: Model: // // Message.h // QQChatDemo // // Created by hellovoidworld on 14/12/8. // ...
随机推荐
- MATLAB使用fft求取给定音频信号的频率
一段10s立体声音频,采样率位8000Hz,已知频率为1000Hz clc; clear; [data, Fs] = audioread('1khz_stereo_8000.wav'); fs=Fs; ...
- hdu 4050(概率dp)
算是挺简单的一道概率dp了,如果做了前面的聪聪于可可的话,这题不需要什么预处理,直接概率dp就行了... #include <stdio.h> #include <stdlib.h& ...
- CentOS下搭建LNMP+WordPress+http2.0教程
此文是本人CentOS下搭建WordPress的一些笔记,环境搭建时间::将看过的几篇文章总结下来,形成一条龙长文.不用大家再找来找去. 本文大概分为此几部分: 一.基础命令更新: 二.服务器加速(非 ...
- jq 之Autocomplete 引发联想及思考
前情纪要:JQuery UI 是以 JQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互.动画.特效和可更换主题的可视控件,这些控件主要包括:Accordion,Au ...
- 【BZOJ2259】[Oibh]新型计算机 最短路
[BZOJ2259][Oibh]新型计算机 Description Tim正在摆弄着他设计的“计算机”,他认为这台计算机原理很独特,因此利用它可以解决许多难题. 但是,有一个难题他却解决不了,是这台计 ...
- vue+node+mongoDB 火车票H5(四)---完成静态页面
各项配置都好了,就可以开始写静态页面了,先别急着写,看一下页面又哪些公用的部分可以提取出来的,统一放到components组件文件夹中 header头部文件夹放一些头部常用组件,如首页的banner切 ...
- Eclipse MyBatis Generator插件安装
目录 Eclipse MyBatis Generator插件安装 Eclipse MyBatis Generator插件安装 1.进入Eclipse Marketplace [Help] -> ...
- vitess元数据跨机房灾备解决方案
测试使用vitess的时候发现vitess元数据的实现有多种方案,etcd, etcd2, zk,zk2, 由于刚开始测试的时候使用的是基于k8s集群+etcd的,以下就分步说明灾备实现方案: 1. ...
- UIButton+Block
UIButton的一个Category,使用block处理UIControlEvent事件,如常用的TouchUpInside等.代码非原创,也是从网上看到的,用到了实际项目中,目前还没发现什么问题. ...
- python线程池/进程池创建
进程池 import time from concurrent.futures import ProcessPoolExecutor def task(arg): time.sleep(2) prin ...