[libcamera-devel] [PATCH] cam: Add option to list displays

Eric Curtin ecurtin at redhat.com
Thu Oct 28 17:48:07 CEST 2021


So the user does not have to be familiar with internals of
/sys/class/drm/. "xrand --query" names aren't consistent with DRM
names and depend on an X server running.

This --list-displays option will show the names of the available
displays and whether each display's status is connected, disconnected
or unknown.

Signed-off-by: Eric Curtin <ecurtin at redhat.com>
---
 src/cam/drm.cpp  |  3 +++
 src/cam/drm.h    |  2 ++
 src/cam/main.cpp | 28 +++++++++++++++++++++++-----
 src/cam/main.h   |  3 +++
 4 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp
index f2530091..444d639d 100644
--- a/src/cam/drm.cpp
+++ b/src/cam/drm.cpp
@@ -190,15 +190,18 @@ Connector::Connector(Device *dev, const drmModeConnector *connector)
 	switch (connector->connection) {
 	case DRM_MODE_CONNECTED:
 		status_ = Status::Connected;
+		status_str_ = "connected";
 		break;
 
 	case DRM_MODE_DISCONNECTED:
 		status_ = Status::Disconnected;
+		status_str_ = "disconnected";
 		break;
 
 	case DRM_MODE_UNKNOWNCONNECTION:
 	default:
 		status_ = Status::Unknown;
+		status_str_ = "unknown";
 		break;
 	}
 
diff --git a/src/cam/drm.h b/src/cam/drm.h
index 0b88f9a3..92acd826 100644
--- a/src/cam/drm.h
+++ b/src/cam/drm.h
@@ -187,6 +187,7 @@ public:
 	const std::string &name() const { return name_; }
 
 	Status status() const { return status_; }
+	const std::string &status_str() const { return status_str_; }
 
 	const std::vector<const Encoder *> &encoders() const { return encoders_; }
 	const std::vector<Mode> &modes() const { return modes_; }
@@ -194,6 +195,7 @@ public:
 private:
 	uint32_t type_;
 	std::string name_;
+	std::string status_str_;
 	Status status_;
 	std::vector<const Encoder *> encoders_;
 	std::vector<Mode> modes_;
diff --git a/src/cam/main.cpp b/src/cam/main.cpp
index c7f664b9..cd1ccf2f 100644
--- a/src/cam/main.cpp
+++ b/src/cam/main.cpp
@@ -15,6 +15,11 @@
 #include <libcamera/property_ids.h>
 
 #include "camera_session.h"
+
+#ifdef HAVE_KMS
+#include "drm.h"
+#endif
+
 #include "event_loop.h"
 #include "main.h"
 #include "options.h"
@@ -137,6 +142,7 @@ int CamApp::parseOptions(int argc, char *argv[])
 			 "Display viewfinder through DRM/KMS on specified connector",
 			 "display", ArgumentOptional, "connector", false,
 			 OptCamera);
+	parser.addOption(OptListDisplays, OptionNone, "List all displays", "list-displays");
 #endif
 	parser.addOption(OptFile, OptionString,
 			 "Write captured frames to disk\n"
@@ -202,7 +208,19 @@ int CamApp::run()
 		}
 	}
 
-	/* 2. Create the camera sessions. */
+#ifdef HAVE_KMS
+	/* 2. List all displays. */
+	if (options_.isSet(OptListDisplays)) {
+		DRM::Device dev;
+		if (dev.init() >= 0) {
+			std::cout << "Available displays:" << std::endl;
+			for (const DRM::Connector &conn : dev.connectors())
+				std::cout << "name: " << conn.name() << " status: " << conn.status_str() << std::endl;
+		}
+	}
+#endif
+
+	/* 3. Create the camera sessions. */
 	std::vector<std::unique_ptr<CameraSession>> sessions;
 
 	if (options_.isSet(OptCamera)) {
@@ -229,7 +247,7 @@ int CamApp::run()
 		}
 	}
 
-	/* 3. Print camera information. */
+	/* 4. Print camera information. */
 	if (options_.isSet(OptListControls) ||
 	    options_.isSet(OptListProperties) ||
 	    options_.isSet(OptInfo)) {
@@ -243,7 +261,7 @@ int CamApp::run()
 		}
 	}
 
-	/* 4. Start capture. */
+	/* 5. Start capture. */
 	for (const auto &session : sessions) {
 		if (!session->options().isSet(OptCapture))
 			continue;
@@ -257,7 +275,7 @@ int CamApp::run()
 		loopUsers_++;
 	}
 
-	/* 5. Enable hotplug monitoring. */
+	/* 6. Enable hotplug monitoring. */
 	if (options_.isSet(OptMonitor)) {
 		std::cout << "Monitoring new hotplug and unplug events" << std::endl;
 		std::cout << "Press Ctrl-C to interrupt" << std::endl;
@@ -271,7 +289,7 @@ int CamApp::run()
 	if (loopUsers_)
 		loop_.exec();
 
-	/* 6. Stop capture. */
+	/* 7. Stop capture. */
 	for (const auto &session : sessions) {
 		if (!session->options().isSet(OptCapture))
 			continue;
diff --git a/src/cam/main.h b/src/cam/main.h
index 1c2fab76..72050d27 100644
--- a/src/cam/main.h
+++ b/src/cam/main.h
@@ -21,6 +21,9 @@ enum {
 	OptListControls = 256,
 	OptStrictFormats = 257,
 	OptMetadata = 258,
+#ifdef HAVE_KMS
+	OptListDisplays = 259
+#endif
 };
 
 #endif /* __CAM_MAIN_H__ */
-- 
2.31.1



More information about the libcamera-devel mailing list