[libcamera-devel] [PATCH] libcamera: qcam: Allow specifying sizes on command line
Jacopo Mondi
jacopo at jmondi.org
Sat Jul 13 16:56:25 CEST 2019
"Don't rush when sending patches!"
On Sat, Jul 13, 2019 at 04:51:19PM +0200, Jacopo Mondi wrote:
> 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 <jacopo at jmondi.org>
> ---
> 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<OptionValue> &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";
Missing std::endl
> + return -EINVAL;
> + }
> +
> + if (validation == CameraConfiguration::Adjusted) {
> + std::cout << "Stream sizes adjusted to "
> + << cfg.size.width << "x" << cfg.size.height
> + << std::endl;
> + }
I could have saved the { } but I actually like the symmetry with the
above case.
Sorry for the trivial mistakes, just noticed.
> +
> 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
> --
> 2.21.0
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20190713/2b11f0e1/attachment.sig>
More information about the libcamera-devel
mailing list