From 0ce20a8cd59ad2e2d43fdc9b4ff64053db7f01a5 Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Mon, 16 Dec 2024 16:40:53 +0100 Subject: libcamera: converter: Add functions to adjust config Add to the Converter interface two functions used by pipeline handlers to validate and adjust the converter input and output configurations by specifying the desired alignment for the adjustment. Add the adjustInputSize() and adjustOutputSize() functions that allows to adjust the converter input/output sizes with the desired alignment. Add a validateOutput() function meant to be used by the pipeline handler implementations of validate(). The function adjusts a StreamConfiguration to a valid configuration produced by the Converter. Signed-off-by: Jacopo Mondi Reviewed-by: Stefan Klug Reviewed-by: Paul Elder Signed-off-by: Stefan Klug --- include/libcamera/internal/converter.h | 15 +++++++++++++++ include/libcamera/internal/converter/converter_v4l2_m2m.h | 11 +++++++++++ 2 files changed, 26 insertions(+) (limited to 'include') diff --git a/include/libcamera/internal/converter.h b/include/libcamera/internal/converter.h index afea4624..644ec429 100644 --- a/include/libcamera/internal/converter.h +++ b/include/libcamera/internal/converter.h @@ -41,6 +41,11 @@ public: using Features = Flags; + enum class Alignment { + Down = 0, + Up, + }; + Converter(MediaDevice *media, Features features = Feature::None); virtual ~Converter(); @@ -51,9 +56,19 @@ public: virtual std::vector formats(PixelFormat input) = 0; virtual SizeRange sizes(const Size &input) = 0; + virtual Size adjustInputSize(const PixelFormat &pixFmt, + const Size &size, + Alignment align = Alignment::Down) = 0; + virtual Size adjustOutputSize(const PixelFormat &pixFmt, + const Size &size, + Alignment align = Alignment::Down) = 0; + virtual std::tuple strideAndFrameSize(const PixelFormat &pixelFormat, const Size &size) = 0; + virtual int validateOutput(StreamConfiguration *cfg, bool *adjusted, + Alignment align = Alignment::Down) = 0; + virtual int configure(const StreamConfiguration &inputCfg, const std::vector> &outputCfgs) = 0; virtual bool isConfigured(const Stream *stream) const = 0; diff --git a/include/libcamera/internal/converter/converter_v4l2_m2m.h b/include/libcamera/internal/converter/converter_v4l2_m2m.h index 1ccbfc7c..0ad7bf7f 100644 --- a/include/libcamera/internal/converter/converter_v4l2_m2m.h +++ b/include/libcamera/internal/converter/converter_v4l2_m2m.h @@ -47,6 +47,11 @@ public: std::tuple strideAndFrameSize(const PixelFormat &pixelFormat, const Size &size) override; + Size adjustInputSize(const PixelFormat &pixFmt, + const Size &size, Alignment align = Alignment::Down) override; + Size adjustOutputSize(const PixelFormat &pixFmt, + const Size &size, Alignment align = Alignment::Down) override; + int configure(const StreamConfiguration &inputCfg, const std::vector> &outputCfg) override; @@ -57,6 +62,9 @@ public: int start() override; void stop() override; + int validateOutput(StreamConfiguration *cfg, bool *adjusted, + Alignment align = Alignment::Down) override; + int queueBuffers(FrameBuffer *input, const std::map &outputs) override; @@ -104,6 +112,9 @@ private: std::pair inputCropBounds_; }; + Size adjustSizes(const Size &size, const std::vector &ranges, + Alignment align); + std::unique_ptr m2m_; std::map> streams_; -- cgit v1.2.1