[libcamera-devel,3/3] qcam: Make use of StreamOptionsParser

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

Commit Message

Niklas Söderlund April 24, 2020, 1:16 a.m. UTC
Use the StreamOptionsParser 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>
---
 src/qcam/main.cpp        | 19 ++++++-------------
 src/qcam/main_window.cpp | 34 ++++++++++++++++------------------
 src/qcam/main_window.h   |  8 ++++----
 src/qcam/meson.build     |  1 +
 4 files changed, 27 insertions(+), 35 deletions(-)

Patch

diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp
index 862d714f467c04f9..734423572aae253c 100644
--- a/src/qcam/main.cpp
+++ b/src/qcam/main.cpp
@@ -13,8 +13,8 @@ 
 
 #include <libcamera/camera_manager.h>
 
+#include "../cam/stream_options.h"
 #include "main_window.h"
-#include "../cam/options.h"
 
 void signalHandler(int signal)
 {
@@ -22,24 +22,17 @@  void signalHandler(int signal)
 	qApp->quit();
 }
 
-OptionsParser::Options parseOptions(int argc, char *argv[])
+StreamOptionsParser::Options parseOptions(int argc, char *argv[])
 {
-	KeyValueParser sizeParser;
-	sizeParser.addOption("width", OptionInteger, "Width in pixels",
-			     ArgumentRequired);
-	sizeParser.addOption("height", OptionInteger, "Height in pixels",
-			     ArgumentRequired);
-
-	OptionsParser parser;
+	StreamOptionsParser parser;
 	parser.addOption(OptCamera, OptionString,
 			 "Specify which camera to operate on", "camera",
 			 ArgumentRequired, "camera");
 	parser.addOption(OptHelp, OptionNone, "Display this help message",
 			 "help");
-	parser.addOption(OptSize, &sizeParser, "Set the stream size",
-			 "size", true);
+	parser.addStreamOptions(OptStream, "stream");
 
-	OptionsParser::Options options = parser.parse(argc, argv);
+	StreamOptionsParser::Options options = parser.parse(argc, argv);
 	if (options.isSet(OptHelp))
 		parser.usage();
 
@@ -51,7 +44,7 @@  int main(int argc, char **argv)
 	QApplication app(argc, argv);
 	int ret;
 
-	OptionsParser::Options options = parseOptions(argc, argv);
+	StreamOptionsParser::Options options = parseOptions(argc, argv);
 	if (!options.valid())
 		return EXIT_FAILURE;
 	if (options.isSet(OptHelp))
diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index cf39ed7aceca05b8..dad1b001de770bdc 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -47,7 +47,7 @@  public:
 	}
 };
 
-MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
+MainWindow::MainWindow(CameraManager *cm, const StreamOptionsParser::Options &options)
 	: options_(options), cm_(cm), allocator_(nullptr), isCapturing_(false)
 {
 	int ret;
@@ -277,27 +277,22 @@  int MainWindow::startCapture()
 {
 	int ret;
 
+	/* Verify roles are supported. */
+	if (options_.roles().size() != 1) {
+		qWarning() << "Only one stream supported";
+		return -EINVAL;
+	}
+
+	if (options_.roles()[0] != StreamRole::Viewfinder) {
+		qWarning() << "Only viewfinder supported";
+		return -EINVAL;
+	}
+
 	/* Configure the camera. */
-	config_ = camera_->generateConfiguration({ StreamRole::Viewfinder });
+	config_ = camera_->generateConfiguration(options_.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()) {
@@ -311,6 +306,9 @@  int MainWindow::startCapture()
 		}
 	}
 
+	/* Allow user to override configuration. */
+	options_.applyCameraParameters(config_.get());
+
 	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 5d6251c830707a79..f28eff6591169b9f 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;
@@ -33,7 +33,7 @@  class QAction;
 enum {
 	OptCamera = 'c',
 	OptHelp = 'h',
-	OptSize = 's',
+	OptStream = 's',
 };
 
 class MainWindow : public QMainWindow
@@ -41,7 +41,7 @@  class MainWindow : public QMainWindow
 	Q_OBJECT
 
 public:
-	MainWindow(CameraManager *cm, const OptionsParser::Options &options);
+	MainWindow(CameraManager *cm, const StreamOptionsParser::Options &options);
 	~MainWindow();
 
 	bool event(QEvent *e) override;
@@ -81,7 +81,7 @@  private:
 	QTimer titleTimer_;
 
 	/* Options */
-	const OptionsParser::Options &options_;
+	const StreamOptionsParser::Options &options_;
 
 	/* Camera manager, camera, configuration and buffers */
 	CameraManager *cm_;
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',
 ])