From patchwork Fri May 20 16:52:34 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 15994 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 C8BF7C326C for ; Fri, 20 May 2022 16:52:50 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E3B1365671; Fri, 20 May 2022 18:52:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1653065569; bh=ma1XlaQ7qDzPbqc883R/RCy76hX2MGSNlKCM/5fGHr8=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=gZWcaHIicpJ7sn0MlVl1m8S2MY7f/jUkGfKVS84WWx7IflP6TSNyIKyQxEbTwxA94 O1GwBej64Yw7r29e1HQdHMwl6rAGITkDPDBnECWqBiN5p3gcQcy1mGH/2IpahYNAUn mreelpkvjcw1plhEx6lCOUzWpa0PLlfuMe1iwMvNEz1I3GHk79bjEiJnO7PM/RYB6w NFCehvCe+RvTAIURGIJbi0KwDPjIqyR80prNMmo+vJmBzWrhhbH8r5DuliFApqch35 QWSMhzyIKQ/37k9d1tKL/YQ8DMU6oAJtuRZVbkeZNaIZm7kv6IiepjUVOxcYbbQtBP c/RmqjC3SewrQ== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2D02A65668 for ; Fri, 20 May 2022 18:52:46 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="B8doWS1t"; dkim-atps=neutral Received: from localhost.localdomain (unknown [45.131.31.124]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C00556D1; Fri, 20 May 2022 18:52:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1653065566; bh=ma1XlaQ7qDzPbqc883R/RCy76hX2MGSNlKCM/5fGHr8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=B8doWS1tgjqaqqqOZX71Dxv3GspS8KVXY4URuCQt/p6NxanzX4mnJd1+11LtMtiBM SNqiCKalVpVbt16wFBzwLyGQNrWtc944gchO3/O9MwOKxFOSpTv2RAlHdgKgKv1mp7 kCjEcznV7N/4HG5NnvwEJfBj54W7S6FkRJIw5Pw8= To: libcamera-devel@lists.libcamera.org Date: Fri, 20 May 2022 19:52:34 +0300 Message-Id: <20220520165234.7642-4-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220520165234.7642-1-laurent.pinchart@ideasonboard.com> References: <20220520165234.7642-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 3/3] cam: Use script parser to set controls 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: , X-Patchwork-Original-From: Laurent Pinchart via libcamera-devel From: Laurent Pinchart Reply-To: Laurent Pinchart Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" From: Jacopo Mondi Add a "--script" option to the cam test application to allow specify a capture script to be used to drive the capture session. Add to the CameraSession class a script parser instance, created conditionally to the OptCaptureScript option. If the script parser has been created, use it at queueRequest time to retrieve the list of controls that has to be associated with a Request, and populate Request::controls() with it before queueing it to the Camera. Signed-off-by: Jacopo Mondi --- Changes since v1: - Add error message if the capture script is invalid - Forward-declare CaptureScript - Remove stray \n in help text - Squash with "cam: Add a --script option" --- src/cam/camera_session.cpp | 14 ++++++++++++++ src/cam/camera_session.h | 3 +++ src/cam/main.cpp | 4 ++++ src/cam/main.h | 1 + 4 files changed, 22 insertions(+) diff --git a/src/cam/camera_session.cpp b/src/cam/camera_session.cpp index 0bb95c8bf682..76d552d98917 100644 --- a/src/cam/camera_session.cpp +++ b/src/cam/camera_session.cpp @@ -14,6 +14,7 @@ #include #include "camera_session.h" +#include "capture_script.h" #include "event_loop.h" #include "file_sink.h" #ifdef HAVE_KMS @@ -91,6 +92,16 @@ CameraSession::CameraSession(CameraManager *cm, } #endif + if (options_.isSet(OptCaptureScript)) { + std::string scriptName = options_[OptCaptureScript].toString(); + script_ = std::make_unique(camera_, scriptName); + if (!script_->valid()) { + std::cerr << "Invalid capture script '" << scriptName + << "'" << std::endl; + return; + } + } + switch (config->validate()) { case CameraConfiguration::Valid: break; @@ -322,6 +333,9 @@ int CameraSession::queueRequest(Request *request) if (captureLimit_ && queueCount_ >= captureLimit_) return 0; + if (script_) + request->controls() = script_->frameControls(queueCount_); + queueCount_++; return camera_->queueRequest(request); diff --git a/src/cam/camera_session.h b/src/cam/camera_session.h index bf966bd15ab0..d562caae0794 100644 --- a/src/cam/camera_session.h +++ b/src/cam/camera_session.h @@ -23,6 +23,7 @@ #include "options.h" +class CaptureScript; class FrameSink; class CameraSession @@ -60,6 +61,8 @@ private: std::shared_ptr camera_; std::unique_ptr config_; + std::unique_ptr script_; + std::map streamNames_; std::unique_ptr sink_; unsigned int cameraIndex_; diff --git a/src/cam/main.cpp b/src/cam/main.cpp index c7f664b903e0..9c3370d7951f 100644 --- a/src/cam/main.cpp +++ b/src/cam/main.cpp @@ -158,6 +158,10 @@ int CamApp::parseOptions(int argc, char *argv[]) "Print the metadata for completed requests", "metadata", ArgumentNone, nullptr, false, OptCamera); + parser.addOption(OptCaptureScript, OptionString, + "Load a capture session configuration script from a file", + "script", ArgumentRequired, "script", false, + OptCamera); options_ = parser.parse(argc, argv); if (!options_.valid()) diff --git a/src/cam/main.h b/src/cam/main.h index 62f7bbc9d181..51b87927837f 100644 --- a/src/cam/main.h +++ b/src/cam/main.h @@ -21,4 +21,5 @@ enum { OptListControls = 256, OptStrictFormats = 257, OptMetadata = 258, + OptCaptureScript = 259, };