Camera2 createCaptureSession源码分析

当应用调用CameraManager#openCamera获取到已打开的camera设备后,会调用createCaptureSession方法来完成camera stream创建和stream的相关配置。在createCaptureSession方法中,首先将应用的surfaces信息封装成可跨binder传递的OutputConfiguration对象,然后调用createCaptureSessionInternal方法来进行进一步的配置。

在createCaptureSessionInternal方法中,主要完成3件事情:1)检查camera状态和session是否已经创建,如果创建,则重置session状态;2)通过configureStreamsChecked方法完成camera stream创建和配置;3)根据isConstrainedHighSpeed标志位来创建不同的CameraCaptureSession对象,然后在session构造函数根据camera stream配置结果通过不同的回调上报session对象和状态。

/frameworks/base/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java

/frameworks/base/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java

接下来分析configureStreamsChecked流程。在这个流程中,主要完成camera stream命令请求的重置,并根据应用传递的camera surface参数重新创建和配置camera stream(input和output)。具体分为以下4件事情:1)对比本地和当前的configuration差异,获取需要移除的camera stream信息;2)停止并清空底层的camera stream命令请求,为下一步重新配置camera stream命令做准备;3)根据1)中获取的结果,更新camera stream通路;4)调用endConfigure完成camera stream的配置。

接下来分析更新camera stream的deleteStream流程。在这个流程中,mRemoteDevice通过binder调用到CameraDeviceClient#deleteStream方法中,主要完成2件事情:1)更新本地列表中缓存的camera stream信息,移除streamId对应的camera stream;2)调用Camera3Device#deleteStream,查找本地camera stream列表中id对应的deletedStream,然后调用deletedStream#disconnect,最终调用到Camera3OutputStream#disconnectLocked来完成surface连接并移除deletedStream本地记录。

/frameworks/av/service/camera/libcameraservice/api2/CameraDeviceClient.cpp

/frameworks/av/service/camera/libcameraservice/device3/Camera3Device.cpp

/frameworks/av/service/camera/libcameraservice/device3/Camera3OutputStream.cpp

接着分析更新camera stream的createStream流程。在这个流程中,mRemoteDevice通过binder调用到CameraDeviceClient#createStream方法中,主要完成4件事情:1)检查应用pid状态、surface及stream之间的对应关系限制和camera physical id的合法性;2)检查createStream方法中的参数outputConfiguration对应的buffer producer是否已经创建,调用createSurfaceFromGbp方法创建最匹配outputConfiguration参数对应的camera surface并保存到本地。3)检查需要创建的camera stream属性,调用Camera3Device#createStream完成camera stream的创建,保存camera stream id对应的outputConfiguration信息和创建的surface;4)调用setStreamTransformLocked来完成camera stream相关的方向变换,将camera stream id返回给framework。

/frameworks/av/service/camera/libcameraservice/api2/CameraDeviceClient.cpp

/frameworks/av/service/camera/libcameraservice/utils/SessionConfigurationUtils.cpp

/frameworks/av/service/camera/libcameraservice/utils/SessionConfigurationUtils.cpp

/frameworks/av/service/camera/libcameraservice/device3/Camera3Device.cpp

当camera stream创建完成后,mRemoteDevice#endConfigure方法通过binder调用到CameraDeviceClient#endConfigure,最终通过Camera3Device# configureStreams来完成camera stream的配置。在configureStreams方法中,通过filterParamsAndConfigureLocked获取默认session参数,并最终调用configureStreamsLocked来完成camera stream配置。在configureStreamsLocked方法中,首先暂停Camera3Device中的PreparerThread,然后调用inputStream/outputStream#startConfiguration获取到已经创建的camera stream,配置camera_stream_configuration参数,接着调用mInterface#configureStreams通过之前创建好的cameraDeviceSession完成hal层的camera stream配置,然后再调用inputStream/outputStream#finishConfiguration并最终通过Camera3OutputStream# configureConsumerQueueLocked来完成camera stream中surface参数的初始化配置,最后启动Camera3Device中的PreparerThread循环等待mPendingStreams中stream并执行buffer申请。至此,createCaptureSession流程分析完成,framework完成CameraCaptureSession的创建,native/hal层完成stream的创建和配置,并启动PreparerThread等待进一步的初始化流程。

/frameworks/av/service/camera/libcameraservice/device3/Camera3Device.cpp

/frameworks/av/service/camera/libcameraservice/device3/Camera3Device.cpp

/hardware/interfaces/camera/device/3.2/default/CameraDeviceSession.cpp

/frameworks/av/service/camera/libcameraservice/device3/Camera3OutputStream.cpp

/frameworks/av/service/camera/libcameraservice/device3/Camera3Device.cpp

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

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

相关文章

ACE 中的Active Object模式

Active Object 设计模式: 1) 根据对象被调用的方式,可以将对象分为两类: Passive Object和Active Object。Passive 和 Object和调用者在同一个线程中,这就是我们通常所用的函数调用。而Active Object和调用在不同的线程中&#xf…

Leo赠书活动-16期 名校毕业生教材

Leo赠书活动-16期 名校毕业生教材 ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 赠…

大厂的数据质量中心系统设计

日常工作中,数据开发上线完一个任务后并不是就可以高枕无忧,时常因上游链路数据异常或者自身处理逻辑的 BUG 导致产出的数据结果不可信。而问题发现可经历较长周期(尤其离线场景),往往是业务方通过上层数据报表发现数据…

华为---RSTP(二)---RSTP基本配置示例

目录 1. 示例要求 2. 网络拓扑图 3. 配置命令 4. 测试终端连通性 5. RSTP基本配置 5.1 启用STP 5.2 修改生成树协议模式为RSTP 5.3 配置根交换机和次根交换机 5.4 设置边缘端口 6. 指定端口切换为备份端口 7. 测试验证网络 1. 示例要求 为防止网络出现环路&#xf…

【论文精读】MAE

摘要 将掩码重建任务从nlp引入到cv,提出非对称掩码自编码器。 框架 概述 如上图,本文提出掩码自编码器,即将给定原始信号的部分观测值的情况下重建原始信号,编码器将观察到的部分信号(没有掩码标记)映射到潜在表示,采…

Golang for 循环

从基础知识到高级技术、并发和通道 Go(Golang)编程语言中的“for”循环是一个基本而多功能的结构,用于迭代集合、重复执行代码块以及管理循环控制流。Golang的“for”循环语法简洁却强大,为处理多样的循环场景提供了一系列能力。无…

算法——数值算法——牛顿迭代法

目录 牛顿迭代法 一、1021: [编程入门]迭代法求平方根 牛顿迭代法 迭代法(Iteration)是一种通过反复递推计算来逼近解的方法。而牛顿迭代法(Newtons method)则是一种特定的迭代法,用于求解方程或函数的根、最小值、最…

MySQL数据库基础(十):DQL数据查询语言

文章目录 DQL数据查询语言 一、数据集准备 二、select查询 三、简单查询 四、条件查询 1、比较查询 2、范围查询 3、逻辑查询 4、模糊查询 5、非空查询 五、排序查询 六、聚合查询 七、分组查询与having子句 1、分组查询介绍 2、group by的使用 3、group by 聚…

【设计模式】23种设计模式笔记

设计模式分类 模板方法模式 核心就是设计一个部分抽象类。 这个类具有少量具体的方法,和大量抽象的方法,具体的方法是为外界提供服务的点,具体方法中定义了抽象方法的执行序列 装饰器模式 现在有一个对象A,希望A的a方法被修饰 …

单片机学习笔记---红外遥控红外遥控电机调速(完结篇)

目录 低电平触发中断和下降沿触发中断的区别 红外遥控 Int0.c Int.h Timer0.c Timer0.h IR.c IR.h main.c 红外遥控电机调速 Timer1.c Timer.h Motor.c Motor.h main.c 上一节讲了红外发送和接收的工作原理,这一节开始代码演示! 提前说…

微信小程序-表单提交和校验

一、使用vant组件生成如下页面 二、前端代码如下 <form bindsubmit"submitForm"><view class"cell-group"><van-cell-group><van-field value"{{ title }}" label"商品名称" placeholder"请输入商品名称&qu…

Dubbo框架admin搭建

Dubbo服务监控平台&#xff0c;dubbo-admin是图形化的服务管理界面&#xff0c;从服务注册中心获取所有的提供者和消费者的配置。 dubbo-admin是前后端分离的项目&#xff0c;前端使用Vue&#xff0c;后端使用springboot。因此&#xff0c;前端需要nodejs环境&#xff0c;后端需…

复高斯分布的随机变量的模方的分布

文章目录 复高斯分布的随机变量的模方的分布问题的源头矩阵服从复高斯分布向量服从复高斯分布 复高斯分布的随机变量的模方的分布 已知 X ∼ C N ( μ , Σ ) X \sim \mathcal{C N}(\boldsymbol{\mu}, \boldsymbol{\Sigma}) X∼CN(μ,Σ) 则 ∥ X ∥ 2 \|X\|^2 ∥X∥2的分布为…

如何在本地服务器部署TeslaMate并远程查看特斯拉汽车数据无需公网ip

文章目录 1. Docker部署TeslaMate2. 本地访问TeslaMate3. Linux安装Cpolar4. 配置TeslaMate公网地址5. 远程访问TeslaMate6. 固定TeslaMate公网地址7. 固定地址访问TeslaMate TeslaMate是一个开源软件&#xff0c;可以通过连接特斯拉账号&#xff0c;记录行驶历史&#xff0c;统…

关于Android下gralloc,hwcompoer以及surface模块的重新认识

关于Android下gralloc&#xff0c;hwcompoer以及surface模块的重新认识 引言 欠债还钱天经地义&#xff0c;知识的债也是如此&#xff01;这不必须得将我前面欠下来的债给补上&#xff01;对于任何复杂的知识点&#xff0c;我们都可以采用庖丁解牛的学习方式&#xff0c;一步步…

文献速递:GAN医学影像合成--双向映射生成对抗网络用于脑部 MR 到 PET 合成

文献速递&#xff1a;GAN医学影像合成–双向映射生成对抗网络用于脑部 MR 到 PET 合成 01 文献速递介绍 作为精准医学的基石&#xff0c;多模态医学图像已成为必备要素。稿件收到日期&#xff1a;2021年6月26日&#xff1b;修改日期&#xff1a;2021年8月6日&#xff1b;接受…

常用的消息中间件RabbitMQ

目录 一、消息中间件 1、简介 2、作用 3、两种模式 1、P2P模式 2、Pub/Sub模式 4、常用中间件介绍与对比 1、Kafka 2、RabbitMQ 3、RocketMQ RabbitMQ和Kafka的区别 二、RabbiMQ集群 RabbiMQ特点 RabbitMQ模式⼤概分为以下三种: 集群中的基本概念&#xff1a; 集…

Linux系统安全:安全技术和防火墙

目录 一、安全技术和防火墙 1.安全技术 2.防火墙的分类 二、防火墙 1.iptables四表五链 2.黑白名单 3.iptables基本语法 4.iptables选项 5.控制类型 6.隐藏扩展模块 7.显示扩展模块 8.iptables规则保存 9.自定义链使用 一、安全技术和防火墙 1.安全技术 入侵检测系…

2000-2022各省产业结构高级化合理化指数(含原始数据、计算过程+计算结果)

2000-2022各省产业结构高级化合理化指数&#xff08;含原始数据、计算过程计算结果&#xff09; 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;国内生产总值、第一产业增加值、第二产业增加值、第三产业增加值、总就业人数、第一产业就业人数、第二产业就业人数、第三…

C++中自定义类型使用标准输入cin输出cout

自定义类型的输出 引言示例一运行结果示例二运行结果注意点 引言 当自己定义的数据为一些复杂数据&#xff0c;不再为基本数据类型&#xff0c;这时候要使用cout输出这些数据&#xff0c;就需要重载输出运算符<<,这样就可以使用cout来输出自定义的数据&#xff0c;相同如…