From patchwork Fri May 3 15:34:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 1153 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id DF9CD60E63 for ; Fri, 3 May 2019 17:34:10 +0200 (CEST) Received: from Q.Home (unknown [IPv6:2a02:c7f:1887:5d00:c990:5ff4:193b:c9b8]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 6B32C510; Fri, 3 May 2019 17:34:09 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1556897649; bh=KSkQX1KCvGAAaCPbYyIs5Id7UtuHmaWkt2eOdAzQE5Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PCQqx3vCyc2jh5Bn8VnhCKY8WHWyctz0Zb1GZydO7nkwzaqd3Q5kid4RMDD/nCXRq mfztG812sXCROuPneoxDKE/2N57PaoEnpKeTdFZgA+y6uUJF2+p/COKQh7msaBMUf1 SRon6WsEk87rFBm61DEdEghWGdwT3McFkIJzmEV0= From: Kieran Bingham To: LibCamera Devel Date: Fri, 3 May 2019 16:34:02 +0100 Message-Id: <20190503153403.8728-2-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190503153403.8728-1-kieran.bingham@ideasonboard.com> References: <20190503153403.8728-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 1/2] libcamera: v4l2_device: Add tryFormat support X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 May 2019 15:34:11 -0000 Extend the internal functionality of setFormat{Single,Multi}plane to allow 'trying' a format. This provides the facility of checking a format with the driver before committing to it. Signed-off-by: Kieran Bingham --- src/libcamera/include/v4l2_device.h | 7 +++++-- src/libcamera/v4l2_device.cpp | 29 +++++++++++++++++++++++------ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/libcamera/include/v4l2_device.h b/src/libcamera/include/v4l2_device.h index 2e7bd1e7f4cc..a08615c3bd9a 100644 --- a/src/libcamera/include/v4l2_device.h +++ b/src/libcamera/include/v4l2_device.h @@ -126,6 +126,7 @@ public: int getFormat(V4L2DeviceFormat *format); int setFormat(V4L2DeviceFormat *format); + int tryFormat(V4L2DeviceFormat *format); int exportBuffers(BufferPool *pool); int importBuffers(BufferPool *pool); @@ -145,10 +146,12 @@ protected: private: int getFormatSingleplane(V4L2DeviceFormat *format); - int setFormatSingleplane(V4L2DeviceFormat *format); + int trySetFormatSingleplane(V4L2DeviceFormat *format, + unsigned long request); int getFormatMultiplane(V4L2DeviceFormat *format); - int setFormatMultiplane(V4L2DeviceFormat *format); + int trySetFormatMultiplane(V4L2DeviceFormat *format, + unsigned long request); int requestBuffers(unsigned int count); int createPlane(Buffer *buffer, unsigned int plane, diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp index 1bbf79673c16..d965c7226b04 100644 --- a/src/libcamera/v4l2_device.cpp +++ b/src/libcamera/v4l2_device.cpp @@ -434,8 +434,23 @@ int V4L2Device::getFormat(V4L2DeviceFormat *format) */ int V4L2Device::setFormat(V4L2DeviceFormat *format) { - return caps_.isMultiplanar() ? setFormatMultiplane(format) : - setFormatSingleplane(format); + return caps_.isMultiplanar() ? trySetFormatMultiplane(format, VIDIOC_S_FMT) : + trySetFormatSingleplane(format, VIDIOC_S_FMT); +} + +/** + * \brief Validate an image format on the V4L2 device + * \param[inout] format The image format to apply to the device + * + * Try the supplied \a format on the device, and return the format parameters + * that would have been applied, as \ref V4L2Device::setFormat would do. + * + * \return 0 on success or a negative error code otherwise + */ +int V4L2Device::tryFormat(V4L2DeviceFormat *format) +{ + return caps_.isMultiplanar() ? trySetFormatMultiplane(format, VIDIOC_TRY_FMT) : + trySetFormatSingleplane(format, VIDIOC_TRY_FMT); } int V4L2Device::getFormatSingleplane(V4L2DeviceFormat *format) @@ -462,7 +477,8 @@ int V4L2Device::getFormatSingleplane(V4L2DeviceFormat *format) return 0; } -int V4L2Device::setFormatSingleplane(V4L2DeviceFormat *format) +int V4L2Device::trySetFormatSingleplane(V4L2DeviceFormat *format, + unsigned long request) { struct v4l2_format v4l2Format = {}; struct v4l2_pix_format *pix = &v4l2Format.fmt.pix; @@ -475,7 +491,7 @@ int V4L2Device::setFormatSingleplane(V4L2DeviceFormat *format) pix->bytesperline = format->planes[0].bpl; pix->field = V4L2_FIELD_NONE; - ret = ioctl(fd_, VIDIOC_S_FMT, &v4l2Format); + ret = ioctl(fd_, request, &v4l2Format); if (ret) { ret = -errno; LOG(V4L2, Error) << "Unable to set format: " << strerror(-ret); @@ -523,7 +539,8 @@ int V4L2Device::getFormatMultiplane(V4L2DeviceFormat *format) return 0; } -int V4L2Device::setFormatMultiplane(V4L2DeviceFormat *format) +int V4L2Device::trySetFormatMultiplane(V4L2DeviceFormat *format, + unsigned long request) { struct v4l2_format v4l2Format = {}; struct v4l2_pix_format_mplane *pix = &v4l2Format.fmt.pix_mp; @@ -541,7 +558,7 @@ int V4L2Device::setFormatMultiplane(V4L2DeviceFormat *format) pix->plane_fmt[i].sizeimage = format->planes[i].size; } - ret = ioctl(fd_, VIDIOC_S_FMT, &v4l2Format); + ret = ioctl(fd_, request, &v4l2Format); if (ret) { ret = -errno; LOG(V4L2, Error) << "Unable to set format: " << strerror(-ret); From patchwork Fri May 3 15:34:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 1154 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E6D0E60E6A for ; Fri, 3 May 2019 17:34:11 +0200 (CEST) Received: from Q.Home (unknown [IPv6:2a02:c7f:1887:5d00:c990:5ff4:193b:c9b8]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B1CE9530; Fri, 3 May 2019 17:34:09 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1556897649; bh=Ay8aKn5NsySJWlSP2RD3sYpZ8feXqk59BmPlZVhKUA4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CvCw1qLmJtF+AjmV9m9502zWuHgocMb1N0glj4nJpwA0NQOgOoym7oENuSlEaFjHk xNEN0Qs8eNbxRXu1LlmR4v/UBVoI29rDo7afKjnWTPp97MEXBmKe76Sb2Q4DC2rDGw i6zBWRjHJiM1DcSCIDCl6SttBh21IOJOwrJYqcUc= From: Kieran Bingham To: LibCamera Devel Date: Fri, 3 May 2019 16:34:03 +0100 Message-Id: <20190503153403.8728-3-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190503153403.8728-1-kieran.bingham@ideasonboard.com> References: <20190503153403.8728-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 2/2] libcamera: pipeline: uvc: Try a default format against the device X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 May 2019 15:34:12 -0000 We can not predict a suitable default for a UVC camera as they are so varied. Take a starting point as a default configuration and test it against the device with the tryFormat call. The camera will return the closest supported format from that configuration. Signed-off-by: Kieran Bingham --- src/libcamera/pipeline/uvcvideo.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp index 5d2f1c98fa36..9247dff33606 100644 --- a/src/libcamera/pipeline/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo.cpp @@ -91,9 +91,16 @@ PipelineHandlerUVC::streamConfiguration(Camera *camera, UVCCameraData *data = cameraData(camera); CameraConfiguration config; StreamConfiguration cfg{}; + V4L2DeviceFormat format; - cfg.pixelFormat = V4L2_PIX_FMT_YUYV; - cfg.size = { 640, 480 }; + format.fourcc = V4L2_PIX_FMT_YUYV; + format.size = { 1920, 1080 }; + + /* Ask the video device to confirm a suitable default configuration. */ + data->video_->tryFormat(&format); + + cfg.size = format.size; + cfg.pixelFormat = format.fourcc; cfg.bufferCount = 4; config[&data->stream_] = cfg;