summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKieran Bingham <kieran.bingham@ideasonboard.com>2020-07-10 16:28:36 +0100
committerBarnabás Pőcze <pobrn@protonmail.com>2025-02-21 16:17:23 +0100
commit69e8d52ee08ed821fe99f98eb37f38d2cb74d432 (patch)
tree7061293780f9c1e676626d71cb28eb51656e8569
parent738ac6f05d0dfab90f65aeac9abdacbe26c3a450 (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")