QCamera学习笔记
- 格式:doc
- 大小:24.00 KB
- 文档页数:4
camera知识点记录Vsync = Dummy Line = VTotal = VTS = V_Size + V_Blank // 帧长; 不占用曝光时间,但是会影响帧率(FPS)Hsync = Dummy Pixel = HTotal = HTS = H_Size + H_Blank // 行长; 会增加曝光时间,会影响帧率(FPS)FPS = PCLK / (VTS * HTS )// 计算FPST_Row = HTS / PCLK // INT_Time 等于 1 的时候,此公式表示一行的曝光时间。
Exp = T_Row * INT_Time // INT_Time 积分时间(曝光时间寄存器)1. 计算FPS可以通过修改 V_Total, H_T otal 或者降低 PCLK频率(当HTS or VTS降低到极限之后,需要通过降低PCLK来达到降FPS 的目的)达到降帧的目的。
2. Ob = Black Level 暗电流3. AE 主要控制Sensor Exp & Gain 这两种寄存器4. Sensor自带ISP,Mirror,Flip,WDR不做多的讲解CMOS MIPI Sensor看数据线对数可以知道是N Lane 的SensorCMOS Sub-LVDS Sensor看数据线对数可以知道是N Lane 的SensorCMOS Hispi补充:integration time 积分时间当光源周期与integration time成整数倍时才不会产生flickerintegration time即积分时间是以行为单位表示曝光时间(exposure time)的,比如说INT TIM为159,就是指sensor曝光时间为159行,两者所代表的意思是相同的,都是表示sensor的曝光时间,但是integration time是一个相对的概念,即以行为单位,而每行所占的绝对时间与pclk的时钟频率和每一行包含多少pclk(即行长)有关;而exposure time则是指sensor曝光的绝对时间,两者换算的关系如下:exposure time = integration time x 行长 /pclk 频率光源周期应该理解为光源能量周期,是交流电周期的两倍(如交流电频率为50hz,则光源能量周期为0.01s),步长所占绝对时间与光源能量周期相等。
qt中qcamera类用法QCamera类是Qt中用于相机设备的封装类。
它提供了一系列方法和信号槽用于访问和控制相机设备。
使用QCamera类需要先创建一个QCamera对象,然后调用open(方法打开相机设备。
通过判断isCaptureModeSupported(方法来确定设备是否支持捕获模式。
可以使用supportedViewfinders(方法获取设备支持的预览界面列表,并使用setViewfinder(方法设置预览界面。
QCamera类提供了几种捕获模式,包括照片捕获模式和视频捕获模式。
可以使用supportedCaptureModes(方法获取设备支持的捕获模式列表,并使用setCaptureMode(方法设置捕获模式。
在照片捕获模式下,可以使用capture(方法进行拍照,并通过QCameraImageCapture或QMediaRecorder类对拍摄结果进行处理。
QCameraImageCapture类提供了拍摄图片的方法和信号槽,可以设置图片保存路径、格式、质量等参数。
QMediaRecorder类提供了录制和保存视频的方法和信号槽,可以设置视频的编码器、分辨率、帧率等参数。
在视频捕获模式下,可以使用start(方法开始录制视频,使用stop(方法停止录制。
可以使用stateChanged(信号槽监听视频录制状态的变化。
以下是一个示例代码,演示了如何使用QCamera类进行拍照和视频录制:```cpp#include <QCamera>#include <QCameraImageCapture>#include <QMediaRecorder>#include <QCameraInfo>#include <QCameraViewfinder>#include <QVBoxLayout>#include <QPushButton>int main(int argc, char *argv[])QApplication app(argc, argv);//创建窗口和布局QWidget window;QVBoxLayout layout(&window);QCameraViewfinder viewfinder;layout.addWidget(&viewfinder);QPushButton captureButton("Capture");layout.addWidget(&captureButton);//找到并选择相机设备QList<QCameraInfo> cameras = QCameraInfo::availableCameras(; QCamera camera(cameras[0]);//设置预览界面camera.setViewfinder(&viewfinder);//创建图片拍摄对象QCameraImageCapture imageCapture(&camera);camera.setCaptureMode(QCamera::CaptureStillImage);//连接拍摄信号槽QObject::connect(&captureButton, &QPushButton::clicked, [&] //设置图片保存路径imageCapture.setCaptureDestination(QCameraImageCapture::Capt ureToFile);imageCapture.setEncodingSettings(QImageEncoderSettings(, QVideoEncoderSettings(, "image.jpg");//拍照imageCapture.capture(;});//创建视频录制对象QMediaRecorder mediaRecorder(&camera);camera.setCaptureMode(QCamera::CaptureVideo);//连接录制信号槽QObject::connect(&captureButton, &QPushButton::clicked, [&]//设置视频保存路径mediaRecorder.setOutputLocation(QUrl::fromLocalFile("video.mp4"));//开始录制mediaRecorder.record(;});//显示窗口window.show(;return app.exec(;```这是一个简单的例子,通过点击Capture按钮可以进行照片拍摄和视频录制。
Q系列IPCamera(网络摄像机)使用手册Q系列――IP Camera(网络摄像机)2009年月版本 V使用手册目录1 产品概述 32 功能介绍 33 设备外观与接口 43.1 设备外观 43.2 设备接口 44 网络连接 54.1 连接说明 54.2 访问说明 65 局域网访问设置 66 互联网访问设置86.1 端口映射86.2 动态域名97 高级应用107.1 告警功能设置107.2 集中监控107.3 智能监控平台118 技术参数11产品概述IP Camera集成了网络和web服务功能,可以把摄制的视频通过网络传送到任何地方,您只需通过web浏览器就可随时访问现场视频。
它可以应用在大型卖场、学校、工厂、家庭等一系列场所。
在安装IP Camera之前,请检查您的产品内容是否完整。
假使包装内容有漏失,请您及时联络经销商。
包装内除了一台IP Camera以外还应包含以下物品:5V电源变压器 * 11.5米网线 * 1固定支架 * 1工具光盘 * 1功能介绍适用于IP网络上的远程视频图像传输,产品采用MJPEG硬件压缩技术,可以在LAN/WAN上以最大30帧/每秒传输高质量的实时视频图像。
采用TCP/IP标准协议,内置有WEB服务器,支持web浏览(不需要安装控件),操作简单。
支持VGA/QVGA/VGA三种分辨率,支持视频质量等级、亮度等级、视频显示方式、使用环境等多种视频参数设置。
自带红外灯,当外界光线变暗时,自动开启红外灯照明。
可外接探测器,用于检测外界告警。
厂家为每台设备分配了唯一设备序列号和动态域名(已经烧录进设备,同时记录在尾片的标签里),您不需进行任何设置,当设备接入互联网,即可使用该域名访问设备。
厂家提供免费的客户端软件SuperIPCam,支持中英文,可以实现多画面观看,长时间录像,报警检测等。
设备外观与接口设备外观图1 设备外观设备接口电源接口厂家提供配套的5V电源适配器,该适配器只能用于本IP Camera。
78 •电子技术与软件工程 Electronic Technology & Software Engineering软件应用• Software Application【关键词】QCamera 类 摄像头 应用程序开发 锐化 sharpening android目前国内手机市场和笔记本市场几近饱和,大部分人群基本人手一部手机,在校大学生几乎人手一台笔记本电脑,在这些设备上摄像头又是它们的标准配置。
要想提高这些设备的市场竞争力,摄像头应用程序的开发非常必要,比如可以使用它们完成图像识别、美颜拍照、视频拍摄截图等等。
手机上,可以用它开发表情识别、人脸识别、二维码、道路识别。
笔记本上在添加了摄像头选择功能之后,选择多个摄像头资源,读取其他摄像头的视频信息甚至可以开发其他的摄像头应用程序,简单的有视频监控,复杂的图像信号采集、视频信号采集等等。
总之,摄像头是一种常用的视频输入设备,利用摄像头采集图像信息,并对图像信息进行处理,已经广泛地运用在日常生活中。
本文主要论述QT 中如何采用QCamera 类实现摄像头应用程序开发,以达到利用摄像头作为其他应用程序的软件基础。
针对笔记本、手机目前预装的摄像头大多为定焦摄像头,而且对于运动图像拍摄截图过程中,图像比较模糊,不利于后期处理的问题,我们做了一些基于QT creator 的,图像锐化处理算法实验,本文就实验方法和结果进行了一些讨论1 开发平台1.1 QT的基本介绍QTcreator 是一款跨平台的C++图形界面应用程序框架由挪威TrollTech 公司出品,开基于QCamera 类的摄像头QT 应用程序开发与后端图像处理文/郑忠楷 蒋学程 罗志灶放源代码,完全面向对象,模块化程度高,可重用性好,容易扩展,允许真正的组件编程,提供了信号/槽机制,替代回调函数,使组件间信号信号传递更安全、简单,应用非常广泛。
QT 还提供了多达250个以上的C++类。
并且在界面显示,用户操作等方面借鉴了一些VS 系列的所见即所得风格,程序员编程方便,最终的的app 用户使用简单。
腾讯Q拍云同步分析1.云同步2.手工同步3.我的云相册用户的登录信息保存在程序目录,重安装还要输入用户名和密码DB存放在SD卡里面,这样卸载后只要用户不删除原来的记录就还在!如果删除了就再上传一遍!云端只会覆盖而已!所以这种情况不需要考虑,大不了再上传一次!若放在程序目录下次起来就不好判断了!1.云同步(自动同步):拍张照片后只有自动同步开启,有网络,并且是WIFI模式下才可以自动上传到云相册,反之不上传。
上传成功后才会记录下上传过的照片信息插入到DB!当前网络切换的WIFI模式下的时候,如果用户已经开启了云同步,那么会扫描/sdcard/dcim/QpaiPic目录下的照片,找出没有上传的图片(这里通过文件的MD5值判断)自动上传到云端,如果没开启自动云同步的话就不会自动同步到云端,只有在用户点击手动同步后才会上传到云端!这里自动云同步有个缺点:之前我没设置自动云同步,所以在新拍了照片后,它就不会自动上传到云端,这点是肯定的。
可是这个时候我重新开启自动云同步它就不会把刚才拍的那张照片自动同步到云端。
可能是这样处理的:照片在拍下的时候会记录拍下的时间,同时自动云同步开启的时候也会记录一个时间,如果这个开启时间在新拍的照片之后,那么即使是你手动点击了自动同步,或者是在有WIFI的模式下同步也不会把之前的照片上传到云端,这里只会在收到同步里面才能检测出未同步的照片,之后能上传。
如果照片的拍摄时间在这个开启时间之后那么在有WIFI的模式下,自动开启又是打开的,就会自动上传照片到云端!Q拍自己实现了一个相机,只有用这个相机拍摄的照片才能同步。
云同步是个可选项,用户可以自己选择是否自动同步照片。
1,照片将安全备份到空间的私密相册,仅本人可见。
(自己的QQ空间的云相册)2,只在WIFI下才会自动云同步,因此不会消耗3G/GPRS流量记住上次同步的时间和上次的同步数量(只统计自动同步的照片数量和上次自动同步时间)原理:用户一旦用Q拍拍了照片,点击保存会保存到这里/sdcard/dcim/QpaiPic保存后判断了是否开启了自动同步,如果没有开启自动同步不做任何操作,如果开启了自动同步并且同步成功那么就把刚拍的这张照片插入到DB(db字段信息如下),auto字段为1 ,同时启动了post上传到云相册,(这里它会发一个通知过来,开始云同步,同步结果也通知:云同步结束,已同步1张照片),它这里只管新拍的照片同步,之前拍的照片若是没有自动同步也没手动同步的话,是不做任何操作的。
qcamera用法-回复"qcamera用法"是指关于qcamera使用的指导和说明。
在本文中,我们将深入探讨qcamera的使用方法和步骤。
qcamera是一款功能强大的相机应用程序,可以在智能手机和其他设备上为用户提供卓越的相机体验。
第一步:下载和安装qcamera要使用qcamera,首先需要下载并安装该应用程序。
您可以在应用商店或qcamera开发者的官方网站上找到适用于您设备型号和操作系统的最新版本。
确保从可信任的来源下载并使用最新的版本,以确保您得到最佳的使用体验。
第二步:打开qcamera一旦您成功安装了qcamera,您可以在设备上找到并打开它。
通常在应用程序列表或主屏幕上可以找到qcamera的应用程序图标。
点击图标即可打开相机应用程序。
第三步:熟悉qcamera界面一旦您打开了qcamera,您将进入其界面。
这个界面通常具有类似于其他相机应用程序的特征,如取景器、快门按钮、设置选项等。
花些时间来熟悉qcamera的界面布局和各个功能按钮的位置,这将帮助您更好地使用该应用程序。
第四步:调整相机设置在使用qcamera之前,您可能需要调整一些相机设置,以确保您得到满意的照片和视频质量。
点击设置选项,您将进入qcamera的设置界面,您可以在这里更改相机的分辨率、白平衡、曝光等参数。
根据您的需求和拍摄环境的不同,您可以根据需要调整这些设置。
第五步:选择拍摄模式qcamera提供了多种拍摄模式,以满足不同拍摄需求。
您可以选择自动模式,让qcamera根据场景条件自动调整相机设置来拍摄照片。
或者,您也可以选择手动模式,以手动设置曝光、快门速度、焦距等参数。
此外,qcamera还提供了其他拍摄模式,例如夜间模式、人像模式、风景模式等。
根据您的拍摄需求,选择适当的拍摄模式。
第六步:使用取景器和对焦在qcamera的界面中,您会看到一个取景器。
这是一个视觉窗口,您可以通过它查看要拍摄的场景。
camera相关知识点总结一、相机的基本原理1. 光学原理相机的基本原理是利用光学透镜将光线聚焦在感光元件上,以记录被摄物体的影像。
光从被摄物体上反射出来,通过透镜进入相机内部,形成倒立的实际大小的实像。
这个实像成为感光元件上清晰的倒影。
感光元件的光感受器件(CCD或CMOS)是记录这个图像的关键部件。
2. 快门原理快门是相机的一个重要组成部分,它控制相机的曝光时间。
当快门按下时,快门会打开一小段时间,让光线进入感光元件,这就是曝光时间。
曝光时间越长,进入感光元件的光线就越多,照片的亮度就越高;曝光时间越短,光线就越少,照片的亮度就越低。
此外,快门速度还会影响运动物体的清晰度,快门速度越快,动态物体就越清晰,反之越模糊。
3. 光圈原理光圈是控制光线进入相机的部件。
光圈大小用F值表示,F值越小,光线进入相机的量就越大,照片的景深就越浅;F值越大,光线进入相机的量就越小,照片的景深就越深。
光圈的调节对照片焦点的对准和景深的控制起着重要作用。
4. ISO原理ISO是感光度的单位,它表示相机感光元件对光线的灵敏度。
ISO值越高,相机对光线的灵敏度就越高,在暗光环境下也能拍摄清晰亮度的照片;ISO值越低,相机对光线的灵敏度就越低,适合在明亮光线下的拍摄。
二、不同类型相机的特点及用途1. 单反相机单反相机是专业摄影师最常用的相机类型之一。
它具有高像素、快速对焦和成像质量高的特点。
单反相机拥有更多的手动调节功能,可以拍摄出更具创意的照片。
此外,单反相机还可更换镜头,满足不同拍摄场景的需求,如广角、长焦和微距等。
2. 微单相机微单相机是一种介于单反相机和数码相机之间的相机类型。
它拥有较小的体积和重量,更适合日常携带。
微单相机的成像质量、对焦速度和手动调节功能也较为出色。
它通常搭配可更换镜头,可以满足不同拍摄场景的需求。
3. 数码相机数码相机是便携式相机,适合普通人日常拍摄用。
它体积小巧,操作简单,成像质量和对焦速度一般较低。
OpenCV基础知识学习--第三弹------------恢复内容开始------------获取图像像素指针CV_Assert(myImage.depth() == CV_8U )Mat.ptr<uchar> (int i=0) 获取像素矩阵的指针,索引 i 表⽰第⼏⾏,从 0 开始计⾏数获得当前⾏指针 const uchar *current = myImage.ptr<uchar>(row)获取当前像素点 p (row,col) 的像素值 p(row,col) = current[col]像素范围处理 saturate_cast<uchar>saturate_cast<uchar>(-100) 返回 0saturate_cast<uchar>(288)返回 255saturate_cast<uchar>(100)返回 100这个函数的功能是确保 RGB 值的范围在 0-255 之间图像像素的运算操作加法:add(m1, m2, img);减法:subtract(m1, m2, img);乘法:multiply(m1,m2,img);除法:divide(m1, m2, img);参数1:进⾏运算的图像1参数2:进⾏运算的图像2参数3:运算结果输出的图像滚动条操作int createTrackbar(const String& trackbarname, const String& winname,int* value, int count,TrackbarCallback onChange = 0,void* userdata = 0);createTrackbar("Value", "滚动条", &lightValue,maxValue,onTrack);参数1:滚动条名称参数2:滚动条所在的窗⼝名称参数3:随滚动条改变的数值变量参数4:滚动条数值改变的最⼤值(最⼩值默认 0)参数5:响应滚动条数值改变的函数参数6:附加传递的参数(任意类型)图像位运算bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask = noArray());参数1:进⾏运算的图像1参数2:进⾏运算的图像2参数3:输出结果的图像bitwise_and(m1,m2,img);imshow( "与运算", img);bitwise_or(m1, m2, img);imshow( "或运算", img);bitwise_xor(m1, m2, img);imshow( "异或运算", img);bitwise_not(m2, img);imshow( "⾮运算", img);使⽤ rectangle 绘制图像rectangle(InputOutputArray img, Rect rec,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);参数1:要进⾏绘制的图像参数2:要绘制的⼤⼩参数3:图像的颜⾊参数4:选择填充还是描边操作 <0 填充 >0描边参数5:线型类型参数6:对中⼼坐标和半径值中的⼩数位进⾏移位。
QCamera学习笔记For MSM camera IC, significant portion of image processing and optimization codes are proprietary, so they cannot sit in kernel space. This plays animportant role when making design decisions.其大致意思是,daemon是介于应用和驱动之间翻译ioctl的中间层(委托处理),其目的是将VFE/ISP具体操作策略的私有化代码封闭,所以才会弄出这么一个感觉怪怪的东东。
在驱动设计中,存在msm-config和msm-camera两种model的media controller,前者用于获取事件通知v4l2驱动信息,后者用于获取sensor操作v4l2驱动信息。
一个完整的调用流程大致是:app==>v4l2(stream)==>daemon==>v4l2(control)==>app说明:1、app到daemon主要是在v4l2(stream)中事件通知方式进行的,对于map/unmap则直接通过domain socket方式进行2、daemon到app是通过v4l2(control)的事件通知机制进行的3、v4l2(stream)是通过msm-camera获取到相关信息的,v4l2(control)是通过msm-config获取到相关信息的一. 概述高通新的camera驱动架构设计发生了一些变化,借用互联网上常用的一种结构。
大致的原理如此:1. 将camera的所有功能划分为不同的模块,让模块自己来决定自己的事情(高内聚,低耦合)2. 模块需要有统一的接口和格式。
3. 模块中有端口,通过端口把模块连接起来,又把模块挂在总线上。
4. 每一个端口的连接就是一个流,把这些流用pipeline来管理。
camera学习⼊门指南等待补充。
1.背景介绍近年来,随着消费电⼦领域市场的快速增长,如安防、图像等领域,camera市场得到了快速发展。
智能⼿机这⼏年以拍照作为主打卖点,带动了camera(CCM)出货。
具体可以看电⼦⾏业分析或者券商研报⾏业分析,⽐如下⾯两份。
在招聘⽹站上搜索camera,可以看到,多为⼿机⼚商、智能硬件和汽车安防相关⾏业,包括tuning、效果、系统、性能功耗、测试等,其中camera tuning的岗位是最多的。
绝⼤多数产品⽅案系统都是使⽤Android操作系统⽅案,所以需要对Android有⼀定了解。
以前camera tuning⼯作是由算法⼯程师完成,后⾯随着⽤户对图像质量要求越来越⾼。
ISP处理器出现和流⾏催⽣很多tuning的⼯作。
基础知识:光学基本概念、camera基础知识:涉及硬件模组、软件架构等,linux驱动开发基本知识。
2.camera基础篇camera和光学知识和摄影知识密切相关。
2.1.光学知识成像原理:视场⾓FOV(Field of View):包括HFOV(⽔平), VFOV(垂直),DFOV(对⾓)Focal Length:焦距EFL(Effective Focal Length)有效焦距、Fno(Aperture Value对应的Focal number)光圈数值,如F2.8,为光圈“系数”,简称为F值。
Fno = EFL/D(光圈直径)RGB(red green blue),光学三原⾊。
⾃然界中⾁眼所能看到的任何⾊彩都可以由这三种⾊彩混合叠加⽽成,因此也称为加⾊模式。
YUV(全称英⽂真没找到),是编译true-color颜⾊空间(color space)的种类,Y'UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。
Y”表⽰明亮度(Luminance或Luma),也就是灰阶值,“U”和“V”表⽰的则是⾊度(Chrominance或Chroma)。
QCamera学习笔记For MSM camera IC, significant portion of image processing and optimization codes are proprietary, so they cannot sit in kernel space. This plays animportant role when making design decisions.其大致意思是,daemon是介于应用和驱动之间翻译ioctl的中间层(委托处理),其目的是将VFE/ISP具体操作策略的私有化代码封闭,所以才会弄出这么一个感觉怪怪的东东。
在驱动设计中,存在msm-config和msm-camera两种model的media controller,前者用于获取事件通知v4l2驱动信息,后者用于获取sensor操作v4l2驱动信息。
一个完整的调用流程大致是:app==>v4l2(stream)==>daemon==>v4l2(control)==>app说明:1、app到daemon主要是在v4l2(stream)中事件通知方式进行的,对于map/unmap则直接通过domain socket方式进行2、daemon到app是通过v4l2(control)的事件通知机制进行的3、v4l2(stream)是通过msm-camera获取到相关信息的,v4l2(control)是通过msm-config获取到相关信息的一. 概述高通新的camera驱动架构设计发生了一些变化,借用互联网上常用的一种结构。
大致的原理如此:1. 将camera的所有功能划分为不同的模块,让模块自己来决定自己的事情(高内聚,低耦合)2. 模块需要有统一的接口和格式。
3. 模块中有端口,通过端口把模块连接起来,又把模块挂在总线上。
4. 每一个端口的连接就是一个流,把这些流用pipeline来管理。
5. 每次启动一个camera就创建一个会话,由这个会话来管理此camera的一切事物。
6. 对于每一个会话,模块是共享的,它可以是camera的硬件资源也可以是其它资源(如一些软件算法等资源)。
那么如何来定义这个模块的结构呢?1.端口——端口属于模块,如果这个模块只有source端口,那么它就是一个src模块;如果只有sink端口就是sink模块,如果都有就是中间模块。
没有端口的模块是不能连接到流中的,但他可以完成一些其他的功能,比如接收引擎的设置,报告事件到bus等。
连接到流中的端口,也就是说流事件(set/get)主要通过端口来处理。
而来自于引擎的(set/get)通过模块来处理,当然端口也可以把事件交给模块来处理。
模块内部的端口可以通过模块来建立关系,也可以建立内部的连接,端口有关get/set process。
2.模块线程——每个模块可以有一个线程来处理模块的事情。
一个线程对应一个队列,线程就是从队列中取出数据处理,然后应答回去。
3.总线回调——挡一个模块向总线注册时,总线向其提供一个回调函数,当模块有事件发生时,调用这个函数向bus发消息,然后总线把这个消息提交给管道,管道把这个消息顺着流发下去。
4.模块的get、set以及process。
管道、引擎与会话管道有两端,一端用于读,一端用于写。
camera引擎负责对管道的监控,而会话管理camera引擎。
从代码结构上来看这种新的驱动架构高通的camera deamon代码放置在vendor\qcom\proprietary\mm-camera目录下,而此目录下的mm-camera2就是新的camera架构位置,进入里面可以看到media-controller、server-imaging、server-tuning及其它几个目录,我们这里需要关注的就是media-controller目录。
media-controller|- mct——应该就是camera的引擎?里面包含了引擎、pipiline、bus、module、stream及event等定义及封装。
|- modules——这里面就是划分好的一些模块代码,各模块大致功能如下|- sensor —— sensor 的驱动模块?—— src模块|- iface —— ISP interface模块— inter模块|- isp ——主要是ISP的处理,其内部又包含了众多的模块–--inter 模块|- stats ——一些统计算法模块,如3A,ASD,AFD,IS,GRRO等数据统计的处理—— sink模块|- pproc —— post process处理—— inter模块|- imglib ——主要是图片的一些后端处理,如HDR等——sink模块以上各模块内部又包含了众多的模块,具体需要看代码分析。
二. 高通camera daemon进程1.概述高通在Android的camera架构中,依旧沿用了其传统的方式,将其自身的一些处理放在一个daemon进程中。
这部分内容出于应用于driver之间,是为了保护自身及硬件厂商的利益而专门弄出来的一个东东。
其它各家平台也采用类似的方式将这部分的处理放在HAL层处理。
2.进程的入口做为一个单独的进程,那肯定是有其main函数入口的。
在vendor\qcom\proprietary\mm-camera\mm-camera2\server-imaging\server.c文件中可以看到这个main函数。
在这个函数中主要做了以下几件事情。
1.找到服务节点的名字并打开此节点get_server_node_name(serv_hal_node_name)......hal_fd->fd[0] = open(dev_name, O_RDWR | O_NONBLOCK); //这里dev_name为节点名如"/dev/serv_hal_node_name"2.初始化模块。
目前有sensor、iface、isp、stats、pproc及imglib六个模块(见笔记一)server_process_module_init();3.进入主循环来处理来自HAL及MCT的事件及消息,处理完之后的结果反馈给kernel(msm.c)RD_FD_HAL----> server_process_hal_event(&event)。
此函数如果返回真,表示事件消息已经传给了MCT,这时不需要发送CMD ACK给kernel,因为MCT处理结束后会发出通知。
如果返回假,表示没有传到MCT,此时需要立即发送CMD ACK到kernel,以便HAL发送此消息的线程阻塞住。
RD_DS_FD_HAL ——通过domain socket传自HAL的消息----> server_process_hal_ds_packet(fd_info->fdRD_PIPE_FD_MCT ——来自media controller的消息三. media controller线程1.概述MCT线程是camera新架构的引擎部分,负责对管道的监控,由此来完成一个camera设备的控制运转。
它运行在daemon进程空间,由MSM_CAMERA_NEW_SESSION事件来开启,具体开启函数为mct_controller_new()。
2.mct_controller_new()函数此函数创建一个新的MCT引擎,这将对应一个事务的pipeline。
我们知道上层可以创建多个事务,每个对应一个camera,也对应自己的MCT及pipeline等。
因此这个函数的主要完成以下几件事情:1.mct_pipeline_new()---->创建一个Pipeline及其bus,并完成pipeline函数的映射。
2.mct_pipeline_start_session()---->开启camera的所有模块并查询其能力3.pthread_create(..., mct_controller_thread_run, ...)---->创建mct线程并开始执行4.pthread_create(..., mct_bus_handler_thread_run, ...)---->创建bus处理线程3.mct_list_traverse()函数此函数在整个mct线程中大量使用,主要用来遍历所有模块并执行一些处理工作。
结合前面所讲,camera各模块都具有统一的接口,通过流来连接,模块中又包含模块,根据这种特性高通使用链表结构来保存这些模块并设计了此函数用来完成遍历操作。
1.先来看看此链表的节点结构。
链表的节点其实也是一个链表,整个链表就好像是一串串同级的节点搭建而成,整个数据结构组成一颗树结构。
struct _mct_list {void *data; // 节点数据mct_list_t *prev; // 上一个节点地址mct_list_t **next; // 下一个节点节点元素数组首地址uint32_t next_num; // 下一个节点节点元素数,大部分情况下为1}mct_list_t;2.通过递归的深度优先算法来遍历整棵树。
4.MCT线程运行MCT整个引擎部分主要处理server及bus两类事情,对应前面提到的MCT及bus两个线程。
MCT线程主要用来处理来自image server的消息,先pop MCT queue,查看是否有消息,如果有则执行mct_controller_proc_serv_msg_internal()函数来处理。
mct_controller_proc_serv_msg_internal函数用来处理来自image server的消息,并返回类型MCT_PROCESS_RET_SERVER_MSG。
这里处理的消息类型主要有SERV_MSG_DS与SERV_MSG_HAL两种,分别在pipline中给出了相应的处理函数,具体查看源码可知。
5.bus线程运行bus线程跟MCT线程流程一样。
从代码上我们看到两个线程都是从同一个queue上面pop消息,他们是通过各自的线程条件变量来进行区分,完成线程的阻塞及运行工作。
MCT的条件变量mctl_cond可以看到是在server_process.c文件中标记的,而bus的条件变量mctl_bus_handle_cond未在源码中找到标志的位置?。