[libcamera-devel,v2,3/3] cam: Use script parser to set controls
diff mbox series

Message ID 20220520165234.7642-4-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • cam: Add support for capture scripts
Related show

Commit Message

Laurent Pinchart May 20, 2022, 4:52 p.m. UTC
From: Jacopo Mondi <jacopo@jmondi.org>

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 <jacopo@jmondi.org>
---
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(+)

Comments

Jacopo Mondi May 21, 2022, 4:26 p.m. UTC | #1
Hi Laurent

On Fri, May 20, 2022 at 07:52:34PM +0300, Laurent Pinchart wrote:
> From: Jacopo Mondi <jacopo@jmondi.org>
>
> 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 <jacopo@jmondi.org>

Not sure who of the two of us should send which tag :)
Your fixes are fine, so go ahead and merge!
> ---
> 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 <libcamera/property_ids.h>
>
>  #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<CaptureScript>(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<libcamera::Camera> camera_;
>  	std::unique_ptr<libcamera::CameraConfiguration> config_;
>
> +	std::unique_ptr<CaptureScript> script_;
> +
>  	std::map<const libcamera::Stream *, std::string> streamNames_;
>  	std::unique_ptr<FrameSink> 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,
>  };
> --
> Regards,
>
> Laurent Pinchart
>

Patch
diff mbox series

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 <libcamera/property_ids.h>
 
 #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<CaptureScript>(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<libcamera::Camera> camera_;
 	std::unique_ptr<libcamera::CameraConfiguration> config_;
 
+	std::unique_ptr<CaptureScript> script_;
+
 	std::map<const libcamera::Stream *, std::string> streamNames_;
 	std::unique_ptr<FrameSink> 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,
 };