Camera2 setRepeatingRequest源码分析

当createCaptureSession流程执行完成后,应用在回调方法onConfigured就可以获得创建的CameraCaptureSession,接下来就可以调用CameraCaptureSession#setRepeatingRequest来下发camera stream命令获取camera数据。在CameraCaptureSession#setRepeatingRequest流程中,实际上是调用CameraDeviceImpl#setRepeatingRequest,然后调用submitCaptureRequest中转,最终通过binder调用到CameraDeviceClient#submitRequestList中来完成camera stream命令下发。

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

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

         接下来分析CameraDeviceClient#submitRequestList流程。在这个流程中,首先检查应用pid一致性、request状态和参数配置是否正确、设备物理ID转换后的逻辑ID是否一致和request权限等问题,然后再调用Camera3Device#setStreamingRequestList进行进一步配置。

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

在Camera3Device#setStreamingRequestList流程中,通过submitRequestsHelper方法进行完成camera stream命令配置流程。在submitRequestsHelper方法中,首先会检查Camera3Device中流程配置状态是否正常,接着通过convertMetadataListToRequestListLocked方法初始化RequestList,然后再通过RequestThread#setRepeatingRequests进行camera stream命令配置,最后等待request配置完成。

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

在RequestThread#setRepeatingRequests流程中,会清空本地的camera stream命令列表,将第一次repeating标志位设置为true,同时将当前设置的命令列表拷贝到本地,然后通过unpauseForNewRequests方法发送信号给RequestThread开启命令下发流程。

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

在openCamera流程时会执行Camera3Device#initializeCommonLocked方法,其中会创建RequestThread并启动,启动后的RequestThread值循环执行threadLoop方法。在threadLoop方法中,主要完成3件事情:1)调用waitForNextRequestBatch方法等待request准备完成,主要是通过waitForNextRequestLocked等待mRequestSignal信号通知(也就是上一步流程中的request设置完成后发出的信号);2)通过prepareHalRequests方法来完成hal request的参数配置和camera stream buffer申请。3)通过sendRequestsBatch方法将request发送给hal层获取camera stream数据。

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

CaptureRequest创建完成后,会调用prepareHalRequests方法完成request进一步配置。在这个流程中,主要是初始化下发的hal request命令参数,并调用getBuffer方法为request中所有的outputStream申请camera stream buffer。

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

/frameworks/av/services/camera/libcameraservice/device3/Camera3Stream.cpp

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

当hal request命令配置完成,camera stream需要的buffer也申请完成后,接下就会调用sendRequestsBatch将camera stream命令发送给hal层来获取camera数据。在sendRequestsBatch方法中,主要完成2件事情:1)首先调用HalInterface#processBatchCaptureRequests通过wrapAsHidlRequest对命令进行封装,然后设置request setting参数,最后通过之前创建的CameraDeviceSession,调用processCaptureRequest下发命令给hal;2)更新下一次下发的命令。至此,camera stream request下发流程分析结束,request命令发送给hal层,hal层接收到请求读取camera数据。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

离线升级esp32开发板升级包esp32-2.0.14(最新版已经3.0alpha了)

1.Arduino IDE 2.3.2最新 2024.2.20升级安装:https://www.arduino.cc/en/software 2.开发板地址 地址(esp8266,esp32) http://arduino.esp8266.com/stable/package_esp8266com_index.json,https://raw.githubusercontent.com/espressif/arduino-esp32…

【Redis高手修炼之路】④主从复制

主从复制 就是 redis集群的策略配从(库)不配主(库):小弟可以选择谁是大哥,但大哥没有权利去选择小弟读写分离:主机写,从机读 一主二仆 准备三台服务器,并修改redis.co…

HTTP 与HTTPS笔记

HTTP 80 HTTP是一个在计算机世界里专门在【两点】之间【传输】文字、图片、音频、视频等【超文本】数据的约定和规范。 HTTP状态码 1xx 提示信息,表示目前是协议处理的中间状态,还需要后续的操作;2xx 200 204 026 成功3xx 重定向&#xff…

MySQL篇之覆盖索引

一、定义 覆盖索引是指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到。 二、例子 1. id为主键,默认是主键索引。 2. name字段为普通索引。 select * from tb_user where id 1 覆盖索引 select id,na…

OPPO公布全新AI战略,AI 手机时代再提速

2024年2月20日,深圳——今日OPPO 举办 AI 战略发布会,分享新一代 AI 手机的四大能力特征,展望由AI驱动的手机全栈革新和生态重构的趋势,并发布由OPPO AI 超级智能体和 AI Pro 智能体开发平台组成的OPPO 1N 智能体生态战略&#xf…

提升网络灵活性,SD-WAN助您快速应对备用线路需求

随着企业规模不断扩大,传统网络架构在面对快速扩张的业务需求时显得力不从心,如同狭窄的道路难以容纳日益增多的车流和人群,访问流量的激增可能导致网络拥堵和延误,极大地影响业务正常访问。本文将详细介绍SD-WAN如何快速调整备用…

【MySQL】Navicat/SQLyog连接Ubuntu中的数据库(MySQL)

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、安装…

C++结合Lambda表达式在函数内部实现递归

529. 扫雷游戏 已解答 中等 相关标签 相关企业 让我们一起来玩扫雷游戏! 给你一个大小为 m x n 二维字符矩阵 board ,表示扫雷游戏的盘面,其中: M 代表一个 未挖出的 地雷,E 代表一个 未挖出的 空方块&#xff…

【贪心算法】代码随想录算法训练营第三十七天 |738.单调递增的数字,968.监控二叉树,总结(待补充)

738.单调递增的数字 1、题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 2、文章讲解:代码随想录 3、题目: 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要…

Java学习心得感悟

在我踏入Java学习的道路之前,我对编程只是一知半解,对于代码的世界充满了好奇和向往。然而,当我真正开始学习Java时,我才意识到,学习Java不仅仅是学习一门编程语言,更是一种思维方式和解决问题的能力的培养…

WireShark 安装指南:详细安装步骤和使用技巧

Wireshark是一个开源的网络协议分析工具,它能够捕获和分析网络数据包,并以用户友好的方式呈现这些数据包的内容。Wireshark 被广泛应用于网络故障排查、安全审计、教育及软件开发等领域。接下将讲解Wireshark的安装与简单使用。 目录 Wireshark安装步骤…

ArcGIS API for JavaScript 4.X 本地部署(js,字体)

0 目录(4.19) /4.19/ 1 修改文件 1.1 init.js 编辑器打开/4.19/init.js搜索文本[HOSTNAME_AND_PATH_TO_JSAPI],然后将其连同前面的https://替换为http://ip地址/4.19,可以是localhost,只能本机引用 替换后&#xff…

对象的接口

“类”,那个类具有自己的通用特征与行为。 因此,在面向对象的程序设计中,尽管我们真正要做的是新建各种各样的数据“类型”(Type),但几乎所有面向对象的程序设计语言都采用了“class”关键字。当您看到“ty…

单片机学习笔记---红外遥控(外部中断)

目录 红外遥控简介 硬件电路 基本发送与接收 NEC编码​​​​​​​ 遥控器键码 复习外部中断和定时器 红外遥控简介 红外遥控是利用红外光进行通信的设备,由红外LED将调制后的信号发出,由专用的红外接收头进行解调输出 通信方式:单工…

2023年便宜的云服务器分享:最低26元4核16G

2024年阿里云服务器租用价格表更新,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…

electron Tab加载动画开启和关闭

记个开发中的bug,以此为鉴。眼懒得时候手勤快点儿,不要想当然!!! 没有转载的价值,请勿转载搬运呦。 WebContents API: Event: did-finish-load​ 导航完成时触发,即选项卡的旋转…

开发消息多发工具需要用到的源代码

在数字化时代,消息传递是许多应用程序的核心功能之一,从社交媒体到企业通信,从个人聊天到群发消息,消息传递无处不在,为了满足这种需求,开发者经常需要创建或定制消息多发工具。 这些工具通常需要处理多个…

算法刷题:找到字符串中所有的字母异位词

找到字符串中所有的字母异位词 .题目链接题目详情题目解析算法原理滑动窗口流程图定义指针及变量进窗口判断出窗口更新结果 我的答案 . 题目链接 找到字符串中所有的字母异位词 题目详情 题目解析 所谓的异位词,就是一个单词中的字母,打乱顺序,重新排列得到的单词 如:abc-&g…

【AI学习】LangChain学习

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

如何画架构图:从概念到实践

如何画架构图:从概念到实践 在软件开发和系统设计中,架构图是一种重要的工具,它能够帮助开发人员和利益相关者更好地理解系统的结构和组件之间的关系。但是,对于许多人来说,画架构图可能是一个挑战。本文将探讨如何有…