[libcamera-devel] [PATCH v2 6/6] cam: Add command line option to test IspCrop control

Jacopo Mondi jacopo at jmondi.org
Mon Sep 28 12:44:22 CEST 2020


Hi David,

On Fri, Sep 25, 2020 at 09:51:27AM +0100, David Plowman wrote:
> This allows the user to request digital zoom by adding, for example,
> "-z 0.25,0.25,0.5,0.5" which would give a 2x zoom, still centred in
> the middle of the image.
>
> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
> ---
>  src/cam/capture.cpp | 25 +++++++++++++++++++++++--
>  src/cam/capture.h   |  2 +-
>  src/cam/main.cpp    |  3 +++
>  src/cam/main.h      |  1 +
>  4 files changed, 28 insertions(+), 3 deletions(-)
>
> diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp
> index 5510c00..3b50c59 100644
> --- a/src/cam/capture.cpp
> +++ b/src/cam/capture.cpp
> @@ -10,6 +10,9 @@
>  #include <limits.h>
>  #include <sstream>
>
> +#include <libcamera/control_ids.h>
> +#include <libcamera/property_ids.h>
> +
>  #include "capture.h"
>  #include "main.h"
>
> @@ -58,7 +61,7 @@ int Capture::run(const OptionsParser::Options &options)
>
>  	FrameBufferAllocator *allocator = new FrameBufferAllocator(camera_);
>
> -	ret = capture(allocator);
> +	ret = capture(allocator, options);
>
>  	if (options.isSet(OptFile)) {
>  		delete writer_;
> @@ -70,7 +73,7 @@ int Capture::run(const OptionsParser::Options &options)
>  	return ret;
>  }
>
> -int Capture::capture(FrameBufferAllocator *allocator)
> +int Capture::capture(FrameBufferAllocator *allocator, const OptionsParser::Options &options)
>  {
>  	int ret;
>
> @@ -120,6 +123,24 @@ int Capture::capture(FrameBufferAllocator *allocator)
>  		requests.push_back(request);
>  	}
>
> +	/* Set up digital zoom if it was requested on the command line. */
> +	if (options.isSet(OptZoom)) {

I would have preferred to keep option parsing where the other options
parsing happens, but this is the first control we set in Request, so I
guess this it's fine to do it here.

> +		std::string zoom = options[OptZoom].toString();
> +		float x, y, width, height;
> +
> +		if (sscanf(zoom.c_str(), "%f,%f,%f,%f", &x, &y, &width, &height) == 4) {
> +			Size sensorArea = camera_->properties().get(properties::SensorOutputSize);
> +			Rectangle crop(x * sensorArea.width,
> +				       y * sensorArea.height,
> +				       width * sensorArea.width,
> +				       height * sensorArea.height);
> +
> +			requests.front()->controls().set(controls::IspCrop, crop);
> +		} else {
> +			std::cout << "Invalid zoom values - ignoring" << std::endl;
> +		}
> +	}
> +
>  	ret = camera_->start();
>  	if (ret) {
>  		std::cout << "Failed to start capture" << std::endl;
> diff --git a/src/cam/capture.h b/src/cam/capture.h
> index 0aebdac..5280616 100644
> --- a/src/cam/capture.h
> +++ b/src/cam/capture.h
> @@ -29,7 +29,7 @@ public:
>
>  	int run(const OptionsParser::Options &options);
>  private:
> -	int capture(libcamera::FrameBufferAllocator *allocator);
> +	int capture(libcamera::FrameBufferAllocator *allocator, const OptionsParser::Options &options);
>
>  	void requestComplete(libcamera::Request *request);
>
> diff --git a/src/cam/main.cpp b/src/cam/main.cpp
> index 244720b..8f326d9 100644
> --- a/src/cam/main.cpp
> +++ b/src/cam/main.cpp
> @@ -201,6 +201,9 @@ int CamApp::parseOptions(int argc, char *argv[])
>  	parser.addOption(OptStrictFormats, OptionNone,
>  			 "Do not allow requested stream format(s) to be adjusted",
>  			 "strict-formats");
> +	parser.addOption(OptZoom, OptionString,
> +			 "Specify digital zoom by supplying IspCrop control as x,y,width,height e.g. 0.25,0.25,0.5,0.5",

Could we specify the values are percentages ? Maybe it's a standard
thing, but for the uneducated like me is it worth specifying it ?

			 "Zoom on the image portion described by the x,y,width,height rectangle (in %) e.g. 0.25,0.25,0.5,0.5",

Or something better..

Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>

Thanks
  j


> +			 "zoom", ArgumentRequired, "zoom");
>
>  	options_ = parser.parse(argc, argv);
>  	if (!options_.valid())
> diff --git a/src/cam/main.h b/src/cam/main.h
> index ea8dfd3..a1fd899 100644
> --- a/src/cam/main.h
> +++ b/src/cam/main.h
> @@ -17,6 +17,7 @@ enum {
>  	OptListProperties = 'p',
>  	OptMonitor = 'm',
>  	OptStream = 's',
> +	OptZoom = 'z',
>  	OptListControls = 256,
>  	OptStrictFormats = 257,
>  };
> --
> 2.20.1
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel


More information about the libcamera-devel mailing list