From patchwork Wed Aug 2 17:31:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavel Rojtberg X-Patchwork-Id: 9877305 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 1F9DA6035F for ; Wed, 2 Aug 2017 17:32:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0ECC028475 for ; Wed, 2 Aug 2017 17:32:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 03A4C287BD; Wed, 2 Aug 2017 17:32:05 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D0566287B8 for ; Wed, 2 Aug 2017 17:32:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752897AbdHBRcC (ORCPT ); Wed, 2 Aug 2017 13:32:02 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:37152 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751948AbdHBRcB (ORCPT ); Wed, 2 Aug 2017 13:32:01 -0400 Received: by mail-wm0-f65.google.com with SMTP id t138so7977736wmt.4 for ; Wed, 02 Aug 2017 10:32:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=42d+61oM9rqnP0QRiEPIM5H+jh/lZ52pmDZO0yUf2yU=; b=F62Q32R518+TSlYOnRnnqCImUBy5NYzGpDDYx1UmbGqJ6ytRV98EVb20irOhgPHWAi JliI5+FkYMkZtViNtgcTQXCfWs6mN61YSQbrfDDGngOhhQ0rx7u2JriheffMbLlUIqZe MCpxJIB8c8ou2FrrjsUnDb6Lh5VO26sRRsS8zKNaVNr/foh9B94iXWurlEMlElbc2P2c 4QuuB+LZeXqe9Moi/QRsiDh82EFW8I9ZwJrDVPDxnza/jetXEobmERBkt/Vc9ZX99sDq s8rT1rfsA6jQHYk/LRDwBfSa23pwwUbJGpeSnybAC/x9ua/Zjd57dltIQfYVNuBDbq6d a99g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=42d+61oM9rqnP0QRiEPIM5H+jh/lZ52pmDZO0yUf2yU=; b=G7J0wo0sMuOyoTGLVkyVVnPW/nMK1XFzr/rGLekzeubgKsjn4jHDfLuVkZU27I998M MDBwWK61JElyvjvSs6LK6n8QmaQkw33Vl0qCzJiqSyDs1StUPmXGx2vfgg0mtrnkz9wM YxUa3SBXOtAoL30ZMVdu/1oHywJL//m/po7C+3K7pPIiBkQsczO30unKGXmYGpM6AG0y zHpk1SWQVavgfEnFObE0e16kychV72z5Zdz38fIm9zPRP06Py+He79JRVrxutonEYf6w rNMrzRpIEeQ5NE4C0Y3HxkFzenLov07gij3d/qM4ik9D1rvr/poGzRLMAbBqWK5Vtdkr Cobg== X-Gm-Message-State: AIVw113pc1AZRNF2XzEnzRxT8/uMUguPCLMgN/sr2rhFGcueZr3gbsbo OzBa5r7u6MUlCQ== X-Received: by 10.28.175.135 with SMTP id y129mr4126573wme.87.1501695120017; Wed, 02 Aug 2017 10:32:00 -0700 (PDT) Received: from deepwhite.fritz.box (p57939233.dip0.t-ipconnect.de. [87.147.146.51]) by smtp.gmail.com with ESMTPSA id 195sm4768053wmv.25.2017.08.02.10.31.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 02 Aug 2017 10:31:59 -0700 (PDT) From: Pavel Rojtberg X-Google-Original-From: Pavel Rojtberg < rojtberg@gmail.com > To: laurent.pinchart@ideasonboard.com, mchehab@kernel.org, linux-media@vger.kernel.org Cc: Pavel Rojtberg Subject: [PATCH] uvcvideo: extend UVC_QUIRK_FIX_BANDWIDTH to MJPEG streams Date: Wed, 2 Aug 2017 19:31:35 +0200 Message-Id: <1501695095-19308-1-git-send-email-rojtberg@gmail.com> X-Mailer: git-send-email 2.7.4 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Pavel Rojtberg attaching two Logitech C615 webcams currently results in VIDIOC_STREAMON: No space left on device as the required bandwidth is not estimated correctly by the device. In fact it always requests 3060 bytes - no matter the format or resolution. setting UVC_QUIRK_FIX_BANDWIDTH does not help either as it is only implemented for uncompressed streams. This patch extends UVC_QUIRK_FIX_BANDWIDTH to MJPEG streams by making a (conservative) assumption of 4bpp for MJPEG streams. As the actual compression ration is often closer to 1bpp this can be overridden via the new mjpeg_bpp parameter. Based on: https://www.mail-archive.com/linux-uvc-devel@lists.berlios.de/msg05724.html --- drivers/media/usb/uvc/uvc_driver.c | 14 +++++++++++++- drivers/media/usb/uvc/uvc_video.c | 3 ++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c index 70842c5..f7b759e 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -37,6 +37,7 @@ unsigned int uvc_no_drop_param; static unsigned int uvc_quirks_param = -1; unsigned int uvc_trace_param; unsigned int uvc_timeout_param = UVC_CTRL_STREAMING_TIMEOUT; +static unsigned int uvc_mjpeg_bpp_param; /* ------------------------------------------------------------------------ * Video formats @@ -463,7 +464,16 @@ static int uvc_parse_format(struct uvc_device *dev, strlcpy(format->name, "MJPEG", sizeof format->name); format->fcc = V4L2_PIX_FMT_MJPEG; format->flags = UVC_FMT_FLAG_COMPRESSED; - format->bpp = 0; + if ((uvc_mjpeg_bpp_param >= 1) && (uvc_mjpeg_bpp_param <= 16)) { + format->bpp = uvc_mjpeg_bpp_param; + } else { + /* conservative estimate. Actual values are around 1bpp. + * see e.g. + * https://developers.google.com/speed/webp/docs/webp_study + */ + format->bpp = 4; + } + ftype = UVC_VS_FRAME_MJPEG; break; @@ -2274,6 +2284,8 @@ module_param_named(trace, uvc_trace_param, uint, S_IRUGO|S_IWUSR); MODULE_PARM_DESC(trace, "Trace level bitmask"); module_param_named(timeout, uvc_timeout_param, uint, S_IRUGO|S_IWUSR); MODULE_PARM_DESC(timeout, "Streaming control requests timeout"); +module_param_named(mjpeg_bpp, uvc_mjpeg_bpp_param, uint, S_IRUGO|S_IWUSR); +MODULE_PARM_DESC(mjpeg_bpp, "MJPEG bits per pixel for bandwidth quirk"); /* ------------------------------------------------------------------------ * Driver initialization and cleanup diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c index fb86d6a..382a0be 100644 --- a/drivers/media/usb/uvc/uvc_video.c +++ b/drivers/media/usb/uvc/uvc_video.c @@ -127,7 +127,8 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream, if ((ctrl->dwMaxPayloadTransferSize & 0xffff0000) == 0xffff0000) ctrl->dwMaxPayloadTransferSize &= ~0xffff0000; - if (!(format->flags & UVC_FMT_FLAG_COMPRESSED) && + if ((!(format->flags & UVC_FMT_FLAG_COMPRESSED) || + (format->fcc == V4L2_PIX_FMT_MJPEG)) && stream->dev->quirks & UVC_QUIRK_FIX_BANDWIDTH && stream->intf->num_altsetting > 1) { u32 interval;