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

Message ID 20200424011656.2889720-3-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.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
---
 src/cam/main.cpp | 77 +++++-------------------------------------------
 1 file changed, 7 insertions(+), 70 deletions(-)

Patch

diff --git a/src/cam/main.cpp b/src/cam/main.cpp
index 718740f49762ec7b..b7cc206e6d5176db 100644
--- a/src/cam/main.cpp
+++ b/src/cam/main.cpp
@@ -17,6 +17,7 @@ 
 #include "event_loop.h"
 #include "main.h"
 #include "options.h"
+#include "stream_options.h"
 
 using namespace libcamera;
 
@@ -42,7 +43,7 @@  private:
 	int run();
 
 	static CamApp *app_;
-	OptionsParser::Options options_;
+	StreamOptionsParser::Options options_;
 	CameraManager *cm_;
 	std::shared_ptr<Camera> camera_;
 	std::unique_ptr<libcamera::CameraConfiguration> config_;
@@ -153,18 +154,7 @@  void CamApp::quit()
 
 int CamApp::parseOptions(int argc, char *argv[])
 {
-	KeyValueParser streamKeyValue;
-	streamKeyValue.addOption("role", OptionString,
-				 "Role for the stream (viewfinder, video, still, stillraw)",
-				 ArgumentRequired);
-	streamKeyValue.addOption("width", OptionInteger, "Width in pixels",
-				 ArgumentRequired);
-	streamKeyValue.addOption("height", OptionInteger, "Height in pixels",
-				 ArgumentRequired);
-	streamKeyValue.addOption("pixelformat", OptionInteger, "Pixel format",
-				 ArgumentRequired);
-
-	OptionsParser parser;
+	StreamOptionsParser parser;
 	parser.addOption(OptCamera, OptionString,
 			 "Specify which camera to operate on, by name or by index", "camera",
 			 ArgumentRequired, "camera");
@@ -175,8 +165,7 @@  int CamApp::parseOptions(int argc, char *argv[])
 			 "The first '#' character in the file name is expanded to the stream name and frame sequence number.\n"
 			 "The default file name is 'frame-#.bin'.",
 			 "file", ArgumentOptional, "filename");
-	parser.addOption(OptStream, &streamKeyValue,
-			 "Set configuration of a camera stream", "stream", true);
+	parser.addStreamOptions(OptStream, "stream");
 	parser.addOption(OptHelp, OptionNone, "Display this help message",
 			 "help");
 	parser.addOption(OptInfo, OptionNone,
@@ -199,67 +188,15 @@  int CamApp::parseOptions(int argc, char *argv[])
 
 int CamApp::prepareConfig()
 {
-	StreamRoles roles;
-
-	if (options_.isSet(OptStream)) {
-		const std::vector<OptionValue> &streamOptions =
-			options_[OptStream].toArray();
-
-		/* Use roles and get a default configuration. */
-		for (auto const &value : streamOptions) {
-			KeyValueParser::Options opt = value.toKeyValues();
-
-			std::string role = opt.isSet("role")
-					 ? opt["role"].toString()
-					 : "viewfinder";
-
-			if (role == "viewfinder") {
-				roles.push_back(StreamRole::Viewfinder);
-			} else if (role == "video") {
-				roles.push_back(StreamRole::VideoRecording);
-			} else if (role == "still") {
-				roles.push_back(StreamRole::StillCapture);
-			} else if (role == "stillraw") {
-				roles.push_back(StreamRole::StillCaptureRaw);
-			} else {
-				std::cerr << "Unknown stream role "
-					  << role << std::endl;
-				return -EINVAL;
-			}
-		}
-	} else {
-		/* If no configuration is provided assume a single video stream. */
-		roles.push_back(StreamRole::VideoRecording);
-	}
-
-	config_ = camera_->generateConfiguration(roles);
-	if (!config_ || config_->size() != roles.size()) {
+	config_ = camera_->generateConfiguration(options_.roles());
+	if (!config_ || config_->size() != options_.roles().size()) {
 		std::cerr << "Failed to get default stream configuration"
 			  << std::endl;
 		return -EINVAL;
 	}
 
 	/* Apply configuration if explicitly requested. */
-	if (options_.isSet(OptStream)) {
-		const std::vector<OptionValue> &streamOptions =
-			options_[OptStream].toArray();
-
-		unsigned int i = 0;
-		for (auto const &value : streamOptions) {
-			KeyValueParser::Options opt = value.toKeyValues();
-			StreamConfiguration &cfg = config_->at(i++);
-
-			if (opt.isSet("width"))
-				cfg.size.width = opt["width"];
-
-			if (opt.isSet("height"))
-				cfg.size.height = opt["height"];
-
-			/* TODO: Translate 4CC string to ID. */
-			if (opt.isSet("pixelformat"))
-				cfg.pixelFormat = PixelFormat(opt["pixelformat"]);
-		}
-	}
+	options_.applyCameraParameters(config_.get());
 
 	switch (config_->validate()) {
 	case CameraConfiguration::Valid: