Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp191902pxx; Wed, 28 Oct 2020 02:16:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz5QR7+A+pLHrvNmksqy/k/KJ3OGqxpqBPcJJXK0v2OFVMEhtZJLL3LyhpsswDMaKDg86gf X-Received: by 2002:a17:906:7f0d:: with SMTP id d13mr6285351ejr.299.1603876572766; Wed, 28 Oct 2020 02:16:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603876572; cv=none; d=google.com; s=arc-20160816; b=lTHh1dj8n/wIAAo5M2xlSNS2KXqAQ0Ph7A2YsXU1NBOPEM6Kmgjbzxq7S3AIsFMip+ m22JQsBhP0mjiWofpGX8VHALYWqHR1UTjTYM4rN3OSMa/111d2khpuDZUh39tTfPR3gX YSFDbOZPhWHzNqyZL9SNNTPQHNFsnFjw0F2C3CaHM+mPV2v5vclcsURmtXDlFsy0RXz3 CR7NIq6/ThnNZKCZVvyWQ2ynFaLQs6OFRrlwXvmJisXgdSs91gl+AiaqR52+kkZ1hVuC 2q6YO0Uw5gnU9yW+0TfNDTLqLKoPGxG87tYLC8JRZCRr67VAKP6zjvJWt25lWkWHMrqp 5gYQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=6Ki08esJtE8u9ARZU6EdNM4mhCxeijPusclgktbmcWQ=; b=McZWXjWfeCc4LMbeJQPXZD5oPZRssxpADsFqx73hFYBkr5c5Kg6GeGeboVKHzhd0QB 6wEAblsib4zzDVize8rBk9b5J52YwlaxPR5DF91q25jU6GBlh59RN9kxQm8x6qi85sLk PEumrb5Ho2EaG5W++GCMUUV7rz7TyD7lLALYl/SjiLQomOl+L+iP1xOGRYWCSkR7fyRe JBKHFnchSgY1KEORCUydo/mtNwl/9Lj0A8j01Jw2im0KycC9xxkj9AsIhQ0giClFz8ll gKAqvW+5Js+WpFzetrAQJUACW7Dp0tlpEwZhPxsrctbsQXlVBzjqEL551r5ndFQ5ZghM rzdg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=RMeZZAz1; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id p17si2879649ejg.48.2020.10.28.02.15.50; Wed, 28 Oct 2020 02:16:12 -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 header.i=@kernel.org header.s=default header.b=RMeZZAz1; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2901023AbgJ0OSI (ORCPT + 99 others); Tue, 27 Oct 2020 10:18:08 -0400 Received: from mail.kernel.org ([198.145.29.99]:36284 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2508101AbgJ0OOi (ORCPT ); Tue, 27 Oct 2020 10:14:38 -0400 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id E3581206F7; Tue, 27 Oct 2020 14:14:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1603808078; bh=VJ/ti9RtMM+hdwGMo8aZ8xgoV+5/fs+zqncW0cvvWGM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RMeZZAz1gPXo4blZ5INfD2le0AaagaOc+xYjmf6hor+jxgiE9nbALKCM1TW0qw8VJ ExWX5Im5R9zyVKK0/bhnbC0Y6fYHIq2cLy9pw81zcMhGPqpd7D14zt3F/T+FcY4T2H b5Z2yCXgckKh/moXMwpQZ26HJ+pcLJNBx4M+NlMI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Adam Goode , Laurent Pinchart , Mauro Carvalho Chehab , Sasha Levin Subject: [PATCH 4.14 149/191] media: uvcvideo: Ensure all probed info is returned to v4l2 Date: Tue, 27 Oct 2020 14:50:04 +0100 Message-Id: <20201027134916.878376733@linuxfoundation.org> X-Mailer: git-send-email 2.29.1 In-Reply-To: <20201027134909.701581493@linuxfoundation.org> References: <20201027134909.701581493@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Adam Goode [ Upstream commit 8a652a17e3c005dcdae31b6c8fdf14382a29cbbe ] bFrameIndex and bFormatIndex can be negotiated by the camera during probing, resulting in the camera choosing a different format than expected. v4l2 can already accommodate such changes, but the code was not updating the proper fields. Without such a change, v4l2 would potentially interpret the payload incorrectly, causing corrupted output. This was happening on the Elgato HD60 S+, which currently always renegotiates to format 1. As an aside, the Elgato firmware is buggy and should not be renegotating, but it is still a valid thing for the camera to do. Both macOS and Windows will properly probe and read uncorrupted images from this camera. With this change, both qv4l2 and chromium can now read uncorrupted video from the Elgato HD60 S+. [Add blank lines, remove periods at the of messages] Signed-off-by: Adam Goode Signed-off-by: Laurent Pinchart Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Sasha Levin --- drivers/media/usb/uvc/uvc_v4l2.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c index 3e7e283a44a8e..644afd55c0f0f 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -252,11 +252,41 @@ static int uvc_v4l2_try_format(struct uvc_streaming *stream, if (ret < 0) goto done; + /* After the probe, update fmt with the values returned from + * negotiation with the device. + */ + for (i = 0; i < stream->nformats; ++i) { + if (probe->bFormatIndex == stream->format[i].index) { + format = &stream->format[i]; + break; + } + } + + if (i == stream->nformats) { + uvc_trace(UVC_TRACE_FORMAT, "Unknown bFormatIndex %u\n", + probe->bFormatIndex); + return -EINVAL; + } + + for (i = 0; i < format->nframes; ++i) { + if (probe->bFrameIndex == format->frame[i].bFrameIndex) { + frame = &format->frame[i]; + break; + } + } + + if (i == format->nframes) { + uvc_trace(UVC_TRACE_FORMAT, "Unknown bFrameIndex %u\n", + probe->bFrameIndex); + return -EINVAL; + } + fmt->fmt.pix.width = frame->wWidth; fmt->fmt.pix.height = frame->wHeight; fmt->fmt.pix.field = V4L2_FIELD_NONE; fmt->fmt.pix.bytesperline = uvc_v4l2_get_bytesperline(format, frame); fmt->fmt.pix.sizeimage = probe->dwMaxVideoFrameSize; + fmt->fmt.pix.pixelformat = format->fcc; fmt->fmt.pix.colorspace = format->colorspace; fmt->fmt.pix.priv = 0; -- 2.25.1