[PATCH 1/2] apps: cam: Add option to configure sensor
Umang Jain
umang.jain at ideasonboard.com
Mon May 20 14:01:09 CEST 2024
From: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
Add a '-f|--sensor_format' option to cam to allow forcing a sensor
configuration from the command line.
As an example:
cam -c1 -C -S --stream pixelformat=YUYV -f width=3840,height=2160,bitDepth=10
Signed-off-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
---
src/apps/cam/camera_session.cpp | 7 +++++
src/apps/cam/main.cpp | 4 +++
src/apps/cam/main.h | 1 +
src/apps/common/stream_options.cpp | 42 ++++++++++++++++++++++++++++++
src/apps/common/stream_options.h | 8 ++++++
5 files changed, 62 insertions(+)
diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp
index f13355ba..a51dcfbc 100644
--- a/src/apps/cam/camera_session.cpp
+++ b/src/apps/cam/camera_session.cpp
@@ -90,6 +90,13 @@ CameraSession::CameraSession(CameraManager *cm,
return;
}
+ /* Apply a sensor configuration is requested. */
+ if (SensorKeyValueParser::updateConfiguration(config.get(),
+ options_[OptSensorFmt])) {
+ std::cerr << "Failed to apply sensor configuration" << std::endl;
+ return;
+ }
+
bool strictFormats = options_.isSet(OptStrictFormats);
#ifdef HAVE_KMS
diff --git a/src/apps/cam/main.cpp b/src/apps/cam/main.cpp
index 4f87f200..0f751469 100644
--- a/src/apps/cam/main.cpp
+++ b/src/apps/cam/main.cpp
@@ -110,6 +110,7 @@ void CamApp::quit()
int CamApp::parseOptions(int argc, char *argv[])
{
StreamKeyValueParser streamKeyValue;
+ SensorKeyValueParser sensorKeyValue;
OptionsParser parser;
parser.addOption(OptCamera, OptionString,
@@ -178,6 +179,9 @@ int CamApp::parseOptions(int argc, char *argv[])
"Load a capture session configuration script from a file",
"script", ArgumentRequired, "script", false,
OptCamera);
+ parser.addOption(OptSensorFmt, &sensorKeyValue,
+ "Apply a format to the sensor", "sensor_format", true,
+ OptCamera);
options_ = parser.parse(argc, argv);
if (!options_.valid())
diff --git a/src/apps/cam/main.h b/src/apps/cam/main.h
index 64e6a20e..65844ac5 100644
--- a/src/apps/cam/main.h
+++ b/src/apps/cam/main.h
@@ -20,6 +20,7 @@ enum {
OptOrientation = 'o',
OptSDL = 'S',
OptStream = 's',
+ OptSensorFmt = 'f',
OptListControls = 256,
OptStrictFormats = 257,
OptMetadata = 258,
diff --git a/src/apps/common/stream_options.cpp b/src/apps/common/stream_options.cpp
index 99239e07..55a2d3d2 100644
--- a/src/apps/common/stream_options.cpp
+++ b/src/apps/common/stream_options.cpp
@@ -119,3 +119,45 @@ std::optional<libcamera::StreamRole> StreamKeyValueParser::parseRole(const KeyVa
return {};
}
+
+SensorKeyValueParser::SensorKeyValueParser()
+{
+ addOption("bitDepth", OptionInteger, "Sensor format bit depth",
+ ArgumentRequired);
+ addOption("width", OptionInteger, "Sensor frame width in pixels",
+ ArgumentRequired);
+ addOption("height", OptionInteger, "Sensor frame height in pixels",
+ ArgumentRequired);
+}
+
+int SensorKeyValueParser::updateConfiguration(CameraConfiguration *config,
+ const OptionValue &values)
+{
+ if (!config) {
+ std::cerr << "No configuration provided" << std::endl;
+ return -EINVAL;
+ }
+
+ /* If no configuration values nothing to do. */
+ if (values.empty())
+ return 0;
+
+ const std::vector<OptionValue> &streamParameters = values.toArray();
+ SensorConfiguration sensorConfig;
+
+ for (auto const &value : streamParameters) {
+ KeyValueParser::Options opts = value.toKeyValues();
+
+ if (opts.isSet("width") && opts.isSet("height")) {
+ sensorConfig.outputSize.width = opts["width"];
+ sensorConfig.outputSize.height = opts["height"];
+ }
+
+ if (opts.isSet("bitDepth"))
+ sensorConfig.bitDepth = opts["bitDepth"];
+ }
+
+ config->sensorConfig = sensorConfig;
+
+ return 0;
+}
diff --git a/src/apps/common/stream_options.h b/src/apps/common/stream_options.h
index a93f104c..f1020d8c 100644
--- a/src/apps/common/stream_options.h
+++ b/src/apps/common/stream_options.h
@@ -27,3 +27,11 @@ public:
private:
static std::optional<libcamera::StreamRole> parseRole(const KeyValueParser::Options &options);
};
+
+class SensorKeyValueParser : public KeyValueParser
+{
+public:
+ SensorKeyValueParser();
+ static int updateConfiguration(libcamera::CameraConfiguration *config,
+ const OptionValue &values);
+};
--
2.44.0
More information about the libcamera-devel
mailing list