我一直在玩一个基于v4l2的uvc驱动程序的用户空间应用程序。我一直试图获得我的集成摄像头(这是一台笔记本电脑)的功能,然后我陷入了一个问题。我的驱动程序没有针对Vidioc_Enuminput ioctl设置任何视频标准标志。下面是我的代码。
struct v4l2_capability caps;
memset(&caps, 0, sizeof(caps));
if(-1 == ioctl(fd, VIDIOC_QUERYCAP, &caps)) {
perror("Unable to query capabilities");
return errno;
}
printf(
"-------- VIDIOC_QUERYCAP --------\n"
"Driver = %s\n"
"Card = %s\n"
"Bus Info = %s\n"
"Version = %d\n"
"Capabilities = %#x\n"
"Device Caps = %#x\n",
caps.driver,
caps.card,
caps.bus_info,
caps.version,
caps.capabilities,
caps.device_caps);
int index;
if(-1 == ioctl(fd, VIDIOC_G_INPUT, &index)) {
perror("Unable to get current input index");
return errno;
}
struct v4l2_input input;
memset(&input, 0, sizeof(input));
input.index = index;
if(-1 == ioctl(fd, VIDIOC_ENUMINPUT, &input)) {
perror("Unabel to query attributes of video input");
return errno;
}
printf(
"--------- VIDIOC_ENUMINPUT ---------\n"
"Index = %d\n"
"Name = %s\n"
"Type = %d\n"
"Audio Set = %d\n"
"Video Stds = %lld\n"
"Status = %d\n"
"Capabilities = %d\n",
input.index,
input.name,
input.type,
input.audioset,
input.std,
input.status,
input.capabilities);
输出如下所示。
-------- VIDIOC_QUERYCAP --------
Driver = uvcvideo
Card = Integrated_Webcam_HD: Integrate
Bus Info = usb-0000:00:1d.0-1.6
Version = 266001
Capabilities = 0x84200001
Device Caps = 0x4200001
--------- VIDIOC_ENUMINPUT ---------
Index = 0
Name = Camera 1
Type = 2
Audio Set = 0
Video Stds = 0 // <--- Problem here.
Status = 0
Capabilities = 0
请注意,视频标准标志设置为0。为了进一步深入研究这个问题,我尝试了ioctl,如下所示,
struct v4l2_standard std;
memset(&std, 0, sizeof(std));
if(-1 == ioctl(fd, VIDIOC_G_STD, &std)) {
perror("Error");
return errno;
}
但收到以下错误。
Error: Inappropriate ioctl for device
结论是什么?我在这里做错什么了吗?
平台详细信息
Linux Linux 4.15.0-20-generic 21 ubuntu smp tue 4月24日06:16:15 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
驱动程序版本:4.15.17
设备节点:dev/video0(仅一个设备)
最佳答案
我想我自己找到了答案。经过仔细评估,我发现笔记本电脑上的集成摄像头在内部的USB总线上。USB类设备是V4L2视频标准IOCTL的一个例外。根据文件,
特殊规则适用于USB摄像机等视频标准概念毫无意义的设备。更一般地,对于不能以视频标准的名义速率捕获字段或帧,或者根本不支持视频标准格式的任何捕获或输出设备。在这里,驱动程序应将struct v4l2_input和struct v4l2_output的std字段设置为零,vidioc_g_std、vidioc_s_std、ioctl vidioc_querytd和ioctl vidioc_enumstd ioctls应返回enotty错误代码或einval错误代码。
因此,我认为我的相机属于这些类别之一,而std查询在我的情况下并不真正适用。我不确定MIPI或并行总线是否如此。我将更新一次,我做了一点实验,与这些硬件。
关于c - VIDIOC_ENUMINPUT不返回任何视频标准,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50548991/