[libcamera-devel,6/6] qcam: Add command line option to test IspCrop control

Message ID 20200922100400.30766-7-david.plowman@raspberrypi.com
State Superseded
Headers show
Series
  • Digital zoom
Related show

Commit Message

David Plowman Sept. 22, 2020, 10:04 a.m. UTC
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@raspberrypi.com>
---
 src/qcam/main.cpp        |  3 +++
 src/qcam/main_window.cpp | 20 ++++++++++++++++++++
 src/qcam/main_window.h   |  1 +
 3 files changed, 24 insertions(+)

Comments

Laurent Pinchart Sept. 22, 2020, 11:30 a.m. UTC | #1
Hi David,

Thank you for the patch.

On Tue, Sep 22, 2020 at 11:04:00AM +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@raspberrypi.com>

A command line option would make more sense for the cam application I
think. In qcam, I would rather like to have the zoom integrated in the
UI. Is this something you would be interested in developing, or should I
try to appoint a volunteer ? :-)

> ---
>  src/qcam/main.cpp        |  3 +++
>  src/qcam/main_window.cpp | 20 ++++++++++++++++++++
>  src/qcam/main_window.h   |  1 +
>  3 files changed, 24 insertions(+)
> 
> diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp
> index f60d3ce..9f8435d 100644
> --- a/src/qcam/main.cpp
> +++ b/src/qcam/main.cpp
> @@ -38,6 +38,9 @@ OptionsParser::Options parseOptions(int argc, char *argv[])
>  			 "renderer", ArgumentRequired, "renderer");
>  	parser.addOption(OptStream, &streamKeyValue,
>  			 "Set configuration of a camera stream", "stream", true);
> +	parser.addOption(OptZoom, OptionString,
> +			 "Specify crop for digital zoom as fractions x,y,width,height e.g. 0.25,0.25,0.5,0.5",
> +			 "zoom", ArgumentRequired, "zoom");
>  
>  	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 985743f..fb54b15 100644
> --- a/src/qcam/main_window.cpp
> +++ b/src/qcam/main_window.cpp
> @@ -25,6 +25,8 @@
>  #include <QtDebug>
>  
>  #include <libcamera/camera_manager.h>
> +#include <libcamera/control_ids.h>
> +#include <libcamera/property_ids.h>
>  #include <libcamera/version.h>
>  
>  #include "dng_writer.h"
> @@ -502,6 +504,24 @@ int MainWindow::startCapture()
>  		requests.push_back(request);
>  	}
>  
> +	/* Set up digital zoom if it was requested on the command line. */
> +	if (options_.isSet(OptZoom)) {
> +		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 {
> +			qWarning() << "Invalid zoom values - ignoring";
> +		}
> +	}
> +
>  	/* Start the title timer and the camera. */
>  	titleTimer_.start(2000);
>  	frameRateInterval_.start();
> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
> index 5c61a4d..e46eb70 100644
> --- a/src/qcam/main_window.h
> +++ b/src/qcam/main_window.h
> @@ -39,6 +39,7 @@ enum {
>  	OptHelp = 'h',
>  	OptRenderer = 'r',
>  	OptStream = 's',
> +	OptZoom = 'z',
>  };
>  
>  class CaptureRequest
David Plowman Sept. 22, 2020, 3:25 p.m. UTC | #2
Hi Laurent

Thanks for the reply!

On Tue, 22 Sep 2020 at 12:31, Laurent Pinchart
<laurent.pinchart@ideasonboard.com> wrote:
>
> Hi David,
>
> Thank you for the patch.
>
> On Tue, Sep 22, 2020 at 11:04:00AM +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@raspberrypi.com>
>
> A command line option would make more sense for the cam application I
> think. In qcam, I would rather like to have the zoom integrated in the
> UI. Is this something you would be interested in developing, or should I
> try to appoint a volunteer ? :-)

With my knowledge of Qt being non-existent you might have more luck
with another volunteer. However, it sounds like it might be worthwhile
converting my qcam patch into a cam patch instead. I'll wait a couple
of days and see if there's any more feedback but then I'll send a v2
with that change.

Thanks!
David

>
> > ---
> >  src/qcam/main.cpp        |  3 +++
> >  src/qcam/main_window.cpp | 20 ++++++++++++++++++++
> >  src/qcam/main_window.h   |  1 +
> >  3 files changed, 24 insertions(+)
> >
> > diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp
> > index f60d3ce..9f8435d 100644
> > --- a/src/qcam/main.cpp
> > +++ b/src/qcam/main.cpp
> > @@ -38,6 +38,9 @@ OptionsParser::Options parseOptions(int argc, char *argv[])
> >                        "renderer", ArgumentRequired, "renderer");
> >       parser.addOption(OptStream, &streamKeyValue,
> >                        "Set configuration of a camera stream", "stream", true);
> > +     parser.addOption(OptZoom, OptionString,
> > +                      "Specify crop for digital zoom as fractions x,y,width,height e.g. 0.25,0.25,0.5,0.5",
> > +                      "zoom", ArgumentRequired, "zoom");
> >
> >       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 985743f..fb54b15 100644
> > --- a/src/qcam/main_window.cpp
> > +++ b/src/qcam/main_window.cpp
> > @@ -25,6 +25,8 @@
> >  #include <QtDebug>
> >
> >  #include <libcamera/camera_manager.h>
> > +#include <libcamera/control_ids.h>
> > +#include <libcamera/property_ids.h>
> >  #include <libcamera/version.h>
> >
> >  #include "dng_writer.h"
> > @@ -502,6 +504,24 @@ int MainWindow::startCapture()
> >               requests.push_back(request);
> >       }
> >
> > +     /* Set up digital zoom if it was requested on the command line. */
> > +     if (options_.isSet(OptZoom)) {
> > +             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 {
> > +                     qWarning() << "Invalid zoom values - ignoring";
> > +             }
> > +     }
> > +
> >       /* Start the title timer and the camera. */
> >       titleTimer_.start(2000);
> >       frameRateInterval_.start();
> > diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
> > index 5c61a4d..e46eb70 100644
> > --- a/src/qcam/main_window.h
> > +++ b/src/qcam/main_window.h
> > @@ -39,6 +39,7 @@ enum {
> >       OptHelp = 'h',
> >       OptRenderer = 'r',
> >       OptStream = 's',
> > +     OptZoom = 'z',
> >  };
> >
> >  class CaptureRequest
>
> --
> Regards,
>
> Laurent Pinchart

Patch

diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp
index f60d3ce..9f8435d 100644
--- a/src/qcam/main.cpp
+++ b/src/qcam/main.cpp
@@ -38,6 +38,9 @@  OptionsParser::Options parseOptions(int argc, char *argv[])
 			 "renderer", ArgumentRequired, "renderer");
 	parser.addOption(OptStream, &streamKeyValue,
 			 "Set configuration of a camera stream", "stream", true);
+	parser.addOption(OptZoom, OptionString,
+			 "Specify crop for digital zoom as fractions x,y,width,height e.g. 0.25,0.25,0.5,0.5",
+			 "zoom", ArgumentRequired, "zoom");
 
 	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 985743f..fb54b15 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -25,6 +25,8 @@ 
 #include <QtDebug>
 
 #include <libcamera/camera_manager.h>
+#include <libcamera/control_ids.h>
+#include <libcamera/property_ids.h>
 #include <libcamera/version.h>
 
 #include "dng_writer.h"
@@ -502,6 +504,24 @@  int MainWindow::startCapture()
 		requests.push_back(request);
 	}
 
+	/* Set up digital zoom if it was requested on the command line. */
+	if (options_.isSet(OptZoom)) {
+		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 {
+			qWarning() << "Invalid zoom values - ignoring";
+		}
+	}
+
 	/* Start the title timer and the camera. */
 	titleTimer_.start(2000);
 	frameRateInterval_.start();
diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
index 5c61a4d..e46eb70 100644
--- a/src/qcam/main_window.h
+++ b/src/qcam/main_window.h
@@ -39,6 +39,7 @@  enum {
 	OptHelp = 'h',
 	OptRenderer = 'r',
 	OptStream = 's',
+	OptZoom = 'z',
 };
 
 class CaptureRequest