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:
parent
693ab88162
commit
18cfea19dc
1 changed files with 7 additions and 61 deletions
|
@ -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()) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue