From patchwork Tue Sep 9 07:42:43 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guennadi Liakhovetski X-Patchwork-Id: 4866631 Return-Path: X-Original-To: patchwork-linux-media@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 36FE39F32F for ; Tue, 9 Sep 2014 07:42:51 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 570CE20103 for ; Tue, 9 Sep 2014 07:42:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2B1C1200F3 for ; Tue, 9 Sep 2014 07:42:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932165AbaIIHmr (ORCPT ); Tue, 9 Sep 2014 03:42:47 -0400 Received: from mout.gmx.net ([212.227.17.22]:54053 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755826AbaIIHmq (ORCPT ); Tue, 9 Sep 2014 03:42:46 -0400 Received: from axis700.grange ([87.79.42.149]) by mail.gmx.com (mrgmx101) with ESMTPSA (Nemesis) id 0LcnRD-1Y7hYZ30Vz-00kAuM; Tue, 09 Sep 2014 09:42:44 +0200 Received: by axis700.grange (Postfix, from userid 1000) id 648CB40BDB; Tue, 9 Sep 2014 09:42:43 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by axis700.grange (Postfix) with ESMTP id 5B55B40BD9; Tue, 9 Sep 2014 09:42:43 +0200 (CEST) Date: Tue, 9 Sep 2014 09:42:43 +0200 (CEST) From: Guennadi Liakhovetski X-X-Sender: lyakh@axis700.grange To: Linux Media Mailing List cc: Laurent Pinchart Subject: [PATCH] V4L2: UVC: allow using larger buffers Message-ID: MIME-Version: 1.0 X-Provags-ID: V03:K0:ouz+DDTAlc2DZSepJvc4hyY3ZPBTTkyAxFMMLgkQ42XtWKKgiiS mtgkSQ+1T8Kepv1Wh1OpGZax3T8bUVl83BzBgZUxURdKqnG07JoeUCNVHB9h3VvG4krmBmp v3BreG7hKSSeGQDG2mA9EUzpyovwGjI33sn2gkIrXaX4f06PIlBXvX80ubAtTiAuPUe+5PY kEQABuRAel/jPQ+cOop8w== X-UI-Out-Filterresults: notjunk:1; Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Spam-Status: No, score=-9.0 required=5.0 tests=BAYES_00,FREEMAIL_FROM, MALFORMED_FREEMAIL, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP A test in uvc_video_decode_isoc() checks whether an image has been received from the camera completely. For this the data amount is compared to the buffer length, which, however, doesn't have to be equal to the image size. Switch to using formats .sizeimage field for an exact expected image size. Signed-off-by: Guennadi Liakhovetski --- Thanks to Laurent for the idea drivers/media/usb/uvc/uvc_v4l2.c | 1 + drivers/media/usb/uvc/uvc_video.c | 2 +- drivers/media/usb/uvc/uvcvideo.h | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c index 3b548b8..87d15c2 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -318,6 +318,7 @@ static int uvc_v4l2_set_format(struct uvc_streaming *stream, stream->ctrl = probe; stream->cur_format = format; stream->cur_frame = frame; + stream->image_size = fmt->fmt.pix.sizeimage; done: mutex_unlock(&stream->mutex); diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c index e568e07..60abf6f 100644 --- a/drivers/media/usb/uvc/uvc_video.c +++ b/drivers/media/usb/uvc/uvc_video.c @@ -1172,7 +1172,7 @@ static void uvc_video_decode_isoc(struct urb *urb, struct uvc_streaming *stream, urb->iso_frame_desc[i].actual_length); if (buf->state == UVC_BUF_STATE_READY) { - if (buf->length != buf->bytesused && + if (stream->image_size != buf->bytesused && !(stream->cur_format->flags & UVC_FMT_FLAG_COMPRESSED)) buf->error = 1; diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h index 404793b..d3a3b71 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -480,6 +480,7 @@ struct uvc_streaming { struct uvc_format *def_format; struct uvc_format *cur_format; struct uvc_frame *cur_frame; + size_t image_size; /* Protect access to ctrl, cur_format, cur_frame and hardware video * probe control. */