Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp435886pxx; Wed, 28 Oct 2020 08:17:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxicSCRVBVbPxLtU8VBSMsvZ6lE6aU+SZOAMd2SI4AqiEBlhXyLRlOO8XSwt6Noll8uAFMH X-Received: by 2002:a17:906:edb0:: with SMTP id sa16mr8003272ejb.327.1603898261463; Wed, 28 Oct 2020 08:17:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603898261; cv=none; d=google.com; s=arc-20160816; b=jC71vfsumbH6x53pY1Sw7OL/JRBM4lDDdFMwyCzdAlQWb4N5pbsk/PMratStRBT6kc yz5spMQXII9wMHomCW4Qj/77S6oW6vpXH8aaZ73I+bHfNK8YzHky+Pj+4aAfWsmBPcWw /94jTtNiIoG+TeUQNzju/6wJbAtkF0yUx3Mc1fdwIvMiaiBQPbRdhg9nNd4HHuFa7W6j d90OhPC2gDdgjVZU0o76lzMyUqQAZl2ts+oSvpQ+J0PSowX2nPy20XLLuK4XNXm7TcPc 1KC9Yp3ubukJegqHNh3wmYBVR82UELO+ckbs7ERorLqA2BSVfk/KZVkgQGV8xCuXuXfT KUjQ== 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=NF3SCKFBQWQjNSo7UQCY0Raq9NWD7M+8nIaDiczWkr0=; b=BzqFVhcsT/ed5T5VydUZt4nSQhlab+VALnZ2yq5puD/KfQPSksNfSPd3tpM04T3BcZ 1mQTBZPOyERRu5F+54qbP08rWmpQXRa1NQfjhmMf4uHAO/jlltjE3+c5v9ONueV25bBe IDH+CZ19gcmt7SvHtXq4mlh67K5hM4DX0DwmypXW36cMVzyXoJPuv4OnmgOWPBx3DFVd +IUHwrGxekqg5YDKDTEmj/zmN1KXNdqj2+4kIZVZ9km8Cd0GpVFvWloz87++89/2X8rT TzuHZMQdygS8JB1tFsL3YfA3Ss5ZWT1b6ee9UDzLavIO+og41FI4YgHld0hMHPCzihX1 ewHw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=1Zpf6sKH; 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 o10si2705925ejr.482.2020.10.28.08.17.18; Wed, 28 Oct 2020 08:17:41 -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=1Zpf6sKH; 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 S1810006AbgJ0Qcx (ORCPT + 99 others); Tue, 27 Oct 2020 12:32:53 -0400 Received: from mail.kernel.org ([198.145.29.99]:49156 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1802491AbgJ0Ptj (ORCPT ); Tue, 27 Oct 2020 11:49:39 -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 420B42242E; Tue, 27 Oct 2020 15:49:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1603813769; bh=TPSg9F6aclc44MNfpeDtKYRLYQIcsA9t3mTkIqI3l/0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=1Zpf6sKHIa8UIr7v0Qv8wPViI1V8uCUeisJ3M2JUYHYOpIxWmE5pvLJuCfYGRla9x AOeJ48OHvKXtcMZ4IKUVS67DfVAeU1xdfIAR1zEj5iWEkFKXq/h0uoarz2Yzsl8etT SL7uOJfFy9eBNikUVQhK3yAi1qKy4DyHVoEPH4bY= 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 5.9 664/757] media: uvcvideo: Ensure all probed info is returned to v4l2 Date: Tue, 27 Oct 2020 14:55:14 +0100 Message-Id: <20201027135521.686211452@linuxfoundation.org> X-Mailer: git-send-email 2.29.1 In-Reply-To: <20201027135450.497324313@linuxfoundation.org> References: <20201027135450.497324313@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 0335e69b70abe..5e6f3153b5ff8 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -247,11 +247,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; if (uvc_format != NULL) -- 2.25.1