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

David Plowman david.plowman at raspberrypi.com
Tue Sep 22 12:04:00 CEST 2020


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/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
-- 
2.20.1



More information about the libcamera-devel mailing list