嵌入式Linux下Camera编程--V4L2(2)

2019-01-19 10:47

#define V4L2_PIX_FMT_Y41P v4l2_fourcc('Y','4','1','P')

#define V4L2_PIX_FMT_NV12 v4l2_fourcc('N','V','1','2') #define V4L2_PIX_FMT_NV21 v4l2_fourcc('N','V','2','1')

#define V4L2_PIX_FMT_YUV410 v4l2_fourcc('Y','U','V','9') #define V4L2_PIX_FMT_YUV420 v4l2_fourcc('Y','U','1','2') #define V4L2_PIX_FMT_YYUV v4l2_fourcc('Y','Y','U','V') #define V4L2_PIX_FMT_HI240 v4l2_fourcc('H','I','2','4') #define V4L2_PIX_FMT_HM12 v4l2_fourcc('H','M','1','2')

#define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B','A','8','1')

#define V4L2_PIX_FMT_MJPEG v4l2_fourcc('M','J','P','G') #define V4L2_PIX_FMT_JPEG v4l2_fourcc('J','P','E','G') #define V4L2_PIX_FMT_DV v4l2_fourcc('d','v','s','d') #define V4L2_PIX_FMT_MPEG v4l2_fourcc('M','P','E','G')

#define V4L2_PIX_FMT_WNVA v4l2_fourcc('W','N','V','A') #define V4L2_PIX_FMT_SN9C10X v4l2_fourcc('S','9','1','0') #define V4L2_PIX_FMT_PWC1 v4l2_fourcc('P','W','C','1') #define V4L2_PIX_FMT_PWC2 v4l2_fourcc('P','W','C','2') #define V4L2_PIX_FMT_ET61X251 v4l2_fourcc('E','6','2','5')

fxxk,真TNND多。

请注意,此时取到的宽,高,像素格式均正确。但不知为何,bytesperline却为0。

3.4:设置当前捕获格式

fmt.fmt.pix.width = 640; fmt.fmt.pix.height = 480;

fmt.fmt.pix.pixelformat=V4L2_PIX_FMT_YUYV; rel = ioctl(fdUsbCam, VIDIOC_S_FMT, &fmt); if (rel < 0) {

printf(\return -1;

}

此时,再取当前捕获格式,则一切正常。包括 bytesperline

3.5:读取Stream 设置。

struct v4l2_streamparm *setfps;

setfps=(struct v4l2_streamparm *) calloc(1, sizeof(struct v4l2_streamparm)); memset(setfps, 0, sizeof(struct v4l2_streamparm)); setfps->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

rel = ioctl(fdUsbCam, VIDIOC_G_PARM, setfps); if(rel == 0) {

printf(\ Frame rate: %u/%u\\n\

setfps->parm.capture.timeperframe.denominator, setfps->parm.capture.timeperframe.numerator ); } else {

perror(\ return -1; }

注意: ioctl(fdUsbCam, VIDIOC_G_PARM, setfps); 参数3也是i/o 参数。必须要首先其type. struct v4l2_streamparm {

enum v4l2_buf_type type; union {

struct v4l2_captureparm capture; struct v4l2_outputparm output; __u8 raw_data[200]; } parm;

};

type字段描述的是在涉及的操作的类型。对于视频捕获设备,应该为V4L2_BUF_TYPE_VIDEO_CAPTURE。对于输出设备应该为

V4L2_BUF_TYPE_VIDEO_OUTPUT。它的值也可以是V4L2_BUF_TYPE_PRIVATE,在这种情况下,raw_data字段用来传递一些私有的,不可移植的,甚至是不鼓励的数据给内核 。

enum v4l2_buf_type {

V4L2_BUF_TYPE_VIDEO_CAPTURE = 1, V4L2_BUF_TYPE_VIDEO_OUTPUT = 2, V4L2_BUF_TYPE_VIDEO_OVERLAY = 3, V4L2_BUF_TYPE_VBI_CAPTURE = 4, V4L2_BUF_TYPE_VBI_OUTPUT = 5,

V4L2_BUF_TYPE_SLICED_VBI_CAPTURE = 6, V4L2_BUF_TYPE_SLICED_VBI_OUTPUT = 7, V4L2_BUF_TYPE_PRIVATE = 0x80, };

咱们当然选用V4L2_BUF_TYPE_VIDEO_CAPTURE

对于捕获设备而言,parm.capture字段是要关注的内容,这个结构体如下: struct v4l2_captureparm

{

__u32 capability; __u32 capturemode; struct v4l2_fract timeperframe; __u32 extendedmode; __u32 readbuffers; __u32 reserved[4]; };

timeperframe字段用于指定想要使用的帧频率,它又是一个结构体:

struct v4l2_fract { __u32 numerator; __u32 denominator; };

numerator 和denominator所描述的系数给出的是成功的帧之间的时间间隔。 numerator 分子, denominator 分母。主要表达每次帧之间时间间隔。 numerator/denominator秒一帧。

3.6:设置Stream参数。(主要是采集帧数)

setfps->parm.capture.timeperframe.numerator=1; setfps->parm.capture.timeperframe.denominator= 60; rel = ioctl(fdUsbCam, VIDIOC_S_PARM, setfps); if(rel != 0) {

printf(\ return -1; }

当然,setfps的其它项目,都是之前使用VIDIOC_G_PARM取得的。

3.7:创建一组缓冲区(buf) struct v4l2_requestbuffers rb;

memset(&rb, 0, sizeof(struct v4l2_requestbuffers)); rb.count = 3;

rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; rb.memory = V4L2_MEMORY_MMAP;

rel = ioctl(fdUsbCam, VIDIOC_REQBUFS, &rb); if (rel < 0) {

printf(\ return -1; }

其中参数rb为:struct v4l2_requestbuffers:

struct v4l2_requestbuffers {

__u32 count;

enum v4l2_buf_type type; enum v4l2_memory memory; __u32 reserved[2]; };

type 字段描述的是完成的I/O操作的类型。通常它的值要么是视频获得设备的V4L2_BUF_TYPE_VIDEO_CAPTURE ,要么是输出设备的V4L2_BUF_TYPE_VIDEO_OUTPUT

struct v4l2_memory:

enum v4l2_memory {

V4L2_MEMORY_MMAP = 1, V4L2_MEMORY_USERPTR = 2, V4L2_MEMORY_OVERLAY = 3, };

想要使用内存映谢的缓冲区,它将会把memory字段置为V4L2_MEMORY_MMAP,count置为它想要使用的缓冲区的数目。

顺便看看USB TO Serail:

Device Drivers --->[*] USB support ---> USB Serial Converter support ---> USB Prolific 2303 Single Port Serial Driver

USB Prolific 2303 Single Port Serial Driver是指出支持pl2303芯片的USB 2 serial. pl2303.ko

USB Serial Converter support是基础driver. 对应usbserial.ko

注1:ioctl中常用的cmd.

VIDIOC_REQBUFS:分配内存

VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址 VIDIOC_QUERYCAP:查询驱动功能

VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式 VIDIOC_S_FMT:设置当前驱动的频捕获格式 VIDIOC_G_FMT:读取当前驱动的频捕获格式 VIDIOC_TRY_FMT:验证当前驱动的显示格式 VIDIOC_CROPCAP:查询驱动的修剪能力 VIDIOC_S_CROP:设置视频信号的边框 VIDIOC_G_CROP:读取视频信号的边框 VIDIOC_QBUF:把数据从缓存中读取出来 VIDIOC_DQBUF:把数据放回缓存队列 VIDIOC_STREAMON:开始视频显示函数 VIDIOC_STREAMOFF:结束视频显示函数

VIDIOC_QUERYSTD:检查当前视频设备支持的标准,例如PAL或NTSC。 VIDIOC_G_PARM :得到Stream信息。如帧数等。 VIDIOC_S_PARM:设置Stream信息。如帧数等。

注2:

如何判断某ioctl cmd所用参数类型: 例如:

ioctl-cmd: VIDIOC_QUERYCAP.

它的返回参数类型ioctl(fd, cmd, 参数)。

首先想到的是从kernel Source v4l2_ioctl.c中看。但这比较麻烦,又个简单办法:可以在video2dev.h中看到:

#define VIDIOC_QUERYCAP _IOR ('V', 0, struct v4l2_capability)

即使用cmd为 VIDIOC_QUERYCAP 时,参数为 struct v4l2_capability


嵌入式Linux下Camera编程--V4L2(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2012年武汉市中考数学模拟试题(1)学知报1

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: