From 4a143800322dc66c8701489ba8fbf17a2d2b6b4f Mon Sep 17 00:00:00 2001 From: Kieran Bingham Date: Fri, 10 Jul 2020 16:28:36 +0100 Subject: 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 --- src/libcamera/pipeline/vivid/vivid.cpp | 53 ++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/libcamera/pipeline/vivid/vivid.cpp b/src/libcamera/pipeline/vivid/vivid.cpp index 1d45a9e6..ec81f2a9 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,34 @@ namespace libcamera { LOG_DEFINE_CATEGORY(VIVID) +class VividCameraData : public Camera::Private +{ +public: + VividCameraData(PipelineHandler *pipe, MediaDevice *media) + : Camera::Private(pipe), media_(media), video_(nullptr) + { + } + + ~VividCameraData() + { + delete video_; + } + + int init(); + + MediaDevice *media_; + V4L2VideoDevice *video_; + Stream stream_; +}; + +class VividCameraConfiguration : public CameraConfiguration +{ +public: + VividCameraConfiguration(); + + Status validate() override; +}; + class PipelineHandlerVivid : public PipelineHandler { public: @@ -93,9 +123,28 @@ bool PipelineHandlerVivid::match(DeviceEnumerator *enumerator) if (!media) return false; - LOG(VIVID, Debug) << "Obtained Vivid Device"; + std::unique_ptr data = std::make_unique(this, media); + + /* Locate and open the capture video node. */ + if (data->init()) + return false; + + /* Create and register the camera. */ + std::set streams{ &data->stream_ }; + const std::string id = data->video_->deviceName(); + std::shared_ptr camera = Camera::create(std::move(data), id, streams); + registerCamera(std::move(camera)); + + return true; +} + +int VividCameraData::init() +{ + video_ = new 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") -- cgit v1.2.1