android摄像头(camera)之buffer管理
一,V4L2驱动申请buffer
视频应用可以通过两种方式从V4L2驱动申请buffer
1. V4L2_MEMORY_USERPTR方式, 顾名思义是用户空间指针的意思,应用层负责分配需要的内存空间,然后以指针的形式传递给V4L2驱动层,V4L2驱动会把capture的内容保存到指针所指的空间
一般来说,应用层需要确保这个内存空间物理上是连续的(IPU处理单元的需求),在android系统可以通过PMEM驱动来分配大块的连续物理内存。应用层在不需要的时候要负责释放申请的PMEM内存。
2. V4L2_MEMORY_MMAP方式,内存映射模式,应用调用VIDIOC_REQBUFS ioctl分配设备buffers,参数标识需要的数目和类型。这个ioctl也可以用来改变buffers的数据以及释放分配的内存,当然
这个内存空间一般也是连续的。在应用空间能够访问这些物理地址之前,必须调用mmap函数把这些物理空间映射为用户虚拟地址空间。
虚拟地址空间是通过munmap函数释放的; 而物理内存的释放是通过VIDIOC_REQBUFS来实现的(设置参数buf count为(0)),物理内存的释放是实现特定的,mx51 v4l2是在关闭设备时进行释放
的。所以二者都是申请连续的物理内存,只是申请和释放的方式不同
2.V4L2_MEMORY_USERPTR,qualcomm在android 4.1后使用ion方式分配内存,原来是使用pmem分配内存,先从hal层申请内存空间,然后给camera驱动用的。
二,camera的测试代码流程
1,打开设备
-
static int open_device(char *dev_name)
{
assert(dev_name);
int fd = -1;
fd = open(dev_name , O_RDWR);
if( -1 == fd ) {
MYLOGD("open %s fail: %s\n", dev_name, strerror (errno));
exit(EXIT_FAILURE);
}
MYLOGD("the fd of %s is %d ", dev_name, fd);
return fd;
}
2,初始化camera,设置camera输出图像的格式
-
static int init_cam_device(int dev_fd)
{
int ret = -1;
int input_index;
//ret = fimc_v4l2_querycap(dev_fd);
//assert(ret == 0);
//获取到输入源通道
input_index = cam_v4l2_enuminput(dev_fd);
assert(input_index == 0);
ret = cam_v4l2_s_input(dev_fd, input_index);
assert(ret == 0);
MYLOGD("VIDIOC_S_FMT start... dev_fd = %d\n", dev_fd);
ret = cam_v4l2_s_format(dev_fd, IMAGE_HEIGHT, IMAGE_WIDTH,
V4L2_PIX_FMT_YUYV);
assert(ret == 0);
ret = cam_v4l2_g_fmt(dev_fd);
assert(ret == 0);
init_cam_mmap(dev_fd);
return 1;
}
三,向内核申请buffer,并将buffer映射mmap到引用空间
1)数据结构
struct buffer{
void *start; //mmap后的地址;
size_t length//大小;
}user_buffers[4]; //用于记录将内核buffer映射mmap到用户空间的地址和大小
2)申请4个buffer
camera_v4l2_reqbuf(dev_fd, 4);
3)查询申请到的buffer信息,比如每个buffer的其实位置和大小
camera_v4l2_querybuf(dev_fd, &buf, buf_index);
4)将buffer映射到用户空间
user_buffers[buf_index].length = buf.length;
user_buffers[buf_index].start = mmap(NULL, buf.length,PROT_READ | PROT_WRITE /* required */ ,MAP_SHARED /* recommended */ ,dev_fd, buf.m.offset);
注释: NULL: /* start anywhere */
buf.length:buffer在内核的地址
buf.m.offset:内核中的buffer大小
5),将所有的buffer全部放到循环工作队列中,集中管理
for (i = 0; i < max_buffers; ++i)
{
camera_v4l2_qbuf(dev_fd, i);
}
6),开始获取图像:
ioctl(dev_fd, VIDIOC_STREAMON, &type);
7),通过select来监控camera数据是否准备好
FD_ZERO (&rd_set);
FD_SET (dev_fd, &rd_set);
ret = select(maxfd + 1, &rd_set, NULL, NULL, NULL);
if(FD_ISSET(dev_fd, &rd_set))//如果camera准备好,就可以去读数据了
read_frame(dev_fd)
8),read_frame(dev_fd)的实现:
//select仅仅是知道有数据可以读了,但是在多个buffer中,
//不知道是哪个buffer准备好了,所以将准备好的buffer出队列,从而知道buffer的编号
int index = camera_v4l2_dqbuf(dev_fd);
//将buffer中的yuv420数据转换成rgb565,
//因为lcd是没办法显示yuv的,所以需要将yuv转换成rgb565
yuyv_to_rgb(src_address, data_buf);
//将转换好的rgb565数据方到framebuffer中去显示
show_rgb565_img(data_buf, LCD_WIDTH, LCD_HEIGHT);
四,高通buffer管理使用代码流程
一,HAL->kernel 分配buffer
mm_stream_request_buf->//Mm_camera_stream.c (8953_dual_camera\src\hardware\qcom\camera\qcamera2\stack\mm-camera-interface\src)
ioctl(my_obj->fd, VIDIOC_REQBUFS, &bufreq);//向kernel发送IOCTL命令,请求分配buffer
{=================kernel===================<
v4l_reqbufs->//V4l2-ioctl.c (8953_dual_camera\src\kernel\msm-3.18\drivers\media\v4l2-core)
//ops->vidioc_reqbufs(file, fh, p)
camera_v4l2_reqbufs->//Camera.c (camera)
vb2_reqbufs->//Videobuf2-core.c (\8953_dual_camera\src\kernel\msm-3.18\drivers\media\v4l2-core)
__reqbufs->//
__vb2_queue_alloc->
__vb2_buf_mem_alloc->//分配video buffer
//最后通过mmap函数将buffer映射到用户空间
=================kernel===================>
}
二,HAL->kernel 读取一帧数据
mm_stream_read_msm_frame->//Mm_camera_stream.c (8953_dual_camera\src\hardware\qcom\camera\qcamera2\stack\mm-camera-interface\src)
ioctl(my_obj->fd, VIDIOC_DQBUF, &vb);//向kernel发送IOCTL命令,向kernel读取一帧数据
//kernel流程同【一】
三,HAL->kernel 向kernel buffer释放一个buffer,使kernel可以填充新的视频数据
mm_stream_qbuf->//Mm_camera_stream.c (8953_dual_camera\src\hardware\qcom\camera\qcamera2\stack\mm-camera-interface\src)
ioctl(my_obj->fd, VIDIOC_QBUF, &buffer);//向kernel发送IOCTL命令,向kernel释放buffer,让kernel可以填充新的视频数据
//kernel流程同【一】
转载于:https://www.cnblogs.com/shelley-AL/p/10683234.html
android摄像头(camera)之buffer管理相关推荐
- android摄像头方向与屏方向,Android通过ExifInterface判断Camera图片方向的方法
Android的Camera相关应用开发中,有一个必须搞清楚的知识点,就是Camera的预览方向和拍照方向 图像的Sensor方向:手机Camera的图像数据都是来自于摄像头硬件的图像传感器(Imag ...
- android摄像头预览功能,android通过camera和surfaceview选择摄像头并即时预览
在使用android设备的摄像头的时候我们有两种选择: 1.调用intent方法使用摄像头 2.通过camera类使用摄像头 第一种方法非常方便,不过需要跳到新的activity中,这样的用户体验并不 ...
- android摄像头框架,FS_S5PC100平台上Android Camera架构分析
1. Android-Camera架构分析 Android的camera系统架构自上而下分别为应用层-框架层-硬件抽象层-linux驱动层.层与层之间通过Binder.回调函数或者系统调用联系. 我们 ...
- Android Camera相机开发示例、Android 开发板 USB摄像头采集、定期拍照、定时拍照,安卓调用摄像头拍照、Android摄像头预览、监控,USB摄像头开发、摄像头监控代码
我们有个需求,在机器上加个摄像头,定时拍照: 我到网上搜索,发现没有快速上手和简单使用的: 个人感觉,大部分博客写得很乱,或者长篇大论: 而我只想简单实现功能,并不打算学习多少理论: 下面代码是我写来 ...
- Unity Vuforia 之 简单实现Vuforia调用Android设备外接摄像头camera实现AR
Unity Vuforia 之 简单实现Vuforia调用Android设备外接摄像头camera实现AR 目录 Unity Vuforia 之 简单实现Vuforia调用Android设备外接摄像头 ...
- android mtk camera startpreview,android8.1 mtk camera hal各种操作流程
最近一年,一直在做android上的视频编解码和录相.以及camera hal和系统框架这一块.随着做的慢慢的深入,越发觉得mtk的camera hal这一块,有其独到之处.偏偏网上相关的资料却是极少 ...
- android 摄像头参数,获取Android设备上的详细的摄像头信息
原标题:获取Android设备上的详细的摄像头信息 如何获取Android设备上的详细的摄像头信息呢? 目前Samsung的Galaxy Tab和Nexus S均有前置摄像头,获取Android摄像头 ...
- Android studio设置相机权限,如何强制将“android.permission.CAMERA”权限添加到Codename中的清单中...
我试图在Codename One中显示后置摄像头的实时预览.我使用原生界面(我首先针对的是Android). 为了让我的应用程序能够使用相机而不会弄乱构建提示,我在主窗体中添加了以下行: if (Ca ...
- 介绍 Android 的 Camera 框架
总体介绍 Android Camera 框架从整体上看是一个 client/service 的架构,有两个进程: 一个是 client 进程,可以看成是 AP 端,主要包括 JAVA 代码与一些 n ...
- Android之 Camera相机使用
一 简介 1.1 随着信息时代的发展,相机在我们生活中使用越来越频繁,也成为手机的基本配置之一.相机可以用来拍照,拍视频,人脸识别,视频聊天,扫码支付,监控等常见领域 不管什么场景,基本原理都差不多, ...
最新文章
- AcWing 397. 逃不掉的路(边双连通分量缩点成树 + 树链剖分乱搞)
- 【数学与算法】二部图、匈牙利匹配、稳定婚配
- 微软BI 之SSRS 系列 - 解决Pie Chart 中控制标签外部显示与标签重叠的问题
- stl变易算法(三)
- 敏感性分析算法 程序_计算机程序设计艺术(TAOCP)精读笔记1 - 算法分析真正应该有的样子 Part 1...
- 小议数据库主键选取策略(转)
- Embedding技术在商业搜索与推荐场景的实践
- 前缀树python实现
- esayExcel自定义注解导出表头批注
- 尚品汇 09_支付模块
- 如何在ex表格导入php_怎么使用php把表格中的数据导入到excel中,php如何快速导入excel表格数据...
- untiy Socket通信一篇通
- 微信小程序实现多语言方案|中英互译
- 身为UI设计师,如何应对失业的恐慌
- 医疗行业容灾备份解决方案
- 春招笔记(十一)--设计模式
- vb.net 教程 5-9 屏幕范围内取色
- 信奥中的数学之入门组(面向小学四年级至六年级以及初一学生)
- 专业jpg转pdf软件
- [PTA]习题3-5 三角形判断
热门文章
- iOS展示超大图片或超高分辨率图片崩溃解决方法
- GDB 调试错误解决
- DeepFool公式理解
- 《Residual Networks Behave Like Ensembles of Relatively Shallow Networks》笔记
- 洛谷P6014 斗牛
- 计算机显卡型号中数字含义详解,科普入门 | 那些显卡型号告诉我们的事
- 计算机操作系统产生的先后顺序,任务调度优先级
- 重磅消息集中来袭 A股再现“独立行情”?
- 《2022谷歌开发者大会》参会之旅
- 2019年个人所得税计算机模板,2019年最新个税计算Excel模版,人手一份!