summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKieran Bingham <kieran.bingham@ideasonboard.com>2020-07-10 16:28:36 +0100
committerBarnabás Pőcze <barnabas.pocze@ideasonboard.com>2025-05-05 09:44:19 +0200
commit1a240c57aad6442fafe452d42f91896956559dc0 (patch)
treee60777628f8e47987d12c856acacb6a382bd6bc9
parent46d02c0a82cd92d3b2c564de7613c6be9931b05a (diff)
libcamera: pipeline: vivid: Create a Camera
Create a VividCameraData inheriting from the CameraData to handle camera specific data, and use it to create and register the camera with the CameraManager. This can now be tested to see that the camera becomes available to applications: """ LIBCAMERA_LOG_LEVELS=Pipeline,VIVID:0 ./src/cam/cam -l [231:44:49.325333712] [2880028] INFO IPAManager ipa_manager.cpp:136 libcamera is not installed. Adding '/home/libcamera/build-vivid/src/ipa' to the IPA search path [231:44:49.325428449] [2880028] WARN IPAManager ipa_manager.cpp:147 No IPA found in '/usr/local/lib/x86_64-linux-gnu/libcamera' [231:44:49.325446253] [2880028] INFO Camera camera_manager.cpp:283 libcamera v0.0.11+713-d175334d-dirty Available cameras: 1: vivid """ Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
-rw-r--r--src/libcamera/pipeline/vivid/vivid.cpp48
1 files changed, 46 insertions, 2 deletions
diff --git a/src/libcamera/pipeline/vivid/vivid.cpp b/src/libcamera/pipeline/vivid/vivid.cpp
index 1d45a9e6..520d6aeb 100644
--- a/src/libcamera/pipeline/vivid/vivid.cpp
+++ b/src/libcamera/pipeline/vivid/vivid.cpp
@@ -9,7 +9,9 @@
#include "libcamera/internal/camera.h"
#include "libcamera/internal/device_enumerator.h"
+#include "libcamera/internal/media_device.h"
#include "libcamera/internal/pipeline_handler.h"
+#include "libcamera/internal/v4l2_videodevice.h"
/*
* Explicitly disable the unused-parameter warning in this pipeline handler.
@@ -28,6 +30,29 @@ namespace libcamera {
LOG_DEFINE_CATEGORY(VIVID)
+class VividCameraData : public Camera::Private
+{
+public:
+ VividCameraData(PipelineHandler *pipe, MediaDevice *media)
+ : Camera::Private(pipe), media_(media)
+ {
+ }
+
+ int init();
+
+ MediaDevice *media_;
+ std::unique_ptr<V4L2VideoDevice> video_;
+ Stream stream_;
+};
+
+class VividCameraConfiguration : public CameraConfiguration
+{
+public:
+ VividCameraConfiguration();
+
+ Status validate() override;
+};
+
class PipelineHandlerVivid : public PipelineHandler
{
public:
@@ -93,9 +118,28 @@ bool PipelineHandlerVivid::match(DeviceEnumerator *enumerator)
if (!media)
return false;
- LOG(VIVID, Debug) << "Obtained Vivid Device";
+ std::unique_ptr<VividCameraData> data = std::make_unique<VividCameraData>(this, media);
+
+ /* Locate and open the capture video node. */
+ if (data->init())
+ return false;
+
+ /* Create and register the camera. */
+ std::set<Stream *> streams{ &data->stream_ };
+ const std::string id = data->video_->deviceName();
+ std::shared_ptr<Camera> camera = Camera::create(std::move(data), id, streams);
+ registerCamera(std::move(camera));
+
+ return true;
+}
+
+int VividCameraData::init()
+{
+ video_ = std::make_unique<V4L2VideoDevice>(media_->getEntityByName("vivid-000-vid-cap"));
+ if (video_->open())
+ return -ENODEV;
- return false; // Prevent infinite loops for now
+ return 0;
}
REGISTER_PIPELINE_HANDLER(PipelineHandlerVivid, "vivid")