Android14 Camera框架中Jpeg流buffer大小的计算

背景描述
Android13中,相机框架包含对AIDL Camera HAL的支持,在Android13或更高版本中添加的相机功能只能通过AIDL Camera HAL接口使用。
对于Android应用层来说,使用API34即以后版本的Camera应用程序通过Camera AIDL Interface访问到HAL层。在将HAL层从HIDL相机接口迁移到AIDL相机接口时,发现AIDL HAL Jpeg buffer带下是框架确定的。
接下来,先来看下HIDL HAL和AIDL HAL两者这块Gralloc Buffer(框架下来那块output buffer)是如何来获取的,
Demo HIDL HAL 输出buffer
以Google Demo为例子,HIDL HAL中output buffer是这样映射到camera hal的:
int V4L2Wrapper::DequeueRequest(std::shared_ptr<CaptureRequest>* request)
{...v4l2_buffer buffer;memset(&buffer, 0, sizeof(buffer));buffer.type = format_->type();buffer.memory = V4L2_MEMORY_USERPTR;int res = IoctlLocked(VIDIOC_DQBUF, &buffer);if (res) {}...arc::GrallocFrameBuffer output_frame(*stream_buffer->buffer,stream_buffer->stream->width, stream_buffer->stream->height,fourcc, buffer.length, stream_buffer->stream->usage);res = output_frame.Map();...
}//GrallocFrameBuffer类进行地址映射
GrallocFrameBuffer::GrallocFrameBuffer(buffer_handle_t buffer, uint32_t width,uint32_t height, uint32_t fourcc, uint32_t device_buffer_length,uint32_t stream_usage): buffer_(buffer),is_mapped_(false),device_buffer_length_(device_buffer_length), /*这里接收到外部传过来的buffer大小*/stream_usage_(stream_usage), {...
}int GrallocFrameBuffer::Map() {...switch (fourcc_) {...case V4L2_PIX_FMT_JPEG://这里调用gralloc mapper,映射地址ret = gralloc_module_->lock(gralloc_module_, buffer_, stream_usage_,0, 0, device_buffer_length_, 1, &addr);break;...}...
}
Demo AIDL HAL输出buffer
aidl hal buffer的大小在configure stream阶段确认,框架下发流配置中携带着对应buffer大小。request阶段完成“lock”操作。
status_t EmulatedRequestProcessor::LockSensorBuffer(const EmulatedStream& stream,buffer_handle_t buffer, int32_t width, uint32_t height,SensorBuffer* sensor_buffer /*out*/) {...if ((isYUV_420_888) || (isP010)) {...} else {uint32_t buffer_size = 0, stride = 0;auto ret = GetBufferSizeAndStride(stream, buffer, &buffer_size, &stride);if (ret != OK) {ALOGE("%s: Unsupported pixel format: 0x%x", __FUNCTION__,stream.override_format);return BAD_VALUE;}if (stream.override_format == HAL_PIXEL_FORMAT_BLOB) {//这里调用lock(),进行地址映射sensor_buffer->plane.img.img =static_cast<uint8_t*>(importer_->lock(buffer, usage, buffer_size));} else {...}}...
}status_t EmulatedRequestProcessor::GetBufferSizeAndStride(const EmulatedStream& stream,buffer_handle_t buffer, uint32_t* size/*out*/, uint32_t* stride/*out*/) {if (size == nullptr) {return BAD_VALUE;}switch (stream.override_format) {...case HAL_PIXEL_FORMAT_BLOB:if (stream.override_data_space == HAL_DATASPACE_V0_JFIF) {*size = stream.buffer_size; //这里的stream是configure stream阶段设置的*stride = *size;} else {return BAD_VALUE;}break;...}return OK;
}
Camera AIDL中JPEG bufferSize
request jpeg buffer大小是框架下发request到HAL层之前确定好的,有明确的计算规则:
jpegBufferSize = scaleFactor * (maxJpegBufferSize - kMinJpegBufferSize) + kMinJpegBufferSize
参数说明:
- scaleFactor 是缩放因子
- maxJpegBufferSize 是相机本身支持的最大Jpeg数据大小
- kMinJpegBufferSize 是框架定义的最小Jpeg数据大小
kMinJpegBufferSize = 256 * 1024 + blobHeader 这个是框架定的最小jpeg数据大小
blobHeader是框架定义的Jpeg Blob头部, 框架接口中定义的数据结构,有明确的大小。
//框架中最小jpeg blob//blob header定义
scaleFactor缩放因子
scaleFactor =(jpegImage.width * jpegImage.height) / (chosenMaxJpegResolution.width * chosenMaxJpegResolution.height)
参数说明:
- jpegImage 是request请求中的拍照流图像
- chosenMaxJpegResolution 是相机(HAL层)能输出的最大Jpeg图像分辨率。根据是否支持max sensor pixel mode有两种情况。
chosenMaxJpegResolution相机输出的最大Jpeg图像分辨率
相机(HAL层)最大能输出多大分辨率的Jpeg图像,是由硬件决定的。
1. 如果相机支持max sensor pixel mode输出,并且请求的jpeg分辨率超出defaultMaxJpegResolution,那么chosenMaxJpegResolution是相机特征中最大分辨率(tag: "availableStreamConfigurationsMaximumResolution")中最大jpeg分辩率。
2. 如果相机支持default sensor pixel mode,那么chosenMaxJpegResolution是相机特征中默认模式(tag: "availableStreamConfigurations")最大jpeg分辨率。
maxJpegBufferSize相机输出的最大Jpeg数据大小
相机输出的Jpeg图像多大,不仅和Sensor传感器有关,和编码模块也有关系。对于相同的一张图像输入不同的编码模块编码输出能力不同。
相机(HAL层)最大能输出多大的Jpeg图像,和输入图像的最大分辨率有关,
1. 如果相机是max sensor pixel mode输出,那么maxJpegBufferSize即为uhrMaxJpegBufferSize,
uhrMaxJpegBufferSize = (uhrMaxJpegResolution.width * uhrMaxJpegResolution.height) / (defaultMaxJpegResolution.width * defaultMaxJpegResolution.height) * defaultMaxJpegBufferSize;
参数说明:
- uhrMaxJpegResolution 是相机max sensor pixel mode下能输出的Jpeg最大分辩率,见上节有提到。
- defaultMaxJpegResolution 是相机default sensor pixel mode下输出的Jpeg最大分辨率,见上节。
- defaultMaxJpegBufferSize 是相机default sensor pixel mode下个输出的Jpeg最大大小, 间接体现了编码压缩能力。
2. 如果相机是default sensor pixel mode输出,那么maxJpegBufferSize即defaultMaxJpegBufferSize,
defaultMaxJpegBufferSize是相机特征直接上报的,tag "android.jpeg.maxSize"
Camera框架中JPEG bufferSize逻辑
CameraBlob定义
//hardware/interfaces/camera/device/aidl/android/hardware/camera/device/CameraBlob.aidl
package android.hardware.camera.device;import android.hardware.camera.device.CameraBlobId;@VintfStability
parcelable CameraBlob {CameraBlobId blobId;int blobSizeBytes;
}
最小Jpeg bufferSize
statis const ssize_t kMinJpegBufferSize =256 * 1024 + sizeof(aidl::android::hardware::camera::device::CameraBlob);
计算Jpeg bufferSize
ssize_t Camera3Device::getJpegBufferSize(const CameraMetadata &info, uint32_t width, uint32_t height) const {//获取defaultMaxJpegResolution//Get max jpeg size (area-wise) for default sensor pixel modecamera3::Size maxDefaultJpegResolution = SessionConfigurationUtils::getMaxJpegResolution(info,/*supportsUltraHighResolutionCapture*/false);//获取uhrMaxJpegResolution//Get max jpeg size (area-wise) for max resolution sensor pixel mode.camera3::Size uhrMaxJpegResolution = SessionConfigurationUtils::getMaxJpegResolution(info,/*isUltraHighResolution*/true);if (maxDefaultJpegResolution.width == 0) {ALOGE("%s: Camera %s: Can't find valid available jpeg sizes in static metadata!",__FUNCTION__, mId.c_str());return BAD_VALUE;}//确定sensor以何种模式输出bool useMaxSensorPixelModeThreshold = false;if (uhrMaxJpegResolution.width != 0 &&width * height > maxDefaultJpegResolution.width * maxDefaultJpegResolution.height) {//Use the ultra high res max jpeg size and max jpeg buffer size.useMaxSensorPixelModeThreshold = true;}//获取defaultJpegBufferSize//Get max jpeg buffer sizessize_t maxJpegBufferSize = 0;camera_metadata_ro_entry jpegBufMaxSize = info.find(ANDROID_JPEG_MAX_SIZE);if (jpegBufMaxSize.count == 0) {ALOGE("%s: Camera %s: Can't find maximum JPEG size in static metadata!", __FUNCTION__, mId.c_str());return BAD_VALUE;}maxJpegBufferSize = jpegBufMaxSize.data.i32[0];//确定最大Jpeg分辨率和最大Jpeg大小camera3::Size chosenMaxJpegResolution = maxDefaultJpegResolution;if (useMaxSensorPixelModeThreshold) {maxJpegBufferSize = SessionConfigurationUtils::getUHRMaxJpegBufferSize(uhrMaxJpegResolution, maxDefaultJpegResolution, maxJpegBufferSize);chosenMaxJpegResolution = uhrMaxJpegResolution;}assert(kMinJpegBufferSize < maxJpegBufferSize);//确定缩放因子//Calculate final jpeg buffer size for the given resolutionfloat scaleFactor = ((float) (width * height)) /(chosenMaxJpegResolution.width * chosenMaxJpegResolution.height);//计算得到request jpeg bufferSizessize_t jpegBufferSize = scaleFactor * (maxJpegBufferSize - kMinJpegBufferSize) +kMinJpegBufferSize);//校正request jpeg bufferSize,以确保jpeg bufferSize在最大值和最小值之间if (jpegBufferSize > maxJpegBufferSize) {ALOGI("%s: jpeg buffer size calculated is > maxJpeg bufferSize(%zd), clamping",__FUNCTION__, maxJpegBufferSize);jpegBufferSize = maxJpegBufferSize;}return jpegBufferSize;
}
Camera Demo AIDL HAL相关的相机特征参数
Demo AIDL HAL中相机特征参数是从.json中加载的,这里以后置相机为例,特征参数如下:
//hardware/google/camera/devices/EmulatedCamera/hwl/configs/emu_camera_back.json
"android.scaler.availableStreamConfigurations" : [..."33","1856","1392","OUTPUT","33","1280","720","OUTPUT",...
],"android.jpeg.maxSize" : ["300000"
],
...
相关文章:
Android14 Camera框架中Jpeg流buffer大小的计算
背景描述 Android13中,相机框架包含对AIDL Camera HAL的支持,在Android13或更高版本中添加的相机功能只能通过AIDL Camera HAL接口使用。 对于Android应用层来说,使用API34即以后版本的Camera应用程序通过Camera AIDL Interface访问到HAL层…...
springboot系列十四: 注入Servlet, Filter, Listener + 内置Tomcat配置和切换 + 数据库操作
文章目录 注入Servlet, Filter, Listener官方文档基本介绍使用注解方式注入使用RegistrationBean方法注入DispatcherServlet详解 内置Tomcat配置和切换基本介绍内置Tomcat配置通过application.yml完成配置通过类配置 切换Undertow 数据库操作 JdbcHikariDataSource需求分析应用…...
区块链共识机制详解
区块链共识机制详解 🤝 1. 什么是共识机制? 共识机制是区块链网络中,所有节点就某个状态(如交易的有效性)达成一致的规则和过程。它解决了在去中心化网络中如何确保数据一致性的问题。 2. 主流共识机制 2.1 工作量证…...
详解单例模式、模板方法及项目和源码应用
大家好,我是此林。 设计模式为解决特定问题提供了标准化的方法。在项目中合理应用设计模式,可以避免重复解决相同类型的问题,使我们能够更加专注于具体的业务逻辑,减少重复劳动。设计模式在定义系统结构时通常考虑到未来的扩展。…...
解耦的艺术_应用架构中的解耦
文章目录 Pre解耦的技术演化应用架构中的解耦小结 Pre 解耦的艺术_通过DPI依赖倒置实现解耦 解耦的艺术_通过中间层映射实现解耦 解耦的技术演化 技术的演化史,也是一部解耦的历史。从最初的面向对象编程(OOP)到Spring框架的依赖注入&…...
Winform(C#) 项目保存页面
上一张我们已经实现了TCP和串口页面的数据展示,和保存控件 我们这一章,实现如何去,控制保存。 一、控件展示 CheckBox TextBox Button label Name: checkSaveImage checkDelete txtSaveDays txtSaveImagePath btnSelectIm…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_array_init 函数
ngx_array_init 定义在 src/core/ngx_array.h static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size) {/** set "array->nelts" before "array->elts", otherwise MSVC thinks* that "…...
LangChain-基础(prompts、序列化、流式输出、自定义输出)
LangChain-基础 我们现在使用的大模型训练数据都是基于历史数据训练出来的,它们都无法处理一些实时性的问题或者一些在训练时为训练到的一些问题,解决这个问题有2种解决方案 基于现有的大模型上进行微调,使得它能适应这些问题(本…...
蓝思科技赋能灵伴科技:AI眼镜产能与供应链双升级
2月22日,蓝思科技宣布与AI交互领军企业杭州灵伴科技(Rokid)达成深度战略合作,通过整机组装与全产业链整合,为2025年全球AI眼镜出货量爆发式增长(预计达400万-1200万台)提供核心支撑。 双方合作通…...
2025前端框架最新组件解析与实战技巧:Vue与React的革新之路
作者:飞天大河豚 引言 2025年的前端开发领域,Vue与React依然是开发者最青睐的框架。随着Vue 3的全面普及和React 18的持续优化,两大框架在组件化开发、性能优化、工程化支持等方面均有显著突破。本文将从最新组件特性、使用场景和编码技巧三…...
零基础学QT、C++(六)制作桌面摄像头软件
目录 一、前言 二、Python项目包 三、C项目包 四、 项目说明 五、结语 章节汇总 一、前言 上一节,成功导入了OpenCV库 零基础学QT、C(四)QT程序打包-CSDN博客文章浏览阅读1.1k次,点赞29次,收藏23次。QT程序打包。将项…...
使用docker开发镜像编译
前言 搭建参考的是官网文档 环境 wsl2 wsl2内存分配和禁用swap 在window主机中,按下快捷键win+r,输入%UserProfile%,会跳转到用户目录,在该目录下,如果没有wsl配置文件,则创建一个.wslconfig,文件类型应为WSLCONFIG,而不是文档类型 我是用vscode来创建的,进入到.wslco…...
python-leetcode-回文链表
234. 回文链表 - 力扣(LeetCode) # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def isPalindrome(self, head: Optional[Lis…...
windows的CMD命令提示符
一.打开CMD命令窗口 方法一:开始菜单 -> Windows 系统 -> 命令提示符。方法二:按下快捷键 Win R 打开运行,输入 cmd 回车。方法三:点击任务栏搜索按钮,搜索 cmd 并打开。方法四:在资源管理器的地址…...
虚拟机从零实现机器人控制
1. 系统安装 因Docker不适合需要图形界面的开发,因此使用虚拟机VMware方便可视化界面方式查看效果,相关软件可以从官网下载,这里有一整套免费安装文件百度网盘地址: 2. ROS安装 Ubuntu 22.04:https://docs.ros.org…...
mysql之B+ 树索引 (InnoDB 存储引擎)机制
b树索引机制 B 树索引 (InnoDB 存储引擎)机制**引言:****1. 数据页结构与查找**2. 索引的引入**3. InnoDB 的 B 树索引****4. InnoDB B 树索引的注意事项****5. MyISAM 的索引方案 (选读,与 InnoDB 做对比)****6. MySQL 中创建和删除索引的语句** **B 树…...
Spring Boot定时任务原理
Spring Boot定时任务原理 在现代应用中,定时任务的调度是实现周期性操作的关键机制。Spring Boot 提供了强大的定时任务支持,通过注解驱动的方式,开发者可以轻松地为方法添加定时任务功能。本文将深入探讨 Spring Boot 中定时任务的实现原理…...
MySQL 架构
目录 1. MySQL 架构概览 (1) 客户端/服务器架构 (2) 存储引擎架构 2. 主要组件 (1) 客户端工具 (2) MySQL 服务器 (3) 存储引擎 3. MySQL 架构图 4. MySQL 架构的特点 5. MySQL 的高级架构 (1) 主从复制(Master-Slave Replication) (2) 主主…...
Unity 聊天气泡根据文本内容适配
第一步 拼接UI 1、对气泡图进行九宫图切割 2、设置底图pivot位置和对齐方式 pivot位置:(0,1) 对齐方式:左上对齐 3、设置文本pivot位置和对齐方式,并挂上布局组件 pivot设置和对齐方式和底图一样&#…...
ok113i平台——usb触摸屏驱动开发
在嵌入式Linux系统中,如果USB触摸屏能够检测到并且在手指移动时有数据,但点击无法触发,这可能是因为触摸屏驱动或配置的问题。以下是一些可能的解决方法: 1. 确认驱动支持 首先,确保您使用的触摸屏驱动程序完全支持您…...
AI 百炼成神:逻辑回归, 垃圾邮件分类
第二个项目:逻辑回归垃圾邮件分类 项目代码下载地址:https://download.csdn.net/download/m0_56366541/90398247 项目目标 学习逻辑回归的基本概念。使用逻辑回归算法来实现垃圾邮件的分类。理解如何处理文本数据以及如何评估分类模型的性能。项目步骤 准备数据集 我们将使…...
【Unity】Unity clone 场景渲染的灯光贴图异位问题
Unity clone 场景渲染的灯光贴图异位问题 问题 需要将一个场景clone 一份保存到本地 当克隆完成后,副本场景的灯光贴图异位了,与原场景存在较大的差别 问题原因 场景被clone 后,场景的灯光渲染数据不能共用,即Lightmapping.li…...
Android Studio安装配置及运行
一、下载Android Studio 官网下载:下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 跳转到下载界面,选择同意条款,并点击下载,如图: 二、详细安装 双击下载的文件 三、配置Android Studio …...
运维脚本——9.配置漂移检测
场景:检测服务器配置与基准配置的差异,防止未经授权的修改。 示例:使用Ansible Playbook对比当前配置与标准模板。 - hosts: alltasks:- name: Check SSH configuration against baselineansible.builtin.diff:path: /etc/ssh/sshd_configori…...
FTP 实验(ENSP模拟器实现)
FTP 概述 FTP(File Transfer Protocol,文件传输协议)是一种用于在网络上进行文件传输的标准协议。它允许用户在两台计算机之间上传和下载文件。 1、FTP采用客户端-服务器模型,客户端通过FTP客户端软件,连接到FTP服务…...
基于 DeepSeek + Gemeni 打造 AI+前端的多人聊天室
开源项目 botgroup.chat 介绍 AI 多人聊天室: 一个基于 React 和 Cloudflare Pages(免费一键部署) 的多人 AI 聊天应用,支持多个 AI 角色同时参与对话,提供类似群聊的交互体验。体验地址:https://botgroup.chat 开源仓库&#x…...
rust笔记5-derive属性2
在 Rust 中,derive 是一种自动为结构体或枚举实现特定 trait 的机制。通过 #[derive(...)] 属性,Rust 编译器可以自动生成一些常见 trait 的实现代码,从而减少手动编写重复代码的工作量。 以下是对 Copy、Clone、Hash 和 Default 这几个常用 trait 的详细介绍和示例: 1. C…...
【电机控制器】ESP32-C3语言模型——豆包
【电机控制器】ESP32-C3语言模型——豆包 文章目录 [TOC](文章目录) 前言一、简介二、代码三、实验结果四、参考资料总结 前言 使用工具: 提示:以下是本篇文章正文内容,下面案例可供参考 一、简介 二、代码 #include <WiFi.h> #inc…...
Flask实现高效日志记录模块
目录 一. 简介: 1. 为什么需要请求日志 二. 日志模块组成 1. 对应日志表创建(包含日志记录的关键字段) 2. 编写日志记录静态方法 3. 在Flask中捕获请求日志 4. 捕获异常并记录错误日志 5. 编写日志接口数据展示 6. 写入数据展…...
基于python深度学习遥感影像地物分类与目标识别、分割
我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB,遥感大数据时…...
