/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2021, Ideas on Board Oy * * kms_sink.h - KMS Sink */ #pragma once #include #include #include #include #include #include #include #include #include "drm.h" #include "frame_sink.h" class KMSSink : public FrameSink { public: KMSSink(const std::string &connectorName); void mapBuffer(libcamera::FrameBuffer *buffer) override; int configure(const libcamera::CameraConfiguration &config) override; int start() override; int stop() override; bool processRequest(libcamera::Request *request) override; private: class Request { public: Request(DRM::AtomicRequest *drmRequest, libcamera::Request *camRequest) : drmRequest_(drmRequest), camRequest_(camRequest) { } std::unique_ptr drmRequest_; libcamera::Request *camRequest_; }; int configurePipeline(const libcamera::PixelFormat &format); void requestComplete(DRM::AtomicRequest *request); DRM::Device dev_; const DRM::Connector *connector_; const DRM::Crtc *crtc_; const DRM::Plane *plane_; const DRM::Mode *mode_; libcamera::PixelFormat format_; libcamera::Size size_; unsigned int stride_; std::map> buffers_; std::mutex lock_; std::unique_ptr pending_; std::unique_ptr queued_; std::unique_ptr active_; };