summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2022-05-18 19:19:20 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-05-22 12:52:13 +0300
commit568865a6c14355d74349dea61fee06e09f11dfd7 (patch)
treed33c7757839e3c627f473be610062efad0af43fd
parent3a91e37bb82a9df0027adc4182fdb012068c7932 (diff)
cam: Use script parser to set controls
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> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/cam/camera_session.cpp14
-rw-r--r--src/cam/camera_session.h3
-rw-r--r--src/cam/main.cpp4
-rw-r--r--src/cam/main.h1
4 files changed, 22 insertions, 0 deletions
diff --git a/src/cam/camera_session.cpp b/src/cam/camera_session.cpp
index 0bb95c8b..76d552d9 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 bf966bd1..d562caae 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 c7f664b9..9c3370d7 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 62f7bbc9..51b87927 100644
--- a/src/cam/main.h
+++ b/src/cam/main.h
@@ -21,4 +21,5 @@ enum {
OptListControls = 256,
OptStrictFormats = 257,
OptMetadata = 258,
+ OptCaptureScript = 259,
};