从应用调用vivi驱动分析v4l2 -- 输入源列举(VIDIOC_ENUMINPUT)和设置(VIDIOC_S_INPUT)过程分析

vivi代码:

https://gitee.com/ldl17/v4l2-learn/blob/master/vivi.c

v4l2测试代码:

https://gitee.com/ldl17/v4l2-learn/blob/master/v4l2_test.c

step 3 : 设置输入设备

1,列举输入设备

ioctl(fd, VIDIOC_ENUMINPUT, &input)

对应vivi的vidioc_enum_input

/* only one input in this sample driver */
static int vidioc_enum_input(struct file *file, void *priv,
				struct v4l2_input *inp)
{
	if (inp->index >= NUM_INPUTS)
		return -EINVAL;

	inp->type = V4L2_INPUT_TYPE_CAMERA;
	inp->std = V4L2_STD_525_60;
	sprintf(inp->name, "Camera %u", inp->index);
	return 0;
}

这部分的代码比较简单,可以看到底层基本就是判断一下inp->index。

这里的NUM_INPUTS值是4,但是注释上写折这个驱动只有1路输入,原因是因为这个vivi驱动可以产生4种不同的colorbar,用户使用的时候可以选择使用那种,这就相当于切换了输入一样。

具体的应用操作代码如下

struct v4l2_input inp;
inp.index = 0;
while (ioctl (fd, VIDIOC_ENUMINPUT, &inp) == 0) {
    printf("%s : std: 0x%08x\n", inp.name, inp.std);
    inp.index++;
}

运行打印如下

Camera 0 : std: 0x0000f900
Camera 1 : std: 0x0000f900
Camera 2 : std: 0x0000f900
Camera 3 : std: 0x0000f900

可以看到视频标准只有 V4L2_STD_525_60这一种,对于一个正常设备来说,这里可能会有多种视频标准。

2,设置输入设备

input.index = index; //指定输入设备
if (ioctl(fd, VIDIOC_S_INPUT, &input) < 0)

对应vivi的vidioc_s_input

static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
{
	struct vivi_dev *dev = video_drvdata(file);

	if (i >= NUM_INPUTS)
		return -EINVAL;

	dev->input = i;
	precalculate_bars(dev);
	precalculate_line(dev);
	return 0;
}

可以看到dev->input中记录了当前设置的编号,所以我们同样也可以用VIDIOC_G_INPUT获取到使用的编号,比较简单,这里不再分析。

对于precalculate_bars和precalculate_line不再分析,这不是重点。

具体的应用代码如下:

        inp.index = 1;

        if (ioctl (fd, VIDIOC_S_INPUT, &inp) < 0) {
                printf("Set input fail\n");
                goto err;
        }

 

上一篇:Python-指定参考目录,查找文件夹缺少的文件


下一篇:【图像融合】基于CBF算法的图像融合matlab源码【Matlab 083期】【图像处理15】