cam: Make use of StreamKeyValueParser

Use the StreamOptionsParser helper to parse stream configuration from
the command line.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Niklas Söderlund 2020-04-27 23:28:20 +02:00
parent 693ab88162
commit 18cfea19dc

View file

@ -17,6 +17,7 @@
#include "event_loop.h" #include "event_loop.h"
#include "main.h" #include "main.h"
#include "options.h" #include "options.h"
#include "stream_options.h"
using namespace libcamera; using namespace libcamera;
@ -154,16 +155,7 @@ void CamApp::quit()
int CamApp::parseOptions(int argc, char *argv[]) int CamApp::parseOptions(int argc, char *argv[])
{ {
KeyValueParser streamKeyValue; StreamKeyValueParser 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; OptionsParser parser;
parser.addOption(OptCamera, OptionString, parser.addOption(OptCamera, OptionString,
@ -202,38 +194,7 @@ int CamApp::parseOptions(int argc, char *argv[])
int CamApp::prepareConfig() int CamApp::prepareConfig()
{ {
StreamRoles roles; StreamRoles roles = StreamKeyValueParser::roles(options_[OptStream]);
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); config_ = camera_->generateConfiguration(roles);
if (!config_ || config_->size() != roles.size()) { if (!config_ || config_->size() != roles.size()) {
@ -243,25 +204,10 @@ int CamApp::prepareConfig()
} }
/* Apply configuration if explicitly requested. */ /* Apply configuration if explicitly requested. */
if (options_.isSet(OptStream)) { if (StreamKeyValueParser::updateConfiguration(config_.get(),
const std::vector<OptionValue> &streamOptions = options_[OptStream])) {
options_[OptStream].toArray(); std::cerr << "Failed to update configuration" << std::endl;
return -EINVAL;
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"]);
}
} }
switch (config_->validate()) { switch (config_->validate()) {