android摄像头(camera)之 v4l2的c测试代码【转】
转自:https://blog.csdn.net/ldswfun/article/details/8745577
在移植android hal的过程中,移植的首要任务是要确保驱动完好,camera是属于字符设备,但是对于其测试代码的编写就不像一般的驱动那么简单啦,因为camera的测试代码一定是要用v4l2 api,所以接下来就是介绍我们写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;
- }
4,向内核申请buffer,并将buffer映射mmap到引用空间
struct buffer
{
void *start; //mmap后的地址;
size_t length//大小;
}user_buffers[4]; //用于记录将内核buffer映射mmap到用户空间的地址和大小
//申请4个buffer
cam_v4l2_reqbuf(dev_fd, 4);
//查询申请到的buffer信息,比如每个buffer的其实位置和大小
cam_v4l2_querybuf(dev_fd, &buf, buf_index);
//将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)
{
cam_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 = cam_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);
这个过程仅仅是将一个流程写下来了,每个函数都是封装了一次,没办法一一去写出来,
所以我会将源代码文件上传,给大家去下载。包含Android.mk
可以到这个链接下载:
http://download.csdn.net/detail/ldswfun/5208766
同时附上一些图片让大家去理解这个过程

android摄像头(camera)之 v4l2的c测试代码【转】的更多相关文章
- android摄像头(camera)之buffer管理
一,V4L2驱动申请buffer 视频应用可以通过两种方式从V4L2驱动申请buffer 1. V4L2_MEMORY_USERPTR方式, 顾名思义是用户空间指针的意思,应用层负责分配需要的内存空间 ...
- Android中直播视频技术探究之---采集摄像头Camera视频源数据进行推流(采用金山云SDK)
一.前言 在之前已经详细介绍了Android中的一种视频数据源:Camera,不了解的同学可以点击进入:Android中Camera使用详解 ,在这篇文章中我们介绍了如何采集摄像头的每一帧数据,然后进 ...
- Android中直播视频技术探究之---摄像头Camera视频源数据采集解析
一.前言 在视频直播中一般都是两种视频数据源,一个是摄像头数据,一个是录制桌面数据,而一般来说美女妹子直播都是来自于摄像头数据,游戏直播都是录制桌面数据的,那么今天就来看看第一个数据源数据采集分析,A ...
- Android Camera 通过V4L2与kernel driver的完整交互过程
http://blog.chinaunix.net/uid-26215986-id-3552456.html 原文地址:Android Camera 通过V4L2与kernel driver的完整交互 ...
- 介绍 Android 的 Camera 框架
总体介绍 Android Camera 框架从整体上看是一个 client/service 的架构,有两个进程:一个是 client 进 程,可以看成是 AP 端,主要包括 JAVA 代码与一些 na ...
- Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)
Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView) 分类: Android开发 Androi ...
- Android:Camera
Android Camera开发 Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可 ...
- Android USB Camera(1) : 调试记录【转】
转自:http://blog.csdn.net/eternity9255/article/details/53069037 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 前言 ...
- android摄像头获取图像——第二弹
使用android内的Camera对象 (1)Camera是控制着摄像头的api,拥有一系列控制摄像头的上层方法:camera类能够调用底层的摄像头接口,完成启动摄像头.预 览摄像头图像.拍照等功能: ...
随机推荐
- 自学Aruba7.3-Aruba安全认证-802.1x认证(web页面配置)
点击返回:自学Aruba之路 自学Aruba7.3-Aruba安全认证-802.1x认证(web页面配置) 步骤1 建立AP Group,命名为test802-group 步骤2 将AP加入到AP ...
- [luogu1912][bzoj4196][NOI2015]软件管理器
题解 树剖模板题,每次改变是\(1\)或者是\(0\),区间求和和区间修改就可了. ac代码 # include <cstdio> # include <cstring> # ...
- linux-shell数据重定向详细分析
在了解重定向之前,我们先来看看linux 的文件描述符.linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写 ...
- luogu4181 [USACO18JAN]Rental Service (贪心)
我们要出租的话,一定是出租产奶量最少的牛 那我们就看出租多少头牛(其他的卖奶)的时候答案最大就可以了. (注意N有可能小于R) #include<bits/stdc++.h> #defin ...
- hdu5791(DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5791 参考博客:https://blog.csdn.net/wuxuanyi27/article/de ...
- .net Forms身份验证不能用在应用的分布式部署中吗?
参照网上的一些方法,使用Forms身份验证对应用进行分布式部署,发现没有成功. 应用部署的两台内网服务器:192.168.1.19,192.168.1.87,使用Nginx做负载分配,配置完全相同:每 ...
- StringTokenizer 的性能看来真的不用担心
一直以来,分析HTTP的Header使用的都是StringTokenizer,但是看过jdk中关于StringTokenizer的介绍: StringTokenizer 是出于兼容性的原因而被保留的遗 ...
- how to calculate the best fit to a plane in 3D, and how to find the corresponding statistical parameters
sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...
- IP基本原理
IP基本原理 一.IP基本原理 IP是网络层协议,也是当今应用最广泛的网络协议之一 IP协议规定了数据的封装方式,网络节点的标识方法,用于网络上数据的端到端的传递. 1.IP及其相关协议 2.IP的主 ...
- ElasticSearch 批量增加索引
服务端批量增加索引,版本是5.1.1 TransportClient client; Settings esSettings = Settings.builder() .put("clust ...