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;
}