/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* * Copyright (C) 2025, Ideas on Board Oy * * DW100 Dewarp Engine integration */ #pragma once #include #include #include #include #include #include "libcamera/internal/converter/converter_dw100_vertexmap.h" #include "libcamera/internal/converter/converter_v4l2_m2m.h" #include "libcamera/internal/device_enumerator.h" namespace libcamera { class MediaDevice; class Rectangle; class Stream; class ConverterDW100Module { public: virtual ~ConverterDW100Module() = default; static std::unique_ptr createModule(DeviceEnumerator *enumerator); int configure(const StreamConfiguration &inputCfg, const std::vector> &outputCfg); bool isConfigured(const Stream *stream) const; Size adjustInputSize(const PixelFormat &pixFmt, const Size &size, Converter::Alignment align = Converter::Alignment::Down); Size adjustOutputSize(const PixelFormat &pixFmt, const Size &size, Converter::Alignment align = Converter::Alignment::Down); int exportBuffers(const Stream *stream, unsigned int count, std::vector> *buffers); int validateOutput(StreamConfiguration *cfg, bool *adjusted, Converter::Alignment align = Converter::Alignment::Down); int queueBuffers(FrameBuffer *input, const std::map &outputs); int start(); void stop(); void updateControlInfos(const Stream *stream, ControlInfoMap::Map &infos); void setControls(const Stream *stream, const ControlList &controls); void populateMetadata(const Stream *stream, ControlList &meta); void setSensorCrop(const Rectangle &rect); void setTransform(const Stream *stream, const Transform &transform); Signal inputBufferReady; Signal outputBufferReady; private: ConverterDW100Module(std::shared_ptr media); int applyControls(const Stream *stream, const V4L2Request *request); void reinitRequest(V4L2Request *request); struct VertexMapInfo { Dw100VertexMap map; bool update; }; std::map vertexMaps_; unsigned int inputBufferCount_; V4L2M2MConverter converter_; Rectangle sensorCrop_; bool running_; std::vector> requests_; std::queue availableRequests_; }; } /* namespace libcamera */