From patchwork Sat Jul 13 14:51:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 1680 Return-Path: Received: from relay4-d.mail.gandi.net (relay4-d.mail.gandi.net [217.70.183.196]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9C0846156A for ; Sat, 13 Jul 2019 16:50:10 +0200 (CEST) X-Originating-IP: 126.209.254.147 Received: from uno.localdomain (softbank126209254147.bbtec.net [126.209.254.147]) (Authenticated sender: jacopo@jmondi.org) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id 5CC92E0007; Sat, 13 Jul 2019 14:50:07 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Sat, 13 Jul 2019 16:51:19 +0200 Message-Id: <20190713145119.11193-1-jacopo@jmondi.org> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH] libcamera: qcam: Allow specifying sizes on command line X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 13 Jul 2019 14:50:10 -0000 Add a '-s|--size' option to qcam to allow selecting the stream resolution using a command line option. If the sizes are not supported by the camera, they get automatically adjusted and the user notified via an output message. Signed-off-by: Jacopo Mondi Reviewed-by: Niklas Söderlund --- src/qcam/main.cpp | 8 ++++++++ src/qcam/main_window.cpp | 31 ++++++++++++++++++++++++++++++- src/qcam/main_window.h | 1 + 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp index 106b8a162d9f..da942f3daed6 100644 --- a/src/qcam/main.cpp +++ b/src/qcam/main.cpp @@ -25,12 +25,20 @@ void signalHandler(int signal) OptionsParser::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; 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); OptionsParser::Options options = parser.parse(argc, argv); if (options.isSet(OptHelp)) diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp index 907d2423ed15..d9a30aa15db0 100644 --- a/src/qcam/main_window.cpp +++ b/src/qcam/main_window.cpp @@ -116,13 +116,42 @@ int MainWindow::startCapture() int ret; config_ = camera_->generateConfiguration({ StreamRole::VideoRecording }); + + StreamConfiguration &cfg = config_->at(0); + if (options_.isSet(OptSize)) { + const std::vector &sizeOptions = + options_[OptSize].toArray(); + + /* Set desired stream size if requested. */ + for (auto const &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"]; + } + } + + CameraConfiguration::Status validation = config_->validate(); + if (validation == CameraConfiguration::Invalid) { + std::cerr << "Faild to apply camera configuration"; + return -EINVAL; + } + + if (validation == CameraConfiguration::Adjusted) { + std::cout << "Stream sizes adjusted to " + << cfg.size.width << "x" << cfg.size.height + << std::endl; + } + ret = camera_->configure(config_.get()); if (ret < 0) { std::cout << "Failed to configure camera" << std::endl; return ret; } - const StreamConfiguration &cfg = config_->at(0); Stream *stream = cfg.stream(); ret = viewfinder_->setFormat(cfg.pixelFormat, cfg.size.width, cfg.size.height); diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h index f58cb6a65b2b..b45cbca725fa 100644 --- a/src/qcam/main_window.h +++ b/src/qcam/main_window.h @@ -27,6 +27,7 @@ class ViewFinder; enum { OptCamera = 'c', OptHelp = 'h', + OptSize = 's', }; class MainWindow : public QMainWindow