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 导致产出的数据结果不可信。而问题发现可经历较长周期(尤其离线场景),往往是业务方通过上层数据报表发现数据…

C++中线程的创建

线程创建 引言为什么要使用线程线程的创建使用函数指针示例运行结果使用类对象示例运行结果使用lambda表达式示例运行结果使用带参数的函数作为线程处理函数示例运行结果使用类成员函数示例运行结果引言 在学习C++的过程中,线程的使用作为一个非常重要的部分,也是在复杂项目…

aop实现统一处理日志

使用 AOP(Aspect-Oriented Programming,面向切面编程)可以很方便地实现统一处理日志的功能,而不需要修改现有的业务代码。下面是使用 AOP 实现统一处理日志的一般步骤: 定义日志切面(Aspect)&am…

SpringBoot中日期的格式化处理

目录 1 前言 2 方法 2.1 添加JsonFormat注解 2.2 拓展SpringMVC的消息转化器 2.2.1 编写对象映射器 2.2.2 web层配置类中拓展消息转化器 1 前言 为了符合我们日常的习惯,在对日期类数据进行返回的时候,常常需要对其进行格式化的处理。接下来我将介…

华为---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”循环语法简洁却强大,为处理多样的循环场景提供了一系列能力。无…

算法-归并应用

题目:给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中,值位于范围 [lower, upper] (包含 lower 和 upper)之内的 区间和的个数 。 区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和&#xff0c…

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

目录 牛顿迭代法 一、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方法被修饰 …

前端基础Document

前端基础Document 在浏览器的JavaScript环境中,document是默认的全局变量之一,提供对当前网页文档(HTML文档)的访问和操作。 document对象是Document接口的一个实例,表示整个HTML文档。它作为全局变量存在于浏览器的…

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

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

闭包----闭包的理解、优点

1、闭包的理解 闭包就是能够读取其他函数内部变量的函数。 由于在 javascript 中,只有函数内部的子函数才能读取局部变量,所以说,闭包可以简单理 解成 “ 定义在一个函数内部的函数 “ 。 所以,在本质上,闭包是将…

微服务中的熔断、降级和限流

在现代微服务架构中,熔断、降级和限流是保障系统稳定性和可靠性的重要手段。本文将深入探讨这三种机制在微服务架构中的作用、原理以及实践方法。 1. 熔断(Circuit Breaker) 1.1 作用和原理 熔断器是一种可以在服务发生故障时快速中断请求的机制,防止故障蔓延到整个系统…

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

一、使用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;后端需…

淘宝店内商品列表接口api

淘宝店内商品列表接口api代码对接如下&#xff1a; 1.公共参数 名称 类型 必须 描述 key String √ get请求方式拼接在url中&#xff0c;点击获取 api_name String √ api接口名称 cache String 默认否 result_type String 否 json lang String 默认cn 简…