[{"id":23118,"web_url":"https://patchwork.libcamera.org/comment/23118/","msgid":"<20220521162645.egjoxy7h5rnmfjn7@uno.localdomain>","date":"2022-05-21T16:26:45","subject":"Re: [libcamera-devel] [PATCH v2 3/3] cam: Use script parser to set\n\tcontrols","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Laurent\n\nOn Fri, May 20, 2022 at 07:52:34PM +0300, Laurent Pinchart wrote:\n> From: Jacopo Mondi <jacopo@jmondi.org>\n>\n> Add a \"--script\" option to the cam test application to allow specify a\n> capture script to be used to drive the capture session. Add to the\n> CameraSession class a script parser instance, created conditionally to\n> the OptCaptureScript option.\n>\n> If the script parser has been created, use it at queueRequest time to\n> retrieve the list of controls that has to be associated with a Request,\n> and populate Request::controls() with it before queueing it to the\n> Camera.\n>\n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n\nNot sure who of the two of us should send which tag :)\nYour fixes are fine, so go ahead and merge!\n> ---\n> Changes since v1:\n>\n> - Add error message if the capture script is invalid\n> - Forward-declare CaptureScript\n> - Remove stray \\n in help text\n> - Squash with \"cam: Add a --script option\"\n> ---\n>  src/cam/camera_session.cpp | 14 ++++++++++++++\n>  src/cam/camera_session.h   |  3 +++\n>  src/cam/main.cpp           |  4 ++++\n>  src/cam/main.h             |  1 +\n>  4 files changed, 22 insertions(+)\n>\n> diff --git a/src/cam/camera_session.cpp b/src/cam/camera_session.cpp\n> index 0bb95c8bf682..76d552d98917 100644\n> --- a/src/cam/camera_session.cpp\n> +++ b/src/cam/camera_session.cpp\n> @@ -14,6 +14,7 @@\n>  #include <libcamera/property_ids.h>\n>\n>  #include \"camera_session.h\"\n> +#include \"capture_script.h\"\n>  #include \"event_loop.h\"\n>  #include \"file_sink.h\"\n>  #ifdef HAVE_KMS\n> @@ -91,6 +92,16 @@ CameraSession::CameraSession(CameraManager *cm,\n>  \t}\n>  #endif\n>\n> +\tif (options_.isSet(OptCaptureScript)) {\n> +\t\tstd::string scriptName = options_[OptCaptureScript].toString();\n> +\t\tscript_ = std::make_unique<CaptureScript>(camera_, scriptName);\n> +\t\tif (!script_->valid()) {\n> +\t\t\tstd::cerr << \"Invalid capture script '\" << scriptName\n> +\t\t\t\t  << \"'\" << std::endl;\n> +\t\t\treturn;\n> +\t\t}\n> +\t}\n> +\n>  \tswitch (config->validate()) {\n>  \tcase CameraConfiguration::Valid:\n>  \t\tbreak;\n> @@ -322,6 +333,9 @@ int CameraSession::queueRequest(Request *request)\n>  \tif (captureLimit_ && queueCount_ >= captureLimit_)\n>  \t\treturn 0;\n>\n> +\tif (script_)\n> +\t\trequest->controls() = script_->frameControls(queueCount_);\n> +\n>  \tqueueCount_++;\n>\n>  \treturn camera_->queueRequest(request);\n> diff --git a/src/cam/camera_session.h b/src/cam/camera_session.h\n> index bf966bd15ab0..d562caae0794 100644\n> --- a/src/cam/camera_session.h\n> +++ b/src/cam/camera_session.h\n> @@ -23,6 +23,7 @@\n>\n>  #include \"options.h\"\n>\n> +class CaptureScript;\n>  class FrameSink;\n>\n>  class CameraSession\n> @@ -60,6 +61,8 @@ private:\n>  \tstd::shared_ptr<libcamera::Camera> camera_;\n>  \tstd::unique_ptr<libcamera::CameraConfiguration> config_;\n>\n> +\tstd::unique_ptr<CaptureScript> script_;\n> +\n>  \tstd::map<const libcamera::Stream *, std::string> streamNames_;\n>  \tstd::unique_ptr<FrameSink> sink_;\n>  \tunsigned int cameraIndex_;\n> diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n> index c7f664b903e0..9c3370d7951f 100644\n> --- a/src/cam/main.cpp\n> +++ b/src/cam/main.cpp\n> @@ -158,6 +158,10 @@ int CamApp::parseOptions(int argc, char *argv[])\n>  \t\t\t \"Print the metadata for completed requests\",\n>  \t\t\t \"metadata\", ArgumentNone, nullptr, false,\n>  \t\t\t OptCamera);\n> +\tparser.addOption(OptCaptureScript, OptionString,\n> +\t\t\t \"Load a capture session configuration script from a file\",\n> +\t\t\t \"script\", ArgumentRequired, \"script\", false,\n> +\t\t\t OptCamera);\n>\n>  \toptions_ = parser.parse(argc, argv);\n>  \tif (!options_.valid())\n> diff --git a/src/cam/main.h b/src/cam/main.h\n> index 62f7bbc9d181..51b87927837f 100644\n> --- a/src/cam/main.h\n> +++ b/src/cam/main.h\n> @@ -21,4 +21,5 @@ enum {\n>  \tOptListControls = 256,\n>  \tOptStrictFormats = 257,\n>  \tOptMetadata = 258,\n> +\tOptCaptureScript = 259,\n>  };\n> --\n> Regards,\n>\n> Laurent Pinchart\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id E738AC3256\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 21 May 2022 16:26:48 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 467A065663;\n\tSat, 21 May 2022 18:26:48 +0200 (CEST)","from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net\n\t[217.70.183.195])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8CE9765654\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 21 May 2022 18:26:47 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby mail.gandi.net (Postfix) with ESMTPSA id DCB4360006;\n\tSat, 21 May 2022 16:26:46 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1653150408;\n\tbh=H3o+TvPuPavDs/YEwLUrUi6ubOrXZMSuiBeu8BB+TLY=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=LeOvyW0PuHzKbgNri/70uW2/ijvJn6mJLInjrjsM6RMuN/B8KS0EGeAs1OHOXRryp\n\tRDhSjQRlOcb2qzwktaHMPGDFlG0nLK1jGtGVMvpokVsB1W0MSNnC0AJVzUrAr1mljV\n\tf94DJC3StVuijS9kuJl1NXxhMpCKrG4xC8qvsn5KDZSQSa641ndVL3E4FsLa4DUp2B\n\t2sIyf66lwWBH3kXWFyQ+bhWGhAxTvCmOQIm2mTPpeNDGC9CmA7wj0g/E3qKxRKzNM5\n\tCNqRrztXuvuXHGSywZMGMX368T0zWa0wkmtdCKBanjGAmNYWcMPIM/A1rqyuHDtGOl\n\tDvAHZ+IlWLGLg==","Date":"Sat, 21 May 2022 18:26:45 +0200","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<20220521162645.egjoxy7h5rnmfjn7@uno.localdomain>","References":"<20220520165234.7642-1-laurent.pinchart@ideasonboard.com>\n\t<20220520165234.7642-4-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20220520165234.7642-4-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v2 3/3] cam: Use script parser to set\n\tcontrols","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Jacopo Mondi via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]