[libcamera-devel] [PATCH 2/3] cam: Make use of StreamOptionsParser
Niklas Söderlund
niklas.soderlund at ragnatech.se
Fri Apr 24 03:16:55 CEST 2020
Use the StreamOptionsParser helper to parse stream configuration from
the command line.
Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
---
src/cam/main.cpp | 77 +++++-------------------------------------------
1 file changed, 7 insertions(+), 70 deletions(-)
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:
--
2.26.0
More information about the libcamera-devel
mailing list