Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2152765pxj; Sat, 5 Jun 2021 14:58:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzx+CPh4EIKwKbizLYFx51YNfpUeJOF801doZRf+TK7Zu5AZIMPH/+czezdMjSllyInPljy X-Received: by 2002:a05:6402:1559:: with SMTP id p25mr12326991edx.343.1622930337848; Sat, 05 Jun 2021 14:58:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1622930337; cv=none; d=google.com; s=arc-20160816; b=mVIiaSmu4TYuoAC2WfQ/4zoDhFkyrmRKg1zi1R8wgA6hSH71PrS+O1qbayWLjK8mMo N4jWdwVNzzOtFydDMdfGZEM4FlC1/ffGQ1KRk0DZa40xpSMPn0/vVEbrak+sMZsw1w64 J6rvBayGKFee+5eSnYc/G0tdqjotQ1N5qCOYKzLHRIny4l33R4+l419KCetDeGWwnzvG nMZI/E1I+8OZQOlvMhxzosS2O1r9Lhc9LioGTThfwihpb3oUIrmFrav4osZVjTdH9Ucy RYowUomSzY/nRVnR7RO7MhT2BQ/niu1857lEO+hEDorHDzrGJJG2c7/Bhw379MlQ11mW xyGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=V7O8lSaOhwQ8xkNimZyIF1+1jk20brgXS415THhvBTI=; b=ZVqrLkxzxM8lZUegDE6LEexPvG6NLoduFR3O0pXvUV+MAVyVoYOZL7F8q958tygwgn nqvnRX2TEphY4loE/qmF6MPGkI8ut52jp12hBfO46RWR3FvbCVl6rEhG1G8Hon8Ogjag vBUlzW+EodHTs07z0RZ+7I286awsoze0t/Jt0j52rldw8OvFOgilqM8wqYXorlL2UGQ6 WI3zdM1aK4sxJICYKWszoX5uf8844eW9HMwaBnH1e/OqdSuR+vVuvYLnHtJgsmagh/8O D1nI23DEP5kbeAG5CTbL5WUcP9LbtOlfgvoSl/re9gmtZ+Glpk1o9O+5KKVR2zlE3Nq4 +2eA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=uiuVFWnp; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id 8si7924262ejn.615.2021.06.05.14.58.34; Sat, 05 Jun 2021 14:58:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=uiuVFWnp; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230078AbhFEV6K (ORCPT + 99 others); Sat, 5 Jun 2021 17:58:10 -0400 Received: from perceval.ideasonboard.com ([213.167.242.64]:49398 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229998AbhFEV6J (ORCPT ); Sat, 5 Jun 2021 17:58:09 -0400 Received: from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 0C3DAB2C; Sat, 5 Jun 2021 23:56:19 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1622930180; bh=o7++EuxkRgDP1duOfpmAjGiDUd3n2LOpOVmtNxKeWHo=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=uiuVFWnpKiyUW/Ze6mnEF//D9OtE3ivdHVFYGkpwV9j8/RNV1ToBU6mpy5Pzq3299 H5eMMW3PiXSIUfSZ6RucPPIBN6h2EaRPk3Is5mqdSwCXGZY30TXcKvEDNqOKWN56QB 8WVuTwbvcR/9k6EBAYdZ+TH3VEODKxu8gjI2UwIk= Date: Sun, 6 Jun 2021 00:56:06 +0300 From: Laurent Pinchart To: Benjamin Drung Cc: Linus Torvalds , Adam Goode , Mauro Carvalho Chehab , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: Re: [PATCH v4] media: uvcvideo: Fix pixel format change for Elgato Cam Link 4K Message-ID: References: <20210605201534.53114-1-bdrung@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20210605201534.53114-1-bdrung@posteo.de> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Benjamin, Thank you for the patch. On Sat, Jun 05, 2021 at 08:15:36PM +0000, Benjamin Drung wrote: > 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 add a quirk to correct the malformed data structure. > > The quirk 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 > --- > drivers/media/usb/uvc/uvc_video.c | 25 +++++++++++++++++++++++++ > 1 file changed, 25 insertions(+) > > (now sending this patch with v4 in the subject instead of falsely v3) > > v2: enhanced the comment describing the quirk > > v3: > * hardcode ctrl->bmHint to 1 > * Use UVC_DBG_VIDEO instead of UVC_DBG_CONTROL (to match the rest of the > file) > > v4: > * Replace quirk bit by specific check for USB VID:PID test > > I tried setting different values for bmHint, but the response from the > Cam Link was always 1. So this patch hardcodes ctrl->bmHint to 1 as > suggested. > > Patch version 4 implements the recommendation of Laurent Pinchart. It > requires defining the device ID as variable since usb_match_one_id takes > an pointer to it. In case more Elgato products like Game Capture > HD 60 S+ (0fd9:006a) are affected, this version is harder to extent. > > Take patch version 3 or 4 depending on which version you prefer. Both > work and are tested. > > diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c > index a777b389a66e..35c3ce0e0716 100644 > --- a/drivers/media/usb/uvc/uvc_video.c > +++ b/drivers/media/usb/uvc/uvc_video.c > @@ -130,6 +130,31 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream, > struct uvc_format *format = NULL; > struct uvc_frame *frame = NULL; > unsigned int i; > + static const struct usb_device_id elgato_cam_link_4k = { USB_DEVICE(0x0fd9, 0x0066) }; Let's avoid long line static const struct usb_device_id elgato_cam_link_4k = { USB_DEVICE(0x0fd9, 0x0066) }; > + > + /* > + * The response of the Elgato Cam Link 4K is incorrect: 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 UVC 1.5 class specification defines the first five bits in the > + * bmHint bitfield. The remaining bits are reserved and should be zero. > + * Therefore a valid bmHint will be less than 32. > + * > + * Latest Elgato Cam Link 4K firmware as of 2021-03-23 needs this quirk. > + * MCU: 20.02.19, FPGA: 67 > + */ > + if (usb_match_one_id(stream->dev->intf, &elgato_cam_link_4k) && ctrl->bmHint > 255) { Similarly, I'd break this as if (usb_match_one_id(stream->dev->intf, &elgato_cam_link_4k) && ctrl->bmHint > 255) { > + __u8 corrected_format_index; You can use u8 within the kernel. > + > + corrected_format_index = ctrl->bmHint >> 8; > + uvc_dbg(stream->dev, VIDEO, > + "Correct USB video probe response from {bmHint: 0x%04x, bFormatIndex: 0x%02x} to {bmHint: 0x%04x, bFormatIndex: 0x%02x}.\n", I'd print bFormatIndex with %u as it's an index and thus more readable as a decimal integer. If you agree with those small changes, there's no need to resubmit, I can fold them in when applying the patch. Reviewed-by: Laurent Pinchart > + ctrl->bmHint, ctrl->bFormatIndex, > + 1, corrected_format_index); > + ctrl->bmHint = 1; > + ctrl->bFormatIndex = corrected_format_index; > + } > > for (i = 0; i < stream->nformats; ++i) { > if (stream->format[i].index == ctrl->bFormatIndex) { -- Regards, Laurent Pinchart