[libcamera-devel] [PATCH v2 6/6] cam: Add command line option to test IspCrop control
David Plowman
david.plowman at raspberrypi.com
Fri Sep 25 10:51:27 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/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)) {
+ 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",
+ "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
More information about the libcamera-devel
mailing list