Linux之V4L2基础编程(3)

int ioctl(int fd, int request, struct v4l2_crop *argp); int ioctl(int fd, int request, const struct v4l2_crop *argp);

相关结构体:

struct v4l2_crop

{

enum v4l2_buf_type type;// 应用程序设置

struct v4l2_rect c;

}

7.video Inputs and Outputs

VIDIOC_G_INPUT 和 VIDIOC_S_INPUT 用来查询和选则当前的 input,一个 video 设备 节点可能对应多个视频源,比如 saf7113 可以最多支持四路 cvbs 输入,如果上层想在四 个cvbs视频输入间切换,那么就要调用 ioctl(fd, VIDIOC_S_INPUT, &input) 来切换。

VIDIOC_G_INPUT and VIDIOC_G_OUTPUT 返回当前的 video input和output的index.

相关函数:

int ioctl(int fd, int request, struct v4l2_input *argp);

相关结构体:

struct v4l2_input {
__u32 index;
/* Which input*/
__u8 name[
32]; /* Label*/
__u32 type;
/* Type of input*/
__u32 audioset;
/* Associated audios (bitfield)*/
__u32 tuner;
/* Associated tuner*/
v4l2_std_id std;
__u32 status;
__u32 reserved[
4];
};

我们可以通过VIDIOC_ENUMINPUT and VIDIOC_ENUMOUTPUT 分别列举一个input或者 output的信息,我们使用一个v4l2_input结构体来存放查询结果,这个结构体中有一个 index域用来指定你索要查询的是第几个input/ouput,如果你所查询的这个input是当前正 在使用的,那么在v4l2_input还会包含一些当前的状态信息,如果所 查询的input/output 不存在,那么回返回EINVAL错误,所以,我们通过循环查找,直到返回错误来遍历所有的 input/output. VIDIOC_G_INPUT and VIDIOC_G_OUTPUT 返回当前的video input和output 的index.

例: 列举当前输入视频所支持的视频格式

struct v4l2_input input;

struct v4l2_standard standard;

memset (
&input, 0, sizeof (input));

//首先获得当前输入的 index,注意只是 index,要获得具体的信息,就的调用列举操作

if (-1 == ioctl (fd, VIDIOC_G_INPUT, &input.index)) {

perror (”VIDIOC_G_INPUT”);

exit (EXIT_FAILURE);

}

//调用列举操作,获得 input.index 对应的输入的具体信息

if (-1 == ioctl (fd, VIDIOC_ENUMINPUT, &input)) {

perror (”VIDIOC_ENUM_INPUT”);

exit (EXIT_FAILURE);

}

printf (”Current input
%s supports:\n”, input.name); memset (&standard, 0, sizeof (standard)); standard.index = 0;

//列举所有的所支持的 standard,如果 standard.id 与当前 input 的 input.std 有共同的

bit flag,意味着当前的输入支持这个 standard,这样将所有驱动所支持的 standard 列举一个

遍,就可以找到该输入所支持的所有 standard 了。

while (0 == ioctl (fd, VIDIOC_ENUMSTD, &standard)) {

if (standard.id & input.std)

printf (”
%s\n”, standard.name);

standard.index
++;

}

/* EINVAL indicates the end of the enumeration, which cannot be empty unless this device falls under the USB exception.*/

if (errno != EINVAL || standard.index == 0) {

perror (”VIDIOC_ENUMSTD”);

exit (EXIT_FAILURE);

}

8. Video standards

相关函数:

v4l2_std_id std_id; //这个就是个64bit得数 int ioctl(int fd, int request, struct v4l2_standard *argp);

相关结构体:

typedef u64 v4l2_std_id; struct v4l2_standard { u32 index; v4l2_std_id id; u8 name[24]; struct v4l2_fract frameperiod; /* Frames, not fields */ u32 framelines; u32 reserved[4]; };

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1f4f3df66f22f03bca0e632f69dcc6ce.html