From patchwork Tue Oct 12 02:23:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 14104 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 4E2A0C323E for ; Tue, 12 Oct 2021 02:23:43 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 07CA168F50; Tue, 12 Oct 2021 04:23:42 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="N0fiEqYN"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 939CB68F4A for ; Tue, 12 Oct 2021 04:23:39 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 3595B8C4 for ; Tue, 12 Oct 2021 04:23:39 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1634005419; bh=ectT3bfxbXD9JiDcQ6ugKOzzEXEaKkdahT4iQQSXmUs=; h=From:To:Subject:Date:In-Reply-To:References:From; b=N0fiEqYNdXr/zPuLIY5sqoqg0MR9Im6e/T0gjFuE/QMg2w0Iuc/O4KHwe33bVvOgt UUmeqYmU2WxJ/uam2mFmm60QFIyLG0D1bNM+ee2k7KA8H4TJAze3QR542wlwfYZHzd tZYQ4TJ/aBfAx/DwVxnpvaJaCsZq0rSS+ulojWSE= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Tue, 12 Oct 2021 05:23:19 +0300 Message-Id: <20211012022321.27034-2-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20211012022321.27034-1-laurent.pinchart@ideasonboard.com> References: <20211012022321.27034-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 1/3] cam: Rename CameraSession::streamName_ to streamNames_ X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The streamName_ map contains names for all streams, rename it to streamNames_ to make this more explicit. Signed-off-by: Laurent Pinchart Reviewed-by: Kieran Bingham --- src/cam/camera_session.cpp | 8 ++++---- src/cam/camera_session.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cam/camera_session.cpp b/src/cam/camera_session.cpp index 32a373a99b72..5a25baab03f5 100644 --- a/src/cam/camera_session.cpp +++ b/src/cam/camera_session.cpp @@ -177,11 +177,11 @@ int CameraSession::start() return ret; } - streamName_.clear(); + streamNames_.clear(); for (unsigned int index = 0; index < config_->size(); ++index) { StreamConfiguration &cfg = config_->at(index); - streamName_[cfg.stream()] = "cam" + std::to_string(cameraIndex_) - + "-stream" + std::to_string(index); + streamNames_[cfg.stream()] = "cam" + std::to_string(cameraIndex_) + + "-stream" + std::to_string(index); } camera_->requestCompleted.connect(this, &CameraSession::requestComplete); @@ -369,7 +369,7 @@ void CameraSession::processRequest(Request *request) const FrameMetadata &metadata = buffer->metadata(); - info << " " << streamName_[stream] + info << " " << streamNames_[stream] << " seq: " << std::setw(6) << std::setfill('0') << metadata.sequence << " bytesused: "; diff --git a/src/cam/camera_session.h b/src/cam/camera_session.h index 2ccc71977a99..a7f92d61307e 100644 --- a/src/cam/camera_session.h +++ b/src/cam/camera_session.h @@ -60,7 +60,7 @@ private: std::shared_ptr camera_; std::unique_ptr config_; - std::map streamName_; + std::map streamNames_; std::unique_ptr sink_; unsigned int cameraIndex_; From patchwork Tue Oct 12 02:23:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 14105 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id DBB0CC3243 for ; Tue, 12 Oct 2021 02:23:43 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 58D7068F57; Tue, 12 Oct 2021 04:23:42 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="eHhN0qeb"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id D747068F4B for ; Tue, 12 Oct 2021 04:23:39 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 87268F1 for ; Tue, 12 Oct 2021 04:23:39 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1634005419; bh=P5/sIE13xLRuD7BY5Hxp8AqKx/n8azuj3bTRlmGJM2k=; h=From:To:Subject:Date:In-Reply-To:References:From; b=eHhN0qeba6qCIRExoRefIU5b347l5lN8ZWHdenXTHebC92S7NkeI/zfxwZd/r3no6 TCFIcz2ZZQcCXxcc5drmvojYdBR6Q9PikHaF9Jt276xdIggtjSba0dIRN0JAEumrPt IjTegWNACt48eIQEvQtMysWoG+1K5Gybboasiczc= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Tue, 12 Oct 2021 05:23:20 +0300 Message-Id: <20211012022321.27034-3-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20211012022321.27034-1-laurent.pinchart@ideasonboard.com> References: <20211012022321.27034-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 2/3] cam: Pass stream names to FileSink X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The FileSink class constructs stream names internally the same way that the CameraSession does, except that it fails to add the camera name. This results in files being written without the camera name. This could be fixed in FileSink, but we would still duplicate code to construct stream names. Pass the stream names map from CameraSession to FileSink instead, and store it internally. Fixes: 02001fecb0f5 ("cam: Turn BufferWriter into a FrameSink") Signed-off-by: Laurent Pinchart Acked-by: Kieran Bingham --- src/cam/camera_session.cpp | 5 +++-- src/cam/file_sink.cpp | 11 +++-------- src/cam/file_sink.h | 3 ++- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/cam/camera_session.cpp b/src/cam/camera_session.cpp index 5a25baab03f5..605018278c5a 100644 --- a/src/cam/camera_session.cpp +++ b/src/cam/camera_session.cpp @@ -193,9 +193,10 @@ int CameraSession::start() if (options_.isSet(OptFile)) { if (!options_[OptFile].toString().empty()) - sink_ = std::make_unique(options_[OptFile]); + sink_ = std::make_unique(streamNames_, + options_[OptFile]); else - sink_ = std::make_unique(); + sink_ = std::make_unique(streamNames_); } if (sink_) { diff --git a/src/cam/file_sink.cpp b/src/cam/file_sink.cpp index 3c2e565b27a2..45213d4a54fe 100644 --- a/src/cam/file_sink.cpp +++ b/src/cam/file_sink.cpp @@ -20,8 +20,9 @@ using namespace libcamera; -FileSink::FileSink(const std::string &pattern) - : pattern_(pattern) +FileSink::FileSink(const std::map &streamNames, + const std::string &pattern) + : streamNames_(streamNames), pattern_(pattern) { } @@ -35,12 +36,6 @@ int FileSink::configure(const libcamera::CameraConfiguration &config) if (ret < 0) return ret; - streamNames_.clear(); - for (unsigned int index = 0; index < config.size(); ++index) { - const StreamConfiguration &cfg = config.at(index); - streamNames_[cfg.stream()] = "stream" + std::to_string(index); - } - return 0; } diff --git a/src/cam/file_sink.h b/src/cam/file_sink.h index 335be93b8732..8de93a01a1e8 100644 --- a/src/cam/file_sink.h +++ b/src/cam/file_sink.h @@ -20,7 +20,8 @@ class Image; class FileSink : public FrameSink { public: - FileSink(const std::string &pattern = ""); + FileSink(const std::map &streamNames, + const std::string &pattern = ""); ~FileSink(); int configure(const libcamera::CameraConfiguration &config) override; From patchwork Tue Oct 12 02:23:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 14106 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 1C1EAC323E for ; Tue, 12 Oct 2021 02:23:44 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C088D68F5A; Tue, 12 Oct 2021 04:23:42 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="fLFHJoS+"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2C08568F4A for ; Tue, 12 Oct 2021 04:23:40 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D43E98C4 for ; Tue, 12 Oct 2021 04:23:39 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1634005420; bh=I23Z9JaXjMWBghec/NOt2m4OrRXgZVnbpe0uWSjU6pY=; h=From:To:Subject:Date:In-Reply-To:References:From; b=fLFHJoS+jKOcOfVYV4XGiOsl6Xzmyg9XCO/hu/X8FOwXPk0jLRDONgsm22f8ThhHr m6aa0Ws3F6szTCxApQYPINMBMwVDMdmhRHdB+Yzxcr8SqFE/pO9/sp9rCrwox3HAlo 6XIwxFJIuHlqiJPbnytYrgj/ALh0trEhCg7HhQW0= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Tue, 12 Oct 2021 05:23:21 +0300 Message-Id: <20211012022321.27034-4-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20211012022321.27034-1-laurent.pinchart@ideasonboard.com> References: <20211012022321.27034-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 3/3] cam: Drop frames once the capture limit is reached X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The camera session keeps requeuing requests until the capture limit is reached. This causes more request than the limit to complete, as there's a queue of requests in flight. When capturing from multiple cameras concurrently, this results in the captureDone signal being emitted for every request completion after the limit is reached, instead of once per camera session when reaching the limit. Fix this by simply dropping any request that completes after the limit is reached. We could instead avoid requeuing more requests than needed to reach the limit, but that may cause request starvation in pipelines, which are currently not handled consistently (or correctly). Signed-off-by: Laurent Pinchart Reviewed-by: Kieran Bingham --- src/cam/camera_session.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cam/camera_session.cpp b/src/cam/camera_session.cpp index 605018278c5a..594cd51bb6a2 100644 --- a/src/cam/camera_session.cpp +++ b/src/cam/camera_session.cpp @@ -348,6 +348,9 @@ void CameraSession::processRequest(Request *request) { const Request::BufferMap &buffers = request->buffers(); + if (captureLimit_ && captureCount_ >= captureLimit_) + return; + /* * Compute the frame rate. The timestamp is arbitrarily retrieved from * the first buffer, as all buffers should have matching timestamps.