linux/drivers/media/usb
Benjamin Drung aa57b2d6b3 media: uvcvideo: Fix pixel format change for Elgato Cam Link 4K
commit 4c6e097629 upstream.

The Elgato Cam Link 4K HDMI video capture card reports to support three
different pixel formats, where the first format depends on the connected
HDMI device.

```
$ v4l2-ctl -d /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
	Type: Video Capture

	[0]: 'NV12' (Y/CbCr 4:2:0)
		Size: Discrete 3840x2160
			Interval: Discrete 0.033s (29.970 fps)
	[1]: 'NV12' (Y/CbCr 4:2:0)
		Size: Discrete 3840x2160
			Interval: Discrete 0.033s (29.970 fps)
	[2]: 'YU12' (Planar YUV 4:2:0)
		Size: Discrete 3840x2160
			Interval: Discrete 0.033s (29.970 fps)
```

Changing the pixel format to anything besides the first pixel format
does not work:

```
$ v4l2-ctl -d /dev/video0 --try-fmt-video pixelformat=YU12
Format Video Capture:
	Width/Height      : 3840/2160
	Pixel Format      : 'NV12' (Y/CbCr 4:2:0)
	Field             : None
	Bytes per Line    : 3840
	Size Image        : 12441600
	Colorspace        : sRGB
	Transfer Function : Rec. 709
	YCbCr/HSV Encoding: Rec. 709
	Quantization      : Default (maps to Limited Range)
	Flags             :
```

User space applications like VLC might show an error message on the
terminal in that case:

```
libv4l2: error set_fmt gave us a different result than try_fmt!
```

Depending on the error handling of the user space applications, they
might display a distorted video, because they use the wrong pixel format
for decoding the stream.

The Elgato Cam Link 4K responds to the USB video probe
VS_PROBE_CONTROL/VS_COMMIT_CONTROL with a malformed data structure: The
second byte contains bFormatIndex (instead of being the second byte of
bmHint). The first byte is always zero. The third byte is always 1.

The firmware bug was reported to Elgato on 2020-12-01 and it was
forwarded by the support team to the developers as feature request.
There is no firmware update available since then. The latest firmware
for Elgato Cam Link 4K as of 2021-03-23 has MCU 20.02.19 and FPGA 67.

Therefore correct the malformed data structure for this device. The
change was successfully tested with VLC, OBS, and Chromium using
different pixel formats (YUYV, NV12, YU12), resolutions (3840x2160,
1920x1080), and frame rates (29.970 and 59.940 fps).

Cc: stable@vger.kernel.org
Signed-off-by: Benjamin Drung <bdrung@posteo.de>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2021-07-19 09:45:02 +02:00
..
airspy media: media/usb: don't set description in ENUM_FMT 2019-07-22 14:01:05 -04:00
as102 treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 118 2019-05-24 17:39:02 +02:00
au0828 media: au0828: fix a NULL vs IS_ERR() check 2021-07-14 16:56:05 +02:00
b2c2 media: flexcop-usb: remove needless check before usb_free_coherent() 2020-09-27 11:25:11 +02:00
cpia2 media: cpia2: fix memory leak in cpia2_usb_probe 2021-07-14 16:55:51 +02:00
cx231xx Linux 5.9-rc4 2020-09-07 16:13:06 +02:00
dvb-usb media: dtv5100: fix control-request directions 2021-07-19 09:45:02 +02:00
dvb-usb-v2 media: lmedm04: Fix misuse of comma 2021-03-04 11:37:43 +01:00
em28xx media: em28xx: Fix possible memory leak of em28xx struct 2021-07-14 16:55:52 +02:00
go7007 media: Use fallthrough pseudo-keyword 2020-08-29 08:35:27 +02:00
gspca media: gspca/sunplus: fix zero-length control requests 2021-07-19 09:45:02 +02:00
hackrf Linux 5.2-rc4 2019-06-11 12:09:28 -04:00
hdpvr media: usb: hdpvr: convert to use i2c_new_client_device() 2020-04-14 11:31:48 +02:00
msi2500 media: msi2500: assign SPI bus number dynamically 2020-12-26 16:02:45 +01:00
pvrusb2 media: pvrusb2: fix warning in pvr2_i2c_core_done 2021-07-14 16:55:51 +02:00
pwc media: pwc: Use correct device for DMA 2021-02-23 15:53:25 +01:00
s2255 media: media/usb: rename VFL_TYPE_GRABBER to _VIDEO 2020-02-24 16:53:16 +01:00
siano media: Use fallthrough pseudo-keyword 2020-08-29 08:35:27 +02:00
stk1160 media: media/usb: rename VFL_TYPE_GRABBER to _VIDEO 2020-02-24 16:53:16 +01:00
stkwebcam media: media/usb: rename VFL_TYPE_GRABBER to _VIDEO 2020-02-24 16:53:16 +01:00
tm6000 media: tm6000: Fix memleak in tm6000_start_stream 2021-03-04 11:37:40 +01:00
ttusb-budget media: dvb-ttusb-budget: cleanup printk logic 2020-09-03 11:15:47 +02:00
ttusb-dec media: ttusb-dec: convert tasklets to use new tasklet_setup() API 2020-08-29 08:14:42 +02:00
usbtv media: usbtv: Fix deadlock on suspend 2021-03-17 17:06:20 +01:00
uvc media: uvcvideo: Fix pixel format change for Elgato Cam Link 4K 2021-07-19 09:45:02 +02:00
zr364xx media: zr364xx: fix memory leak in zr364xx_start_readpipe 2021-07-19 09:45:02 +02:00
Kconfig media: move CEC USB drivers to a separate directory 2020-04-15 12:06:40 +02:00
Makefile media: move CEC USB drivers to a separate directory 2020-04-15 12:06:40 +02:00