[libcamera-devel,02/27] test: v4l2_device: Use DeviceEnumerator to find a UVCVideo

Message ID 20190206060818.13907-3-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • Capture frames throught requests
Related show

Commit Message

Laurent Pinchart Feb. 6, 2019, 6:07 a.m. UTC
From: Kieran Bingham <kieran.bingham@ideasonboard.com>

Utilise the existing DeviceEnumerator system to identify a suitable
V4L2Device for testing.

Specifically target these tests at a uvcvideo driver based device as a known
supported target.

Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
---
 test/v4l2_device/v4l2_device_test.cpp | 34 +++++++++++++++++++++++----
 test/v4l2_device/v4l2_device_test.h   |  7 ++++++
 2 files changed, 36 insertions(+), 5 deletions(-)

Patch

diff --git a/test/v4l2_device/v4l2_device_test.cpp b/test/v4l2_device/v4l2_device_test.cpp
index 362553712caa..18d014caf4c8 100644
--- a/test/v4l2_device/v4l2_device_test.cpp
+++ b/test/v4l2_device/v4l2_device_test.cpp
@@ -10,6 +10,10 @@ 
 
 #include "v4l2_device_test.h"
 
+#include "device_enumerator.h"
+#include "media_device.h"
+
+using namespace std;
 using namespace libcamera;
 
 bool exists(const std::string &path)
@@ -24,20 +28,40 @@  bool exists(const std::string &path)
 
 int V4L2DeviceTest::init()
 {
-	const std::string device("/dev/video0");
+	enumerator_ = DeviceEnumerator::create();
+	if (!enumerator_) {
+		cerr << "Failed to create device enumerator" << endl;
+		return TestFail;
+	}
+
+	if (enumerator_->enumerate()) {
+		cerr << "Failed to enumerate media devices" << endl;
+		return TestFail;
+	}
 
-	/* Validate the device node exists. */
-	if (!exists(device)) {
-		std::cout << "No video device available" << std::endl;
+	DeviceMatch dm("uvcvideo");
+	media_ = std::move(enumerator_->search(dm));
+	if (!media_)
 		return TestSkip;
+
+	media_->acquire();
+
+	for (MediaEntity *entity : media_->entities()) {
+		if (entity->flags() & MEDIA_ENT_FL_DEFAULT) {
+			dev_ = new V4L2Device(entity);
+			break;
+		}
 	}
 
-	dev_ = new V4L2Device(device);
+	if (!dev_)
+		return TestSkip;
 
 	return dev_->open();
 }
 
 void V4L2DeviceTest::cleanup()
 {
+	media_->release();
+
 	delete dev_;
 };
diff --git a/test/v4l2_device/v4l2_device_test.h b/test/v4l2_device/v4l2_device_test.h
index 405cb7d6f404..ca231ab47fde 100644
--- a/test/v4l2_device/v4l2_device_test.h
+++ b/test/v4l2_device/v4l2_device_test.h
@@ -7,7 +7,12 @@ 
 #ifndef __LIBCAMERA_V4L2_DEVICE_TEST_H_
 #define __LIBCAMERA_V4L2_DEVICE_TEST_H_
 
+#include <memory>
+
 #include "test.h"
+
+#include "device_enumerator.h"
+#include "media_device.h"
 #include "v4l2_device.h"
 
 using namespace libcamera;
@@ -21,6 +26,8 @@  protected:
 	int init();
 	void cleanup();
 
+	std::unique_ptr<DeviceEnumerator> enumerator_;
+	std::shared_ptr<MediaDevice> media_;
 	V4L2Device *dev_;
 };