• Benjamin Drung's avatar
    media: uvcvideo: Fix pixel format change for Elgato Cam Link 4K · 4c6e0976
    Benjamin Drung authored
    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: default avatarBenjamin Drung <bdrung@posteo.de>
    Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
    4c6e0976
uvc_video.c 62.8 KB