转自:https://blog.csdn.net/ldswfun/article/details/8745577

在移植android hal的过程中,移植的首要任务是要确保驱动完好,camera是属于字符设备,但是对于其测试代码的编写就不像一般的驱动那么简单啦,因为camera的测试代码一定是要用v4l2 api,所以接下来就是介绍我们写camera的测试代码的流程。

1,打开设备

  1. static int open_device(char *dev_name)
  2. {
  3. assert(dev_name);
  4. int fd = -1;
  5. fd = open(dev_name , O_RDWR);
  6. if( -1 == fd )
  7. {
  8. MYLOGD("open %s fail: %s\n", dev_name, strerror (errno));
  9. exit(EXIT_FAILURE);
  10. }
  11. MYLOGD("the fd of %s is %d ", dev_name, fd);
  12. return fd;
  13. }

2,初始化camera,设置camera输出图像的格式

  1. static int init_cam_device(int dev_fd)
  2. {
  3. int ret = -1;
  4. int input_index;
  5. //ret = fimc_v4l2_querycap(dev_fd);
  6. //assert(ret == 0);
  7. //获取到输入源通道
  8. input_index = cam_v4l2_enuminput(dev_fd);
  9. assert(input_index == 0);
  10. ret = cam_v4l2_s_input(dev_fd, input_index);
  11. assert(ret == 0);
  12. MYLOGD("VIDIOC_S_FMT start... dev_fd = %d\n", dev_fd);
  13. ret = cam_v4l2_s_format(dev_fd, IMAGE_HEIGHT, IMAGE_WIDTH, V4L2_PIX_FMT_YUYV);
  14. assert(ret == 0);
  15. ret = cam_v4l2_g_fmt(dev_fd);
  16. assert(ret == 0);
  17. init_cam_mmap(dev_fd);
  18. return 1;
  19. }

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测试代码【转】的更多相关文章

  1. android摄像头(camera)之buffer管理

    一,V4L2驱动申请buffer 视频应用可以通过两种方式从V4L2驱动申请buffer 1. V4L2_MEMORY_USERPTR方式, 顾名思义是用户空间指针的意思,应用层负责分配需要的内存空间 ...

  2. Android中直播视频技术探究之---采集摄像头Camera视频源数据进行推流(采用金山云SDK)

    一.前言 在之前已经详细介绍了Android中的一种视频数据源:Camera,不了解的同学可以点击进入:Android中Camera使用详解 ,在这篇文章中我们介绍了如何采集摄像头的每一帧数据,然后进 ...

  3. Android中直播视频技术探究之---摄像头Camera视频源数据采集解析

    一.前言 在视频直播中一般都是两种视频数据源,一个是摄像头数据,一个是录制桌面数据,而一般来说美女妹子直播都是来自于摄像头数据,游戏直播都是录制桌面数据的,那么今天就来看看第一个数据源数据采集分析,A ...

  4. Android Camera 通过V4L2与kernel driver的完整交互过程

    http://blog.chinaunix.net/uid-26215986-id-3552456.html 原文地址:Android Camera 通过V4L2与kernel driver的完整交互 ...

  5. 介绍 Android 的 Camera 框架

    总体介绍 Android Camera 框架从整体上看是一个 client/service 的架构,有两个进程:一个是 client 进 程,可以看成是 AP 端,主要包括 JAVA 代码与一些 na ...

  6. Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)

    Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView) 分类: Android开发 Androi ...

  7. Android:Camera

    Android Camera开发 Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可 ...

  8. Android USB Camera(1) : 调试记录【转】

    转自:http://blog.csdn.net/eternity9255/article/details/53069037 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 前言 ...

  9. android摄像头获取图像——第二弹

    使用android内的Camera对象 (1)Camera是控制着摄像头的api,拥有一系列控制摄像头的上层方法:camera类能够调用底层的摄像头接口,完成启动摄像头.预 览摄像头图像.拍照等功能: ...

随机推荐

  1. 投入机器学习的怀抱?先学Python吧

    前两天写了篇文章,给想进程序员这个行当的同学们一点建议,没想到反响这么好,关注和阅读数都上了新高度,有点人生巅峰的感觉呀.今天趁热打铁,聊聊我最喜欢的编程语言——Python. 为什么要说Python ...

  2. 自学Zabbix之路15.1 Zabbix数据库表结构简单解析-Hosts表、Hosts_groups表、Interface表

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix之路15.1 Zabbix数据库表结构简单解析-Hosts表.Hosts_grou ...

  3. FreeRTOS 中 systick 相关配置

    @2018-7-16 > systick 属性配置 在文件 <port.c> 中函数 void vPortSetupTimerInterrupt( void ) 中配置计数周期.时钟 ...

  4. 51nod1236 序列求和 V3 【数学】

    题目链接 51nod1236 题解 用特征方程求得斐波那契通项: \[f(n) = \frac{(\frac{1 + \sqrt{5}}{2})^{n} - (\frac{1 - \sqrt{5}}{ ...

  5. 洛谷 P1110 [ZJOI2007]报表统计 解题报告

    P1110 [ZJOI2007]报表统计 题目描述 \(Q\)的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小\(Q\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...

  6. 洛谷 P2345 奶牛集会 解题报告

    P2345 奶牛集会 题目背景 MooFest, 2004 Open 题目描述 约翰的N 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨 ...

  7. C++11并发——多线程std::thread (一)

    https://www.cnblogs.com/haippy/p/3284540.html 与 C++11 多线程相关的头文件 C++11 新标准中引入了四个头文件来支持多线程编程,他们分别是< ...

  8. 九、java容器

    目录 一.容器的概念 二.Cpllection接口 三.Iterator接口 四.增强的for循环 五.Set接口 六.List接口和Comparable接口 八.Map接口 九.自动打包/解包 十. ...

  9. 【leetcode】 Merge Intervals

    Merge Intervals Given a collection of intervals, merge all overlapping intervals. For example,Given  ...

  10. Docker从入门到飞升:基础配置安装

    导读 Docker近几年非常火,因为它是容器虚拟化,更能够充分提高硬件资源的使用率.其实利用率高不算什么,它最大的优势是能给让运维人员或者开发人员快速部署和交付资源,大大提高了工作效率.几乎所有的大企 ...