[libcamera-devel] [RFC 4/4] cam: Allow specifying configuration for more then one stream
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sat Mar 23 15:36:20 CET 2019
Hi Niklas,
Thank you for the patch.
On Fri, Mar 22, 2019 at 02:53:49AM +0100, Niklas Söderlund wrote:
> As a step to allow multiple streams extend the cam tool to be able to
> configure more then one stream. At this point libcamera do not allow an
s/do not/does not/
> application to associate a stream with a intended use-case so instead
> add a 'id' field to the --format parser.
>
> The numerical id represent the order in the array of streams which are
> handed to the application from the library. This should change once the
> library learns stream use-case. This implementation is a small and
> incomplete step in the direction of extending the cam utility to support
> cameras with more then one stream.
>
> Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
> src/cam/main.cpp | 39 ++++++++++++++++++++++++++++-----------
> 1 file changed, 28 insertions(+), 11 deletions(-)
>
> diff --git a/src/cam/main.cpp b/src/cam/main.cpp
> index 1ca7862bf237d85f..c9239ac62a83ce31 100644
> --- a/src/cam/main.cpp
> +++ b/src/cam/main.cpp
> @@ -42,6 +42,8 @@ void signalHandler(int signal)
> static int parseOptions(int argc, char *argv[])
> {
> KeyValueParser formatKeyValue;
> + formatKeyValue.addOption("id", OptionInteger, "ID of stream",
"Stream ID" ?
> + ArgumentRequired);
> formatKeyValue.addOption("width", OptionInteger, "Width in pixels",
> ArgumentRequired);
> formatKeyValue.addOption("height", OptionInteger, "Height in pixels",
> @@ -61,7 +63,7 @@ static int parseOptions(int argc, char *argv[])
> "The default file name is 'frame-#.bin'.",
> "file", ArgumentOptional, "filename");
> parser.addOption(OptFormat, &formatKeyValue,
> - "Set format of the camera's first stream", "format");
> + "Set format of the camera's first stream", "format", true);
You can break the line to avoid going over 80 columns.
> parser.addOption(OptHelp, OptionNone, "Display this help message",
> "help");
> parser.addOption(OptList, OptionNone, "List all cameras", "list");
> @@ -77,22 +79,37 @@ static int parseOptions(int argc, char *argv[])
>
> static int configureStreams(Camera *camera, std::set<Stream *> &streams)
> {
> - KeyValueParser::Options format = options[OptFormat];
> - Stream *id = *streams.begin();
> -
> std::map<Stream *, StreamConfiguration> config =
> camera->streamConfiguration(streams);
>
> if (options.isSet(OptFormat)) {
> - if (format.isSet("width"))
> - config[id].width = format["width"];
> + int num = 0;
> + for (Stream *id : streams) {
> + for (auto const &value : options[OptFormat].toArray()) {
> + KeyValueParser::Options format = value.toKeyValues();
>
> - if (format.isSet("height"))
> - config[id].height = format["height"];
> + if (!format.isSet("id") || format["id"] != num)
> + continue;
Shouldn't you accept streams with no ID ? You can pick the next
available stream in that case.
>
> - /* TODO: Translate 4CC string to ID. */
> - if (format.isSet("pixelformat"))
> - config[id].pixelFormat = format["pixelformat"];
> + if (format.isSet("width"))
> + config[id].width = format["width"];
> +
> + if (format.isSet("height"))
> + config[id].height = format["height"];
> +
> + /* TODO: Translate 4CC string to ID. */
> + if (format.isSet("pixelformat"))
> + config[id].pixelFormat = format["pixelformat"];
> + }
> + num++;
> + }
> + }
> +
> + for (auto const &it : config) {
> + const StreamConfiguration &conf = it.second;
> +
> + std::cout << "size: " << conf.width << "x" << conf.height
> + << "pixelformat: " << conf.pixelFormat << std::endl;
> }
>
> return camera->configureStreams(config);
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list