diff options
Diffstat (limited to 'src/v4l2/v4l2_camera.h')
-rw-r--r-- | src/v4l2/v4l2_camera.h | 87 |
1 files changed, 54 insertions, 33 deletions
diff --git a/src/v4l2/v4l2_camera.h b/src/v4l2/v4l2_camera.h index 130995d9..9bd161b9 100644 --- a/src/v4l2/v4l2_camera.h +++ b/src/v4l2/v4l2_camera.h @@ -1,75 +1,96 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* * Copyright (C) 2019, Google Inc. * - * v4l2_camera.h - V4L2 compatibility camera + * V4L2 compatibility camera */ -#ifndef __V4L2_CAMERA_H__ -#define __V4L2_CAMERA_H__ +#pragma once #include <deque> -#include <mutex> -#include <utility> +#include <memory> +#include <vector> + +#include <libcamera/base/mutex.h> +#include <libcamera/base/semaphore.h> +#include <libcamera/base/shared_fd.h> -#include <libcamera/buffer.h> #include <libcamera/camera.h> -#include <libcamera/file_descriptor.h> +#include <libcamera/controls.h> +#include <libcamera/framebuffer.h> #include <libcamera/framebuffer_allocator.h> -#include "semaphore.h" - -using namespace libcamera; - class V4L2Camera { public: struct Buffer { - Buffer(unsigned int index, const FrameMetadata &data) - : index(index), data(data) + Buffer(unsigned int index, const libcamera::FrameMetadata &data) + : index_(index), data_(data) { } - unsigned int index; - FrameMetadata data; + unsigned int index_; + libcamera::FrameMetadata data_; }; - V4L2Camera(std::shared_ptr<Camera> camera); + V4L2Camera(std::shared_ptr<libcamera::Camera> camera); ~V4L2Camera(); - int open(); + int open(libcamera::StreamConfiguration *streamConfig); void close(); - void getStreamConfig(StreamConfiguration *streamConfig); - std::vector<Buffer> completedBuffers(); + void bind(int efd); + void unbind(); - int configure(StreamConfiguration *streamConfigOut, - const Size &size, const PixelFormat &pixelformat, + std::vector<Buffer> completedBuffers() LIBCAMERA_TSA_EXCLUDES(bufferLock_); + + int configure(libcamera::StreamConfiguration *streamConfigOut, + const libcamera::Size &size, + const libcamera::PixelFormat &pixelformat, unsigned int bufferCount); + int validateConfiguration(const libcamera::PixelFormat &pixelformat, + const libcamera::Size &size, + libcamera::StreamConfiguration *streamConfigOut); + + libcamera::ControlList &controls() { return controls_; } + const libcamera::ControlInfoMap &controlInfo() { return camera_->controls(); } int allocBuffers(unsigned int count); void freeBuffers(); - FileDescriptor getBufferFd(unsigned int index); + int getBufferFd(unsigned int index); int streamOn(); int streamOff(); int qbuf(unsigned int index); - Semaphore bufferSema_; + void waitForBufferAvailable() LIBCAMERA_TSA_EXCLUDES(bufferMutex_); + bool isBufferAvailable() LIBCAMERA_TSA_EXCLUDES(bufferMutex_); + + bool isRunning(); private: - void requestComplete(Request *request); + void requestComplete(libcamera::Request *request) + LIBCAMERA_TSA_EXCLUDES(bufferLock_); - std::shared_ptr<Camera> camera_; - std::unique_ptr<CameraConfiguration> config_; + std::shared_ptr<libcamera::Camera> camera_; + std::unique_ptr<libcamera::CameraConfiguration> config_; + + libcamera::ControlList controls_; bool isRunning_; - std::mutex bufferLock_; - FrameBufferAllocator *bufferAllocator_; + libcamera::Mutex bufferLock_; + libcamera::FrameBufferAllocator *bufferAllocator_; - std::deque<std::unique_ptr<Request>> pendingRequests_; - std::deque<std::unique_ptr<Buffer>> completedBuffers_; -}; + std::vector<std::unique_ptr<libcamera::Request>> requestPool_; + + std::deque<libcamera::Request *> pendingRequests_; + std::deque<std::unique_ptr<Buffer>> completedBuffers_ + LIBCAMERA_TSA_GUARDED_BY(bufferLock_); -#endif /* __V4L2_CAMERA_H__ */ + int efd_; + + libcamera::Mutex bufferMutex_; + libcamera::ConditionVariable bufferCV_; + unsigned int bufferAvailableCount_ LIBCAMERA_TSA_GUARDED_BY(bufferMutex_); +}; |