On Sat, Apr 20, 2019 at 7:08 PM Zebediah Figura z.figura12@gmail.com wrote:
On 4/20/19 11:55 AM, Damjan Jovanovic wrote:
On Sat, Apr 20, 2019 at 6:07 PM Zebediah Figura <z.figura12@gmail.com mailto:z.figura12@gmail.com> wrote:
On 4/20/19 10:56 AM, Damjan Jovanovic wrote: > > > On Sat, Apr 20, 2019 at 5:44 PM Zebediah Figura <z.figura12@gmail.com <mailto:z.figura12@gmail.com> > <mailto:z.figura12@gmail.com <mailto:z.figura12@gmail.com>>>
wrote:
> > On 4/20/19 10:31 AM, Damjan Jovanovic wrote: > > > > > > On Sat, Apr 20, 2019 at 4:52 PM Zebediah Figura > <z.figura12@gmail.com <mailto:z.figura12@gmail.com> <mailto:z.figura12@gmail.com <mailto:z.figura12@gmail.com>> > > <mailto:z.figura12@gmail.com <mailto:z.figura12@gmail.com> <mailto:z.figura12@gmail.com <mailto:z.figura12@gmail.com>>>> wrote: > > > > On 4/20/19 8:15 AM, Damjan Jovanovic wrote: > > > Recent changes to qcap/v4l.c resulted in the removal of mmap() > > > for v4l2 devices, but read() is optional for device > drivers and > > > some don't support it. This isn't a major problem with the > > > presense of libv4l2 though, as it can emulate read() on top of > > > mmap(). However the code checks whether the device can read(), > > > and if not, doesn't even try to use it, even though it can. > > > > > > Fix this by only warning that read() is being emulated, and > > > continuing with libv4l2 if available. > > > > > > Also clarifies the logging. > > > > > > Signed-off-by: Damjan Jovanovic <damjan.jov@gmail.com <mailto:damjan.jov@gmail.com> > <mailto:damjan.jov@gmail.com <mailto:damjan.jov@gmail.com>> > > <mailto:damjan.jov@gmail.com <mailto:damjan.jov@gmail.com> <mailto:damjan.jov@gmail.com <mailto:damjan.jov@gmail.com>>>> > > > --- > > > dlls/qcap/v4l.c | 13 ++++++++----- > > > 1 file changed, 8 insertions(+), 5 deletions(-) > > > > > > > > > > > > > This doesn't seem right; libv4l2 should massage the result of > > VIDIOC_QUERYCAP to include V4L2_CAP_READWRITE. See > > > <
https://git.linuxtv.org/v4l-utils.git/tree/lib/libv4l2/libv4l2.c#n1210%3E.
> > > > > > On FreeBSD 11.2 with libv4l-1.6.3_4, that is certainly NOT
the
> case. It > > could be a newer or not yet released feature. > > > > > > > > It's been the case since libv4l2 0.5: > <
https://git.linuxtv.org/v4l-utils.git/commit/lib/libv4l2/libv4l2.c?id=0215f2...
> > If FreeBSD is using 1.6.3, then I think something else is wrong. Are > you > sure that libv4l2 is actually being loaded? > > > int v4l2_ioctl(int fd, unsigned long int request, ...) > { > ... > if (devices[index].convert == NULL) > goto no_capture_request; > > <your code nippet from above> > > no_capture_request: > > > > So the code that would set that flag, is skipped if the .convert field > is NULL. > > When is it NULL? > > > If my reading of the code is correct, only when v4l2_fd_open() is called manually with V4L2_DISABLE_CONVERSION. Obviously we don't do that. Perhaps setting LIBV4L2_LOG_FILENAME might give some hints as to
what's
going wrong?
int v4l2_fd_open(int fd, int v4l2_flags) { ... <The actual ioctl() returns cap.capabilities = 0x84a00001, cap.device_caps = 0x04a00000>
if (cap.capabilities & V4L2_CAP_DEVICE_CAPS) cap.capabilities = cap.device_caps; if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) || !(cap.capabilities & (V4L2_CAP_STREAMING |
V4L2_CAP_READWRITE))) { goto no_capture; }
0x000000001 = V4L2_CAP_VIDEO_CAPTURE 0x00200000 = V4L2_CAP_EXT_PIX_FORMAT 0x00800000 = V4L2_CAP_META_CAPTURE 0x040000000 = V4L2_CAP_STREAMING 0x800000000 = V4L2_CAP_DEVICE_CAPS
So cap.capabilities have all those flags set, but cap.device_caps lacks V4L2_CAP_VIDEO_CAPTURE. cap.capabilities is overwritten by cap.device_caps, thus V4L2_CAP_VIDEO_CAPTURE is cleared. Since libv4l2 only manages devices with V4L2_CAP_VIDEO_CAPTURE set, and that flag is now missing, the first condition in the next "if" takes the goto, and .convert remains NULL. With .convert NULL, libv4l2 no longer manages the device, so communication is directly between Wine and kernel. Therefore the V4L2_CAP_READWRITE flag is not going to be set in v4l2_ioctl(), and libv4l2 cannot be made to do any conversions for us. But then again we can't use a device without V4L2_CAP_VIDEO_CAPTURE either, libv4l2 or not.
I think the fundamental problem is that Wine is trying to use /dev/video1 which is broken, due to a bug in devenum that overwrites the working /dev/video0 registry entry with it, because their descriptions are the same.
Thanks, I've just sent patches to resolve both of these bugs.
Wow, so quickly!
Thank you!