Closed sarnex closed 6 years ago
@umlaeute Hey, is there anything I can do to help debug this? I don't know if the issue is in the kernel, ffmpeg, or v4l2loopback.
Thank you, Sarnex
i don't know (and will wait until 4.16 shows up in Debian/unstable to do any testing myself).
in the meantime, you can enable debugging in the module, and see whether it gives you any additional information:
rmmod v4l2loopback
modprobe v4l2loopback debug=2
[...]
dmesg
Thanks. I tried it and didnt see any extra output when running ffmpeg, only the same spam.
Also, the Ubuntu kernel from below would likely work if you are willing to test it: http://kernel.ubuntu.com/%7Ekernel-ppa/mainline/v4.16/
Hi I have the same problem on 4.16.5
Loading the module with modprobe v4l2loopback debug=2
Then running
gst-launch-1.0 -v videotestsrc ! video/x-raw, width=640, height=480 ! videoconvert ! v4l2sink device=/dev/video0
With print out on dmesg -wH
[Apr30 20:41] /var/lib/dkms/v4l2loopback/0.11.0.r0.g05a03e2/build/v4l2loopback.c:1827[v4l2_loopback_open]
[ +0.000003] v4l2-loopback[1851]: opened dev:00000000f6e8a94f with image: (null)
[ +0.000001] /var/lib/dkms/v4l2loopback/0.11.0.r0.g05a03e2/build/v4l2loopback.c:1852[v4l2_loopback_open]
[ +0.000004] video0: VIDIOC_QUERYCAP: driver=v4l2 loopback, card=Dummy video device (0x0000), bus=platform:v4l2loopback-000, version=0x00041005, capabilities=0x85208003, device_caps=0x85208003
[ +0.000009] /var/lib/dkms/v4l2loopback/0.11.0.r0.g05a03e2/build/v4l2loopback.c:1308[vidioc_enum_input]
[ +0.000001] video0: VIDIOC_ENUMINPUT: index=0, name=loopback, type=2, audioset=0x0, tuner=0, std=0x00000000, status=0x0, capabilities=0x0
[ +0.000012] /var/lib/dkms/v4l2loopback/0.11.0.r0.g05a03e2/build/v4l2loopback.c:1308[vidioc_enum_input]
[ +0.000000] video0: VIDIOC_ENUMINPUT: error -22: index=1, name=, type=0, audioset=0x0, tuner=0, std=0x00000000, status=0x0, capabilities=0x0
[ +0.000003] video0: VIDIOC_ENUMSTD: error -25: index=0, id=0x0, name=, fps=0/0, framelines=0
[ +0.000006] video0: VIDIOC_QUERYCTRL: id=0x980001, type=6, name=User Controls, min/max=0/0, step=0, default=0, flags=0x00000044
[ +0.000003] video0: VIDIOC_QUERYCTRL: id=0x98f900, type=2, name=keep_format, min/max=0/1, step=1, default=0, flags=0x00000000
[ +0.000003] video0: VIDIOC_QUERYCTRL: id=0x98f901, type=2, name=sustain_framerate, min/max=0/1, step=1, default=0, flags=0x00000000
[ +0.000003] video0: VIDIOC_QUERYCTRL: id=0x98f902, type=1, name=timeout, min/max=0/100000, step=1, default=0, flags=0x00000000
[ +0.000003] video0: VIDIOC_QUERYCTRL: id=0x98f903, type=2, name=timeout_image_io, min/max=0/1, step=1, default=0, flags=0x00000000
[ +0.000004] video0: VIDIOC_QUERYCTRL: error -22: id=0x8098f903, type=0, name=, min/max=0/0, step=0, default=0, flags=0x00000000
[ +0.000003] video0: VIDIOC_G_STD: error -25: std=0x00000000
[ +0.000003] video0: VIDIOC_G_OUTPUT: error -25: value=0
[ +0.110405] video0: VIDIOC_ENUM_FMT: error -22: index=0, type=vid-out, flags=0x0, pixelformat=
[ +0.000008] video0: VIDIOC_CROPCAP: error -25: type=vid-out, bounds wxh=0x0, x,y=0,0, defrect wxh=0x0, x,y=0,0, pixelaspect 0/0
[ +0.000343] /var/lib/dkms/v4l2loopback/0.11.0.r0.g05a03e2/build/v4l2loopback.c:1861[v4l2_loopback_close]
[ +0.000003] /var/lib/dkms/v4l2loopback/0.11.0.r0.g05a03e2/build/v4l2loopback.c:1976[try_free_buffers]
[ +0.000001] /var/lib/dkms/v4l2loopback/0.11.0.r0.g05a03e2/build/v4l2loopback.c:1959[free_buffers]
[ +0.000002] v4l2-loopback[1960]: freeing image@ (null) for dev:00000000f6e8a94f
[ +0.000001] /var/lib/dkms/v4l2loopback/0.11.0.r0.g05a03e2/build/v4l2loopback.c:1880[v4l2_loopback_close]
I don't know what to look for at the moment, but I have noticed that in 4.16.5 at least meta nodes have been added for each device (now when I plug in a real webcam I get to devices /dev/videoX
and /dev/videoX+1
, the /dev/videoX+1
node is for meta data). I believe it's to do with this patch in the kernel.
I can see that there are errors in dmesg starting with
VIDIOC_ENUMINPUT: error -22: index=1, name=, type=0, audioset=0x0, tuner=0, std=0x00000000, status=0x0, capabilities=0x0
I may be wrong but is this looking for the meta node at the next index? Update I'm wrong on the enum input ioctl, reading the docs you enumerate inputs of a device by increasing the index until it returns -1, so this is the correct behaviour.
It does seem that ready_for_capture
is never set to 1
so it fails.
Version used:
Have the same issue on Ubuntu 17.10 with 4.16.8.
I'm on Arch Linux. I had to modify the command a bit but this produces the aforementioned output as well: ffmpeg -f x11grab -r 30 -s 2560x1440 -i :0.0+0,0 -vcodec rawvideo -pix_fmt yuv420p -threads 16 -f v4l2 /dev/video0
Also, this results in the same error:
[mikko@localhost video]$ ffmpeg -i test.avi -f v4l2 /dev/video0
ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 7.3.0 (GCC)
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-avresample --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbluray --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-shared --enable-version3 --enable-omx
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
Invalid return value 0 for stream protocol
Last message repeated 1 times
Input #0, avi, from 'test.avi':
Metadata:
encoder : MEncoder dev-CVS-060415-01:32-3.4.6
Duration: 00:24:06.94, start: 0.000000, bitrate: 1234 kb/s
Stream #0:0: Video: h264 (Main) (h264 / 0x34363268), yuv420p(progressive), 720x576, 1005 kb/s, SAR 65536:65535 DAR 16384:13107, 25 fps, 25 tbr, 25 tbn, 50 tbc
Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, s16p, 216 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> rawvideo (native))
Press [q] to stop, [?] for help
[v4l2 @ 0x557761f52160] ioctl(VIDIOC_G_FMT): Invalid argument
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Error initializing output stream 0:0 --
Conversion failed!
code 1
I have the same problem.
I'm running Arch Linux on a X1 Carbon, 5th gen., with a vanilla 4.18.8-1 kernel and v4l2loopback-dkms installed from the AUR.
Running the command:
sudo modprobe v4l2loopback video_nr=1 card_label="test"
gives:
$ v4l2-ctl --list-devices
test (platform:v4l2loopback-000):
/dev/video2
Integrated Camera: Integrated C (usb-0000:00:14.0-8):
/dev/video0
/dev/video1
And running:
ffmpeg -f x11grab -r 10 -s 2560x1440 -vf "scale=640:360" -f v4l2 /dev/video2
gives:
ffmpeg version 4.0 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 8.1.0 (GCC)
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avresample --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa
--enable-libass --enable-libbluray --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264
--enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvenc --enable-omx --enable-shared --enable-version3
libavutil 56. 14.100 / 56. 14.100
libavcodec 58. 18.100 / 58. 18.100
libavformat 58. 12.100 / 58. 12.100
libavdevice 58. 3.100 / 58. 3.100
libavfilter 7. 16.100 / 7. 16.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 1.100 / 5. 1.100
libswresample 3. 1.100 / 3. 1.100
libpostproc 55. 1.100 / 55. 1.100
Output #0, v4l2, to '/dev/video2':
Output file #0 does not contain any stream
Same thing over here. ArchLinux v4l2loopback-dkms-git 0.11.0.r0.g05a03e2 ffmpeg 4.0
$ v4l2-ctl --list-devices
loopback 1 (platform:v4l2loopback-000):
/dev/video0
$ ffmpeg -f x11grab -r 10 -s 2560x1440 -vf "scale=640:360" -f v4l2 /dev/video0
ffmpeg version 4.0 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 8.1.0 (GCC)
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avresample --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbluray --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvenc --enable-omx --enable-shared --enable-version3
libavutil 56. 14.100 / 56. 14.100
libavcodec 58. 18.100 / 58. 18.100
libavformat 58. 12.100 / 58. 12.100
libavdevice 58. 3.100 / 58. 3.100
libavfilter 7. 16.100 / 7. 16.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 1.100 / 5. 1.100
libswresample 3. 1.100 / 3. 1.100
libpostproc 55. 1.100 / 55. 1.100
Output #0, v4l2, to '/dev/video0':
Output file #0 does not contain any stream
It's enough to write
ffmpeg -f v4l2 /dev/video0
for it to fail
@umlaeute It looks like 4.16 is available in Debian unstable. Are you able to take a look into this issue?
Thanks.
yep. so far I've been able to reproduce the problem (but haven't had time to dig into it)
@umlaeute The 'solution' is quiet easy: Change line 2096 (https://github.com/umlaeute/v4l2loopback/blob/master/v4l2loopback.c#L2096) to
#if LINUX_VERSION_CODE >= LINUX_KERNEL_VERSION(3,7,0)
Checking the presumably old definition of VFL_DIR_M2M, leads to an uninitialized member vfl_dir. That in turn results in is_tx=0 in check_fmt() in drivers/media/v4l2-core/v4l2-ioctl.c which leads to -EINVAL being returned.
I put solution in quotation marks, because I know too little about v4l2 to guarantee that this change is side effect free.
It seems the macro is really called KERNEL_VERSION, and if I use that instead everything seems to work.
I also don't know if it's correct but it seems to fix this bug. Thanks flipreverse!
I can confirm that changing line 2096 on v4l2loopback.c to
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
worked for me as well. Thanks.
Has this been committed into a stable release? I'm still getting the error on version 0.11.0
.
EDIT: I'm stupid. But it would be nice to get it stable nonetheless. ;)
I had the exact problem and the solution @flipreverse suggested worked for me. Now it is line v4l2loopback.c : 2271
that needs to be changed
from
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
to
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
(in struct v4l2_loopback_ioctl_ops
)
@nimatrueway are you saying that when compiling against linux-4.x, you get different results for KERNEL_VERSION(2,6,29)
resp KERNEL_VERSION(3,7,0)
?
that looks very fishy to me (the #if
clause should evaluate to true
in both cases, as 4.0.0>3.7.0
and 4.0.0>2.6.29
)
@SicariusNoctis yes, it's in v0.12.0
@umlaeute Yeah, that's what screwed with my head too. So I tried everything all over again, but this time a bit more carefully, and I realized that I was wrong. Sorry!
For everyone else who reads this later:
Make sure you remove any older version of v4l2loopback installed your system first:
sudo modprobe -r v4l2loopback
find "/lib/modules/$(uname -r)" | grep v4l2loopback | sudo xargs rm
No success here. Tried all above. Same error. Ubuntu 18.04. @umlaeute Also throwing up compilation errors on any changes.
Still getting this on Ubuntu 18.04 after removing the old version and compiling 0.12.2. from github
Kernel version is 4.15.0-62-generic
@umlaeute also experiencing this issue.
ffplay /dev/video0
...
[video4linux2,v4l2 @ 0x7fef40000bc0] ioctl(VIDIOC_G_FMT): Invalid argument
@robstewart57 you need a producer first.
Can you publish a signed version of patched module? I have some problems with inserting unsigned module on my machine with secure boot and sudo echo x > /proc/sysrq-trigger
doesn't fix it. Kernel: 5.3.0-46-generic
i only publish source code. but you need the binary to be signed (so: sign yourself :-))
Can you publish a signed version of patched module? I have some problems with inserting unsigned module on my machine with secure boot and
sudo echo x > /proc/sysrq-trigger
doesn't fix it. Kernel: 5.3.0-46-generic
I think I have the same exact issue. I've looked up every post online that talks about v4l2loopback issues and nothing has worked so far. My knowledge about kernels, signing binaries and secure boot is 0 so I can't even understand how to use the solutions given above.
First I installed the v4l2loopback in a machine without secure boot and everything worked flawlessly. I could use pyfakewebcam or ffmpeg to create streams without any issues.
Then I tried installing v4l2loopback in another machine with secure boot (downloading the code from the repository and following the readme instructions). After the installation I got the following error
$ sudo modprobe v4l2loopback
modprobe: ERROR: could not insert 'v4l2loopback': Operation not permitted
After this I uninstalled everything using @nimatrueway comment above and tried the following commands:
$ sudo apt-get install v4l2loopback-dkms`
$ sudo modprobe v4l2loopback
Which worked as expected creating the /dev/video* files. The problem came when I tried to stream to those files using ffmpeg or pyfakewebcam. Executing pyfakewebcam's example I got this:
.../pyfakewebcam.py", line 54, in __init__
fcntl.ioctl(self._video_device, _v4l2.VIDIOC_S_FMT, self._settings)
OSError: [Errno 22] Invalid argument
Executing ffmpeg I got this error
$ sudo ffmpeg -re -i myTestVideo.mp4 -f v4l2 /dev/video2
...
[v4l2 @ 0x561f49542be0] ioctl(VIDIOC_G_FMT): Invalid argument
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Error initializing output stream 0:0 --
Might be useful if you're stupid like me - I was getting this issue on Arch, and forgot that v4l2loopback comes from the AUR and I didn't update the package (v4l2loopback-dkms) after pacman -Syu
.
Enviroment
Problem
I cannot use v4l2loopback in 4.16. Reverting to 4.15 works fine. When I try, I get an error about invalid arguments to an IOCTL.
Steps to reproduce:
1) Load v4l2loopback
2) Run this script in FFMPEG:
Results of above:
I was not able to find what changed in 4.16 through the kernel release notes.
Thank you, and let me know if you need any more information
Sarnex