[libcamera-devel,v3,5/6] qcam: Make use of StreamKeyValueParser

Message ID 20200501023432.90032-6-niklas.soderlund@ragnatech.se
State Accepted
Headers show
Series
  • {cam, qcam}: Unify stream option parsing
Related show

Commit Message

Niklas Söderlund May 1, 2020, 2:34 a.m. UTC
Use the StreamKeyValueParser helper to parse stream configuration from
the command line. This extends qcam to accept role hints and pixel
format in addition to a size.

Currently only one viewfinder stream is supported, add a check to keep
this behavior. Going forward this restriction will be lifted to support
more then one stream.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
* Changes since v2
- Add log messages
---
 src/qcam/main.cpp        | 13 +++++--------
 src/qcam/main_window.cpp | 37 ++++++++++++++++++++-----------------
 src/qcam/main_window.h   |  4 ++--
 src/qcam/meson.build     |  1 +
 4 files changed, 28 insertions(+), 27 deletions(-)

Patch

diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp
index 862d714f467c04f9..b3468cbf47e28894 100644
--- a/src/qcam/main.cpp
+++ b/src/qcam/main.cpp
@@ -13,8 +13,9 @@ 
 
 #include <libcamera/camera_manager.h>
 
-#include "main_window.h"
 #include "../cam/options.h"
+#include "../cam/stream_options.h"
+#include "main_window.h"
 
 void signalHandler(int signal)
 {
@@ -24,11 +25,7 @@  void signalHandler(int signal)
 
 OptionsParser::Options parseOptions(int argc, char *argv[])
 {
-	KeyValueParser sizeParser;
-	sizeParser.addOption("width", OptionInteger, "Width in pixels",
-			     ArgumentRequired);
-	sizeParser.addOption("height", OptionInteger, "Height in pixels",
-			     ArgumentRequired);
+	StreamKeyValueParser streamKeyValue;
 
 	OptionsParser parser;
 	parser.addOption(OptCamera, OptionString,
@@ -36,8 +33,8 @@  OptionsParser::Options parseOptions(int argc, char *argv[])
 			 ArgumentRequired, "camera");
 	parser.addOption(OptHelp, OptionNone, "Display this help message",
 			 "help");
-	parser.addOption(OptSize, &sizeParser, "Set the stream size",
-			 "size", true);
+	parser.addOption(OptStream, &streamKeyValue,
+			 "Set configuration of a camera stream", "stream", true);
 
 	OptionsParser::Options options = parser.parse(argc, argv);
 	if (options.isSet(OptHelp))
diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index 5a2ac699f349f7cc..74427592ea47de28 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -280,29 +280,25 @@  void MainWindow::toggleCapture(bool start)
  */
 int MainWindow::startCapture()
 {
+	StreamRoles roles = StreamKeyValueParser::roles(options_[OptStream]);
 	int ret;
 
+	/* Verify roles are supported. */
+	if (roles.size() != 1) {
+		qCritical() << "Only one stream supported";
+		return -EINVAL;
+	}
+
+	if (roles[0] != StreamRole::Viewfinder) {
+		qCritical() << "Only viewfinder supported";
+		return -EINVAL;
+	}
+
 	/* Configure the camera. */
-	config_ = camera_->generateConfiguration({ StreamRole::Viewfinder });
+	config_ = camera_->generateConfiguration(roles);
 
 	StreamConfiguration &cfg = config_->at(0);
 
-	if (options_.isSet(OptSize)) {
-		const std::vector<OptionValue> &sizeOptions =
-			options_[OptSize].toArray();
-
-		/* Set desired stream size if requested. */
-		for (const auto &value : sizeOptions) {
-			KeyValueParser::Options opt = value.toKeyValues();
-
-			if (opt.isSet("width"))
-				cfg.size.width = opt["width"];
-
-			if (opt.isSet("height"))
-				cfg.size.height = opt["height"];
-		}
-	}
-
 	/* Use a format supported by the viewfinder if available. */
 	std::vector<PixelFormat> formats = cfg.formats().pixelformats();
 	for (const PixelFormat &format : viewfinder_->nativeFormats()) {
@@ -316,6 +312,13 @@  int MainWindow::startCapture()
 		}
 	}
 
+	/* Allow user to override configuration. */
+	if (StreamKeyValueParser::updateConfiguration(config_.get(),
+						      options_[OptStream])) {
+		qWarning() << "Failed to update configuration";
+		return -EINVAL;
+	}
+
 	CameraConfiguration::Status validation = config_->validate();
 	if (validation == CameraConfiguration::Invalid) {
 		qWarning() << "Failed to create valid camera configuration";
diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
index 4ec37d40e1cff495..aea1f1dee20fcbb6 100644
--- a/src/qcam/main_window.h
+++ b/src/qcam/main_window.h
@@ -23,7 +23,7 @@ 
 #include <libcamera/framebuffer_allocator.h>
 #include <libcamera/stream.h>
 
-#include "../cam/options.h"
+#include "../cam/stream_options.h"
 #include "viewfinder.h"
 
 using namespace libcamera;
@@ -34,7 +34,7 @@  class QComboBox;
 enum {
 	OptCamera = 'c',
 	OptHelp = 'h',
-	OptSize = 's',
+	OptStream = 's',
 };
 
 class MainWindow : public QMainWindow
diff --git a/src/qcam/meson.build b/src/qcam/meson.build
index c256d06f8ccfc0ae..895264be4a3388f4 100644
--- a/src/qcam/meson.build
+++ b/src/qcam/meson.build
@@ -3,6 +3,7 @@  qcam_sources = files([
     'main.cpp',
     'main_window.cpp',
     '../cam/options.cpp',
+    '../cam/stream_options.cpp',
     'viewfinder.cpp',
 ])