Android相机-HAL子系统

引言

应用框架要通过拍照预览摄像获得照片或者视频,就需要向相机子系统发出请求,

一个请求对应一组结果

一次可发起多个请求,并且提交请求是非阻塞的,始终按照接收的顺序以队列的形式先进先出地进行顺序处理

一个请求包含了拍摄和拍照配置的所有信息,以及处理这些的结果,

(一般包括:分辨率,像素格式,手动传感器、镜头,闪光灯控件,3A操作模式,RAW到YUV处理控制,统计信息的生成等等,这就是说可以对输出结果和处理有很多的控制。这就是Camera2对比Camera1的一个最主要的变化)

相机请求模型:

相机pipeline

相机子系统中,包括pipeline中组件的实现。如:3A算法和处理控件。

相机HAL提供接口,用户可以实现自己的版本的这些组件接口。比如高通或者MTK等各自根据标准HAL接口来实现自己的组件接口。这样的标准接口既保证了多个设备制造商和ISP之间的跨平台兼容性,又能保证各自实现的独特性。

相机pipeline是虚拟的,整个相机数据的处理流程跟管道是一样的。完全可以管道的概念来映射硬件。以这种pipeline的抽象的组件方式,来支持多种不同的算法和运算顺序,不会影响质量,效率和跨设备的兼容性。

相机pipeline也支持通知或者事件触发:app框架可以启动的一些如自动对焦的功能,它还将通知发送回应用程序框架,向应用程序通知自动对焦锁定或错误等事件。

上述的相机pipeline的图种,既包括了实际的硬件设备处理,又包括了软件处理:

CameraSensor,ISP,统计信息,3A算法,Bayer处理,Jpeg处理,YUV处理

ISP又包含有:热像素校准,去马赛克,降噪,阴影校准,几何校准,色差校准,边缘增强,色调曲线调整,

值得注意的,一些图像处理块,如在图中显示的,并没有明确定义的,相机pipeline做出如下的假设。:

1)RAW Bayer输出在ISP内部不经过任何处理

2)统计信息根据原始传感器数据生成

3)原始数据转换成YUV的各种处理块可以按照任意顺序排列

4)当显示多个刻度和裁剪单元时,所有缩放单元共享区域控件(数字缩放)。不过每个单元都可能具有不同的输出分辨率和像素格式。

HAL的操作摘要

来自FW的拍照或者录像的异步requests

HAL设备必须按照顺序处理requests 。每个requests 均生成输出结果的metadata以及一个或多个output image buffers

requests and results以及后续的流请求都遵守先进先出规则(队列的规则)。

指定请求的所有输出的时间戳必须完全相同,以便框架可以根据需要将它们匹配在一起。

所有拍照或者录像的配置和状态(不包括 3A 例程)都包含在请求和结果中。

相机HAL概述

相机的启动与预期操作顺序

AndroidCamera API的使用流程

  1. 监听和枚举相机设备。
  2. 打开设备并连接监听器。
  3. 配置目标使用情形的输出(如静态拍照、录制等)。
  4. 为目标使用情形创建请求。
  5. 捕获/重复请求和连拍。
  6. 接收结果metadata  image data
  7. 切换 usecases(使用情形)时,返回到第 3 步

相机操作流程

HIDL接口定义位于:

hardware/interfaces/camera

1)枚举、打开相机设备并创建有效会话:

  •         a. 在初始化之后,框架开始监听任何一个现有的CameraProvider(ICameraProvider接口的实现)如果存在一个或者多个CameraProvider,FW就会尝试建立connection

        b. FW枚举相机设备是通过:ICameraProvider::getCameraIdList()

        c. FW实例化一个新的ICameraDevice 相应的调用:

                ICameraProvider::getCameraDeviceInterface_VX_X()

        d. FW通过调用ICameraDevice::open() 来创建一个新的激活的 capture session(ICameraDeviceSession)

2)使用有效相机会话:

        a. FW调用HAL设备的输入/输出流列表来调用: ICameraDeviceSession::configureStreams()

        b.  只要ICameraDeviceSession被ICameraDevice::open() 创建好之后,在任何时候,FW在一些usecase中,都可以调用默认设置的请求:ICameraDeviceSession::constructDefaultRequestSettings();

        c. 框架通过调用基于某一组默认设置的设置,以及框架之前注册的至少一个输出流来构造第一个capture request,并将其发送到HAL。此请求是通过ICameraDeviceSession::processCaptureRequest() 发送到HAL。HAL必须阻塞这次调用的返回,直到准备好发送下一个请求为止。

        d. 框架继续提交请求,并根据需要调用ICameraDeviceSession::constructDefaultRequestSettings()以获取其他用例的默认设置缓冲区。

        e. 当请求捕获开始(传感器开始曝光以进行捕获)时,HAL 用SHUTTER 消息 来调用ICameraDeviceCallback::notify() 包括:帧号和开始曝光的时间戳。此通知回调不必在给第一个请求调用processCaptureResult()之前发生。但直到针对相应的捕获调用 notify() 之后,才会向应用提供有关该捕获的结果。

        f. 经过一定的流水线延迟后,HAL 开始使用 ICameraDeviceCallback::processCaptureResult() 将完成的捕获返回到框架。这些捕获按照与提交请求相同的顺序返回。一次可发起多个请求,具体取决于相机 HAL 设备的管道深度。

3)在打开了相机之后会出现以下的某种情况:

        a. 完成拍照或者摄像后,重新设置,重新下发请求,则会重新进行配流重新获取数据。

重新配流就是调用:ICameraDeviceSession::configureStreams()

        b. 关闭相机

关闭相机会调用:ICameraDeviceSession::close()

        c. 相机出现错误或者异常。

返回 错误或事件 消息:ICamaeraDeviceCallback::notify()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/49907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【音视频处理】转编码H264 to H265,FFmpeg,代码分享讲解

大家好,欢迎来到停止重构的频道。 本期我们讨论音视频文件转编码,如将视频H264转H265等。 内容中所提及的代码都会放在GitHub,感兴趣的小伙伴可以到GitHub下载。 我们按这样的顺序展开讨论:​ 1、 编码的作用 2、 转编码的…

avue-ueditor中隐藏部分工具栏

项目中不需要那么多工具栏,只需要展示部分工具栏 <avue-ueditor v-model"content" v-bind"options" :customConfig"customConfig" :placeholder"placeholder"></avue-ueditor>//按需隐藏或者显示工具栏即可 props: {custo…

C语言基础之——操作符(上)

本篇文章&#xff0c;我们将展开讲解C语言中的各种常用操作符&#xff0c;帮助大家更容易的解决一些运算类问题。 这里提醒一下小伙伴们&#xff0c;本章知识会大量涉及到二进制序列&#xff0c;不清楚二进制序列的小伙伴&#xff0c;可以去阅读我的另一篇文章《数据在内存中的…

6、Spring_Junit与JdbcTemplate整合

Spring 整合 1.Spring 整合 Junit 1.1新建项目结构 1.2导入依赖 导入 junit 与 Spring 依赖 <!-- 添加 spring 依赖--> <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version…

MySQL 8.0 多实例的配置应用

文章目录 同版本多实例配置部署、启动、连接 不同版本多实例配置初始化initialize-insecure 含义 启动 同版本多实例 配置 mkdir -p /data/330{7..9}/data chown -R mysql.mysql /data/* cat > /data/3307/my.cnf <<EOF [mysqld] usermysql basedir/usr/local/mysql …

Skywalking Kafka Tracing实现

背景 Skywalking默认场景下&#xff0c;Tracing对于消息队列的发送场景&#xff0c;无法将TraceId传递到下游消费者&#xff0c;但对于微服务场景下&#xff0c;是有大量消息队列的业务场景的&#xff0c;这显然无法满足业务预期。 解决方案 Skywalking的官方社区中&#xf…

深度学习入门(三):卷积神经网络(CNN)

引入 给定一张图片&#xff0c;计算机需要模型判断图里的东西是什么&#xff1f; &#xff08;car、truck、airplane、ship、horse&#xff09; 一、卷积神经网络整体架构 CONV&#xff1a;卷积计算层&#xff0c;线性乘积求和RELU&#xff1a;激励层&#xff0c;激活函数P…

Flutter性能揭秘之RepaintBoundary

作者&#xff1a;xuyisheng Flutter会在屏幕上绘制Widget。如果一个Widget的内容需要更新&#xff0c;那就只能重绘了。尽管如此&#xff0c;Flutter同样会重新绘制一些Widget&#xff0c;而这些Widget的内容仍有部分未被改变。这可能会影响应用程序的执行性能&#xff0c;有时…

16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及JDBC示例(4)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

3D旅游情景实训教学展示

随着科技的不断发展&#xff0c;情景实训教学在教育领域中的应用越来越广泛。通过虚拟现实技术&#xff0c;3D视觉技术&#xff0c;计算机技术等为学生提供了一个身临其境的学习环境&#xff0c;让他们能够在模拟的场景中学习和实践&#xff0c;从而更好地理解和掌握知识。 3D虚…

Docker搭建LNMP运行Wordpress平台

一、项目1.1 项目环境1.2 服务器环境1.3 任务需求 二、Linux 系统基础镜像三、Nginx1、建立工作目录2、编写 Dockerfile 脚本3、准备 nginx.conf 配置文件4、生成镜像5、创建自定义网络6、启动镜像容器7、验证 nginx 四、Mysql1、建立工作目录2、编写 Dockerfile3、准备 my.cnf…

Ubuntu系统安装之后首需要做的事情

Ubuntu系统的初步环境搭建 1、换源2、显卡3、浏览器4、输入法5、终端6、ROS7、VSCode8、设置时间与win一致9、 TimeShift10、 Anaconda&#xff08;考虑装不装&#xff09; 1、换源 点开Software&&Update&#xff0c;找到Ubuntu Software中的Download from&#xff0c…

Linux学习记录——이십오 多线程(2)

文章目录 1、理解原生线程库线程局部存储 2、互斥1、并发代码&#xff08;抢票&#xff09;2、锁3、互斥锁的实现原理 3、线程封装1、线程本体2、封装锁 4、线程安全5、死锁6、线程同步1、条件变量1、接口2、demo代码 1、理解原生线程库 线程库在物理内存中存在&#xff0c;也…

[bug日志]springboot多模块启动,在yml配置启动端口8081,但还是启动了8080

【问题描述】 配置的启动端口是8081&#xff0c;实际启动端口是8080 【解决方法】 1.检查application.yml的配置是否有错误(配置项中&#xff0c;显示白色就错&#xff0c;橙色无措) 2.检查pom.xml的打包方式配置项配置&#xff0c;主pom.xml中的配置项一般为&#xff1a;&l…

【hello git】初识Git

目录 一、简述Git 二、Linux 下 Git 的安装&#xff1a;CentOS 2.1 基本命令 2.2 示例&#xff1a; 三、Linux 下 Git 的安装&#xff1a;ubuntu 3.1 基本命令 3.2 示例&#xff1a; 一、简述Git Git &#xff1a;版本控制器&#xff0c;记录每次的修改以及版本迭代的一个管…

day 37 | ● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II 与前一道分割等和子集的思路差不多&#xff0c;都是01背包问题。因为是采用滚动数组的形式&#xff0c;所以必须要倒序遍历才可以。 dp[i]代表着在i的限制下最大的承重。所以另一半就是all - dp【all / 2】 func lastStoneWeightII(stones []int…

流媒体内容分发终极解决方案:当融合CDN与P2P视频交付结合

前言 随着互联网的发展&#xff0c;流媒体视频内容日趋增多&#xff0c;已经成为互联网信息的主要承载方式。相对传统的文字&#xff0c;图片等传统WEB应用&#xff0c;流媒体具有高数据量&#xff0c;高带宽、高访问量和高服务质量要求的特点&#xff0c;而现阶段互联网“尽力…

中介者模式-协调多个对象之间的交互

在深圳租房市场&#xff0c;有着许多的“二房东”&#xff0c;房主委托他们将房子租出去&#xff0c;而租客想要租房的话&#xff0c;也是和“二房东”沟通&#xff0c;租房期间有任何问题&#xff0c;找二房东解决。对于房主来说&#xff0c;委托给“二房东”可太省事了&#…

【图论】缩点的综合应用(一)

一.缩点的概念 缩点&#xff0c;也称为点缩法&#xff08;Vertex Contraction&#xff09;&#xff0c;是图论中的一种操作&#xff0c;通常用于缩小图的规模&#xff0c;同时保持了图的某些性质。这个操作的目标是将图中的一些节点合并为一个超级节点&#xff0c;同时调整相关…

LLM 生成式配置的推理参数温度 top k tokens等 Generative configuration inference parameters

在这个视频中&#xff0c;你将了解一些方法和相关的配置参数&#xff0c;这些参数可以用来影响模型在下一个词生成时的最终决策方式。如果你在Hugging Face网站或AWS的游乐场中使用过LLMs&#xff0c;你可能已经看到了这些控制选项&#xff0c;用来调整LLM的行为。每个模型都暴…