The converter interface uses the unsigned int output stream index to map to the output frame buffers. This is cumbersome to implement new converters because one has to keep around additional book keeping to track the streams with their correct indexes. The v4l2_converter_m2m and simple pipeline handler are adapted to use the new interface. This work roped in software ISP as well, which also seems to use indexes (although it doesn't implement converter interface) because of a common conversionQueue_ queue used for converter_ and swIsp_. The logPrefix is no longer able to generate an index from a stream, and is updated to be more expressive by reporting the stream configuration instead, for example, reporting "1920x1080-MJPEG" in place of "stream0". Signed-off-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Tested-by: Andrei Konovalov <andrey.konovalov.ynk@gmail.com> # sm8250 RB5
110 lines
2.8 KiB
C++
110 lines
2.8 KiB
C++
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
/*
|
|
* Copyright (C) 2020, Laurent Pinchart
|
|
* Copyright 2022 NXP
|
|
*
|
|
* Generic format converter interface
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <functional>
|
|
#include <initializer_list>
|
|
#include <map>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <tuple>
|
|
#include <vector>
|
|
|
|
#include <libcamera/base/class.h>
|
|
#include <libcamera/base/signal.h>
|
|
|
|
#include <libcamera/geometry.h>
|
|
|
|
namespace libcamera {
|
|
|
|
class FrameBuffer;
|
|
class MediaDevice;
|
|
class PixelFormat;
|
|
class Stream;
|
|
struct StreamConfiguration;
|
|
|
|
class Converter
|
|
{
|
|
public:
|
|
Converter(MediaDevice *media);
|
|
virtual ~Converter();
|
|
|
|
virtual int loadConfiguration(const std::string &filename) = 0;
|
|
|
|
virtual bool isValid() const = 0;
|
|
|
|
virtual std::vector<PixelFormat> formats(PixelFormat input) = 0;
|
|
virtual SizeRange sizes(const Size &input) = 0;
|
|
|
|
virtual std::tuple<unsigned int, unsigned int>
|
|
strideAndFrameSize(const PixelFormat &pixelFormat, const Size &size) = 0;
|
|
|
|
virtual int configure(const StreamConfiguration &inputCfg,
|
|
const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs) = 0;
|
|
virtual int exportBuffers(const Stream *stream, unsigned int count,
|
|
std::vector<std::unique_ptr<FrameBuffer>> *buffers) = 0;
|
|
|
|
virtual int start() = 0;
|
|
virtual void stop() = 0;
|
|
|
|
virtual int queueBuffers(FrameBuffer *input,
|
|
const std::map<const Stream *, FrameBuffer *> &outputs) = 0;
|
|
|
|
Signal<FrameBuffer *> inputBufferReady;
|
|
Signal<FrameBuffer *> outputBufferReady;
|
|
|
|
const std::string &deviceNode() const { return deviceNode_; }
|
|
|
|
private:
|
|
std::string deviceNode_;
|
|
};
|
|
|
|
class ConverterFactoryBase
|
|
{
|
|
public:
|
|
ConverterFactoryBase(const std::string name, std::initializer_list<std::string> compatibles);
|
|
virtual ~ConverterFactoryBase() = default;
|
|
|
|
const std::vector<std::string> &compatibles() const { return compatibles_; }
|
|
|
|
static std::unique_ptr<Converter> create(MediaDevice *media);
|
|
static std::vector<ConverterFactoryBase *> &factories();
|
|
static std::vector<std::string> names();
|
|
|
|
private:
|
|
LIBCAMERA_DISABLE_COPY_AND_MOVE(ConverterFactoryBase)
|
|
|
|
static void registerType(ConverterFactoryBase *factory);
|
|
|
|
virtual std::unique_ptr<Converter> createInstance(MediaDevice *media) const = 0;
|
|
|
|
std::string name_;
|
|
std::vector<std::string> compatibles_;
|
|
};
|
|
|
|
template<typename _Converter>
|
|
class ConverterFactory : public ConverterFactoryBase
|
|
{
|
|
public:
|
|
ConverterFactory(const char *name, std::initializer_list<std::string> compatibles)
|
|
: ConverterFactoryBase(name, compatibles)
|
|
{
|
|
}
|
|
|
|
std::unique_ptr<Converter> createInstance(MediaDevice *media) const override
|
|
{
|
|
return std::make_unique<_Converter>(media);
|
|
}
|
|
};
|
|
|
|
#define REGISTER_CONVERTER(name, converter, compatibles) \
|
|
static ConverterFactory<converter> global_##converter##Factory(name, compatibles);
|
|
|
|
} /* namespace libcamera */
|