V4L problema con la llamada ioctl VIDIOCGCAP
Pregunta
Estoy teniendo algún problema de trabajar con V4L (la API que proporciona acceso unificado a diversos captura de vídeo para Linux). Estoy tryng para hacer una llamada ioctl VIDIOCGCAP, pero me da un error argumento no válido. He aquí un strace:
execve("./test", ["./test"], [/* 26 vars */]) = 0 brk(0) = 0x8d5c000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fc9000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=29703, ...}) = 0 mmap2(NULL, 29703, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fc1000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/i686/cmov/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260e\1\0004\0\0\0\4"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=1413540, ...}) = 0 mmap2(NULL, 1418864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e66000 mmap2(0xb7fbb000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x155) = 0xb7fbb000 mmap2(0xb7fbe000, 9840, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7fbe000 close(3) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e65000 set_thread_area({entry_number:-1 -> 6, base_addr:0xb7e656b0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 mprotect(0xb7fbb000, 4096, PROT_READ) = 0 munmap(0xb7fc1000, 29703) = 0 open("/dev/video0", O_RDONLY) = 3 ioctl(3, EXT2_IOC_GETVERSION or VIDIOCGCAP, 0xbf8e4ca4) = -1 EINVAL (Invalid argument) fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fc8000 write(1, "err"..., 3err) = 3 exit_group(3) = ? = ?
Este es el código:
#include "linux/videodev.h" #include "fcntl.h" #include "stdio.h" int main() { int fd = open("/dev/video0", O_RDONLY); struct video_capability chan; if (ioctl(fd, VIDIOCGCAP, &chan) == -1) printf("err"); }
Y:
gcc -o test test.c
Más información: Tengo otro software de captura de vídeo en esta máquina que utilizan V4L sin problemas. Por lo tanto, yo estoy haciendo algo mal.
Solución
Tal vez usted necesita para tratar de usar V4L2 lugar, a saber, la ioctl VIDIOC_QUERYCAP.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow